diff options
Diffstat (limited to 'deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h')
-rw-r--r-- | deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h b/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h index 6e2bacc043..211cf82398 100644 --- a/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h +++ b/deps/v8/src/wasm/baseline/arm/liftoff-assembler-arm.h @@ -4262,14 +4262,34 @@ void LiftoffAssembler::MaybeOSR() {} void LiftoffAssembler::emit_set_if_nan(Register dst, DoubleRegister src, ValueKind kind) { - UNIMPLEMENTED(); + if (kind == kF32) { + FloatRegister src_f = liftoff::GetFloatRegister(src); + VFPCompareAndSetFlags(src_f, src_f); + } else { + DCHECK_EQ(kind, kF64); + VFPCompareAndSetFlags(src, src); + } + + // Store a non-zero value if src is NaN. + str(dst, MemOperand(dst), ne); // x != x iff isnan(x) } -void LiftoffAssembler::emit_s128_set_if_nan(Register dst, DoubleRegister src, +void LiftoffAssembler::emit_s128_set_if_nan(Register dst, LiftoffRegister src, Register tmp_gp, - DoubleRegister tmp_fp, + LiftoffRegister tmp_s128, ValueKind lane_kind) { - UNIMPLEMENTED(); + QwNeonRegister src_q = liftoff::GetSimd128Register(src); + QwNeonRegister tmp_q = liftoff::GetSimd128Register(tmp_s128); + if (lane_kind == kF32) { + vpadd(tmp_q.low(), src_q.low(), src_q.high()); + LowDwVfpRegister tmp_d = + LowDwVfpRegister::from_code(tmp_s128.low_fp().code()); + vadd(tmp_d.low(), tmp_d.low(), tmp_d.high()); + } else { + DCHECK_EQ(lane_kind, kF64); + vadd(tmp_q.low(), src_q.low(), src_q.high()); + } + emit_set_if_nan(dst, tmp_q.low(), lane_kind); } void LiftoffStackSlots::Construct(int param_slots) { |