summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2008-06-30 15:19:40 -0700
committerDavid Schleef <ds@schleef.org>2008-06-30 15:19:40 -0700
commitf3cb425bb04f18a7aff87913cfa00e4cb346dfbe (patch)
tree3b33731fd19fd6fa59f21c77438436b866582846
parentb3208ae93e99f0d6259d1e49f995bf9c6c00b430 (diff)
downloadliboil-f3cb425bb04f18a7aff87913cfa00e4cb346dfbe.tar.gz
Move orc into separate package
-rw-r--r--Makefile.am10
-rw-r--r--configure.ac10
-rw-r--r--examples/Makefile.am2
-rw-r--r--examples/orc/Makefile.am10
-rw-r--r--examples/orc/jit.c96
-rw-r--r--examples/orc/simple.c141
-rw-r--r--orc-uninstalled.pc.in10
-rw-r--r--orc.pc.in14
-rw-r--r--orc/Makefile.am41
-rw-r--r--orc/orc.c21
-rw-r--r--orc/orc.h8
-rw-r--r--orc/orcexecutor.c112
-rw-r--r--orc/orcopcodes.c101
-rw-r--r--orc/orcprogram-c.c199
-rw-r--r--orc/orcprogram-linux.c54
-rw-r--r--orc/orcprogram-powerpc.c732
-rw-r--r--orc/orcprogram-unknown-os.c58
-rw-r--r--orc/orcprogram-x86.c448
-rw-r--r--orc/orcprogram.c524
-rw-r--r--orc/orcprogram.h274
-rw-r--r--orc/orcrule.c23
-rw-r--r--orc/orcrules-mmx.c162
-rw-r--r--orc/orcrules-sse.c171
-rw-r--r--orc/orcrules-x86.c145
-rw-r--r--orc/orctype.c44
-rw-r--r--orc/test.c21
-rw-r--r--orc/x86.c749
-rw-r--r--orc/x86.h101
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
-