diff --git a/js/src/ion/CodeGenerator.cpp b/js/src/ion/CodeGenerator.cpp index 7d9a5d1732e0..627f9e142659 100644 --- a/js/src/ion/CodeGenerator.cpp +++ b/js/src/ion/CodeGenerator.cpp @@ -3118,8 +3118,10 @@ CodeGenerator::visitLoadFixedSlotT(LLoadFixedSlotT *ins) const Register obj = ToRegister(ins->getOperand(0)); size_t slot = ins->mir()->slot(); AnyRegister result = ToAnyRegister(ins->getDef(0)); + MIRType type = ins->mir()->type(); + + masm.loadUnboxedValue(Address(obj, JSObject::getFixedSlotOffset(slot)), type, result); - masm.loadUnboxedValue(Address(obj, JSObject::getFixedSlotOffset(slot)), result); return true; } diff --git a/js/src/ion/IonMacroAssembler.h b/js/src/ion/IonMacroAssembler.h index 547de393401b..33a4c1a1e1ab 100644 --- a/js/src/ion/IonMacroAssembler.h +++ b/js/src/ion/IonMacroAssembler.h @@ -167,12 +167,8 @@ class MacroAssembler : public MacroAssemblerSpecific void loadTypedOrValue(const T &src, TypedOrValueRegister dest) { if (dest.hasValue()) loadValue(src, dest.valueReg()); - else if (dest.type() == MIRType_Int32) - unboxInt32(src, dest.typedReg().gpr()); - else if (dest.type() == MIRType_Boolean) - unboxBoolean(src, dest.typedReg().gpr()); else - loadUnboxedValue(src, dest.typedReg()); + loadUnboxedValue(src, dest.type(), dest.typedReg()); } template @@ -185,7 +181,7 @@ class MacroAssembler : public MacroAssemblerSpecific } else { if (holeCheck) branchTestMagic(Assembler::Equal, src, hole); - loadUnboxedValue(src, dest.typedReg()); + loadUnboxedValue(src, dest.type(), dest.typedReg()); } } diff --git a/js/src/ion/MIR.cpp b/js/src/ion/MIR.cpp index 24c051757921..4b88b6ccff1b 100644 --- a/js/src/ion/MIR.cpp +++ b/js/src/ion/MIR.cpp @@ -41,7 +41,7 @@ MDefinition::earlyAbortCheck() { if (isPhi()) return false; - for (int i = 0; i < numOperands(); i++) { + for (size_t i = 0; i < numOperands(); i++) { if (getOperand(i)->block()->earlyAbort()) { block()->setEarlyAbort(); IonSpew(IonSpew_Range, "Ignoring value from block %d because instruction %d is in a block that aborts", block()->id(), getOperand(i)->id()); diff --git a/js/src/ion/arm/MacroAssembler-arm.h b/js/src/ion/arm/MacroAssembler-arm.h index 0de0a1f4c84b..defabf078279 100644 --- a/js/src/ion/arm/MacroAssembler-arm.h +++ b/js/src/ion/arm/MacroAssembler-arm.h @@ -726,14 +726,14 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM ma_b(label, cond); } - void loadUnboxedValue(Address address, AnyRegister dest) { + void loadUnboxedValue(Address address, MIRType type, AnyRegister dest) { if (dest.isFloat()) loadInt32OrDouble(Operand(address), dest.fpu()); else ma_ldr(address, dest.gpr()); } - void loadUnboxedValue(BaseIndex address, AnyRegister dest) { + void loadUnboxedValue(BaseIndex address, MIRType type, AnyRegister dest) { if (dest.isFloat()) loadInt32OrDouble(address.base, address.index, dest.fpu(), address.scale); else diff --git a/js/src/ion/x64/MacroAssembler-x64.h b/js/src/ion/x64/MacroAssembler-x64.h index 2be025e7a6ad..17be8f44a142 100644 --- a/js/src/ion/x64/MacroAssembler-x64.h +++ b/js/src/ion/x64/MacroAssembler-x64.h @@ -811,9 +811,11 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared } template - void loadUnboxedValue(const T &src, AnyRegister dest) { + void loadUnboxedValue(const T &src, MIRType type, AnyRegister dest) { if (dest.isFloat()) loadInt32OrDouble(Operand(src), dest.fpu()); + else if (type == MIRType_Int32 || type == MIRType_Boolean) + movl(Operand(src), dest.gpr()); else unboxNonDouble(Operand(src), dest.gpr()); } diff --git a/js/src/ion/x86/MacroAssembler-x86.h b/js/src/ion/x86/MacroAssembler-x86.h index c45ba54f3314..b38b65128773 100644 --- a/js/src/ion/x86/MacroAssembler-x86.h +++ b/js/src/ion/x86/MacroAssembler-x86.h @@ -649,7 +649,7 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared } template - void loadUnboxedValue(const T &src, AnyRegister dest) { + void loadUnboxedValue(const T &src, MIRType type, AnyRegister dest) { if (dest.isFloat()) loadInt32OrDouble(Operand(src), dest.fpu()); else