Bug 1258327 - Part 6: Remove ToOperand call from mips-shared and mips64 CodeGenerator. r=hev

This commit is contained in:
Tooru Fujisawa 2016-03-26 09:40:23 +09:00
parent f73a73f6bf
commit 0637c368c5
4 changed files with 59 additions and 89 deletions

View File

@ -1910,24 +1910,23 @@ CodeGeneratorMIPSShared::visitAsmSelect(LAsmSelect* ins)
MIRType mirType = ins->mir()->type();
Register cond = ToRegister(ins->condExpr());
const LAllocation* falseExpr = ins->falseExpr();
if (mirType == MIRType_Int32) {
Register falseExpr = ToRegister(ins->falseExpr());
Register out = ToRegister(ins->output());
MOZ_ASSERT(ToRegister(ins->trueExpr()) == out, "true expr input is reused for output");
masm.as_movz(out, falseExpr, cond);
masm.as_movz(out, ToRegister(falseExpr), cond);
return;
}
Operand falseExpr = ToOperand(ins->falseExpr());
FloatRegister out = ToFloatRegister(ins->output());
MOZ_ASSERT(ToFloatRegister(ins->trueExpr()) == out, "true expr input is reused for output");
if (falseExpr.getTag() == Operand::FREG) {
if (falseExpr->isFloatReg()) {
if (mirType == MIRType_Float32)
masm.as_movz(Assembler::SingleFloat, out, falseExpr.toFReg(), cond);
masm.as_movz(Assembler::SingleFloat, out, ToFloatRegister(falseExpr), cond);
else if (mirType == MIRType_Double)
masm.as_movz(Assembler::DoubleFloat, out, falseExpr.toFReg(), cond);
masm.as_movz(Assembler::DoubleFloat, out, ToFloatRegister(falseExpr), cond);
else
MOZ_CRASH("unhandled type in visitAsmSelect!");
} else {
@ -1935,9 +1934,9 @@ CodeGeneratorMIPSShared::visitAsmSelect(LAsmSelect* ins)
masm.ma_b(cond, cond, &done, Assembler::NonZero, ShortJump);
if (mirType == MIRType_Float32)
masm.loadFloat32(falseExpr.toAddress(), out);
masm.loadFloat32(ToAddress(falseExpr), out);
else if (mirType == MIRType_Double)
masm.loadDouble(falseExpr.toAddress(), out);
masm.loadDouble(ToAddress(falseExpr), out);
else
MOZ_CRASH("unhandled type in visitAsmSelect!");

View File

@ -177,23 +177,48 @@ CodeGeneratorMIPS64::visitUnbox(LUnbox* unbox)
unbox->snapshot());
}
Operand input = ToOperand(unbox->getOperand(LUnbox::Input));
LAllocation* input = unbox->getOperand(LUnbox::Input);
Register result = ToRegister(unbox->output());
if (input->isRegister()) {
Register inputReg = ToRegister(input);
switch (mir->type()) {
case MIRType_Int32:
masm.unboxInt32(inputReg, result);
break;
case MIRType_Boolean:
masm.unboxBoolean(inputReg, result);
break;
case MIRType_Object:
masm.unboxObject(inputReg, result);
break;
case MIRType_String:
masm.unboxString(inputReg, result);
break;
case MIRType_Symbol:
masm.unboxSymbol(inputReg, result);
break;
default:
MOZ_CRASH("Given MIRType cannot be unboxed.");
}
return;
}
Address inputAddr = ToAddress(input);
switch (mir->type()) {
case MIRType_Int32:
masm.unboxInt32(input, result);
masm.unboxInt32(inputAddr, result);
break;
case MIRType_Boolean:
masm.unboxBoolean(input, result);
masm.unboxBoolean(inputAddr, result);
break;
case MIRType_Object:
masm.unboxObject(input, result);
masm.unboxObject(inputAddr, result);
break;
case MIRType_String:
masm.unboxString(input, result);
masm.unboxString(inputAddr, result);
break;
case MIRType_Symbol:
masm.unboxSymbol(input, result);
masm.unboxSymbol(inputAddr, result);
break;
default:
MOZ_CRASH("Given MIRType cannot be unboxed.");
@ -284,17 +309,17 @@ CodeGeneratorMIPS64::visitAsmSelectI64(LAsmSelectI64* lir)
MOZ_ASSERT(lir->mir()->type() == MIRType_Int64);
Register cond = ToRegister(lir->condExpr());
Operand falseExpr = ToOperand(lir->falseExpr());
const LAllocation* falseExpr = lir->falseExpr();
Register out = ToRegister(lir->output());
MOZ_ASSERT(ToRegister(lir->trueExpr()) == out, "true expr is reused for input");
if (falseExpr.getTag() == Operand::REG) {
masm.as_movz(out, falseExpr.toReg(), cond);
if (falseExpr->isRegister()) {
masm.as_movz(out, ToRegister(falseExpr), cond);
} else {
Label done;
masm.ma_b(cond, cond, &done, Assembler::NonZero, ShortJump);
masm.loadPtr(falseExpr.toAddress(), out);
masm.loadPtr(ToAddress(falseExpr), out);
masm.bind(&done);
}
}

View File

@ -1276,21 +1276,10 @@ MacroAssemblerMIPS64Compat::unboxInt32(const ValueOperand& operand, Register des
}
void
MacroAssemblerMIPS64Compat::unboxInt32(const Operand& operand, Register dest)
MacroAssemblerMIPS64Compat::unboxInt32(Register src, Register dest)
{
switch(operand.getTag()) {
case Operand::REG:
ma_dsll(dest, operand.toReg(), Imm32(32));
ma_dsra(dest, dest, Imm32(32));
break;
case Operand::MEM:
unboxInt32(operand.toAddress(), dest);
break;
case Operand::FREG:
default:
MOZ_CRASH("unexpected operand kind");
break;
}
ma_dsll(dest, src, Imm32(32));
ma_dsra(dest, dest, Imm32(32));
}
void
@ -1313,20 +1302,9 @@ MacroAssemblerMIPS64Compat::unboxBoolean(const ValueOperand& operand, Register d
}
void
MacroAssemblerMIPS64Compat::unboxBoolean(const Operand& operand, Register dest)
MacroAssemblerMIPS64Compat::unboxBoolean(Register src, Register dest)
{
switch(operand.getTag()) {
case Operand::REG:
ma_dext(dest, operand.toReg(), Imm32(0), Imm32(32));
break;
case Operand::MEM:
unboxBoolean(operand.toAddress(), dest);
break;
case Operand::FREG:
default:
MOZ_CRASH("unexpected operand kind");
break;
}
ma_dext(dest, src, Imm32(0), Imm32(32));
}
void
@ -1361,20 +1339,9 @@ MacroAssemblerMIPS64Compat::unboxString(const ValueOperand& operand, Register de
}
void
MacroAssemblerMIPS64Compat::unboxString(const Operand& operand, Register dest)
MacroAssemblerMIPS64Compat::unboxString(Register src, Register dest)
{
switch(operand.getTag()) {
case Operand::REG:
ma_dext(dest, operand.toReg(), Imm32(0), Imm32(JSVAL_TAG_SHIFT));
break;
case Operand::MEM:
unboxNonDouble(operand.toAddress(), dest);
break;
case Operand::FREG:
default:
MOZ_CRASH("unexpected operand kind");
break;
}
ma_dext(dest, src, Imm32(0), Imm32(JSVAL_TAG_SHIFT));
}
void
@ -1384,20 +1351,9 @@ MacroAssemblerMIPS64Compat::unboxString(const Address& src, Register dest)
}
void
MacroAssemblerMIPS64Compat::unboxSymbol(const Operand& operand, Register dest)
MacroAssemblerMIPS64Compat::unboxSymbol(Register src, Register dest)
{
switch(operand.getTag()) {
case Operand::REG:
ma_dext(dest, operand.toReg(), Imm32(0), Imm32(JSVAL_TAG_SHIFT));
break;
case Operand::MEM:
unboxNonDouble(operand.toAddress(), dest);
break;
case Operand::FREG:
default:
MOZ_CRASH("unexpected operand kind");
break;
}
ma_dext(dest, src, Imm32(0), Imm32(JSVAL_TAG_SHIFT));
}
void
@ -1413,20 +1369,9 @@ MacroAssemblerMIPS64Compat::unboxObject(const ValueOperand& src, Register dest)
}
void
MacroAssemblerMIPS64Compat::unboxObject(const Operand& src, Register dest)
MacroAssemblerMIPS64Compat::unboxObject(Register src, Register dest)
{
switch(src.getTag()) {
case Operand::REG:
ma_dext(dest, src.toReg(), Imm32(0), Imm32(JSVAL_TAG_SHIFT));
break;
case Operand::MEM:
unboxNonDouble(src.toAddress(), dest);
break;
case Operand::FREG:
default:
MOZ_CRASH("unexpected operand kind");
break;
}
ma_dext(dest, src, Imm32(0), Imm32(JSVAL_TAG_SHIFT));
}
void

