unsigned int regs = 0;
int i;
- orc_program_append_code(program,".global _binary_dump_start\n");
- orc_program_append_code(program,"_binary_dump_start:\n");
+ orc_program_append_code(program,".global %s\n", program->name);
+ orc_program_append_code(program,"%s:\n", program->name);
for(i=0;i<16;i++){
if (program->used_regs[ORC_GP_REG_BASE + i] &&
}
rule->emit (program, rule->emit_user, insn);
} else {
- ORC_ASM_CODE(program,"No rule for: %s\n", opcode->name);
- program->error = TRUE;
+ ORC_PROGRAM_ERROR(program,"No rule for: %s", opcode->name);
}
for(k=0;k<opcode->n_dest;k++){
void orc_program_rewrite_vars2 (OrcProgram *program);
void orc_program_do_regs (OrcProgram *program);
+#if defined(HAVE_I386)
int _orc_default_target = ORC_TARGET_SSE;
+#elif defined(HAVE_AMD64)
+int _orc_default_target = ORC_TARGET_SSE;
+#elif defined(HAVE_ARM)
+int _orc_default_target = ORC_TARGET_ARM;
+#elif defined(HAVE_POWERPC)
+int _orc_default_target = ORC_TARGET_ALTIVEC;
+#else
+int _orc_default_target = ORC_TARGET_C;
+#endif
+
+
OrcProgram *
orc_program_new (void)
}
orc_program_assign_rules (program);
+ if (program->error) goto error;
+
orc_program_rewrite_vars (program);
+ if (program->error) goto error;
if (program->target != ORC_TARGET_C) {
orc_program_global_reg_alloc (program);
}
orc_program_rewrite_vars2 (program);
+ if (program->error) goto error;
if (program->target != ORC_TARGET_C) {
orc_program_allocate_codemem (program);
default:
break;
}
+ if (program->error) goto error;
- orc_program_dump_code (program);
-
- if (program->error) {
- ORC_ERROR("program failed to compile");
- return FALSE;
- }
return TRUE;
+error:
+ ORC_ERROR("program failed to compile");
+ return FALSE;
}
void
OrcInstruction *insn = program->insns + i;
insn->rule = insn->opcode->rules + program->target;
+
+ if (insn->rule == NULL || insn->rule->emit == NULL) {
+ ORC_PROGRAM_ERROR(program, "No rule for: %s", insn->opcode->name);
+ }
}
}
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");
+ orc_program_append_code(program,".global %s\n", program->name);
+ orc_program_append_code(program,"%s:\n", program->name);
if (x86_64) {
int i;
for(i=0;i<16;i++){
-TESTS = test1 test2
+TESTS = test1 test2 test3 test4
-noinst_PROGRAMS = test1 test2
+noinst_PROGRAMS = test1 test2 test3 test4
AM_CFLAGS = $(ORC_CFLAGS)
LIBS = $(ORC_LIBS)
--- /dev/null
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include <orc/orc.h>
+
+
+int error = FALSE;
+
+void test_opcode (const char *name);
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ OrcOpcode *opcode_list;
+ int n_opcodes;
+
+ orc_init();
+
+ n_opcodes = orc_opcode_get_list (&opcode_list);
+
+ //printf("%s", orc_target_get_asm_preamble (ORC_TARGET_C));
+
+ for(i=0;i<n_opcodes;i++){
+ printf("/* %s %d %d %p */\n",
+ opcode_list[i].name,
+ opcode_list[i].n_src,
+ opcode_list[i].n_dest,
+ opcode_list[i].emulate
+ );
+ test_opcode (opcode_list[i].name);
+ }
+
+ if (error) return 1;
+ return 0;
+}
+
+void
+test_opcode (const char *name)
+{
+ OrcProgram *p;
+ char s[40];
+ int ret;
+
+ p = orc_program_new_dss (2,2,2);
+
+ sprintf(s, "test_%s", name);
+ orc_program_set_name (p, s);
+
+ orc_program_append_str (p, name, "d1", "s1", "s2");
+
+ ret = orc_program_compile (p);
+ if (!ret) {
+ error = TRUE;
+ }
+
+ printf("%s", orc_program_get_asm_code (p));
+
+ orc_program_free (p);
+}
+
+
--- /dev/null
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include <orc/orc.h>
+
+
+int error = FALSE;
+
+void test_opcode (const char *name);
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ OrcOpcode *opcode_list;
+ int n_opcodes;
+
+ orc_init();
+
+ n_opcodes = orc_opcode_get_list (&opcode_list);
+
+ //printf("%s", orc_target_get_asm_preamble (ORC_TARGET_C));
+
+ for(i=0;i<n_opcodes;i++){
+ printf("/* %s %d %d %p */\n",
+ opcode_list[i].name,
+ opcode_list[i].n_src,
+ opcode_list[i].n_dest,
+ opcode_list[i].emulate
+ );
+ test_opcode (opcode_list[i].name);
+ }
+
+ if (error) return 1;
+ return 0;
+}
+
+void
+test_opcode (const char *name)
+{
+ OrcProgram *p;
+ char s[40];
+ int ret;
+
+ p = orc_program_new_dss (2,2,2);
+
+ sprintf(s, "test_%s", name);
+ orc_program_set_name (p, s);
+
+ orc_program_append_str (p, name, "d1", "s1", "s2");
+
+ ret = orc_program_compile_for_target (p, ORC_TARGET_ARM);
+ if (!ret) {
+ error = TRUE;
+ goto out;
+ }
+
+ printf("%s", orc_program_get_asm_code (p));
+
+out:
+ orc_program_free (p);
+}
+
+