From 330e3e4389764b1f68d5cc248355b6352d778b6c Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 6 Apr 2009 20:33:03 -0700 Subject: [PATCH] Improve errors, use long jumps on x86 --- orc/orccodemem.c | 3 +-- orc/orcprogram-sse.c | 2 ++ orc/x86.c | 22 ++++++++++++++++------ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/orc/orccodemem.c b/orc/orccodemem.c index b8659aa..a533893 100644 --- a/orc/orccodemem.c +++ b/orc/orccodemem.c @@ -26,8 +26,7 @@ orc_compiler_allocate_codemem (OrcCompiler *compiler) fd = mkstemp (filename); if (fd == -1) { /* FIXME oh crap */ - ORC_ERROR ("failed to create temp file"); - compiler->error = TRUE; + ORC_PROGRAM_ERROR (compiler, "failed to create temp file"); return; } unlink (filename); diff --git a/orc/orcprogram-sse.c b/orc/orcprogram-sse.c index ad42361..5d94a34 100644 --- a/orc/orcprogram-sse.c +++ b/orc/orcprogram-sse.c @@ -108,6 +108,8 @@ orc_compiler_sse_init (OrcCompiler *compiler) orc_program_get_max_var_size (compiler->program)); break; } + + compiler->long_jumps = TRUE; } void diff --git a/orc/x86.c b/orc/x86.c index bda38d7..6a365d7 100644 --- a/orc/x86.c +++ b/orc/x86.c @@ -151,7 +151,7 @@ x86_emit_push (OrcCompiler *compiler, int size, int reg) { if (size == 1) { - compiler->error = 1; + ORC_PROGRAM_ERROR(compiler, "bad size"); } else if (size == 2) { ORC_ASM_CODE(compiler," pushw %%%s\n", x86_get_regname_16(reg)); *compiler->codeptr++ = 0x66; @@ -167,7 +167,7 @@ x86_emit_pop (OrcCompiler *compiler, int size, int reg) { if (size == 1) { - compiler->error = 1; + ORC_PROGRAM_ERROR(compiler, "bad size"); } else if (size == 2) { ORC_ASM_CODE(compiler," popw %%%s\n", x86_get_regname_16(reg)); *compiler->codeptr++ = 0x66; @@ -869,7 +869,12 @@ void x86_emit_jmp (OrcCompiler *compiler, int label) (compiler->labels[label]!=NULL) ? 'b' : 'f'); if (compiler->long_jumps) { - ORC_PROGRAM_ERROR(compiler, "unimplemented"); + *compiler->codeptr++ = 0xe9; + x86_add_fixup (compiler, compiler->codeptr, label, 1); + *compiler->codeptr++ = 0xfc; + *compiler->codeptr++ = 0xff; + *compiler->codeptr++ = 0xff; + *compiler->codeptr++ = 0xff; } else { *compiler->codeptr++ = 0xeb; x86_add_fixup (compiler, compiler->codeptr, label, 0); @@ -883,7 +888,13 @@ void x86_emit_jle (OrcCompiler *compiler, int label) (compiler->labels[label]!=NULL) ? 'b' : 'f'); if (compiler->long_jumps) { - ORC_PROGRAM_ERROR(compiler, "unimplemented"); + *compiler->codeptr++ = 0x0f; + *compiler->codeptr++ = 0x8e; + x86_add_fixup (compiler, compiler->codeptr, label, 1); + *compiler->codeptr++ = 0xfc; + *compiler->codeptr++ = 0xff; + *compiler->codeptr++ = 0xff; + *compiler->codeptr++ = 0xff; } else { *compiler->codeptr++ = 0x7e; x86_add_fixup (compiler, compiler->codeptr, label, 0); @@ -950,8 +961,7 @@ x86_do_fixups (OrcCompiler *compiler) diff = ((int8_t)ptr[0]) + (label - ptr); if (diff != (int8_t)diff) { - ORC_WARNING("short jump too long"); - compiler->error = TRUE; + ORC_PROGRAM_ERROR(compiler, "short jump too long"); } ptr[0] = diff; -- 2.7.4