summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2009-03-02 15:27:57 -0800
committerDavid Schleef <ds@schleef.org>2009-03-02 15:27:57 -0800
commit1cc75c69bf3c0f225ff82b20b4ac13b5e80f33d2 (patch)
treec1b7b3823d93a23f2456a3533c1c4f88eaf4e2fa
parent277df32cf10b1896a2d868446efca7290ca126db (diff)
downloadorc-1cc75c69bf3c0f225ff82b20b4ac13b5e80f33d2.tar.gz
Remove types, use a size instead
-rw-r--r--examples/jit.c12
-rw-r--r--examples/simple.c36
-rw-r--r--orc/Makefile.am1
-rw-r--r--orc/orcopcodes.c2
-rw-r--r--orc/orcprogram.c30
-rw-r--r--orc/orcprogram.h28
-rw-r--r--orc/orcrule.c5
-rw-r--r--orc/orcrules-mmx.c8
-rw-r--r--orc/orcrules-sse.c11
-rw-r--r--orc/orctype.c44
-rw-r--r--orc/x86.h1
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++;
-}
-
-
-
diff --git a/orc/x86.h b/orc/x86.h
index ce6ed84..91a6b92 100644
--- a/orc/x86.h
+++ b/orc/x86.h
@@ -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);