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)