VWADD.VX

RISC-V VWADD.VX Instruction Details

Instruction ManualOPMVX

VWADD.VX performs signed widening add; SEW source elements are sign-extended and written as 2*SEW-wide results.

Instruction Syntax

vwadd.vx vd, vs2, rs1, vm
Operand Breakdown
vs2 supply SEW sources; vd has EEW=2*SEW and EMUL=2*LMUL<=8. Group starts must align. Wide vd may overlap a narrow source only if source EMUL>=1 and both groups share their highest register; this forces mask/tail agnostic. rs1 takes low SEW bits for XLEN>SEW or sign-extends to SEW for XLEN<SEW; x0 supplies zero.
32-bit OP-V: opcode=1010111, funct6=110001, funct3=110 (OPMVX); vm at bit25, vs2 at bits24:20, rs1 at bits19:15, vd at bits11:7.
Active vd[i]=sext(vs2[i])+sext(the scalar converted by .vx rules), extending both sources to 2*SEW first. No saturation or vxsat change; old vd is not an accumulator. Require implementation support for source SEW and destination 2*SEW.
Require V 1.0, enabled vector state, vill=0 and supported vtype. Optional v0.t means vm=0; omission means vm=1. Only mask-enabled vstart<=i<vl elements compute; prestart stays unchanged and inactive/tail follow vma/vta; masked vd excludes v0. v0 cannot supply both EEW=1 mask and data. vstart>=vl (including vl=0) leaves every destination element unchanged; success resets vstart=0.
VVector Operations

Instruction Behavior

vwadd.vx is a RISC-V V extension vector-scalar signed widening add instruction. For active elements, the SEW value from vs2 and x[rs1] converted to SEW by the .vx rule are sign-extended to 2*SEW, then added and written to the 2*SEW-wide vd destination. When XLEN exceeds SEW, the scalar's low SEW bits are used; when XLEN is smaller, the scalar is sign-extended to SEW first.

VWADD.VX Decode And Execute Animation

Starts from OP-V encoding fields, then shows how VWADD sign-extends SEW source elements before writing 2*SEW-wide add results to vd.

Instruction input
vwadd.vx

Teaching context: V 1.0, enabled vector state, valid supported vtype; fix LMUL=m1, VLEN=4096 and vstart=0. Require support for source SEW and destination 2*SEW; SEW=64 requires 128-bit integer elements beyond baseline V guarantees. Inputs are nonnegative SEW bit patterns interpreted as signed two’s-complement values; .vx takes low bits for XLEN>SEW, sign-extends for XLEN<SEW, and x0 supplies zero. Masked vd and data sources exclude v0. VL=0 leaves vd unchanged; success resets vstart=0 without changing vxsat. Stages are teaching steps, not processor cycles.

Execution Context

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. The wide vd destination has EMUL=2 and must start at an even register; if it overlaps a SEW source, that source must be the highest-numbered register in the destination group. Such a legal different-EEW overlap is mask- and tail-agnostic regardless of vtype.vma/vta.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.

OP-V encodingvwadd.vx
funct6
110001
vm
0
vs2
01000
rs1
01011
funct3
110
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
w+
w+
w+
w+
w+
w+
w+
w+
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
Current step

Show OP-V 32-bit encoding fields

vwadd.vx uses OP-V encoding. The animation places fixed fields, register fields, vm, and the rs1 field in one encoding strip.

This animation shows only ISA-visible relationships from the official V extension: OP-V field decode, active-element reads, 2*SEW widening integer signed widening addition, mask control, and vd writeback. It does not model pipelines, caches, or timing.

Quick Understanding & Search Notes

VWADD.VX is not ordinary SEW-wrapping addition: it first sign-extends both source elements, then keeps the addition result in a 2*SEW-wide destination element.

Official syntax is `vwadd.vx vd, vs2, rs1, vm`; vm=1 is unmasked, while vm=0 uses v0.t to select active elements for this instruction.
vs2 is SEW-wide; the .vx scalar is converted to SEW by taking low SEW bits when XLEN is larger or sign-extending when XLEN is smaller, then both operands are sign-extended to 2*SEW and added.
Destination elements are 2*SEW wide and destination EMUL is twice the source EMUL; this is not an accumulator instruction that reads old vd.
Tail elements and masked-off elements follow the current vtype tail/mask policy; the mnemonic alone does not imply fixed zeroing.

Vector Execution Context

When reading VWADD.VX, do not stop at the mnemonic. Official V-extension semantics also depend on the current vl, vtype, and mask state. .vx: one vector source and one integer scalar source participate.

Check vl first

The current vl determines the number of body elements. Typical code executes vsetvli, vsetivli, or vsetvl before this instruction.

Then check vtype

The current vtype supplies SEW, LMUL, tail policy, and mask policy; these affect element width, register-group size, and inactive/tail destination elements.

Then check vm/v0

For ordinary vector instructions with vm, vm=0 uses v0 as the execution mask and vm=1 is unmasked. A few forms such as VMERGE use v0 as data-selection input.

Official source: RISC-V V Standard Extension for Vector Operations

Common Usage Scenarios

Vector Integer Arithmetic

Assume enabled V/VS, valid m1,tu,mu, VLEN=4096, XLEN=64, vl=4, vstart=0, v0.mask[0..3]=1101; SEW=8, v12=[127,128,255,0], x5=1. v8[0]=128 (0x0080), v8[1]=-127 (0xff81), v8[3]=1 (0x0001). Interpret sources as signed two’s-complement values; results are 16-bit. Lane2 and tails keep old values; vxsat stays unchanged. Success resets vstart=0.

Widening Operations

Assume enabled V/VS, valid m1,tu,mu, VLEN=4096, XLEN=64, vl=4, vstart=0, v0.mask[0..3]=1101; SEW=8, v12=[127,128,255,0], x5=1. v8[0]=128 (0x0080), v8[1]=-127 (0xff81), v8[3]=1 (0x0001). Interpret sources as signed two’s-complement values; results are 16-bit. Lane2 and tails keep old values; vxsat stays unchanged. Success resets vstart=0.

Vectorized Loops

Assume enabled V/VS, valid m1,tu,mu, VLEN=4096, XLEN=64, vl=4, vstart=0, v0.mask[0..3]=1101; SEW=8, v12=[127,128,255,0], x5=1. v8[0]=128 (0x0080), v8[1]=-127 (0xff81), v8[3]=1 (0x0001). Interpret sources as signed two’s-complement values; results are 16-bit. Lane2 and tails keep old values; vxsat stays unchanged. Success resets vstart=0.

Pre-Use Checklist

Syntax Check
  • Confirm the current instruction format is OPMVX.
  • 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

Destination elements are 2*SEW wide, so the destination register group EMUL widens too.
Signed forms sign-extend inputs.
This is widening addition, not saturating addition; it does not set vxsat.

FAQ

How is VWADD.VX different from ordinary addition?

VWADD.VX sign-extends SEW source elements and produces a 2*SEW-wide result; ordinary single-width vector addition writes only a SEW-wide result.

Does VWADD.VX read old vd as an accumulator?

No. These .vv/.vx forms write a result formed from current SEW-wide sources; .wv/.wx are wide-vs2-source forms and likewise do not read old vd.