aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/x86
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2008-02-13 12:35:16 +0000
committerKeith Whitwell <[email protected]>2008-02-13 12:36:32 +0000
commit8162d317d2f6f2dcc31f31c0c2d663c33dfee053 (patch)
treefca0447312e47867d8cea4d4e828b9bc58166352 /src/mesa/x86
parenta3534a27bfc9827a12d83f7b6464af98424cf8d4 (diff)
x86: emit absolute calls, as reallocating exec mem breaks relative ones
Diffstat (limited to 'src/mesa/x86')
-rw-r--r--src/mesa/x86/rtasm/x86sse.c13
-rw-r--r--src/mesa/x86/rtasm/x86sse.h3
2 files changed, 15 insertions, 1 deletions
diff --git a/src/mesa/x86/rtasm/x86sse.c b/src/mesa/x86/rtasm/x86sse.c
index 385fb84c01f..e944d00f9e8 100644
--- a/src/mesa/x86/rtasm/x86sse.c
+++ b/src/mesa/x86/rtasm/x86sse.c
@@ -278,11 +278,24 @@ void x86_jmp( struct x86_function *p, unsigned char *label)
emit_1i(p, label - x86_get_label(p) - 4);
}
+#if 0
+/* This doesn't work once we start reallocating & copying the
+ * generated code on buffer fills, because the call is relative to the
+ * current pc.
+ */
void x86_call( struct x86_function *p, void (*label)())
{
emit_1ub(p, 0xe8);
emit_1i(p, cptr(label) - x86_get_label(p) - 4);
}
+#else
+void x86_call( struct x86_function *p, struct x86_reg reg)
+{
+ emit_1ub(p, 0xff);
+ emit_modrm(p, reg, reg);
+}
+#endif
+
/* michal:
* Temporary. As I need immediate operands, and dont want to mess with the codegen,
diff --git a/src/mesa/x86/rtasm/x86sse.h b/src/mesa/x86/rtasm/x86sse.h
index d53b6d71a6b..c2aa416492e 100644
--- a/src/mesa/x86/rtasm/x86sse.h
+++ b/src/mesa/x86/rtasm/x86sse.h
@@ -119,7 +119,8 @@ void x86_fixup_fwd_jump( struct x86_function *p,
void x86_jmp( struct x86_function *p, unsigned char *label );
-void x86_call( struct x86_function *p, void (*label)() );
+/* void x86_call( struct x86_function *p, void (*label)() ); */
+void x86_call( struct x86_function *p, struct x86_reg reg);
/* michal:
* Temporary. As I need immediate operands, and dont want to mess with the codegen,