target-mips: use DSP unions for reduction add instructions

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
master
Aurelien Jarno 2013-01-01 18:02:23 +01:00
parent 75d012ac7f
commit 0a16c79cc4
1 changed files with 14 additions and 16 deletions

View File

@ -1352,31 +1352,29 @@ target_ulong helper_modsub(target_ulong rs, target_ulong rt)
target_ulong helper_raddu_w_qb(target_ulong rs) target_ulong helper_raddu_w_qb(target_ulong rs)
{ {
uint8_t rs3, rs2, rs1, rs0; target_ulong ret = 0;
uint16_t temp; DSP32Value ds;
unsigned int i;
MIPSDSP_SPLIT32_8(rs, rs3, rs2, rs1, rs0); ds.uw[0] = rs;
for (i = 0; i < 4; i++) {
temp = (uint16_t)rs3 + (uint16_t)rs2 + (uint16_t)rs1 + (uint16_t)rs0; ret += ds.ub[i];
}
return (target_ulong)temp; return ret;
} }
#if defined(TARGET_MIPS64) #if defined(TARGET_MIPS64)
target_ulong helper_raddu_l_ob(target_ulong rs) target_ulong helper_raddu_l_ob(target_ulong rs)
{ {
int i; target_ulong ret = 0;
uint16_t rs_t[8]; DSP64Value ds;
uint64_t temp; unsigned int i;
temp = 0;
ds.ul[0] = rs;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
rs_t[i] = (rs >> (8 * i)) & MIPSDSP_Q0; ret += ds.ub[i];
temp += (uint64_t)rs_t[i];
} }
return ret;
return temp;
} }
#endif #endif