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:
parent
c372af17b7
commit
08d61aa0b3
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user