Skip to content

vaadd

vaadd 是 RISC-V V 1.0 的平均加减指令。不同操作数后缀属于同一助记符并集中列在本页。

操作码
V 1.0 · 见官方编码表
指令集
RISC-V V 1.0
英文全称
vaadd:平均加减
参考资料
RISC-V V 1.0
页码
01vaadd.vv02vd, vs2, vs1, vm
01
指令助记符vaadd.vvmnemonic

vaadd:平均加减

02
操作数vd, vs2, vs1, vmdestination

该形式的操作数顺序;其他形式见下表。

VAADD · REGISTER OPERATIONRISCV · ARITHMETIC
li a0, 8 vsetvli t0, a0, e8, mf2, tu, mu # VLEN=128 csrwi vxrm, 0 # rnu vaadd.vv v0, v8, v12
VLMAXLMUL × VLEN ÷ SEW8
vs2 · v8第一来源 · 有符号二补码
v8[63:0]
vs2[7]-8i8
vs2[6]-7i8
vs2[5]-6i8
vs2[4]-5i8
vs2[3]-4i8
vs2[2]-3i8
vs2[1]-2i8
vs2[0]-1i8
vs1 · v12第二来源 · 有符号二补码
v12[63:0]
vs1[7]11i8
vs1[6]8i8
vs1[5]9i8
vs1[4]6i8
vs1[3]7i8
vs1[2]4i8
vs1[1]5i8
vs1[0]2i8
vd · v0(结果)有符号二补码平均
v0[63:0]
vd[7]2平均 · rnu
vd[6]1平均 · rnu
vd[5]2平均 · rnu
vd[4]1平均 · rnu
vd[3]2平均 · rnu
vd[2]1平均 · rnu
vd[1]2平均 · rnu
vd[0]1平均 · rnu
每个圆球代表一个完整元素强调背景:目标写入vaadd 按有符号二补码解释:0xFF = -1高索引在左、低索引在右

指令形式

语法说明
vaadd.vv vd, vs2, vs1, vmRISC-V V 1.0 规范形式
vaadd.vx vd, vs2, rs1, vmRISC-V V 1.0 规范形式

元素语义

元素 0 位于寄存器组最低 SEW 位;活动 body 元素按 arithmetic 类语义处理。VLMAX = LMUL × VLEN / SEW,实际写入范围由 vstartvl、执行掩码和尾部策略共同决定。

语义伪代码

VAADDRISC-V V 1.0 · PSEUDOCODE
rhs(i) = .vv ? vs1[i] : .vx/.vf ? scalar(rs1) : sign_extend(imm)
for i = vstart .. vl - 1:
    if vm == 1 or v0.mask[i] == 1:
        vd[i] = round_shift_signed(vs2[i] + rhs(i), 1, vxrm)
    else:
        vd[i] = vma ? agnostic : old_vd[i]
for i = vl .. VLMAX - 1:
    vd[i] = vta ? agnostic : old_vd[i]
vstart = 0
agnostic 表示规范允许保留旧值或写全 1;辅助函数名称直接表达其规范动作。

注意点

修改的寄存器与状态

活动目标元素写入 vd,来源保持不变;prestart 元素不变,被掩码元素由 vma、尾部元素由 vta 决定保持或 agnostic,正常完成后 vstart=0。目标与来源须满足 LMUL/EMUL 对齐、编号范围和重叠限制。

内存对齐

该指令只使用寄存器,不访问数据内存,因此没有内存对齐要求。整数、掩码和排列操作不修改 x86 风格条件码;浮点运算按规范累积 fflags

示例

asm
vsetvli t0, a0, e32, m1, tu, mu
vaadd.vv v0, v8, v12

参考

SIGNAL MAINTAINED · BUILT FROM MARKDOWN