Module Name: src
Committed By: alnsn
Date: Sun Nov 18 14:36:38 UTC 2012
Modified Files:
src/sys/external/bsd/sljit/dist/sljit_src: sljitConfigInternal.h
sljitLir.c sljitNativeX86_32.c sljitNativeX86_common.c
Log Message:
Apply adapted patch from the author of sljit to fix cdecl functions
generation on i386.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h
cvs rdiff -u -r1.1.1.3 -r1.2 \
src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c
cvs rdiff -u -r1.1.1.2 -r1.2 \
src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h
diff -u src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h:1.5 src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h:1.6
--- src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h:1.5 Fri Nov 9 23:09:32 2012
+++ src/sys/external/bsd/sljit/dist/sljit_src/sljitConfigInternal.h Sun Nov 18 14:36:37 2012
@@ -308,7 +308,8 @@ typedef long int sljit_w;
#define SLJIT_X86_32_FASTCALL 1
#else /* defined(_WIN32) */
-#define SLJIT_CALL __stdcall
+/* The cdecl attribute is the default. */
+#define SLJIT_CALL
#endif
#else /* Other architectures. */
Index: src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c
diff -u src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c:1.1.1.3 src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c:1.2
--- src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c:1.1.1.3 Sun Oct 28 09:36:25 2012
+++ src/sys/external/bsd/sljit/dist/sljit_src/sljitLir.c Sun Nov 18 14:36:37 2012
@@ -190,6 +190,9 @@
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
#define SLJIT_HAS_VARIABLE_LOCALS_OFFSET 1
+#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
+#define FIXED_LOCALS_OFFSET (3 * sizeof(sljit_w))
+#endif
#endif
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
Index: src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c
diff -u src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c:1.1.1.2 src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c:1.2
--- src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c:1.1.1.2 Sun Oct 28 09:36:22 2012
+++ src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_32.c Sun Nov 18 14:36:38 2012
@@ -136,7 +136,11 @@ SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
}
#endif
+#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
locals_offset = 2 * sizeof(sljit_uw);
+#else
+ locals_offset = 2 * sizeof(sljit_uw) + FIXED_LOCALS_OFFSET;
+#endif
compiler->temporaries_start = locals_offset;
if (temporaries > 3)
locals_offset += (temporaries - 3) * sizeof(sljit_uw);
@@ -146,19 +150,24 @@ SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
compiler->locals_offset = locals_offset;
local_size = locals_offset + ((local_size + sizeof(sljit_uw) - 1) & ~(sizeof(sljit_uw) - 1));
+ compiler->local_size = local_size;
#ifdef _WIN32
if (local_size > 1024) {
+#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
FAIL_IF(emit_do_imm(compiler, 0xb8 + reg_map[SLJIT_TEMPORARY_REG1], local_size));
+#else
+ local_size -= FIXED_LOCALS_OFFSET;
+ FAIL_IF(emit_do_imm(compiler, 0xb8 + reg_map[SLJIT_TEMPORARY_REG1], local_size));
+ FAIL_IF(emit_non_cum_binary(compiler, SUB_r_rm, SUB_rm_r, SUB, SUB_EAX_i32,
+ SLJIT_LOCALS_REG, 0, SLJIT_LOCALS_REG, 0, SLJIT_IMM, FIXED_LOCALS_OFFSET));
+#endif
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_grow_stack)));
}
#endif
- compiler->local_size = local_size;
SLJIT_ASSERT(local_size > 0);
return emit_non_cum_binary(compiler, 0x2b, 0x29, 0x5 << 3, 0x2d,
SLJIT_LOCALS_REG, 0, SLJIT_LOCALS_REG, 0, SLJIT_IMM, local_size);
-
- return SLJIT_SUCCESS;
}
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
@@ -175,7 +184,11 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_
compiler->logical_local_size = local_size;
#endif
+#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
locals_offset = 2 * sizeof(sljit_uw);
+#else
+ locals_offset = 2 * sizeof(sljit_uw) + FIXED_LOCALS_OFFSET;
+#endif
compiler->temporaries_start = locals_offset;
if (temporaries > 3)
locals_offset += (temporaries - 3) * sizeof(sljit_uw);
@@ -228,10 +241,7 @@ SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
else
RET();
#else
- if (compiler->args > 0)
- RETN(compiler->args * sizeof(sljit_w));
- else
- RET();
+ RET();
#endif
return SLJIT_SUCCESS;
@@ -433,14 +443,26 @@ static SLJIT_INLINE int call_with_args(s
*buf++ = 0x8b;
*buf++ = 0xc0 | (reg_map[SLJIT_TEMPORARY_REG3] << 3) | reg_map[SLJIT_TEMPORARY_REG1];
#else
- buf = (sljit_ub*)ensure_buf(compiler, type - SLJIT_CALL0 + 1);
+ buf = (sljit_ub*)ensure_buf(compiler, 1 + 4 * (type - SLJIT_CALL0));
FAIL_IF(!buf);
- INC_SIZE(type - SLJIT_CALL0);
- if (type >= SLJIT_CALL3)
- PUSH_REG(reg_map[SLJIT_TEMPORARY_REG3]);
- if (type >= SLJIT_CALL2)
- PUSH_REG(reg_map[SLJIT_TEMPORARY_REG2]);
- PUSH_REG(reg_map[SLJIT_TEMPORARY_REG1]);
+ INC_SIZE(4 * (type - SLJIT_CALL0));
+
+ *buf++ = 0x89;
+ *buf++ = 0x40 | (reg_map[SLJIT_TEMPORARY_REG1] << 3) | 0x4 /* SIB */;
+ *buf++ = (0x4 /* none*/ << 3) | reg_map[SLJIT_LOCALS_REG];
+ *buf++ = 0;
+ if (type >= SLJIT_CALL2) {
+ *buf++ = 0x89;
+ *buf++ = 0x40 | (reg_map[SLJIT_TEMPORARY_REG2] << 3) | 0x4 /* SIB */;
+ *buf++ = (0x4 /* none*/ << 3) | reg_map[SLJIT_LOCALS_REG];
+ *buf++ = sizeof(sljit_w);
+ }
+ if (type >= SLJIT_CALL3) {
+ *buf++ = 0x89;
+ *buf++ = 0x40 | (reg_map[SLJIT_TEMPORARY_REG3] << 3) | 0x4 /* SIB */;
+ *buf++ = (0x4 /* none*/ << 3) | reg_map[SLJIT_LOCALS_REG];
+ *buf++ = 2 * sizeof(sljit_w);
+ }
#endif
return SLJIT_SUCCESS;
}
Index: src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c
diff -u src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c:1.3 src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c:1.4
--- src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c:1.3 Sun Oct 28 09:38:59 2012
+++ src/sys/external/bsd/sljit/dist/sljit_src/sljitNativeX86_common.c Sun Nov 18 14:36:38 2012
@@ -2353,9 +2353,6 @@ SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
}
if (src == SLJIT_MEM1(SLJIT_LOCALS_REG) && type >= SLJIT_CALL3)
srcw += sizeof(sljit_w);
-#else
- if (src == SLJIT_MEM1(SLJIT_LOCALS_REG))
- srcw += sizeof(sljit_w) * (type - SLJIT_CALL0);
#endif
#endif
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && defined(_WIN64)