void MacroAssemblerX64::storeUnboxedValue(ConstantOrRegister value, MIRType valueType, const T& dest, MIRType slotType) { if (valueType == MIRType_Double) { storeDouble(value.reg().typedReg().fpu(), dest); return; } // For known integers and booleans, we can just store the unboxed value if // the slot has the same type. if ((valueType == MIRType_Int32 || valueType == MIRType_Boolean) && slotType == valueType) { if (value.constant()) { Value val = value.value(); if (valueType == MIRType_Int32) store32(Imm32(val.toInt32()), dest); else store32(Imm32(val.toBoolean() ? 1 : 0), dest); } else { store32(value.reg().typedReg().gpr(), dest); } return; } if (value.constant()) storeValue(value.value(), dest); else storeValue(ValueTypeFromMIRType(valueType), value.reg().typedReg().gpr(), dest); }
void MacroAssemblerX86::storeUnboxedValue(ConstantOrRegister value, MIRType valueType, const T &dest, MIRType slotType) { if (valueType == MIRType_Double) { storeDouble(value.reg().typedReg().fpu(), dest); return; } // Store the type tag if needed. if (valueType != slotType) storeTypeTag(ImmType(ValueTypeFromMIRType(valueType)), Operand(dest)); // Store the payload. if (value.constant()) storePayload(value.value(), Operand(dest)); else storePayload(value.reg().typedReg().gpr(), Operand(dest)); }