View File

@ -341,23 +341,24 @@ class MacroAssemblerMIPS64Compat : public MacroAssemblerMIPS64
void unboxNonDouble(const Address& src, Register dest);
void unboxNonDouble(const BaseIndex& src, Register dest);
void unboxInt32(const ValueOperand& operand, Register dest);
void unboxInt32(const Operand& operand, Register dest);
void unboxInt32(Register src, Register dest);
void unboxInt32(const Address& src, Register dest);
void unboxInt32(const BaseIndex& src, Register dest);
void unboxBoolean(const ValueOperand& operand, Register dest);
void unboxBoolean(const Operand& operand, Register dest);
void unboxBoolean(Register src, Register dest);
void unboxBoolean(const Address& src, Register dest);
void unboxBoolean(const BaseIndex& src, Register dest);
void unboxDouble(const ValueOperand& operand, FloatRegister dest);
void unboxDouble(Register src, Register dest);
void unboxDouble(const Address& src, FloatRegister dest);
void unboxString(const ValueOperand& operand, Register dest);
void unboxString(const Operand& operand, Register dest);
void unboxString(Register src, Register dest);
void unboxString(const Address& src, Register dest);
void unboxSymbol(const ValueOperand& src, Register dest);
void unboxSymbol(const Operand& src, Register dest);
void unboxSymbol(Register src, Register dest);
void unboxSymbol(const Address& src, Register dest);
void unboxObject(const ValueOperand& src, Register dest);
void unboxObject(const Operand& src, Register dest);
void unboxObject(Register src, Register dest);
void unboxObject(const Address& src, Register dest);
void unboxObject(const BaseIndex& src, Register dest) { unboxNonDouble(src, dest); }
void unboxValue(const ValueOperand& src, AnyRegister dest);