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;i<program->n_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 ();
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);
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
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;i<program->n_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 ();
program->vars[dest_var].is_aligned = FALSE;
- sse_emit_prologue (program);
+ x86_emit_prologue (program);
if (program->loop_shift > 0) {
program->loop_shift = save_loop_shift;
}
- sse_emit_epilogue (program);
+ x86_emit_epilogue (program);
- sse_do_fixups (program);
+ x86_do_fixups (program);
}
void
#include <orc/orcprogram.h>
#include <orc/x86.h>
+#include <orc/orcdebug.h>
+#include <orc/orcutils.h>
#ifdef HAVE_AMD64
int x86_64 = 1;
if (reg3 == 1 || (x86_get_regnum(reg3)>=8)) rex |= 0x1;
if (rex != 0x40) *program->codeptr++ = rex;
- //*program->codeptr++ = rex;
}
}
}
void
+x86_do_fixups (OrcProgram *program)
+{
+ int i;
+ for(i=0;i<program->n_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;
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);