Add a bunch of early exits and local optimizations to the x86 assembler.
authornrotem@apple.com <nrotem@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Nov 2013 07:40:03 +0000 (07:40 +0000)
committernrotem@apple.com <nrotem@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Nov 2013 07:40:03 +0000 (07:40 +0000)
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):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@159835 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/assembler/MacroAssemblerX86.h
Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h

index 4d8a691..eedb632 100644 (file)
@@ -1,3 +1,24 @@
+2013-11-27  Nadav Rotem  <nrotem@apple.com>
+
+        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  <fpizlo@apple.com>
 
         Infer one-time scopes
index 547158f..d1fedd5 100644 (file)
@@ -62,12 +62,14 @@ public:
 
     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 @@ public:
     
     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 @@ public:
     
     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)
index 18ebb1b..4cb94a0 100644 (file)
@@ -114,11 +114,14 @@ public:
 
     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 @@ public:
 
     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 @@ public:
 
     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 @@ public:
 
     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 @@ public:
     
     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)));
     }
 
index e8174bb..0afa828 100644 (file)
@@ -59,6 +59,8 @@ public:
 
     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 @@ public:
     
     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 @@ public:
 
     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 @@ public:
 
     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 @@ public:
 
     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 @@ public:
 
     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 @@ public:
 
     void or64(TrustedImm32 imm, RegisterID src, RegisterID dest)
     {
+        if (!imm.m_value)
+            return;
         move(src, dest);
         or64(imm, dest);
     }
@@ -338,7 +355,8 @@ public:
 
     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)