diff --git a/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp b/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp index d86e19b5e04e..e21e4cf93575 100644 --- a/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp +++ b/js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp @@ -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!"); diff --git a/js/src/jit/mips64/CodeGenerator-mips64.cpp b/js/src/jit/mips64/CodeGenerator-mips64.cpp index 6adb180bf1a6..02806024e9bb 100644 --- a/js/src/jit/mips64/CodeGenerator-mips64.cpp +++ b/js/src/jit/mips64/CodeGenerator-mips64.cpp @@ -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); } } diff --git a/js/src/jit/mips64/MacroAssembler-mips64.cpp b/js/src/jit/mips64/MacroAssembler-mips64.cpp index 35f347b64731..bd81c0b8a2f4 100644 --- a/js/src/jit/mips64/MacroAssembler-mips64.cpp +++ b/js/src/jit/mips64/MacroAssembler-mips64.cpp @@ -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 diff --git a/js/src/jit/mips64/MacroAssembler-mips64.h b/js/src/jit/mips64/MacroAssembler-mips64.h index 629f7cd01dd0..d7d9945e2518 100644 --- a/js/src/jit/mips64/MacroAssembler-mips64.h +++ b/js/src/jit/mips64/MacroAssembler-mips64.h @@ -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);