Index: src/arm64/macro-assembler-arm64-inl.h |
diff --git a/src/arm64/macro-assembler-arm64-inl.h b/src/arm64/macro-assembler-arm64-inl.h |
index e2fbc8f4af9bcf1b1d1879c3054a32bef5c9d8ca..26de056d6f37549663f3db1a5a801d6287ec1fe6 100644 |
--- a/src/arm64/macro-assembler-arm64-inl.h |
+++ b/src/arm64/macro-assembler-arm64-inl.h |
@@ -547,42 +547,34 @@ void MacroAssembler::Extr(const Register& rd, |
extr(rd, rn, rm, lsb); |
} |
- |
-void MacroAssembler::Fabs(const FPRegister& fd, const FPRegister& fn) { |
+void MacroAssembler::Fabs(const VRegister& fd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
fabs(fd, fn); |
} |
- |
-void MacroAssembler::Fadd(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fadd(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fadd(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fccmp(const FPRegister& fn, |
- const FPRegister& fm, |
- StatusFlags nzcv, |
- Condition cond) { |
+void MacroAssembler::Fccmp(const VRegister& fn, const VRegister& fm, |
+ StatusFlags nzcv, Condition cond) { |
DCHECK(allow_macro_instructions_); |
DCHECK((cond != al) && (cond != nv)); |
fccmp(fn, fm, nzcv, cond); |
} |
- |
-void MacroAssembler::Fcmp(const FPRegister& fn, const FPRegister& fm) { |
+void MacroAssembler::Fcmp(const VRegister& fn, const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fcmp(fn, fm); |
} |
- |
-void MacroAssembler::Fcmp(const FPRegister& fn, double value) { |
+void MacroAssembler::Fcmp(const VRegister& fn, double value) { |
DCHECK(allow_macro_instructions_); |
if (value != 0.0) { |
UseScratchRegisterScope temps(this); |
- FPRegister tmp = temps.AcquireSameSizeAs(fn); |
+ VRegister tmp = temps.AcquireSameSizeAs(fn); |
Fmov(tmp, value); |
fcmp(fn, tmp); |
} else { |
@@ -590,271 +582,204 @@ void MacroAssembler::Fcmp(const FPRegister& fn, double value) { |
} |
} |
- |
-void MacroAssembler::Fcsel(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm, |
- Condition cond) { |
+void MacroAssembler::Fcsel(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm, Condition cond) { |
DCHECK(allow_macro_instructions_); |
DCHECK((cond != al) && (cond != nv)); |
fcsel(fd, fn, fm, cond); |
} |
- |
-void MacroAssembler::Fcvt(const FPRegister& fd, const FPRegister& fn) { |
+void MacroAssembler::Fcvt(const VRegister& fd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
fcvt(fd, fn); |
} |
- |
-void MacroAssembler::Fcvtas(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtas(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtas(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtau(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtau(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtau(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtms(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtms(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtms(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtmu(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtmu(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtmu(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtns(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtns(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtns(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtnu(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtnu(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtnu(rd, fn); |
} |
- |
-void MacroAssembler::Fcvtzs(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtzs(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtzs(rd, fn); |
} |
-void MacroAssembler::Fcvtzu(const Register& rd, const FPRegister& fn) { |
+void MacroAssembler::Fcvtzu(const Register& rd, const VRegister& fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fcvtzu(rd, fn); |
} |
- |
-void MacroAssembler::Fdiv(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fdiv(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fdiv(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fmadd(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm, |
- const FPRegister& fa) { |
+void MacroAssembler::Fmadd(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm, const VRegister& fa) { |
DCHECK(allow_macro_instructions_); |
fmadd(fd, fn, fm, fa); |
} |
- |
-void MacroAssembler::Fmax(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fmax(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fmax(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fmaxnm(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fmaxnm(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fmaxnm(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fmin(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fmin(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fmin(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fminnm(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fminnm(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fminnm(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fmov(FPRegister fd, FPRegister fn) { |
+void MacroAssembler::Fmov(VRegister fd, VRegister fn) { |
DCHECK(allow_macro_instructions_); |
// Only emit an instruction if fd and fn are different, and they are both D |
// registers. fmov(s0, s0) is not a no-op because it clears the top word of |
// d0. Technically, fmov(d0, d0) is not a no-op either because it clears the |
- // top of q0, but FPRegister does not currently support Q registers. |
+ // top of q0, but VRegister does not currently support Q registers. |
if (!fd.Is(fn) || !fd.Is64Bits()) { |
fmov(fd, fn); |
} |
} |
- |
-void MacroAssembler::Fmov(FPRegister fd, Register rn) { |
+void MacroAssembler::Fmov(VRegister fd, Register rn) { |
DCHECK(allow_macro_instructions_); |
fmov(fd, rn); |
} |
- |
-void MacroAssembler::Fmov(FPRegister fd, double imm) { |
+void MacroAssembler::Fmov(VRegister vd, double imm) { |
DCHECK(allow_macro_instructions_); |
- if (fd.Is32Bits()) { |
- Fmov(fd, static_cast<float>(imm)); |
+ |
+ if (vd.Is1S() || vd.Is2S() || vd.Is4S()) { |
+ Fmov(vd, static_cast<float>(imm)); |
return; |
} |
- DCHECK(fd.Is64Bits()); |
+ DCHECK(vd.Is1D() || vd.Is2D()); |
if (IsImmFP64(imm)) { |
- fmov(fd, imm); |
- } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) { |
- fmov(fd, xzr); |
+ fmov(vd, imm); |
} else { |
- Ldr(fd, imm); |
+ uint64_t bits = bit_cast<uint64_t>(imm); |
+ if (vd.IsScalar()) { |
+ if (bits == 0) { |
+ fmov(vd, xzr); |
+ } else { |
+ Ldr(vd, imm); |
+ } |
+ } else { |
+ // TODO(all): consider NEON support for load literal. |
+ Movi(vd, bits); |
+ } |
} |
} |
- |
-void MacroAssembler::Fmov(FPRegister fd, float imm) { |
+void MacroAssembler::Fmov(VRegister vd, float imm) { |
DCHECK(allow_macro_instructions_); |
- if (fd.Is64Bits()) { |
- Fmov(fd, static_cast<double>(imm)); |
+ if (vd.Is1D() || vd.Is2D()) { |
+ Fmov(vd, static_cast<double>(imm)); |
return; |
} |
- DCHECK(fd.Is32Bits()); |
+ DCHECK(vd.Is1S() || vd.Is2S() || vd.Is4S()); |
if (IsImmFP32(imm)) { |
- fmov(fd, imm); |
- } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) { |
- fmov(fd, wzr); |
+ fmov(vd, imm); |
} else { |
- UseScratchRegisterScope temps(this); |
- Register tmp = temps.AcquireW(); |
- // TODO(all): Use Assembler::ldr(const FPRegister& ft, float imm). |
- Mov(tmp, float_to_rawbits(imm)); |
- Fmov(fd, tmp); |
+ uint32_t bits = bit_cast<uint32_t>(imm); |
+ if (vd.IsScalar()) { |
+ if (bits == 0) { |
+ fmov(vd, wzr); |
+ } else { |
+ UseScratchRegisterScope temps(this); |
+ Register tmp = temps.AcquireW(); |
+ // TODO(all): Use Assembler::ldr(const VRegister& ft, float imm). |
+ Mov(tmp, bit_cast<uint32_t>(imm)); |
+ Fmov(vd, tmp); |
+ } |
+ } else { |
+ // TODO(all): consider NEON support for load literal. |
+ Movi(vd, bits); |
+ } |
} |
} |
- |
-void MacroAssembler::Fmov(Register rd, FPRegister fn) { |
+void MacroAssembler::Fmov(Register rd, VRegister fn) { |
DCHECK(allow_macro_instructions_); |
DCHECK(!rd.IsZero()); |
fmov(rd, fn); |
} |
- |
-void MacroAssembler::Fmsub(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm, |
- const FPRegister& fa) { |
+void MacroAssembler::Fmsub(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm, const VRegister& fa) { |
DCHECK(allow_macro_instructions_); |
fmsub(fd, fn, fm, fa); |
} |
- |
-void MacroAssembler::Fmul(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fmul(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fmul(fd, fn, fm); |
} |
- |
-void MacroAssembler::Fneg(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- fneg(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Fnmadd(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm, |
- const FPRegister& fa) { |
+void MacroAssembler::Fnmadd(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm, const VRegister& fa) { |
DCHECK(allow_macro_instructions_); |
fnmadd(fd, fn, fm, fa); |
} |
- |
-void MacroAssembler::Fnmsub(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm, |
- const FPRegister& fa) { |
+void MacroAssembler::Fnmsub(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm, const VRegister& fa) { |
DCHECK(allow_macro_instructions_); |
fnmsub(fd, fn, fm, fa); |
} |
- |
-void MacroAssembler::Frinta(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- frinta(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Frintm(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- frintm(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Frintn(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- frintn(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Frintp(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- frintp(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Frintz(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- frintz(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Fsqrt(const FPRegister& fd, const FPRegister& fn) { |
- DCHECK(allow_macro_instructions_); |
- fsqrt(fd, fn); |
-} |
- |
- |
-void MacroAssembler::Fsub(const FPRegister& fd, |
- const FPRegister& fn, |
- const FPRegister& fm) { |
+void MacroAssembler::Fsub(const VRegister& fd, const VRegister& fn, |
+ const VRegister& fm) { |
DCHECK(allow_macro_instructions_); |
fsub(fd, fn, fm); |
} |
@@ -887,7 +812,7 @@ void MacroAssembler::Ldr(const CPURegister& rt, const Immediate& imm) { |
void MacroAssembler::Ldr(const CPURegister& rt, double imm) { |
DCHECK(allow_macro_instructions_); |
DCHECK(rt.Is64Bits()); |
- ldr(rt, Immediate(double_to_rawbits(imm))); |
+ ldr(rt, Immediate(bit_cast<uint64_t>(imm))); |
} |
@@ -1070,9 +995,7 @@ void MacroAssembler::Sbfx(const Register& rd, |
sbfx(rd, rn, lsb, width); |
} |
- |
-void MacroAssembler::Scvtf(const FPRegister& fd, |
- const Register& rn, |
+void MacroAssembler::Scvtf(const VRegister& fd, const Register& rn, |
unsigned fbits) { |
DCHECK(allow_macro_instructions_); |
scvtf(fd, rn, fbits); |
@@ -1174,9 +1097,7 @@ void MacroAssembler::Ubfx(const Register& rd, |
ubfx(rd, rn, lsb, width); |
} |
- |
-void MacroAssembler::Ucvtf(const FPRegister& fd, |
- const Register& rn, |
+void MacroAssembler::Ucvtf(const VRegister& fd, const Register& rn, |
unsigned fbits) { |
DCHECK(allow_macro_instructions_); |
ucvtf(fd, rn, fbits); |
@@ -1318,9 +1239,7 @@ void MacroAssembler::SmiUntag(Register dst, Register src) { |
void MacroAssembler::SmiUntag(Register smi) { SmiUntag(smi, smi); } |
- |
-void MacroAssembler::SmiUntagToDouble(FPRegister dst, |
- Register src, |
+void MacroAssembler::SmiUntagToDouble(VRegister dst, Register src, |
UntagMode mode) { |
DCHECK(dst.Is64Bits() && src.Is64Bits()); |
if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) { |
@@ -1329,9 +1248,7 @@ void MacroAssembler::SmiUntagToDouble(FPRegister dst, |
Scvtf(dst, src, kSmiShift); |
} |
- |
-void MacroAssembler::SmiUntagToFloat(FPRegister dst, |
- Register src, |
+void MacroAssembler::SmiUntagToFloat(VRegister dst, Register src, |
UntagMode mode) { |
DCHECK(dst.Is32Bits() && src.Is64Bits()); |
if (FLAG_enable_slow_asserts && (mode == kNotSpeculativeUntag)) { |