pub trait EmitterRiscv {
Show 55 methods
// Required methods
fn emit_jmp_on_condition(
&mut self,
cond: Condition,
loc_a: Location<GPR, FPR>,
loc_b: Location<GPR, FPR>,
label: DynamicLabel,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_reserved_sd(
&mut self,
size: Size,
dest: GPR,
addr: GPR,
source: GPR,
) -> Result<(), CompileError>;
fn get_simd_arch(&self) -> Option<&CpuFeature>;
fn get_label(&mut self) -> DynamicLabel;
fn get_offset(&self) -> AssemblyOffset;
fn get_jmp_instr_size(&self) -> u8;
fn finalize_function(&mut self) -> Result<(), CompileError>;
fn emit_label(&mut self, label: DynamicLabel) -> Result<(), CompileError>;
fn emit_brk(&mut self) -> Result<(), CompileError>;
fn emit_ld(
&mut self,
sz: Size,
signed: bool,
reg: Location<GPR, FPR>,
addr: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_sd(
&mut self,
sz: Size,
reg: Location<GPR, FPR>,
addr: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_push(
&mut self,
size: Size,
src: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_pop(
&mut self,
size: Size,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_add(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_sub(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_mul(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_sdiv(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_udiv(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_srem(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_urem(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_and(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_or(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_xor(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_sll(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_srl(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_sra(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_extend(
&mut self,
sz: Size,
signed: bool,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_not(
&mut self,
sz: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_neg(
&mut self,
sz: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_mov(
&mut self,
sz: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_ret(&mut self) -> Result<(), CompileError>;
fn emit_udf(&mut self, payload: u8) -> Result<(), CompileError>;
fn emit_mov_imm(
&mut self,
dst: Location<GPR, FPR>,
val: i64,
) -> Result<(), CompileError>;
fn emit_fneg(
&mut self,
sz: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fmin(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fmax(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fdiv(
&mut self,
sz: Size,
src1: Location<GPR, FPR>,
src2: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fsqrt(
&mut self,
sz: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fcvt(
&mut self,
signed: bool,
sz_in: Size,
src: Location<GPR, FPR>,
sz_out: Size,
dst: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fcvt_with_rounding(
&mut self,
rounding: RoundingMode,
size: Size,
src: Location<GPR, FPR>,
dst: Location<GPR, FPR>,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_swap_fscr(&mut self, reg: GPR) -> Result<(), CompileError>;
fn emit_cmp(
&mut self,
c: Condition,
loc_a: Location<GPR, FPR>,
loc_b: Location<GPR, FPR>,
ret: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_fcmp(
&mut self,
c: Condition,
size: Size,
loc_a: Location<GPR, FPR>,
loc_b: Location<GPR, FPR>,
ret: Location<GPR, FPR>,
) -> Result<(), CompileError>;
fn emit_on_false_label(
&mut self,
cond: Location<GPR, FPR>,
label: DynamicLabel,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_on_false_label_far(
&mut self,
cond: Location<GPR, FPR>,
label: DynamicLabel,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_on_true_label_far(
&mut self,
cond: Location<GPR, FPR>,
label: DynamicLabel,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_on_true_label(
&mut self,
cond: Location<GPR, FPR>,
label: DynamicLabel,
tmp: GPR,
) -> Result<(), CompileError>;
fn emit_j_label(
&mut self,
label: DynamicLabel,
reg: Option<GPR>,
) -> Result<(), CompileError>;
fn emit_j_register(&mut self, reg: GPR) -> Result<(), CompileError>;
fn emit_load_label(
&mut self,
reg: GPR,
label: DynamicLabel,
) -> Result<(), CompileError>;
fn emit_call_label(
&mut self,
label: DynamicLabel,
) -> Result<(), CompileError>;
fn emit_call_register(&mut self, reg: GPR) -> Result<(), CompileError>;
fn emit_rwfence(&mut self) -> Result<(), CompileError>;
fn emit_atomic_binop(
&mut self,
op: AtomicBinaryOp,
size: Size,
dest: GPR,
addr: GPR,
source: GPR,
) -> Result<(), CompileError>;
fn emit_reserved_ld(
&mut self,
size: Size,
reg: GPR,
addr: GPR,
) -> Result<(), CompileError>;
}Expand description
Emitter trait for RISC-V.
Required Methods§
fn emit_jmp_on_condition( &mut self, cond: Condition, loc_a: Location<GPR, FPR>, loc_b: Location<GPR, FPR>, label: DynamicLabel, tmp: GPR, ) -> Result<(), CompileError>
fn emit_reserved_sd( &mut self, size: Size, dest: GPR, addr: GPR, source: GPR, ) -> Result<(), CompileError>
Sourcefn get_simd_arch(&self) -> Option<&CpuFeature>
fn get_simd_arch(&self) -> Option<&CpuFeature>
Returns the SIMD (FPU) feature if available.
Sourcefn get_offset(&self) -> AssemblyOffset
fn get_offset(&self) -> AssemblyOffset
Gets the current code offset.
Sourcefn get_jmp_instr_size(&self) -> u8
fn get_jmp_instr_size(&self) -> u8
Returns the size of a jump instruction in bytes.
Sourcefn finalize_function(&mut self) -> Result<(), CompileError>
fn finalize_function(&mut self) -> Result<(), CompileError>
Finalize the function, e.g., resolve labels.