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)

Reply via email to