void CodeGeneratorMIPS64::visitUnbox(LUnbox* unbox) { MUnbox* mir = unbox->mir(); if (mir->fallible()) { const ValueOperand value = ToValue(unbox, LUnbox::Input); masm.splitTag(value, SecondScratchReg); bailoutCmp32(Assembler::NotEqual, SecondScratchReg, Imm32(MIRTypeToTag(mir->type())), unbox->snapshot()); } Operand input = ToOperand(unbox->getOperand(LUnbox::Input)); Register result = ToRegister(unbox->output()); switch (mir->type()) { case MIRType_Int32: masm.unboxInt32(input, result); break; case MIRType_Boolean: masm.unboxBoolean(input, result); break; case MIRType_Object: masm.unboxObject(input, result); break; case MIRType_String: masm.unboxString(input, result); break; case MIRType_Symbol: masm.unboxSymbol(input, result); break; default: MOZ_CRASH("Given MIRType cannot be unboxed."); } }
bool CodeGeneratorX64::visitUnbox(LUnbox *unbox) { const ValueOperand value = ToValue(unbox, LUnbox::Input); const LDefinition *result = unbox->output(); MUnbox *mir = unbox->mir(); if (mir->fallible()) { Assembler::Condition cond; switch (mir->type()) { case MIRType_Int32: cond = masm.testInt32(Assembler::NotEqual, value); break; case MIRType_Boolean: cond = masm.testBoolean(Assembler::NotEqual, value); break; case MIRType_Object: cond = masm.testObject(Assembler::NotEqual, value); break; case MIRType_String: cond = masm.testString(Assembler::NotEqual, value); break; case MIRType_Symbol: cond = masm.testSymbol(Assembler::NotEqual, value); break; default: MOZ_CRASH("Given MIRType cannot be unboxed."); } if (!bailoutIf(cond, unbox->snapshot())) return false; } switch (mir->type()) { case MIRType_Int32: masm.unboxInt32(value, ToRegister(result)); break; case MIRType_Boolean: masm.unboxBoolean(value, ToRegister(result)); break; case MIRType_Object: masm.unboxObject(value, ToRegister(result)); break; case MIRType_String: masm.unboxString(value, ToRegister(result)); break; case MIRType_Symbol: masm.unboxSymbol(value, ToRegister(result)); break; default: MOZ_CRASH("Given MIRType cannot be unboxed."); } return true; }
void CodeGeneratorX86::visitUnbox(LUnbox* unbox) { // Note that for unbox, the type and payload indexes are switched on the // inputs. MUnbox* mir = unbox->mir(); if (mir->fallible()) { masm.cmp32(ToOperand(unbox->type()), Imm32(MIRTypeToTag(mir->type()))); bailoutIf(Assembler::NotEqual, unbox->snapshot()); } }
void CodeGeneratorX64::visitUnbox(LUnbox* unbox) { MUnbox* mir = unbox->mir(); if (mir->fallible()) { const ValueOperand value = ToValue(unbox, LUnbox::Input); Assembler::Condition cond; switch (mir->type()) { case MIRType::Int32: cond = masm.testInt32(Assembler::NotEqual, value); break; case MIRType::Boolean: cond = masm.testBoolean(Assembler::NotEqual, value); break; case MIRType::Object: cond = masm.testObject(Assembler::NotEqual, value); break; case MIRType::String: cond = masm.testString(Assembler::NotEqual, value); break; case MIRType::Symbol: cond = masm.testSymbol(Assembler::NotEqual, value); break; default: MOZ_CRASH("Given MIRType cannot be unboxed."); } bailoutIf(cond, unbox->snapshot()); } Operand input = ToOperand(unbox->getOperand(LUnbox::Input)); Register result = ToRegister(unbox->output()); switch (mir->type()) { case MIRType::Int32: masm.unboxInt32(input, result); break; case MIRType::Boolean: masm.unboxBoolean(input, result); break; case MIRType::Object: masm.unboxObject(input, result); break; case MIRType::String: masm.unboxString(input, result); break; case MIRType::Symbol: masm.unboxSymbol(input, result); break; default: MOZ_CRASH("Given MIRType cannot be unboxed."); } }
bool IntPolicy<Op>::staticAdjustInputs(TempAllocator &alloc, MInstruction *def) { MDefinition *in = def->getOperand(Op); if (in->type() == MIRType_Int32) return true; MUnbox *replace = MUnbox::New(alloc, in, MIRType_Int32, MUnbox::Fallible); def->block()->insertBefore(def, replace); def->replaceOperand(Op, replace); return replace->typePolicy()->adjustInputs(alloc, replace); }
bool StringPolicy<Op>::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins) { MDefinition *in = ins->getOperand(Op); if (in->type() == MIRType_String) return true; MUnbox *replace = MUnbox::New(alloc, in, MIRType_String, MUnbox::Fallible); ins->block()->insertBefore(ins, replace); ins->replaceOperand(Op, replace); return replace->typePolicy()->adjustInputs(alloc, replace); }
void CodeGeneratorMIPS::visitUnbox(LUnbox* unbox) { // Note that for unbox, the type and payload indexes are switched on the // inputs. MUnbox* mir = unbox->mir(); Register type = ToRegister(unbox->type()); if (mir->fallible()) { bailoutCmp32(Assembler::NotEqual, type, Imm32(MIRTypeToTag(mir->type())), unbox->snapshot()); } }
bool ObjectPolicy<Op>::staticAdjustInputs(TempAllocator& alloc, MInstruction* ins) { MDefinition* in = ins->getOperand(Op); if (in->type() == MIRType::Object || in->type() == MIRType::Slots || in->type() == MIRType::Elements) { return true; } MUnbox* replace = MUnbox::New(alloc, in, MIRType::Object, MUnbox::Fallible); ins->block()->insertBefore(ins, replace); ins->replaceOperand(Op, replace); return replace->typePolicy()->adjustInputs(alloc, replace); }