Skip to content

Commit a54c310

Browse files
committed
pulley: Get f{32,64}_bitwise.wast tests working
Fill out some more misc float ops. cc bytecodealliance#9783
1 parent 4ae6140 commit a54c310

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

Diff for: cranelift/codegen/src/isa/pulley_shared/lower.isle

+15
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,18 @@
645645

646646
(rule (lower (has_type $F32 (sqrt a))) (pulley_fsqrt32 a))
647647
(rule (lower (has_type $F64 (sqrt a))) (pulley_fsqrt64 a))
648+
649+
;;;; Rules for `fcopysign` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650+
651+
(rule (lower (has_type $F32 (fcopysign a b))) (pulley_fcopysign32 a b))
652+
(rule (lower (has_type $F64 (fcopysign a b))) (pulley_fcopysign64 a b))
653+
654+
;;;; Rules for `fneg` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
655+
656+
(rule (lower (has_type $F32 (fneg a))) (pulley_fneg32 a))
657+
(rule (lower (has_type $F64 (fneg a))) (pulley_fneg64 a))
658+
659+
;;;; Rules for `fabs` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
660+
661+
(rule (lower (has_type $F32 (fabs a))) (pulley_fabs32 a))
662+
(rule (lower (has_type $F64 (fabs a))) (pulley_fabs64 a))

Diff for: crates/wast-util/src/lib.rs

-5
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,6 @@ impl WastTest {
400400
"misc_testsuite/embenchen_ifs.wast",
401401
"misc_testsuite/embenchen_primes.wast",
402402
"misc_testsuite/int-to-float-splat.wast",
403-
"misc_testsuite/issue4890.wast",
404403
"misc_testsuite/issue6562.wast",
405404
"misc_testsuite/memory-combos.wast",
406405
"misc_testsuite/memory64/simd.wast",
@@ -429,10 +428,6 @@ impl WastTest {
429428
"misc_testsuite/winch/_simd_load.wast",
430429
"misc_testsuite/winch/_simd_multivalue.wast",
431430
"misc_testsuite/winch/_simd_store.wast",
432-
"spec_testsuite/f32_bitwise.wast",
433-
"spec_testsuite/f64_bitwise.wast",
434-
"spec_testsuite/float_exprs.wast",
435-
"spec_testsuite/float_misc.wast",
436431
"spec_testsuite/proposals/annotations/simd_lane.wast",
437432
"spec_testsuite/proposals/multi-memory/simd_memory-multi.wast",
438433
"spec_testsuite/proposals/relaxed-simd/i16x8_relaxed_q15mulr_s.wast",

Diff for: pulley/src/interp.rs

+38
Original file line numberDiff line numberDiff line change
@@ -2203,6 +2203,13 @@ impl OpVisitor for Interpreter<'_> {
22032203
ControlFlow::Continue(())
22042204
}
22052205

2206+
fn fcopysign32(&mut self, operands: BinaryOperands<FReg>) -> ControlFlow<Done> {
2207+
let a = self.state[operands.src1].get_f32();
2208+
let b = self.state[operands.src2].get_f32();
2209+
self.state[operands.dst].set_f32(a.copysign(b));
2210+
ControlFlow::Continue(())
2211+
}
2212+
22062213
fn ftrunc32(&mut self, dst: FReg, src: FReg) -> ControlFlow<Done> {
22072214
let a = self.state[src].get_f32();
22082215
self.state[dst].set_f32(a.trunc());
@@ -2233,6 +2240,18 @@ impl OpVisitor for Interpreter<'_> {
22332240
ControlFlow::Continue(())
22342241
}
22352242

2243+
fn fneg32(&mut self, dst: FReg, src: FReg) -> ControlFlow<Done> {
2244+
let a = self.state[src].get_f32();
2245+
self.state[dst].set_f32(-a);
2246+
ControlFlow::Continue(())
2247+
}
2248+
2249+
fn fabs32(&mut self, dst: FReg, src: FReg) -> ControlFlow<Done> {
2250+
let a = self.state[src].get_f32();
2251+
self.state[dst].set_f32(a.abs());
2252+
ControlFlow::Continue(())
2253+
}
2254+
22362255
fn fadd64(&mut self, operands: BinaryOperands<FReg>) -> ControlFlow<Done> {
22372256
let a = self.state[operands.src1].get_f64();
22382257
let b = self.state[operands.src2].get_f64();
@@ -2334,6 +2353,25 @@ impl OpVisitor for Interpreter<'_> {
23342353
self.state[dst].set_f64(a.sqrt());
23352354
ControlFlow::Continue(())
23362355
}
2356+
2357+
fn fcopysign64(&mut self, operands: BinaryOperands<FReg>) -> ControlFlow<Done> {
2358+
let a = self.state[operands.src1].get_f64();
2359+
let b = self.state[operands.src2].get_f64();
2360+
self.state[operands.dst].set_f64(a.copysign(b));
2361+
ControlFlow::Continue(())
2362+
}
2363+
2364+
fn fneg64(&mut self, dst: FReg, src: FReg) -> ControlFlow<Done> {
2365+
let a = self.state[src].get_f64();
2366+
self.state[dst].set_f64(-a);
2367+
ControlFlow::Continue(())
2368+
}
2369+
2370+
fn fabs64(&mut self, dst: FReg, src: FReg) -> ControlFlow<Done> {
2371+
let a = self.state[src].get_f64();
2372+
self.state[dst].set_f64(a.abs());
2373+
ControlFlow::Continue(())
2374+
}
23372375
}
23382376

23392377
impl ExtendedOpVisitor for Interpreter<'_> {

Diff for: pulley/src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,12 @@ macro_rules! for_each_op {
500500
fnearest32 = Fnearest32 { dst: FReg, src: FReg };
501501
/// `low32(dst) = ieee_sqrt(low32(src))`
502502
fsqrt32 = Fsqrt32 { dst: FReg, src: FReg };
503+
/// `low32(dst) = ieee_copysign(low32(src1), low32(src2))`
504+
fcopysign32 = Fcopysign32 { operands: BinaryOperands<FReg> };
505+
/// `low32(dst) = -low32(src)`
506+
fneg32 = Fneg32 { dst: FReg, src: FReg };
507+
/// `low32(dst) = |low32(src)|`
508+
fabs32 = Fabs32 { dst: FReg, src: FReg };
503509

504510
/// `dst = src1 + src2`
505511
fadd64 = Fadd64 { operands: BinaryOperands<FReg> };
@@ -523,6 +529,12 @@ macro_rules! for_each_op {
523529
fnearest64 = Fnearest64 { dst: FReg, src: FReg };
524530
/// `dst = ieee_sqrt(src)`
525531
fsqrt64 = Fsqrt64 { dst: FReg, src: FReg };
532+
/// `dst = ieee_copysign(src1, src2)`
533+
fcopysign64 = Fcopysign64 { operands: BinaryOperands<FReg> };
534+
/// `dst = -src`
535+
fneg64 = Fneg64 { dst: FReg, src: FReg };
536+
/// `dst = |src|`
537+
fabs64 = Fabs64 { dst: FReg, src: FReg };
526538
}
527539
};
528540
}

0 commit comments

Comments
 (0)