[Pcre-svn] [1461] code/trunk/sljit: JIT compiler update.

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [1461] code/trunk/sljit: JIT compiler update.
Revision: 1461
          http://vcs.pcre.org/viewvc?view=rev&revision=1461
Author:   zherczeg
Date:     2014-03-07 11:54:31 +0000 (Fri, 07 Mar 2014)


Log Message:
-----------
JIT compiler update.

Modified Paths:
--------------
    code/trunk/sljit/sljitLir.c
    code/trunk/sljit/sljitNativeARM_T2_32.c
    code/trunk/sljit/sljitNativeMIPS_common.c
    code/trunk/sljit/sljitNativePPC_common.c
    code/trunk/sljit/sljitNativeX86_64.c
    code/trunk/sljit/sljitNativeX86_common.c


Modified: code/trunk/sljit/sljitLir.c
===================================================================
--- code/trunk/sljit/sljitLir.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitLir.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -176,16 +176,18 @@
 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
 #    define IS_MOVABLE    0x004
 #    define IS_JAL        0x008
-#    define IS_BIT26_COND    0x010
-#    define IS_BIT16_COND    0x020
+#    define IS_CALL        0x010
+#    define IS_BIT26_COND    0x020
+#    define IS_BIT16_COND    0x040


 #    define IS_COND        (IS_BIT26_COND | IS_BIT16_COND)


-#    define PATCH_B        0x040
-#    define PATCH_J        0x080
+#    define PATCH_B        0x080
+#    define PATCH_J        0x100


 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
-#    define PATCH_ABS32    0x100
+#    define PATCH_ABS32    0x200
+#    define PATCH_ABS48    0x400
 #endif


     /* instruction types */


Modified: code/trunk/sljit/sljitNativeARM_T2_32.c
===================================================================
--- code/trunk/sljit/sljitNativeARM_T2_32.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitNativeARM_T2_32.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -1996,12 +1996,12 @@
 {
     sljit_uh *inst = (sljit_uh*)addr;
     modify_imm32_const(inst, new_addr);
-    SLJIT_CACHE_FLUSH(inst, inst + 3);
+    SLJIT_CACHE_FLUSH(inst, inst + 4);
 }


 SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
 {
     sljit_uh *inst = (sljit_uh*)addr;
     modify_imm32_const(inst, new_constant);
-    SLJIT_CACHE_FLUSH(inst, inst + 3);
+    SLJIT_CACHE_FLUSH(inst, inst + 4);
 }


Modified: code/trunk/sljit/sljitNativeMIPS_common.c
===================================================================
--- code/trunk/sljit/sljitNativeMIPS_common.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitNativeMIPS_common.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -220,8 +220,13 @@
     sljit_ins *inst;
     sljit_ins saved_inst;


+#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
+    if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL))
+        return code_ptr;
+#else
     if (jump->flags & SLJIT_REWRITABLE_JUMP)
         return code_ptr;
+#endif


     if (jump->flags & JUMP_ADDR)
         target_addr = jump->u.target;
@@ -233,6 +238,11 @@
     if (jump->flags & IS_COND)
         inst--;


+#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+    if (jump->flags & IS_CALL)
+        goto keep_address;
+#endif
+
     /* B instructions. */
     if (jump->flags & IS_MOVABLE) {
         diff = ((sljit_sw)target_addr - (sljit_sw)(inst)) >> 2;
@@ -288,32 +298,47 @@
             jump->addr += sizeof(sljit_ins);
             return inst + 3;
         }
-        return code_ptr;
     }
+    else {
+        /* J instuctions. */
+        if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) {
+            jump->flags |= PATCH_J;
+            inst[0] = inst[-1];
+            inst[-1] = (jump->flags & IS_JAL) ? JAL : J;
+            jump->addr -= sizeof(sljit_ins);
+            return inst;
+        }


-    /* J instuctions. */
-    if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) {
-        jump->flags |= PATCH_J;
-        inst[0] = inst[-1];
-        inst[-1] = (jump->flags & IS_JAL) ? JAL : J;
-        jump->addr -= sizeof(sljit_ins);
-        return inst;
+        if ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) {
+            jump->flags |= PATCH_J;
+            inst[0] = (jump->flags & IS_JAL) ? JAL : J;
+            inst[1] = NOP;
+            return inst + 1;
+        }
     }


-    if ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) {
-        jump->flags |= PATCH_J;
-        inst[0] = (jump->flags & IS_JAL) ? JAL : J;
-        inst[1] = NOP;
-        return inst + 1;
-    }
-
 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
+keep_address:
     if (target_addr <= 0x7fffffff) {
         jump->flags |= PATCH_ABS32;
+        if (jump->flags & IS_COND) {
+            inst[0] -= 4;
+            inst++;
+        }
         inst[2] = inst[6];
         inst[3] = inst[7];
         return inst + 3;
     }
