pub enum Rv32ZcmpInstruction<Reg> {
Show 34 variants
CAddi4spn {
rd: Reg,
nzuimm: u16,
/* private fields */
},
CLw {
rs1: Reg,
rd: Reg,
uimm: u8,
/* private fields */
},
CSw {
rs1: Reg,
rs2: Reg,
uimm: u8,
},
CNop { /* private fields */ },
CAddi {
rd: Reg,
nzimm: i8,
/* private fields */
},
CJal {
imm: i16,
/* private fields */
},
CLi {
rd: Reg,
imm: i8,
/* private fields */
},
CAddi16sp {
nzimm: i16,
/* private fields */
},
CLui {
rd: Reg,
nzimm: I24,
/* private fields */
},
CSrli {
rd: Reg,
shamt: u8,
/* private fields */
},
CSrai {
rd: Reg,
shamt: u8,
/* private fields */
},
CAndi {
rd: Reg,
imm: i8,
/* private fields */
},
CSub {
rs2: Reg,
rd: Reg,
/* private fields */
},
CXor {
rs2: Reg,
rd: Reg,
/* private fields */
},
COr {
rs2: Reg,
rd: Reg,
/* private fields */
},
CAnd {
rs2: Reg,
rd: Reg,
/* private fields */
},
CJ {
imm: i16,
/* private fields */
},
CBeqz {
rs1: Reg,
imm: i16,
/* private fields */
},
CBnez {
rs1: Reg,
imm: i16,
/* private fields */
},
CSlli {
rd: Reg,
shamt: u8,
/* private fields */
},
CLwsp {
rd: Reg,
uimm: u8,
/* private fields */
},
CJr {
rs1: Reg,
/* private fields */
},
CMv {
rs2: Reg,
rd: Reg,
/* private fields */
},
CEbreak { /* private fields */ },
CJalr {
rs1: Reg,
/* private fields */
},
CAdd {
rs2: Reg,
rd: Reg,
/* private fields */
},
CSwsp {
rs2: Reg,
uimm: u8,
/* private fields */
},
CUnimp { /* private fields */ },
CmPush {
urlist: ZcmpUrlist<Reg>,
stack_adj: u8,
/* private fields */
},
CmPop {
urlist: ZcmpUrlist<Reg>,
stack_adj: u8,
/* private fields */
},
CmPopretz {
urlist: ZcmpUrlist<Reg>,
stack_adj: u8,
/* private fields */
},
CmPopret {
urlist: ZcmpUrlist<Reg>,
stack_adj: u8,
/* private fields */
},
CmMva01s {
rs1: Reg,
rs2: Reg,
},
CmMvsa01 {
rs1: Reg,
rs2: Reg,
},
}Expand description
Zcmp compressed instruction set
Variants§
CAddi4spn
C.ADDI4SPN rd’ = sp + nzuimm (nzuimm != 0)
CLw
C.LW rd’ = sext(mem32[rs1’ + uimm])
CSw
C.SW mem32[rs1’ + uimm] = rs2’
CNop
C.NOP (ADDI x0, x0, 0 with rd==x0 and nzimm==0)
CAddi
C.ADDI rd += nzimm (rd != x0)
CJal
C.JAL ra = pc+2; pc += imm
CLi
C.LI rd = sext(imm) (rd=x0 is a HINT)
CAddi16sp
C.ADDI16SP sp += nzimm (nzimm != 0)
CLui
C.LUI rd = sext(nzimm << 12) (rd != x0, rd != x2, nzimm != 0)
CSrli
C.SRLI rd’ >>= shamt (logical, 5-bit shamt; shamt=0 is a HINT)
CSrai
C.SRAI rd’ >>= shamt (arithmetic, 5-bit shamt; shamt=0 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’
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 (5-bit shamt; rd=x0 or shamt=0 is a HINT)
CLwsp
C.LWSP rd = sext(mem32[sp + uimm]) (rd != x0)
CJr
C.JR pc = rs1 (rs1 != x0)
Fields
rs1: RegCMv
C.MV rd = rs2 (rs2 != x0; rd=x0 is a HINT)
CEbreak
C.EBREAK
CJalr
C.JALR ra = pc+2; pc = rs1 (rs1 != x0)
Fields
rs1: RegCAdd
C.ADD rd += rs2 (rs2 != x0; rd=x0 is a HINT)
CSwsp
C.SWSP mem32[sp + uimm] = rs2
CUnimp
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’.
The fields are called both r1s/r2s and rs1/rs2 in the spec, rs1/rs2 is used here for consistency with other instructions.
CmMvsa01
CM.MVSA01 - r1s’ = a0, r2s’ = a1 (r1s’ != r2s’).
The fields are called both r1s/r2s and rs1/rs2 in the spec, rs1/rs2 is used here for consistency with other instructions.
Trait Implementations§
Source§impl<Reg: Clone> Clone for Rv32ZcmpInstruction<Reg>
impl<Reg: Clone> Clone for Rv32ZcmpInstruction<Reg>
Source§fn clone(&self) -> Rv32ZcmpInstruction<Reg>
fn clone(&self) -> Rv32ZcmpInstruction<Reg>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more