Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (159834 => 159835)
--- trunk/Source/_javascript_Core/ChangeLog 2013-11-28 07:10:10 UTC (rev 159834)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-11-28 07:40:03 UTC (rev 159835)
@@ -1,3 +1,24 @@
+2013-11-27 Nadav Rotem <[email protected]>
+
+ Add a bunch of early exits and local optimizations to the x86 assembler.
+ https://bugs.webkit.org/show_bug.cgi?id=124904
+
+ Reviewed by Filip Pizlo.
+
+ * assembler/MacroAssemblerX86.h:
+ (JSC::MacroAssemblerX86::add32):
+ (JSC::MacroAssemblerX86::add64):
+ (JSC::MacroAssemblerX86::or32):
+ * assembler/MacroAssemblerX86Common.h:
+ (JSC::MacroAssemblerX86Common::add32):
+ (JSC::MacroAssemblerX86Common::or32):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::add32):
+ (JSC::MacroAssemblerX86_64::or32):
+ (JSC::MacroAssemblerX86_64::add64):
+ (JSC::MacroAssemblerX86_64::or64):
+ (JSC::MacroAssemblerX86_64::xor64):
+
2013-11-27 Filip Pizlo <[email protected]>
Infer one-time scopes
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h (159834 => 159835)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2013-11-28 07:10:10 UTC (rev 159834)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2013-11-28 07:40:03 UTC (rev 159835)
@@ -62,12 +62,14 @@
void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
- m_assembler.leal_mr(imm.m_value, src, dest);
+ if (imm.m_value)
+ m_assembler.leal_mr(imm.m_value, src, dest);
}
void add32(TrustedImm32 imm, AbsoluteAddress address)
{
- m_assembler.addl_im(imm.m_value, address.m_ptr);
+ if (imm.m_value)
+ m_assembler.addl_im(imm.m_value, address.m_ptr);
}
void add32(AbsoluteAddress address, RegisterID dest)
@@ -77,6 +79,8 @@
void add64(TrustedImm32 imm, AbsoluteAddress address)
{
+ if (!imm.m_value)
+ return;
m_assembler.addl_im(imm.m_value, address.m_ptr);
m_assembler.adcl_im(imm.m_value >> 31, reinterpret_cast<const char*>(address.m_ptr) + sizeof(int32_t));
}
@@ -88,7 +92,8 @@
void or32(TrustedImm32 imm, AbsoluteAddress address)
{
- m_assembler.orl_im(imm.m_value, address.m_ptr);
+ if (imm.m_value)
+ m_assembler.orl_im(imm.m_value, address.m_ptr);
}
void or32(RegisterID reg, AbsoluteAddress address)
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (159834 => 159835)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2013-11-28 07:10:10 UTC (rev 159834)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2013-11-28 07:40:03 UTC (rev 159835)
@@ -114,11 +114,14 @@
void add32(TrustedImm32 imm, Address address)
{
- m_assembler.addl_im(imm.m_value, address.offset, address.base);
+ if (imm.m_value)
+ m_assembler.addl_im(imm.m_value, address.offset, address.base);
}
void add32(TrustedImm32 imm, RegisterID dest)
{
+ if (!imm.m_value)
+ return;
if (imm.m_value == 1)
m_assembler.inc_r(dest);
else
@@ -137,7 +140,8 @@
void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
- m_assembler.leal_mr(imm.m_value, src, dest);
+ if (imm.m_value)
+ m_assembler.leal_mr(imm.m_value, src, dest);
}
void and32(RegisterID src, RegisterID dest)
@@ -252,7 +256,8 @@
void or32(TrustedImm32 imm, RegisterID dest)
{
- m_assembler.orl_ir(imm.m_value, dest);
+ if (imm.m_value)
+ m_assembler.orl_ir(imm.m_value, dest);
}
void or32(RegisterID src, Address dest)
@@ -267,7 +272,8 @@
void or32(TrustedImm32 imm, Address address)
{
- m_assembler.orl_im(imm.m_value, address.offset, address.base);
+ if (imm.m_value)
+ m_assembler.orl_im(imm.m_value, address.offset, address.base);
}
void or32(RegisterID op1, RegisterID op2, RegisterID dest)
@@ -1237,31 +1243,34 @@
Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest)
{
- add32(src, dest);
+ m_assembler.addl_rr(src, dest);
return Jump(m_assembler.jCC(x86Condition(cond)));
}
Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
{
- add32(imm, dest);
+ if (imm.m_value == 1)
+ m_assembler.inc_r(dest);
+ else
+ m_assembler.addl_ir(imm.m_value, dest);
return Jump(m_assembler.jCC(x86Condition(cond)));
}
Jump branchAdd32(ResultCondition cond, TrustedImm32 src, Address dest)
{
- add32(src, dest);
+ m_assembler.addl_im(src.m_value, dest.offset, dest.base);
return Jump(m_assembler.jCC(x86Condition(cond)));
}
Jump branchAdd32(ResultCondition cond, RegisterID src, Address dest)
{
- add32(src, dest);
+ m_assembler.addl_rm(src, dest.offset, dest.base);
return Jump(m_assembler.jCC(x86Condition(cond)));
}
Jump branchAdd32(ResultCondition cond, Address src, RegisterID dest)
{
- add32(src, dest);
+ m_assembler.addl_mr(src.offset, src.base, dest);
return Jump(m_assembler.jCC(x86Condition(cond)));
}
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (159834 => 159835)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2013-11-28 07:10:10 UTC (rev 159834)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2013-11-28 07:40:03 UTC (rev 159835)
@@ -59,6 +59,8 @@
void add32(TrustedImm32 imm, AbsoluteAddress address)
{
+ if (!imm.m_value)
+ return;
move(TrustedImmPtr(address.m_ptr), scratchRegister);
add32(imm, Address(scratchRegister));
}
@@ -77,6 +79,8 @@
void or32(TrustedImm32 imm, AbsoluteAddress address)
{
+ if (!imm.m_value)
+ return;
move(TrustedImmPtr(address.m_ptr), scratchRegister);
or32(imm, Address(scratchRegister));
}
@@ -196,6 +200,8 @@
void add64(TrustedImm32 imm, RegisterID srcDest)
{
+ if (!imm.m_value)
+ return;
if (imm.m_value == 1)
m_assembler.incq_r(srcDest);
else
@@ -204,6 +210,8 @@
void add64(TrustedImm64 imm, RegisterID dest)
{
+ if (!imm.m_value)
+ return;
if (imm.m_value == 1)
m_assembler.incq_r(dest);
else {
@@ -214,16 +222,20 @@
void add64(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
- m_assembler.leaq_mr(imm.m_value, src, dest);
+ if (imm.m_value)
+ m_assembler.leaq_mr(imm.m_value, src, dest);
}
void add64(TrustedImm32 imm, Address address)
{
- m_assembler.addq_im(imm.m_value, address.offset, address.base);
+ if (imm.m_value)
+ m_assembler.addq_im(imm.m_value, address.offset, address.base);
}
void add64(TrustedImm32 imm, AbsoluteAddress address)
{
+ if (!imm.m_value)
+ return;
move(TrustedImmPtr(address.m_ptr), scratchRegister);
add64(imm, Address(scratchRegister));
}
@@ -271,13 +283,16 @@
void or64(TrustedImm64 imm, RegisterID dest)
{
+ if (!imm.m_value)
+ return;
move(imm, scratchRegister);
or64(scratchRegister, dest);
}
void or64(TrustedImm32 imm, RegisterID dest)
{
- m_assembler.orq_ir(imm.m_value, dest);
+ if (imm.m_value)
+ m_assembler.orq_ir(imm.m_value, dest);
}
void or64(RegisterID op1, RegisterID op2, RegisterID dest)
@@ -294,6 +309,8 @@
void or64(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
+ if (!imm.m_value)
+ return;
move(src, dest);
or64(imm, dest);
}
@@ -338,7 +355,8 @@
void xor64(TrustedImm32 imm, RegisterID srcDest)
{
- m_assembler.xorq_ir(imm.m_value, srcDest);
+ if (imm.m_value)
+ m_assembler.xorq_ir(imm.m_value, srcDest);
}
void load64(ImplicitAddress address, RegisterID dest)