+    if (target_addr <= 0x7fffffffffffl) {
+        jump->flags |= PATCH_ABS48;
+        if (jump->flags & IS_COND) {
+            inst[0] -= 2;
+            inst++;
+        }
+        inst[4] = inst[6];
+        inst[5] = inst[7];
+        return inst + 5;
+    }
 #endif


     return code_ptr;
@@ -428,6 +453,12 @@
                 buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);
                 buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);
             }
+            else if (jump->flags & PATCH_ABS48) {
+                SLJIT_ASSERT(addr <= 0x7fffffffffffl);
+                buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 32) & 0xffff);
+                buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 16) & 0xffff);
+                buf_ptr[3] = (buf_ptr[3] & 0xffff0000) | (addr & 0xffff);
+            }
             else {
                 buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 48) & 0xffff);
                 buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 32) & 0xffff);
@@ -1578,7 +1609,7 @@
     } else {
         SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);
         /* Cannot be optimized out if type is >= CALL0. */
-        jump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? SLJIT_REWRITABLE_JUMP : 0);
+        jump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? IS_CALL : 0);
         PTR_FAIL_IF(push_inst(compiler, JALR | S(TMP_REG2) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));
         jump->addr = compiler->size;
         /* A NOP if type < CALL1. */


Modified: code/trunk/sljit/sljitNativePPC_common.c
===================================================================
--- code/trunk/sljit/sljitNativePPC_common.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitNativePPC_common.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -354,6 +354,7 @@
                         code_ptr[-1] = code_ptr[0];
                         code_ptr[0] = code_ptr[1];
                         /* rldicr rX,rX,32,31 -> rX,rX,16,47 */
+                        SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6);
                         code_ptr[-3] ^= 0x8422;
                         /* oris -> ori */
                         code_ptr[-2] ^= 0x4000000;


Modified: code/trunk/sljit/sljitNativeX86_64.c
===================================================================
--- code/trunk/sljit/sljitNativeX86_64.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitNativeX86_64.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -69,7 +69,7 @@
 {
     sljit_sw delta = addr - ((sljit_sw)code_ptr + 1 + sizeof(sljit_si));


-    if (delta <= 0x7fffffffl && delta >= -0x80000000l) {
+    if (delta <= HALFWORD_MAX && delta >= HALFWORD_MIN) {
         *code_ptr++ = (type == 2) ? CALL_i32 : JMP_i32;
         *(sljit_sw*)code_ptr = delta;
     }


Modified: code/trunk/sljit/sljitNativeX86_common.c
===================================================================
--- code/trunk/sljit/sljitNativeX86_common.c    2014-03-05 14:44:22 UTC (rev 1460)
+++ code/trunk/sljit/sljitNativeX86_common.c    2014-03-07 11:54:31 UTC (rev 1461)
@@ -118,9 +118,17 @@
 #define REX_B        0x41
 #define REX        0x40


-#define IS_HALFWORD(x)        ((x) <= 0x7fffffffl && (x) >= -0x80000000l)
-#define NOT_HALFWORD(x)        ((x) > 0x7fffffffl || (x) < -0x80000000l)
+#ifndef _WIN64
+#define HALFWORD_MAX 0x7fffffffl
+#define HALFWORD_MIN -0x80000000l
+#else
+#define HALFWORD_MAX 0x7fffffffll
+#define HALFWORD_MIN -0x80000000ll
+#endif


+#define IS_HALFWORD(x)        ((x) <= HALFWORD_MAX && (x) >= HALFWORD_MIN)
+#define NOT_HALFWORD(x)        ((x) > HALFWORD_MAX || (x) < HALFWORD_MIN)
+
 #define CHECK_EXTRA_REGS(p, w, do)


 #endif /* SLJIT_CONFIG_X86_32 */
@@ -397,7 +405,7 @@
     short_jump = (sljit_sw)(label_addr - (jump->addr + 2)) >= -128 && (sljit_sw)(label_addr - (jump->addr + 2)) <= 127;


 #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
-    if ((sljit_sw)(label_addr - (jump->addr + 1)) > 0x7fffffffl || (sljit_sw)(label_addr - (jump->addr + 1)) < -0x80000000l)
+    if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN)
         return generate_far_jump_code(jump, code_ptr, type);
 #endif


@@ -526,7 +534,7 @@
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                 *(sljit_sw*)jump->addr = (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sw)));
 #else
-                SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) >= -0x80000000l && (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) <= 0x7fffffffl);
+                SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) >= HALFWORD_MIN && (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) <= HALFWORD_MAX);
                 *(sljit_si*)jump->addr = (sljit_si)(jump->u.label->addr - (jump->addr + sizeof(sljit_si)));
 #endif
             }
@@ -534,7 +542,7 @@
 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
                 *(sljit_sw*)jump->addr = (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_sw)));
 #else
-                SLJIT_ASSERT((sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) >= -0x80000000l && (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) <= 0x7fffffffl);
+                SLJIT_ASSERT((sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) >= HALFWORD_MIN && (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) <= HALFWORD_MAX);
                 *(sljit_si*)jump->addr = (sljit_si)(jump->u.target - (jump->addr + sizeof(sljit_si)));
 #endif
             }