Bug 1279761 - IonMonkey: MIPS: Implement MCopySign. r=bbouvier

---
 .../jit/mips-shared/CodeGenerator-mips-shared.cpp  | 39 ++++++++++++++++++++++
 js/src/jit/mips-shared/CodeGenerator-mips-shared.h |  2 ++
 js/src/jit/mips-shared/Lowering-mips-shared.cpp    | 24 +++++++++++++
 js/src/jit/mips-shared/Lowering-mips-shared.h      |  1 +
 4 files changed, 66 insertions(+)
This commit is contained in:
Heiher 2016-06-13 22:23:09 +08:00
Родитель 7366a29714
Коммит 5b234ce707
3 изменённых файлов: 65 добавлений и 0 удалений

Просмотреть файл

@ -1404,6 +1404,45 @@ CodeGeneratorMIPSShared::visitOutOfLineWasmTruncateCheck(OutOfLineWasmTruncateCh
masm.jump(wasm::JumpTarget::InvalidConversionToInteger);
}
void
CodeGeneratorMIPSShared::visitCopySignF(LCopySignF* ins)
{
FloatRegister lhs = ToFloatRegister(ins->getOperand(0));
FloatRegister rhs = ToFloatRegister(ins->getOperand(1));
FloatRegister output = ToFloatRegister(ins->getDef(0));
Register lhsi = ToRegister(ins->getTemp(0));
Register rhsi = ToRegister(ins->getTemp(1));
masm.moveFromFloat32(lhs, lhsi);
masm.moveFromFloat32(rhs, rhsi);
// Combine.
masm.as_ins(rhsi, lhsi, 0, 31);
masm.moveToFloat32(rhsi, output);
}
void
CodeGeneratorMIPSShared::visitCopySignD(LCopySignD* ins)
{
FloatRegister lhs = ToFloatRegister(ins->getOperand(0));
FloatRegister rhs = ToFloatRegister(ins->getOperand(1));
FloatRegister output = ToFloatRegister(ins->getDef(0));
Register lhsi = ToRegister(ins->getTemp(0));
Register rhsi = ToRegister(ins->getTemp(1));
// Manipulate high words of double inputs.
masm.moveFromDoubleHi(lhs, lhsi);
masm.moveFromDoubleHi(rhs, rhsi);
// Combine.
masm.as_ins(rhsi, lhsi, 0, 31);
masm.moveToDoubleHi(rhsi, output);
}
void
CodeGeneratorMIPSShared::visitValue(LValue* value)
{

Просмотреть файл

@ -169,6 +169,8 @@ class CodeGeneratorMIPSShared : public CodeGeneratorShared
// Out of line visitors.
virtual void visitOutOfLineBailout(OutOfLineBailout* ool) = 0;
void visitOutOfLineWasmTruncateCheck(OutOfLineWasmTruncateCheck* ool);
void visitCopySignD(LCopySignD* ins);
void visitCopySignF(LCopySignF* ins);
protected:
virtual ValueOperand ToOutValue(LInstruction* ins) = 0;

Просмотреть файл

@ -591,6 +591,30 @@ LIRGeneratorMIPSShared::visitInt64ToFloatingPoint(MInt64ToFloatingPoint* ins)
MOZ_CRASH("NYI");
}
void
LIRGeneratorMIPSShared::visitCopySign(MCopySign* ins)
{
MDefinition* lhs = ins->lhs();
MDefinition* rhs = ins->rhs();
MOZ_ASSERT(IsFloatingPointType(lhs->type()));
MOZ_ASSERT(lhs->type() == rhs->type());
MOZ_ASSERT(lhs->type() == ins->type());
LInstructionHelper<1, 2, 2>* lir;
if (lhs->type() == MIRType::Double)
lir = new(alloc()) LCopySignD();
else
lir = new(alloc()) LCopySignF();
lir->setTemp(0, temp());
lir->setTemp(1, temp());
lir->setOperand(0, useRegister(lhs));
lir->setOperand(1, useRegister(rhs));
defineReuseInput(lir, ins, 0);
}
void
LIRGeneratorMIPSShared::visitCopySign(MCopySign* ins)
{