MSA 011110 |
1110 |
df |
wt |
ws |
wd |
3RF 011100 |
6 |
4 |
1 |
5 |
5 |
5 |
6 |
MSUBR_Q.df |
Vector Fixed-Point Multiply and Subtract Rounded | |
MSUBR_Q.H wd,ws,wt |
MSA |
Vector Fixed-Point Multiply and Subtract Rounded |
MSUBR_Q.W wd,ws,wt |
MSA |
Vector Fixed-Point Multiply and Subtract Rounded |
Vector Fixed-Point Multiply and Subtract Rounded
Vector fixed-point multiply and subtract rounded.
wd[i] = saturate(round(wd[i] - ws[i] * wt[i]))
The products of fixed-point elements in vector wt by fixed-point elements in vector ws are subtracted from the fixedpoint elements in vector wd. The multiplication result is not saturated, i.e. exact (-1) * (-1) = 1 is subtracted from the destination. The rounded and saturated fixed-point results are stored back to wd.
Internally, the multiplication, subtraction, and rounding operate on data double the size of df. Truncation to fixedpoint data format df is performed at the very last stage, after saturation.
The rounding is done by adding 1 to the most significant bit that is going to be discarded at truncation.
The operands and results are values in fixed-point data format df.
No data-dependent exceptions are possible.
MSUBR_Q.H for i in 0 .. WRLEN/16-1 WR[wd]16i+15..16i = q_msubr(WR[wd]16i+15..16i, WR[ws]16i+15..16i, WR[wt]16i+15..16i, 16) endfor MSUBR_Q.W for i in 0 .. WRLEN/32-1 WR[wd]32i+31..32i = q_msubr(WR[wd]32i+31..32i, WR[ws]32i+31..32i, WR[wt]32i+31..32i, 32) endfor function mulx_s(ts, tt, n) s = (tsn-1)n || tsn-1..0 t = (ttn-1)n || ttn-1..0 p = s * t return p2n-1..0 endfunction mulx_s function sat_s(tt, n, b) if ttn-1 = 0 and ttn-1..b-1 != 0n-b+1 then return 0n-b+1 || 1b-1 endif if ttn-1 = 1 and ttn-1..b-1 != 1n-b+1 then return 1n-b+1 || 0b-1 else return tt endif endfunction sat_s function q_msubr(td, ts, tt, n) p = mulx_s(ts, tt, n) d = (tdn-1 || tdn-1..0 || 0n-1) - p2n-1..0 d = d + (1 || 0n-2) d = sat_s(d2n-1..n-1, n+1, n) return dn-1..0 endfunction q_msubr
Reserved Instruction Exception, MSA Disabled Exception.