Ops
ops
¶
RISCV = Dialect('riscv', [AddiOp, SltiOp, SltiuOp, AndiOp, OriOp, XoriOp, LuiOp, AuipcOp, MVOp, SeqzOp, SnezOp, ZextBOp, ZextWOp, SextWOp, AddOp, SltOp, SltuOp, AndOp, OrOp, XorOp, SllOp, SrlOp, SubOp, SraOp, NopOp, JalOp, JOp, JalrOp, ReturnOp, BeqOp, BneOp, BltOp, BgeOp, BltuOp, BgeuOp, LbOp, LbuOp, LhOp, LhuOp, LwOp, SbOp, ShOp, SwOp, CsrrwOp, CsrrsOp, CsrrcOp, CsrrwiOp, CsrrsiOp, CsrrciOp, MulOp, MulhOp, MulhsuOp, MulhuOp, DivOp, DivuOp, RemOp, RemuOp, RolOp, RorOp, RemuwOp, SraiwOp, AddwOp, SubwOp, SllwOp, SrlwOp, SrawOp, RemwOp, MulwOp, DivwOp, DivuwOp, CZeroEqzOp, CZeroNezOp, BclrOp, BextOp, BinvOp, BsetOp, RolwOp, RorwOp, AddUwOp, Sh1addOp, Sh2addOp, Sh3addOp, Sh1addUwOp, Sh2addUwOp, Sh3addUwOp, SextBOp, SextHOp, ZextHOp, AndnOp, OrnOp, XnorOp, MaxOp, MaxUOp, MinOp, MinUOp, RoriwOp, SlliUwOp, EcallOp, LabelOp, DirectiveOp, AssemblySectionOp, EbreakOp, WfiOp, CustomAssemblyInstructionOp, CommentOp, GetFloatRegisterOp, FMVOp, FMAddSOp, FMSubSOp, FNMSubSOp, FNMAddSOp, FAddSOp, FSubSOp, FMulSOp, FDivSOp, FSqrtSOp, FSgnJSOp, FSgnJNSOp, FSgnJXSOp, FMinSOp, FMaxSOp, FCvtWSOp, FCvtWuSOp, FMvXWOp, FeqSOp, FltSOp, FleSOp, FClassSOp, FCvtSWOp, FCvtSWuOp, FMvWXOp, FLwOp, FSwOp, FMAddDOp, FMSubDOp, FAddDOp, FSubDOp, FMulDOp, FDivDOp, FMinDOp, FMaxDOp, FCvtDWOp, FCvtDWuOp, FLdOp, FSdOp, FMvDOp, VFAddSOp, VFMulSOp, ParallelMovOp, ClzOp, ClzwOp, CpopOp, CpopwOp, CtzOp, CtzwOp], [IntRegisterType, FloatRegisterType, FastMathFlagsAttr])
module-attribute
¶
AddiOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
AddiOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Adds the sign-extended 12-bit immediate to register rs1. Arithmetic overflow is ignored and the result is simply the low XLEN bits of the result.
x[rd] = x[rs1] + sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SltiOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Place the value 1 in register rd if register rs1 is less than the sign-extended immediate when both are treated as signed numbers, else 0 is written to rd.
x[rd] = x[rs1] <s sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.slti'
class-attribute
instance-attribute
¶
SltiuOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Place the value 1 in register rd if register rs1 is less than the immediate when both are treated as unsigned numbers, else 0 is written to rd.
x[rd] = x[rs1] <u sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sltiu'
class-attribute
instance-attribute
¶
AndiOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
AndiOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Performs bitwise AND on register rs1 and the sign-extended 12-bit immediate and place the result in rd.
x[rd] = x[rs1] & sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
OriOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
OriOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Performs bitwise OR on register rs1 and the sign-extended 12-bit immediate and place the result in rd.
x[rd] = x[rs1] | sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
XoriOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
XoriOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Performs bitwise XOR on register rs1 and the sign-extended 12-bit immediate and place the result in rd.
x[rd] = x[rs1] ^ sext(immediate)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
AddiwOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Adds the sign-extended 12-bit immediate to register rs1 and produces the proper sign-extension of a 32-bit result in rd. Overflows are ignored and the result is the low 32 bits of the result sign-extended to 64 bits.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SraiwOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Performs arithmetic right shift on the 32-bit of value in register rs1 by the shift amount held in the lower 5 bits of the immediate.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
AddwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Adds the 32-bit of registers rs1 and 32-bit of register rs2 and stores the result in rd. Arithmetic overflow is ignored and the low 32-bits of the result is sign-extended to 64-bits and written to the destination register.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SubwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Subtract the 32-bit of registers rs1 and 32-bit of register rs2 and stores the result in rd. Arithmetic overflow is ignored and the low 32-bits of the result is sign-extended to 64-bits and written to the destination register.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SllwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs logical left shift on the low 32-bits value in register rs1 by the shift amount held in the lower 5 bits of register rs2 and produce 32-bit results and written to the destination register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SrlwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs logical right shift on the low 32-bits value in register rs1 by the shift amount held in the lower 5 bits of register rs2 and produce 32-bit results and written to the destination register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SrawOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs arithmetic right shift on the low 32-bits value in register rs1 by the shift amount held in the lower 5 bits of register rs2 and produce 32-bit results and written to the destination register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
LuiOp
dataclass
¶
Bases: RdImmIntegerOperation
Build 32-bit constants and uses the U-type format. LUI places the U-immediate value in the top 20 bits of the destination register rd, filling in the lowest 12 bits with zeros.
x[rd] = sext(immediate[31:12] << 12)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.lui'
class-attribute
instance-attribute
¶
AuipcOp
dataclass
¶
Bases: RdImmIntegerOperation
Build pc-relative addresses and uses the U-type format. AUIPC forms a 32-bit offset from the 20-bit U-immediate, filling in the lowest 12 bits with zeros, adds this offset to the pc, then places the result in register rd.
x[rd] = pc + sext(immediate[31:12] << 12)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.auipc'
class-attribute
instance-attribute
¶
MVHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
MVOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction to copy contents of one int register to another.
Equivalent to addi rd, rs, 0
Source code in xdsl/dialects/riscv/ops.py
SeqzOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction that sets the destination register to 1 if the source register is equal to zero.
Equivalent to `sltiu rd, rs, 1
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.seqz'
class-attribute
instance-attribute
¶
SnezOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction that sets the destination register to 1 if the source register is not equal to zero.
Equivalent to sltu rd, x0, rs1
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.snez'
class-attribute
instance-attribute
¶
ZextBOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction that zero-extends the least-significant byte of the source to XLEN by copying the into all of the bits more significant than 31.
Equivalent to andi rd, rs1, 255
Source code in xdsl/dialects/riscv/ops.py
ZextWOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction that zero-extends the least-significant word of the source to XLEN by inserting 0’s into all of the bits more significant than 31.
Equivalent to add.uw rd, rs1, 0
See external documentation
Source code in xdsl/dialects/riscv/ops.py
SextWOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
A pseudo instruction that writes the sign-extension of the lower 32 bits of register rs1 into register rd.
Equivalent to addiw rd, rs, 0
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FMVHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FMVOp
dataclass
¶
Bases: RdRsFloatOperation[FloatRegisterType]
A pseudo instruction to copy contents of one float register to another.
Equivalent to fsgnj.s rd, rs, rs.
Both clang and gcc emit fsw rs, 0(x); flw rd, 0(x) to copy floats, possibly because
storing and loading bits from memory is a lower overhead in practice than reasoning
about floating-point values.
Source code in xdsl/dialects/riscv/ops.py
AddOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
AddOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Adds the registers rs1 and rs2 and stores the result in rd. Arithmetic overflow is ignored and the result is simply the low XLEN bits of the result.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SltOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Place the value 1 in register rd if register rs1 is less than register rs2 when both are treated as signed numbers, else 0 is written to rd.
x[rd] = x[rs1] <s x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.slt'
class-attribute
instance-attribute
¶
SltuOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Place the value 1 in register rd if register rs1 is less than register rs2 when both are treated as unsigned numbers, else 0 is written to rd.
x[rd] = x[rs1] <u x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sltu'
class-attribute
instance-attribute
¶
BitwiseAndHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
AndOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs bitwise AND on registers rs1 and rs2 and place the result in rd.
x[rd] = x[rs1] & x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
BitwiseOrHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
OrOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs bitwise OR on registers rs1 and rs2 and place the result in rd.
x[rd] = x[rs1] | x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
BitwiseXorHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
XorOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs bitwise XOR on registers rs1 and rs2 and place the result in rd.
x[rd] = x[rs1] ^ x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SllOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs logical left shift on the value in register rs1 by the shift amount held in the lower 5 bits of register rs2.
x[rd] = x[rs1] << x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sll'
class-attribute
instance-attribute
¶
SrlOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Logical right shift on the value in register rs1 by the shift amount held in the lower 5 bits of register rs2.
x[rd] = x[rs1] >>u x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.srl'
class-attribute
instance-attribute
¶
SubOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
SubOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Subtracts the registers rs1 and rs2 and stores the result in rd. Arithmetic overflow is ignored and the result is simply the low XLEN bits of the result.
x[rd] = x[rs1] - x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SraOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs arithmetic right shift on the value in register rs1 by the shift amount held in the lower 5 bits of register rs2.
x[rd] = x[rs1] >>s x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sra'
class-attribute
instance-attribute
¶
NopOp
dataclass
¶
Bases: NullaryOperation
Does not change any user-visible state, except for advancing the pc register. Canonical nop is encoded as addi x0, x0, 0.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.nop'
class-attribute
instance-attribute
¶
JalOp
dataclass
¶
Bases: RdImmJumpOperation
Jump to address and place return address in rd.
jal mylabel is a pseudoinstruction for jal ra, mylabel
x[rd] = pc+4; pc += sext(offset)
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.jal'
class-attribute
instance-attribute
¶
JOp
¶
Bases: RdImmJumpOperation
A pseudo-instruction, for unconditional jumps you don't expect to return from.
Is equivalent to JalOp with rd = x0.
Used to be a part of the spec, removed in 2.0.
Source code in xdsl/dialects/riscv/ops.py
JalrOp
dataclass
¶
Bases: RdRsImmJumpOperation
Jump to address and place return address in rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.jalr'
class-attribute
instance-attribute
¶
ReturnOp
dataclass
¶
Bases: NullaryOperation
Pseudo-op for returning from subroutine.
Equivalent to jalr x0, x1, 0
Source code in xdsl/dialects/riscv/ops.py
BeqOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 and rs2 are equal.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.beq'
class-attribute
instance-attribute
¶
BneOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 and rs2 are not equal.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.bne'
class-attribute
instance-attribute
¶
BltOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 is less than rs2, using signed comparison.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.blt'
class-attribute
instance-attribute
¶
BgeOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 is greater than or equal to rs2, using signed comparison.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.bge'
class-attribute
instance-attribute
¶
BltuOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 is less than rs2, using unsigned comparison.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.bltu'
class-attribute
instance-attribute
¶
BgeuOp
dataclass
¶
Bases: RsRsOffIntegerOperation
Take the branch if registers rs1 is greater than or equal to rs2, using unsigned comparison.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.bgeu'
class-attribute
instance-attribute
¶
LbOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Loads a 8-bit value from memory and sign-extends this to XLEN bits before storing it in register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
LbuOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Loads a 8-bit value from memory and zero-extends this to XLEN bits before storing it in register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
LhOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Loads a 16-bit value from memory and sign-extends this to XLEN bits before storing it in register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
LhuOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Loads a 16-bit value from memory and zero-extends this to XLEN bits before storing it in register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
LwOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
LwOp
dataclass
¶
Bases: RdRsImmIntegerOperation
Loads a 32-bit value from memory and sign-extends this to XLEN bits before storing it in register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
SbOp
dataclass
¶
Bases: RsRsImmIntegerOperation
Store 8-bit, values from the low bits of register rs2 to memory.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sb'
class-attribute
instance-attribute
¶
ShOp
dataclass
¶
Bases: RsRsImmIntegerOperation
Store 16-bit, values from the low bits of register rs2 to memory.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sh'
class-attribute
instance-attribute
¶
SwOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
SwOp
dataclass
¶
Bases: RsRsImmIntegerOperation
Store 32-bit, values from the low bits of register rs2 to memory.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.sw'
class-attribute
instance-attribute
¶
traits = traits_def(SwOpHasCanonicalizationPatternTrait())
class-attribute
instance-attribute
¶
assembly_line() -> str | None
¶
Source code in xdsl/dialects/riscv/ops.py
CsrrwOp
dataclass
¶
Bases: CsrReadWriteOperation
Atomically swaps values in the CSRs and integer registers. CSRRW reads the old value of the CSR, zero-extends the value to XLEN bits, then writes it to integer register rd. The initial value in rs1 is written to the CSR. If the 'writeonly' attribute evaluates to False, then the instruction shall not read the CSR and shall not cause any of the side effects that might occur on a CSR read; in this case rd must be allocated to x0.
t = CSRs[csr]; CSRs[csr] = x[rs1]; x[rd] = t
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrw'
class-attribute
instance-attribute
¶
CsrrsOp
dataclass
¶
Bases: CsrBitwiseOperation
Reads the value of the CSR, zero-extends the value to XLEN bits, and writes it to integer register rd. The initial value in integer register rs1 is treated as a bit mask that specifies bit positions to be set in the CSR. Any bit that is high in rs1 will cause the corresponding bit to be set in the CSR, if that CSR bit is writable. Other bits in the CSR are unaffected (though CSRs might have side effects when written).
If the 'readonly' attribute evaluates to True, then the instruction will not write to the CSR at all, and so shall not cause any of the side effects that might otherwise occur on a CSR write, such as raising illegal instruction exceptions on accesses to read-only CSRs. Note that if rs1 specifies a register holding a zero value other than x0, the instruction will still attempt to write the unmodified value back to the CSR and will cause any attendant side effects.
t = CSRs[csr]; CSRs[csr] = t | x[rs1]; x[rd] = t
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrs'
class-attribute
instance-attribute
¶
CsrrcOp
dataclass
¶
Bases: CsrBitwiseOperation
Reads the value of the CSR, zero-extends the value to XLEN bits, and writes it to integer register rd. The initial value in integer register rs1 is treated as a bit mask that specifies bit positions to be cleared in the CSR. Any bit that is high in rs1 will cause the corresponding bit to be cleared in the CSR, if that CSR bit is writable. Other bits in the CSR are unaffected (though CSRs might have side effects when written).
If the 'readonly' attribute evaluates to True, then the instruction will not write to the CSR at all, and so shall not cause any of the side effects that might otherwise occur on a CSR write, such as raising illegal instruction exceptions on accesses to read-only CSRs. Note that if rs1 specifies a register holding a zero value other than x0, the instruction will still attempt to write the unmodified value back to the CSR and will cause any attendant side effects.
t = CSRs[csr]; CSRs[csr] = t &~x[rs1]; x[rd] = t
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrc'
class-attribute
instance-attribute
¶
CsrrwiOp
dataclass
¶
Bases: CsrReadWriteImmOperation
Update the CSR using an XLEN-bit value obtained by zero-extending the 'immediate' attribute. If the 'writeonly' attribute evaluates to False, then the instruction shall not read the CSR and shall not cause any of the side effects that might occur on a CSR read; in this case rd must be allocated to x0.
x[rd] = CSRs[csr]; CSRs[csr] = zimm
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrwi'
class-attribute
instance-attribute
¶
CsrrsiOp
dataclass
¶
Bases: CsrBitwiseImmOperation
Reads the value of the CSR, zero-extends the value to XLEN bits, and writes it to integer register rd. The value in the 'immediate' attribute is treated as a bit mask that specifies bit positions to be set in the CSR. Any bit that is high in it will cause the corresponding bit to be set in the CSR, if that CSR bit is writable. Other bits in the CSR are unaffected (though CSRs might have side effects when written).
If the 'immediate' attribute value is zero, then the instruction will not write to the CSR at all, and so shall not cause any of the side effects that might otherwise occur on a CSR write, such as raising illegal instruction exceptions on accesses to read-only CSRs.
t = CSRs[csr]; CSRs[csr] = t | zimm; x[rd] = t
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrsi'
class-attribute
instance-attribute
¶
CsrrciOp
dataclass
¶
Bases: CsrBitwiseImmOperation
Reads the value of the CSR, zero-extends the value to XLEN bits, and writes it to integer register rd. The value in the 'immediate' attribute is treated as a bit mask that specifies bit positions to be cleared in the CSR. Any bit that is high in rs1 will cause the corresponding bit to be cleared in the CSR, if that CSR bit is writable. Other bits in the CSR are unaffected (though CSRs might have side effects when written).
If the 'immediate' attribute value is zero, then the instruction will not write to the CSR at all, and so shall not cause any of the side effects that might otherwise occur on a CSR write, such as raising illegal instruction exceptions on accesses to read-only CSRs.
t = CSRs[csr]; CSRs[csr] = t &~zimm; x[rd] = t
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.csrrci'
class-attribute
instance-attribute
¶
MulOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
MulOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs an XLEN-bit × XLEN-bit multiplication of signed rs1 by signed rs2 and places the lower XLEN bits in the destination register. x[rd] = x[rs1] * x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
MulhOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs an XLEN-bit × XLEN-bit multiplication of signed rs1 by signed rs2 and places the upper XLEN bits in the destination register. x[rd] = (x[rs1] s×s x[rs2]) >>s XLEN
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.mulh'
class-attribute
instance-attribute
¶
MulhsuOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs an XLEN-bit × XLEN-bit multiplication of signed rs1 by unsigned rs2 and places the upper XLEN bits in the destination register. x[rd] = (x[rs1] s × x[rs2]) >>s XLEN
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.mulhsu'
class-attribute
instance-attribute
¶
MulhuOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs an XLEN-bit × XLEN-bit multiplication of unsigned rs1 by unsigned rs2 and places the upper XLEN bits in the destination register. x[rd] = (x[rs1] u × x[rs2]) >>u XLEN
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.mulhu'
class-attribute
instance-attribute
¶
MulwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs an 32-bit × 32-bit multiplication of signed rs1 by signed rs2.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.mulw'
class-attribute
instance-attribute
¶
DivOpHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
DivOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an XLEN bits by XLEN bits signed integer division of rs1 by rs2, rounding towards zero. x[rd] = x[rs1] /s x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
DivuOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an XLEN bits by XLEN bits unsigned integer division of rs1 by rs2, rounding towards zero. x[rd] = x[rs1] /u x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.divu'
class-attribute
instance-attribute
¶
DivuwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an 32 bits by 32 bits unsigned integer division of rs1 by rs2.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.divuw'
class-attribute
instance-attribute
¶
DivwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an 32 bits by 32 bits signed integer division of rs1 by rs2.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.divw'
class-attribute
instance-attribute
¶
RemOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an XLEN bits by XLEN bits signed integer reminder of rs1 by rs2. x[rd] = x[rs1] %s x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.rem'
class-attribute
instance-attribute
¶
RemuOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an XLEN bits by XLEN bits unsigned integer reminder of rs1 by rs2. x[rd] = x[rs1] %u x[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.remu'
class-attribute
instance-attribute
¶
RemuwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an 32 bits by 32 bits unsigned integer reminder of rs1 by rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.remuw'
class-attribute
instance-attribute
¶
RemwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Perform an 32 bits by 32 bits signed integer reminder of rs1 by rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.remw'
class-attribute
instance-attribute
¶
RolOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs a rotate left of rs1 by the amount in least-significant log2(XLEN) bits of rs2.
let shamt = if xlen == 32
then x[rs2][4..0]
else x[rs2][5..0];
let result = (x[rs1] << shamt) | (x[rs2] >> (xlen - shamt));
x[rd] = result;
Source code in xdsl/dialects/riscv/ops.py
RorOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Performs a rotate right of rs1 by the amount in least-significant log2(XLEN) bits of rs2.
let shamt = if xlen == 32
then x[rs2][4..0]
else x[rs2][5..0];
let result = (x[rs1] >> shamt) | (x[rs2] << (xlen - shamt));
x[rd] = result;
Source code in xdsl/dialects/riscv/ops.py
SextHOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction sign-extends the least-significant halfword in rs to XLEN by copying the most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
ZextHOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction zero-extends the least-significant halfword of the source to XLEN by inserting 0’s into all of the bits more significant than 15.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
SextBOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction sign-extends the least-significant byte in the source to XLEN by copying the most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
BclrOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns rs1 with a single bit cleared at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
BextOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns a single bit extracted from rs1 at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
BinvOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns rs1 with a single bit inverted at the index specified in shamt. The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding to shamt[5]=1 are reserved.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
BsetOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns rs1 with a single bit set at the index specified in rs2. The index is read from the lower log2(XLEN) bits of rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
ClzOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction counts the number of 0’s before the first 1, starting at the most-significant bit (i.e., XLEN-1) and progressing to bit 0. Accordingly, if the input is 0, the output is XLEN, and if the most-significant bit of the input is a 1, the output is 0.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
ClzwOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction counts the number of 0’s before the first 1 starting at bit 31 and progressing to bit 0. Accordingly, if the least-significant word is 0, the output is 32, and if the most-significant bit of the word (i.e., bit 31) is a 1, the output is 0.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
CpopOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instructions counts the number of 1’s (i.e., set bits) in the source register.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
CpopwOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instructions counts the number of 1’s (i.e., set bits) in the least-significant word of the source register.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
CtzOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction counts the number of 0’s before the first 1, starting at the least-significant bit (i.e., 0) and progressing to the most-significant bit (i.e., XLEN-1). Accordingly, if the input is 0, the output is XLEN, and if the least-significant bit of the input is a 1, the output is 0.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
CtzwOp
dataclass
¶
Bases: RdRsIntegerOperation[IntRegisterType]
This instruction counts the number of 0’s before the first 1, starting at the least-significant bit (i.e., 0) and progressing to the most-significant bit of the least-significant word (i.e., 31). Accordingly, if the least-significant word is 0, the output is 32, and if the least-significant bit of the input is a 1, the output is 0.
See external documentation
Source code in xdsl/dialects/riscv/ops.py
RolwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs a rotate left on the least-significant word of rs1 by the amount in least-significant 5 bits of rs2. The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
let rs1 = EXTZ(X(rs1)[31..0])
let shamt = X(rs2)[4..0];
let result = (rs1 << shamt) | (rs1 >> (32 - shamt));
X(rd) = EXTS(result);
Source code in xdsl/dialects/riscv/ops.py
RorwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs a rotate right on the least-significant word of rs1 by the amount in least-significant 5 bits of rs2. The resultant word is sign-extended by copying bit 31 to all of the more-significant bits.
let rs1 = EXTZ(X(rs1)[31..0])
let shamt = X(rs2)[4..0];
let result = (rs1 >> shamt) | (rs1 << (32 - shamt));
X(rd) = EXTS(result);
Source code in xdsl/dialects/riscv/ops.py
RoriwOp
dataclass
¶
Bases: RdRsImmBitManipOperation
This instruction performs a rotate right on the least-significant word of rs1 by the amount in the least-significant log2(XLEN) bits of shamt. The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
let rs1 = EXTZ(X(rs1)[31..0];
let result = (rs1 >> shamt[4..0]) | (X(rs1) << (32 - shamt[4..0]));
X(rd) = EXTS(result[31..0]);
Source code in xdsl/dialects/riscv/ops.py
AddUwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs an XLEN-wide addition between rs2 and the zero-extended least-significant word of rs1.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh1addOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction shifts rs1 to the left by 1 bit and adds it to rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh2addOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction shifts rs1 to the left by 2 places and adds it to rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh3addOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction shifts rs1 to the left by 2 places and adds it to rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh1addUwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs an XLEN-wide addition of two addends. The first addend is rs2. The second addend is the unsigned value formed by extracting the least-significant word of rs1 and shifting it left by 1 place.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh2addUwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs an XLEN-wide addition of two addends. The first addend is rs2. The second addend is the unsigned value formed by extracting the least-significant word of rs1 and shifting it left by 2 places.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
Sh3addUwOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs an XLEN-wide addition of two addends. The first addend is rs2. The second addend is the unsigned value formed by extracting the least-significant word of rs1 and shifting it left by 3 places.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
SlliUwOp
dataclass
¶
Bases: RdRsImmBitManipOperation
This instruction takes the least-significant word of rs1, zero-extends it, and shifts it left by the immediate.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
AndnOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs the bitwise logical AND operation between rs1 and the bitwise inversion of rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
OrnOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs the bitwise logical OR operation between rs1 and the bitwise inversion of rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
XnorOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction performs the bit-wise exclusive-NOR operation on rs1 and rs2.
See external documentation.Source code in xdsl/dialects/riscv/ops.py
MaxOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns the larger of two signed integers.
let rs1_val = X(rs1);
let rs2_val = X(rs2);
let result = if rs1_val <_s rs2_val
then rs2_val
else rs1_val;
X(rd) = result;
Source code in xdsl/dialects/riscv/ops.py
MaxUOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns the larger of two unsigned integers.
let rs1_val = X(rs1);
let rs2_val = X(rs2);
let result = if rs1_val <_u rs2_val
then rs2_val
else rs1_val;
X(rd) = result;
Source code in xdsl/dialects/riscv/ops.py
MinOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns the smaller of two signed integers.
let rs1_val = X(rs1);
let rs2_val = X(rs2);
let result = if rs1_val <_s rs2_val
then rs1_val
else rs2_val;
X(rd) = result;
Source code in xdsl/dialects/riscv/ops.py
MinUOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
This instruction returns the smaller of two unsigned integers.
let rs1_val = X(rs1);
let rs2_val = X(rs2);
let result = if rs1_val <_u rs2_val
then rs1_val
else rs2_val;
X(rd) = result;
Source code in xdsl/dialects/riscv/ops.py
CZeroEqzOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Moves zero to a register rd, if the condition rs2 is equal to zero, otherwise moves rs1 to rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.czero.eqz'
class-attribute
instance-attribute
¶
CZeroNezOp
dataclass
¶
Bases: RdRsRsIntegerOperation[IntRegisterType, IntRegisterType]
Moves zero to a register rd, if the condition rs2 is nonzero, otherwise moves rs1 to rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.czero.nez'
class-attribute
instance-attribute
¶
EcallOp
dataclass
¶
Bases: NullaryOperation
The ECALL instruction is used to make a request to the supporting execution environment, which is usually an operating system. The ABI for the system will define how parameters for the environment request are passed, but usually these will be in defined locations in the integer register file.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.ecall'
class-attribute
instance-attribute
¶
LabelOp
¶
Bases: RISCVAsmOperation, RISCVRegallocOperation
The label operation is used to emit text labels (e.g. loop:) that are used as branch, unconditional jump targets and symbol offsets.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.label'
class-attribute
instance-attribute
¶
label = attr_def(StringAttr)
class-attribute
instance-attribute
¶
comment = opt_attr_def(StringAttr)
class-attribute
instance-attribute
¶
assembly_format = '$label attr-dict'
class-attribute
instance-attribute
¶
__init__(label: str | StringAttr, *, comment: str | StringAttr | None = None)
¶
Source code in xdsl/dialects/riscv/ops.py
DirectiveOp
¶
Bases: RISCVAsmOperation, RISCVRegallocOperation
The directive operation is used to emit assembler directives (e.g. .word; .equ; etc.) without any associated region of assembly code. Directives without an argument use an empty string value. A more complete list of directives can be found here:
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.directive'
class-attribute
instance-attribute
¶
directive = attr_def(StringAttr)
class-attribute
instance-attribute
¶
value = attr_def(StringAttr)
class-attribute
instance-attribute
¶
assembly_format = '$directive $value attr-dict'
class-attribute
instance-attribute
¶
__init__(directive: str | StringAttr, value: str | StringAttr = '')
¶
Source code in xdsl/dialects/riscv/ops.py
assembly_line() -> str | None
¶
AssemblySectionOp
¶
Bases: IRDLOperation, AssemblyPrintable
The directive operation is used to emit assembler directives (e.g. .text; .data; etc.) with the scope of a section.
A more complete list of directives can be found here:
See external documentation.
This operation can have nested operations, corresponding to a section of the assembly.
Source code in xdsl/dialects/riscv/ops.py
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 | |
name = 'riscv.assembly_section'
class-attribute
instance-attribute
¶
directive = attr_def(StringAttr)
class-attribute
instance-attribute
¶
data = region_def('single_block')
class-attribute
instance-attribute
¶
traits = traits_def(NoTerminator(), IsolatedFromAbove())
class-attribute
instance-attribute
¶
__init__(directive: str | StringAttr, region: Region | None = None)
¶
Source code in xdsl/dialects/riscv/ops.py
parse(parser: Parser) -> AssemblySectionOp
classmethod
¶
Source code in xdsl/dialects/riscv/ops.py
print(printer: Printer) -> None
¶
Source code in xdsl/dialects/riscv/ops.py
CustomAssemblyInstructionOp
¶
Bases: RISCVInstruction
An instruction with unspecified semantics, that can be printed during assembly emission.
During assembly emission, the results are printed before the operands:
s0 = rv32.GetRegisterOp(Registers.s0).res
s1 = rv32.GetRegisterOp(Registers.s1).res
rs2 = riscv.Registers.s2
rs3 = riscv.Registers.s3
op = CustomAssemblyInstructionOp("my_instr", (s0, s1), (rs2, rs3))
op.assembly_line() # "my_instr s2, s3, s0, s1"
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.custom_assembly_instruction'
class-attribute
instance-attribute
¶
inputs = var_operand_def()
class-attribute
instance-attribute
¶
outputs = var_result_def()
class-attribute
instance-attribute
¶
instruction_name = attr_def(StringAttr)
class-attribute
instance-attribute
¶
comment = opt_attr_def(StringAttr)
class-attribute
instance-attribute
¶
assembly_format = '$inputs attr-dict `:` functional-type($inputs, $outputs)'
class-attribute
instance-attribute
¶
__init__(instruction_name: str | StringAttr, inputs: Sequence[SSAValue], result_types: Sequence[Attribute], *, comment: str | StringAttr | None = None)
¶
Source code in xdsl/dialects/riscv/ops.py
assembly_instruction_name() -> str
¶
CommentOp
¶
Bases: RISCVAsmOperation, RISCVRegallocOperation
Source code in xdsl/dialects/riscv/ops.py
EbreakOp
dataclass
¶
Bases: NullaryOperation
The EBREAK instruction is used by debuggers to cause control to be transferred back to a debugging environment.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.ebreak'
class-attribute
instance-attribute
¶
WfiOp
dataclass
¶
Bases: NullaryOperation
The Wait for Interrupt instruction (WFI) provides a hint to the implementation that the current hart can be stalled until an interrupt might need servicing.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.wfi'
class-attribute
instance-attribute
¶
GetFloatRegisterOp
dataclass
¶
Bases: GetAnyRegisterOperation[FloatRegisterType]
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.get_float_register'
class-attribute
instance-attribute
¶
ParallelMovOp
¶
Bases: RISCVRegallocOperation
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.parallel_mov'
class-attribute
instance-attribute
¶
inputs = var_operand_def(RangeOf(RISCVRegisterType).of_length(_L))
class-attribute
instance-attribute
¶
outputs: VarOpResult[RISCVRegisterType] = var_result_def(RangeOf(RISCVRegisterType).of_length(_L))
class-attribute
instance-attribute
¶
input_widths = prop_def(DenseArrayBase.constr(i32))
class-attribute
instance-attribute
¶
free_registers = opt_prop_def(ArrayAttr[RISCVRegisterType])
class-attribute
instance-attribute
¶
assembly_format = '$inputs $input_widths attr-dict `:` functional-type($inputs, $outputs)'
class-attribute
instance-attribute
¶
irdl_options = (ParsePropInAttrDict(),)
class-attribute
instance-attribute
¶
__init__(inputs: Sequence[SSAValue], outputs: Sequence[RISCVRegisterType], input_widths: DenseArrayBase[I32], free_registers: ArrayAttr[RISCVRegisterType] | None = None)
¶
Source code in xdsl/dialects/riscv/ops.py
verify_() -> None
¶
Source code in xdsl/dialects/riscv/ops.py
FMAddSOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform single-precision fused multiply addition.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmadd.s'
class-attribute
instance-attribute
¶
FMSubSOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform single-precision fused multiply substraction.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmsub.s'
class-attribute
instance-attribute
¶
FNMSubSOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform single-precision fused multiply substraction.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fnmsub.s'
class-attribute
instance-attribute
¶
FNMAddSOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform single-precision fused multiply addition.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fnmadd.s'
class-attribute
instance-attribute
¶
FAddSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform single-precision floating-point addition.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FSubSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform single-precision floating-point substraction.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsub.s'
class-attribute
instance-attribute
¶
FMulSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform single-precision floating-point multiplication.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmul.s'
class-attribute
instance-attribute
¶
FDivSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform single-precision floating-point division.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fdiv.s'
class-attribute
instance-attribute
¶
FSqrtSOp
dataclass
¶
Bases: RdRsFloatOperation[FloatRegisterType]
Perform single-precision floating-point square root.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsqrt.s'
class-attribute
instance-attribute
¶
FSgnJSOp
dataclass
¶
Bases: RdRsRsFloatOperation[FloatRegisterType, FloatRegisterType]
Produce a result that takes all bits except the sign bit from rs1. The result’s sign bit is rs2’s sign bit.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsgnj.s'
class-attribute
instance-attribute
¶
FSgnJNSOp
dataclass
¶
Bases: RdRsRsFloatOperation[FloatRegisterType, FloatRegisterType]
Produce a result that takes all bits except the sign bit from rs1. The result’s sign bit is opposite of rs2’s sign bit.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsgnjn.s'
class-attribute
instance-attribute
¶
FSgnJXSOp
dataclass
¶
Bases: RdRsRsFloatOperation[FloatRegisterType, FloatRegisterType]
Produce a result that takes all bits except the sign bit from rs1. The result’s sign bit is XOR of sign bit of rs1 and rs2.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsgnjx.s'
class-attribute
instance-attribute
¶
FMinSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Write the smaller of single precision data in rs1 and rs2 to rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmin.s'
class-attribute
instance-attribute
¶
FMaxSOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Write the larger of single precision data in rs1 and rs2 to rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmax.s'
class-attribute
instance-attribute
¶
FCvtWSOp
dataclass
¶
Bases: RdRsIntegerOperation[FloatRegisterType]
Convert a floating-point number in floating-point register rs1 to a signed 32-bit in integer register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fcvt.w.s'
class-attribute
instance-attribute
¶
FCvtWuSOp
dataclass
¶
Bases: RdRsIntegerOperation[FloatRegisterType]
Convert a floating-point number in floating-point register rs1 to a signed 32-bit in unsigned integer register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fcvt.wu.s'
class-attribute
instance-attribute
¶
FMvXWOp
dataclass
¶
Bases: RdRsIntegerOperation[FloatRegisterType]
Move the single-precision value in floating-point register rs1 represented in IEEE 754-2008 encoding to the lower 32 bits of integer register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmv.x.w'
class-attribute
instance-attribute
¶
FeqSOp
dataclass
¶
Bases: RdRsRsFloatFloatIntegerOperationWithFastMath
Performs a quiet equal comparison between floating-point registers rs1 and rs2 and record the Boolean result in integer register rd. Only signaling NaN inputs cause an Invalid Operation exception. The result is 0 if either operand is NaN.
x[rd] = f[rs1] == f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.feq.s'
class-attribute
instance-attribute
¶
FltSOp
dataclass
¶
Bases: RdRsRsFloatFloatIntegerOperationWithFastMath
Performs a quiet less comparison between floating-point registers rs1 and rs2 and record the Boolean result in integer register rd. Only signaling NaN inputs cause an Invalid Operation exception. The result is 0 if either operand is NaN.
x[rd] = f[rs1] < f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.flt.s'
class-attribute
instance-attribute
¶
FleSOp
dataclass
¶
Bases: RdRsRsFloatFloatIntegerOperationWithFastMath
Performs a quiet less or equal comparison between floating-point registers rs1 and rs2 and record the Boolean result in integer register rd. Only signaling NaN inputs cause an Invalid Operation exception. The result is 0 if either operand is NaN.
x[rd] = f[rs1] <= f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fle.s'
class-attribute
instance-attribute
¶
FClassSOp
dataclass
¶
Bases: RdRsIntegerOperation[FloatRegisterType]
Examines the value in floating-point register rs1 and writes to integer register rd a 10-bit mask that indicates the class of the floating-point number. The format of the mask is described in [classify table]_. The corresponding bit in rd will be set if the property is true and clear otherwise. All other bits in rd are cleared. Note that exactly one bit in rd will be set.
x[rd] = classifys(f[rs1])
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fclass.s'
class-attribute
instance-attribute
¶
FCvtSWOp
dataclass
¶
Bases: RdRsFloatOperation[IntRegisterType]
Converts a 32-bit signed integer, in integer register rs1 into a floating-point number in floating-point register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fcvt.s.w'
class-attribute
instance-attribute
¶
FCvtSWuOp
dataclass
¶
Bases: RdRsFloatOperation[IntRegisterType]
Converts a 32-bit unsigned integer, in integer register rs1 into a floating-point number in floating-point register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fcvt.s.wu'
class-attribute
instance-attribute
¶
FMvWXOp
dataclass
¶
Bases: RdRsFloatOperation[IntRegisterType]
Move the single-precision value encoded in IEEE 754-2008 standard encoding from the lower 32 bits of integer register rs1 to the floating-point register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fmv.w.x'
class-attribute
instance-attribute
¶
FLwOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FLwOp
dataclass
¶
Bases: RdRsImmFloatOperation
Load a single-precision value from memory into floating-point register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FSwOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FSwOp
dataclass
¶
Bases: RsRsImmFloatOperation
Store a single-precision value from floating-point register rs2 to memory.
M[x[rs1] + offset] = f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsw'
class-attribute
instance-attribute
¶
traits = traits_def(FSwOpHasCanonicalizationPatternTrait(), MemoryWriteEffect())
class-attribute
instance-attribute
¶
assembly_line() -> str | None
¶
Source code in xdsl/dialects/riscv/ops.py
FMAddDOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform double-precision fused multiply addition.
f[rd] = f[rs1]×f[rs2]+f[rs3]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FMSubDOp
dataclass
¶
Bases: RdRsRsRsFloatOperation
Perform double-precision fused multiply substraction.
f[rd] = f[rs1]×f[rs2]+f[rs3]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FuseMultiplyAddDCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FAddDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform double-precision floating-point addition.
f[rd] = f[rs1]+f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FSubDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform double-precision floating-point substraction.
f[rd] = f[rs1]-f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FMulDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform double-precision floating-point multiplication.
f[rd] = f[rs1]×f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FDivDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Perform double-precision floating-point division.
f[rd] = f[rs1] / f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fdiv.d'
class-attribute
instance-attribute
¶
FLdOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FMinDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Write the smaller of double precision data in rs1 and rs2 to rd.
f[rd] = min(f[rs1], f[rs2])
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FMaxDOp
dataclass
¶
Bases: RdRsRsFloatOperationWithFastMath
Write the larger of single precision data in rs1 and rs2 to rd.
f[rd] = max(f[rs1], f[rs2])
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FCvtDWOp
dataclass
¶
Bases: RdRsFloatOperation[IntRegisterType]
Converts a 32-bit signed integer, in integer register rs1 into a double-precision floating-point number in floating-point register rd.
x[rd] = sext(s32_{f64}(f[rs1]))
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FCvtDWuOp
dataclass
¶
Bases: RdRsFloatOperation[IntRegisterType]
Converts a 32-bit unsigned integer, in integer register rs1 into a double-precision floating-point number in floating-point register rd.
f[rd] = f64_{u32}(x[rs1])
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
FLdOp
dataclass
¶
Bases: RdRsImmFloatOperation
Load a double-precision value from memory into floating-point register rd.
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fld'
class-attribute
instance-attribute
¶
traits = traits_def(FLdOpHasCanonicalizationPatternTrait(), MemoryReadEffect())
class-attribute
instance-attribute
¶
assembly_line() -> str | None
¶
Source code in xdsl/dialects/riscv/ops.py
FSdOpHasCanonicalizationPatternTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FSdOp
dataclass
¶
Bases: RsRsImmFloatOperation
Store a double-precision value from floating-point register rs2 to memory.
M[x[rs1] + offset] = f[rs2]
See external documentation.
Source code in xdsl/dialects/riscv/ops.py
name = 'riscv.fsd'
class-attribute
instance-attribute
¶
traits = traits_def(FSdOpHasCanonicalizationPatternTrait(), MemoryWriteEffect())
class-attribute
instance-attribute
¶
assembly_line() -> str | None
¶
Source code in xdsl/dialects/riscv/ops.py
FMvDHasCanonicalizationPatternsTrait
dataclass
¶
Bases: HasCanonicalizationPatternsTrait
Source code in xdsl/dialects/riscv/ops.py
get_canonicalization_patterns() -> tuple[RewritePattern, ...]
classmethod
¶
FMvDOp
dataclass
¶
Bases: RdRsFloatOperation[FloatRegisterType]
A pseudo instruction to copy 64 bits of one float register to another.
Equivalent to fsgnj.d rd, rs, rs.
Source code in xdsl/dialects/riscv/ops.py
VFAddSOp
dataclass
¶
Bases: RdRsRsFloatOperation[FloatRegisterType, FloatRegisterType]
Perform a pointwise single-precision floating-point addition over vectors.
If the registers used are FloatRegisterType, they must be 64-bit wide, and contain two 32-bit single-precision floating point values.
Source code in xdsl/dialects/riscv/ops.py
VFMulSOp
dataclass
¶
Bases: RdRsRsFloatOperation[FloatRegisterType, FloatRegisterType]
Perform a pointwise single-precision floating-point multiplication over vectors.
If the registers used are FloatRegisterType, they must be 64-bit wide, and contain two 32-bit single-precision floating point values.