MIPS: Port '[turbofan] Add ia32 support for 4 and 16 byte moves and swaps.'

Port of 26ecb4a1d7

TEST=mjsunit/es6/math-fround

Review-Url: https://codereview.chromium.org/2156123002
Cr-Commit-Position: refs/heads/master@{#37848}
This commit is contained in:
marija.antic 2016-07-18 22:41:58 -07:00 committed by Commit bot
parent c372af17b7
commit 08d61aa0b3

View File

@ -2042,23 +2042,42 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
__ Move(dst, src); __ Move(dst, src);
} else { } else {
DCHECK(destination->IsFPStackSlot()); DCHECK(destination->IsFPStackSlot());
MachineRepresentation rep =
LocationOperand::cast(source)->representation();
if (rep == MachineRepresentation::kFloat64) {
__ sdc1(src, g.ToMemOperand(destination)); __ sdc1(src, g.ToMemOperand(destination));
} else if (rep == MachineRepresentation::kFloat32) {
__ swc1(src, g.ToMemOperand(destination));
} else {
DCHECK_EQ(MachineRepresentation::kSimd128, rep);
UNREACHABLE();
}
} }
} else if (source->IsFPStackSlot()) { } else if (source->IsFPStackSlot()) {
DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot()); DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot());
MemOperand src = g.ToMemOperand(source); MemOperand src = g.ToMemOperand(source);
MachineRepresentation rep = LocationOperand::cast(source)->representation();
if (destination->IsFPRegister()) { if (destination->IsFPRegister()) {
LocationOperand* op = LocationOperand::cast(source); if (rep == MachineRepresentation::kFloat64) {
if (op->representation() == MachineRepresentation::kFloat64) {
__ ldc1(g.ToDoubleRegister(destination), src); __ ldc1(g.ToDoubleRegister(destination), src);
} else { } else if (rep == MachineRepresentation::kFloat32) {
DCHECK_EQ(MachineRepresentation::kFloat32, op->representation());
__ lwc1(g.ToDoubleRegister(destination), src); __ lwc1(g.ToDoubleRegister(destination), src);
} else {
DCHECK_EQ(MachineRepresentation::kSimd128, rep);
UNREACHABLE();
} }
} else { } else {
FPURegister temp = kScratchDoubleReg; FPURegister temp = kScratchDoubleReg;
if (rep == MachineRepresentation::kFloat64) {
__ ldc1(temp, src); __ ldc1(temp, src);
__ sdc1(temp, g.ToMemOperand(destination)); __ sdc1(temp, g.ToMemOperand(destination));
} else if (rep == MachineRepresentation::kFloat32) {
__ lwc1(temp, src);
__ swc1(temp, g.ToMemOperand(destination));
} else {
DCHECK_EQ(MachineRepresentation::kSimd128, rep);
UNREACHABLE();
}
} }
} else { } else {
UNREACHABLE(); UNREACHABLE();
@ -2108,17 +2127,30 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source,
} else { } else {
DCHECK(destination->IsFPStackSlot()); DCHECK(destination->IsFPStackSlot());
MemOperand dst = g.ToMemOperand(destination); MemOperand dst = g.ToMemOperand(destination);
MachineRepresentation rep =
LocationOperand::cast(source)->representation();
if (rep == MachineRepresentation::kFloat64) {
__ Move(temp, src); __ Move(temp, src);
__ ldc1(src, dst); __ ldc1(src, dst);
__ sdc1(temp, dst); __ sdc1(temp, dst);
} else if (rep == MachineRepresentation::kFloat32) {
__ Move(temp, src);
__ lwc1(src, dst);
__ swc1(temp, dst);
} else {
DCHECK_EQ(MachineRepresentation::kSimd128, rep);
UNREACHABLE();
}
} }
} else if (source->IsFPStackSlot()) { } else if (source->IsFPStackSlot()) {
DCHECK(destination->IsFPStackSlot()); DCHECK(destination->IsFPStackSlot());
Register temp_0 = kScratchReg; Register temp_0 = kScratchReg;
FPURegister temp_1 = kScratchDoubleReg; FPURegister temp_1 = kScratchDoubleReg;
MemOperand src0 = g.ToMemOperand(source); MemOperand src0 = g.ToMemOperand(source);
MemOperand src1(src0.rm(), src0.offset() + kIntSize);
MemOperand dst0 = g.ToMemOperand(destination); MemOperand dst0 = g.ToMemOperand(destination);
MachineRepresentation rep = LocationOperand::cast(source)->representation();
if (rep == MachineRepresentation::kFloat64) {
MemOperand src1(src0.rm(), src0.offset() + kIntSize);
MemOperand dst1(dst0.rm(), dst0.offset() + kIntSize); MemOperand dst1(dst0.rm(), dst0.offset() + kIntSize);
__ ldc1(temp_1, dst0); // Save destination in temp_1. __ ldc1(temp_1, dst0); // Save destination in temp_1.
__ lw(temp_0, src0); // Then use temp_0 to copy source to destination. __ lw(temp_0, src0); // Then use temp_0 to copy source to destination.
@ -2126,6 +2158,15 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source,
__ lw(temp_0, src1); __ lw(temp_0, src1);
__ sw(temp_0, dst1); __ sw(temp_0, dst1);
__ sdc1(temp_1, src0); __ sdc1(temp_1, src0);
} else if (rep == MachineRepresentation::kFloat32) {
__ lwc1(temp_1, dst0); // Save destination in temp_1.
__ lw(temp_0, src0); // Then use temp_0 to copy source to destination.
__ sw(temp_0, dst0);
__ swc1(temp_1, src0);
} else {
DCHECK_EQ(MachineRepresentation::kSimd128, rep);
UNREACHABLE();
}
} else { } else {
// No other combinations are possible. // No other combinations are possible.
UNREACHABLE(); UNREACHABLE();