зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7366a29714
Коммит
5b234ce707
|
@ -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)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче