pub type ContractInstruction = ContractInstructionPrototype<ContractRegister>;Expand description
An instruction type used by contracts
Aliased Type§
pub enum ContractInstruction {
Show 183 variants
Ld {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Sd {
rs2: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Add {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Addi {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Xor {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Rori {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Srli {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Or {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
And {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Slli {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Lbu {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Auipc {
rd: Reg<u64>,
imm: i32,
},
Jalr {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Sb {
rs2: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Roriw {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Sub {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sltu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Mulhu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Mul {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh1add {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
CAddi4spn {
rd: Reg<u64>,
nzuimm: u16,
},
CLw {
rd: Reg<u64>,
rs1: Reg<u64>,
uimm: u8,
},
CLd {
rd: Reg<u64>,
rs1: Reg<u64>,
uimm: u8,
},
CSw {
rs1: Reg<u64>,
rs2: Reg<u64>,
uimm: u8,
},
CSd {
rs1: Reg<u64>,
rs2: Reg<u64>,
uimm: u8,
},
CNop,
CAddi {
rd: Reg<u64>,
nzimm: i8,
},
CAddiw {
rd: Reg<u64>,
imm: i8,
},
CLi {
rd: Reg<u64>,
imm: i8,
},
CAddi16sp {
nzimm: i16,
},
CLui {
rd: Reg<u64>,
nzimm: i32,
},
CSrli {
rd: Reg<u64>,
shamt: u8,
},
CSrai {
rd: Reg<u64>,
shamt: u8,
},
CAndi {
rd: Reg<u64>,
imm: i8,
},
CSub {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CXor {
rd: Reg<u64>,
rs2: Reg<u64>,
},
COr {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CAnd {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CSubw {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CAddw {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CJ {
imm: i16,
},
CBeqz {
rs1: Reg<u64>,
imm: i16,
},
CBnez {
rs1: Reg<u64>,
imm: i16,
},
CSlli {
rd: Reg<u64>,
shamt: u8,
},
CLwsp {
rd: Reg<u64>,
uimm: u8,
},
CLdsp {
rd: Reg<u64>,
uimm: u16,
},
CJr {
rs1: Reg<u64>,
},
CMv {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CEbreak,
CJalr {
rs1: Reg<u64>,
},
CAdd {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CSwsp {
rs2: Reg<u64>,
uimm: u8,
},
CSdsp {
rs2: Reg<u64>,
uimm: u16,
},
CUnimp,
CLbu {
rd: Reg<u64>,
rs1: Reg<u64>,
uimm: u8,
},
CLh {
rd: Reg<u64>,
rs1: Reg<u64>,
uimm: u8,
},
CLhu {
rd: Reg<u64>,
rs1: Reg<u64>,
uimm: u8,
},
CSb {
rs1: Reg<u64>,
rs2: Reg<u64>,
uimm: u8,
},
CSh {
rs1: Reg<u64>,
rs2: Reg<u64>,
uimm: u8,
},
CZextB {
rd: Reg<u64>,
},
CSextB {
rd: Reg<u64>,
},
CZextH {
rd: Reg<u64>,
},
CSextH {
rd: Reg<u64>,
},
CZextW {
rd: Reg<u64>,
},
CNot {
rd: Reg<u64>,
},
CMul {
rd: Reg<u64>,
rs2: Reg<u64>,
},
CmPush {
urlist: ZcmpUrlist<Reg<u64>>,
stack_adj: u32,
},
CmPop {
urlist: ZcmpUrlist<Reg<u64>>,
stack_adj: u32,
},
CmPopretz {
urlist: ZcmpUrlist<Reg<u64>>,
stack_adj: u32,
},
CmPopret {
urlist: ZcmpUrlist<Reg<u64>>,
stack_adj: u32,
},
CmMva01s {
r1s: Reg<u64>,
r2s: Reg<u64>,
},
CmMvsa01 {
r1s: Reg<u64>,
r2s: Reg<u64>,
},
Sll {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Slt {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Srl {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sra {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Addw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Subw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sllw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Srlw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sraw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Slti {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Sltiu {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Xori {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Ori {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Andi {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Srai {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Addiw {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Slliw {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Srliw {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Sraiw {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Lb {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Lh {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Lw {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Lhu {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Lwu {
rd: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Sh {
rs2: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Sw {
rs2: Reg<u64>,
rs1: Reg<u64>,
imm: i16,
},
Beq {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Bne {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Blt {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Bge {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Bltu {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Bgeu {
rs1: Reg<u64>,
rs2: Reg<u64>,
imm: i32,
},
Lui {
rd: Reg<u64>,
imm: i32,
},
Jal {
rd: Reg<u64>,
imm: i32,
},
FenceTso,
Ebreak,
Unimp,
Mulh {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Mulhsu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Div {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Divu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Rem {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Remu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Mulw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Divw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Divuw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Remw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Remuw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
AddUw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh1addUw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh2add {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh2addUw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh3add {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sh3addUw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
SlliUw {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Andn {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Orn {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Xnor {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Clz {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Clzw {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Ctz {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Ctzw {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Cpop {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Cpopw {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Max {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Maxu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Min {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Minu {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sextb {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sexth {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Zexth {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Rol {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Rolw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Ror {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Rorw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Orcb {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Rev8 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Bset {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Bseti {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Bclr {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Bclri {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Binv {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Binvi {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Bext {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Bexti {
rd: Reg<u64>,
rs1: Reg<u64>,
shamt: u8,
},
Clmul {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Clmulh {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Clmulr {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Pack {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Packh {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Packw {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Brev8 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Xperm4 {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Xperm8 {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Aes64Ds {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Aes64Dsm {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Aes64Im {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Aes64Ks1i {
rd: Reg<u64>,
rs1: Reg<u64>,
rnum: Rv64ZkndKsRnum,
},
Aes64Ks2 {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Aes64Es {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Aes64Esm {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
Sha256Sig0 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha256Sig1 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha256Sum0 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha256Sum1 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha512Sig0 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha512Sig1 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha512Sum0 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
Sha512Sum1 {
rd: Reg<u64>,
rs1: Reg<u64>,
},
CzeroEqz {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
CzeroNez {
rd: Reg<u64>,
rs1: Reg<u64>,
rs2: Reg<u64>,
},
}Variants§
Ld
Sd
Add
Addi
Xor
Rori
Srli
Or
And
Slli
Lbu
Auipc
Jalr
Sb
Roriw
Sub
Sltu
Mulhu
Mul
Sh1add
CAddi4spn
C.ADDI4SPN rd’ = sp + nzuimm (nzuimm ∈ 4..1020 step 4)
CLw
C.LW rd’ = sext(mem32[rs1’ + uimm])
CLd
C.LD rd’ = mem64[rs1’ + uimm]
CSw
C.SW mem32[rs1’ + uimm] = rs2’
CSd
C.SD mem64[rs1’ + uimm] = rs2’
CNop
C.NOP (ADDI x0, x0, 0 with rd==x0 and nzimm==0)
CAddi
C.ADDI rd += nzimm (rd != x0)
CAddiw
C.ADDIW rd = sext((rd[31:0] + imm)[31:0]) (rd != x0)
CLi
C.LI rd = sext(imm) (rd=x0 is a HINT)
CAddi16sp
C.ADDI16SP sp += nzimm*16 (nzimm != 0)
CLui
C.LUI rd = sext(nzimm << 12) (rd != x0, rd != x2, nzimm != 0)
CSrli
C.SRLI rd’ >>= shamt (logical right shift; shamt=0 with rd’=x0 is a HINT)
CSrai
C.SRAI rd’ >>= shamt (arithmetic right shift; shamt=0 with rd’=x0 is a HINT)
CAndi
C.ANDI rd’ &= sext(imm)
CSub
C.SUB rd’ -= rs2’
CXor
C.XOR rd’ ^= rs2’
COr
C.OR rd’ |= rs2’
CAnd
C.AND rd’ &= rs2’
CSubw
C.SUBW rd’ = sext((rd’[31:0] - rs2’[31:0])[31:0])
CAddw
C.ADDW rd’ = sext((rd’[31:0] + rs2’[31:0])[31:0])
CJ
C.J pc += sext(imm)
CBeqz
C.BEQZ if rs1’ == 0: pc += sext(imm)
CBnez
C.BNEZ if rs1’ != 0: pc += sext(imm)
CSlli
C.SLLI rd <<= shamt (rd=x0 or shamt=0 is a HINT)
CLwsp
C.LWSP rd = sext(mem32[sp + uimm]) (rd != x0)
CLdsp
C.LDSP rd = mem64[sp + uimm] (rd != x0)
CJr
C.JR pc = rs1 (rs1 != x0)
CMv
C.MV rd = rs2 (rs2 != x0; rd=x0 is a HINT)
CEbreak
C.EBREAK
CJalr
C.JALR ra = pc+2; pc = rs1 (rs1 != x0)
CAdd
C.ADD rd += rs2 (rs2 != x0; rd=x0 is a HINT)
CSwsp
C.SWSP mem32[sp + uimm] = rs2
CSdsp
C.SDSP mem64[sp + uimm] = rs2
CUnimp
CLbu
C.LBU rd’ = zero_extend(mem8[rs1’ + uimm]) uimm ∈ {0,1,2,3}
CLh
C.LH rd’ = sign_extend(mem16[rs1’ + uimm]) uimm ∈ {0,2}
CLhu
C.LHU rd’ = zero_extend(mem16[rs1’ + uimm]) uimm ∈ {0,2}
CSb
C.SB mem8[rs1’ + uimm] = rs2’ uimm ∈ {0,1,2,3}
CSh
C.SH mem16[rs1’ + uimm] = rs2’ uimm ∈ {0,2}
CZextB
C.ZEXT.B rd’ = rd’ & 0xff
CSextB
C.SEXT.B rd’ = sext(rd’[7:0]) (requires Zbb)
CZextH
C.ZEXT.H rd’ = rd’ & 0xffff (requires Zbb)
CSextH
C.SEXT.H rd’ = sext(rd’[15:0]) (requires Zbb)
CZextW
C.ZEXT.W rd’ = rd’ & 0xffff_ffff (requires Zba)
CNot
C.NOT rd’ = ~rd’
CMul
C.MUL rd’ = (rd’ * rs2’)[XLEN-1:0] (requires M or Zmmul)
CmPush
CM.PUSH - push reg_list, decrement sp by stack_adj
stack_adj = urlist.stack_adj_base() + spimm * 16 from the encoding.
CmPop
CM.POP - pop reg_list, increment sp by stack_adj (no return)
CmPopretz
CM.POPRETZ - pop reg_list, set a0=0, increment sp, return
CmPopret
CM.POPRET - pop reg_list, increment sp, return
CmMva01s
CM.MVA01S - a0 = r1s’, a1 = r2s’
CmMvsa01
CM.MVSA01 - r1s’ = a0, r2s’ = a1 (r1s’ != r2s’)
Sll
Slt
Srl
Sra
Addw
Subw
Sllw
Srlw
Sraw
Slti
Sltiu
Xori
Ori
Andi
Srai
Addiw
Slliw
Srliw
Sraiw
Lb
Lh
Lw
Lhu
Lwu
Sh
Sw
Beq
Bne
Blt
Bge
Bltu
Bgeu
Lui
Jal
FenceTso
Ebreak
Unimp
Mulh
Mulhsu
Div
Divu
Rem
Remu
Mulw
Divw
Divuw
Remw
Remuw
AddUw
Sh1addUw
Sh2add
Sh2addUw
Sh3add
Sh3addUw
SlliUw
Andn
Orn
Xnor
Clz
Clzw
Ctz
Ctzw
Cpop
Cpopw
Max
Maxu
Min
Minu
Sextb
Sexth
Zexth
Rol
Rolw
Ror
Rorw
Orcb
Rev8
Bset
Bseti
Bclr
Bclri
Binv
Binvi
Bext
Bexti
Clmul
Clmulh
Clmulr
Pack
Pack low 32 bits of rs1 and rs2 into rd
Packh
Pack low 8 bits of rs1 and rs2 into rd bytes 0 and 1
Packw
Pack low 16 bits of rs1 and rs2 into lower 32 bits of rd, sign-extend
Brev8
Reverse bits in each byte of rs1
Xperm4
Xperm8
Aes64Ds
AES final round decryption: InvShiftRows + InvSubBytes, no MixColumns
Aes64Dsm
AES middle round decryption: InvShiftRows + InvSubBytes + InvMixColumns
Aes64Im
AES inverse MixColumns on each 32-bit word of rs1
Aes64Ks1i
AES key schedule step 1 (rnum in 0..=10)
Aes64Ks2
AES key schedule step 2
Aes64Es
AES final round encryption: ShiftRows + SubBytes, no MixColumns
Aes64Esm
AES middle round encryption: ShiftRows + SubBytes + MixColumns
Sha256Sig0
Sha256Sig1
Sha256Sum0
Sha256Sum1
Sha512Sig0
Sha512Sig1
Sha512Sum0
Sha512Sum1
CzeroEqz
czero.eqz rd, rs1, rs2 - move zero to rd if rs2 == 0, else move rs1
CzeroNez
czero.nez rd, rs1, rs2 - move zero to rd if rs2 != 0, else move rs1