diff options
Diffstat (limited to 'src/mesa/x86/rtasm/x86sse.c')
-rw-r--r-- | src/mesa/x86/rtasm/x86sse.c | 83 |
1 files changed, 73 insertions, 10 deletions
diff --git a/src/mesa/x86/rtasm/x86sse.c b/src/mesa/x86/rtasm/x86sse.c index 0c9ffe25fa2..82a18f012a1 100644 --- a/src/mesa/x86/rtasm/x86sse.c +++ b/src/mesa/x86/rtasm/x86sse.c @@ -1,4 +1,4 @@ -#if defined(USE_X86_ASM) +#if defined(USE_X86_ASM) || defined(SLANG_X86) #include "imports.h" #include "x86sse.h" @@ -85,10 +85,10 @@ static void emit_modrm( struct x86_function *p, case mod_INDIRECT: break; case mod_DISP8: - emit_1b(p, regmem.disp); + emit_1b(p, regmem.disp);
break; case mod_DISP32: - emit_1i(p, regmem.disp); + emit_1i(p, regmem.disp);
break; default: assert(0); @@ -142,8 +142,8 @@ static void emit_op_modrm( struct x86_function *p, /* Create and manipulate registers and regmem values: */ -struct x86_reg x86_make_reg( GLuint file, - GLuint idx ) +struct x86_reg x86_make_reg( enum x86_reg_file file, + enum x86_reg_name idx ) { struct x86_reg reg; @@ -198,7 +198,7 @@ GLubyte *x86_get_label( struct x86_function *p ) void x86_jcc( struct x86_function *p, - GLuint cc, + enum x86_cc cc, GLubyte *label ) { GLint offset = label - (x86_get_label(p) + 2); @@ -217,11 +217,25 @@ void x86_jcc( struct x86_function *p, /* Always use a 32bit offset for forward jumps: */ GLubyte *x86_jcc_forward( struct x86_function *p, - GLuint cc ) + enum x86_cc cc ) { emit_2ub(p, 0x0f, 0x80 + cc); emit_1i(p, 0); return x86_get_label(p); +}
+
+GLubyte *x86_jmp_forward( struct x86_function *p)
+{
+ emit_1ub(p, 0xe9);
+ emit_1i(p, 0);
+ return x86_get_label(p);
+}
+
+GLubyte *x86_call_forward( struct x86_function *p)
+{
+ emit_1ub(p, 0xe8);
+ emit_1i(p, 0);
+ return x86_get_label(p);
} /* Fixup offset from forward jump: @@ -230,6 +244,29 @@ void x86_fixup_fwd_jump( struct x86_function *p, GLubyte *fixup ) { *(int *)(fixup - 4) = x86_get_label(p) - fixup; +}
+
+void x86_jmp( struct x86_function *p, GLubyte *label)
+{
+ emit_1ub(p, 0xe9);
+ emit_1i(p, label - x86_get_label(p) - 4);
+}
+
+void x86_call( struct x86_function *p, GLubyte *label)
+{
+ emit_1ub(p, 0xe8);
+ emit_1i(p, label - x86_get_label(p) - 4);
+}
+
+/* michal:
+ * Temporary. As I need immediate operands, and dont want to mess with the codegen,
+ * I load the immediate into general purpose register and use it.
+ */
+void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm )
+{
+ assert(dst.mod == mod_REG);
+ emit_1ub(p, 0xb8 + dst.idx);
+ emit_1i(p, imm);
} void x86_push( struct x86_function *p, @@ -307,6 +344,27 @@ void x86_test( struct x86_function *p, { emit_1ub(p, 0x85); emit_modrm( p, dst, src ); +}
+
+void x86_add( struct x86_function *p,
+ struct x86_reg dst,
+ struct x86_reg src )
+{
+ emit_op_modrm(p, 0x03, 0x01, dst, src );
+}
+
+void x86_mul( struct x86_function *p,
+ struct x86_reg src )
+{
+ assert (src.file == file_REG32 && src.mod == mod_REG);
+ emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src );
+}
+
+void x86_sub( struct x86_function *p,
+ struct x86_reg dst,
+ struct x86_reg src )
+{
+ emit_op_modrm(p, 0x2b, 0x29, dst, src );
} @@ -971,8 +1029,13 @@ struct x86_reg x86_fn_arg( struct x86_function *p, void x86_init_func( struct x86_function *p ) { - p->store = _mesa_exec_malloc(1024); - p->csr = p->store; + x86_init_func_size(p, 1024); +}
+
+void x86_init_func_size( struct x86_function *p, GLuint code_size )
+{
+ p->store = _mesa_exec_malloc(code_size);
+ p->csr = p->store;
} void x86_release_func( struct x86_function *p ) @@ -985,7 +1048,7 @@ void (*x86_get_func( struct x86_function *p ))(void) { if (DISASSEM) _mesa_printf("disassemble %p %p\n", p->store, p->csr); - return (void (*)())p->store; + return (void (*)(void))p->store; } #else |