Commit 858a5e53 authored by Jacob.Bramley@arm.com's avatar Jacob.Bramley@arm.com

ARM: optimize inlined doubles

Use 'vmov Dn[x], ip' instead of 'vmov Sn, ip' to load double immediates.
This patch is only useful for Turbofan as Crankshaft loads double immediates from the constant pool.
This give a little improvement on asm.js benchmarks

R=bmeurer@chromium.org, ulan@chromium.org

BUG=

Review URL: https://codereview.chromium.org/704543002

Cr-Commit-Position: refs/heads/master@{#25146}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25146 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 6de28b2b
......@@ -2545,27 +2545,20 @@ void Assembler::vmov(const DwVfpRegister dst,
uint32_t lo, hi;
DoubleAsTwoUInt32(imm, &lo, &hi);
if (scratch.is(no_reg)) {
if (dst.code() < 16) {
const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code());
// Move the low part of the double into the lower of the corresponsing S
// registers of D register dst.
mov(ip, Operand(lo));
vmov(loc.low(), ip);
// Move the high part of the double into the higher of the
// corresponsing S registers of D register dst.
mov(ip, Operand(hi));
vmov(loc.high(), ip);
if (lo == hi) {
// Move the low and high parts of the double to a D register in one
// instruction.
mov(ip, Operand(lo));
vmov(dst, ip, ip);
} else if (scratch.is(no_reg)) {
mov(ip, Operand(lo));
vmov(dst, VmovIndexLo, ip);
if ((lo & 0xffff) == (hi & 0xffff)) {
movt(ip, hi >> 16);
} else {
// D16-D31 does not have S registers, so move the low and high parts
// directly to the D register using vmov.32.
// Note: This may be slower, so we only do this when we have to.
mov(ip, Operand(lo));
vmov(dst, VmovIndexLo, ip);
mov(ip, Operand(hi));
vmov(dst, VmovIndexHi, ip);
}
vmov(dst, VmovIndexHi, ip);
} else {
// Move the low and high parts of the double to a D register in one
// instruction.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment