diff options
author | David Schleef <ds@schleef.org> | 2008-06-30 15:19:40 -0700 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2008-06-30 15:19:40 -0700 |
commit | f3cb425bb04f18a7aff87913cfa00e4cb346dfbe (patch) | |
tree | 3b33731fd19fd6fa59f21c77438436b866582846 | |
parent | b3208ae93e99f0d6259d1e49f995bf9c6c00b430 (diff) | |
download | liboil-f3cb425bb04f18a7aff87913cfa00e4cb346dfbe.tar.gz |
Move orc into separate package
-rw-r--r-- | Makefile.am | 10 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | examples/Makefile.am | 2 | ||||
-rw-r--r-- | examples/orc/Makefile.am | 10 | ||||
-rw-r--r-- | examples/orc/jit.c | 96 | ||||
-rw-r--r-- | examples/orc/simple.c | 141 | ||||
-rw-r--r-- | orc-uninstalled.pc.in | 10 | ||||
-rw-r--r-- | orc.pc.in | 14 | ||||
-rw-r--r-- | orc/Makefile.am | 41 | ||||
-rw-r--r-- | orc/orc.c | 21 | ||||
-rw-r--r-- | orc/orc.h | 8 | ||||
-rw-r--r-- | orc/orcexecutor.c | 112 | ||||
-rw-r--r-- | orc/orcopcodes.c | 101 | ||||
-rw-r--r-- | orc/orcprogram-c.c | 199 | ||||
-rw-r--r-- | orc/orcprogram-linux.c | 54 | ||||
-rw-r--r-- | orc/orcprogram-powerpc.c | 732 | ||||
-rw-r--r-- | orc/orcprogram-unknown-os.c | 58 | ||||
-rw-r--r-- | orc/orcprogram-x86.c | 448 | ||||
-rw-r--r-- | orc/orcprogram.c | 524 | ||||
-rw-r--r-- | orc/orcprogram.h | 274 | ||||
-rw-r--r-- | orc/orcrule.c | 23 | ||||
-rw-r--r-- | orc/orcrules-mmx.c | 162 | ||||
-rw-r--r-- | orc/orcrules-sse.c | 171 | ||||
-rw-r--r-- | orc/orcrules-x86.c | 145 | ||||
-rw-r--r-- | orc/orctype.c | 44 | ||||
-rw-r--r-- | orc/test.c | 21 | ||||
-rw-r--r-- | orc/x86.c | 749 | ||||
-rw-r--r-- | orc/x86.h | 101 |
28 files changed, 3 insertions, 4278 deletions
diff --git a/Makefile.am b/Makefile.am index c1916fe..a6cf4ef 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,13 +1,13 @@ AUTOMAKE_OPTIONS = foreign -SUBDIRS = liboil orc testsuite examples doc +SUBDIRS = liboil testsuite examples doc EXTRA_DIST = COPYING autogen.sh gtk-doc.make HACKING BUG-REPORTING DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc -pkgconfig_DATA = liboil-$(LIBOIL_MAJORMINOR).pc orc-$(LIBOIL_MAJORMINOR).pc +pkgconfig_DATA = liboil-$(LIBOIL_MAJORMINOR).pc liboil-$(LIBOIL_MAJORMINOR).pc: liboil.pc cp liboil.pc liboil-$(LIBOIL_MAJORMINOR).pc @@ -15,12 +15,6 @@ liboil-$(LIBOIL_MAJORMINOR).pc: liboil.pc liboil-$(LIBOIL_MAJORMINOR)-uninstalled.pc: liboil-uninstalled.pc cp liboil-uninstalled.pc liboil-$(LIBOIL_MAJORMINOR)-uninstalled.pc -orc-$(LIBOIL_MAJORMINOR).pc: orc.pc - cp orc.pc orc-$(LIBOIL_MAJORMINOR).pc - -orc-$(LIBOIL_MAJORMINOR)-uninstalled.pc: orc-uninstalled.pc - cp orc-uninstalled.pc orc-$(LIBOIL_MAJORMINOR)-uninstalled.pc - BUILT_SOURCES=liboil-$(LIBOIL_MAJORMINOR)-uninstalled.pc CLEANFILES = liboil-$(LIBOIL_MAJORMINOR).pc liboil-$(LIBOIL_MAJORMINOR)-uninstalled.pc diff --git a/configure.ac b/configure.ac index 8e50616..f919597 100644 --- a/configure.ac +++ b/configure.ac @@ -249,12 +249,6 @@ AC_SUBST(LIBOIL_CFLAGS) LIBOIL_LIBS="\$(top_builddir)/liboil/liboil-$LIBOIL_MAJORMINOR.la $LIBM $LIBRT" AC_SUBST(LIBOIL_LIBS) -ORC_CFLAGS="$LIBOIL_CFLAGS" -AC_SUBST(ORC_CFLAGS) - -ORC_LIBS="\$(top_builddir)/orc/liborc-$LIBOIL_MAJORMINOR.la $LIBOIL_LIBS" -AC_SUBST(ORC_LIBS) - pkgconfigdir="\$(libdir)/pkgconfig" AC_SUBST(pkgconfigdir) @@ -285,7 +279,6 @@ liboil/simdpack/Makefile liboil/sse/Makefile liboil/utf8/Makefile liboil/arm/Makefile -orc/Makefile testsuite/Makefile testsuite/instruction/Makefile examples/Makefile @@ -293,15 +286,12 @@ examples/audioresample/Makefile examples/huffman/Makefile examples/jpeg/Makefile examples/md5/Makefile -examples/orc/Makefile examples/taylor/Makefile examples/uberopt/Makefile examples/videoscale/Makefile examples/work/Makefile liboil-uninstalled.pc liboil.pc -orc-uninstalled.pc -orc.pc ]) AC_OUTPUT diff --git a/examples/Makefile.am b/examples/Makefile.am index ef1be76..7e02624 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = jpeg md5 uberopt work huffman taylor videoscale audioresample orc +SUBDIRS = jpeg md5 uberopt work huffman taylor videoscale audioresample bin_PROGRAMS = oil-bugreport diff --git a/examples/orc/Makefile.am b/examples/orc/Makefile.am deleted file mode 100644 index c91a3d8..0000000 --- a/examples/orc/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ - -noinst_PROGRAMS = jit simple - -AM_LDFLAGS = $(ORC_LIBS) -AM_CFLAGS = $(ORC_CFLAGS) - -jit_SOURCES = jit.c - -simple_SOURCES = simple.c - diff --git a/examples/orc/jit.c b/examples/orc/jit.c deleted file mode 100644 index 9f40a73..0000000 --- a/examples/orc/jit.c +++ /dev/null @@ -1,96 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - -#define N 20 - -int16_t src1[N]; -int16_t src2[N]; -int16_t dest[N]; - -void test(OrcExecutor *ex); - -int -main (int argc, char *argv[]) -{ - OrcProgram *p; - OrcExecutor *ex; - int s1, s2, d1, offset, shift; - int t1; - - orc_init (); - - 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"); - - orc_program_append (p, "add_s16", t1, s1, s2); - orc_program_append (p, "add_s16", t1, t1, offset); - orc_program_append (p, "rshift_s16", d1, t1, shift); - -#if 0 - orc_program_append (p, "lshift_s16", d1, s1, shift); - //orc_program_append (p, "sub_s16", t1, t1, shift); - //orc_program_append (p, "mul_s16", d1, s1, s2); - //orc_program_append (p, "_loadi_s16", t1, t1, shift); -#endif - - orc_program_compile (p); - - if (1) { - int i; - - for(i=0;i<N;i++){ - src1[i] = rand()&0xf; - src2[i] = rand()&0xf; - } - - ex = orc_executor_new (p); - - orc_executor_set_n (ex, N); - orc_executor_set_array (ex, s1, src1); - orc_executor_set_array (ex, s2, src2); - orc_executor_set_array (ex, d1, dest); - - printf("#code exec %p\n", ex->program->code_exec); - - orc_executor_run (ex); - //orc_executor_emulate (ex); - - for(i=0;i<N;i++){ - printf("# %4d %4d %4d %4d\n", src1[i], src2[i], dest[i], - (src1[i] + src2[i] + 1) >> 1); - } - - orc_executor_free (ex); - } - - orc_program_free (p); - - return 0; -} - - - -void -test1 (int16_t *dest, int16_t *src1, int16_t *src2, int n) -{ - int i; - int16_t t1, t2; - for(i=0;i<n;i++){ - t1 = src1[i] + src2[i]; - t2 = t1 + 1; - dest[i] = t2>>1; - } -} - diff --git a/examples/orc/simple.c b/examples/orc/simple.c deleted file mode 100644 index ef75e86..0000000 --- a/examples/orc/simple.c +++ /dev/null @@ -1,141 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - -#define N 20 - -int16_t src1[N+4]; -int16_t src2[N]; -int16_t dest_test[N]; -int16_t dest_ref[N]; -int16_t dest[N]; - -void test1(void); -void test2(void); - -int -main (int argc, char *argv[]) -{ - orc_init (); - - test2(); - - exit(0); -} - - -void -test1(void) -{ - OrcProgram *p; - OrcExecutor *ex; - int s1, s2, d1; - - 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"); - - orc_program_append (p, "add_s16", d1, s1, s2); - - orc_program_compile (p); - - ex = orc_executor_new (p); - orc_executor_set_n (ex, N); - orc_executor_set_array (ex, s1, src1); - orc_executor_set_array (ex, s2, src2); - orc_executor_set_array (ex, d1, dest); - - if (1) { - int i; - - for(i=0;i<N;i++){ - src1[i] = rand()&0xf; - src2[i] = rand()&0x3; - } - - orc_executor_run (ex); - //orc_executor_emulate (ex); - - for(i=0;i<N;i++){ - printf("# %4d %4d %4d %4d\n", src1[i], src2[i], dest[i], - src1[i] + src2[i]); - } - } - - orc_executor_free (ex); - orc_program_free (p); -} - - -void -test2(void) -{ - OrcProgram *p; - OrcExecutor *ex; - int s1, s2, s3, s4, d1; - int t1, t2; - int c1, c2, c3; - - 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"); - - orc_program_append (p, "add_s16", t1, s2, s3); - orc_program_append (p, "add_s16", t2, s1, s4); - orc_program_append (p, "mul_s16", t1, t1, c1); - orc_program_append (p, "sub_s16", t1, t1, t2); - orc_program_append (p, "add_s16", t1, t1, c2); - orc_program_append (p, "rshift_s16", d1, t1, c3); - - orc_program_compile (p); - - ex = orc_executor_new (p); - orc_executor_set_n (ex, N); - orc_executor_set_array (ex, s1, src1); - orc_executor_set_array (ex, s2, src1 + 1); - orc_executor_set_array (ex, s3, src1 + 2); - orc_executor_set_array (ex, s4, src1 + 3); - - if (1) { - int i; - - for(i=0;i<N+3;i++){ - src1[i] = rand()&0xff; - } - - orc_executor_set_array (ex, d1, dest_ref); - orc_executor_emulate (ex); - for(i=0;i<N;i++){ - dest_ref[i] = (3*(src1[i+1]+src1[i+2])-(src1[i]+src1[i+3])+4)>>3; - } - - orc_executor_set_array (ex, d1, dest_test); - orc_executor_run (ex); - - for(i=0;i<N;i++){ - printf("# %4d %4d %4d %c\n", src1[i], dest_ref[i], dest_test[i], - (dest_ref[i] == dest_test[i])?' ':'*'); - } - } - - orc_executor_free (ex); - orc_program_free (p); -} - - diff --git a/orc-uninstalled.pc.in b/orc-uninstalled.pc.in deleted file mode 100644 index 00e6bad..0000000 --- a/orc-uninstalled.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/orc/ -includedir=${pcfiledir}/ - -Name: orc-@LIBOIL_MAJORMINOR@ uninstalled -Description: Library of Optimized Inner Loops Runtime Compiler -Version: @VERSION@ -Libs: -L${libdir} -lorc-@LIBOIL_MAJORMINOR@ @LIBM@ @LIBRT@ -Cflags: -I${includedir} diff --git a/orc.pc.in b/orc.pc.in deleted file mode 100644 index 2347be7..0000000 --- a/orc.pc.in +++ /dev/null @@ -1,14 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@/orc-@LIBOIL_MAJORMINOR@ -toolsdir=${exec_prefix}/bin - - -Name: orc-@LIBOIL_MAJORMINOR@ -Description: Library of Optimized Inner Loops Runtime Compiler -Version: @VERSION@ -Libs: -L${libdir} -lorc-@LIBOIL_MAJORMINOR@ @LIBM@ @LIBRT@ -Cflags: -I${includedir} - - diff --git a/orc/Makefile.am b/orc/Makefile.am deleted file mode 100644 index b46eaac..0000000 --- a/orc/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ - -pkgincludedir = $(includedir)/orc-@LIBOIL_MAJORMINOR@/orc - -lib_LTLIBRARIES = liborc-@LIBOIL_MAJORMINOR@.la - -liborc_@LIBOIL_MAJORMINOR@_la_LIBS = $(LIBOIL_LIBS) $(GLIB_LIBS) -liborc_@LIBOIL_MAJORMINOR@_la_CFLAGS = $(LIBOIL_CFLAGS) $(GLIB_CFLAGS) -liborc_@LIBOIL_MAJORMINOR@_la_LDFLAGS = \ - -no-undefined \ - -version-info $(LIBOIL_LIBVERSION) \ - -export-symbols-regex '^orc_' - - -liborc_@LIBOIL_MAJORMINOR@_la_SOURCES = \ - orc.c \ - orcexecutor.c \ - orcrule.c \ - orctype.c \ - orcprogram.c \ - orcprogram-c.c \ - orcprogram-x86.c \ - orcprogram-powerpc.c \ - orcprogram.h \ - orcopcodes.c \ - orcrules-mmx.c \ - orcrules-x86.c \ - orcrules-sse.c \ - x86.c - -if HAVE_OS_LINUX -liborc_@LIBOIL_MAJORMINOR@_la_SOURCES += orcprogram-linux.c -else -liborc_@LIBOIL_MAJORMINOR@_la_SOURCES += orcprogram-unknown-os.c -endif - - -pkginclude_HEADERS = \ - orc.h \ - orcprogram.h \ - x86.h - diff --git a/orc/orc.c b/orc/orc.c deleted file mode 100644 index 27b4d35..0000000 --- a/orc/orc.c +++ /dev/null @@ -1,21 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <liboil/liboil.h> -#include <orc/orcprogram.h> - - -void -orc_init (void) -{ - //oil_init (); - orc_opcode_init(); - orc_x86_init(); - orc_powerpc_init(); - orc_c_init(); -} - diff --git a/orc/orc.h b/orc/orc.h deleted file mode 100644 index ec27285..0000000 --- a/orc/orc.h +++ /dev/null @@ -1,8 +0,0 @@ - -#ifndef _ORC_ORC_H_ -#define _ORC_ORC_H_ - -#include <orc/orcprogram.h> - -#endif - diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c deleted file mode 100644 index 8c221ff..0000000 --- a/orc/orcexecutor.c +++ /dev/null @@ -1,112 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - - -OrcExecutor * -orc_executor_new (OrcProgram *program) -{ - OrcExecutor *ex; - - ex = malloc(sizeof(OrcExecutor)); - memset(ex,0,sizeof(OrcExecutor)); - - ex->program = program; - - memcpy (ex->vars, program->vars, 10*sizeof(OrcVariable)); - - return ex; -} - -void -orc_executor_free (OrcExecutor *ex) -{ - free (ex); -} - -void -orc_executor_run (OrcExecutor *ex) -{ - void (*func) (OrcExecutor *); - - func = ex->program->code_exec; - func (ex); -} - -void -orc_executor_set_array (OrcExecutor *ex, int var, void *ptr) -{ - ex->arrays[var] = ptr; -} - -void -orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr) -{ - int var; - var = orc_program_find_var_by_name (ex->program, name); - ex->arrays[var] = ptr; -} - -void -orc_executor_set_n (OrcExecutor *ex, int n) -{ - ex->n = n; -} - -void -orc_executor_emulate (OrcExecutor *ex) -{ - int i; - int j; - int k; - OrcProgram *program = ex->program; - OrcInstruction *insn; - OrcOpcode *opcode; - - //printf("n %d\n", ex->n); - //printf("n_insns %d\n", program->n_insns); - - for(i=0;i<ex->n;i++){ - for(j=0;j<program->n_insns;j++){ - insn = program->insns + j; - opcode = insn->opcode; - - //printf("%d: %s\n", j, insn->opcode->name); - - /* set up args */ - for(k=0;k<opcode->n_src + opcode->n_dest;k++){ - ex->args[k] = ex->vars + insn->args[k]; - - //printf("setting up arg %d as var %d vartype %d\n", - // k, insn->args[k], ex->args[k]->vartype); - - if (ex->args[k]->vartype == ORC_VAR_TYPE_SRC) { - void *ptr = ex->arrays[insn->args[k]] + 2*i; - - //printf("load %p\n", ptr); - ex->args[k]->s16 = *(int16_t *)ptr; - } - } - - opcode->emulate (ex, opcode->emulate_user); - //printf("emulate: %d %d %d\n", ex->args[0]->s16, - // ex->args[1]->s16, ex->args[2]->s16); - - for(k=0;k<opcode->n_src + opcode->n_dest;k++){ - if (ex->args[k]->vartype == ORC_VAR_TYPE_DEST) { - void *ptr = ex->arrays[insn->args[k]] + 2*i; - - //printf("store %p\n", ptr); - *(int16_t *)ptr = ex->args[k]->s16; - } - } - } - } -} - - diff --git a/orc/orcopcodes.c b/orc/orcopcodes.c deleted file mode 100644 index 1ec3ea7..0000000 --- a/orc/orcopcodes.c +++ /dev/null @@ -1,101 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - - -static OrcOpcode *opcode_list; -static int n_opcodes; -static int n_opcodes_alloc; - - - -void -orc_opcode_register (const char *name, int n_dest, int n_src, - OrcOpcodeEmulateFunc emulate, void *user) -{ - OrcOpcode *opcode; - - if (n_opcodes == n_opcodes_alloc) { - n_opcodes_alloc += 100; - opcode_list = realloc(opcode_list, sizeof(OrcOpcode) * n_opcodes_alloc); - } - - opcode = opcode_list + n_opcodes; - - opcode->name = strdup (name); - opcode->n_src = n_src; - opcode->n_dest = n_dest; - opcode->emulate = emulate; - opcode->emulate_user = user; - - n_opcodes++; -} - -OrcOpcode * -orc_opcode_find_by_name (const char *name) -{ - int i; - - for(i=0;i<n_opcodes;i++){ - if (!strcmp (name, opcode_list[i].name)) { - return opcode_list + i; - } - } - - return NULL; -} - -static void -move_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = ex->args[1]->s16; -} - -static void -add_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = (int16_t)(ex->args[1]->s16 + ex->args[2]->s16); -} - -static void -sub_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = (int16_t)(ex->args[1]->s16 - ex->args[2]->s16); -} - -static void -mul_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = (int16_t)(ex->args[1]->s16 * ex->args[2]->s16); -} - -static void -lshift_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = (int16_t)(ex->args[1]->s16 << ex->args[2]->s16); -} - -static void -rshift_s16 (OrcExecutor *ex, void *user) -{ - ex->args[0]->s16 = (int16_t)(ex->args[1]->s16 >> ex->args[2]->s16); -} - -void -orc_opcode_init (void) -{ - orc_opcode_register("_loadi_s16", 1, 1, move_s16, NULL); - - orc_opcode_register("add_s16", 1, 2, add_s16, NULL); - orc_opcode_register("sub_s16", 1, 2, sub_s16, NULL); - orc_opcode_register("mul_s16", 1, 2, mul_s16, NULL); - orc_opcode_register("lshift_s16", 1, 2, lshift_s16, NULL); - orc_opcode_register("rshift_s16", 1, 2, rshift_s16, NULL); -} - - diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c deleted file mode 100644 index a2bdd91..0000000 --- a/orc/orcprogram-c.c +++ /dev/null @@ -1,199 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - - -void orc_c_init (void); - -void -orc_program_assemble_c (OrcProgram *program) -{ - int i; - int j; - OrcInstruction *insn; - OrcOpcode *opcode; - OrcRule *rule; - - printf("\n"); - printf("void\n"); - printf("test (OrcExecutor *ex)\n"); - printf("{\n"); - printf(" int i;\n"); - - for(i=0;i<program->n_vars;i++){ - OrcVariable *var = program->vars + i; - switch (var->vartype) { - case ORC_VAR_TYPE_CONST: - printf(" int16_t var%d = %d;\n", i, var->s16); - break; - case ORC_VAR_TYPE_TEMP: - printf(" int16_t var%d;\n", i); - break; - case ORC_VAR_TYPE_SRC: - case ORC_VAR_TYPE_DEST: - printf(" int16_t *var%d = ex->var%d;\n", i, i); - break; - case ORC_VAR_TYPE_PARAM: - printf(" int16_t var%d = ex->var%d;\n", i, i); - break; - default: - break; - } - - } - - printf("\n"); - printf(" for (i = 0; i < n; i++) {\n"); - - for(j=0;j<program->n_insns;j++){ - insn = program->insns + j; - opcode = insn->opcode; - - printf(" // %d: %s\n", j, insn->opcode->name); - -#if 0 - for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_SRC: - x86_emit_load_src (program, args[k]); - break; - case ORC_VAR_TYPE_CONST: - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } -#endif - - rule = insn->rule; - if (rule) { - rule->emit (program, rule->emit_user, insn); - } else { - printf("No rule for: %s\n", opcode->name); - } - -#if 0 - for(k=0;k<opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_DEST: - x86_emit_store_dest (program, args[k]); - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } -#endif - } - - printf(" }\n"); - printf("}\n"); - printf("\n"); -} - - -/* rules */ - -static void -c_get_name (char *name, OrcProgram *p, int var) -{ - switch (p->vars[var].vartype) { - case ORC_VAR_TYPE_CONST: - case ORC_VAR_TYPE_PARAM: - case ORC_VAR_TYPE_TEMP: - sprintf(name, "var%d", var); - break; - case ORC_VAR_TYPE_SRC: - case ORC_VAR_TYPE_DEST: - sprintf(name, "var%d[i]", var); - break; - default: - sprintf(name, "ERROR"); - break; - } - -} - -static void -c_rule_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - char dest[20], src1[20], src2[20]; - - c_get_name (dest, p, insn->args[0]); - c_get_name (src1, p, insn->args[1]); - c_get_name (src2, p, insn->args[2]); - - printf (" %s = %s + %s;\n", dest, src1, src2); -} - -static void -c_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - char dest[20], src1[20], src2[20]; - - c_get_name (dest, p, insn->args[0]); - c_get_name (src1, p, insn->args[1]); - c_get_name (src2, p, insn->args[2]); - - printf (" %s = %s - %s;\n", dest, src1, src2); -} - -static void -c_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - char dest[20], src1[20], src2[20]; - - c_get_name (dest, p, insn->args[0]); - c_get_name (src1, p, insn->args[1]); - c_get_name (src2, p, insn->args[2]); - - printf (" %s = %s * %s;\n", dest, src1, src2); -} - -static void -c_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - char dest[20], src1[20], src2[20]; - - c_get_name (dest, p, insn->args[0]); - c_get_name (src1, p, insn->args[1]); - c_get_name (src2, p, insn->args[2]); - - printf (" %s = %s << %s;\n", dest, src1, src2); -} - -static void -c_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - char dest[20], src1[20], src2[20]; - - c_get_name (dest, p, insn->args[0]); - c_get_name (src1, p, insn->args[1]); - c_get_name (src2, p, insn->args[2]); - - printf (" %s = %s >> %s;\n", dest, src1, src2); -} - - -void -orc_c_init (void) -{ - orc_rule_register ("add_s16", ORC_RULE_C, c_rule_add_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("sub_s16", ORC_RULE_C, c_rule_sub_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("mul_s16", ORC_RULE_C, c_rule_mul_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("lshift_s16", ORC_RULE_C, c_rule_lshift_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("rshift_s16", ORC_RULE_C, c_rule_rshift_s16, NULL, - ORC_RULE_REG_REG); -} - diff --git a/orc/orcprogram-linux.c b/orc/orcprogram-linux.c deleted file mode 100644 index d590046..0000000 --- a/orc/orcprogram-linux.c +++ /dev/null @@ -1,54 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> -#include <sys/mman.h> - -#include <orc/orcprogram.h> - -#define SIZE 65536 - - -void -orc_program_allocate_codemem (OrcProgram *program) -{ - char filename[32] = "/tmp/orcexecXXXXXX"; - int fd; - - fd = mkstemp (filename); - if (fd == -1) { - /* FIXME oh crap */ - printf("failed to create temp file\n"); - program->error = TRUE; - return; - } - unlink (filename); - - ftruncate (fd, SIZE); - - program->code = mmap (NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (program->code == MAP_FAILED) { - /* FIXME oh crap */ - printf("failed to create write map\n"); - program->error = TRUE; - return; - } - program->code_exec = mmap (NULL, SIZE, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); - if (program->code_exec == MAP_FAILED) { - /* FIXME oh crap */ - printf("failed to create exec map\n"); - program->error = TRUE; - return; - } - - close (fd); - - program->code_size = SIZE; - program->codeptr = program->code; -} - diff --git a/orc/orcprogram-powerpc.c b/orc/orcprogram-powerpc.c deleted file mode 100644 index 131f594..0000000 --- a/orc/orcprogram-powerpc.c +++ /dev/null @@ -1,732 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> - -#define SIZE 65536 - -void powerpc_emit_addi (OrcProgram *program, int regd, int rega, int imm); -void powerpc_emit_lwz (OrcProgram *program, int regd, int rega, int imm); -void powerpc_emit_stwu (OrcProgram *program, int regs, int rega, int offset); - -void powerpc_emit_ret (OrcProgram *program); -void powerpc_emit_beq (OrcProgram *program, int label); -void powerpc_emit_bne (OrcProgram *program, int label); -void powerpc_emit_label (OrcProgram *program, int label); - -void orc_program_powerpc_register_rules (void); - -enum { - POWERPC_R0 = ORC_GP_REG_BASE, - POWERPC_R1, - POWERPC_R2, - POWERPC_R3, - POWERPC_R4, - POWERPC_R5, - POWERPC_R6, - POWERPC_R7, - POWERPC_R8, - POWERPC_R9, - POWERPC_R10, - POWERPC_R11, - POWERPC_R12, - POWERPC_R13, - POWERPC_R14, - POWERPC_R15, - POWERPC_R16, - POWERPC_R17, - POWERPC_R18, - POWERPC_R19, - POWERPC_R20, - POWERPC_R21, - POWERPC_R22, - POWERPC_R23, - POWERPC_R24, - POWERPC_R25, - POWERPC_R26, - POWERPC_R27, - POWERPC_R28, - POWERPC_R29, - POWERPC_R30, - POWERPC_R31, - POWERPC_V0 = ORC_VEC1_REG_BASE, - POWERPC_V1, - POWERPC_V2, - POWERPC_V3, - POWERPC_V4, - POWERPC_V5, - POWERPC_V6, - POWERPC_V7, - POWERPC_V8, - POWERPC_V9, - POWERPC_V10, - POWERPC_V11, - POWERPC_V12, - POWERPC_V13, - POWERPC_V14, - POWERPC_V15, - POWERPC_V16, - POWERPC_V17, - POWERPC_V18, - POWERPC_V19, - POWERPC_V20, - POWERPC_V21, - POWERPC_V22, - POWERPC_V23, - POWERPC_V24, - POWERPC_V25, - POWERPC_V26, - POWERPC_V27, - POWERPC_V28, - POWERPC_V29, - POWERPC_V30, - POWERPC_V31, - POWERPC_F0 = ORC_VEC2_REG_BASE, - POWERPC_F1, - POWERPC_F2, - POWERPC_F3, - POWERPC_F4, - POWERPC_F5, - POWERPC_F6, - POWERPC_F7, - POWERPC_F8, - POWERPC_F9, - POWERPC_F10, - POWERPC_F11, - POWERPC_F12, - POWERPC_F13, - POWERPC_F14, - POWERPC_F15, - POWERPC_F16, - POWERPC_F17, - POWERPC_F18, - POWERPC_F19, - POWERPC_F20, - POWERPC_F21, - POWERPC_F22, - POWERPC_F23, - POWERPC_F24, - POWERPC_F25, - POWERPC_F26, - POWERPC_F27, - POWERPC_F28, - POWERPC_F29, - POWERPC_F30, - POWERPC_F31 -}; - -const char * -powerpc_get_regname(int i) -{ - static const char *powerpc_regs[] = { - "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", - "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", - "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", - "r30", "r31", - "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", - "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", - "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", - "v30", "v31", - }; - - if (i>=ORC_GP_REG_BASE && i<ORC_GP_REG_BASE + 64) { - return powerpc_regs[i - ORC_GP_REG_BASE]; - } - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - return "ERROR"; - } -} - -int -powerpc_regnum (int i) -{ - return (i-ORC_GP_REG_BASE)&0x1f; -} - -void -powerpc_emit(OrcProgram *program, unsigned int insn) -{ - *program->codeptr++ = (insn>>24); - *program->codeptr++ = (insn>>16); - *program->codeptr++ = (insn>>8); - *program->codeptr++ = (insn>>0); -} - -void -powerpc_emit_prologue (OrcProgram *program) -{ - int i; - - printf (".global test\n"); - printf ("test:\n"); - - powerpc_emit_stwu (program, POWERPC_R1, POWERPC_R1, -16); - - for(i=POWERPC_R13;i<=POWERPC_R31;i++){ - if (program->used_regs[i]) { - //powerpc_emit_push (program, 4, i); - } - } -} - -void -powerpc_emit_addi (OrcProgram *program, int regd, int rega, int imm) -{ - unsigned int insn; - - printf(" addi %s, %s, %d\n", - powerpc_get_regname(regd), - powerpc_get_regname(rega), imm); - insn = (14<<26) | (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16); - insn |= imm&0xffff; - - powerpc_emit (program, insn); -} - -void -powerpc_emit_lwz (OrcProgram *program, int regd, int rega, int imm) -{ - unsigned int insn; - - printf(" lwz %s, %d(%s)\n", - powerpc_get_regname(regd), - imm, powerpc_get_regname(rega)); - insn = (32<<26) | (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16); - insn |= imm&0xffff; - - powerpc_emit (program, insn); -} - -void -powerpc_emit_stwu (OrcProgram *program, int regs, int rega, int offset) -{ - unsigned int insn; - - printf(" stwu %s, %d(%s)\n", - powerpc_get_regname(regs), - offset, powerpc_get_regname(rega)); - insn = (37<<26) | (powerpc_regnum (regs)<<21) | (powerpc_regnum (rega)<<16); - insn |= offset&0xffff; - - powerpc_emit (program, insn); -} - -void -powerpc_emit_srawi (OrcProgram *program, int regd, int rega, int shift, - int record) -{ - unsigned int insn; - - printf(" srawi%s %s, %s, %d\n", (record)?".":"", - powerpc_get_regname(regd), - powerpc_get_regname(rega), shift); - - insn = (31<<26) | (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16); - insn |= (shift<<11) | (824<<1) | record; - - powerpc_emit (program, insn); -} - -void -powerpc_emit_655510 (OrcProgram *program, int major, int d, int a, int b, - int minor) -{ - unsigned int insn; - - insn = (major<<26) | (d<<21) | (a<<16); - insn |= (b<<11) | (minor<<0); - - powerpc_emit (program, insn); -} - -void -powerpc_emit_X (OrcProgram *program, int major, int d, int a, int b, - int minor) -{ - unsigned int insn; - - insn = (major<<26) | (d<<21) | (a<<16); - insn |= (b<<11) | (minor<<1) | (0<<0); - - powerpc_emit (program, insn); -} - -void -powerpc_emit_VA (OrcProgram *program, int major, int d, int a, int b, - int c, int minor) -{ - unsigned int insn; - - insn = (major<<26) | (d<<21) | (a<<16); - insn |= (b<<11) | (c<<6) | (minor<<0); - - powerpc_emit (program, insn); -} - -void -powerpc_emit_VX (OrcProgram *program, int major, int d, int a, int b, - int minor) -{ - unsigned int insn; - - insn = (major<<26) | (d<<21) | (a<<16); - insn |= (b<<11) | (minor<<0); - - powerpc_emit (program, insn); -} - - -void -powerpc_emit_epilogue (OrcProgram *program) -{ - int i; - - for(i=POWERPC_R31;i>=POWERPC_R31;i--){ - if (program->used_regs[i]) { - //powerpc_emit_pop (program, 4, i); - } - } - - powerpc_emit_addi (program, POWERPC_R1, POWERPC_R1, 16); - printf(" blr\n"); - powerpc_emit(program, 0x4e800020); -} - -void -powerpc_do_fixups (OrcProgram *program) -{ - int i; - unsigned int insn; - - 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; - - insn = *(unsigned int *)ptr; - *(unsigned int *)ptr = (insn&0xffff0000) | ((insn + (label-ptr))&0xffff); - } - } -} - -void -powerpc_flush (OrcProgram *program) -{ -#ifdef HAVE_POWERPC - unsigned char *ptr; - int cache_line_size = 32; - int i; - int size = program->codeptr - program->code; - - ptr = program->code; - for (i=0;i<size;i+=cache_line_size) { - __asm__ __volatile__ ("dcbst %0,%1" :: "r" (ptr), "r" (i)); - } - __asm__ __volatile ("sync"); - - ptr = program->code_exec; - for (i=0;i<size;i+=cache_line_size) { - __asm__ __volatile__ ("icbi %0,%1" :: "r" (ptr), "r" (i)); - } - __asm__ __volatile ("isync"); -#endif -} - -void -orc_powerpc_init (void) -{ - orc_program_powerpc_register_rules (); -} - -void -orc_program_powerpc_init (OrcProgram *program) -{ - int i; - - for(i=0;i<32;i++){ - program->valid_regs[POWERPC_R0+i] = 1; - program->valid_regs[POWERPC_F0+i] = 1; - program->valid_regs[POWERPC_V0+i] = 1; - } - program->valid_regs[POWERPC_R0] = 0; /* used for temp space */ - program->valid_regs[POWERPC_R1] = 0; /* stack pointer */ - program->valid_regs[POWERPC_R2] = 0; /* TOC pointer */ - program->valid_regs[POWERPC_R3] = 0; /* pointer to OrcExecutor */ - program->valid_regs[POWERPC_R13] = 0; /* reserved */ - program->valid_regs[POWERPC_V0] = 0; /* used for temp space */ - - for(i=14;i<32;i++){ - program->save_regs[POWERPC_R0 + i] = 1; - program->save_regs[POWERPC_F0 + i] = 1; - } - for(i=20;i<32;i++){ - program->save_regs[POWERPC_V0 + i] = 1; - } - - program->data_register_class = 2; -} - -void -powerpc_load_constants (OrcProgram *program) -{ - int i; - for(i=0;i<program->n_vars;i++){ - switch (program->vars[i].vartype) { - case ORC_VAR_TYPE_CONST: - printf(" vspltish %s, %d\n", - powerpc_get_regname(program->vars[i].alloc), - program->vars[i].s16); - powerpc_emit_655510 (program, 4, - powerpc_regnum(program->vars[i].alloc), - program->vars[i].s16, 0, 844); - break; - case ORC_VAR_TYPE_SRC: - case ORC_VAR_TYPE_DEST: - if (program->vars[i].ptr_register) { - powerpc_emit_lwz (program, - program->vars[i].ptr_register, - POWERPC_R3, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); - } else { - /* FIXME */ - printf("ERROR"); - } - break; - default: - break; - } - } -} - -void -powerpc_emit_load_src (OrcProgram *program, OrcVariable *var) -{ - int ptr_reg; - ptr_reg = var->ptr_register; - - switch (program->rule_set) { - case ORC_RULE_ALTIVEC_1: - printf(" lvehx %s, 0, %s\n", - powerpc_get_regname (var->alloc), - powerpc_get_regname (ptr_reg)); - powerpc_emit_X (program, 31, powerpc_regnum(var->alloc), - 0, powerpc_regnum(ptr_reg), 39); - printf(" lvsl %s, 0, %s\n", - powerpc_get_regname (POWERPC_V0), - powerpc_get_regname (ptr_reg)); - powerpc_emit_X (program, 31, powerpc_regnum(POWERPC_V0), - 0, powerpc_regnum(ptr_reg), 6); - printf(" vperm %s, %s, %s, %s\n", - powerpc_get_regname (var->alloc), - powerpc_get_regname (var->alloc), - powerpc_get_regname (var->alloc), - powerpc_get_regname (POWERPC_V0)); - powerpc_emit_VA (program, 4, - powerpc_regnum(var->alloc), - powerpc_regnum(var->alloc), - powerpc_regnum(var->alloc), - powerpc_regnum(POWERPC_V0), 43); - break; - default: - printf("ERROR\n"); - } -} - -void -powerpc_emit_store_dest (OrcProgram *program, OrcVariable *var) -{ - int ptr_reg; - ptr_reg = var->ptr_register; - - switch (program->rule_set) { - case ORC_RULE_ALTIVEC_1: - printf(" lvsr %s, 0, %s\n", - powerpc_get_regname (POWERPC_V0), - powerpc_get_regname (ptr_reg)); - powerpc_emit_X (program, 31, powerpc_regnum(POWERPC_V0), - 0, powerpc_regnum(ptr_reg), 38); - printf(" vperm %s, %s, %s, %s\n", - powerpc_get_regname (var->alloc), - powerpc_get_regname (var->alloc), - powerpc_get_regname (var->alloc), - powerpc_get_regname (POWERPC_V0)); - powerpc_emit_VA (program, 4, - powerpc_regnum(var->alloc), - powerpc_regnum(var->alloc), - powerpc_regnum(var->alloc), - powerpc_regnum(POWERPC_V0), 43); - printf(" stvehx %s, 0, %s\n", - powerpc_get_regname (var->alloc), - powerpc_get_regname (ptr_reg)); - powerpc_emit_X (program, 31, - powerpc_regnum(var->alloc), - 0, powerpc_regnum(ptr_reg), 167); - break; - default: - printf("ERROR\n"); - } -} - -void -orc_program_assemble_powerpc (OrcProgram *program) -{ - int j; - int k; - OrcInstruction *insn; - OrcOpcode *opcode; - OrcVariable *args[10]; - OrcRule *rule; - - powerpc_emit_prologue (program); - - powerpc_emit_lwz (program, POWERPC_R0, POWERPC_R3, - (int)ORC_STRUCT_OFFSET(OrcExecutor, n)); - powerpc_emit_srawi (program, POWERPC_R0, POWERPC_R0, - program->loop_shift, 1); - - powerpc_emit_beq (program, 1); - - powerpc_emit (program, 0x7c0903a6); - printf (" mtctr %s\n", powerpc_get_regname(POWERPC_R0)); - - powerpc_load_constants (program); - - powerpc_emit_label (program, 0); - - for(j=0;j<program->n_insns;j++){ - insn = program->insns + j; - opcode = insn->opcode; - - printf("# %d: %s", j, insn->opcode->name); - - /* set up args */ - for(k=0;k<opcode->n_src + opcode->n_dest;k++){ - args[k] = program->vars + insn->args[k]; - printf(" %d", args[k]->alloc); - if (args[k]->is_chained) { - printf(" (chained)"); - } - } - printf(" rule_flag=%d", insn->rule_flag); - printf("\n"); - - for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_SRC: - powerpc_emit_load_src (program, args[k]); - break; - case ORC_VAR_TYPE_CONST: - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } - - rule = insn->rule; - if (rule) { - rule->emit (program, rule->emit_user, insn); - } else { - printf("No rule for: %s\n", opcode->name); - } - - for(k=0;k<opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_DEST: - powerpc_emit_store_dest (program, args[k]); - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } - } - - for(k=0;k<program->n_vars;k++){ - if (program->vars[k].vartype == ORC_VAR_TYPE_SRC || - program->vars[k].vartype == ORC_VAR_TYPE_DEST) { - if (program->vars[k].ptr_register) { - powerpc_emit_addi (program, - program->vars[k].ptr_register, - program->vars[k].ptr_register, - orc_variable_get_size(program->vars + k) << program->loop_shift); - } else { - printf("ERROR\n"); - } - } - } - - powerpc_emit_bne (program, 0); - powerpc_emit_label (program, 1); - - powerpc_emit_epilogue (program); - - powerpc_do_fixups (program); - - powerpc_flush (program); -} - - -/* rules */ - -static void -powerpc_rule_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - unsigned int x; - - printf(" vadduhm %s, %s, %s\n", - powerpc_get_regname(p->vars[insn->args[0]].alloc), - powerpc_get_regname(p->vars[insn->args[1]].alloc), - powerpc_get_regname(p->vars[insn->args[2]].alloc)); - - x = (4<<26); - x |= (powerpc_regnum (p->vars[insn->args[0]].alloc)<<21); - x |= (powerpc_regnum (p->vars[insn->args[1]].alloc)<<16); - x |= (powerpc_regnum (p->vars[insn->args[2]].alloc)<<11); - x |= 64; - - powerpc_emit (p, x); -} - -static void -powerpc_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" vsubuhm %s, %s, %s\n", - powerpc_get_regname(p->vars[insn->args[0]].alloc), - powerpc_get_regname(p->vars[insn->args[1]].alloc), - powerpc_get_regname(p->vars[insn->args[2]].alloc)); -} - -static void -powerpc_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" vxor %s, %s, %s\n", - powerpc_get_regname(POWERPC_V0), - powerpc_get_regname(POWERPC_V0), - powerpc_get_regname(POWERPC_V0)); - powerpc_emit_VX(p, 4, - powerpc_regnum(POWERPC_V0), - powerpc_regnum(POWERPC_V0), - powerpc_regnum(POWERPC_V0), 1220); - - printf(" vmladduhm %s, %s, %s, %s\n", - powerpc_get_regname(p->vars[insn->args[0]].alloc), - powerpc_get_regname(p->vars[insn->args[1]].alloc), - powerpc_get_regname(p->vars[insn->args[2]].alloc), - powerpc_get_regname(POWERPC_V0)); - powerpc_emit_VA(p, 4, - powerpc_regnum(p->vars[insn->args[0]].alloc), - powerpc_regnum(p->vars[insn->args[1]].alloc), - powerpc_regnum(p->vars[insn->args[2]].alloc), - powerpc_regnum(POWERPC_V0), 34); - -} - -static void -powerpc_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" vrlh %s, %s, %s\n", - powerpc_get_regname(p->vars[insn->args[0]].alloc), - powerpc_get_regname(p->vars[insn->args[1]].alloc), - powerpc_get_regname(p->vars[insn->args[2]].alloc)); - powerpc_emit_VX(p, 4, - powerpc_regnum(p->vars[insn->args[0]].alloc), - powerpc_regnum(p->vars[insn->args[1]].alloc), - powerpc_regnum(p->vars[insn->args[2]].alloc), 68); -} - -static void -powerpc_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - unsigned int x; - - printf(" vsrah %s, %s, %s\n", - powerpc_get_regname(p->vars[insn->args[0]].alloc), - powerpc_get_regname(p->vars[insn->args[1]].alloc), - powerpc_get_regname(p->vars[insn->args[2]].alloc)); - - x = (4<<26); - x |= (powerpc_regnum (p->vars[insn->args[0]].alloc)<<21); - x |= (powerpc_regnum (p->vars[insn->args[1]].alloc)<<16); - x |= (powerpc_regnum (p->vars[insn->args[2]].alloc)<<11); - x |= 836; - - powerpc_emit (p, x); -} - - -void -orc_program_powerpc_register_rules (void) -{ - orc_rule_register ("add_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_add_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("sub_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_sub_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("mul_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_mul_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("lshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_lshift_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("rshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_rshift_s16, NULL, - ORC_RULE_REG_REG); -} - -/* code generation */ - -void powerpc_emit_ret (OrcProgram *program) -{ - printf(" ret\n"); - //*program->codeptr++ = 0xc3; -} - -void -powerpc_add_fixup (OrcProgram *program, unsigned char *ptr, int label) -{ - program->fixups[program->n_fixups].ptr = ptr; - program->fixups[program->n_fixups].label = label; - program->fixups[program->n_fixups].type = 0; - program->n_fixups++; -} - -void -powerpc_add_label (OrcProgram *program, unsigned char *ptr, int label) -{ - program->labels[label] = ptr; -} - -void powerpc_emit_beq (OrcProgram *program, int label) -{ - printf(" ble- .L%d\n", label); - - powerpc_add_fixup (program, program->codeptr, label); - powerpc_emit (program, 0x40810000); -} - -void powerpc_emit_bne (OrcProgram *program, int label) -{ - printf(" bdnz+ .L%d\n", label); - - powerpc_add_fixup (program, program->codeptr, label); - powerpc_emit (program, 0x42000000); -} - -void powerpc_emit_label (OrcProgram *program, int label) -{ - printf(".L%d:\n", label); - - powerpc_add_label (program, program->codeptr, label); -} - diff --git a/orc/orcprogram-unknown-os.c b/orc/orcprogram-unknown-os.c deleted file mode 100644 index 130fc34..0000000 --- a/orc/orcprogram-unknown-os.c +++ /dev/null @@ -1,58 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> -#if 0 -#include <sys/mman.h> -#endif - -#include <orc/orcprogram.h> - -#define SIZE 65536 - - -void -orc_program_allocate_codemem (OrcProgram *program) -{ -#if 0 - char filename[32] = "/tmp/orcexecXXXXXX"; - int fd; - - fd = mkstemp (filename); - if (fd == -1) { - /* FIXME oh crap */ - printf("failed to create temp file\n"); - program->error = TRUE; - return; - } - unlink (filename); - - ftruncate (fd, SIZE); - - program->code = mmap (NULL, SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (program->code == MAP_FAILED) { - /* FIXME oh crap */ - printf("failed to create write map\n"); - program->error = TRUE; - return; - } - program->code_exec = mmap (NULL, SIZE, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0); - if (program->code_exec == MAP_FAILED) { - /* FIXME oh crap */ - printf("failed to create exec map\n"); - program->error = TRUE; - return; - } - - close (fd); - - program->code_size = SIZE; - program->codeptr = program->code; -#endif -} - diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c deleted file mode 100644 index 7308b7b..0000000 --- a/orc/orcprogram-x86.c +++ /dev/null @@ -1,448 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> -#include <orc/x86.h> - -#define SIZE 65536 - -void x86_emit_loop (OrcProgram *program); - - -void orc_program_x86_register_rules (void); -void orc_program_mmx_register_rules (void); -void orc_program_sse_register_rules (void); - -#ifdef HAVE_AMD64 -int x86_64 = 1; -int x86_ptr_size = 8; -int x86_exec_ptr = X86_EDI; -#else -int x86_64 = 0; -int x86_ptr_size = 4; -int x86_exec_ptr = X86_EBP; -#endif - - -int -orc_program_x86_allocate_register (OrcProgram *program, int data_reg) -{ - int i; - int klass; - int offset; - - if (data_reg) { - klass = program->data_register_class; - } else { - klass = ORC_REGCLASS_GP; - } - offset = klass << 5; - - for(i=offset;i<offset+32;i++){ - if (program->valid_regs[i] && - !program->save_regs[i] && - program->alloc_regs[i] == 0) { - program->alloc_regs[i]++; - program->used_regs[i] = 1; - return i; - } - } - for(i=offset;i<offset+32;i++){ - if (program->valid_regs[i] && - program->alloc_regs[i] == 0) { - program->alloc_regs[i]++; - program->used_regs[i] = 1; - return i; - } - } - - printf("register overflow\n"); - return 0; -} - - -void orc_program_rewrite_vars (OrcProgram *program); -void orc_program_dump (OrcProgram *program); - -void -x86_emit_prologue (OrcProgram *program) -{ - printf(".global test\n"); - printf("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 -x86_emit_epilogue (OrcProgram *program) -{ - if (program->rule_set == ORC_RULE_MMX_1 || - program->rule_set == ORC_RULE_MMX_2 || - program->rule_set == ORC_RULE_MMX_4 || - program->rule_set == ORC_RULE_MMX_8) { - 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 -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; - - ptr[0] += label - ptr; - } - } -} - -void -orc_x86_init (void) -{ - orc_program_x86_register_rules (); - orc_program_mmx_register_rules (); - orc_program_sse_register_rules (); -} - -void -orc_program_x86_init (OrcProgram *program) -{ - int i; - - if (x86_64) { - for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+16;i++){ - program->valid_regs[i] = 1; - } - program->valid_regs[X86_ECX] = 0; - program->valid_regs[X86_EDI] = 0; - program->valid_regs[X86_ESP] = 0; - for(i=X86_XMM0;i<X86_XMM0+16;i++){ - program->valid_regs[i] = 1; - } - program->save_regs[X86_EBX] = 1; - program->save_regs[X86_EBP] = 1; - program->save_regs[X86_R12] = 1; - program->save_regs[X86_R13] = 1; - program->save_regs[X86_R14] = 1; - program->save_regs[X86_R15] = 1; - } else { - for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+8;i++){ - program->valid_regs[i] = 1; - } - program->valid_regs[X86_ECX] = 0; - program->valid_regs[X86_ESP] = 0; - program->valid_regs[X86_EBP] = 0; - for(i=X86_XMM0;i<X86_XMM0+8;i++){ - program->valid_regs[i] = 1; - } - program->save_regs[X86_EBX] = 1; - program->save_regs[X86_EDI] = 1; - program->save_regs[X86_EBP] = 1; - } - for(i=X86_MM0;i<X86_MM0+8;i++){ - program->valid_regs[i] = 1; - } - for(i=0;i<128;i++){ - program->alloc_regs[i] = 0; - program->used_regs[i] = 0; - } - - program->data_register_class = 3; -} - -void -x86_load_constants (OrcProgram *program) -{ - int i; - for(i=0;i<program->n_vars;i++){ - switch (program->vars[i].vartype) { - case ORC_VAR_TYPE_CONST: - mmx_emit_loadi_s16 (program, program->vars[i].alloc, - program->vars[i].s16); - break; - case ORC_VAR_TYPE_SRC: - case ORC_VAR_TYPE_DEST: - if (program->vars[i].ptr_register) { - x86_emit_mov_memoffset_reg (program, x86_ptr_size, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i]), x86_exec_ptr, - program->vars[i].ptr_register); - } else { - /* FIXME */ - printf("ERROR"); - } - break; - default: - break; - } - } -} - -void -x86_emit_load_src (OrcProgram *program, OrcVariable *var) -{ - int ptr_reg; - if (var->ptr_register == 0) { - x86_emit_mov_memoffset_reg (program, x86_ptr_size, - var->ptr_offset, x86_exec_ptr, X86_ECX); - ptr_reg = X86_ECX; - } else { - ptr_reg = var->ptr_register; - } - switch (program->rule_set) { - case ORC_RULE_SCALAR_1: - x86_emit_mov_memoffset_reg (program, 2, 0, ptr_reg, var->alloc); - break; - case ORC_RULE_MMX_1: - x86_emit_mov_memoffset_reg (program, 2, 0, ptr_reg, X86_ECX); - x86_emit_mov_reg_mmx (program, X86_ECX, var->alloc); - break; - case ORC_RULE_MMX_2: - x86_emit_mov_memoffset_mmx (program, 4, 0, ptr_reg, var->alloc); - break; - case ORC_RULE_MMX_4: - x86_emit_mov_memoffset_mmx (program, 8, 0, ptr_reg, var->alloc); - break; - case ORC_RULE_SSE_1: - x86_emit_mov_memoffset_reg (program, 2, 0, ptr_reg, X86_ECX); - x86_emit_mov_reg_sse (program, X86_ECX, var->alloc); - break; - case ORC_RULE_SSE_2: - x86_emit_mov_memoffset_sse (program, 4, 0, ptr_reg, var->alloc); - break; - case ORC_RULE_SSE_4: - x86_emit_mov_memoffset_sse (program, 8, 0, ptr_reg, var->alloc); - break; - case ORC_RULE_SSE_8: - x86_emit_mov_memoffset_sse (program, 16, 0, ptr_reg, var->alloc); - break; - default: - printf("ERROR\n"); - } -} - -void -x86_emit_store_dest (OrcProgram *program, OrcVariable *var) -{ - int ptr_reg; - if (var->ptr_register == 0) { - x86_emit_mov_memoffset_reg (program, x86_ptr_size, - var->ptr_offset, x86_exec_ptr, X86_ECX); - ptr_reg = X86_ECX; - } else { - ptr_reg = var->ptr_register; - } - switch (program->rule_set) { - case ORC_RULE_SCALAR_1: - x86_emit_mov_reg_memoffset (program, 2, var->alloc, 0, ptr_reg); - break; - case ORC_RULE_MMX_1: - /* FIXME we might be using ecx twice here */ - if (ptr_reg == X86_ECX) { - printf("ERROR\n"); - } - x86_emit_mov_mmx_reg (program, var->alloc, X86_ECX); - x86_emit_mov_reg_memoffset (program, 2, X86_ECX, 0, ptr_reg); - break; - case ORC_RULE_MMX_2: - x86_emit_mov_mmx_memoffset (program, 4, var->alloc, 0, ptr_reg); - break; - case ORC_RULE_MMX_4: - x86_emit_mov_mmx_memoffset (program, 8, var->alloc, 0, ptr_reg); - break; - case ORC_RULE_SSE_1: - /* FIXME we might be using ecx twice here */ - if (ptr_reg == X86_ECX) { - printf("ERROR\n"); - } - x86_emit_mov_sse_reg (program, var->alloc, X86_ECX); - x86_emit_mov_reg_memoffset (program, 2, X86_ECX, 0, ptr_reg); - break; - case ORC_RULE_SSE_2: - x86_emit_mov_sse_memoffset (program, 4, var->alloc, 0, ptr_reg); - break; - case ORC_RULE_SSE_4: - x86_emit_mov_sse_memoffset (program, 8, var->alloc, 0, ptr_reg); - break; - case ORC_RULE_SSE_8: - x86_emit_mov_sse_memoffset (program, 16, var->alloc, 0, ptr_reg); - break; - default: - printf("ERROR\n"); - } -} - -void -orc_program_assemble_x86 (OrcProgram *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_sar_imm_reg (program, 4, program->loop_shift, X86_ECX); - x86_emit_mov_reg_memoffset (program, 4, X86_ECX, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter2), x86_exec_ptr); - - x86_emit_mov_memoffset_reg (program, 4, - (int)ORC_STRUCT_OFFSET(OrcExecutor,n), x86_exec_ptr, X86_ECX); - x86_emit_and_imm_reg (program, 4, (1<<program->loop_shift)-1, X86_ECX); - x86_emit_mov_reg_memoffset (program, 4, X86_ECX, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter1), x86_exec_ptr); - - x86_load_constants (program); - - x86_emit_cmp_imm_memoffset (program, 4, 0, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter1), x86_exec_ptr); - x86_emit_je (program, 1); - - program->rule_set = ORC_RULE_SSE_1; - program->n_per_loop = 1; - program->loop_shift = 0; - x86_emit_label (program, 0); - x86_emit_loop (program); - x86_emit_dec_memoffset (program, 4, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter1), - x86_exec_ptr); - x86_emit_cmp_imm_memoffset (program, 4, 0, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter1), - x86_exec_ptr); - x86_emit_jne (program, 0); - x86_emit_label (program, 1); - - x86_emit_cmp_imm_memoffset (program, 4, 0, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter2), x86_exec_ptr); - x86_emit_je (program, 3); - - program->rule_set = ORC_RULE_SSE_8; - program->n_per_loop = 8; - program->loop_shift = 3; - x86_emit_label (program, 2); - x86_emit_loop (program); - x86_emit_dec_memoffset (program, 4, - (int)ORC_STRUCT_OFFSET(OrcExecutor,counter2), - x86_exec_ptr); - x86_emit_jne (program, 2); - x86_emit_label (program, 3); - - x86_emit_epilogue (program); - - x86_do_fixups (program); -} - -void -x86_emit_loop (OrcProgram *program) -{ - int j; - int k; - OrcInstruction *insn; - OrcOpcode *opcode; - OrcVariable *args[10]; - OrcRule *rule; - - for(j=0;j<program->n_insns;j++){ - insn = program->insns + j; - opcode = insn->opcode; - - printf("# %d: %s", j, insn->opcode->name); - - /* set up args */ - for(k=0;k<opcode->n_src + opcode->n_dest;k++){ - args[k] = program->vars + insn->args[k]; - printf(" %d", args[k]->alloc); - if (args[k]->is_chained) { - printf(" (chained)"); - } - } - printf(" rule_flag=%d", insn->rule_flag); - printf("\n"); - - for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_SRC: - x86_emit_load_src (program, args[k]); - break; - case ORC_VAR_TYPE_CONST: - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } - - rule = insn->rule; - if (rule) { - if (!(rule->flags & ORC_RULE_3REG) && args[0]->alloc != args[1]->alloc) { - x86_emit_mov_reg_reg (program, 2, args[1]->alloc, args[0]->alloc); - } - rule->emit (program, rule->emit_user, insn); - } else { - printf("No rule for: %s\n", opcode->name); - } - - for(k=0;k<opcode->n_dest;k++){ - switch (args[k]->vartype) { - case ORC_VAR_TYPE_DEST: - x86_emit_store_dest (program, args[k]); - break; - case ORC_VAR_TYPE_TEMP: - break; - default: - break; - } - } - } - - for(k=0;k<program->n_vars;k++){ - if (program->vars[k].vartype == ORC_VAR_TYPE_SRC || - program->vars[k].vartype == ORC_VAR_TYPE_DEST) { - if (program->vars[k].ptr_register) { - x86_emit_add_imm_reg (program, x86_ptr_size, - orc_variable_get_size(program->vars + k) * program->n_per_loop, - program->vars[k].ptr_register); - } else { - x86_emit_add_imm_memoffset (program, x86_ptr_size, - orc_variable_get_size(program->vars + k) * program->n_per_loop, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k]), - x86_exec_ptr); - } - } - } -} - diff --git a/orc/orcprogram.c b/orc/orcprogram.c deleted file mode 100644 index c944e09..0000000 --- a/orc/orcprogram.c +++ /dev/null @@ -1,524 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - -void orc_program_assign_rules (OrcProgram *program); -void orc_program_global_reg_alloc (OrcProgram *program); -void orc_program_rewrite_vars (OrcProgram *program); -void orc_program_rewrite_vars2 (OrcProgram *program); -void orc_program_do_regs (OrcProgram *program); - -OrcProgram * -orc_program_new (void) -{ - OrcProgram *p; - - p = malloc(sizeof(OrcProgram)); - memset (p, 0, sizeof(OrcProgram)); - -#if defined(HAVE_POWERPC) - p->rule_set = ORC_RULE_ALTIVEC_1; -#else - p->rule_set = ORC_RULE_SSE_8; -#endif - p->n_per_loop = 8; - p->loop_shift = 3; - - return p; -} - -OrcProgram * -orc_program_new_dss (const char *type_d1, const char *type_s1, - const char *type_s2) -{ - 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"); - - return p; -} - -void -orc_program_free (OrcProgram *program) -{ - int i; - for(i=0;i<program->n_vars;i++){ - free (program->vars[i].name); - } - free (program); -} - -int -orc_program_add_temporary (OrcProgram *program, const char *type, 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].name = strdup(name); - program->n_vars++; - - return i; -} - -int -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].name = malloc (strlen(program->vars[var].name) + 10); - sprintf(program->vars[i].name, "%s.dup%d", program->vars[var].name, j); - program->n_vars++; - - return i; -} - -int -orc_program_add_source (OrcProgram *program, const char *type, 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].name = strdup(name); - program->n_vars++; - - return i; -} - -int -orc_program_add_destination (OrcProgram *program, const char *type, 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].name = strdup(name); - program->n_vars++; - - return i; -} - -int -orc_program_add_constant (OrcProgram *program, const char *type, 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].s16 = value; - program->vars[i].name = strdup(name); - program->n_vars++; - - return i; -} - -int -orc_program_add_parameter (OrcProgram *program, OrcType *type, int value, const char *name) -{ - - return 0; -} - -void -orc_program_append (OrcProgram *program, const char *name, int arg0, - int arg1, int arg2) -{ - OrcInstruction *insn; - - insn = program->insns + program->n_insns; - - insn->opcode = orc_opcode_find_by_name (name); - if (!insn->opcode) { - printf("unknown opcode: %s\n", name); - } - insn->args[0] = arg0; - insn->args[1] = arg1; - insn->args[2] = arg2; - - program->n_insns++; -} - -int -orc_program_find_var_by_name (OrcProgram *program, const char *name) -{ - int i; - - for(i=0;i<program->n_vars;i++){ - if (strcmp (program->vars[i].name, name) == 0) { - return i; - } - } - - return -1; -} - -void -orc_program_append_str (OrcProgram *program, const char *name, - const char *arg1, const char *arg2, const char *arg3) -{ - OrcInstruction *insn; - - insn = program->insns + program->n_insns; - - insn->opcode = orc_opcode_find_by_name (name); - if (!insn->opcode) { - printf("unknown opcode: %s\n", name); - } - insn->args[0] = orc_program_find_var_by_name (program, arg1); - insn->args[1] = orc_program_find_var_by_name (program, arg2); - insn->args[2] = orc_program_find_var_by_name (program, arg3); - - program->n_insns++; -} - -int -orc_program_allocate_register (OrcProgram *program, int data_reg) -{ - int i; - int klass; - int offset; - - if (data_reg) { - klass = program->data_register_class; - } else { - klass = ORC_REGCLASS_GP; - } - offset = klass << 5; - - for(i=offset;i<offset+32;i++){ - if (program->valid_regs[i] && - !program->save_regs[i] && - program->alloc_regs[i] == 0) { - program->alloc_regs[i]++; - program->used_regs[i] = 1; - return i; - } - } - for(i=offset;i<offset+32;i++){ - if (program->valid_regs[i] && - program->alloc_regs[i] == 0) { - program->alloc_regs[i]++; - program->used_regs[i] = 1; - return i; - } - } - - printf("register overflow\n"); - return 0; -} - -void -orc_program_compile (OrcProgram *program) -{ -#if defined(HAVE_POWERPC) - orc_program_powerpc_init (program); -#elif defined(HAVE_I386) - orc_program_x86_init (program); -#elif defined(HAVE_AMD64) - orc_program_x86_init (program); -#else -#error FIXME -#endif - - orc_program_assign_rules (program); - orc_program_rewrite_vars (program); - - orc_program_global_reg_alloc (program); - - orc_program_do_regs (program); - - orc_program_rewrite_vars2 (program); - - orc_program_allocate_codemem (program); -#if defined(HAVE_POWERPC) - orc_program_assemble_powerpc (program); -#elif defined(HAVE_I386) - orc_program_assemble_x86 (program); -#elif defined(HAVE_AMD64) - orc_program_assemble_x86 (program); -#else -#error FIXME -#endif - //orc_program_assemble_c (program); - - orc_program_dump_code (program); -} - -void -orc_program_assign_rules (OrcProgram *program) -{ - int i; - - for(i=0;i<program->n_insns;i++) { - OrcInstruction *insn = program->insns + i; - unsigned int flags; - - insn->rule = insn->opcode->rules + program->rule_set; - - flags = insn->rule->flags; - if (flags & ORC_RULE_REG_IMM && - program->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) { - program->insns[i].rule_flag = ORC_RULE_REG_IMM; - } else { - program->insns[i].rule_flag = ORC_RULE_REG_REG; - } - } -} - -void -orc_program_rewrite_vars (OrcProgram *program) -{ - int j; - int k; - OrcInstruction *insn; - OrcOpcode *opcode; - int var; - int actual_var; - - for(j=0;j<program->n_insns;j++){ - insn = program->insns + j; - opcode = insn->opcode; - - /* set up args */ - for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){ - var = insn->args[k]; - if (program->vars[var].vartype == ORC_VAR_TYPE_DEST) { - printf("ERROR: using dest var as source\n"); - } - - actual_var = var; - if (program->vars[var].replaced) { - actual_var = program->vars[var].replacement; - insn->args[k] = actual_var; - } - - if (!program->vars[var].used) { - if (program->vars[var].vartype == ORC_VAR_TYPE_TEMP) { - printf("ERROR: using uninitialized temp var\n"); - } - program->vars[var].used = TRUE; - program->vars[var].first_use = j; - } - program->vars[actual_var].last_use = j; - } - - for(k=0;k<opcode->n_dest;k++){ - var = insn->args[k]; - - if (program->vars[var].vartype == ORC_VAR_TYPE_SRC) { - printf("ERROR: using src var as dest\n"); - } - if (program->vars[var].vartype == ORC_VAR_TYPE_CONST) { - printf("ERROR: using const var as dest\n"); - } - if (program->vars[var].vartype == ORC_VAR_TYPE_PARAM) { - printf("ERROR: using param var as dest\n"); - } - - actual_var = var; - if (program->vars[var].replaced) { - actual_var = program->vars[var].replacement; - insn->args[k] = actual_var; - } - - if (!program->vars[var].used) { - program->vars[actual_var].used = TRUE; - program->vars[actual_var].first_use = j; - } else { - if (program->vars[var].vartype == ORC_VAR_TYPE_DEST) { - printf("ERROR: writing dest more than once\n"); - } - if (program->vars[var].vartype == ORC_VAR_TYPE_TEMP) { - actual_var = orc_program_dup_temporary (program, var, j); - program->vars[var].replaced = TRUE; - program->vars[var].replacement = actual_var; - insn->args[k] = actual_var; - program->vars[actual_var].used = TRUE; - program->vars[actual_var].first_use = j; - } - } - program->vars[actual_var].last_use = j; - } - } -} - -void -orc_program_global_reg_alloc (OrcProgram *program) -{ - int i; - OrcVariable *var; - - - for(i=0;i<program->n_vars;i++){ - var = program->vars + i; - switch (var->vartype) { - case ORC_VAR_TYPE_CONST: - var->first_use = -1; - var->last_use = -1; - var->alloc = orc_program_allocate_register (program, TRUE); - break; - case ORC_VAR_TYPE_SRC: - case ORC_VAR_TYPE_DEST: - var->ptr_register = orc_program_allocate_register (program, FALSE); - break; - default: - break; - } - } -} - -void -orc_program_do_regs (OrcProgram *program) -{ - int i; - int k; - int var; - OrcInstruction *insn; - OrcOpcode *opcode; - - for(i=0;i<program->n_insns;i++){ - insn = program->insns + i; - opcode = insn->opcode; - - for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){ - var = insn->args[k]; - - - } - - for(k=0;k<opcode->n_dest;k++){ - var = insn->args[k]; - } - } -} - -void -orc_program_rewrite_vars2 (OrcProgram *program) -{ - int i; - int j; - int k; - - for(j=0;j<program->n_insns;j++){ -#if 1 - /* must be true to chain src1 to dest: - * - rule must handle it - * - src1 must be last_use - */ - if (1 || program->insns[j].rule->flags & ORC_RULE_REG_REG) { - int src1 = program->insns[j].args[1]; - int dest = program->insns[j].args[0]; - if (program->vars[src1].last_use == j) { - if (program->vars[src1].first_use == j) { - k = orc_program_allocate_register (program, TRUE); - program->vars[src1].alloc = k; - } - program->alloc_regs[program->vars[src1].alloc]++; - program->vars[dest].alloc = program->vars[src1].alloc; - } - } -#endif - - if (program->insns[j].rule_flag == ORC_RULE_REG_IMM) { - /* immediate operand, don't load */ - int src2 = program->insns[j].args[2]; - program->vars[src2].alloc = 1; - } else { - int src2 = program->insns[j].args[2]; - if (program->vars[src2].alloc == 1) { - program->vars[src2].alloc = 0; - } - } - - for(i=0;i<program->n_vars;i++){ - if (program->vars[i].first_use == j) { - if (program->vars[i].alloc) continue; - k = orc_program_allocate_register (program, TRUE); - program->vars[i].alloc = k; - } - } - for(i=0;i<program->n_vars;i++){ - if (program->vars[i].last_use == j) { - program->alloc_regs[program->vars[i].alloc]--; - } - } - } - -#if 0 - for(i=0;i<program->n_vars;i++){ - printf("# %2d: %2d %2d %d\n", - i, - program->vars[i].first_use, - program->vars[i].last_use, - program->vars[i].alloc); - } -#endif - -} - -void -orc_program_dump_code (OrcProgram *program) -{ - FILE *file; - - file = fopen("dump","w"); - - fwrite (program->code, 1, program->codeptr - program->code, file); - fclose (file); -} - -void -orc_program_dump (OrcProgram *program) -{ - int i; - int j; - OrcOpcode *opcode; - OrcInstruction *insn; - - for(i=0;i<program->n_insns;i++){ - insn = program->insns + i; - opcode = insn->opcode; - - printf("insn: %d\n", i); - printf(" opcode: %s\n", opcode->name); - - for(j=0;j<opcode->n_dest;j++){ - printf(" dest%d: %d %s\n", j, insn->args[j], - program->vars[insn->args[j]].name); - } - for(j=0;j<opcode->n_src;j++){ - printf(" src%d: %d %s\n", j, insn->args[opcode->n_dest + j], - program->vars[insn->args[opcode->n_dest + j]].name); - } - - printf("\n"); - } - - for(i=0;i<program->n_vars;i++){ - printf("var: %d %s\n", i, program->vars[i].name); - printf("first_use: %d\n", program->vars[i].first_use); - printf("last_use: %d\n", program->vars[i].last_use); - - printf("\n"); - } - -} - -int -orc_variable_get_size (OrcVariable *var) -{ - return 2; -} - diff --git a/orc/orcprogram.h b/orc/orcprogram.h deleted file mode 100644 index 2dbacf4..0000000 --- a/orc/orcprogram.h +++ /dev/null @@ -1,274 +0,0 @@ - -#ifndef _ORC_PROGRAM_H_ -#define _ORC_PROGRAM_H_ - -//#include <glib.h> -#include <liboil/liboil-stdint.h> - -typedef struct _OrcType OrcType; -typedef struct _OrcExecutor OrcExecutor; -typedef struct _OrcVariable OrcVariable; -typedef struct _OrcOpcode OrcOpcode; -typedef struct _OrcArgument OrcArgument; -typedef struct _OrcInstruction OrcInstruction; -typedef struct _OrcProgram OrcProgram; -typedef struct _OrcRegister OrcRegister; -typedef struct _OrcRule OrcRule; -typedef struct _OrcFixup OrcFixup; - -typedef void (*OrcOpcodeEmulateFunc)(OrcExecutor *ex, void *user); -typedef void (*OrcRuleEmitFunc)(OrcProgram *p, void *user, OrcInstruction *insn); - -#define ORC_N_REGS (32*4) -#define ORC_N_INSNS 100 -#define ORC_N_VARIABLES 100 -#define ORC_N_REGISTERS 100 -#define ORC_N_FIXUPS 100 -#define ORC_N_LABELS 100 - -#define ORC_GP_REG_BASE 32 -#define ORC_VEC1_REG_BASE 64 -#define ORC_VEC2_REG_BASE 96 - -#define ORC_REGCLASS_GP 1 - -#define ORC_OPCODE_N_ARGS 4 -#define ORC_OPCODE_N_RULES 12 - -#define ORC_STRUCT_OFFSET(struct_type, member) \ - ((long) ((unsigned int *) &((struct_type*) 0)->member)) - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -enum { - ORC_RULE_C = 0, - ORC_RULE_SCALAR_1, - ORC_RULE_SCALAR_2, - ORC_RULE_MMX_1, - ORC_RULE_MMX_2, - ORC_RULE_MMX_4, - ORC_RULE_MMX_8, - ORC_RULE_SSE_1, - ORC_RULE_SSE_2, - ORC_RULE_SSE_4, - ORC_RULE_SSE_8, - ORC_RULE_ALTIVEC_1 -}; - -struct _OrcType { - char *name; - int size; -}; - -typedef enum { - ORC_VAR_TYPE_TEMP, - ORC_VAR_TYPE_SRC, - ORC_VAR_TYPE_DEST, - ORC_VAR_TYPE_CONST, - ORC_VAR_TYPE_PARAM -} OrcVarType; - -struct _OrcVariable { - char *name; - - OrcType *type; - OrcVarType vartype; - - int used; - int first_use; - int last_use; - int replaced; - int replacement; - - int alloc; - int is_chained; - - int16_t s16; - - int ptr_register; - int ptr_offset; -}; - -struct _OrcRule { - unsigned int flags; - OrcRuleEmitFunc emit; - void *emit_user; -}; - -struct _OrcOpcode { - char *name; - int n_src; - int n_dest; - OrcType *arg_types[ORC_OPCODE_N_ARGS]; - - OrcRule rules[ORC_OPCODE_N_RULES]; - - OrcOpcodeEmulateFunc emulate; - void *emulate_user; -}; - -struct _OrcArgument { - OrcVariable *var; - int is_indirect; - int is_indexed; - OrcVariable *index_var; - int index_scale; - int type; // remove - int index; // remove - int offset; -}; - -struct _OrcInstruction { - OrcOpcode *opcode; - int args[3]; - - OrcRule *rule; - unsigned int rule_flag; -}; - -struct _OrcFixup { - unsigned char *ptr; - int type; - int label; -}; - -struct _OrcRegister { - int var; - - int is_data; - int is_chained; - int chained_reg; - - int merge; -}; - - -struct _OrcProgram { - OrcInstruction insns[ORC_N_INSNS]; - int n_insns; - - OrcVariable vars[ORC_N_VARIABLES]; - int n_vars; - - OrcInstruction *insn; - int rule_set; - - OrcRegister registers[ORC_N_REGISTERS]; - int n_regs; - - unsigned char *code; - void *code_exec; - unsigned char *codeptr; - int code_size; - - OrcFixup fixups[ORC_N_FIXUPS]; - int n_fixups; - unsigned char *labels[ORC_N_LABELS]; - - int error; - - int data_register_class; - - int valid_regs[ORC_N_REGS]; - int save_regs[ORC_N_REGS]; - int used_regs[ORC_N_REGS]; - int alloc_regs[ORC_N_REGS]; - - int loop_shift; - int n_per_loop; -}; - -struct _OrcExecutor { - OrcProgram *program; - int n; - int counter1; - int counter2; - int counter3; - - void *arrays[ORC_N_VARIABLES]; - - OrcVariable vars[ORC_N_VARIABLES]; - OrcVariable *args[ORC_OPCODE_N_ARGS]; - -}; - -enum { - ORC_RULE_3REG = (1<<0), - ORC_RULE_REG_REG = (1<<1), - ORC_RULE_MEM_REG = (1<<2), - ORC_RULE_REG_MEM = (1<<3), - ORC_RULE_REG_IMM = (1<<4), - ORC_RULE_MEM_IMM = (1<<5), - ORC_RULE_REG_CL = (1<<6) -}; - - -void orc_init (void); - -OrcProgram * orc_program_new (void); -OrcProgram * orc_program_new_dss (const char *type1, const char *type2, - const char *type3); -OrcOpcode * orc_opcode_find_by_name (const char *name); -void orc_opcode_init (void); - -void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1, int arg2); -void orc_program_append_str (OrcProgram *p, const char *opcode, - const char * arg0, const char * arg1, const char * arg2); - -void orc_x86_init (void); -void orc_powerpc_init (void); -void orc_c_init (void); - -void orc_program_compile (OrcProgram *p); -void orc_program_x86_init (OrcProgram *p); -void orc_program_powerpc_init (OrcProgram *p); -void orc_program_assemble_x86 (OrcProgram *p); -void orc_program_assemble_powerpc (OrcProgram *p); -void orc_program_assemble_c (OrcProgram *p); -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_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); -void orc_program_append (OrcProgram *program, const char *opcode, int arg0, - int arg1, int arg2); - -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); -void orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr); -void orc_executor_set_n (OrcExecutor *ex, int n); -void orc_executor_emulate (OrcExecutor *ex); -void orc_executor_run (OrcExecutor *ex); - -void orc_rule_register (const char *opcode_name, unsigned int mode, - OrcRuleEmitFunc emit, void *emit_user, unsigned int flags); - -int orc_program_allocate_register (OrcProgram *program, int is_data); -int orc_program_x86_allocate_register (OrcProgram *program, int is_data); -int orc_program_powerpc_allocate_register (OrcProgram *program, int is_data); - -void orc_program_x86_register_rules (void); -void orc_program_allocate_codemem (OrcProgram *program); -void orc_program_dump_code (OrcProgram *program); - -int orc_variable_get_size (OrcVariable *var); - -#endif - diff --git a/orc/orcrule.c b/orc/orcrule.c deleted file mode 100644 index 1919e76..0000000 --- a/orc/orcrule.c +++ /dev/null @@ -1,23 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <orc/orcprogram.h> - - -void -orc_rule_register (const char *opcode_name, unsigned int mode, - OrcRuleEmitFunc emit, void *emit_user, unsigned int flags) -{ - OrcOpcode *opcode; - - opcode = orc_opcode_find_by_name (opcode_name); - - opcode->rules[mode].emit = emit; - opcode->rules[mode].emit_user = emit_user; - opcode->rules[mode].flags = flags; -} - diff --git a/orc/orcrules-mmx.c b/orc/orcrules-mmx.c deleted file mode 100644 index 7ecadeb..0000000 --- a/orc/orcrules-mmx.c +++ /dev/null @@ -1,162 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> -#include <orc/x86.h> - -#define SIZE 65536 - -/* mmx rules */ - -void -mmx_emit_loadi_s16 (OrcProgram *p, int reg, int value) -{ - if (value == 0) { - printf(" pxor %%%s, %%%s\n", x86_get_regname_mmx(reg), - x86_get_regname_mmx(reg)); - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xef; - x86_emit_modrm_reg (p, reg, reg); - } else { - x86_emit_mov_imm_reg (p, 4, value, X86_ECX); - - printf(" movd %%ecx, %%%s\n", x86_get_regname_mmx(reg)); - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x6e; - x86_emit_modrm_reg (p, X86_ECX, reg); - - printf(" pshufw $0, %%%s, %%%s\n", x86_get_regname_mmx(reg), - x86_get_regname_mmx(reg)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x70; - x86_emit_modrm_reg (p, reg, reg); - *p->codeptr++ = 0x00; - } -} - -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", - x86_get_regname_mmx(p->vars[insn->args[2]].alloc), - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xfd; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -mmx_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" psubw %%%s, %%%s\n", - x86_get_regname_mmx(p->vars[insn->args[2]].alloc), - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xf9; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -mmx_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" pmullw %%%s, %%%s\n", - x86_get_regname_mmx(p->vars[insn->args[2]].alloc), - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xd5; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -mmx_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (p->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) { - printf(" psllw $%d, %%%s\n", - p->vars[insn->args[2]].s16, - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x71; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 6); - *p->codeptr++ = p->vars[insn->args[2]].s16; - } else { - /* FIXME this doesn't work quite right */ - printf(" psllw %%%s, %%%s\n", - x86_get_regname_mmx(p->vars[insn->args[2]].alloc), - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xf1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].alloc); - } -} - -static void -mmx_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (p->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) { - printf(" psraw $%d, %%%s\n", - p->vars[insn->args[2]].s16, - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x71; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 4); - *p->codeptr++ = p->vars[insn->args[2]].s16; - } else { - /* FIXME this doesn't work quite right */ - printf(" psraw %%%s, %%%s\n", - x86_get_regname_mmx(p->vars[insn->args[2]].alloc), - x86_get_regname_mmx(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xe1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].alloc); - } -} - -void -orc_program_mmx_register_rules (void) -{ - int i; - - orc_rule_register ("_loadi_s16", ORC_RULE_MMX_4, mmx_rule_loadi_s16, NULL, - ORC_RULE_REG_IMM); - - for(i=ORC_RULE_MMX_1; i <= ORC_RULE_MMX_4; i++) { - orc_rule_register ("add_s16", i, mmx_rule_add_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("sub_s16", i, mmx_rule_sub_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("mul_s16", i, mmx_rule_mul_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("lshift_s16", i, mmx_rule_lshift_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("rshift_s16", i, mmx_rule_rshift_s16, NULL, - ORC_RULE_REG_REG); - } -} - diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c deleted file mode 100644 index 155ac5f..0000000 --- a/orc/orcrules-sse.c +++ /dev/null @@ -1,171 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> -#include <orc/x86.h> - -#define SIZE 65536 - -/* sse rules */ - -static void -sse_emit_loadi_s16 (OrcProgram *p, int reg, int value) -{ - if (value == 0) { - printf(" pxor %%%s, %%%s\n", x86_get_regname_sse(reg), - x86_get_regname_sse(reg)); - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xef; - x86_emit_modrm_reg (p, reg, reg); - } else { - x86_emit_mov_imm_reg (p, 4, value, X86_ECX); - - printf(" movd %%ecx, %%%s\n", x86_get_regname_sse(reg)); - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x6e; - x86_emit_modrm_reg (p, X86_ECX, reg); - - printf(" pshufw $0, %%%s, %%%s\n", x86_get_regname_sse(reg), - x86_get_regname_sse(reg)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x70; - x86_emit_modrm_reg (p, reg, reg); - *p->codeptr++ = 0x00; - } -} - -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_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" paddw %%%s, %%%s\n", - x86_get_regname_sse(p->vars[insn->args[2]].alloc), - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xfd; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -sse_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" psubw %%%s, %%%s\n", - x86_get_regname_sse(p->vars[insn->args[2]].alloc), - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xf9; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -sse_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" pmullw %%%s, %%%s\n", - x86_get_regname_sse(p->vars[insn->args[2]].alloc), - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xd5; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -sse_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (p->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) { - printf(" psllw $%d, %%%s\n", - p->vars[insn->args[2]].s16, - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x71; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 6); - *p->codeptr++ = p->vars[insn->args[2]].s16; - } else { - /* FIXME this doesn't work quite right */ - printf(" psllw %%%s, %%%s\n", - x86_get_regname_sse(p->vars[insn->args[2]].alloc), - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xf1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].alloc); - } -} - -static void -sse_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (p->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) { - printf(" psraw $%d, %%%s\n", - p->vars[insn->args[2]].s16, - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0x71; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 4); - *p->codeptr++ = p->vars[insn->args[2]].s16; - } else { - /* FIXME this doesn't work quite right */ - printf(" psraw %%%s, %%%s\n", - x86_get_regname_sse(p->vars[insn->args[2]].alloc), - x86_get_regname_sse(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xe1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, - p->vars[insn->args[2]].alloc); - } -} - -void -orc_program_sse_register_rules (void) -{ - int i; - - orc_rule_register ("_loadi_s16", ORC_RULE_SSE_4, sse_rule_loadi_s16, NULL, - ORC_RULE_REG_IMM); - - for(i=ORC_RULE_SSE_1; i <= ORC_RULE_SSE_8; i++) { - orc_rule_register ("add_s16", i, sse_rule_add_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("sub_s16", i, sse_rule_sub_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("mul_s16", i, sse_rule_mul_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("lshift_s16", i, sse_rule_lshift_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("rshift_s16", i, sse_rule_rshift_s16, NULL, - ORC_RULE_REG_REG); - } -} - diff --git a/orc/orcrules-x86.c b/orc/orcrules-x86.c deleted file mode 100644 index e2fbd73..0000000 --- a/orc/orcrules-x86.c +++ /dev/null @@ -1,145 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> -#include <orc/x86.h> - -#define SIZE 65536 - -/* rules */ - -static void -x86_rule_loadi_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - x86_emit_mov_imm_reg (p, 2, p->vars[insn->args[2]].s16, - p->vars[insn->args[0]].alloc); -} - -static void -x86_rule_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (insn->rule_flag == ORC_RULE_REG_IMM) { - int value = p->vars[insn->args[2]].s16; - printf(" addw $%d, %%%s\n", value, - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - if (value >= -128 && value < 128) { - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x83; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 0); - *p->codeptr++ = value; - } else { - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x81; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 0); - *p->codeptr++ = value & 0xff; - *p->codeptr++ = value >> 8; - } - } else { - printf(" addw %%%s, %%%s\n", - x86_get_regname_16(p->vars[insn->args[2]].alloc), - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x03; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); - } -} - -static void -x86_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" subw %%%s, %%%s\n", - x86_get_regname_16(p->vars[insn->args[2]].alloc), - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x2b; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -x86_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - printf(" imulw %%%s, %%%s\n", - x86_get_regname_16(p->vars[insn->args[2]].alloc), - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0x0f; - *p->codeptr++ = 0xaf; - x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc, - p->vars[insn->args[0]].alloc); -} - -static void -x86_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - x86_emit_mov_reg_reg(p, 4, p->vars[insn->args[2]].alloc, X86_ECX); - - printf(" shlw %%cl, %%%s\n", - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0xd3; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 4); -} - -static void -x86_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn) -{ - if (insn->rule_flag == ORC_RULE_REG_IMM) { - printf(" sarw $%d, %%%s\n", - p->vars[insn->args[2]].s16, - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - if (p->vars[insn->args[2]].s16 == 1) { - *p->codeptr++ = 0x66; - *p->codeptr++ = 0xd1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7); - } else { - *p->codeptr++ = 0x66; - *p->codeptr++ = 0xc1; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7); - *p->codeptr++ = p->vars[insn->args[2]].s16; - } - } else { - x86_emit_mov_reg_reg(p, 4, p->vars[insn->args[2]].alloc, X86_ECX); - - printf(" sarw %%cl, %%%s\n", - x86_get_regname_16(p->vars[insn->args[0]].alloc)); - - *p->codeptr++ = 0x66; - *p->codeptr++ = 0xd3; - x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7); - } -} - - -void -orc_program_x86_register_rules (void) -{ - orc_rule_register ("_loadi_s16", ORC_RULE_SCALAR_1, x86_rule_loadi_s16, NULL, - ORC_RULE_REG_IMM); - - orc_rule_register ("add_s16", ORC_RULE_SCALAR_1, x86_rule_add_s16, NULL, - ORC_RULE_REG_REG | ORC_RULE_REG_IMM); - orc_rule_register ("sub_s16", ORC_RULE_SCALAR_1, x86_rule_sub_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("mul_s16", ORC_RULE_SCALAR_1, x86_rule_mul_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("lshift_s16", ORC_RULE_SCALAR_1, x86_rule_lshift_s16, NULL, - ORC_RULE_REG_REG); - orc_rule_register ("rshift_s16", ORC_RULE_SCALAR_1, x86_rule_rshift_s16, NULL, - ORC_RULE_REG_REG | ORC_RULE_REG_IMM); -} - 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/test.c b/orc/test.c deleted file mode 100644 index bff0df2..0000000 --- a/orc/test.c +++ /dev/null @@ -1,21 +0,0 @@ - -#include <stdlib.h> -#include <stdint.h> -#include <orc/orcprogram.h> - -void -test (OrcExecutor *ex) -{ - int i; - int n = ex->n; - int16_t *var0 = ex->arrays[0]; - int16_t *var1 = ex->arrays[1]; - int16_t *var2 = ex->arrays[2]; - int16_t var3; - int16_t var6; - - for (i = 0; i < n; i++) { - var0[i] = (var1[i] + var2[i] + 1) >> 1; - } -} - diff --git a/orc/x86.c b/orc/x86.c deleted file mode 100644 index aaf09c1..0000000 --- a/orc/x86.c +++ /dev/null @@ -1,749 +0,0 @@ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <unistd.h> -#include <sys/types.h> - -#include <orc/orcprogram.h> -#include <orc/x86.h> - -const char * -x86_get_regname(int i) -{ - static const char *x86_regs[] = { - "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", - "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" }; - - if (i>=ORC_GP_REG_BASE && i<ORC_GP_REG_BASE + 16) return x86_regs[i - ORC_GP_REG_BASE]; - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - printf("register %d\n", i); - return "ERROR"; - } -} - -int -x86_get_regnum(int i) -{ - return (i&0xf); -} - -const char * -x86_get_regname_16(int i) -{ - static const char *x86_regs[] = { "ax", "cx", "dx", "bx", - "sp", "bp", "si", "di" }; - - if (i>=ORC_GP_REG_BASE && i<ORC_GP_REG_BASE + 8) return x86_regs[i - ORC_GP_REG_BASE]; - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - return "ERROR"; - } -} - -const char * -x86_get_regname_64(int i) -{ - static const char *x86_regs[] = { - "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" }; - - if (i>=ORC_GP_REG_BASE && i<ORC_GP_REG_BASE + 16) return x86_regs[i - ORC_GP_REG_BASE]; - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - return "ERROR"; - } -} - -const char * -x86_get_regname_ptr(int i) -{ - if (x86_64) { - return x86_get_regname_64 (i); - } else { - return x86_get_regname (i); - } -} - -const char * -x86_get_regname_mmx(int i) -{ - static const char *x86_regs[] = { "mm0", "mm1", "mm2", "mm3", - "mm4", "mm5", "mm6", "mm7" }; - - if (i>=X86_MM0 && i<X86_MM0 + 8) return x86_regs[i - X86_MM0]; - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - return "ERROR"; - } -} - -const char * -x86_get_regname_sse(int i) -{ - static const char *x86_regs[] = { - "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" - }; - - if (i>=X86_XMM0 && i<X86_XMM0 + 16) return x86_regs[i - X86_XMM0]; - switch (i) { - case 0: - return "UNALLOCATED"; - case 1: - return "direct"; - default: - return "ERROR"; - } -} - -void -x86_emit_push (OrcProgram *program, int size, int reg) -{ - - if (size == 1) { - program->error = 1; - } else if (size == 2) { - printf(" pushw %%%s\n", x86_get_regname_16(reg)); - *program->codeptr++ = 0x66; - *program->codeptr++ = 0x50 + x86_get_regnum(reg); - } else { - printf(" pushl %%%s\n", x86_get_regname(reg)); - *program->codeptr++ = 0x50 + x86_get_regnum(reg); - } -} - -void -x86_emit_pop (OrcProgram *program, int size, int reg) -{ - - if (size == 1) { - program->error = 1; - } else if (size == 2) { - printf(" popw %%%s\n", x86_get_regname_16(reg)); - *program->codeptr++ = 0x66; - *program->codeptr++ = 0x58 + x86_get_regnum(reg); - } else { - printf(" popl %%%s\n", x86_get_regname(reg)); - *program->codeptr++ = 0x58 + x86_get_regnum(reg); - } -} - -#define X86_MODRM(mod, rm, reg) ((((mod)&3)<<6)|(((rm)&7)<<0)|(((reg)&7)<<3)) -#define X86_SIB(ss, ind, reg) ((((ss)&3)<<6)|(((ind)&7)<<3)|((reg)&7)) - -void -x86_emit_modrm_memoffset (OrcProgram *program, int reg1, int offset, int reg2) -{ - if (offset == 0 && reg2 != x86_exec_ptr) { - if (reg2 == X86_ESP) { - *program->codeptr++ = X86_MODRM(0, 4, reg1); - *program->codeptr++ = X86_SIB(0, 4, reg2); - } else { - *program->codeptr++ = X86_MODRM(0, reg2, reg1); - } - } else if (offset >= -128 && offset < 128) { - *program->codeptr++ = X86_MODRM(1, reg2, reg1); - if (reg2 == X86_ESP) { - *program->codeptr++ = X86_SIB(0, 4, reg2); - } - *program->codeptr++ = (offset & 0xff); - } else { - *program->codeptr++ = X86_MODRM(2, reg2, reg1); - if (reg2 == X86_ESP) { - *program->codeptr++ = X86_SIB(0, 4, reg2); - } - *program->codeptr++ = (offset & 0xff); - *program->codeptr++ = ((offset>>8) & 0xff); - *program->codeptr++ = ((offset>>16) & 0xff); - *program->codeptr++ = ((offset>>24) & 0xff); - } -} - -void -x86_emit_modrm_reg (OrcProgram *program, int reg1, int reg2) -{ - *program->codeptr++ = X86_MODRM(3, reg1, reg2); -} - -void -x86_emit_rex (OrcProgram *program, int size, int reg1, int reg2, int reg3) -{ - int rex = 0x40; - - if (x86_64) { - if (size >= 8) rex |= 0x08; - if (reg1 == 1 || (x86_get_regnum(reg1)>=8)) rex |= 0x4; - if (reg2 == 1 || (x86_get_regnum(reg2)>=8)) rex |= 0x2; - if (reg3 == 1 || (x86_get_regnum(reg3)>=8)) rex |= 0x1; - - if (rex != 0x40) *program->codeptr++ = rex; - //*program->codeptr++ = rex; - } -} - -void -x86_emit_mov_memoffset_reg (OrcProgram *program, int size, int offset, - int reg1, int reg2) -{ - - if (size == 2) { - printf(" movw %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_16(reg2)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" movl %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname(reg2)); - } else { - printf(" mov %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_64(reg2)); - } - - x86_emit_rex(program, size, reg2, 0, reg1); - *program->codeptr++ = 0x8b; - x86_emit_modrm_memoffset (program, reg2, offset, reg1); -} - -void -x86_emit_mov_memoffset_mmx (OrcProgram *program, int size, int offset, - int reg1, int reg2) -{ - if (size == 4) { - printf(" movd %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_mmx(reg2)); - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6e; - } else { - printf(" movq %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_mmx(reg2)); - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6f; - } - x86_emit_modrm_memoffset (program, reg2, offset, reg1); -} - -void -x86_emit_mov_memoffset_sse (OrcProgram *program, int size, int offset, - int reg1, int reg2) -{ - if (size == 4) { - printf(" movd %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_sse(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6e; - } else if (size == 8) { - printf(" movq %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_sse(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6f; - } else { - printf(" movdqu %d(%%%s), %%%s\n", offset, x86_get_regname_ptr(reg1), - x86_get_regname_sse(reg2)); - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0xf3; - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6f; - } - x86_emit_modrm_memoffset (program, reg2, offset, reg1); -} - -void -x86_emit_mov_reg_memoffset (OrcProgram *program, int size, int reg1, int offset, - int reg2) -{ - if (size == 2) { - printf(" movw %%%s, %d(%%%s)\n", x86_get_regname_16(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" movl %%%s, %d(%%%s)\n", x86_get_regname(reg1), offset, - x86_get_regname_ptr(reg2)); - } else { - printf(" mov %%%s, %d(%%%s)\n", x86_get_regname(reg1), offset, - x86_get_regname_ptr(reg2)); - } - - x86_emit_rex(program, size, reg1, 0, reg2); - *program->codeptr++ = 0x89; - x86_emit_modrm_memoffset (program, reg1, offset, reg2); -} - -void -x86_emit_mov_mmx_memoffset (OrcProgram *program, int size, int reg1, int offset, - int reg2) -{ - x86_emit_rex(program, 0, reg1, 0, reg2); - if (size == 4) { - printf(" movd %%%s, %d(%%%s)\n", x86_get_regname_mmx(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7e; - } else if (size == 8) { - printf(" movq %%%s, %d(%%%s)\n", x86_get_regname_mmx(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7f; - } - - x86_emit_modrm_memoffset (program, reg1, offset, reg2); -} - -void -x86_emit_mov_sse_memoffset (OrcProgram *program, int size, int reg1, int offset, - int reg2) -{ - if (size == 4) { - printf(" movd %%%s, %d(%%%s)\n", x86_get_regname_sse(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg1, 0, reg2); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7e; - } else if (size == 8) { - printf(" movq %%%s, %d(%%%s)\n", x86_get_regname_sse(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg1, 0, reg2); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7f; - } else { - printf(" movdqu %%%s, %d(%%%s)\n", x86_get_regname_sse(reg1), offset, - x86_get_regname_ptr(reg2)); - *program->codeptr++ = 0xf3; - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7f; - } - - x86_emit_modrm_memoffset (program, reg1, offset, reg2); -} - -void -x86_emit_mov_imm_reg (OrcProgram *program, int size, int value, int reg1) -{ - if (size == 2) { - printf(" movw $%d, %%%s\n", value, x86_get_regname_16(reg1)); - x86_emit_rex(program, size, reg1, 0, 0); - *program->codeptr++ = 0x66; - *program->codeptr++ = 0xb8 + x86_get_regnum(reg1); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - } else if (size == 4) { - printf(" movl $%d, %%%s\n", value, x86_get_regname(reg1)); - x86_emit_rex(program, size, reg1, 0, 0); - *program->codeptr++ = 0xb8 + x86_get_regnum(reg1); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } else { - /* FIXME */ - } - -} - -void x86_emit_mov_reg_reg (OrcProgram *program, int size, int reg1, int reg2) -{ - if (size == 2) { - printf(" movw %%%s, %%%s\n", x86_get_regname_16(reg1), - x86_get_regname_16(reg2)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" movl %%%s, %%%s\n", x86_get_regname(reg1), - x86_get_regname(reg2)); - } else { - printf(" mov %%%s, %%%s\n", x86_get_regname_64(reg1), - x86_get_regname_64(reg2)); - } - - x86_emit_rex(program, size, reg2, 0, reg1); - *program->codeptr++ = 0x89; - x86_emit_modrm_reg (program, reg2, reg1); -} - -void x86_emit_mov_reg_mmx (OrcProgram *program, int reg1, int reg2) -{ - /* FIXME */ - printf(" movd %%%s, %%%s\n", x86_get_regname(reg1), - x86_get_regname_mmx(reg2)); - x86_emit_rex(program, 0, reg1, 0, reg2); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6e; - x86_emit_modrm_reg (program, reg1, reg2); -} - -void x86_emit_mov_mmx_reg (OrcProgram *program, int reg1, int reg2) -{ - /* FIXME */ - printf(" movd %%%s, %%%s\n", x86_get_regname_mmx(reg1), - x86_get_regname(reg2)); - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7e; - x86_emit_modrm_reg (program, reg2, reg1); -} - -void x86_emit_mov_reg_sse (OrcProgram *program, int reg1, int reg2) -{ - /* FIXME */ - printf(" movd %%%s, %%%s\n", x86_get_regname(reg1), - x86_get_regname_sse(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg1, 0, reg2); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x6e; - x86_emit_modrm_reg (program, reg1, reg2); -} - -void x86_emit_mov_sse_reg (OrcProgram *program, int reg1, int reg2) -{ - /* FIXME */ - printf(" movd %%%s, %%%s\n", x86_get_regname_sse(reg1), - x86_get_regname(reg2)); - *program->codeptr++ = 0x66; - x86_emit_rex(program, 0, reg2, 0, reg1); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x7e; - x86_emit_modrm_reg (program, reg2, reg1); -} - -void -x86_emit_test_reg_reg (OrcProgram *program, int size, int reg1, int reg2) -{ - if (size == 2) { - printf(" testw %%%s, %%%s\n", x86_get_regname_16(reg1), - x86_get_regname_16(reg2)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" testl %%%s, %%%s\n", x86_get_regname(reg1), - x86_get_regname(reg2)); - } else { - printf(" test %%%s, %%%s\n", x86_get_regname(reg1), - x86_get_regname(reg2)); - } - - x86_emit_rex(program, size, reg2, 0, reg1); - *program->codeptr++ = 0x85; - x86_emit_modrm_reg (program, reg2, reg1); -} - -void -x86_emit_sar_imm_reg (OrcProgram *program, int size, int value, int reg) -{ - if (size == 2) { - printf(" sarw $%d, %%%s\n", value, x86_get_regname_16(reg)); - } else if (size == 4) { - printf(" sarl $%d, %%%s\n", value, x86_get_regname(reg)); - } else { - printf(" sar $%d, %%%s\n", value, x86_get_regname_64(reg)); - } - - x86_emit_rex(program, size, reg, 0, 0); - if (value == 1) { - *program->codeptr++ = 0xd1; - x86_emit_modrm_reg (program, reg, 7); - } else { - *program->codeptr++ = 0xc1; - x86_emit_modrm_reg (program, reg, 7); - *program->codeptr++ = value; - } -} - -void -x86_emit_and_imm_memoffset (OrcProgram *program, int size, int value, - int offset, int reg) -{ - if (size == 2) { - printf(" andw $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" andl $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } else { - printf(" and $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - if (value >= -128 && value < 128) { - *program->codeptr++ = 0x83; - /* FIXME */ - x86_emit_modrm_memoffset (program, 0, offset, reg); - *program->codeptr++ = (value & 0xff); - } else { - *program->codeptr++ = 0x81; - /* FIXME */ - x86_emit_modrm_memoffset (program, 0, offset, reg); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - if (size == 4) { - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } - } -} - -void -x86_emit_and_imm_reg (OrcProgram *program, int size, int value, int reg) -{ - if (size == 2) { - printf(" andw $%d, %%%s\n", value, x86_get_regname_16(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" andl $%d, %%%s\n", value, x86_get_regname(reg)); - } else { - printf(" and $%d, %%%s\n", value, x86_get_regname_64(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - if (value >= -128 && value < 128) { - *program->codeptr++ = 0x83; - x86_emit_modrm_reg (program, reg, 4); - *program->codeptr++ = (value & 0xff); - } else { - *program->codeptr++ = 0x81; - x86_emit_modrm_reg (program, reg, 4); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - if (size == 4) { - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } - } -} - -void -x86_emit_add_imm_memoffset (OrcProgram *program, int size, int value, - int offset, int reg) -{ - if (size == 2) { - printf(" addw $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" addl $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } else { - printf(" add $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - if (value >= -128 && value < 128) { - *program->codeptr++ = 0x83; - x86_emit_modrm_memoffset (program, 0, offset, reg); - *program->codeptr++ = (value & 0xff); - } else { - *program->codeptr++ = 0x81; - x86_emit_modrm_memoffset (program, 0, offset, reg); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - if (size == 4) { - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } - } -} - -void -x86_emit_add_imm_reg (OrcProgram *program, int size, int value, int reg) -{ - if (size == 2) { - printf(" addw $%d, %%%s\n", value, x86_get_regname_16(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" addl $%d, %%%s\n", value, x86_get_regname(reg)); - } else { - printf(" add $%d, %%%s\n", value, x86_get_regname_64(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - if (value >= -128 && value < 128) { - *program->codeptr++ = 0x83; - x86_emit_modrm_reg (program, reg, 0); - *program->codeptr++ = (value & 0xff); - } else { - *program->codeptr++ = 0x81; - x86_emit_modrm_reg (program, reg, 0); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - if (size == 4) { - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } - } -} - -void -x86_emit_cmp_imm_memoffset (OrcProgram *program, int size, int value, - int offset, int reg) -{ - if (size == 2) { - printf(" cmpw $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" cmpl $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } else { - printf(" cmp $%d, %d(%%%s)\n", value, offset, - x86_get_regname_ptr(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - if (value >= -128 && value < 128) { - *program->codeptr++ = 0x83; - x86_emit_modrm_memoffset (program, 7, offset, reg); - *program->codeptr++ = (value & 0xff); - } else { - *program->codeptr++ = 0x81; - x86_emit_modrm_memoffset (program, 7, offset, reg); - *program->codeptr++ = (value & 0xff); - *program->codeptr++ = ((value>>8) & 0xff); - if (size == 4) { - *program->codeptr++ = ((value>>16) & 0xff); - *program->codeptr++ = ((value>>24) & 0xff); - } - } -} - -void -x86_emit_dec_memoffset (OrcProgram *program, int size, - int offset, int reg) -{ - if (size == 2) { - printf(" decw %d(%%%s)\n", offset, x86_get_regname_ptr(reg)); - *program->codeptr++ = 0x66; - } else if (size == 4) { - printf(" decl %d(%%%s)\n", offset, x86_get_regname_ptr(reg)); - } else { - printf(" dec %d(%%%s)\n", offset, x86_get_regname_ptr(reg)); - } - - x86_emit_rex(program, size, 0, 0, reg); - *program->codeptr++ = 0xff; - x86_emit_modrm_memoffset (program, 1, offset, reg); -} - -void x86_emit_ret (OrcProgram *program) -{ - if (x86_64) { - printf(" retq\n"); - } else { - printf(" ret\n"); - } - *program->codeptr++ = 0xc3; -} - -void x86_emit_emms (OrcProgram *program) -{ - printf(" emms\n"); - *program->codeptr++ = 0x0f; - *program->codeptr++ = 0x77; -} - -void -x86_add_fixup (OrcProgram *program, unsigned char *ptr, int label) -{ - program->fixups[program->n_fixups].ptr = ptr; - program->fixups[program->n_fixups].label = label; - program->fixups[program->n_fixups].type = 0; - program->n_fixups++; -} - -void -x86_add_label (OrcProgram *program, unsigned char *ptr, int label) -{ - program->labels[label] = ptr; -} - -void x86_emit_je (OrcProgram *program, int label) -{ - printf(" je .L%d\n", label); - - *program->codeptr++ = 0x74; - x86_add_fixup (program, program->codeptr, label); - *program->codeptr++ = -1; -} - -void x86_emit_jne (OrcProgram *program, int label) -{ - printf(" jne .L%d\n", label); - *program->codeptr++ = 0x75; - x86_add_fixup (program, program->codeptr, label); - *program->codeptr++ = -1; -} - -void x86_emit_label (OrcProgram *program, int label) -{ - printf(".L%d:\n", label); - - x86_add_label (program, program->codeptr, label); -} - -void -x86_test (OrcProgram *program) -{ - int size; - int i; - int j; - int reg; - - for(size=2;size<=4;size+=2) { - for(i=0;i<8;i++){ - reg = ORC_GP_REG_BASE + i; - x86_emit_push (program, size, reg); - x86_emit_pop (program, size, reg); - x86_emit_mov_imm_reg (program, size, 0, reg); - x86_emit_mov_imm_reg (program, size, 1, reg); - x86_emit_mov_imm_reg (program, size, 256, reg); - x86_emit_dec_memoffset (program, size, 0, reg); - x86_emit_dec_memoffset (program, size, 1, reg); - x86_emit_dec_memoffset (program, size, 256, reg); - x86_emit_add_imm_memoffset (program, size, 1, 0, reg); - x86_emit_add_imm_memoffset (program, size, 1, 1, reg); - x86_emit_add_imm_memoffset (program, size, 1, 256, reg); - x86_emit_add_imm_memoffset (program, size, 256, 0, reg); - x86_emit_add_imm_memoffset (program, size, 256, 1, reg); - x86_emit_add_imm_memoffset (program, size, 256, 256, reg); - for(j=0;j<8;j++){ - int reg2 = ORC_GP_REG_BASE + j; - x86_emit_mov_reg_reg (program, size, reg, reg2); - x86_emit_mov_memoffset_reg (program, size, 0, reg, reg2); - x86_emit_mov_memoffset_reg (program, size, 1, reg, reg2); - x86_emit_mov_memoffset_reg (program, size, 256, reg, reg2); - x86_emit_mov_reg_memoffset (program, size, reg, 0, reg2); - x86_emit_mov_reg_memoffset (program, size, reg, 1, reg2); - x86_emit_mov_reg_memoffset (program, size, reg, 256, reg2); - } - } - } - -} - diff --git a/orc/x86.h b/orc/x86.h deleted file mode 100644 index dc47b11..0000000 --- a/orc/x86.h +++ /dev/null @@ -1,101 +0,0 @@ - -#ifndef _ORC_X86_H_ -#define _ORC_X86_H_ - -#include <unistd.h> - -extern int x86_64; -extern int x86_exec_ptr; - -void x86_emit_push (OrcProgram *program, int size, int reg); -void x86_emit_pop (OrcProgram *program, int size, int reg); -void x86_emit_mov_memoffset_reg (OrcProgram *program, int size, int offset, int reg1, int reg2); -void x86_emit_mov_memoffset_mmx (OrcProgram *program, int size, int offset, - int reg1, int reg2); -void x86_emit_mov_memoffset_sse (OrcProgram *program, int size, int offset, - int reg1, int reg2); -void x86_emit_mov_reg_memoffset (OrcProgram *program, int size, int reg1, int offset, int reg2); -void x86_emit_mov_mmx_memoffset (OrcProgram *program, int size, int reg1, int offset, - int reg2); -void x86_emit_mov_sse_memoffset (OrcProgram *program, int size, int reg1, int offset, - int reg2); -void x86_emit_mov_imm_reg (OrcProgram *program, int size, int value, int reg1); -void x86_emit_mov_reg_reg (OrcProgram *program, int size, int reg1, int reg2); -void x86_emit_mov_reg_mmx (OrcProgram *program, int reg1, int reg2); -void x86_emit_mov_mmx_reg (OrcProgram *program, int reg1, int reg2); -void x86_emit_mov_reg_sse (OrcProgram *program, int reg1, int reg2); -void x86_emit_mov_sse_reg (OrcProgram *program, int reg1, int reg2); -void x86_emit_test_reg_reg (OrcProgram *program, int size, int reg1, int reg2); -void x86_emit_sar_imm_reg (OrcProgram *program, int size, int value, int reg); -void x86_emit_dec_memoffset (OrcProgram *program, int size, int offset, int reg); -void x86_emit_add_imm_memoffset (OrcProgram *program, int size, int value, int offset, int reg); -void x86_emit_and_imm_memoffset (OrcProgram *program, int size, int value, int offset, int reg); -void x86_emit_add_imm_reg (OrcProgram *program, int size, int value, int reg); -void x86_emit_and_imm_reg (OrcProgram *program, int size, int value, int reg); -void x86_emit_cmp_imm_memoffset (OrcProgram *program, int size, int value, - int offset, int reg); -void x86_emit_emms (OrcProgram *program); -void x86_emit_ret (OrcProgram *program); -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_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); - -void mmx_emit_loadi_s16 (OrcProgram *p, int reg, int value); - -enum { - X86_EAX = ORC_GP_REG_BASE, - X86_ECX, - X86_EDX, - X86_EBX, - X86_ESP, - X86_EBP, - X86_ESI, - X86_EDI, - X86_R8, - X86_R9, - X86_R10, - X86_R11, - X86_R12, - X86_R13, - X86_R14, - X86_R15, - X86_MM0 = ORC_VEC1_REG_BASE, - X86_MM1, - X86_MM2, - X86_MM3, - X86_MM4, - X86_MM5, - X86_MM6, - X86_MM7, - X86_XMM0 = ORC_VEC2_REG_BASE, - X86_XMM1, - X86_XMM2, - X86_XMM3, - X86_XMM4, - X86_XMM5, - X86_XMM6, - X86_XMM7, - X86_XMM8, - X86_XMM9, - X86_XMM10, - X86_XMM11, - X86_XMM12, - X86_XMM13, - X86_XMM14, - X86_XMM15 -}; - -const char * x86_get_regname(int i); -int x86_get_regnum(int i); -const char * x86_get_regname_16(int i); -const char * x86_get_regname_64(int i); -const char * x86_get_regname_ptr(int i); -const char * x86_get_regname_mmx(int i); -const char * x86_get_regname_sse(int i); - -#endif - |