Home/Instructions/VNMSAC-VV
VNMSAC.VV

RISC-V VNMSAC.VV Instruction Details

Instruction ManualR-type

Vector integer negative multiply-accumulate using vd as the accumulator.

Instruction Syntax

vnmsac.vv vd, vs1, vs2, vm
Operand Breakdown
Destination rd: register receiving the operation result.
Source rs1: register holding the first operand.
Source rs2: register holding the second operand.
VVector IntegerMultiply-Accumulate

Instruction Behavior

VNMSAC.VV computes vd[i] - (vs1[i] * vs2[i]) for active elements and writes the low SEW bits back to vd.

Quick Understanding & Search Notes

VNMSAC.VV is a destructive integer multiply-add class instruction; vd participates in the operation and receives the result.

The official operand order is vd, multiplier source, vs2, vm; do not swap vs1/rs1 with vs2.
The result is truncated to SEW width and does not raise integer overflow exceptions.
vm=0 uses v0 as the execution mask; vm=1 is unmasked.

Common Usage Scenarios

Difference

e.g., sub t0, a0, a1 — compute the difference a0 - a1.

Error Accumulation

Understand this scenario with real code like «vnmsac.vv v8, v4, v12, v0.t».

Pre-Use Checklist

Syntax Check
  • Confirm the current instruction format is R-type.
  • Confirm the operand order matches the example.
Semantic Check
  • Ensure the destination register usage is compatible with the calling convention.
  • Confirm this is not the lower-level form of a pseudo-instruction expansion.

Pitfalls / Common Confusions

vnmsac subtracts the product from the old vd accumulator.
Old vd is the overwritten addend/accumulator; vnmsub instead overwrites old vd as a multiplicand.
The low SEW bits are written and no integer overflow exception is raised.

FAQ

Is vd only a write destination for VNMSAC.VV?

No. This class is destructive: the old vd value participates as an accumulator or multiplicand.