[Liftoff] Implement f32.abs and f64.abs
This adds support for the f32.abs and f64.abs opcodes. R=titzer@chromium.org Bug: v8:6600 Change-Id: I05a16bb4301d492ba8d22a6326c7b2ce0f9f2faa Reviewed-on: https://chromium-review.googlesource.com/968502 Reviewed-by: Ben Titzer <titzer@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#52051}
This commit is contained in:
parent
25259d3ffc
commit
014f459047
@ -2372,7 +2372,7 @@ void Assembler::haddps(XMMRegister dst, Operand src) {
|
||||
emit_sse_operand(dst, src);
|
||||
}
|
||||
|
||||
void Assembler::andpd(XMMRegister dst, XMMRegister src) {
|
||||
void Assembler::andpd(XMMRegister dst, Operand src) {
|
||||
EnsureSpace ensure_space(this);
|
||||
EMIT(0x66);
|
||||
EMIT(0x0F);
|
||||
@ -2380,8 +2380,7 @@ void Assembler::andpd(XMMRegister dst, XMMRegister src) {
|
||||
emit_sse_operand(dst, src);
|
||||
}
|
||||
|
||||
|
||||
void Assembler::orpd(XMMRegister dst, XMMRegister src) {
|
||||
void Assembler::orpd(XMMRegister dst, Operand src) {
|
||||
EnsureSpace ensure_space(this);
|
||||
EMIT(0x66);
|
||||
EMIT(0x0F);
|
||||
|
@ -1063,8 +1063,10 @@ class Assembler : public AssemblerBase {
|
||||
void sqrtsd(XMMRegister dst, XMMRegister src) { sqrtsd(dst, Operand(src)); }
|
||||
void sqrtsd(XMMRegister dst, Operand src);
|
||||
|
||||
void andpd(XMMRegister dst, XMMRegister src);
|
||||
void orpd(XMMRegister dst, XMMRegister src);
|
||||
void andpd(XMMRegister dst, XMMRegister src) { andpd(dst, Operand(src)); }
|
||||
void andpd(XMMRegister dst, Operand src);
|
||||
void orpd(XMMRegister dst, XMMRegister src) { orpd(dst, Operand(src)); }
|
||||
void orpd(XMMRegister dst, Operand src);
|
||||
|
||||
void ucomisd(XMMRegister dst, XMMRegister src) { ucomisd(dst, Operand(src)); }
|
||||
void ucomisd(XMMRegister dst, Operand src);
|
||||
|
@ -251,6 +251,8 @@ class TurboAssembler : public Assembler {
|
||||
AVX_OP3_XO(Psubw, psubw)
|
||||
AVX_OP3_XO(Psubd, psubd)
|
||||
AVX_OP3_XO(Pxor, pxor)
|
||||
AVX_OP3_XO(Andps, andps)
|
||||
AVX_OP3_XO(Andpd, andpd)
|
||||
AVX_OP3_XO(Xorps, xorps)
|
||||
AVX_OP3_XO(Xorpd, xorpd)
|
||||
AVX_OP3_XO(Sqrtss, sqrtss)
|
||||
|
@ -148,12 +148,14 @@ UNIMPLEMENTED_FP_BINOP(f32_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -148,12 +148,14 @@ UNIMPLEMENTED_FP_BINOP(f32_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -679,6 +679,17 @@ void LiftoffAssembler::emit_f32_div(DoubleRegister dst, DoubleRegister lhs,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_abs(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint32_t kSignBit = uint32_t{1} << 31;
|
||||
if (dst == src) {
|
||||
TurboAssembler::Move(kScratchDoubleReg, kSignBit - 1);
|
||||
Andps(dst, kScratchDoubleReg);
|
||||
} else {
|
||||
TurboAssembler::Move(dst, kSignBit - 1);
|
||||
Andps(dst, src);
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_neg(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint32_t kSignBit = uint32_t{1} << 31;
|
||||
if (dst == src) {
|
||||
@ -750,6 +761,17 @@ void LiftoffAssembler::emit_f64_div(DoubleRegister dst, DoubleRegister lhs,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_abs(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint64_t kSignBit = uint64_t{1} << 63;
|
||||
if (dst == src) {
|
||||
TurboAssembler::Move(kScratchDoubleReg, kSignBit - 1);
|
||||
Andpd(dst, kScratchDoubleReg);
|
||||
} else {
|
||||
TurboAssembler::Move(dst, kSignBit - 1);
|
||||
Andpd(dst, src);
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_neg(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint64_t kSignBit = uint64_t{1} << 63;
|
||||
if (dst == src) {
|
||||
|
@ -402,6 +402,7 @@ class LiftoffAssembler : public TurboAssembler {
|
||||
inline void emit_f32_div(DoubleRegister dst, DoubleRegister lhs,
|
||||
DoubleRegister rhs);
|
||||
// f32 unops.
|
||||
inline void emit_f32_abs(DoubleRegister dst, DoubleRegister src);
|
||||
inline void emit_f32_neg(DoubleRegister dst, DoubleRegister src);
|
||||
inline void emit_f32_sqrt(DoubleRegister dst, DoubleRegister src);
|
||||
|
||||
@ -416,6 +417,7 @@ class LiftoffAssembler : public TurboAssembler {
|
||||
DoubleRegister rhs);
|
||||
|
||||
// f64 unops.
|
||||
inline void emit_f64_abs(DoubleRegister dst, DoubleRegister src);
|
||||
inline void emit_f64_neg(DoubleRegister dst, DoubleRegister src);
|
||||
inline void emit_f64_sqrt(DoubleRegister dst, DoubleRegister src);
|
||||
|
||||
|
@ -622,8 +622,10 @@ class LiftoffCompiler {
|
||||
__ emit_i32_set_cond(kEqual, dst.gp(), src.gp());
|
||||
});
|
||||
break;
|
||||
CASE_FLOAT_UNOP(F32Abs, F32, f32_abs)
|
||||
CASE_FLOAT_UNOP(F32Neg, F32, f32_neg)
|
||||
CASE_FLOAT_UNOP(F32Sqrt, F32, f32_sqrt)
|
||||
CASE_FLOAT_UNOP(F64Abs, F64, f64_abs)
|
||||
CASE_FLOAT_UNOP(F64Neg, F64, f64_neg)
|
||||
CASE_FLOAT_UNOP(F64Sqrt, F64, f64_sqrt)
|
||||
CASE_TYPE_CONVERSION(I32ConvertI64, I32, I64, nullptr)
|
||||
|
@ -467,12 +467,14 @@ FP_BINOP(f32_add, add_s)
|
||||
FP_BINOP(f32_sub, sub_s)
|
||||
FP_BINOP(f32_mul, mul_s)
|
||||
FP_BINOP(f32_div, div_s)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
FP_BINOP(f64_add, add_d)
|
||||
FP_BINOP(f64_sub, sub_d)
|
||||
FP_BINOP(f64_mul, mul_d)
|
||||
FP_BINOP(f64_div, div_d)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -414,12 +414,14 @@ FP_BINOP(f32_add, add_s)
|
||||
FP_BINOP(f32_sub, sub_s)
|
||||
FP_BINOP(f32_mul, mul_s)
|
||||
FP_BINOP(f32_div, div_s)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
FP_BINOP(f64_add, add_d)
|
||||
FP_BINOP(f64_sub, sub_d)
|
||||
FP_BINOP(f64_mul, mul_d)
|
||||
FP_BINOP(f64_div, div_d)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -148,12 +148,14 @@ UNIMPLEMENTED_FP_BINOP(f32_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -148,12 +148,14 @@ UNIMPLEMENTED_FP_BINOP(f32_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f32_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f32_sqrt)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_add)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_sub)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_mul)
|
||||
UNIMPLEMENTED_FP_BINOP(f64_div)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_abs)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_neg)
|
||||
UNIMPLEMENTED_FP_UNOP(f64_sqrt)
|
||||
|
||||
|
@ -580,6 +580,17 @@ void LiftoffAssembler::emit_f32_div(DoubleRegister dst, DoubleRegister lhs,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_abs(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint32_t kSignBit = uint32_t{1} << 31;
|
||||
if (dst == src) {
|
||||
TurboAssembler::Move(kScratchDoubleReg, kSignBit - 1);
|
||||
Andps(dst, kScratchDoubleReg);
|
||||
} else {
|
||||
TurboAssembler::Move(dst, kSignBit - 1);
|
||||
Andps(dst, src);
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f32_neg(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint32_t kSignBit = uint32_t{1} << 31;
|
||||
if (dst == src) {
|
||||
@ -651,6 +662,17 @@ void LiftoffAssembler::emit_f64_div(DoubleRegister dst, DoubleRegister lhs,
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_abs(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint64_t kSignBit = uint64_t{1} << 63;
|
||||
if (dst == src) {
|
||||
TurboAssembler::Move(kScratchDoubleReg, kSignBit - 1);
|
||||
Andpd(dst, kScratchDoubleReg);
|
||||
} else {
|
||||
TurboAssembler::Move(dst, kSignBit - 1);
|
||||
Andpd(dst, src);
|
||||
}
|
||||
}
|
||||
|
||||
void LiftoffAssembler::emit_f64_neg(DoubleRegister dst, DoubleRegister src) {
|
||||
static constexpr uint64_t kSignBit = uint64_t{1} << 63;
|
||||
if (dst == src) {
|
||||
|
Loading…
Reference in New Issue
Block a user