Skip to main content

29 A listing of standard RISC-V pseudoinstructions

Table 5. Pseudo Instructions

PseudoinstructionBase Instruction(s)MeaningComment
la rd, symboladdi rd, rd, symbol[11:0]Load addressWith .option nopic (Default)
la rd, symboll{w|d} rd, symbol@GOT11:0Load addressWith .option pic
lla rd, symboladdi rd, rd, symbol[11:0]Load local address
lga rd, symboll{w|d} rd, symbol@GOT11:0Load global address
l{b|h|w|d} rd, symboll{b|h|w|d} rd, symbol11:0Load global
l{bu|hu|wu} rd, symboll{bu|hu|wu} rd, symbol11:0Load global, unsigned
s{b|h|w|d} rd, symbol, rts{b|h|w|d} rd, symbol11:0Store global
fl{h|w|d|q} rd, symbol, rtfl{h|w|d|q} rd, symbol11:0Floating-point load global
fs{h|w|d|q} rd, symbol, rtfs{h|w|d|q} rd, symbol11:0Floating-point store global
nopaddi x0, x0, 0No operation
li rd, immediate*Myriad sequencesLoad immediate
mv rd, rsaddi rd, rs, 0Copy register
not rd, rsxori rd, rs, -1Ones’ complement
neg rd, rssub rd, x0, rsTwo’s complement
negw rd, rssubw rd, x0, rsTwo’s complement word
sext.b rd, rssrai rd, rd, XLEN - 8Sign extend byteThis is a single instruction when Zbb extension is available.
sext.h rd, rssrai rd, rd, XLEN - 16Sign extend halfwordThis is a single instruction when Zbb extension is available.
sext.w rd, rsaddiw rd, rs, 0Sign extend word
zext.b rd, rsandi rd, rs, 255Zero extend byte
zext.h rd, rssrli rd, rd, XLEN - 16Zero extend halfwordThis is a single instruction when Zbb extension is available.
zext.w rd, rssrli rd, rd, XLEN - 32Zero extend wordWhen Zba extension is not available
zext.w rd, rsadd.uw rd, rs, x0Zero extend wordWhen Zba extension is available
seqz rd, rssltiu rd, rs, 1Set if = zero
snez rd, rssltu rd, x0, rsSet if != zero
sltz rd, rsslt rd, rs, x0Set if < zero
sgtz rd, rsslt rd, x0, rsSet if > zero
sgt rd, rs, rtslt rd, rt, rsSet if >
sgtu rd, rs, rtsltu rd, rt, rsSet if >, unsigned
fmv.h frd, frsfsgnj.h frd, frs, frsCopy half-precision register
fabs.h frd, frsfsgnjx.h frd, frs, frsHalf-precision absolute value
fneg.h frd, frsfsgnjn.h frd, frs, frsHalf-precision negate
fgt.h rd, frs, frtflt.h rd, frt, frsHalf-precision >
fge.h rd, frs, frtfle.h rd, frt, frsHalf-precision >=
fmv.s frd, frsfsgnj.s frd, frs, frsCopy single-precision register
fabs.s frd, frsfsgnjx.s frd, frs, frsSingle-precision absolute value
fneg.s frd, frsfsgnjn.s frd, frs, frsSingle-precision negate
fgt.s rd, frs, frtflt.s rd, frt, frsSingle-precision >
fge.s rd, frs, frtfle.s rd, frt, frsSingle-precision >=
fmv.d frd, frsfsgnj.d frd, frs, frsCopy double-precision register
fabs.d frd, frsfsgnjx.d frd, frs, frsDouble-precision absolute value
fneg.d frd, frsfsgnjn.d frd, frs, frsDouble-precision negate
fgt.d rd, frs, frtflt.d rd, frt, frsDouble-precision >
fge.d rd, frs, frtfle.d rd, frt, frsDouble-precision >=
fmv.q frd, frsfsgnj.q frd, frs, frsCopy quad-precision register
fabs.q frd, frsfsgnjx.q frd, frs, frsQuad-precision absolute value
fneg.q frd, frsfsgnjn.q frd, frs, frsQuad-precision negate
fgt.q rd, frs, frtflt.q rd, frt, frsQuad-precision >
fge.q rd, frs, frtfle.q rd, frt, frsQuad-precision >=
beqz rs, offsetbeq rs, x0, offsetBranch if = zero
bnez rs, offsetbne rs, x0, offsetBranch if != zero
blez rs, offsetbge x0, rs, offsetBranch if ≤ zero
bgez rs, offsetbge rs, x0, offsetBranch if ≥ zero
bltz rs, offsetblt rs, x0, offsetBranch if < zero
bgtz rs, offsetblt x0, rs, offsetBranch if > zero
bgt rs, rt, offsetblt rt, rs, offsetBranch if >
ble rs, rt, offsetbge rt, rs, offsetBranch if ≤
bgtu rs, rt, offsetbltu rt, rs, offsetBranch if >, unsigned
bleu rs, rt, offsetbgeu rt, rs, offsetBranch if ≤, unsigned
j offsetjal x0, offsetJump
jump offset, rtjalr x0, offset11:0Jump to far-away label
jal offsetjal x1, offsetJump and link
jr rsjalr x0, 0(rs)Jump register
jr offset(rs)jalr x0, offset(rs)Jump register plus offset
jalr rsjalr x1, 0(rs)Jump and link register
jalr offset(rs)jalr x1, offset(rs)Jump and link register plus offset
jalr rd, rsjalr rd, 0(rs)Jump and link register
retjalr x0, 0(x1)Return from subroutine
vfneg.v vd, vsvfsgnjn.vv vd, vs, vsFloating-point vector negate
vfabs.v vd, vsvfsgnjx.vv vd, vs, vsFloating-point vector absolute value
vmclr.m vdvmxor.mm vd, vd, vdVector clear mask register
vmfge.vv vd, va, vb, vmvmfle.vv vd, vb, va, vmVector Floating-point >=
vmfgt.vv vd, va, vb, vmvmflt.vv vd, vb, va, vmVector Floating-point
vmmv.m vd, vsvmand.mm vd, vs, vsVector copy mask register
vmnot.m vd, vsvmnand.mm vd, vs, vsVector invert mask bits
vmset.m vdvmxnor.mm vd, vd, vdVector set all mask bits
vmsge.vi vd, va, i, vmvmsgt.vi vd, va, i-1, vmVector >= ImmediateWhen -15 ⇐ i ⇐ 16
vmsgeu.vi vd, va, i, vmvmsgtu.vi vd, va, i-1, vmVector >= Immediate, unsignedWhen i != 0 and -15 ⇐ i ⇐ 16
vmsgeu.vi vd, va, 0, vmvmseq.vv vd, va, va, vmVector >= Immediate, unsignedSets active elements to true
vmsge.vv vd, va, vb, vmvmsle.vv vd, vb, va, vmVector >= Vector
vmsgeu.vv vd, va, vb, vmvmsleu.vv vd, vb, va, vmVector >= Vector, unsigned
vmsgt.vv vd, va, vb, vmvmslt.vv vd, vb, va, vmVector > Vector
vmsgtu.vv vd, va, vb, vmvmsltu.vv vd, vb, va, vmVector > Vector, unsigned
vmslt.vi vd, va, i, vmvmsle.vi vd, va, i-1, vmVector < immediateWhen -15 ⇐ i ⇐ 16
vmsltu.vi vd, va, i, vmvmsleu.vi vd, va, i-1, vmVector < immediate, unsignedWhen i != 0 and -15 ⇐ i ⇐ 16
vmsltu.vi vd, va, 0, vmvmsne.vv vd, va, va, vmVector < immediate, unsignedSets active elements to false
vneg.v vd,vsvrsub.vx vd,vs,x0Vector negate
vnot.v vd,vs,vmvxor.vi vd, vs, -1, vmVector not
vncvt.x.x.w vd,vs,vmvnsrl.wx vd,vs,x0,vmVector narrow convert element
vwcvt.x.x.v vd,vs,vmvwadd.vx vd,vs,x0,vmVector widen convert, integer-integer
vwcvtu.x.x.v vd,vs,vmvwaddu.vx vd,vs,x0,vmVector widen convert, integer-integer, unsigned
vl1r.v v3, (rs1)vl1re8.v v3, (rs1)Equal to vl1re8.v
vl2r.v v2, (rs1)vl2re8.v v2, (rs1)Equal to vl2re8.v
vl4r.v v4, (rs1)vl4re8.v v4, (rs1)Equal to vl4re8.v
vl8r.v v8, (rs1)vl8re8.v v8, (rs1)Equal to vl8re8.v
vmsge{u}.vx vd, va, xvmnand.mm vd, vd, vdVector >= scalar, unmasked
vmsge{u}.vx vd, va, x, v0.tvmxor.mm vd, vd, v0Vector >= scalar, maskedWhen vd≠v0
vmsge{u}.vx vd, va, x, v0.t, vtvmandn.mm vd, vd, vtVector >= scalar, maskedWhen vd=v0
vmsge{u}.vx vd, va, x, v0.t, vtvmor.mm vd, vt, vdVector >= scalar, maskedFor any vd
call offsetjalr x1, offset11:0Call far-away subroutine
call rt, offsetjalr rt, offset11:0Call far-away subroutine
tail offsetjalr x0, offset11:0Tail call far-away subroutineIt will use x7 as scratch register when Zicfilp extension is available.
fencefence iorw, iorwFence on all memory and I/O
pausefence w, 0PAUSE hint