From: David Schleef Date: Sun, 8 Mar 2009 23:51:21 +0000 (-0700) Subject: Move common x86 code to x86.c X-Git-Tag: orc-0.4.0~114 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c848d8677771cf6e7ecc4e579ff14ef545e2b915;p=platform%2Fupstream%2Forc.git Move common x86 code to x86.c --- diff --git a/orc/orcprogram-mmx.c b/orc/orcprogram-mmx.c index 8c677ee..aa61c82 100644 --- a/orc/orcprogram-mmx.c +++ b/orc/orcprogram-mmx.c @@ -24,64 +24,6 @@ void orc_program_rewrite_vars (OrcProgram *program); void orc_program_dump (OrcProgram *program); void -mmx_emit_prologue (OrcProgram *program) -{ - orc_program_append_code(program,".global test\n"); - orc_program_append_code(program,"test:\n"); - if (x86_64) { - - } else { - x86_emit_push (program, 4, X86_EBP); - x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP); - if (program->used_regs[X86_EDI]) { - x86_emit_push (program, 4, X86_EDI); - } - if (program->used_regs[X86_ESI]) { - x86_emit_push (program, 4, X86_ESI); - } - if (program->used_regs[X86_EBX]) { - x86_emit_push (program, 4, X86_EBX); - } - } -} - -void -mmx_emit_epilogue (OrcProgram *program) -{ - x86_emit_emms (program); - - if (x86_64) { - - } else { - if (program->used_regs[X86_EBX]) { - x86_emit_pop (program, 4, X86_EBX); - } - if (program->used_regs[X86_ESI]) { - x86_emit_pop (program, 4, X86_ESI); - } - if (program->used_regs[X86_EDI]) { - x86_emit_pop (program, 4, X86_EDI); - } - x86_emit_pop (program, 4, X86_EBP); - } - x86_emit_ret (program); -} - -void -mmx_do_fixups (OrcProgram *program) -{ - int i; - for(i=0;in_fixups;i++){ - if (program->fixups[i].type == 0) { - unsigned char *label = program->labels[program->fixups[i].label]; - unsigned char *ptr = program->fixups[i].ptr; - - ptr[0] += label - ptr; - } - } -} - -void orc_mmx_init (void) { orc_program_mmx_register_rules (); @@ -221,7 +163,7 @@ mmx_emit_store_dest (OrcProgram *program, OrcVariable *var) void orc_program_mmx_assemble (OrcProgram *program) { - mmx_emit_prologue (program); + x86_emit_prologue (program); x86_emit_mov_memoffset_reg (program, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n), x86_exec_ptr, X86_ECX); @@ -271,9 +213,10 @@ orc_program_mmx_assemble (OrcProgram *program) x86_emit_jne (program, 2); x86_emit_label (program, 3); - mmx_emit_epilogue (program); + x86_emit_emms (program); + x86_emit_epilogue (program); - mmx_do_fixups (program); + x86_do_fixups (program); } void diff --git a/orc/orcprogram-sse.c b/orc/orcprogram-sse.c index 6950bfb..445ee1c 100644 --- a/orc/orcprogram-sse.c +++ b/orc/orcprogram-sse.c @@ -25,76 +25,6 @@ void orc_program_rewrite_vars (OrcProgram *program); void orc_program_dump (OrcProgram *program); void -sse_emit_prologue (OrcProgram *program) -{ - orc_program_append_code(program,".global _binary_dump_start\n"); - orc_program_append_code(program,"_binary_dump_start:\n"); - if (x86_64) { - - } else { - x86_emit_push (program, 4, X86_EBP); - x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP); - if (program->used_regs[X86_EDI]) { - x86_emit_push (program, 4, X86_EDI); - } - if (program->used_regs[X86_ESI]) { - x86_emit_push (program, 4, X86_ESI); - } - if (program->used_regs[X86_EBX]) { - x86_emit_push (program, 4, X86_EBX); - } - } -} - -void -sse_emit_epilogue (OrcProgram *program) -{ - if (x86_64) { - - } else { - if (program->used_regs[X86_EBX]) { - x86_emit_pop (program, 4, X86_EBX); - } - if (program->used_regs[X86_ESI]) { - x86_emit_pop (program, 4, X86_ESI); - } - if (program->used_regs[X86_EDI]) { - x86_emit_pop (program, 4, X86_EDI); - } - x86_emit_pop (program, 4, X86_EBP); - } - x86_emit_ret (program); -} - -void -sse_do_fixups (OrcProgram *program) -{ - int i; - for(i=0;in_fixups;i++){ - if (program->fixups[i].type == 0) { - unsigned char *label = program->labels[program->fixups[i].label]; - unsigned char *ptr = program->fixups[i].ptr; - int diff; - - diff = ((int8_t)ptr[0]) + (label - ptr); - if (diff != (int8_t)diff) { - ORC_WARNING("short jump too long"); - program->error = TRUE; - } - - ptr[0] = diff; - } else if (program->fixups[i].type == 1) { - unsigned char *label = program->labels[program->fixups[i].label]; - unsigned char *ptr = program->fixups[i].ptr; - int diff; - - diff = ORC_READ_UINT32_LE (ptr) + (label - ptr); - ORC_WRITE_UINT32_LE(ptr, diff); - } - } -} - -void orc_sse_init (void) { orc_program_sse_register_rules (); @@ -266,7 +196,7 @@ orc_program_sse_assemble (OrcProgram *program) program->vars[dest_var].is_aligned = FALSE; - sse_emit_prologue (program); + x86_emit_prologue (program); if (program->loop_shift > 0) { @@ -382,9 +312,9 @@ orc_program_sse_assemble (OrcProgram *program) program->loop_shift = save_loop_shift; } - sse_emit_epilogue (program); + x86_emit_epilogue (program); - sse_do_fixups (program); + x86_do_fixups (program); } void diff --git a/orc/x86.c b/orc/x86.c index 593c52b..3e7313a 100644 --- a/orc/x86.c +++ b/orc/x86.c @@ -10,6 +10,8 @@ #include #include +#include +#include #ifdef HAVE_AMD64 int x86_64 = 1; @@ -226,7 +228,6 @@ x86_emit_rex (OrcProgram *program, int size, int reg1, int reg2, int reg3) if (reg3 == 1 || (x86_get_regnum(reg3)>=8)) rex |= 0x1; if (rex != 0x40) *program->codeptr++ = rex; - //*program->codeptr++ = rex; } } @@ -925,6 +926,76 @@ void x86_emit_label (OrcProgram *program, int label) } void +x86_do_fixups (OrcProgram *program) +{ + int i; + for(i=0;in_fixups;i++){ + if (program->fixups[i].type == 0) { + unsigned char *label = program->labels[program->fixups[i].label]; + unsigned char *ptr = program->fixups[i].ptr; + int diff; + + diff = ((int8_t)ptr[0]) + (label - ptr); + if (diff != (int8_t)diff) { + ORC_WARNING("short jump too long"); + program->error = TRUE; + } + + ptr[0] = diff; + } else if (program->fixups[i].type == 1) { + unsigned char *label = program->labels[program->fixups[i].label]; + unsigned char *ptr = program->fixups[i].ptr; + int diff; + + diff = ORC_READ_UINT32_LE (ptr) + (label - ptr); + ORC_WRITE_UINT32_LE(ptr, diff); + } + } +} + +void +x86_emit_prologue (OrcProgram *program) +{ + orc_program_append_code(program,".global _binary_dump_start\n"); + orc_program_append_code(program,"_binary_dump_start:\n"); + if (x86_64) { + + } else { + x86_emit_push (program, 4, X86_EBP); + x86_emit_mov_memoffset_reg (program, 4, 8, X86_ESP, X86_EBP); + if (program->used_regs[X86_EDI]) { + x86_emit_push (program, 4, X86_EDI); + } + if (program->used_regs[X86_ESI]) { + x86_emit_push (program, 4, X86_ESI); + } + if (program->used_regs[X86_EBX]) { + x86_emit_push (program, 4, X86_EBX); + } + } +} + +void +x86_emit_epilogue (OrcProgram *program) +{ + if (x86_64) { + + } else { + if (program->used_regs[X86_EBX]) { + x86_emit_pop (program, 4, X86_EBX); + } + if (program->used_regs[X86_ESI]) { + x86_emit_pop (program, 4, X86_ESI); + } + if (program->used_regs[X86_EDI]) { + x86_emit_pop (program, 4, X86_EDI); + } + x86_emit_pop (program, 4, X86_EBP); + } + x86_emit_ret (program); +} + +void x86_emit_align (OrcProgram *program) { int diff; diff --git a/orc/x86.h b/orc/x86.h index e32d538..199cf67 100644 --- a/orc/x86.h +++ b/orc/x86.h @@ -50,6 +50,9 @@ void x86_emit_jne (OrcProgram *program, int label); void x86_emit_jmp (OrcProgram *program, int label); void x86_emit_label (OrcProgram *program, int label); void x86_emit_align (OrcProgram *program); +void x86_do_fixups (OrcProgram *program); +void x86_emit_prologue (OrcProgram *program); +void x86_emit_epilogue (OrcProgram *program); void x86_emit_rex (OrcProgram *program, int size, int reg1, int reg2, int reg3); void x86_emit_modrm_memoffset (OrcProgram *program, int reg1, int offset, int reg2);