Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit 72f8278

Browse files
committed
rv64: implement intrinsic for float_srt
1 parent 355ec50 commit 72f8278

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

dora/src/masm/rv64.rs

+35-1
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,41 @@ impl MacroAssembler {
541541

542542
pub fn float_cmp_nan(&mut self, mode: MachineMode, dest: Reg, src: FReg) {}
543543

544-
pub fn float_srt(&mut self, _mode: MachineMode, _dest: Reg, _lhs: FReg, _rhs: FReg) {}
544+
pub fn float_srt(&mut self, mode: MachineMode, dest: Reg, lhs: FReg, rhs: FReg) {
545+
match mode {
546+
MachineMode::Float64 => {
547+
self.asm.fmv_x_d(R10.into(), lhs.into());
548+
self.asm.fmv_x_d(R11.into(), rhs.into());
549+
self.asm.srai(R12.into(), R10.into(), 63);
550+
self.asm.srli(R12.into(), R12.into(), 1);
551+
self.asm.xor(R10.into(), R10.into(), R12.into());
552+
self.asm.srai(R12.into(), R11.into(), 63);
553+
self.asm.srli(R12.into(), R12.into(), 1);
554+
self.asm.xor(R11.into(), R11.into(), R12.into());
555+
self.asm.slt(R12.into(), R10.into(), R11.into());
556+
self.asm.xor(R10.into(), R10.into(), R11.into());
557+
self.asm.snez(R10.into(), R10.into());
558+
self.asm.neg(R11.into(), R12.into());
559+
self.asm.or(dest.into(), R10.into(), R11.into())
560+
}
561+
MachineMode::Float32 => {
562+
self.asm.fmv_x_w(R10.into(), lhs.into());
563+
self.asm.fmv_x_w(R11.into(), rhs.into());
564+
self.asm.sraiw(R12.into(), R10.into(), 31);
565+
self.asm.srliw(R12.into(), R12.into(), 1);
566+
self.asm.xor(R10.into(), R10.into(), R12.into());
567+
self.asm.sraiw(R12.into(), R11.into(), 31);
568+
self.asm.srliw(R12.into(), R12.into(), 1);
569+
self.asm.xor(R11.into(), R11.into(), R12.into());
570+
self.asm.slt(R12.into(), R10.into(), R11.into());
571+
self.asm.xor(R10.into(), R10.into(), R11.into());
572+
self.asm.snez(R10.into(), R10.into());
573+
self.asm.neg(R11.into(), R12.into());
574+
self.asm.or(dest.into(), R10.into(), R11.into())
575+
}
576+
_ => unreachable!(),
577+
}
578+
}
545579

546580
pub fn load_float_const(&mut self, mode: MachineMode, dest: FReg, imm: f64) {}
547581

0 commit comments

Comments
 (0)