Bug 780020 - Unbox int/bool more quickly in GetPropertyCacheT on x64. r=pierron

This commit is contained in:
Sean Stangl 2012-08-06 14:32:01 -07:00
parent 5cdf24d99f
commit 4f3bfa9099
5 changed files with 17 additions and 0 deletions

View File

@ -148,6 +148,10 @@ 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());
}

View File

@ -2157,6 +2157,12 @@ MacroAssemblerARMCompat::unboxBoolean(const ValueOperand &operand, const Registe
ma_mov(operand.payloadReg(), dest);
}
void
MacroAssemblerARMCompat::unboxBoolean(const Address &src, const Register &dest)
{
ma_ldr(payloadOf(src), dest);
}
void
MacroAssemblerARMCompat::unboxDouble(const ValueOperand &operand, const FloatRegister &dest)
{

View File

@ -539,6 +539,7 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
void unboxInt32(const ValueOperand &operand, const Register &dest);
void unboxInt32(const Address &src, const Register &dest);
void unboxBoolean(const ValueOperand &operand, const Register &dest);
void unboxBoolean(const Address &src, const Register &dest);
void unboxDouble(const ValueOperand &operand, const FloatRegister &dest);
void unboxValue(const ValueOperand &src, AnyRegister dest);
void unboxPrivate(const ValueOperand &src, Register dest);

View File

@ -596,6 +596,9 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
void unboxBoolean(const Operand &src, const Register &dest) {
movl(src, dest);
}
void unboxBoolean(const Address &src, const Register &dest) {
unboxBoolean(Operand(src), dest);
}
void unboxDouble(const ValueOperand &src, const FloatRegister &dest) {
movqsd(src.valueReg(), dest);

View File

@ -533,6 +533,9 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
void unboxBoolean(const ValueOperand &src, const Register &dest) {
movl(src.payloadReg(), dest);
}
void unboxBoolean(const Address &src, const Register &dest) {
movl(payloadOf(src), dest);
}
void unboxDouble(const ValueOperand &src, const FloatRegister &dest) {
JS_ASSERT(dest != ScratchFloatReg);
if (Assembler::HasSSE41()) {