MSA 011110 |
1101 |
df |
wt |
ws |
wd |
3RF 011100 |
6 |
4 |
1 |
5 |
5 |
5 |
6 |
MADDR_Q.df |
Vector Fixed-Point Multiply and Add Rounded | |
MADDR_Q.H wd,ws,wt |
MSA |
Vector Fixed-Point Multiply and Add Rounded |
MADDR_Q.W wd,ws,wt |
MSA |
Vector Fixed-Point Multiply and Add Rounded |
Vector Fixed-Point Multiply and Add Rounded
Vector fixed-point multiply and add 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 added to the fixed-point elements in vector wd. The multiplication result is not saturated, i.e. exact (-1) * (-1) = 1 is added to the destination.
The rounded and saturated fixed-point results are stored back to wd.
Internally, the multiplication, addition, and rounding operate on data double the size of df. Truncation to fixed-point 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.
MADDR_Q.H for i in 0 .. WRLEN/16-1 WR[wd]16i+15..16i = q_maddr(WR[wd]16i+15..16i, WR[ws]16i+15..16i, WR[wt]16i+15..16i, 16) endfor MADDR_Q.W for i in 0 .. WRLEN/32-1 WR[wd]32i+31..32i = q_maddr(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_maddr(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_maddr
Reserved Instruction Exception, MSA Disabled Exception.