How is VSMUL.VV different from VMUL/VMULH?
VMUL/VMULH are ordinary integer multiply low-half or high-half operations; VSMUL is signed fixed-point fractional multiply, scales by SEW-1 bits, rounds with vxrm, and can set vxsat.
VSMUL.VV is an RVV signed fixed-point fractional multiply instruction that uses vxrm rounding and sets vxsat on saturation.
VSMUL.VV reads each active vs2 element and the same-lane vs1 element, computes a 2*SEW signed product, rounds the value scaled right by SEW-1 bits according to vxrm, then saturates into the signed SEW range and writes vd; any active saturation sets sticky vxsat.
Starts from OP-V encoding fields, then shows how VSMUL forms a signed fractional 2*SEW product, rounds the SEW-1 scaled result with vxrm, saturates into vd, and sets vxsat on saturation.
Teaching context: V 1.0, enabled vector state, and valid supported vtype/SEW; fix LMUL=m1, VLEN=4096, vstart=0, VLMAX=4096/16. Equal-width sources/destination may overlap; equal sources require equal elements. With v0.t, vd/vs2/vs1 exclude v0. Enter unsigned SEW bit patterns, interpreted as signed for multiplication. .vx takes low bits when XLEN>SEW and sign-extends when XLEN<SEW; x0 supplies zero. Only body is shown; inactive/tail follow vma/vta, retaining old values or becoming all ones, without definite displayed values. VL=0 leaves vd and vxsat unchanged; success resets vstart=0. Stages are teaching steps, not processor cycles.
The teaching model fixes LMUL=m1 and vstart=0 and shows only body elements in the selected VL. It fixes VLEN=4096, VLMAX=4096/16=256, and assumes support for the selected SEW; equal vector sources require equal elements. In ordinary masked forms, inactive and tail elements follow vtype.vma/vta and the result row does not invent a definite value; VADC/VMADC/VSBC/VMSBC execute every body element, with v0 bits used only as carry/borrow-in.
vsmul.vv uses OP-V encoding. The animation places fixed fields, register fields, vm, and the vs1 field in one encoding strip.
This animation shows only ISA-visible relationships from the official V extension: OP-V field decode, active-element reads, SEW-width integer signed fractional saturating multiply, vxrm fixed-point rounding, and vd writeback; this example sets sticky vxsat. It does not model pipelines, caches, or timing.
VSMUL.VV multiplies two signed SEW fixed-point fractions, equivalent to scaling the 2*SEW product by SEW-1 bits, rounding with vxrm, and signed saturation; it is Q-format-style fractional multiply, not ordinary integer multiply.
V 1.0 requires enabled vector state, vill=0 and supported vtype. Active elements have vstart<=i<vl and enabled mask; v0.t means vm=0, omission vm=1. Success resets vstart=0.
Sources/destination: EEW=SEW, EMUL=LMUL. Equal-width overlap is allowed; masked vd and SEW sources exclude v0. Inactive/tail follow vma/vta: retain or all ones. VL=0 leaves vd and vxsat unchanged.
Shift the signed product right by SEW-1 with vxrm rounding, then saturate to SEW. Saturation sets vxsat; otherwise its prior value remains.
Understand this scenario with real code like «vsmul.vv v4, v8, v12, v0.t # signed fractional multiply, vxrm rounding, vxsat on saturation».
Understand this scenario with real code like «vsmul.vv v4, v8, v12, v0.t # signed fractional multiply, vxrm rounding, vxsat on saturation».
Understand this scenario with real code like «vsmul.vv v4, v8, v12, v0.t # signed fractional multiply, vxrm rounding, vxsat on saturation».
VMUL/VMULH are ordinary integer multiply low-half or high-half operations; VSMUL is signed fixed-point fractional multiply, scales by SEW-1 bits, rounds with vxrm, and can set vxsat.
Any active rounded result outside the signed SEW range saturates and sets vxsat. Otherwise vxsat retains its prior value; masked-off elements cannot set it.