diff options
author | David Schleef <ds@schleef.org> | 2009-03-02 15:27:57 -0800 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2009-03-02 15:27:57 -0800 |
commit | 1cc75c69bf3c0f225ff82b20b4ac13b5e80f33d2 (patch) | |
tree | c1b7b3823d93a23f2456a3533c1c4f88eaf4e2fa | |
parent | 277df32cf10b1896a2d868446efca7290ca126db (diff) | |
download | orc-1cc75c69bf3c0f225ff82b20b4ac13b5e80f33d2.tar.gz |
Remove types, use a size instead
-rw-r--r-- | examples/jit.c | 12 | ||||
-rw-r--r-- | examples/simple.c | 36 | ||||
-rw-r--r-- | orc/Makefile.am | 1 | ||||
-rw-r--r-- | orc/orcopcodes.c | 2 | ||||
-rw-r--r-- | orc/orcprogram.c | 30 | ||||
-rw-r--r-- | orc/orcprogram.h | 28 | ||||
-rw-r--r-- | orc/orcrule.c | 5 | ||||
-rw-r--r-- | orc/orcrules-mmx.c | 8 | ||||
-rw-r--r-- | orc/orcrules-sse.c | 11 | ||||
-rw-r--r-- | orc/orctype.c | 44 | ||||
-rw-r--r-- | orc/x86.h | 1 |
11 files changed, 55 insertions, 123 deletions
diff --git a/examples/jit.c b/examples/jit.c index 52cd1be..d3fc7f6 100644 --- a/examples/jit.c +++ b/examples/jit.c @@ -28,12 +28,12 @@ main (int argc, char *argv[]) p = orc_program_new (); - d1 = orc_program_add_destination (p, "s16", "d1"); - s1 = orc_program_add_source (p, "s16", "s1"); - s2 = orc_program_add_source (p, "s16", "s2"); - t1 = orc_program_add_temporary (p, "s16", "t1"); - offset = orc_program_add_constant (p, "s16", 1, "offset"); - shift = orc_program_add_constant (p, "s16", 1, "shift"); + d1 = orc_program_add_destination (p, 2, "d1"); + s1 = orc_program_add_source (p, 2, "s1"); + s2 = orc_program_add_source (p, 2, "s2"); + t1 = orc_program_add_temporary (p, 2, "t1"); + offset = orc_program_add_constant (p, 2, 1, "offset"); + shift = orc_program_add_constant (p, 2, 1, "shift"); orc_program_append (p, "add_s16", t1, s1, s2); orc_program_append (p, "add_s16", t1, t1, offset); diff --git a/examples/simple.c b/examples/simple.c index 1f32f7a..f1f3a72 100644 --- a/examples/simple.c +++ b/examples/simple.c @@ -37,7 +37,7 @@ test1(void) OrcProgram *p; OrcExecutor *ex; - p = orc_program_new_dss ("s16", "s16", "s16"); + p = orc_program_new_dss (2, 2, 2); orc_program_append_str (p, "add_s16", "d1", "s1", "s2"); @@ -83,16 +83,16 @@ test2(void) p = orc_program_new (); - d1 = orc_program_add_destination (p, "s16", "d1"); - s1 = orc_program_add_source (p, "s16", "s1"); - s2 = orc_program_add_source (p, "s16", "s2"); - s3 = orc_program_add_source (p, "s16", "s3"); - s4 = orc_program_add_source (p, "s16", "s4"); - c1 = orc_program_add_constant (p, "s16", 3, "c1"); - c2 = orc_program_add_constant (p, "s16", 4, "c2"); - c3 = orc_program_add_constant (p, "s16", 3, "c3"); - t1 = orc_program_add_temporary (p, "s16", "t1"); - t2 = orc_program_add_temporary (p, "s16", "t2"); + d1 = orc_program_add_destination (p, 2, "d1"); + s1 = orc_program_add_source (p, 2, "s1"); + s2 = orc_program_add_source (p, 2, "s2"); + s3 = orc_program_add_source (p, 2, "s3"); + s4 = orc_program_add_source (p, 2, "s4"); + c1 = orc_program_add_constant (p, 2, 3, "c1"); + c2 = orc_program_add_constant (p, 2, 4, "c2"); + c3 = orc_program_add_constant (p, 2, 3, "c3"); + t1 = orc_program_add_temporary (p, 2, "t1"); + t2 = orc_program_add_temporary (p, 2, "t2"); orc_program_append (p, "add_s16", t1, s2, s3); orc_program_append (p, "add_s16", t2, s1, s4); @@ -155,13 +155,13 @@ test3(void) p = orc_program_new (); - d1 = orc_program_add_destination (p, "s16", "d1"); - s1 = orc_program_add_source (p, "s16", "s1"); - s2 = orc_program_add_source (p, "s16", "s2"); - c1 = orc_program_add_constant (p, "s16", -1, "c1"); - c2 = orc_program_add_constant (p, "s16", 1, "c2"); - t1 = orc_program_add_temporary (p, "s16", "t1"); - t2 = orc_program_add_temporary (p, "s16", "t2"); + d1 = orc_program_add_destination (p, 2, "d1"); + s1 = orc_program_add_source (p, 2, "s1"); + s2 = orc_program_add_source (p, 2, "s2"); + c1 = orc_program_add_constant (p, 2, -1, "c1"); + c2 = orc_program_add_constant (p, 2, 1, "c2"); + t1 = orc_program_add_temporary (p, 2, "t1"); + t2 = orc_program_add_temporary (p, 2, "t2"); orc_program_append (p, "add_s16", t1, s1, s2); orc_program_append (p, "add_s16", t2, t1, c1); diff --git a/orc/Makefile.am b/orc/Makefile.am index 3b26b37..4b118c4 100644 --- a/orc/Makefile.am +++ b/orc/Makefile.am @@ -10,7 +10,6 @@ liborc_@ORC_MAJORMINOR@_la_SOURCES = \ orc.c \ orcexecutor.c \ orcrule.c \ - orctype.c \ orcprogram.c \ orcprogram-c.c \ orcprogram-powerpc.c \ diff --git a/orc/orcopcodes.c b/orc/orcopcodes.c index 86dbf27..bdb5b2f 100644 --- a/orc/orcopcodes.c +++ b/orc/orcopcodes.c @@ -95,8 +95,6 @@ convert_u8_s16 (OrcExecutor *ex, void *user) void orc_opcode_init (void) { - orc_opcode_register("_loadi_s16", 1, 1, move_s16, NULL); - orc_opcode_register("copy_s16", 1, 2, copy_s16, NULL); orc_opcode_register("add_s16", 1, 2, add_s16, NULL); orc_opcode_register("sub_s16", 1, 2, sub_s16, NULL); diff --git a/orc/orcprogram.c b/orc/orcprogram.c index 192e398..0130bb2 100644 --- a/orc/orcprogram.c +++ b/orc/orcprogram.c @@ -30,16 +30,15 @@ orc_program_new (void) } OrcProgram * -orc_program_new_dss (const char *type_d1, const char *type_s1, - const char *type_s2) +orc_program_new_dss (int size1, int size2, int size3) { OrcProgram *p; p = orc_program_new (); - orc_program_add_destination (p, type_d1, "d1"); - orc_program_add_source (p, type_d1, "s1"); - orc_program_add_source (p, type_d1, "s2"); + orc_program_add_destination (p, size1, "d1"); + orc_program_add_source (p, size2, "s1"); + orc_program_add_source (p, size3, "s2"); return p; } @@ -55,12 +54,12 @@ orc_program_free (OrcProgram *program) } int -orc_program_add_temporary (OrcProgram *program, const char *type, const char *name) +orc_program_add_temporary (OrcProgram *program, int size, const char *name) { int i = program->n_vars; program->vars[i].vartype = ORC_VAR_TYPE_TEMP; - program->vars[i].type = orc_type_get(type); + program->vars[i].size = size; program->vars[i].name = strdup(name); program->n_vars++; @@ -73,7 +72,7 @@ orc_program_dup_temporary (OrcProgram *program, int var, int j) int i = program->n_vars; program->vars[i].vartype = ORC_VAR_TYPE_TEMP; - program->vars[i].type = program->vars[var].type; + program->vars[i].size = program->vars[var].size; program->vars[i].name = malloc (strlen(program->vars[var].name) + 10); sprintf(program->vars[i].name, "%s.dup%d", program->vars[var].name, j); program->n_vars++; @@ -82,12 +81,12 @@ orc_program_dup_temporary (OrcProgram *program, int var, int j) } int -orc_program_add_source (OrcProgram *program, const char *type, const char *name) +orc_program_add_source (OrcProgram *program, int size, const char *name) { int i = program->n_vars; program->vars[i].vartype = ORC_VAR_TYPE_SRC; - program->vars[i].type = orc_type_get(type); + program->vars[i].size = size; program->vars[i].name = strdup(name); program->n_vars++; @@ -95,12 +94,12 @@ orc_program_add_source (OrcProgram *program, const char *type, const char *name) } int -orc_program_add_destination (OrcProgram *program, const char *type, const char *name) +orc_program_add_destination (OrcProgram *program, int size, const char *name) { int i = program->n_vars; program->vars[i].vartype = ORC_VAR_TYPE_DEST; - program->vars[i].type = orc_type_get(type); + program->vars[i].size = size; program->vars[i].name = strdup(name); program->n_vars++; @@ -108,12 +107,12 @@ orc_program_add_destination (OrcProgram *program, const char *type, const char * } int -orc_program_add_constant (OrcProgram *program, const char *type, int value, const char *name) +orc_program_add_constant (OrcProgram *program, int size, int value, const char *name) { int i = program->n_vars; program->vars[i].vartype = ORC_VAR_TYPE_CONST; - program->vars[i].type = orc_type_get(type); + program->vars[i].size = size; program->vars[i].s16 = value; program->vars[i].name = strdup(name); program->n_vars++; @@ -122,7 +121,8 @@ orc_program_add_constant (OrcProgram *program, const char *type, int value, cons } int -orc_program_add_parameter (OrcProgram *program, OrcType *type, int value, const char *name) +orc_program_add_parameter (OrcProgram *program, int size, int value, + const char *name) { return 0; diff --git a/orc/orcprogram.h b/orc/orcprogram.h index 8a7f775..7c0c8b1 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -4,7 +4,6 @@ //#include <glib.h> -typedef struct _OrcType OrcType; typedef struct _OrcExecutor OrcExecutor; typedef struct _OrcVariable OrcVariable; typedef struct _OrcOpcode OrcOpcode; @@ -32,7 +31,7 @@ typedef void (*OrcRuleEmitFunc)(OrcProgram *p, void *user, OrcInstruction *insn) #define ORC_REGCLASS_VEC 2 #define ORC_OPCODE_N_ARGS 4 -#define ORC_OPCODE_N_RULES 12 +#define ORC_OPCODE_N_TARGETS 10 #define ORC_STRUCT_OFFSET(struct_type, member) \ ((long) ((unsigned int *) &((struct_type*) 0)->member)) @@ -51,11 +50,6 @@ enum { ORC_TARGET_SSE = 3 }; -struct _OrcType { - char *name; - int size; -}; - typedef enum { ORC_VAR_TYPE_TEMP, ORC_VAR_TYPE_SRC, @@ -67,7 +61,7 @@ typedef enum { struct _OrcVariable { char *name; - OrcType *type; + int size; OrcVarType vartype; int used; @@ -95,9 +89,9 @@ struct _OrcOpcode { char *name; int n_src; int n_dest; - OrcType *arg_types[ORC_OPCODE_N_ARGS]; + int *arg_sizes[ORC_OPCODE_N_ARGS]; - OrcRule rules[ORC_OPCODE_N_RULES]; + OrcRule rules[ORC_OPCODE_N_TARGETS]; OrcOpcodeEmulateFunc emulate; void *emulate_user; @@ -189,8 +183,7 @@ struct _OrcExecutor { void orc_init (void); OrcProgram * orc_program_new (void); -OrcProgram * orc_program_new_dss (const char *type1, const char *type2, - const char *type3); +OrcProgram * orc_program_new_dss (int size1, int size2, int size3); OrcOpcode * orc_opcode_find_by_name (const char *name); void orc_opcode_init (void); @@ -218,11 +211,11 @@ void orc_program_free (OrcProgram *program); int orc_program_find_var_by_name (OrcProgram *program, const char *name); -int orc_program_add_temporary (OrcProgram *program, const char *type, const char *name); +int orc_program_add_temporary (OrcProgram *program, int size, const char *name); int orc_program_dup_temporary (OrcProgram *program, int i, int j); -int orc_program_add_source (OrcProgram *program, const char *type, const char *name); -int orc_program_add_destination (OrcProgram *program, const char *type, const char *name); -int orc_program_add_constant (OrcProgram *program, const char *type, int value, const char *name); +int orc_program_add_source (OrcProgram *program, int size, const char *name); +int orc_program_add_destination (OrcProgram *program, int size, const char *name); +int orc_program_add_constant (OrcProgram *program, int size, int value, const char *name); void orc_program_append (OrcProgram *program, const char *opcode, int arg0, int arg1, int arg2); @@ -230,9 +223,6 @@ void orc_program_x86_reset_alloc (OrcProgram *program); void orc_program_powerpc_reset_alloc (OrcProgram *program); -OrcType * orc_type_get (const char *name); -void orc_type_register (const char *name, int size); - OrcExecutor * orc_executor_new (OrcProgram *program); void orc_executor_free (OrcExecutor *ex); void orc_executor_set_array (OrcExecutor *ex, int var, void *ptr); diff --git a/orc/orcrule.c b/orc/orcrule.c index 70e06a4..c179aba 100644 --- a/orc/orcrule.c +++ b/orc/orcrule.c @@ -6,6 +6,7 @@ #include <stdlib.h> #include <orc/orcprogram.h> +#include <orc/orcdebug.h> void @@ -15,6 +16,10 @@ orc_rule_register (const char *opcode_name, unsigned int mode, OrcOpcode *opcode; opcode = orc_opcode_find_by_name (opcode_name); + if (opcode == NULL) { + ORC_ERROR("failed to find opcode \"%s\"", opcode_name); + return; + } opcode->rules[mode].emit = emit; opcode->rules[mode].emit_user = emit_user; diff --git a/orc/orcrules-mmx.c b/orc/orcrules-mmx.c index 473562d..3e6e68d 100644 --- a/orc/orcrules-mmx.c +++ b/orc/orcrules-mmx.c @@ -48,13 +48,6 @@ mmx_emit_loadi_s16 (OrcProgram *p, int reg, int value) } static void -mmx_rule_loadi_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - mmx_emit_loadi_s16 (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].s16); -} - -static void mmx_rule_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn) { printf(" paddw %%%s, %%%s\n", @@ -146,7 +139,6 @@ mmx_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) void orc_program_mmx_register_rules (void) { - orc_rule_register ("_loadi_s16", ORC_TARGET_MMX, mmx_rule_loadi_s16, NULL); orc_rule_register ("add_s16", ORC_TARGET_MMX, mmx_rule_add_s16, NULL); orc_rule_register ("sub_s16", ORC_TARGET_MMX, mmx_rule_sub_s16, NULL); orc_rule_register ("mul_s16", ORC_TARGET_MMX, mmx_rule_mul_s16, NULL); diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index 98a9a45..e1344c7 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -71,13 +71,6 @@ sse_emit_loadi_s16 (OrcProgram *p, int reg, int value) } static void -sse_rule_loadi_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - sse_emit_loadi_s16 (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].s16); -} - -static void sse_rule_copy_s16 (OrcProgram *p, void *user, OrcInstruction *insn) { printf(" movdqa %%%s, %%%s\n", @@ -85,7 +78,7 @@ sse_rule_copy_s16 (OrcProgram *p, void *user, OrcInstruction *insn) x86_get_regname_sse(p->vars[insn->args[0]].alloc)); *p->codeptr++ = 0x66; - x86_emit_rex (p, p->vars[insn->args[1]].alloc, + x86_emit_rex (p, 0, p->vars[insn->args[1]].alloc, 0, p->vars[insn->args[0]].alloc); *p->codeptr++ = 0x0f; *p->codeptr++ = 0x6f; @@ -206,8 +199,6 @@ sse_rule_convert_u8_s16 (OrcProgram *p, void *user, OrcInstruction *insn) void orc_program_sse_register_rules (void) { - orc_rule_register ("_loadi_s16", ORC_TARGET_SSE, sse_rule_loadi_s16, NULL); - orc_rule_register ("copy_s16", ORC_TARGET_SSE, sse_rule_copy_s16, NULL); orc_rule_register ("add_s16", ORC_TARGET_SSE, sse_rule_add_s16, NULL); orc_rule_register ("sub_s16", ORC_TARGET_SSE, sse_rule_sub_s16, NULL); diff --git a/orc/orctype.c b/orc/orctype.c deleted file mode 100644 index fbbe5ca..0000000 --- a/orc/orctype.c +++ /dev/null @@ -1,44 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - -OrcType *types; -static int n_types; -static int n_alloc_types; - -OrcType * -orc_type_get (const char *name) -{ - int i; - for(i=0;i<n_types;i++){ - if (!strcmp (types[i].name, name)) { - return types + i; - } - } - return NULL; -} - -void -orc_type_register (const char *name, int size) -{ - OrcType *type; - - if (n_types == n_alloc_types) { - n_alloc_types += 100; - types = realloc (types, sizeof(OrcType) * n_alloc_types); - } - - type = types + n_types; - type->name = strdup (name); - type->size = size; - - n_types++; -} - - - @@ -43,6 +43,7 @@ void x86_emit_je (OrcProgram *program, int label); void x86_emit_jne (OrcProgram *program, int label); void x86_emit_label (OrcProgram *program, int label); +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); void x86_emit_modrm_reg (OrcProgram *program, int reg1, int reg2); void x86_test (OrcProgram *program); |