dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] [SCM] DotGNU Portable.NET Just In Time compiler (l


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] [SCM] DotGNU Portable.NET Just In Time compiler (libjit) branch, master, updated. bcf9a2ff8bd47b798c41986eec527d96ea386317
Date: Tue, 03 Aug 2010 09:50:54 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "DotGNU Portable.NET Just In Time compiler (libjit)".

The branch, master has been updated
       via  bcf9a2ff8bd47b798c41986eec527d96ea386317 (commit)
      from  1bd66609ae702b2df9bc8670a94ff9bcb153c312 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit/libjit.git/commit/?id=bcf9a2ff8bd47b798c41986eec527d96ea386317

commit bcf9a2ff8bd47b798c41986eec527d96ea386317
Author: Klaus Treichel <address@hidden>
Date:   Tue Aug 3 11:44:07 2010 +0200

    Add gen-ops tool for generation all opcode defintions ans tables from one
    source.
    Add sources for basic libjit opcodes and interpreter specific libjit
    opcodes.

diff --git a/ChangeLog b/ChangeLog
index 0b8d9e3..9e29a4e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2010-08-03  Klaus Treichel  <address@hidden>
+
+       * Makefile.am: Add config to the subdirectories.
+
+       * configure.ac: Add config/Makefile the the makefiles to generate.
+
+       * include/jit/Makefile.am: Add jit-opcode.h to BUILT_SOURCES and
+       DISTCLEANFILES. Add the rule to generate jit-opcodes.h.
+
+       * include/jit/jit-opcode.h: Delete because it will be generated.
+
+       * jit/Makefile.am: Add jit-opcode.c, jit-interp-opcode.c and
+       jit-interp-opcode.h to BUILT_SOURCES.
+       Add jit-interp-opcode.c and jit-interp-opcode.h to libjit_la_SOURCES.
+       Add rules to generate jit-opcode.c, jit-interp-opcode.c and
+       jit-interp-opcode.h.
+       Adjust rule to generate jit-interp-labels.h. 
+
+       * jit/jit-dump.c: Remove the extern declaration of the interpreter
+       opcode table.
+
+       * jit/jit-interp.h: Replace the opcode declaration by including
+       the generated file.
+
+       * jit/jit-opcode.c: Delete because its generated now.
+
+       * jit/jit-interp.c: Adjust names of interpreter specific opcodes.
+
+       * jit/jit-rules-interp.c: Likewise.
+
+       * jit/mklabel.sh: Adjust for opcode name change of interpreter
+       specific opcodes.
+
+       * tools/.gitignore: Add new built files.
+
+       * tools/Makefile.am: Add rules to build gen-ops.
+
+       * tools/gen-ops-parser.y, tools/gen-ops-scanner.l: Add opcode table
+       generator.
+
+       * config/Makefile.am: Added
+
+       * config/jit-opcodes.ops: Add definition source of the bastic
+       libjit opcodes.
+
+       * config/jit-interp-opcodes.ops: Add definition source of the
+       interpreter specific libjit opcodes.
+
 2010-05-31  Aleksey Demakov  <address@hidden>
 
        * jit/jit-block.c: allow empty block branch optimization for blocks
diff --git a/Makefile.am b/Makefile.am
index baf1fc5..16987e8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,2 +1,2 @@
 
-SUBDIRS = include tools jit jitdynamic jitplus dpas tutorial tests doc
+SUBDIRS = config tools include jit jitdynamic jitplus dpas tutorial tests doc
diff --git a/config/Makefile.am b/config/Makefile.am
new file mode 100644
index 0000000..ffa4689
--- /dev/null
+++ b/config/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = jit-opcodes.ops jit-interp-opcodes.ops
diff --git a/config/jit-interp-opcodes.ops b/config/jit-interp-opcodes.ops
new file mode 100644
index 0000000..8b10f45
--- /dev/null
+++ b/config/jit-interp-opcodes.ops
@@ -0,0 +1,225 @@
+%{
+/*
+ * jit-interp-opcode.c - Information about interpreter specific JIT opcodes.
+ *
+ * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
+ *
+ * This file is part of the libjit library.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "jit-internal.h"
+#include "jit-interp-opcode.h"
+#include "jit-rules.h"
+
+#if defined(JIT_BACKEND_INTERP)
+
+%}
+
+%[
+/*
+ * jit-interp-opcode.h - List of interpreter specific opcodes for
+ *                      JIT instructions.
+ *
+ * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef        _JIT_INTERP_OPCODE_H
+#define        _JIT_INTERP_OPCODE_H
+
+#include <jit/jit-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+%]
+
+opcodes(JIT_INTERP_OP_,
+       "jit_opcode_info_t const 
_jit_interp_opcodes[JIT_INTERP_OP_NUM_OPCODES]",
+       "JIT_OP_NUM_OPCODES")
+{
+       /*
+        * Argument variable access opcodes.
+        */
+       op_def("lda_0_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_0_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldaa_0") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_1_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldaa_1") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("lda_2_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldaa_2") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_byte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("sta_0_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       /*
+        * Local variable frame access opcodes.
+        */
+       op_def("ldl_0_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_0_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldla_0") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_1_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldla_1") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_sbyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_ubyte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_ushort") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldl_2_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldla_2") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_byte") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_short") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_long") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_float32") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_float64") { "JIT_OPCODE_NINT_ARG" }
+       op_def("stl_0_nfloat") { "JIT_OPCODE_NINT_ARG" }
+       /*
+        * Load constant values.
+        */
+       op_def("ldc_0_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldc_1_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldc_2_int") { "JIT_OPCODE_NINT_ARG" }
+       op_def("ldc_0_long") { "JIT_OPCODE_CONST_LONG" }
+       op_def("ldc_1_long") { "JIT_OPCODE_CONST_LONG" }
+       op_def("ldc_2_long") { "JIT_OPCODE_CONST_LONG" }
+       op_def("ldc_0_float32") { "JIT_OPCODE_CONST_FLOAT32" }
+       op_def("ldc_1_float32") { "JIT_OPCODE_CONST_FLOAT32" }
+       op_def("ldc_2_float32") { "JIT_OPCODE_CONST_FLOAT32" }
+       op_def("ldc_0_float64") { "JIT_OPCODE_CONST_FLOAT64" }
+       op_def("ldc_1_float64") { "JIT_OPCODE_CONST_FLOAT64" }
+       op_def("ldc_2_float64") { "JIT_OPCODE_CONST_FLOAT64" }
+       op_def("ldc_0_nfloat") { "JIT_OPCODE_CONST_NFLOAT" }
+       op_def("ldc_1_nfloat") { "JIT_OPCODE_CONST_NFLOAT" }
+       op_def("ldc_2_nfloat") { "JIT_OPCODE_CONST_NFLOAT" }
+       /*
+        * Load return value.
+        */
+       op_def("ldr_0_int") { }
+       op_def("ldr_0_long") { }
+       op_def("ldr_0_float32") { }
+       op_def("ldr_0_float64") { }
+       op_def("ldr_0_nfloat") { }
+       /*
+        * Stack management.
+        */
+       op_def("pop") { }
+       op_def("pop_2") { }
+       op_def("pop_3") { }
+       /*
+        * Nested function call handling.
+        */
+       op_def("import_local") { "JIT_OPCODE_NINT_ARG_TWO" }
+       op_def("import_arg") { "JIT_OPCODE_NINT_ARG_TWO" }
+       /*
+        * Marker opcode for the end of a function.
+        */
+       op_def("end_marker") { }
+}
+
+%[
+
+/*
+ * Opcode version.  Should be increased whenever new opcodes
+ * are added to this list or the public list in "jit-opcode.h".
+ * This value is written to ELF binaries, to ensure that code
+ * for one version of libjit is not inadvertantly used in another.
+ */
+#define        JIT_OPCODE_VERSION                                      0
+
+/*
+ * Additional opcode definition flags.
+ */
+#define        JIT_OPCODE_INTERP_ARGS_MASK                     0x7E000000
+#define        JIT_OPCODE_NINT_ARG                                     
0x02000000
+#define        JIT_OPCODE_NINT_ARG_TWO                         0x04000000
+#define        JIT_OPCODE_CONST_LONG                           0x06000000
+#define        JIT_OPCODE_CONST_FLOAT32                        0x08000000
+#define        JIT_OPCODE_CONST_FLOAT64                        0x0A000000
+#define        JIT_OPCODE_CONST_NFLOAT                         0x0C000000
+#define        JIT_OPCODE_CALL_INDIRECT_ARGS           0x0E000000
+
+extern jit_opcode_info_t const _jit_interp_opcodes[JIT_INTERP_OP_NUM_OPCODES];
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _JIT_INTERP_OPCODE_H */
+%]
+
+%{
+#endif /* defined(JIT_BACKEND_INTERP) */
+%}
diff --git a/config/jit-opcodes.ops b/config/jit-opcodes.ops
new file mode 100644
index 0000000..c156443
--- /dev/null
+++ b/config/jit-opcodes.ops
@@ -0,0 +1,630 @@
+%{
+/*
+ * jit-opcode.c - Information about all of the JIT opcodes.
+ *
+ * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
+ *
+ * This file is part of the libjit library.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "jit-internal.h"
+#include "jit-rules.h"
+
+#if defined(JIT_BACKEND_INTERP)
+       #define NINT_ARG                        JIT_OPCODE_NINT_ARG
+       #define NINT_ARG_TWO            JIT_OPCODE_NINT_ARG_TWO
+       #define INDIRECT_ARGS           JIT_OPCODE_CALL_INDIRECT_ARGS
+#else
+       #define NINT_ARG                        0
+       #define NINT_ARG_TWO            0
+       #define INDIRECT_ARGS           0
+#endif
+
+%}
+
+%[
+/*
+ * jit-opcode.h - List of primitive opcodes for JIT instructions.
+ *
+ * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef        _JIT_OPCODE_H
+#define        _JIT_OPCODE_H
+
+#include <jit/jit-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+%]
+
+opcodes(JIT_OP_, "jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES]")
+{
+       op_def("nop") { }
+       /*
+        * Conversion opcodes
+        */
+       op_def("trunc_sbyte") { op_values(int, int) }
+       op_def("trunc_ubyte") { op_values(int, int) }
+       op_def("trunc_short") { op_values(int, int) }
+       op_def("trunc_ushort") { op_values(int, int) }
+       op_def("trunc_int") { op_values(int, int) }
+       op_def("trunc_uint") { op_values(int, int) }
+       op_def("check_sbyte") { op_values(int, int) }
+       op_def("check_ubyte") { op_values(int, int) }
+       op_def("check_short") { op_values(int, int) }
+       op_def("check_ushort") { op_values(int, int) }
+       op_def("check_int") { op_values(int, int) }
+       op_def("check_uint") { op_values(int, int) }
+       op_def("low_word") { op_values(int, long) }
+       op_def("expand_int") { op_values(long, int) }
+       op_def("expand_uint") { op_values(long, int) }
+       op_def("check_low_word") { op_values(int, long) }
+       op_def("check_signed_low_word") { op_values(int, long) }
+       op_def("check_long") { op_values(long, long) }
+       op_def("check_ulong") { op_values(long, long) }
+       op_def("nfloat_to_int") { op_values(int, nfloat) }
+       op_def("nfloat_to_uint") { op_values(int, nfloat) }
+       op_def("nfloat_to_long") { op_values(long, nfloat) }
+       op_def("nfloat_to_ulong") { op_values(long, nfloat) }
+       op_def("check_nfloat_to_int") { op_values(int, nfloat) }
+       op_def("check_nfloat_to_uint") { op_values(int, nfloat) }
+       op_def("check_nfloat_to_long") { op_values(long, nfloat) }
+       op_def("check_nfloat_to_ulong") { op_values(long, nfloat) }
+       op_def("int_to_nfloat") { op_values(nfloat, int) }
+       op_def("uint_to_nfloat") { op_values(nfloat, int) }
+       op_def("long_to_nfloat") { op_values(nfloat, long) }
+       op_def("ulong_to_nfloat") { op_values(nfloat, long) }
+       op_def("nfloat_to_float32") { op_values(float32, nfloat) }
+       op_def("nfloat_to_float64") { op_values(float64, nfloat) }
+       op_def("float32_to_nfloat") { op_values(nfloat, float32) }
+       op_def("float64_to_nfloat") { op_values(nfloat, float64) }
+       /*
+        * Arithmetic opcodes.
+        */
+       op_def("iadd", +) { op_values(int, int, int) }
+       op_def("iadd_ovf") { op_values(int, int, int) }
+       op_def("iadd_ovf_un") { op_values(int, int, int) }
+       op_def("isub", -) { op_values(int, int, int) }
+       op_def("isub_ovf") { op_values(int, int, int) }
+       op_def("isub_ovf_un") { op_values(int, int, int) }
+       op_def("imul", *) { op_values(int, int, int) }
+       op_def("imul_ovf") { op_values(int, int, int) }
+       op_def("imul_ovf_un") { op_values(int, int, int) }
+       op_def("idiv", /) { op_values(int, int, int) }
+       op_def("idiv_un") { op_values(int, int, int) }
+       op_def("irem", %) { op_values(int, int, int) }
+       op_def("irem_un") { op_values(int, int, int) }
+       op_def("ineg", neg) { op_values(int, int) }
+       op_def("ladd", +) { op_values(long, long, long) }
+       op_def("ladd_ovf") { op_values(long, long, long) }
+       op_def("ladd_ovf_un") { op_values(long, long, long) }
+       op_def("lsub", -) { op_values(long, long, long) }
+       op_def("lsub_ovf") { op_values(long, long, long) }
+       op_def("lsub_ovf_un") { op_values(long, long, long) }
+       op_def("lmul", *) { op_values(long, long, long) }
+       op_def("lmul_ovf") { op_values(long, long, long) }
+       op_def("lmul_ovf_un") { op_values(long, long, long) }
+       op_def("ldiv", /) { op_values(long, long, long) }
+       op_def("ldiv_un") { op_values(long, long, long) }
+       op_def("lrem", %) { op_values(long, long, long) }
+       op_def("lrem_un") { op_values(long, long, long) }
+       op_def("lneg", neg) { op_values(long, long) }
+       op_def("fadd", +) { op_values(float32, float32, float32) }
+       op_def("fsub", -) { op_values( float32, float32, float32) }
+       op_def("fmul", *) { op_values(float32, float32, float32) }
+       op_def("fdiv", /) { op_values(float32, float32, float32) }
+       op_def("frem", %) { op_values(float32, float32, float32) }
+       op_def("frem_ieee") { op_values(float32, float32, float32) }
+       op_def("fneg", neg) { op_values(float32, float32) }
+       op_def("dadd", +) { op_values(float64, float64, float64) }
+       op_def("dsub", -) { op_values(float64, float64, float64) }
+       op_def("dmul", *) { op_values(float64, float64, float64) }
+       op_def("ddiv", /) { op_values(float64, float64, float64) }
+       op_def("drem", %) { op_values(float64, float64, float64) }
+       op_def("drem_ieee") { op_values(float64, float64, float64) }
+       op_def("dneg", neg) { op_values(float64, float64) }
+       op_def("nfadd", +) { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfsub", -) { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfmul", *) { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfdiv", /) { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfrem", %) { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfrem_ieee") { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfneg", neg) { op_values(nfloat, nfloat) }
+       /*
+        * Bitwise opcodes.
+        */
+       op_def("iand", &) { op_values(int, int, int) }
+       op_def("ior", |) { op_values(int, int, int) }
+       op_def("ixor", ^) { op_values(int, int, int) }
+       op_def("inot", ~) { op_values(int, int) }
+       op_def("ishl", <<) { op_values(int, int, int) }
+       op_def("ishr", >>) { op_values(int, int, int) }
+       op_def("ishr_un", shr_un) { op_values(int, int, int) }
+       op_def("land", &) { op_values(long, long, long) }
+       op_def("lor", |) { op_values(long, long, long) }
+       op_def("lxor", ^) { op_values(long, long, long) }
+       op_def("lnot", ~) { op_values(long, long) }
+       op_def("lshl", <<) { op_values(long, long, int) }
+       op_def("lshr", >>) { op_values(long, long, int) }
+       op_def("lshr_un", shr_un) { op_values(long, long, int) }
+       /*
+        * Branch opcodes.
+        */
+       op_def("br") { op_type(branch) }
+       op_def("br_ifalse") { op_type(branch), op_values(empty, int) }
+       op_def("br_itrue") { op_type(branch), op_values(empty, int) }
+       op_def("br_ieq", ==) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ine", !=) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ilt", <) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ilt_un") { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ile", <=) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ile_un") { op_type(branch), op_values(empty, int, int) }
+       op_def("br_igt", >) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_igt_un") { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ige", >=) { op_type(branch), op_values(empty, int, int) }
+       op_def("br_ige_un") { op_type(branch), op_values(empty, int, int) }
+       op_def("br_lfalse") { op_type(branch), op_values(empty, long) }
+       op_def("br_ltrue") { op_type(branch), op_values(empty, long) }
+       op_def("br_leq", ==) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lne", !=) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_llt", <) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_llt_un") { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lle", <=) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lle_un") { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lgt", >) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lgt_un") { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lge", >=) { op_type(branch), op_values(empty, long, long) }
+       op_def("br_lge_un") { op_type(branch), op_values(empty, long, long) }
+       op_def("br_feq", ==) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fne", !=) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_flt", <) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fle", <=) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fgt", >) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fge", >=) { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_feq_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fne_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_flt_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fle_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fgt_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_fge_inv") { op_type(branch), op_values(empty, float32, 
float32) }
+       op_def("br_deq", ==) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dne", !=) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dlt", <) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dle", <=) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dgt", >) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dge", >=) { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_deq_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dne_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dlt_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dle_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dgt_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_dge_inv") { op_type(branch), op_values(empty, float64, 
float64) }
+       op_def("br_nfeq", ==) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfne", !=) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nflt", <) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfle", <=) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfgt", >) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfge", >=) { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfeq_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfne_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nflt_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfle_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfgt_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       op_def("br_nfge_inv") { op_type(branch), op_values(empty, nfloat, 
nfloat) }
+       /*
+        * Comparison opcodes.
+        */
+       op_def("icmp") { op_values(int, int, int) }
+       op_def("icmp_un") { op_values(int, int, int) }
+       op_def("lcmp") { op_values(int, long, long) }
+       op_def("lcmp_un") { op_values(int, long, long) }
+       op_def("fcmpl") { op_values(int, float32, float32) }
+       op_def("fcmpg") { op_values(int, float32, float32) }
+       op_def("dcmpl") { op_values(int, float64, float64) }
+       op_def("dcmpg") { op_values(int, float64, float64) }
+       op_def("nfcmpl") { op_values(int, nfloat, nfloat) }
+       op_def("nfcmpg") { op_values(int, nfloat, nfloat) }
+       op_def("ieq", ==) { op_values(int, int, int) }
+       op_def("ine", !=) { op_values(int, int, int) }
+       op_def("ilt", <) { op_values(int, int, int) }
+       op_def("ilt_un") { op_values(int, int, int) }
+       op_def("ile", <=) { op_values(int, int, int) }
+       op_def("ile_un") { op_values(int, int, int) }
+       op_def("igt", >) { op_values(int, int, int) }
+       op_def("igt_un") { op_values(int, int, int) }
+       op_def("ige", >=) { op_values(int, int, int) }
+       op_def("ige_un") { op_values(int, int, int) }
+       op_def("leq", ==) { op_values(int, long, long) }
+       op_def("lne", !=) { op_values(int, long, long) }
+       op_def("llt", <) { op_values(int, long, long) }
+       op_def("llt_un") { op_values(int, long, long) }
+       op_def("lle", <=) { op_values(int, long, long) }
+       op_def("lle_un") { op_values(int, long, long) }
+       op_def("lgt", >) { op_values(int, long, long) }
+       op_def("lgt_un") { op_values(int, long, long) }
+       op_def("lge", >=) { op_values(int, long, long) }
+       op_def("lge_un") { op_values(int, long, long) }
+       op_def("feq", ==) { op_values(int, float32, float32) }
+       op_def("fne", !=) { op_values(int, float32, float32) }
+       op_def("flt", <) { op_values(int, float32, float32) }
+       op_def("fle", <=) { op_values(int, float32, float32) }
+       op_def("fgt", >) { op_values(int, float32, float32) }
+       op_def("fge", >=) { op_values(int, float32, float32) }
+       op_def("feq_inv") { op_values(int, float32, float32) }
+       op_def("fne_inv") { op_values(int, float32, float32) }
+       op_def("flt_inv") { op_values(int, float32, float32) }
+       op_def("fle_inv") { op_values(int, float32, float32) }
+       op_def("fgt_inv") { op_values(int, float32, float32) }
+       op_def("fge_inv") { op_values(int, float32, float32) }
+       op_def("deq", ==) { op_values(int, float64, float64) }
+       op_def("dne", !=) { op_values(int, float64, float64) }
+       op_def("dlt", <) { op_values(int, float64, float64) }
+       op_def("dle", <=) { op_values(int, float64, float64) }
+       op_def("dgt", >) { op_values(int, float64, float64) }
+       op_def("dge", >=) { op_values(int, float64, float64) }
+       op_def("deq_inv") { op_values(int, float64, float64) }
+       op_def("dne_inv") { op_values(int, float64, float64) }
+       op_def("dlt_inv") { op_values(int, float64, float64) }
+       op_def("dle_inv") { op_values(int, float64, float64) }
+       op_def("dgt_inv") { op_values(int, float64, float64) }
+       op_def("dge_inv") { op_values(int, float64, float64) }
+       op_def("nfeq", ==) { op_values(int, nfloat, nfloat) }
+       op_def("nfne", !=) { op_values(int, nfloat, nfloat) }
+       op_def("nflt", <) { op_values(int, nfloat, nfloat) }
+       op_def("nfle", <=) { op_values(int, nfloat, nfloat) }
+       op_def("nfgt", >) { op_values(int, nfloat, nfloat) }
+       op_def("nfge", >=) { op_values(int, nfloat, nfloat) }
+       op_def("nfeq_inv") { op_values(int, nfloat, nfloat) }
+       op_def("nfne_inv") { op_values(int, nfloat, nfloat) }
+       op_def("nflt_inv") { op_values(int, nfloat, nfloat) }
+       op_def("nfle_inv") { op_values(int, nfloat, nfloat) }
+       op_def("nfgt_inv") { op_values(int, nfloat, nfloat) }
+       op_def("nfge_inv") { op_values(int, nfloat, nfloat) }
+       op_def("is_fnan") { op_values(int, float32) }
+       op_def("is_finf") { op_values(int, float32) }
+       op_def("is_ffinite") { op_values(int, float32) }
+       op_def("is_dnan") { op_values(int, float64) }
+       op_def("is_dinf") { op_values(int, float64) }
+       op_def("is_dfinite") { op_values(int, float64) }
+       op_def("is_nfnan") { op_values(int, nfloat) }
+       op_def("is_nfinf") { op_values(int, nfloat) }
+       op_def("is_nffinite") { op_values(int, nfloat) }
+       /*
+        * Mathematical functions.
+        */
+       op_def("facos") { op_values(float32, float32) }
+       op_def("fasin") { op_values(float32, float32) }
+       op_def("fatan") { op_values(float32, float32) }
+       op_def("fatan2") { op_values(float32, float32, float32) }
+       op_def("fceil") { op_values(float32, float32) }
+       op_def("fcos") { op_values(float32, float32) }
+       op_def("fcosh") { op_values(float32, float32) }
+       op_def("fexp") { op_values(float32, float32) }
+       op_def("ffloor") { op_values(float32, float32) }
+       op_def("flog") { op_values(float32, float32) }
+       op_def("flog10") { op_values(float32, float32) }
+       op_def("fpow") { op_values(float32, float32, float32) }
+       op_def("frint") { op_values(float32, float32) }
+       op_def("fround") { op_values(float32, float32) }
+       op_def("fsin") { op_values(float32, float32) }
+       op_def("fsinh") { op_values(float32, float32) }
+       op_def("fsqrt") { op_values(float32, float32) }
+       op_def("ftan") { op_values(float32, float32) }
+       op_def("ftanh") { op_values(float32, float32) }
+       op_def("dacos") { op_values(float64, float64) }
+       op_def("dasin") { op_values(float64, float64) }
+       op_def("datan") { op_values(float64, float64) }
+       op_def("datan2") { op_values(float64, float64, float64)}
+       op_def("dceil") { op_values(float64, float64) }
+       op_def("dcos") { op_values(float64, float64) }
+       op_def("dcosh") { op_values(float64, float64) }
+       op_def("dexp") { op_values(float64, float64) }
+       op_def("dfloor") { op_values(float64, float64) }
+       op_def("dlog") { op_values(float64, float64) }
+       op_def("dlog10") { op_values(float64, float64) }
+       op_def("dpow") { op_values(float64, float64, float64) }
+       op_def("drint") { op_values(float64, float64) }
+       op_def("dround") { op_values(float64, float64) }
+       op_def("dsin") { op_values(float64, float64) }
+       op_def("dsinh") { op_values(float64, float64) }
+       op_def("dsqrt") { op_values(float64, float64) }
+       op_def("dtan") { op_values(float64, float64) }
+       op_def("dtanh") { op_values(float64, float64) }
+       op_def("nfacos") { op_values(nfloat, nfloat) }
+       op_def("nfasin") { op_values(nfloat, nfloat) }
+       op_def("nfatan") { op_values(nfloat, nfloat) }
+       op_def("nfatan2") { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfceil") { op_values(nfloat, nfloat) }
+       op_def("nfcos") { op_values(nfloat, nfloat) }
+       op_def("nfcosh") { op_values(nfloat, nfloat) }
+       op_def("nfexp") { op_values(nfloat, nfloat) }
+       op_def("nffloor") { op_values(nfloat, nfloat) }
+       op_def("nflog") { op_values(nfloat, nfloat) }
+       op_def("nflog10") { op_values(nfloat, nfloat) }
+       op_def("nfpow") { op_values(nfloat, nfloat, nfloat) }
+       op_def("nfrint") { op_values(nfloat, nfloat) }
+       op_def("nfround") { op_values(nfloat, nfloat) }
+       op_def("nfsin") { op_values(nfloat, nfloat) }
+       op_def("nfsinh") { op_values(nfloat, nfloat) }
+       op_def("nfsqrt") { op_values(nfloat, nfloat) }
+       op_def("nftan") { op_values(nfloat, nfloat) }
+       op_def("nftanh") { op_values(nfloat, nfloat) }
+       /*
+        * Absolute, minimum, maximum, and sign.
+        */
+       op_def("iabs") { op_values(int, int) }
+       op_def("labs") { op_values(long, long) }
+       op_def("fabs") { op_values(float32, float32) }
+       op_def("dabs") { op_values(float64, float64) }
+       op_def("nfabs") { op_values(nfloat, nfloat) }
+       op_def("imin") { op_values(int, int, int) }
+       op_def("imin_un") { op_values(int, int, int) }
+       op_def("lmin") { op_values(long, long, long) }
+       op_def("lmin_un") { op_values(long, long, long) }
+       op_def("fmin") { op_values(float32, float32, float32) }
+       op_def("dmin") { op_values(float64, float64, float64) }
+       op_def("nfmin") { op_values(nfloat, nfloat, nfloat) }
+       op_def("imax") { op_values(int, int, int) }
+       op_def("imax_un") { op_values(int, int, int) }
+       op_def("lmax") { op_values(long, long, long) }
+       op_def("lmax_un") { op_values(long, long, long) }
+       op_def("fmax") { op_values(float32, float32, float32) }
+       op_def("dmax") { op_values(float64, float64, float64) }
+       op_def("nfmax") { op_values(nfloat, nfloat, nfloat) }
+       op_def("isign") { op_values(int, int) }
+       op_def("lsign") { op_values(int, long) }
+       op_def("fsign") { op_values(int, float32) }
+       op_def("dsign") { op_values(int, float64) }
+       op_def("nfsign") { op_values(int, nfloat) }
+       /*
+        * Pointer check opcodes.
+        */
+       op_def("check_null") { op_values(empty, ptr) }
+       /*
+        * Function calls.
+        */
+       op_def("call") { op_type(call) }
+       op_def("call_tail") { op_type(call) }
+       op_def("call_indirect") { op_values(empty, ptr), "INDIRECT_ARGS" }
+       op_def("call_indirect_tail") { op_values(empty, ptr), "INDIRECT_ARGS" }
+       op_def("call_vtable_ptr") { op_values(empty, ptr) }
+       op_def("call_vtable_ptr_tail") { op_values(empty, ptr) }
+       op_def("call_external") { op_type(call_external) }
+       op_def("call_external_tail") { op_type(call_external) }
+       op_def("return") { }
+       op_def("return_int") { op_values(empty, int) }
+       op_def("return_long") { op_values(empty, long) }
+       op_def("return_float32") { op_values(empty, float32) }
+       op_def("return_float64") { op_values(empty, float64) }
+       op_def("return_nfloat") { op_values(empty, nfloat) }
+       op_def("return_small_struct") { op_values(empty, ptr, ptr), "NINT_ARG" }
+       op_def("setup_for_nested") { op_values(empty, int) }
+       op_def("setup_for_sibling") { op_values(empty, int, int), "NINT_ARG" }
+       op_def("import") { op_values(ptr, any, int) }
+       /*
+        * Exception handling.
+        */
+       op_def("throw") { op_values(empty, ptr) }
+       op_def("rethrow") { op_values(empty, ptr) }
+       op_def("load_pc") { op_values(ptr) }
+       op_def("load_exception_pc") { op_values(ptr) }
+       op_def("enter_finally") { }
+       op_def("leave_finally") { }
+       op_def("call_finally") { op_type(branch) }
+       op_def("enter_filter") { op_values(any) }
+       op_def("leave_filter") { op_values(empty, any) }
+       op_def("call_filter") { op_type(branch), op_values(empty, any) }
+       op_def("call_filter_return") { op_values(any) }
+       op_def("address_of_label") { op_type(address_of_label) }
+       /*
+        * Data manipulation.
+        */
+       op_def("copy_load_sbyte") { op_values(int, int) }
+       op_def("copy_load_ubyte") { op_values(int, int) }
+       op_def("copy_load_short") { op_values(int, int) }
+       op_def("copy_load_ushort") { op_values(int, int) }
+       op_def("copy_int", =) { op_values(int, int) }
+       op_def("copy_long", =) { op_values(long, long) }
+       op_def("copy_float32", =) { op_values(float32, float32) }
+       op_def("copy_float64", =) { op_values(float64, float64) }
+       op_def("copy_nfloat", =) { op_values(nfloat, nfloat) }
+       op_def("copy_struct", =) { op_values(ptr, ptr), "NINT_ARG" }
+       op_def("copy_store_byte") { op_values(int, int) }
+       op_def("copy_store_short") { op_values(int, int) }
+       op_def("address_of", address_of) { op_values(ptr) }
+       /*
+        * Incoming registers, outgoing registers, and stack pushes.
+        */
+       op_def("incoming_reg") { op_type(reg) }
+       op_def("incoming_frame_posn") { op_values(empty, any, int) }
+       op_def("outgoing_reg") { op_type(reg) }
+       op_def("outgoing_frame_posn") { op_values(empty, any, int) }
+       op_def("return_reg") { op_type(reg) }
+       op_def("push_int") { op_values(empty, int) }
+       op_def("push_long") { op_values(empty, long) }
+       op_def("push_float32") { op_values(empty, float32) }
+       op_def("push_float64") { op_values(empty, float64) }
+       op_def("push_nfloat") { op_values(empty, nfloat) }
+       op_def("push_struct") { op_values(empty, any, ptr), "NINT_ARG" }
+       op_def("pop_stack") { op_values(empty, int), "NINT_ARG" }
+       op_def("flush_small_struct") { op_values(empty, any), "NINT_ARG" }
+       op_def("set_param_int") { op_values(empty, int, ptr) }
+       op_def("set_param_long") { op_values(empty, long, ptr) }
+       op_def("set_param_float32") { op_values(empty, float32, ptr) }
+       op_def("set_param_float64") { op_values(empty, float64, ptr) }
+       op_def("set_param_nfloat") { op_values(empty, nfloat, ptr) }
+       op_def("set_param_struct") { op_values(ptr, ptr, ptr) }
+       op_def("push_return_area_ptr") { }
+       /*
+        * Pointer-relative loads and stores.
+        */
+       op_def("load_relative_sbyte") { op_values(int, ptr, int), "NINT_ARG" }
+       op_def("load_relative_ubyte") { op_values(int, ptr, int), "NINT_ARG" }
+       op_def("load_relative_short") { op_values(int, ptr, int), "NINT_ARG" }
+       op_def("load_relative_ushort") { op_values(int, ptr, int), "NINT_ARG" }
+       op_def("load_relative_int") { op_values(int, ptr, int), "NINT_ARG" }
+       op_def("load_relative_long") { op_values(long, ptr, int), "NINT_ARG" }
+       op_def("load_relative_float32") { op_values(float32, ptr, int), 
"NINT_ARG" }
+       op_def("load_relative_float64") { op_values(float64, ptr, int), 
"NINT_ARG" }
+       op_def("load_relative_nfloat") { op_values(nfloat, ptr, int), 
"NINT_ARG" }
+       op_def("load_relative_struct") { op_values(any, ptr, int), 
"NINT_ARG_TWO" }
+       op_def("store_relative_byte") { op_values(ptr, int, int), "NINT_ARG" }
+       op_def("store_relative_short") { op_values(ptr, int, int), "NINT_ARG" }
+       op_def("store_relative_int") { op_values(ptr, int, int), "NINT_ARG"}
+       op_def("store_relative_long") { op_values(ptr, long, int), "NINT_ARG" }
+       op_def("store_relative_float32") { op_values(ptr, float32, int), 
"NINT_ARG" }
+       op_def("store_relative_float64") { op_values(ptr, float64, int), 
"NINT_ARG" }
+       op_def("store_relative_nfloat") { op_values(ptr, nfloat, int), 
"NINT_ARG" }
+       op_def("store_relative_struct") { op_values(ptr, any, int), 
"NINT_ARG_TWO" }
+       op_def("add_relative") { op_values(ptr, ptr, int), "NINT_ARG" }
+       /*
+        * Array element loads and stores.
+        */
+       op_def("load_element_sbyte") { op_values(int, ptr, int) }
+       op_def("load_element_ubyte") { op_values(int, ptr, int) }
+       op_def("load_element_short") { op_values(int, ptr, int) }
+       op_def("load_element_ushort") { op_values(int, ptr, int) }
+       op_def("load_element_int") { op_values(int, ptr, int) }
+       op_def("load_element_long") { op_values(long, ptr, int) }
+       op_def("load_element_float32") { op_values(float32, ptr, int) }
+       op_def("load_element_float64") { op_values(float64, ptr, int) }
+       op_def("load_element_nfloat") { op_values(nfloat, ptr, int) }
+       op_def("store_element_byte") { op_values(ptr, int, int) }
+       op_def("store_element_short") { op_values(ptr, int, int) }
+       op_def("store_element_int") { op_values(ptr, int, int) }
+       op_def("store_element_long") { op_values(ptr, int, long) }
+       op_def("store_element_float32") { op_values(ptr, int, float32) }
+       op_def("store_element_float64") { op_values(ptr, int, float64) }
+       op_def("store_element_nfloat") { op_values(ptr, int, nfloat) }
+       /*
+        * Block operations.
+        */
+       op_def("memcpy") { op_values(ptr, ptr, ptr) }
+       op_def("memmove") { op_values(ptr, ptr, ptr) }
+       op_def("memset") { op_values(ptr, int, ptr) }
+       /*
+        * Allocate memory from the stack.
+        */
+       op_def("alloca") { op_values(ptr, ptr) }
+       /*
+        * Debugging support.
+        */
+       op_def("mark_offset") { op_values(empty, int) }
+       op_def("mark_breakpoint") { op_values(empty, ptr, ptr) }
+       /*
+        * Switch statement support.
+        */
+       op_def("jump_table") { op_type(jump_table), op_values(empty, ptr, int) }
+}
+
+%[
+/*
+ * Opcode information.
+ */
+typedef struct jit_opcode_info jit_opcode_info_t;
+struct jit_opcode_info
+{
+       const char *name;
+       int                     flags;
+};
+#define        JIT_OPCODE_DEST_MASK                    0x0000000F
+#define        JIT_OPCODE_DEST_EMPTY                   0x00000000
+#define        JIT_OPCODE_DEST_INT                             0x00000001
+#define        JIT_OPCODE_DEST_LONG                    0x00000002
+#define        JIT_OPCODE_DEST_FLOAT32                 0x00000003
+#define        JIT_OPCODE_DEST_FLOAT64                 0x00000004
+#define        JIT_OPCODE_DEST_NFLOAT                  0x00000005
+#define        JIT_OPCODE_DEST_ANY                             0x00000006
+#define        JIT_OPCODE_SRC1_MASK                    0x000000F0
+#define        JIT_OPCODE_SRC1_EMPTY                   0x00000000
+#define        JIT_OPCODE_SRC1_INT                             0x00000010
+#define        JIT_OPCODE_SRC1_LONG                    0x00000020
+#define        JIT_OPCODE_SRC1_FLOAT32                 0x00000030
+#define        JIT_OPCODE_SRC1_FLOAT64                 0x00000040
+#define        JIT_OPCODE_SRC1_NFLOAT                  0x00000050
+#define        JIT_OPCODE_SRC1_ANY                             0x00000060
+#define        JIT_OPCODE_SRC2_MASK                    0x00000F00
+#define        JIT_OPCODE_SRC2_EMPTY                   0x00000000
+#define        JIT_OPCODE_SRC2_INT                             0x00000100
+#define        JIT_OPCODE_SRC2_LONG                    0x00000200
+#define        JIT_OPCODE_SRC2_FLOAT32                 0x00000300
+#define        JIT_OPCODE_SRC2_FLOAT64                 0x00000400
+#define        JIT_OPCODE_SRC2_NFLOAT                  0x00000500
+#define        JIT_OPCODE_SRC2_ANY                             0x00000600
+#define        JIT_OPCODE_IS_BRANCH                    0x00001000
+#define        JIT_OPCODE_IS_CALL                              0x00002000
+#define        JIT_OPCODE_IS_CALL_EXTERNAL             0x00004000
+#define        JIT_OPCODE_IS_REG                               0x00008000
+#define        JIT_OPCODE_IS_ADDROF_LABEL              0x00010000
+#define JIT_OPCODE_IS_JUMP_TABLE               0x00020000
+#define        JIT_OPCODE_OPER_MASK                    0x01F00000
+#define        JIT_OPCODE_OPER_NONE                    0x00000000
+#define        JIT_OPCODE_OPER_ADD                             0x00100000
+#define        JIT_OPCODE_OPER_SUB                             0x00200000
+#define        JIT_OPCODE_OPER_MUL                             0x00300000
+#define        JIT_OPCODE_OPER_DIV                             0x00400000
+#define        JIT_OPCODE_OPER_REM                             0x00500000
+#define        JIT_OPCODE_OPER_NEG                             0x00600000
+#define        JIT_OPCODE_OPER_AND                             0x00700000
+#define        JIT_OPCODE_OPER_OR                              0x00800000
+#define        JIT_OPCODE_OPER_XOR                             0x00900000
+#define        JIT_OPCODE_OPER_NOT                             0x00A00000
+#define        JIT_OPCODE_OPER_EQ                              0x00B00000
+#define        JIT_OPCODE_OPER_NE                              0x00C00000
+#define        JIT_OPCODE_OPER_LT                              0x00D00000
+#define        JIT_OPCODE_OPER_LE                              0x00E00000
+#define        JIT_OPCODE_OPER_GT                              0x00F00000
+#define        JIT_OPCODE_OPER_GE                              0x01000000
+#define        JIT_OPCODE_OPER_SHL                             0x01100000
+#define        JIT_OPCODE_OPER_SHR                             0x01200000
+#define        JIT_OPCODE_OPER_SHR_UN                  0x01300000
+#define        JIT_OPCODE_OPER_COPY                    0x01400000
+#define        JIT_OPCODE_OPER_ADDRESS_OF              0x01500000
+#ifdef JIT_NATIVE_INT32
+#define        JIT_OPCODE_DEST_PTR                             
JIT_OPCODE_DEST_INT
+#define        JIT_OPCODE_SRC1_PTR                             
JIT_OPCODE_SRC1_INT
+#define        JIT_OPCODE_SRC2_PTR                             
JIT_OPCODE_SRC2_INT
+#else
+#define        JIT_OPCODE_DEST_PTR                             
JIT_OPCODE_DEST_LONG
+#define        JIT_OPCODE_SRC1_PTR                             
JIT_OPCODE_SRC1_LONG
+#define        JIT_OPCODE_SRC2_PTR                             
JIT_OPCODE_SRC2_LONG
+#endif
+JIT_EXPORT_DATA jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES];
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _JIT_OPCODE_H */
+%]
diff --git a/configure.ac b/configure.ac
index d84918e..c976915 100644
--- a/configure.ac
+++ b/configure.ac
@@ -478,6 +478,7 @@ AC_FUNC_ALLOCA
 
 AC_CONFIG_FILES([
   Makefile
+  config/Makefile
   include/Makefile
   include/jit/Makefile
   include/jit/jit-defs.h
diff --git a/include/jit/Makefile.am b/include/jit/Makefile.am
index 4ec9bf1..f8f8359 100644
--- a/include/jit/Makefile.am
+++ b/include/jit/Makefile.am
@@ -1,6 +1,6 @@
 ARCH_HEADER = address@hidden@.h
 
-BUILT_SOURCES = jit-arch.h
+BUILT_SOURCES = jit-arch.h jit-opcode.h
 
 libjitincludedir = $(includedir)/jit
 libjitinclude_HEADERS = \
@@ -33,8 +33,11 @@ libjitinclude_HEADERS = \
 
 noinst_HEADERS = jit-arch-generic.h jit-arch-x86.h jit-arch-x86-64.h
 
-DISTCLEANFILES = jit-arch.h jit-defs.h
+DISTCLEANFILES = jit-arch.h jit-defs.h jit-opcode.h
 
 jit-arch.h: $(ARCH_HEADER)
        rm -f $@
        $(LN_S) $(srcdir)/$(ARCH_HEADER) $@
+
+jit-opcode.h: $(top_srcdir)/config/jit-opcodes.ops
+       $(top_builddir)/tools/gen-ops -H $(top_srcdir)/config/jit-opcodes.ops 
>jit-opcode.h
diff --git a/include/jit/jit-opcode.h b/include/jit/jit-opcode.h
deleted file mode 100644
index 4bb895e..0000000
--- a/include/jit/jit-opcode.h
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * jit-opcode.h - List of primitive opcodes for JIT instructions.
- *
- * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
- *
- * The libjit library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation, either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * The libjit library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the libjit library.  If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#ifndef        _JIT_OPCODE_H
-#define        _JIT_OPCODE_H
-
-#include <jit/jit-defs.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Simple opcodes.
- */
-#define        JIT_OP_NOP                                                      
0x0000
-
-/*
- * Conversion opcodes.
- */
-#define        JIT_OP_TRUNC_SBYTE                                      0x0001
-#define        JIT_OP_TRUNC_UBYTE                                      0x0002
-#define        JIT_OP_TRUNC_SHORT                                      0x0003
-#define        JIT_OP_TRUNC_USHORT                                     0x0004
-#define        JIT_OP_TRUNC_INT                                        0x0005
-#define        JIT_OP_TRUNC_UINT                                       0x0006
-#define        JIT_OP_CHECK_SBYTE                                      0x0007
-#define        JIT_OP_CHECK_UBYTE                                      0x0008
-#define        JIT_OP_CHECK_SHORT                                      0x0009
-#define        JIT_OP_CHECK_USHORT                                     0x000A
-#define        JIT_OP_CHECK_INT                                        0x000B
-#define        JIT_OP_CHECK_UINT                                       0x000C
-#define        JIT_OP_LOW_WORD                                         0x000D
-#define        JIT_OP_EXPAND_INT                                       0x000E
-#define        JIT_OP_EXPAND_UINT                                      0x000F
-#define        JIT_OP_CHECK_LOW_WORD                           0x0010
-#define        JIT_OP_CHECK_SIGNED_LOW_WORD            0x0011
-#define        JIT_OP_CHECK_LONG                                       0x0012
-#define        JIT_OP_CHECK_ULONG                                      0x0013
-#define        JIT_OP_NFLOAT_TO_INT                            0x0014
-#define        JIT_OP_NFLOAT_TO_UINT                           0x0015
-#define        JIT_OP_NFLOAT_TO_LONG                           0x0016
-#define        JIT_OP_NFLOAT_TO_ULONG                          0x0017
-#define        JIT_OP_CHECK_NFLOAT_TO_INT                      0x0018
-#define        JIT_OP_CHECK_NFLOAT_TO_UINT                     0x0019
-#define        JIT_OP_CHECK_NFLOAT_TO_LONG                     0x001A
-#define        JIT_OP_CHECK_NFLOAT_TO_ULONG            0x001B
-#define        JIT_OP_INT_TO_NFLOAT                            0x001C
-#define        JIT_OP_UINT_TO_NFLOAT                           0x001D
-#define        JIT_OP_LONG_TO_NFLOAT                           0x001E
-#define        JIT_OP_ULONG_TO_NFLOAT                          0x001F
-#define        JIT_OP_NFLOAT_TO_FLOAT32                        0x0020
-#define        JIT_OP_NFLOAT_TO_FLOAT64                        0x0021
-#define        JIT_OP_FLOAT32_TO_NFLOAT                        0x0022
-#define        JIT_OP_FLOAT64_TO_NFLOAT                        0x0023
-
-/*
- * Arithmetic opcodes.
- */
-#define        JIT_OP_IADD                                                     
0x0024
-#define        JIT_OP_IADD_OVF                                         0x0025
-#define        JIT_OP_IADD_OVF_UN                                      0x0026
-#define        JIT_OP_ISUB                                                     
0x0027
-#define        JIT_OP_ISUB_OVF                                         0x0028
-#define        JIT_OP_ISUB_OVF_UN                                      0x0029
-#define        JIT_OP_IMUL                                                     
0x002A
-#define        JIT_OP_IMUL_OVF                                         0x002B
-#define        JIT_OP_IMUL_OVF_UN                                      0x002C
-#define        JIT_OP_IDIV                                                     
0x002D
-#define        JIT_OP_IDIV_UN                                          0x002E
-#define        JIT_OP_IREM                                                     
0x002F
-#define        JIT_OP_IREM_UN                                          0x0030
-#define        JIT_OP_INEG                                                     
0x0031
-#define        JIT_OP_LADD                                                     
0x0032
-#define        JIT_OP_LADD_OVF                                         0x0033
-#define        JIT_OP_LADD_OVF_UN                                      0x0034
-#define        JIT_OP_LSUB                                                     
0x0035
-#define        JIT_OP_LSUB_OVF                                         0x0036
-#define        JIT_OP_LSUB_OVF_UN                                      0x0037
-#define        JIT_OP_LMUL                                                     
0x0038
-#define        JIT_OP_LMUL_OVF                                         0x0039
-#define        JIT_OP_LMUL_OVF_UN                                      0x003A
-#define        JIT_OP_LDIV                                                     
0x003B
-#define        JIT_OP_LDIV_UN                                          0x003C
-#define        JIT_OP_LREM                                                     
0x003D
-#define        JIT_OP_LREM_UN                                          0x003E
-#define        JIT_OP_LNEG                                                     
0x003F
-#define        JIT_OP_FADD                                                     
0x0040
-#define        JIT_OP_FSUB                                                     
0x0041
-#define        JIT_OP_FMUL                                                     
0x0042
-#define        JIT_OP_FDIV                                                     
0x0043
-#define        JIT_OP_FREM                                                     
0x0044
-#define        JIT_OP_FREM_IEEE                                        0x0045
-#define        JIT_OP_FNEG                                                     
0x0046
-#define        JIT_OP_DADD                                                     
0x0047
-#define        JIT_OP_DSUB                                                     
0x0048
-#define        JIT_OP_DMUL                                                     
0x0049
-#define        JIT_OP_DDIV                                                     
0x004A
-#define        JIT_OP_DREM                                                     
0x004B
-#define        JIT_OP_DREM_IEEE                                        0x004C
-#define        JIT_OP_DNEG                                                     
0x004D
-#define        JIT_OP_NFADD                                            0x004E
-#define        JIT_OP_NFSUB                                            0x004F
-#define        JIT_OP_NFMUL                                            0x0050
-#define        JIT_OP_NFDIV                                            0x0051
-#define        JIT_OP_NFREM                                            0x0052
-#define        JIT_OP_NFREM_IEEE                                       0x0053
-#define        JIT_OP_NFNEG                                            0x0054
-
-/*
- * Bitwise opcodes.
- */
-#define        JIT_OP_IAND                                                     
0x0055
-#define        JIT_OP_IOR                                                      
0x0056
-#define        JIT_OP_IXOR                                                     
0x0057
-#define        JIT_OP_INOT                                                     
0x0058
-#define        JIT_OP_ISHL                                                     
0x0059
-#define        JIT_OP_ISHR                                                     
0x005A
-#define        JIT_OP_ISHR_UN                                          0x005B
-#define        JIT_OP_LAND                                                     
0x005C
-#define        JIT_OP_LOR                                                      
0x005D
-#define        JIT_OP_LXOR                                                     
0x005E
-#define        JIT_OP_LNOT                                                     
0x005F
-#define        JIT_OP_LSHL                                                     
0x0060
-#define        JIT_OP_LSHR                                                     
0x0061
-#define        JIT_OP_LSHR_UN                                          0x0062
-
-/*
- * Branch opcodes.
- */
-#define        JIT_OP_BR                                                       
0x0063
-#define        JIT_OP_BR_IFALSE                                        0x0064
-#define        JIT_OP_BR_ITRUE                                         0x0065
-#define        JIT_OP_BR_IEQ                                           0x0066
-#define        JIT_OP_BR_INE                                           0x0067
-#define        JIT_OP_BR_ILT                                           0x0068
-#define        JIT_OP_BR_ILT_UN                                        0x0069
-#define        JIT_OP_BR_ILE                                           0x006A
-#define        JIT_OP_BR_ILE_UN                                        0x006B
-#define        JIT_OP_BR_IGT                                           0x006C
-#define        JIT_OP_BR_IGT_UN                                        0x006D
-#define        JIT_OP_BR_IGE                                           0x006E
-#define        JIT_OP_BR_IGE_UN                                        0x006F
-#define        JIT_OP_BR_LFALSE                                        0x0070
-#define        JIT_OP_BR_LTRUE                                         0x0071
-#define        JIT_OP_BR_LEQ                                           0x0072
-#define        JIT_OP_BR_LNE                                           0x0073
-#define        JIT_OP_BR_LLT                                           0x0074
-#define        JIT_OP_BR_LLT_UN                                        0x0075
-#define        JIT_OP_BR_LLE                                           0x0076
-#define        JIT_OP_BR_LLE_UN                                        0x0077
-#define        JIT_OP_BR_LGT                                           0x0078
-#define        JIT_OP_BR_LGT_UN                                        0x0079
-#define        JIT_OP_BR_LGE                                           0x007A
-#define        JIT_OP_BR_LGE_UN                                        0x007B
-#define        JIT_OP_BR_FEQ                                           0x007C
-#define        JIT_OP_BR_FNE                                           0x007D
-#define        JIT_OP_BR_FLT                                           0x007E
-#define        JIT_OP_BR_FLE                                           0x007F
-#define        JIT_OP_BR_FGT                                           0x0080
-#define        JIT_OP_BR_FGE                                           0x0081
-#define        JIT_OP_BR_FEQ_INV                                       0x0082
-#define        JIT_OP_BR_FNE_INV                                       0x0083
-#define        JIT_OP_BR_FLT_INV                                       0x0084
-#define        JIT_OP_BR_FLE_INV                                       0x0085
-#define        JIT_OP_BR_FGT_INV                                       0x0086
-#define        JIT_OP_BR_FGE_INV                                       0x0087
-#define        JIT_OP_BR_DEQ                                           0x0088
-#define        JIT_OP_BR_DNE                                           0x0089
-#define        JIT_OP_BR_DLT                                           0x008A
-#define        JIT_OP_BR_DLE                                           0x008B
-#define        JIT_OP_BR_DGT                                           0x008C
-#define        JIT_OP_BR_DGE                                           0x008D
-#define        JIT_OP_BR_DEQ_INV                                       0x008E
-#define        JIT_OP_BR_DNE_INV                                       0x008F
-#define        JIT_OP_BR_DLT_INV                                       0x0090
-#define        JIT_OP_BR_DLE_INV                                       0x0091
-#define        JIT_OP_BR_DGT_INV                                       0x0092
-#define        JIT_OP_BR_DGE_INV                                       0x0093
-#define        JIT_OP_BR_NFEQ                                          0x0094
-#define        JIT_OP_BR_NFNE                                          0x0095
-#define        JIT_OP_BR_NFLT                                          0x0096
-#define        JIT_OP_BR_NFLE                                          0x0097
-#define        JIT_OP_BR_NFGT                                          0x0098
-#define        JIT_OP_BR_NFGE                                          0x0099
-#define        JIT_OP_BR_NFEQ_INV                                      0x009A
-#define        JIT_OP_BR_NFNE_INV                                      0x009B
-#define        JIT_OP_BR_NFLT_INV                                      0x009C
-#define        JIT_OP_BR_NFLE_INV                                      0x009D
-#define        JIT_OP_BR_NFGT_INV                                      0x009E
-#define        JIT_OP_BR_NFGE_INV                                      0x009F
-
-/*
- * Comparison opcodes.
- */
-#define        JIT_OP_ICMP                                                     
0x00A0
-#define        JIT_OP_ICMP_UN                                          0x00A1
-#define        JIT_OP_LCMP                                                     
0x00A2
-#define        JIT_OP_LCMP_UN                                          0x00A3
-#define        JIT_OP_FCMPL                                            0x00A4
-#define        JIT_OP_FCMPG                                            0x00A5
-#define        JIT_OP_DCMPL                                            0x00A6
-#define        JIT_OP_DCMPG                                            0x00A7
-#define        JIT_OP_NFCMPL                                           0x00A8
-#define        JIT_OP_NFCMPG                                           0x00A9
-#define        JIT_OP_IEQ                                                      
0x00AA
-#define        JIT_OP_INE                                                      
0x00AB
-#define        JIT_OP_ILT                                                      
0x00AC
-#define        JIT_OP_ILT_UN                                           0x00AD
-#define        JIT_OP_ILE                                                      
0x00AE
-#define        JIT_OP_ILE_UN                                           0x00AF
-#define        JIT_OP_IGT                                                      
0x00B0
-#define        JIT_OP_IGT_UN                                           0x00B1
-#define        JIT_OP_IGE                                                      
0x00B2
-#define        JIT_OP_IGE_UN                                           0x00B3
-#define        JIT_OP_LEQ                                                      
0x00B4
-#define        JIT_OP_LNE                                                      
0x00B5
-#define        JIT_OP_LLT                                                      
0x00B6
-#define        JIT_OP_LLT_UN                                           0x00B7
-#define        JIT_OP_LLE                                                      
0x00B8
-#define        JIT_OP_LLE_UN                                           0x00B9
-#define        JIT_OP_LGT                                                      
0x00BA
-#define        JIT_OP_LGT_UN                                           0x00BB
-#define        JIT_OP_LGE                                                      
0x00BC
-#define        JIT_OP_LGE_UN                                           0x00BD
-#define        JIT_OP_FEQ                                                      
0x00BE
-#define        JIT_OP_FNE                                                      
0x00BF
-#define        JIT_OP_FLT                                                      
0x00C0
-#define        JIT_OP_FLE                                                      
0x00C1
-#define        JIT_OP_FGT                                                      
0x00C2
-#define        JIT_OP_FGE                                                      
0x00C3
-#define        JIT_OP_FEQ_INV                                          0x00C4
-#define        JIT_OP_FNE_INV                                          0x00C5
-#define        JIT_OP_FLT_INV                                          0x00C6
-#define        JIT_OP_FLE_INV                                          0x00C7
-#define        JIT_OP_FGT_INV                                          0x00C8
-#define        JIT_OP_FGE_INV                                          0x00C9
-#define        JIT_OP_DEQ                                                      
0x00CA
-#define        JIT_OP_DNE                                                      
0x00CB
-#define        JIT_OP_DLT                                                      
0x00CC
-#define        JIT_OP_DLE                                                      
0x00CD
-#define        JIT_OP_DGT                                                      
0x00CE
-#define        JIT_OP_DGE                                                      
0x00CF
-#define        JIT_OP_DEQ_INV                                          0x00D0
-#define        JIT_OP_DNE_INV                                          0x00D1
-#define        JIT_OP_DLT_INV                                          0x00D2
-#define        JIT_OP_DLE_INV                                          0x00D3
-#define        JIT_OP_DGT_INV                                          0x00D4
-#define        JIT_OP_DGE_INV                                          0x00D5
-#define        JIT_OP_NFEQ                                                     
0x00D6
-#define        JIT_OP_NFNE                                                     
0x00D7
-#define        JIT_OP_NFLT                                                     
0x00D8
-#define        JIT_OP_NFLE                                                     
0x00D9
-#define        JIT_OP_NFGT                                                     
0x00DA
-#define        JIT_OP_NFGE                                                     
0x00DB
-#define        JIT_OP_NFEQ_INV                                         0x00DC
-#define        JIT_OP_NFNE_INV                                         0x00DD
-#define        JIT_OP_NFLT_INV                                         0x00DE
-#define        JIT_OP_NFLE_INV                                         0x00DF
-#define        JIT_OP_NFGT_INV                                         0x00E0
-#define        JIT_OP_NFGE_INV                                         0x00E1
-#define        JIT_OP_IS_FNAN                                          0x00E2
-#define        JIT_OP_IS_FINF                                          0x00E3
-#define        JIT_OP_IS_FFINITE                                       0x00E4
-#define        JIT_OP_IS_DNAN                                          0x00E5
-#define        JIT_OP_IS_DINF                                          0x00E6
-#define        JIT_OP_IS_DFINITE                                       0x00E7
-#define        JIT_OP_IS_NFNAN                                         0x00E8
-#define        JIT_OP_IS_NFINF                                         0x00E9
-#define        JIT_OP_IS_NFFINITE                                      0x00EA
-
-/*
- * Mathematical functions.
- */
-#define        JIT_OP_FACOS                                            0x00EB
-#define        JIT_OP_FASIN                                            0x00EC
-#define        JIT_OP_FATAN                                            0x00ED
-#define        JIT_OP_FATAN2                                           0x00EE
-#define        JIT_OP_FCEIL                                            0x00EF
-#define        JIT_OP_FCOS                                                     
0x00F0
-#define        JIT_OP_FCOSH                                            0x00F1
-#define        JIT_OP_FEXP                                                     
0x00F2
-#define        JIT_OP_FFLOOR                                           0x00F3
-#define        JIT_OP_FLOG                                                     
0x00F4
-#define        JIT_OP_FLOG10                                           0x00F5
-#define        JIT_OP_FPOW                                                     
0x00F6
-#define        JIT_OP_FRINT                                            0x00F7
-#define        JIT_OP_FROUND                                           0x00F8
-#define        JIT_OP_FSIN                                                     
0x00F9
-#define        JIT_OP_FSINH                                            0x00FA
-#define        JIT_OP_FSQRT                                            0x00FB
-#define        JIT_OP_FTAN                                                     
0x00FC
-#define        JIT_OP_FTANH                                            0x00FD
-#define        JIT_OP_DACOS                                            0x00FE
-#define        JIT_OP_DASIN                                            0x00FF
-#define        JIT_OP_DATAN                                            0x0100
-#define        JIT_OP_DATAN2                                           0x0101
-#define        JIT_OP_DCEIL                                            0x0102
-#define        JIT_OP_DCOS                                                     
0x0103
-#define        JIT_OP_DCOSH                                            0x0104
-#define        JIT_OP_DEXP                                                     
0x0105
-#define        JIT_OP_DFLOOR                                           0x0106
-#define        JIT_OP_DLOG                                                     
0x0107
-#define        JIT_OP_DLOG10                                           0x0108
-#define        JIT_OP_DPOW                                                     
0x0109
-#define        JIT_OP_DRINT                                            0x010A
-#define        JIT_OP_DROUND                                           0x010B
-#define        JIT_OP_DSIN                                                     
0x010C
-#define        JIT_OP_DSINH                                            0x010D
-#define        JIT_OP_DSQRT                                            0x010E
-#define        JIT_OP_DTAN                                                     
0x010F
-#define        JIT_OP_DTANH                                            0x0110
-#define        JIT_OP_NFACOS                                           0x0111
-#define        JIT_OP_NFASIN                                           0x0112
-#define        JIT_OP_NFATAN                                           0x0113
-#define        JIT_OP_NFATAN2                                          0x0114
-#define        JIT_OP_NFCEIL                                           0x0115
-#define        JIT_OP_NFCOS                                            0x0116
-#define        JIT_OP_NFCOSH                                           0x0117
-#define        JIT_OP_NFEXP                                            0x0118
-#define        JIT_OP_NFFLOOR                                          0x0119
-#define        JIT_OP_NFLOG                                            0x011A
-#define        JIT_OP_NFLOG10                                          0x011B
-#define        JIT_OP_NFPOW                                            0x011C
-#define        JIT_OP_NFRINT                                           0x011D
-#define        JIT_OP_NFROUND                                          0x011E
-#define        JIT_OP_NFSIN                                            0x011F
-#define        JIT_OP_NFSINH                                           0x0120
-#define        JIT_OP_NFSQRT                                           0x0121
-#define        JIT_OP_NFTAN                                            0x0122
-#define        JIT_OP_NFTANH                                           0x0123
-
-/*
- * Absolute, minimum, maximum, and sign.
- */
-#define        JIT_OP_IABS                                                     
0x0124
-#define        JIT_OP_LABS                                                     
0x0125
-#define        JIT_OP_FABS                                                     
0x0126
-#define        JIT_OP_DABS                                                     
0x0127
-#define        JIT_OP_NFABS                                            0x0128
-#define        JIT_OP_IMIN                                                     
0x0129
-#define        JIT_OP_IMIN_UN                                          0x012A
-#define        JIT_OP_LMIN                                                     
0x012B
-#define        JIT_OP_LMIN_UN                                          0x012C
-#define        JIT_OP_FMIN                                                     
0x012D
-#define        JIT_OP_DMIN                                                     
0x012E
-#define        JIT_OP_NFMIN                                            0x012F
-#define        JIT_OP_IMAX                                                     
0x0130
-#define        JIT_OP_IMAX_UN                                          0x0131
-#define        JIT_OP_LMAX                                                     
0x0132
-#define        JIT_OP_LMAX_UN                                          0x0133
-#define        JIT_OP_FMAX                                                     
0x0134
-#define        JIT_OP_DMAX                                                     
0x0135
-#define        JIT_OP_NFMAX                                            0x0136
-#define        JIT_OP_ISIGN                                            0x0137
-#define        JIT_OP_LSIGN                                            0x0138
-#define        JIT_OP_FSIGN                                            0x0139
-#define        JIT_OP_DSIGN                                            0x013A
-#define        JIT_OP_NFSIGN                                           0x013B
-
-/*
- * Pointer check opcodes.
- */
-#define        JIT_OP_CHECK_NULL                                       0x013C
-
-/*
- * Function calls.
- */
-#define        JIT_OP_CALL                                                     
0x013D
-#define        JIT_OP_CALL_TAIL                                        0x013E
-#define        JIT_OP_CALL_INDIRECT                            0x013F
-#define        JIT_OP_CALL_INDIRECT_TAIL                       0x0140
-#define        JIT_OP_CALL_VTABLE_PTR                          0x0141
-#define        JIT_OP_CALL_VTABLE_PTR_TAIL                     0x0142
-#define        JIT_OP_CALL_EXTERNAL                            0x0143
-#define        JIT_OP_CALL_EXTERNAL_TAIL                       0x0144
-#define        JIT_OP_RETURN                                           0x0145
-#define        JIT_OP_RETURN_INT                                       0x0146
-#define        JIT_OP_RETURN_LONG                                      0x0147
-#define        JIT_OP_RETURN_FLOAT32                           0x0148
-#define        JIT_OP_RETURN_FLOAT64                           0x0149
-#define        JIT_OP_RETURN_NFLOAT                            0x014A
-#define        JIT_OP_RETURN_SMALL_STRUCT                      0x014B
-#define        JIT_OP_SETUP_FOR_NESTED                         0x014C
-#define        JIT_OP_SETUP_FOR_SIBLING                        0x014D
-#define        JIT_OP_IMPORT                                           0x014E
-
-/*
- * Exception handling.
- */
-#define        JIT_OP_THROW                                            0x014F
-#define        JIT_OP_RETHROW                                          0x0150
-#define        JIT_OP_LOAD_PC                                          0x0151
-#define        JIT_OP_LOAD_EXCEPTION_PC                        0x0152
-#define        JIT_OP_ENTER_FINALLY                            0x0153
-#define        JIT_OP_LEAVE_FINALLY                            0x0154
-#define        JIT_OP_CALL_FINALLY                                     0x0155
-#define        JIT_OP_ENTER_FILTER                                     0x0156
-#define        JIT_OP_LEAVE_FILTER                                     0x0157
-#define        JIT_OP_CALL_FILTER                                      0x0158
-#define        JIT_OP_CALL_FILTER_RETURN                       0x0159
-#define        JIT_OP_ADDRESS_OF_LABEL                         0x015A
-
-/*
- * Data manipulation.
- */
-#define        JIT_OP_COPY_LOAD_SBYTE                          0x015B
-#define        JIT_OP_COPY_LOAD_UBYTE                          0x015C
-#define        JIT_OP_COPY_LOAD_SHORT                          0x015D
-#define        JIT_OP_COPY_LOAD_USHORT                         0x015E
-#define        JIT_OP_COPY_INT                                         0x015F
-#define        JIT_OP_COPY_LONG                                        0x0160
-#define        JIT_OP_COPY_FLOAT32                                     0x0161
-#define        JIT_OP_COPY_FLOAT64                                     0x0162
-#define        JIT_OP_COPY_NFLOAT                                      0x0163
-#define        JIT_OP_COPY_STRUCT                                      0x0164
-#define        JIT_OP_COPY_STORE_BYTE                          0x0165
-#define        JIT_OP_COPY_STORE_SHORT                         0x0166
-#define        JIT_OP_ADDRESS_OF                                       0x0167
-
-/*
- * Incoming registers, outgoing registers, and stack pushes.
- */
-#define        JIT_OP_INCOMING_REG                                     0x0168
-#define        JIT_OP_INCOMING_FRAME_POSN                      0x0169
-#define        JIT_OP_OUTGOING_REG                                     0x016A
-#define        JIT_OP_OUTGOING_FRAME_POSN                      0x016B
-#define        JIT_OP_RETURN_REG                                       0x016C
-#define        JIT_OP_PUSH_INT                                         0x016D
-#define        JIT_OP_PUSH_LONG                                        0x016E
-#define        JIT_OP_PUSH_FLOAT32                                     0x016F
-#define        JIT_OP_PUSH_FLOAT64                                     0x0170
-#define        JIT_OP_PUSH_NFLOAT                                      0x0171
-#define        JIT_OP_PUSH_STRUCT                                      0x0172
-#define        JIT_OP_POP_STACK                                        0x0173
-#define        JIT_OP_FLUSH_SMALL_STRUCT                       0x0174
-#define        JIT_OP_SET_PARAM_INT                            0x0175
-#define        JIT_OP_SET_PARAM_LONG                           0x0176
-#define        JIT_OP_SET_PARAM_FLOAT32                        0x0177
-#define        JIT_OP_SET_PARAM_FLOAT64                        0x0178
-#define        JIT_OP_SET_PARAM_NFLOAT                         0x0179
-#define        JIT_OP_SET_PARAM_STRUCT                         0x017A
-#define        JIT_OP_PUSH_RETURN_AREA_PTR                     0x017B
-
-/*
- * Pointer-relative loads and stores.
- */
-#define        JIT_OP_LOAD_RELATIVE_SBYTE                      0x017C
-#define        JIT_OP_LOAD_RELATIVE_UBYTE                      0x017D
-#define        JIT_OP_LOAD_RELATIVE_SHORT                      0x017E
-#define        JIT_OP_LOAD_RELATIVE_USHORT                     0x017F
-#define        JIT_OP_LOAD_RELATIVE_INT                        0x0180
-#define        JIT_OP_LOAD_RELATIVE_LONG                       0x0181
-#define        JIT_OP_LOAD_RELATIVE_FLOAT32            0x0182
-#define        JIT_OP_LOAD_RELATIVE_FLOAT64            0x0183
-#define        JIT_OP_LOAD_RELATIVE_NFLOAT                     0x0184
-#define        JIT_OP_LOAD_RELATIVE_STRUCT                     0x0185
-#define        JIT_OP_STORE_RELATIVE_BYTE                      0x0186
-#define        JIT_OP_STORE_RELATIVE_SHORT                     0x0187
-#define        JIT_OP_STORE_RELATIVE_INT                       0x0188
-#define        JIT_OP_STORE_RELATIVE_LONG                      0x0189
-#define        JIT_OP_STORE_RELATIVE_FLOAT32           0x018A
-#define        JIT_OP_STORE_RELATIVE_FLOAT64           0x018B
-#define        JIT_OP_STORE_RELATIVE_NFLOAT            0x018C
-#define        JIT_OP_STORE_RELATIVE_STRUCT            0x018D
-#define        JIT_OP_ADD_RELATIVE                                     0x018E
-
-/*
- * Array element loads and stores.
- */
-#define        JIT_OP_LOAD_ELEMENT_SBYTE                       0x018F
-#define        JIT_OP_LOAD_ELEMENT_UBYTE                       0x0190
-#define        JIT_OP_LOAD_ELEMENT_SHORT                       0x0191
-#define        JIT_OP_LOAD_ELEMENT_USHORT                      0x0192
-#define        JIT_OP_LOAD_ELEMENT_INT                         0x0193
-#define        JIT_OP_LOAD_ELEMENT_LONG                        0x0194
-#define        JIT_OP_LOAD_ELEMENT_FLOAT32                     0x0195
-#define        JIT_OP_LOAD_ELEMENT_FLOAT64                     0x0196
-#define        JIT_OP_LOAD_ELEMENT_NFLOAT                      0x0197
-#define        JIT_OP_STORE_ELEMENT_BYTE                       0x0198
-#define        JIT_OP_STORE_ELEMENT_SHORT                      0x0199
-#define        JIT_OP_STORE_ELEMENT_INT                        0x019A
-#define        JIT_OP_STORE_ELEMENT_LONG                       0x019B
-#define        JIT_OP_STORE_ELEMENT_FLOAT32            0x019C
-#define        JIT_OP_STORE_ELEMENT_FLOAT64            0x019D
-#define        JIT_OP_STORE_ELEMENT_NFLOAT                     0x019E
-
-/*
- * Block operations.
- */
-#define        JIT_OP_MEMCPY                                           0x019F
-#define        JIT_OP_MEMMOVE                                          0x01A0
-#define        JIT_OP_MEMSET                                           0x01A1
-
-/*
- * Allocate memory from the stack.
- */
-#define        JIT_OP_ALLOCA                                           0x01A2
-
-/*
- * Debugging support.
- */
-#define        JIT_OP_MARK_OFFSET                                      0x01A3
-#define        JIT_OP_MARK_BREAKPOINT                          0x01A4
-
-/*
- * Switch statement support.
- */
-#define JIT_OP_JUMP_TABLE                                      0x01A5
-
-/*
- * The number of opcodes in the above list.
- */
-#define        JIT_OP_NUM_OPCODES                                      0x01A6
-
-/*
- * Opcode information.
- */
-typedef struct jit_opcode_info jit_opcode_info_t;
-struct jit_opcode_info
-{
-       const char *name;
-       int                     flags;
-};
-#define        JIT_OPCODE_DEST_MASK                    0x0000000F
-#define        JIT_OPCODE_DEST_EMPTY                   0x00000000
-#define        JIT_OPCODE_DEST_INT                             0x00000001
-#define        JIT_OPCODE_DEST_LONG                    0x00000002
-#define        JIT_OPCODE_DEST_FLOAT32                 0x00000003
-#define        JIT_OPCODE_DEST_FLOAT64                 0x00000004
-#define        JIT_OPCODE_DEST_NFLOAT                  0x00000005
-#define        JIT_OPCODE_DEST_ANY                             0x00000006
-#define        JIT_OPCODE_SRC1_MASK                    0x000000F0
-#define        JIT_OPCODE_SRC1_EMPTY                   0x00000000
-#define        JIT_OPCODE_SRC1_INT                             0x00000010
-#define        JIT_OPCODE_SRC1_LONG                    0x00000020
-#define        JIT_OPCODE_SRC1_FLOAT32                 0x00000030
-#define        JIT_OPCODE_SRC1_FLOAT64                 0x00000040
-#define        JIT_OPCODE_SRC1_NFLOAT                  0x00000050
-#define        JIT_OPCODE_SRC1_ANY                             0x00000060
-#define        JIT_OPCODE_SRC2_MASK                    0x00000F00
-#define        JIT_OPCODE_SRC2_EMPTY                   0x00000000
-#define        JIT_OPCODE_SRC2_INT                             0x00000100
-#define        JIT_OPCODE_SRC2_LONG                    0x00000200
-#define        JIT_OPCODE_SRC2_FLOAT32                 0x00000300
-#define        JIT_OPCODE_SRC2_FLOAT64                 0x00000400
-#define        JIT_OPCODE_SRC2_NFLOAT                  0x00000500
-#define        JIT_OPCODE_SRC2_ANY                             0x00000600
-#define        JIT_OPCODE_IS_BRANCH                    0x00001000
-#define        JIT_OPCODE_IS_CALL                              0x00002000
-#define        JIT_OPCODE_IS_CALL_EXTERNAL             0x00004000
-#define        JIT_OPCODE_IS_REG                               0x00008000
-#define        JIT_OPCODE_IS_ADDROF_LABEL              0x00010000
-#define JIT_OPCODE_IS_JUMP_TABLE               0x00020000
-#define        JIT_OPCODE_OPER_MASK                    0x01F00000
-#define        JIT_OPCODE_OPER_NONE                    0x00000000
-#define        JIT_OPCODE_OPER_ADD                             0x00100000
-#define        JIT_OPCODE_OPER_SUB                             0x00200000
-#define        JIT_OPCODE_OPER_MUL                             0x00300000
-#define        JIT_OPCODE_OPER_DIV                             0x00400000
-#define        JIT_OPCODE_OPER_REM                             0x00500000
-#define        JIT_OPCODE_OPER_NEG                             0x00600000
-#define        JIT_OPCODE_OPER_AND                             0x00700000
-#define        JIT_OPCODE_OPER_OR                              0x00800000
-#define        JIT_OPCODE_OPER_XOR                             0x00900000
-#define        JIT_OPCODE_OPER_NOT                             0x00A00000
-#define        JIT_OPCODE_OPER_EQ                              0x00B00000
-#define        JIT_OPCODE_OPER_NE                              0x00C00000
-#define        JIT_OPCODE_OPER_LT                              0x00D00000
-#define        JIT_OPCODE_OPER_LE                              0x00E00000
-#define        JIT_OPCODE_OPER_GT                              0x00F00000
-#define        JIT_OPCODE_OPER_GE                              0x01000000
-#define        JIT_OPCODE_OPER_SHL                             0x01100000
-#define        JIT_OPCODE_OPER_SHR                             0x01200000
-#define        JIT_OPCODE_OPER_SHR_UN                  0x01300000
-#define        JIT_OPCODE_OPER_COPY                    0x01400000
-#define        JIT_OPCODE_OPER_ADDRESS_OF              0x01500000
-#ifdef JIT_NATIVE_INT32
-#define        JIT_OPCODE_DEST_PTR                             
JIT_OPCODE_DEST_INT
-#define        JIT_OPCODE_SRC1_PTR                             
JIT_OPCODE_SRC1_INT
-#define        JIT_OPCODE_SRC2_PTR                             
JIT_OPCODE_SRC2_INT
-#else
-#define        JIT_OPCODE_DEST_PTR                             
JIT_OPCODE_DEST_LONG
-#define        JIT_OPCODE_SRC1_PTR                             
JIT_OPCODE_SRC1_LONG
-#define        JIT_OPCODE_SRC2_PTR                             
JIT_OPCODE_SRC2_LONG
-#endif
-JIT_EXPORT_DATA jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES];
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* _JIT_OPCODE_H */
diff --git a/jit/Makefile.am b/jit/Makefile.am
index 4dd0274..ef2af91 100644
--- a/jit/Makefile.am
+++ b/jit/Makefile.am
@@ -1,3 +1,4 @@
+BUILT_SOURCES = jit-opcode.c jit-interp-opcode.h jit-interp-opcode.c
 
 lib_LTLIBRARIES = libjit.la
 
@@ -39,6 +40,8 @@ libjit_la_SOURCES = \
        jit-internal.h \
        jit-interp.h \
        jit-interp.c \
+       jit-interp-opcode.h \
+       jit-interp-opcode.c \
        jit-intrinsic.c \
        jit-live.c \
        jit-memory.c \
@@ -88,10 +91,10 @@ libjit_la_LDFLAGS = -version-info $(LIBJIT_VERSION) 
-no-undefined
 jit-interp.lo: jit-interp-labels.h
 
 jit-interp-labels.h: $(top_srcdir)/include/jit/jit-opcode.h \
-               $(top_srcdir)/jit/jit-interp.h $(srcdir)/mklabel.sh
+               $(top_srcdir)/jit/jit-interp-opcode.h $(srcdir)/mklabel.sh
        $(SHELL) $(srcdir)/mklabel.sh "$(AWK)" \
                $(top_srcdir)/include/jit/jit-opcode.h \
-               $(top_srcdir)/jit/jit-interp.h >jit-interp-labels.h
+               $(top_srcdir)/jit/jit-interp-opcode.h >jit-interp-labels.h
 
 jit-rules-x86.lo: jit-rules-x86.inc
 
@@ -117,6 +120,15 @@ jit-rules-x86-64.inc: jit-rules-x86-64.ins 
$(top_builddir)/tools/gen-rules$(EXEE
        $(top_builddir)/tools/gen-rules$(EXEEXT) $(srcdir)/jit-rules-x86-64.ins 
\
                        >jit-rules-x86-64.inc
 
+jit-opcode.c: $(top_srcdir)/config/jit-opcodes.ops
+       $(top_builddir)/tools/gen-ops -T $(top_srcdir)/config/jit-opcodes.ops 
>jit-opcode.c
+
+jit-interp-opcode.h: $(top_srcdir)/config/jit-interp-opcodes.ops
+       $(top_builddir)/tools/gen-ops -H 
$(top_srcdir)/config/jit-interp-opcodes.ops >jit-interp-opcode.h
+
+jit-interp-opcode.c: $(top_srcdir)/config/jit-interp-opcodes.ops
+       $(top_builddir)/tools/gen-ops -T 
$(top_srcdir)/config/jit-interp-opcodes.ops >jit-interp-opcode.c
+
 CLEANFILES = \
        jit-interp-labels.h \
        jit-rules-alpha.inc \
diff --git a/jit/jit-dump.c b/jit/jit-dump.c
index c9b7935..1147abd 100644
--- a/jit/jit-dump.c
+++ b/jit/jit-dump.c
@@ -534,8 +534,6 @@ void jit_dump_insn(FILE *stream, jit_function_t func, 
jit_insn_t insn)
 
 #if defined(JIT_BACKEND_INTERP)
 
-extern jit_opcode_info_t const _jit_interp_opcodes[JIT_OP_NUM_INTERP_OPCODES];
-
 /*
  * Dump the interpreted bytecode representation of a function.
  */
diff --git a/jit/jit-interp.c b/jit/jit-interp.c
index 309bea2..16f5267 100644
--- a/jit/jit-interp.c
+++ b/jit/jit-interp.c
@@ -3525,7 +3525,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_IMPORT_LOCAL):
+               VMCASE(JIT_INTERP_OP_IMPORT_LOCAL):
                {
                        /* TODO!!! */
                        /* Import the address of a local variable from an outer 
scope */
@@ -3543,7 +3543,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_IMPORT_ARG):
+               VMCASE(JIT_INTERP_OP_IMPORT_ARG):
                {
                        /* TODO!!! */
                        /* Import the address of an argument from an outer 
scope */
@@ -4070,7 +4070,7 @@ restart_tail:
                 * Argument variable access opcodes.
                 
******************************************************************/
 
-               VMCASE(JIT_OP_LDA_0_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_0_SBYTE):
                {
                        /* Load a signed 8-bit integer argument into the 
register 0 */
                        VM_R0_INT = *VM_ARG(jit_sbyte);
@@ -4078,7 +4078,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_0_UBYTE):
                {
                        /* Load an unsigned 8-bit integer argument into the 
register 0 */
                        VM_R0_INT = *VM_ARG(jit_ubyte);
@@ -4086,7 +4086,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_SHORT):
+               VMCASE(JIT_INTERP_OP_LDA_0_SHORT):
                {
                        /* Load a signed 16-bit integer argument into the 
register 0 */
                        VM_R0_INT = *VM_ARG(jit_short);
@@ -4094,7 +4094,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_USHORT):
+               VMCASE(JIT_INTERP_OP_LDA_0_USHORT):
                {
                        /* Load am unsigned 16-bit argument local into the 
register 0 */
                        VM_R0_INT = *VM_ARG(jit_ushort);
@@ -4102,7 +4102,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_INT):
+               VMCASE(JIT_INTERP_OP_LDA_0_INT):
                {
                        /* Load a 32-bit integer argument into the register 0 */
                        VM_R0_INT = *VM_ARG(jit_int);
@@ -4110,7 +4110,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_LONG):
+               VMCASE(JIT_INTERP_OP_LDA_0_LONG):
                {
                        /* Load a 64-bit integer argument into the register 0 */
                        VM_R0_LONG = *VM_ARG(jit_long);
@@ -4118,7 +4118,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDA_0_FLOAT32):
                {
                        /* Load a 32-bit float argument into the register 0 */
                        VM_R0_FLOAT32 = *VM_ARG(jit_float32);
@@ -4126,7 +4126,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDA_0_FLOAT64):
                {
                        /* Load a 64-bit float argument into the register 0 */
                        VM_R0_FLOAT64 = *VM_ARG(jit_float64);
@@ -4134,7 +4134,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDA_0_NFLOAT):
                {
                        /* Load a native float argument into the register 0 */
                        VM_R0_NFLOAT = *VM_ARG(jit_nfloat);
@@ -4142,7 +4142,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDAA_0):
+               VMCASE(JIT_INTERP_OP_LDAA_0):
                {
                        /* Load the address of an argument into the register 0 
*/
                        VM_R0_PTR = VM_ARG(void);
@@ -4150,7 +4150,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_1_SBYTE):
                {
                        /* Load a signed 8-bit integer argument into the 
register 1 */
                        VM_R1_INT = *VM_ARG(jit_sbyte);
@@ -4158,7 +4158,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_1_UBYTE):
                {
                        /* Load an unsigned 8-bit integer argument into the 
register 1 */
                        VM_R1_INT = *VM_ARG(jit_ubyte);
@@ -4166,7 +4166,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_SHORT):
+               VMCASE(JIT_INTERP_OP_LDA_1_SHORT):
                {
                        /* Load a signed 16-bit integer argument into the 
register 1 */
                        VM_R1_INT = *VM_ARG(jit_short);
@@ -4174,7 +4174,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_USHORT):
+               VMCASE(JIT_INTERP_OP_LDA_1_USHORT):
                {
                        /* Load am unsigned 16-bit argument local into the 
register 1 */
                        VM_R1_INT = *VM_ARG(jit_ushort);
@@ -4182,7 +4182,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_INT):
+               VMCASE(JIT_INTERP_OP_LDA_1_INT):
                {
                        /* Load a 32-bit integer argument into the register 1 */
                        VM_R1_INT = *VM_ARG(jit_int);
@@ -4190,7 +4190,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_LONG):
+               VMCASE(JIT_INTERP_OP_LDA_1_LONG):
                {
                        /* Load a 64-bit integer argument into the register 1 */
                        VM_R1_LONG = *VM_ARG(jit_long);
@@ -4198,7 +4198,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDA_1_FLOAT32):
                {
                        /* Load a 32-bit float argument into the register 1 */
                        VM_R1_FLOAT32 = *VM_ARG(jit_float32);
@@ -4206,7 +4206,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDA_1_FLOAT64):
                {
                        /* Load a 64-bit float argument into the register 1 */
                        VM_R1_FLOAT64 = *VM_ARG(jit_float64);
@@ -4214,7 +4214,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_1_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDA_1_NFLOAT):
                {
                        /* Load a native float argument into the register 1 */
                        VM_R1_NFLOAT = *VM_ARG(jit_nfloat);
@@ -4222,7 +4222,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDAA_1):
+               VMCASE(JIT_INTERP_OP_LDAA_1):
                {
                        /* Load the address of an argument into the register 1 
*/
                        VM_R1_PTR = VM_ARG(void);
@@ -4230,7 +4230,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_2_SBYTE):
                {
                        /* Load a signed 8-bit integer argument into the 
register 2 */
                        VM_R2_INT = *VM_ARG(jit_sbyte);
@@ -4238,7 +4238,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDA_2_UBYTE):
                {
                        /* Load an unsigned 8-bit integer argument into the 
register 2 */
                        VM_R2_INT = *VM_ARG(jit_ubyte);
@@ -4246,7 +4246,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_SHORT):
+               VMCASE(JIT_INTERP_OP_LDA_2_SHORT):
                {
                        /* Load a signed 16-bit integer argument into the 
register 2 */
                        VM_R2_INT = *VM_ARG(jit_short);
@@ -4254,7 +4254,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_USHORT):
+               VMCASE(JIT_INTERP_OP_LDA_2_USHORT):
                {
                        /* Load am unsigned 16-bit argument local into the 
register 2 */
                        VM_R2_INT = *VM_ARG(jit_ushort);
@@ -4262,7 +4262,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_INT):
+               VMCASE(JIT_INTERP_OP_LDA_2_INT):
                {
                        /* Load a 32-bit integer argument into the register 2 */
                        VM_R2_INT = *VM_ARG(jit_int);
@@ -4270,7 +4270,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_LONG):
+               VMCASE(JIT_INTERP_OP_LDA_2_LONG):
                {
                        /* Load a 64-bit integer argument into the register 2 */
                        VM_R2_LONG = *VM_ARG(jit_long);
@@ -4278,7 +4278,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDA_2_FLOAT32):
                {
                        /* Load a 32-bit float argument into the register 2 */
                        VM_R2_FLOAT32 = *VM_ARG(jit_float32);
@@ -4286,7 +4286,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDA_2_FLOAT64):
                {
                        /* Load a 64-bit float argument into the register 2 */
                        VM_R2_FLOAT64 = *VM_ARG(jit_float64);
@@ -4294,7 +4294,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDA_2_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDA_2_NFLOAT):
                {
                        /* Load a native float argument into the register 2 */
                        VM_R2_NFLOAT = *VM_ARG(jit_nfloat);
@@ -4302,7 +4302,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDAA_2):
+               VMCASE(JIT_INTERP_OP_LDAA_2):
                {
                        /* Load the address of an argument into the register 2 
*/
                        VM_R2_PTR = VM_ARG(void);
@@ -4310,7 +4310,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_BYTE):
+               VMCASE(JIT_INTERP_OP_STA_0_BYTE):
                {
                        /* Store an 8-bit integer into an argument */
                        *VM_ARG(jit_sbyte) = (jit_sbyte)VM_R0_INT;
@@ -4318,7 +4318,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_SHORT):
+               VMCASE(JIT_INTERP_OP_STA_0_SHORT):
                {
                        /* Store an 16-bit integer into an argument */
                        *VM_ARG(jit_short) = (jit_short)VM_R0_INT;
@@ -4326,7 +4326,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_INT):
+               VMCASE(JIT_INTERP_OP_STA_0_INT):
                {
                        /* Store an 32-bit integer into an argument */
                        *VM_ARG(jit_int) = (jit_int)VM_R0_INT;
@@ -4334,7 +4334,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_LONG):
+               VMCASE(JIT_INTERP_OP_STA_0_LONG):
                {
                        /* Store an 64-bit integer into an argument */
                        *VM_ARG(jit_long) = (jit_long)VM_R0_LONG;
@@ -4342,7 +4342,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_STA_0_FLOAT32):
                {
                        /* Store a 32-bit float into an argument */
                        *VM_ARG(jit_float32) = VM_R0_FLOAT32;
@@ -4350,7 +4350,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_STA_0_FLOAT64):
                {
                        /* Store a 64-bit float into an argument */
                        *VM_ARG(jit_float64) = VM_R0_FLOAT64;
@@ -4358,7 +4358,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STA_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_STA_0_NFLOAT):
                {
                        /* Store a native float into an argument */
                        *VM_ARG(jit_nfloat) = VM_R0_NFLOAT;
@@ -4370,7 +4370,7 @@ restart_tail:
                 * Local variable frame access opcodes.
                 
******************************************************************/
 
-               VMCASE(JIT_OP_LDL_0_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_0_SBYTE):
                {
                        /* Load a signed 8-bit integer local into the register 
0 */
                        VM_R0_INT = *VM_LOC(jit_sbyte);
@@ -4378,7 +4378,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_0_UBYTE):
                {
                        /* Load an unsigned 8-bit integer local into the 
register 0 */
                        VM_R0_INT = *VM_LOC(jit_ubyte);
@@ -4386,7 +4386,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_SHORT):
+               VMCASE(JIT_INTERP_OP_LDL_0_SHORT):
                {
                        /* Load a signed 16-bit integer local into the register 
0 */
                        VM_R0_INT = *VM_LOC(jit_short);
@@ -4394,7 +4394,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_USHORT):
+               VMCASE(JIT_INTERP_OP_LDL_0_USHORT):
                {
                        /* Load am unsigned 16-bit integer local into the 
register 0 */
                        VM_R0_INT = *VM_LOC(jit_ushort);
@@ -4402,7 +4402,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_INT):
+               VMCASE(JIT_INTERP_OP_LDL_0_INT):
                {
                        /* Load a 32-bit integer local into the register 0 */
                        VM_R0_INT = *VM_LOC(jit_int);
@@ -4410,7 +4410,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_LONG):
+               VMCASE(JIT_INTERP_OP_LDL_0_LONG):
                {
                        /* Load a 64-bit integer local into the register 0 */
                        VM_R0_LONG = *VM_LOC(jit_long);
@@ -4418,7 +4418,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDL_0_FLOAT32):
                {
                        /* Load a 32-bit float local into the register 0 */
                        VM_R0_FLOAT32 = *VM_LOC(jit_float32);
@@ -4426,7 +4426,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDL_0_FLOAT64):
                {
                        /* Load a 64-bit float local into the register 0 */
                        VM_R0_FLOAT64 = *VM_LOC(jit_float64);
@@ -4434,7 +4434,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDL_0_NFLOAT):
                {
                        /* Load a native float local into the register 0 */
                        VM_R0_NFLOAT = *VM_LOC(jit_nfloat);
@@ -4442,7 +4442,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDLA_0):
+               VMCASE(JIT_INTERP_OP_LDLA_0):
                {
                        /* Load the address of a local into the register 0 */
                        VM_R0_PTR = VM_LOC(void);
@@ -4450,7 +4450,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_1_SBYTE):
                {
                        /* Load a signed 8-bit integer local into the register 
1 */
                        VM_R1_INT = *VM_LOC(jit_sbyte);
@@ -4458,7 +4458,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_1_UBYTE):
                {
                        /* Load an unsigned 8-bit integer local into the 
register 1 */
                        VM_R1_INT = *VM_LOC(jit_ubyte);
@@ -4466,7 +4466,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_SHORT):
+               VMCASE(JIT_INTERP_OP_LDL_1_SHORT):
                {
                        /* Load a signed 16-bit integer local into the register 
1 */
                        VM_R1_INT = *VM_LOC(jit_short);
@@ -4474,7 +4474,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_USHORT):
+               VMCASE(JIT_INTERP_OP_LDL_1_USHORT):
                {
                        /* Load am unsigned 16-bit integer local into the 
register 1 */
                        VM_R1_INT = *VM_LOC(jit_ushort);
@@ -4482,7 +4482,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_INT):
+               VMCASE(JIT_INTERP_OP_LDL_1_INT):
                {
                        /* Load a 32-bit integer local into the register 1 */
                        VM_R1_INT = *VM_LOC(jit_int);
@@ -4490,7 +4490,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_LONG):
+               VMCASE(JIT_INTERP_OP_LDL_1_LONG):
                {
                        /* Load a 64-bit integer local into the register 1 */
                        VM_R1_LONG = *VM_LOC(jit_long);
@@ -4498,7 +4498,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDL_1_FLOAT32):
                {
                        /* Load a 32-bit float local into the register 1 */
                        VM_R1_FLOAT32 = *VM_LOC(jit_float32);
@@ -4506,7 +4506,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDL_1_FLOAT64):
                {
                        /* Load a 64-bit float local into the register 1 */
                        VM_R1_FLOAT64 = *VM_LOC(jit_float64);
@@ -4514,7 +4514,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_1_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDL_1_NFLOAT):
                {
                        /* Load a native float local into the register 1 */
                        VM_R1_NFLOAT = *VM_LOC(jit_nfloat);
@@ -4522,7 +4522,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDLA_1):
+               VMCASE(JIT_INTERP_OP_LDLA_1):
                {
                        /* Load the address of a local into the register 1 */
                        VM_R1_PTR = VM_LOC(void);
@@ -4530,7 +4530,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_SBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_2_SBYTE):
                {
                        /* Load a signed 8-bit integer local into the register 
2 */
                        VM_R2_INT = *VM_LOC(jit_sbyte);
@@ -4538,7 +4538,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_UBYTE):
+               VMCASE(JIT_INTERP_OP_LDL_2_UBYTE):
                {
                        /* Load an unsigned 8-bit integer local into the 
register 2 */
                        VM_R2_INT = *VM_LOC(jit_ubyte);
@@ -4546,7 +4546,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_SHORT):
+               VMCASE(JIT_INTERP_OP_LDL_2_SHORT):
                {
                        /* Load a signed 16-bit integer local into the register 
2 */
                        VM_R2_INT = *VM_LOC(jit_short);
@@ -4554,7 +4554,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_USHORT):
+               VMCASE(JIT_INTERP_OP_LDL_2_USHORT):
                {
                        /* Load am unsigned 16-bit integer local into the 
register 2 */
                        VM_R2_INT = *VM_LOC(jit_ushort);
@@ -4562,7 +4562,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_INT):
+               VMCASE(JIT_INTERP_OP_LDL_2_INT):
                {
                        /* Load a 32-bit integer local into the register 2 */
                        VM_R2_INT = *VM_LOC(jit_int);
@@ -4570,7 +4570,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_LONG):
+               VMCASE(JIT_INTERP_OP_LDL_2_LONG):
                {
                        /* Load a 64-bit integer local into the register 2 */
                        VM_R2_LONG = *VM_LOC(jit_long);
@@ -4578,7 +4578,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDL_2_FLOAT32):
                {
                        /* Load a 32-bit float local into the register 2 */
                        VM_R2_FLOAT32 = *VM_LOC(jit_float32);
@@ -4586,7 +4586,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDL_2_FLOAT64):
                {
                        /* Load a 64-bit float local into the register 2 */
                        VM_R2_FLOAT64 = *VM_LOC(jit_float64);
@@ -4594,7 +4594,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDL_2_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDL_2_NFLOAT):
                {
                        /* Load a native float local into the register 2 */
                        VM_R2_NFLOAT = *VM_LOC(jit_nfloat);
@@ -4602,7 +4602,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDLA_2):
+               VMCASE(JIT_INTERP_OP_LDLA_2):
                {
                        /* Load the address of a local into the register 2 */
                        VM_R2_PTR = VM_LOC(void);
@@ -4610,7 +4610,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_BYTE):
+               VMCASE(JIT_INTERP_OP_STL_0_BYTE):
                {
                        /* Store an 8-bit integer into a local */
                        *VM_LOC(jit_sbyte) = (jit_sbyte)VM_R0_INT;
@@ -4618,7 +4618,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_SHORT):
+               VMCASE(JIT_INTERP_OP_STL_0_SHORT):
                {
                        /* Store an 16-bit integer into a local */
                        *VM_LOC(jit_short) = (jit_short)VM_R0_INT;
@@ -4626,7 +4626,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_INT):
+               VMCASE(JIT_INTERP_OP_STL_0_INT):
                {
                        /* Store an 32-bit integer into a local */
                        *VM_LOC(jit_int) = (jit_int)VM_R0_INT;
@@ -4634,7 +4634,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_LONG):
+               VMCASE(JIT_INTERP_OP_STL_0_LONG):
                {
                        /* Store an 64-bit integer into a local */
                        *VM_LOC(jit_long) = (jit_long)VM_R0_LONG;
@@ -4642,7 +4642,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_STL_0_FLOAT32):
                {
                        /* Store a 32-bit float into a local */
                        *VM_LOC(jit_float32) = VM_R0_FLOAT32;
@@ -4650,7 +4650,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_STL_0_FLOAT64):
                {
                        /* Store a 64-bit float into a local */
                        *VM_LOC(jit_float64) = VM_R0_FLOAT64;
@@ -4658,7 +4658,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_STL_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_STL_0_NFLOAT):
                {
                        /* Store a native float into a local */
                        *VM_LOC(jit_nfloat) = VM_R0_NFLOAT;
@@ -4673,7 +4673,7 @@ restart_tail:
                #define JIT_WORDS_PER_TYPE(type) \
                        ((sizeof(type) + sizeof(void *) - 1) / sizeof(void *))
 
-               VMCASE(JIT_OP_LDC_0_INT):
+               VMCASE(JIT_INTERP_OP_LDC_0_INT):
                {
                        /* Load an integer constant into the register 0 */
                        VM_R0_INT = (jit_int)VM_NINT_ARG;
@@ -4681,7 +4681,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_0_LONG):
+               VMCASE(JIT_INTERP_OP_LDC_0_LONG):
                {
                        /* Load a long constant into the register 0 */
 #ifdef JIT_NATIVE_INT64
@@ -4694,7 +4694,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDC_0_FLOAT32):
                {
                        /* Load a 32-bit float constant into the register 0 */
                        jit_memcpy(&r0.float32_value, pc + 1, 
sizeof(jit_float32));
@@ -4702,7 +4702,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDC_0_FLOAT64):
                {
                        /* Load a 64-bit float constant into the register 0 */
                        jit_memcpy(&r0.float64_value, pc + 1, 
sizeof(jit_float64));
@@ -4710,7 +4710,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDC_0_NFLOAT):
                {
                        /* Load a native float constant into the registre 0 */
                        jit_memcpy(&r0.nfloat_value, pc + 1, 
sizeof(jit_nfloat));
@@ -4718,7 +4718,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_1_INT):
+               VMCASE(JIT_INTERP_OP_LDC_1_INT):
                {
                        /* Load an integer constant into the register 1 */
                        VM_R1_INT = (jit_int)VM_NINT_ARG;
@@ -4726,7 +4726,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_1_LONG):
+               VMCASE(JIT_INTERP_OP_LDC_1_LONG):
                {
                        /* Load a long constant into the register 1 */
 #ifdef JIT_NATIVE_INT64
@@ -4739,7 +4739,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_1_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDC_1_FLOAT32):
                {
                        /* Load a 32-bit float constant into the register 1 */
                        jit_memcpy(&r1.float32_value, pc + 1, 
sizeof(jit_float32));
@@ -4747,7 +4747,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_1_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDC_1_FLOAT64):
                {
                        /* Load a 64-bit float constant into the register 1 */
                        jit_memcpy(&r1.float64_value, pc + 1, 
sizeof(jit_float64));
@@ -4755,7 +4755,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_1_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDC_1_NFLOAT):
                {
                        /* Load a native float constant into the registre 1 */
                        jit_memcpy(&r1.nfloat_value, pc + 1, 
sizeof(jit_nfloat));
@@ -4763,7 +4763,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_2_INT):
+               VMCASE(JIT_INTERP_OP_LDC_2_INT):
                {
                        /* Load an integer constant into the register 2 */
                        VM_R2_INT = (jit_int)VM_NINT_ARG;
@@ -4771,7 +4771,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_2_LONG):
+               VMCASE(JIT_INTERP_OP_LDC_2_LONG):
                {
                        /* Load a long constant into the register 2 */
 #ifdef JIT_NATIVE_INT64
@@ -4784,7 +4784,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_2_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDC_2_FLOAT32):
                {
                        /* Load a 32-bit float constant into the register 2 */
                        jit_memcpy(&r2.float32_value, pc + 1, 
sizeof(jit_float32));
@@ -4792,7 +4792,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_2_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDC_2_FLOAT64):
                {
                        /* Load a 64-bit float constant into the register 2 */
                        jit_memcpy(&r2.float64_value, pc + 1, 
sizeof(jit_float64));
@@ -4800,7 +4800,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDC_2_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDC_2_NFLOAT):
                {
                        /* Load a native float constant into the registre 2 */
                        jit_memcpy(&r2.nfloat_value, pc + 1, 
sizeof(jit_nfloat));
@@ -4812,7 +4812,7 @@ restart_tail:
                 * Load return value.
                 
******************************************************************/
 
-               VMCASE(JIT_OP_LDR_0_INT):
+               VMCASE(JIT_INTERP_OP_LDR_0_INT):
                {
                        /* Load an integer return value into the register 0 */
                        VM_R0_INT = return_area->int_value;
@@ -4820,7 +4820,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDR_0_LONG):
+               VMCASE(JIT_INTERP_OP_LDR_0_LONG):
                {
                        /* Load a long integer return value into the register 0 
*/
                        VM_R0_LONG = return_area->long_value;
@@ -4828,7 +4828,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDR_0_FLOAT32):
+               VMCASE(JIT_INTERP_OP_LDR_0_FLOAT32):
                {
                        /* Load a 32-bit float return value into the register 0 
*/
                        VM_R0_FLOAT32 = return_area->float32_value;
@@ -4836,7 +4836,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDR_0_FLOAT64):
+               VMCASE(JIT_INTERP_OP_LDR_0_FLOAT64):
                {
                        /* Load a 64-bit float return value into the register 0 
*/
                        VM_R0_FLOAT64 = return_area->float64_value;
@@ -4844,7 +4844,7 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_LDR_0_NFLOAT):
+               VMCASE(JIT_INTERP_OP_LDR_0_NFLOAT):
                {
                        /* Load a native float return value into the register 0 
*/
                        VM_R0_NFLOAT = return_area->nfloat_value;
@@ -4864,21 +4864,21 @@ restart_tail:
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_POP):
+               VMCASE(JIT_INTERP_OP_POP):
                {
                        /* Pop a single item from the stack */
                        VM_MODIFY_PC_AND_STACK(1, 1);
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_POP_2):
+               VMCASE(JIT_INTERP_OP_POP_2):
                {
                        /* Pop two items from the stack */
                        VM_MODIFY_PC_AND_STACK(1, 2);
                }
                VMBREAK;
 
-               VMCASE(JIT_OP_POP_3):
+               VMCASE(JIT_INTERP_OP_POP_3):
                {
                        /* Pop three items from the stack */
                        VM_MODIFY_PC_AND_STACK(1, 3);
diff --git a/jit/jit-interp.h b/jit/jit-interp.h
index 42768c3..bfa8116 100644
--- a/jit/jit-interp.h
+++ b/jit/jit-interp.h
@@ -25,6 +25,7 @@
 
 #include "jit-internal.h"
 #include "jit-apply-rules.h"
+#include "jit-interp-opcode.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -89,160 +90,6 @@ struct jit_function_interp
 #define        jit_function_interp_entry_pc(info)      \
                        ((void **)(((unsigned char *)(info)) + 
jit_function_interp_size))
 
-/*
- * Argument variable access opcodes.
- */
-#define        JIT_OP_LDA_0_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x0000)
-#define        JIT_OP_LDA_0_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x0001)
-#define        JIT_OP_LDA_0_SHORT                      (JIT_OP_NUM_OPCODES + 
0x0002)
-#define        JIT_OP_LDA_0_USHORT                     (JIT_OP_NUM_OPCODES + 
0x0003)
-#define        JIT_OP_LDA_0_INT                        (JIT_OP_NUM_OPCODES + 
0x0004)
-#define        JIT_OP_LDA_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x0005)
-#define        JIT_OP_LDA_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0006)
-#define        JIT_OP_LDA_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0007)
-#define        JIT_OP_LDA_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0008)
-#define        JIT_OP_LDAA_0                           (JIT_OP_NUM_OPCODES + 
0x0009)
-#define        JIT_OP_LDA_1_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x000a)
-#define        JIT_OP_LDA_1_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x000b)
-#define        JIT_OP_LDA_1_SHORT                      (JIT_OP_NUM_OPCODES + 
0x000c)
-#define        JIT_OP_LDA_1_USHORT                     (JIT_OP_NUM_OPCODES + 
0x000d)
-#define        JIT_OP_LDA_1_INT                        (JIT_OP_NUM_OPCODES + 
0x000e)
-#define        JIT_OP_LDA_1_LONG                       (JIT_OP_NUM_OPCODES + 
0x000f)
-#define        JIT_OP_LDA_1_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0010)
-#define        JIT_OP_LDA_1_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0011)
-#define        JIT_OP_LDA_1_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0012)
-#define        JIT_OP_LDAA_1                           (JIT_OP_NUM_OPCODES + 
0x0013)
-#define        JIT_OP_LDA_2_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x0014)
-#define        JIT_OP_LDA_2_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x0015)
-#define        JIT_OP_LDA_2_SHORT                      (JIT_OP_NUM_OPCODES + 
0x0016)
-#define        JIT_OP_LDA_2_USHORT                     (JIT_OP_NUM_OPCODES + 
0x0017)
-#define        JIT_OP_LDA_2_INT                        (JIT_OP_NUM_OPCODES + 
0x0018)
-#define        JIT_OP_LDA_2_LONG                       (JIT_OP_NUM_OPCODES + 
0x0019)
-#define        JIT_OP_LDA_2_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x001a)
-#define        JIT_OP_LDA_2_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x001b)
-#define        JIT_OP_LDA_2_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x001c)
-#define        JIT_OP_LDAA_2                           (JIT_OP_NUM_OPCODES + 
0x001d)
-#define        JIT_OP_STA_0_BYTE                       (JIT_OP_NUM_OPCODES + 
0x001e)
-#define        JIT_OP_STA_0_SHORT                      (JIT_OP_NUM_OPCODES + 
0x001f)
-#define        JIT_OP_STA_0_INT                        (JIT_OP_NUM_OPCODES + 
0x0020)
-#define        JIT_OP_STA_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x0021)
-#define        JIT_OP_STA_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0022)
-#define        JIT_OP_STA_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0023)
-#define        JIT_OP_STA_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0024)
-
-/*
- * Local variable frame access opcodes.
- */
-#define        JIT_OP_LDL_0_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x0025)
-#define        JIT_OP_LDL_0_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x0026)
-#define        JIT_OP_LDL_0_SHORT                      (JIT_OP_NUM_OPCODES + 
0x0027)
-#define        JIT_OP_LDL_0_USHORT                     (JIT_OP_NUM_OPCODES + 
0x0028)
-#define        JIT_OP_LDL_0_INT                        (JIT_OP_NUM_OPCODES + 
0x0029)
-#define        JIT_OP_LDL_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x002a)
-#define        JIT_OP_LDL_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x002b)
-#define        JIT_OP_LDL_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x002c)
-#define        JIT_OP_LDL_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x002d)
-#define        JIT_OP_LDLA_0                           (JIT_OP_NUM_OPCODES + 
0x002e)
-#define        JIT_OP_LDL_1_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x002f)
-#define        JIT_OP_LDL_1_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x0030)
-#define        JIT_OP_LDL_1_SHORT                      (JIT_OP_NUM_OPCODES + 
0x0031)
-#define        JIT_OP_LDL_1_USHORT                     (JIT_OP_NUM_OPCODES + 
0x0032)
-#define        JIT_OP_LDL_1_INT                        (JIT_OP_NUM_OPCODES + 
0x0033)
-#define        JIT_OP_LDL_1_LONG                       (JIT_OP_NUM_OPCODES + 
0x0034)
-#define        JIT_OP_LDL_1_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0035)
-#define        JIT_OP_LDL_1_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0036)
-#define        JIT_OP_LDL_1_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0037)
-#define        JIT_OP_LDLA_1                           (JIT_OP_NUM_OPCODES + 
0x0038)
-#define        JIT_OP_LDL_2_SBYTE                      (JIT_OP_NUM_OPCODES + 
0x0039)
-#define        JIT_OP_LDL_2_UBYTE                      (JIT_OP_NUM_OPCODES + 
0x003a)
-#define        JIT_OP_LDL_2_SHORT                      (JIT_OP_NUM_OPCODES + 
0x003b)
-#define        JIT_OP_LDL_2_USHORT                     (JIT_OP_NUM_OPCODES + 
0x003c)
-#define        JIT_OP_LDL_2_INT                        (JIT_OP_NUM_OPCODES + 
0x003d)
-#define        JIT_OP_LDL_2_LONG                       (JIT_OP_NUM_OPCODES + 
0x003e)
-#define        JIT_OP_LDL_2_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x003f)
-#define        JIT_OP_LDL_2_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0040)
-#define        JIT_OP_LDL_2_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0041)
-#define        JIT_OP_LDLA_2                           (JIT_OP_NUM_OPCODES + 
0x0042)
-#define        JIT_OP_STL_0_BYTE                       (JIT_OP_NUM_OPCODES + 
0x0043)
-#define        JIT_OP_STL_0_SHORT                      (JIT_OP_NUM_OPCODES + 
0x0044)
-#define        JIT_OP_STL_0_INT                        (JIT_OP_NUM_OPCODES + 
0x0045)
-#define        JIT_OP_STL_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x0046)
-#define        JIT_OP_STL_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0047)
-#define        JIT_OP_STL_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0048)
-#define        JIT_OP_STL_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0049)
-
-/*
- * Load constant values.
- */
-#define        JIT_OP_LDC_0_INT                        (JIT_OP_NUM_OPCODES + 
0x004a)
-#define        JIT_OP_LDC_1_INT                        (JIT_OP_NUM_OPCODES + 
0x004b)
-#define        JIT_OP_LDC_2_INT                        (JIT_OP_NUM_OPCODES + 
0x004c)
-#define        JIT_OP_LDC_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x004d)
-#define        JIT_OP_LDC_1_LONG                       (JIT_OP_NUM_OPCODES + 
0x004e)
-#define        JIT_OP_LDC_2_LONG                       (JIT_OP_NUM_OPCODES + 
0x004f)
-#define        JIT_OP_LDC_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0050)
-#define        JIT_OP_LDC_1_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0051)
-#define        JIT_OP_LDC_2_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x0052)
-#define        JIT_OP_LDC_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0053)
-#define        JIT_OP_LDC_1_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0054)
-#define        JIT_OP_LDC_2_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x0055)
-#define        JIT_OP_LDC_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0056)
-#define        JIT_OP_LDC_1_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0057)
-#define        JIT_OP_LDC_2_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x0058)
-
-/*
- * Load return value.
- */
-#define        JIT_OP_LDR_0_INT                        (JIT_OP_NUM_OPCODES + 
0x0059)
-#define        JIT_OP_LDR_0_LONG                       (JIT_OP_NUM_OPCODES + 
0x005a)
-#define        JIT_OP_LDR_0_FLOAT32                    (JIT_OP_NUM_OPCODES + 
0x005b)
-#define        JIT_OP_LDR_0_FLOAT64                    (JIT_OP_NUM_OPCODES + 
0x005c)
-#define        JIT_OP_LDR_0_NFLOAT                     (JIT_OP_NUM_OPCODES + 
0x005d)
-
-/*
- * Stack management.
- */
-#define        JIT_OP_POP                              (JIT_OP_NUM_OPCODES + 
0x005e)
-#define        JIT_OP_POP_2                            (JIT_OP_NUM_OPCODES + 
0x005f)
-#define        JIT_OP_POP_3                            (JIT_OP_NUM_OPCODES + 
0x0060)
-
-/*
- * Nested function call handling.
- */
-#define        JIT_OP_IMPORT_LOCAL                     (JIT_OP_NUM_OPCODES + 
0x0061)
-#define        JIT_OP_IMPORT_ARG                       (JIT_OP_NUM_OPCODES + 
0x0062)
-
-/*
- * Marker opcode for the end of the interpreter-specific opcodes.
- */
-#define        JIT_OP_END_MARKER                       (JIT_OP_NUM_OPCODES + 
0x0063)
-
-/*
- * Number of interpreter-specific opcodes.
- */
-#define        JIT_OP_NUM_INTERP_OPCODES       \
-               (JIT_OP_END_MARKER + 1 - JIT_OP_NUM_OPCODES)
-
-/*
- * Opcode version.  Should be increased whenever new opcodes
- * are added to this list or the public list in "jit-opcode.h".
- * This value is written to ELF binaries, to ensure that code
- * for one version of libjit is not inadvertantly used in another.
- */
-#define        JIT_OPCODE_VERSION                                      0
-
-/*
- * Additional opcode definition flags.
- */
-#define        JIT_OPCODE_INTERP_ARGS_MASK                     0x7E000000
-#define        JIT_OPCODE_NINT_ARG                                     
0x02000000
-#define        JIT_OPCODE_NINT_ARG_TWO                         0x04000000
-#define        JIT_OPCODE_CONST_LONG                           0x06000000
-#define        JIT_OPCODE_CONST_FLOAT32                        0x08000000
-#define        JIT_OPCODE_CONST_FLOAT64                        0x0A000000
-#define        JIT_OPCODE_CONST_NFLOAT                         0x0C000000
-#define        JIT_OPCODE_CALL_INDIRECT_ARGS           0x0E000000
-
 #ifdef __cplusplus
 };
 #endif
diff --git a/jit/jit-opcode.c b/jit/jit-opcode.c
deleted file mode 100644
index 36b713c..0000000
--- a/jit/jit-opcode.c
+++ /dev/null
@@ -1,680 +0,0 @@
-/*
- * jit-opcode.c - Information about all of the JIT opcodes.
- *
- * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
- *
- * This file is part of the libjit library.
- *
- * The libjit library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation, either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * The libjit library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the libjit library.  If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include "jit-internal.h"
-#include "jit-rules.h"
-
-#define        F_(dest,src1,src2)      \
-       (JIT_OPCODE_DEST_##dest | JIT_OPCODE_SRC1_##src1 | 
JIT_OPCODE_SRC2_##src2)
-#define        O_(dest,src1,src2,oper) \
-       (JIT_OPCODE_DEST_##dest | JIT_OPCODE_SRC1_##src1 | \
-        JIT_OPCODE_SRC2_##src2 | JIT_OPCODE_OPER_##oper)
-#define        B_(src1,src2)   \
-       (JIT_OPCODE_IS_BRANCH | JIT_OPCODE_SRC1_##src1 | JIT_OPCODE_SRC2_##src2)
-#define        A_(src1,src2,oper)      \
-       (JIT_OPCODE_IS_BRANCH | JIT_OPCODE_SRC1_##src1 | \
-        JIT_OPCODE_SRC2_##src2 | JIT_OPCODE_OPER_##oper)
-#if defined(JIT_BACKEND_INTERP)
-       #define NINT_ARG                        JIT_OPCODE_NINT_ARG
-       #define NINT_ARG_TWO            JIT_OPCODE_NINT_ARG_TWO
-       #define INDIRECT_ARGS           JIT_OPCODE_CALL_INDIRECT_ARGS
-#else
-       #define NINT_ARG                        0
-       #define NINT_ARG_TWO            0
-       #define INDIRECT_ARGS           0
-#endif
-
-jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES] = {
-
-       /*
-        * Simple opcodes.
-        */
-       {"nop",                                                 F_(EMPTY, 
EMPTY, EMPTY)},
-
-       /*
-        * Conversion opcodes.
-        */
-       {"trunc_sbyte",                                 F_(INT, INT, EMPTY)},
-       {"trunc_ubyte",                                 F_(INT, INT, EMPTY)},
-       {"trunc_short",                                 F_(INT, INT, EMPTY)},
-       {"trunc_ushort",                                F_(INT, INT, EMPTY)},
-       {"trunc_int",                                   F_(INT, INT, EMPTY)},
-       {"trunc_uint",                                  F_(INT, INT, EMPTY)},
-       {"check_sbyte",                                 F_(INT, INT, EMPTY)},
-       {"check_ubyte",                                 F_(INT, INT, EMPTY)},
-       {"check_short",                                 F_(INT, INT, EMPTY)},
-       {"check_ushort",                                F_(INT, INT, EMPTY)},
-       {"check_int",                                   F_(INT, INT, EMPTY)},
-       {"check_uint",                                  F_(INT, INT, EMPTY)},
-       {"low_word",                                    F_(INT, LONG, EMPTY)},
-       {"expand_int",                                  F_(LONG, INT, EMPTY)},
-       {"expand_uint",                                 F_(LONG, INT, EMPTY)},
-       {"check_low_word",                              F_(INT, LONG, EMPTY)},
-       {"check_signed_low_word",               F_(INT, LONG, EMPTY)},
-       {"check_long",                                  F_(LONG, LONG, EMPTY)},
-       {"check_ulong",                                 F_(LONG, LONG, EMPTY)},
-       {"nfloat_to_int",                               F_(INT, NFLOAT, EMPTY)},
-       {"nfloat_to_uint",                              F_(INT, NFLOAT, EMPTY)},
-       {"nfloat_to_long",                              F_(LONG, NFLOAT, 
EMPTY)},
-       {"nfloat_to_ulong",                             F_(LONG, NFLOAT, 
EMPTY)},
-       {"check_nfloat_to_int",                 F_(INT, NFLOAT, EMPTY)},
-       {"check_nfloat_to_uint",                F_(INT, NFLOAT, EMPTY)},
-       {"check_nfloat_to_long",                F_(LONG, NFLOAT, EMPTY)},
-       {"check_nfloat_to_ulong",               F_(LONG, NFLOAT, EMPTY)},
-       {"int_to_nfloat",                               F_(NFLOAT, INT, EMPTY)},
-       {"uint_to_nfloat",                              F_(NFLOAT, INT, EMPTY)},
-       {"long_to_nfloat",                              F_(NFLOAT, LONG, 
EMPTY)},
-       {"ulong_to_nfloat",                             F_(NFLOAT, LONG, 
EMPTY)},
-       {"nfloat_to_float32",                   F_(FLOAT32, NFLOAT, EMPTY)},
-       {"nfloat_to_float64",                   F_(FLOAT64, NFLOAT, EMPTY)},
-       {"float32_to_nfloat",                   F_(NFLOAT, FLOAT32, EMPTY)},
-       {"float64_to_nfloat",                   F_(NFLOAT, FLOAT64, EMPTY)},
-
-       /*
-        * Arithmetic opcodes.
-        */
-       {"iadd",                                                O_(INT, INT, 
INT, ADD)},
-       {"iadd_ovf",                                    F_(INT, INT, INT)},
-       {"iadd_ovf_un",                                 F_(INT, INT, INT)},
-       {"isub",                                                O_(INT, INT, 
INT, SUB)},
-       {"isub_ovf",                                    F_(INT, INT, INT)},
-       {"isub_ovf_un",                                 F_(INT, INT, INT)},
-       {"imul",                                                O_(INT, INT, 
INT, MUL)},
-       {"imul_ovf",                                    F_(INT, INT, INT)},
-       {"imul_ovf_un",                                 F_(INT, INT, INT)},
-       {"idiv",                                                O_(INT, INT, 
INT, DIV)},
-       {"idiv_un",                                             F_(INT, INT, 
INT)},
-       {"irem",                                                O_(INT, INT, 
INT, REM)},
-       {"irem_un",                                             F_(INT, INT, 
INT)},
-       {"ineg",                                                O_(INT, INT, 
EMPTY, NEG)},
-       {"ladd",                                                O_(LONG, LONG, 
LONG, ADD)},
-       {"ladd_ovf",                                    F_(LONG, LONG, LONG)},
-       {"ladd_ovf_un",                                 F_(LONG, LONG, LONG)},
-       {"lsub",                                                O_(LONG, LONG, 
LONG, SUB)},
-       {"lsub_ovf",                                    F_(LONG, LONG, LONG)},
-       {"lsub_ovf_un",                                 F_(LONG, LONG, LONG)},
-       {"lmul",                                                O_(LONG, LONG, 
LONG, MUL)},
-       {"lmul_ovf",                                    F_(LONG, LONG, LONG)},
-       {"lmul_ovf_un",                                 F_(LONG, LONG, LONG)},
-       {"ldiv",                                                O_(LONG, LONG, 
LONG, DIV)},
-       {"ldiv_un",                                             F_(LONG, LONG, 
LONG)},
-       {"lrem",                                                O_(LONG, LONG, 
LONG, REM)},
-       {"lrem_un",                                             F_(LONG, LONG, 
LONG)},
-       {"lneg",                                                O_(LONG, LONG, 
EMPTY, NEG)},
-       {"fadd",                                                O_(FLOAT32, 
FLOAT32, FLOAT32, ADD)},
-       {"fsub",                                                O_(FLOAT32, 
FLOAT32, FLOAT32, SUB)},
-       {"fmul",                                                O_(FLOAT32, 
FLOAT32, FLOAT32, MUL)},
-       {"fdiv",                                                O_(FLOAT32, 
FLOAT32, FLOAT32, DIV)},
-       {"frem",                                                O_(FLOAT32, 
FLOAT32, FLOAT32, REM)},
-       {"frem_ieee",                                   F_(FLOAT32, FLOAT32, 
FLOAT32)},
-       {"fneg",                                                O_(FLOAT32, 
FLOAT32, EMPTY, NEG)},
-       {"dadd",                                                O_(FLOAT64, 
FLOAT64, FLOAT64, ADD)},
-       {"dsub",                                                O_(FLOAT64, 
FLOAT64, FLOAT64, SUB)},
-       {"dmul",                                                O_(FLOAT64, 
FLOAT64, FLOAT64, MUL)},
-       {"ddiv",                                                O_(FLOAT64, 
FLOAT64, FLOAT64, DIV)},
-       {"drem",                                                O_(FLOAT64, 
FLOAT64, FLOAT64, REM)},
-       {"drem_ieee",                                   F_(FLOAT64, FLOAT64, 
FLOAT64)},
-       {"dneg",                                                O_(FLOAT64, 
FLOAT64, EMPTY, NEG)},
-       {"nfadd",                                               O_(NFLOAT, 
NFLOAT, NFLOAT, ADD)},
-       {"nfsub",                                               O_(NFLOAT, 
NFLOAT, NFLOAT, SUB)},
-       {"nfmul",                                               O_(NFLOAT, 
NFLOAT, NFLOAT, MUL)},
-       {"nfdiv",                                               O_(NFLOAT, 
NFLOAT, NFLOAT, DIV)},
-       {"nfrem",                                               O_(NFLOAT, 
NFLOAT, NFLOAT, REM)},
-       {"nfrem_ieee",                                  F_(NFLOAT, NFLOAT, 
NFLOAT)},
-       {"nfneg",                                               O_(NFLOAT, 
NFLOAT, EMPTY, NEG)},
-
-       /*
-        * Bitwise opcodes.
-        */
-       {"iand",                                                O_(INT, INT, 
INT, AND)},
-       {"ior",                                                 O_(INT, INT, 
INT, OR)},
-       {"ixor",                                                O_(INT, INT, 
INT, XOR)},
-       {"inot",                                                O_(INT, INT, 
EMPTY, NOT)},
-       {"ishl",                                                O_(INT, INT, 
INT, SHL)},
-       {"ishr",                                                O_(INT, INT, 
INT, SHR)},
-       {"ishr_un",                                             O_(INT, INT, 
INT, SHR_UN)},
-       {"land",                                                O_(LONG, LONG, 
LONG, AND)},
-       {"lor",                                                 O_(LONG, LONG, 
LONG, OR)},
-       {"lxor",                                                O_(LONG, LONG, 
LONG, XOR)},
-       {"lnot",                                                O_(LONG, LONG, 
EMPTY, NOT)},
-       {"lshl",                                                O_(LONG, LONG, 
INT, SHL)},
-       {"lshr",                                                O_(LONG, LONG, 
INT, SHR)},
-       {"lshr_un",                                             O_(LONG, LONG, 
INT, SHR_UN)},
-
-       /*
-        * Branch opcodes.
-        */
-       {"br",                                                  B_(EMPTY, 
EMPTY)},
-       {"br_ifalse",                                   B_(INT, EMPTY)},
-       {"br_itrue",                                    B_(INT, EMPTY)},
-       {"br_ieq",                                              A_(INT, INT, 
EQ)},
-       {"br_ine",                                              A_(INT, INT, 
NE)},
-       {"br_ilt",                                              A_(INT, INT, 
LT)},
-       {"br_ilt_un",                                   B_(INT, INT)},
-       {"br_ile",                                              A_(INT, INT, 
LE)},
-       {"br_ile_un",                                   B_(INT, INT)},
-       {"br_igt",                                              A_(INT, INT, 
GT)},
-       {"br_igt_un",                                   B_(INT, INT)},
-       {"br_ige",                                              A_(INT, INT, 
GE)},
-       {"br_ige_un",                                   B_(INT, INT)},
-       {"br_lfalse",                                   B_(LONG, EMPTY)},
-       {"br_ltrue",                                    B_(LONG, EMPTY)},
-       {"br_leq",                                              A_(LONG, LONG, 
EQ)},
-       {"br_lne",                                              A_(LONG, LONG, 
NE)},
-       {"br_llt",                                              A_(LONG, LONG, 
LT)},
-       {"br_llt_un",                                   B_(LONG, LONG)},
-       {"br_lle",                                              A_(LONG, LONG, 
LE)},
-       {"br_lle_un",                                   B_(LONG, LONG)},
-       {"br_lgt",                                              A_(LONG, LONG, 
GT)},
-       {"br_lgt_un",                                   B_(LONG, LONG)},
-       {"br_lge",                                              A_(LONG, LONG, 
GE)},
-       {"br_lge_un",                                   B_(LONG, LONG)},
-       {"br_feq",                                              A_(FLOAT32, 
FLOAT32, EQ)},
-       {"br_fne",                                              A_(FLOAT32, 
FLOAT32, NE)},
-       {"br_flt",                                              A_(FLOAT32, 
FLOAT32, LT)},
-       {"br_fle",                                              A_(FLOAT32, 
FLOAT32, LE)},
-       {"br_fgt",                                              A_(FLOAT32, 
FLOAT32, GT)},
-       {"br_fge",                                              A_(FLOAT32, 
FLOAT32, GE)},
-       {"br_feq_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_fne_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_flt_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_fle_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_fgt_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_fge_inv",                                  B_(FLOAT32, FLOAT32)},
-       {"br_deq",                                              A_(FLOAT64, 
FLOAT64, EQ)},
-       {"br_dne",                                              A_(FLOAT64, 
FLOAT64, NE)},
-       {"br_dlt",                                              A_(FLOAT64, 
FLOAT64, LT)},
-       {"br_dle",                                              A_(FLOAT64, 
FLOAT64, LE)},
-       {"br_dgt",                                              A_(FLOAT64, 
FLOAT64, GT)},
-       {"br_dge",                                              A_(FLOAT64, 
FLOAT64, GE)},
-       {"br_deq_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_dne_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_dlt_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_dle_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_dgt_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_dge_inv",                                  B_(FLOAT64, FLOAT64)},
-       {"br_nfeq",                                             A_(NFLOAT, 
NFLOAT, EQ)},
-       {"br_nfne",                                             A_(NFLOAT, 
NFLOAT, NE)},
-       {"br_nflt",                                             A_(NFLOAT, 
NFLOAT, LT)},
-       {"br_nfle",                                             A_(NFLOAT, 
NFLOAT, LE)},
-       {"br_nfgt",                                             A_(NFLOAT, 
NFLOAT, GT)},
-       {"br_nfge",                                             A_(NFLOAT, 
NFLOAT, GE)},
-       {"br_nfeq_inv",                                 B_(NFLOAT, NFLOAT)},
-       {"br_nfne_inv",                                 B_(NFLOAT, NFLOAT)},
-       {"br_nflt_inv",                                 B_(NFLOAT, NFLOAT)},
-       {"br_nfle_inv",                                 B_(NFLOAT, NFLOAT)},
-       {"br_nfgt_inv",                                 B_(NFLOAT, NFLOAT)},
-       {"br_nfge_inv",                                 B_(NFLOAT, NFLOAT)},
-
-       /*
-        * Comparison opcodes.
-        */
-       {"icmp",                                                F_(INT, INT, 
INT)},
-       {"icmp_un",                                             F_(INT, INT, 
INT)},
-       {"lcmp",                                                F_(INT, LONG, 
LONG)},
-       {"lcmp_un",                                             F_(INT, LONG, 
LONG)},
-       {"fcmpl",                                               F_(INT, 
FLOAT32, FLOAT32)},
-       {"fcmpg",                                               F_(INT, 
FLOAT32, FLOAT32)},
-       {"dcmpl",                                               F_(INT, 
FLOAT64, FLOAT64)},
-       {"dcmpg",                                               F_(INT, 
FLOAT64, FLOAT64)},
-       {"nfcmpl",                                              F_(INT, NFLOAT, 
NFLOAT)},
-       {"nfcmpg",                                              F_(INT, NFLOAT, 
NFLOAT)},
-       {"ieq",                                                 O_(INT, INT, 
INT, EQ)},
-       {"ine",                                                 O_(INT, INT, 
INT, NE)},
-       {"ilt",                                                 O_(INT, INT, 
INT, LT)},
-       {"ilt_un",                                              F_(INT, INT, 
INT)},
-       {"ile",                                                 O_(INT, INT, 
INT, LE)},
-       {"ile_un",                                              F_(INT, INT, 
INT)},
-       {"igt",                                                 O_(INT, INT, 
INT, GT)},
-       {"igt_un",                                              F_(INT, INT, 
INT)},
-       {"ige",                                                 O_(INT, INT, 
INT, GE)},
-       {"ige_un",                                              F_(INT, INT, 
INT)},
-       {"leq",                                                 O_(INT, LONG, 
LONG, EQ)},
-       {"lne",                                                 O_(INT, LONG, 
LONG, NE)},
-       {"llt",                                                 O_(INT, LONG, 
LONG, LT)},
-       {"llt_un",                                              F_(INT, LONG, 
LONG)},
-       {"lle",                                                 O_(INT, LONG, 
LONG, LE)},
-       {"lle_un",                                              F_(INT, LONG, 
LONG)},
-       {"lgt",                                                 O_(INT, LONG, 
LONG, GT)},
-       {"lgt_un",                                              F_(INT, LONG, 
LONG)},
-       {"lge",                                                 O_(INT, LONG, 
LONG, GE)},
-       {"lge_un",                                              F_(INT, LONG, 
LONG)},
-       {"feq",                                                 O_(INT, 
FLOAT32, FLOAT32, EQ)},
-       {"fne",                                                 O_(INT, 
FLOAT32, FLOAT32, NE)},
-       {"flt",                                                 O_(INT, 
FLOAT32, FLOAT32, LT)},
-       {"fle",                                                 O_(INT, 
FLOAT32, FLOAT32, LE)},
-       {"fgt",                                                 O_(INT, 
FLOAT32, FLOAT32, GT)},
-       {"fge",                                                 O_(INT, 
FLOAT32, FLOAT32, GE)},
-       {"feq_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"fne_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"flt_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"fle_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"fgt_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"fge_inv",                                             F_(INT, 
FLOAT32, FLOAT32)},
-       {"deq",                                                 O_(INT, 
FLOAT64, FLOAT64, EQ)},
-       {"dne",                                                 O_(INT, 
FLOAT64, FLOAT64, NE)},
-       {"dlt",                                                 O_(INT, 
FLOAT64, FLOAT64, LT)},
-       {"dle",                                                 O_(INT, 
FLOAT64, FLOAT64, LE)},
-       {"dgt",                                                 O_(INT, 
FLOAT64, FLOAT64, GT)},
-       {"dge",                                                 O_(INT, 
FLOAT64, FLOAT64, GE)},
-       {"deq_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"dne_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"dlt_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"dle_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"dgt_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"dge_inv",                                             F_(INT, 
FLOAT64, FLOAT64)},
-       {"nfeq",                                                O_(INT, NFLOAT, 
NFLOAT, EQ)},
-       {"nfne",                                                O_(INT, NFLOAT, 
NFLOAT, NE)},
-       {"nflt",                                                O_(INT, NFLOAT, 
NFLOAT, LT)},
-       {"nfle",                                                O_(INT, NFLOAT, 
NFLOAT, LE)},
-       {"nfgt",                                                O_(INT, NFLOAT, 
NFLOAT, GT)},
-       {"nfge",                                                O_(INT, NFLOAT, 
NFLOAT, GE)},
-       {"nfeq_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"nfne_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"nflt_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"nfle_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"nfgt_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"nfge_inv",                                    F_(INT, NFLOAT, 
NFLOAT)},
-       {"is_fnan",                                             F_(INT, 
FLOAT32, EMPTY)},
-       {"is_finf",                                             F_(INT, 
FLOAT32, EMPTY)},
-       {"is_ffinite",                                  F_(INT, FLOAT32, 
EMPTY)},
-       {"is_dnan",                                             F_(INT, 
FLOAT64, EMPTY)},
-       {"is_dinf",                                             F_(INT, 
FLOAT64, EMPTY)},
-       {"is_dfinite",                                  F_(INT, FLOAT64, 
EMPTY)},
-       {"is_nfnan",                                    F_(INT, NFLOAT, EMPTY)},
-       {"is_nfinf",                                    F_(INT, NFLOAT, EMPTY)},
-       {"is_nffinite",                                 F_(INT, NFLOAT, EMPTY)},
-
-       /*
-        * Mathematical functions.
-        */
-       {"facos",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fasin",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fatan",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fatan2",                                              F_(FLOAT32, 
FLOAT32, FLOAT32)},
-       {"fceil",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fcos",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fcosh",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fexp",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"ffloor",                                              F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"flog",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"flog10",                                              F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fpow",                                                F_(FLOAT32, 
FLOAT32, FLOAT32)},
-       {"frint",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fround",                                              F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fsin",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fsinh",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"fsqrt",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"ftan",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"ftanh",                                               F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"dacos",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dasin",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"datan",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"datan2",                                              F_(FLOAT64, 
FLOAT64, FLOAT64)},
-       {"dceil",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dcos",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dcosh",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dexp",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dfloor",                                              F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dlog",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dlog10",                                              F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dpow",                                                F_(FLOAT64, 
FLOAT64, FLOAT64)},
-       {"drint",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dround",                                              F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dsin",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dsinh",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dsqrt",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dtan",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"dtanh",                                               F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"nfacos",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfasin",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfatan",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfatan2",                                             F_(NFLOAT, 
NFLOAT, NFLOAT)},
-       {"nfceil",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfcos",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfcosh",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfexp",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nffloor",                                             F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nflog",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nflog10",                                             F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfpow",                                               F_(NFLOAT, 
NFLOAT, NFLOAT)},
-       {"nfrint",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfround",                                             F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfsin",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfsinh",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nfsqrt",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nftan",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"nftanh",                                              F_(NFLOAT, 
NFLOAT, EMPTY)},
-
-       /*
-        * Absolute, minimum, maximum, and sign.
-        */
-       {"iabs",                                                F_(INT, INT, 
EMPTY)},
-       {"labs",                                                F_(LONG, LONG, 
EMPTY)},
-       {"fabs",                                                F_(FLOAT32, 
FLOAT32, EMPTY)},
-       {"dabs",                                                F_(FLOAT64, 
FLOAT64, EMPTY)},
-       {"nfabs",                                               F_(NFLOAT, 
NFLOAT, EMPTY)},
-       {"imin",                                                F_(INT, INT, 
INT)},
-       {"imin_un",                                             F_(INT, INT, 
INT)},
-       {"lmin",                                                F_(LONG, LONG, 
LONG)},
-       {"lmin_un",                                             F_(LONG, LONG, 
LONG)},
-       {"fmin",                                                F_(FLOAT32, 
FLOAT32, FLOAT32)},
-       {"dmin",                                                F_(FLOAT64, 
FLOAT64, FLOAT64)},
-       {"nfmin",                                               F_(NFLOAT, 
NFLOAT, NFLOAT)},
-       {"imax",                                                F_(INT, INT, 
INT)},
-       {"imax_un",                                             F_(INT, INT, 
INT)},
-       {"lmax",                                                F_(LONG, LONG, 
LONG)},
-       {"lmax_un",                                             F_(LONG, LONG, 
LONG)},
-       {"fmax",                                                F_(FLOAT32, 
FLOAT32, FLOAT32)},
-       {"dmax",                                                F_(FLOAT64, 
FLOAT64, FLOAT64)},
-       {"nfmax",                                               F_(NFLOAT, 
NFLOAT, NFLOAT)},
-       {"isign",                                               F_(INT, INT, 
EMPTY)},
-       {"lsign",                                               F_(INT, LONG, 
EMPTY)},
-       {"fsign",                                               F_(INT, 
FLOAT32, EMPTY)},
-       {"dsign",                                               F_(INT, 
FLOAT64, EMPTY)},
-       {"nfsign",                                              F_(INT, NFLOAT, 
EMPTY)},
-
-       /*
-        * Pointer check opcodes.
-        */
-       {"check_null",                                  F_(EMPTY, PTR, EMPTY)},
-
-       /*
-        * Function calls.
-        */
-       {"call",                                                
JIT_OPCODE_IS_CALL},
-       {"call_tail",                                   JIT_OPCODE_IS_CALL},
-       {"call_indirect",                               F_(EMPTY, PTR, EMPTY) | 
INDIRECT_ARGS},
-       {"call_indirect_tail",                  F_(EMPTY, PTR, EMPTY) | 
INDIRECT_ARGS},
-       {"call_vtable_ptr",                             F_(EMPTY, PTR, EMPTY)},
-       {"call_vtable_ptr_tail",                F_(EMPTY, PTR, EMPTY)},
-       {"call_external",                               
JIT_OPCODE_IS_CALL_EXTERNAL},
-       {"call_external_tail",                  JIT_OPCODE_IS_CALL_EXTERNAL},
-       {"return",                                              F_(EMPTY, 
EMPTY, EMPTY)},
-       {"return_int",                                  F_(EMPTY, INT, EMPTY)},
-       {"return_long",                                 F_(EMPTY, LONG, EMPTY)},
-       {"return_float32",                              F_(EMPTY, FLOAT32, 
EMPTY)},
-       {"return_float64",                              F_(EMPTY, FLOAT64, 
EMPTY)},
-       {"return_nfloat",                               F_(EMPTY, NFLOAT, 
EMPTY)},
-       {"return_small_struct",                 F_(EMPTY, PTR, PTR) | NINT_ARG},
-       {"setup_for_nested",                    F_(EMPTY, INT, EMPTY)},
-       {"setup_for_sibling",                   F_(EMPTY, INT, INT) | NINT_ARG},
-       {"import",                                              F_(PTR, ANY, 
INT)},
-
-       /*
-        * Exception handling.
-        */
-       {"throw",                                               F_(EMPTY, PTR, 
EMPTY)},
-       {"rethrow",                                             F_(EMPTY, PTR, 
EMPTY)},
-       {"load_pc",                                             F_(PTR, EMPTY, 
EMPTY)},
-       {"load_exception_pc",                   F_(PTR, EMPTY, EMPTY)},
-       {"enter_finally",                               F_(EMPTY, EMPTY, 
EMPTY)},
-       {"leave_finally",                               F_(EMPTY, EMPTY, 
EMPTY)},
-       {"call_finally",                                B_(EMPTY, EMPTY)},
-       {"enter_filter",                                F_(ANY, EMPTY, EMPTY)},
-       {"leave_filter",                                F_(EMPTY, ANY, EMPTY)},
-       {"call_filter",                                 B_(ANY, EMPTY)},
-       {"call_filter_return",                  F_(ANY, EMPTY, EMPTY)},
-       {"address_of_label",                    JIT_OPCODE_IS_ADDROF_LABEL},
-
-       /*
-        * Data manipulation.
-        */
-       {"copy_load_sbyte",                             F_(INT, INT, EMPTY)},
-       {"copy_load_ubyte",                             F_(INT, INT, EMPTY)},
-       {"copy_load_short",                             F_(INT, INT, EMPTY)},
-       {"copy_load_ushort",                    F_(INT, INT, EMPTY)},
-       {"copy_int",                                    O_(INT, INT, EMPTY, 
COPY)},
-       {"copy_long",                                   O_(LONG, LONG, EMPTY, 
COPY)},
-       {"copy_float32",                                O_(FLOAT32, FLOAT32, 
EMPTY, COPY)},
-       {"copy_float64",                                O_(FLOAT64, FLOAT64, 
EMPTY, COPY)},
-       {"copy_nfloat",                                 O_(NFLOAT, NFLOAT, 
EMPTY, COPY)},
-       {"copy_struct",                                 O_(PTR, PTR, EMPTY, 
COPY) | NINT_ARG},
-       {"copy_store_byte",                             F_(INT, INT, EMPTY)},
-       {"copy_store_short",                    F_(INT, INT, EMPTY)},
-       {"address_of",                                  O_(PTR, ANY, EMPTY, 
ADDRESS_OF)},
-
-       /*
-        * Incoming registers, outgoing registers, and stack pushes.
-        */
-       {"incoming_reg",                                JIT_OPCODE_IS_REG},
-       {"incoming_frame_posn",                 F_(EMPTY, ANY, INT)},
-       {"outgoing_reg",                                JIT_OPCODE_IS_REG},
-       {"outgoing_frame_posn",                 F_(EMPTY, ANY, INT)},
-       {"return_reg",                                  JIT_OPCODE_IS_REG},
-       {"push_int",                                    F_(EMPTY, INT, EMPTY)},
-       {"push_long",                                   F_(EMPTY, LONG, EMPTY)},
-       {"push_float32",                                F_(EMPTY, FLOAT32, 
EMPTY)},
-       {"push_float64",                                F_(EMPTY, FLOAT64, 
EMPTY)},
-       {"push_nfloat",                                 F_(EMPTY, NFLOAT, 
EMPTY)},
-       {"push_struct",                                 F_(EMPTY, ANY, PTR) | 
NINT_ARG},
-       {"pop_stack",                                   F_(EMPTY, INT, EMPTY) | 
NINT_ARG},
-       {"flush_small_struct",                  F_(EMPTY, ANY, EMPTY) | 
NINT_ARG},
-       {"set_param_int",                               F_(EMPTY, INT, PTR)},
-       {"set_param_long",                              F_(EMPTY, LONG, PTR)},
-       {"set_param_float32",                   F_(EMPTY, FLOAT32, PTR)},
-       {"set_param_float64",                   F_(EMPTY, FLOAT64, PTR)},
-       {"set_param_nfloat",                    F_(EMPTY, NFLOAT, PTR)},
-       {"set_param_struct",                    F_(PTR, PTR, PTR)},
-       {"push_return_area_ptr",                F_(EMPTY, EMPTY, EMPTY)},
-
-       /*
-        * Pointer-relative loads and stores.
-        */
-       {"load_relative_sbyte",                 F_(INT, PTR, INT) | NINT_ARG},
-       {"load_relative_ubyte",                 F_(INT, PTR, INT) | NINT_ARG},
-       {"load_relative_short",                 F_(INT, PTR, INT) | NINT_ARG},
-       {"load_relative_ushort",                F_(INT, PTR, INT) | NINT_ARG},
-       {"load_relative_int",                   F_(INT, PTR, INT) | NINT_ARG},
-       {"load_relative_long",                  F_(LONG, PTR, INT) | NINT_ARG},
-       {"load_relative_float32",               F_(FLOAT32, PTR, INT) | 
NINT_ARG},
-       {"load_relative_float64",               F_(FLOAT64, PTR, INT) | 
NINT_ARG},
-       {"load_relative_nfloat",                F_(NFLOAT, PTR, INT) | 
NINT_ARG},
-       {"load_relative_struct",                F_(ANY, PTR, INT) | 
NINT_ARG_TWO},
-       {"store_relative_byte",                 F_(PTR, INT, INT) | NINT_ARG},
-       {"store_relative_short",                F_(PTR, INT, INT) | NINT_ARG},
-       {"store_relative_int",                  F_(PTR, INT, INT) | NINT_ARG},
-       {"store_relative_long",                 F_(PTR, LONG, INT) | NINT_ARG},
-       {"store_relative_float32",              F_(PTR, FLOAT32, INT) | 
NINT_ARG},
-       {"store_relative_float64",              F_(PTR, FLOAT64, INT) | 
NINT_ARG},
-       {"store_relative_nfloat",               F_(PTR, NFLOAT, INT) | 
NINT_ARG},
-       {"store_relative_struct",               F_(PTR, ANY, INT) | 
NINT_ARG_TWO},
-       {"add_relative",                                F_(PTR, PTR, INT) | 
NINT_ARG},
-
-       /*
-        * Array element loads and stores.
-        */
-       {"load_element_sbyte",                  F_(INT, PTR, INT)},
-       {"load_element_ubyte",                  F_(INT, PTR, INT)},
-       {"load_element_short",                  F_(INT, PTR, INT)},
-       {"load_element_ushort",                 F_(INT, PTR, INT)},
-       {"load_element_int",                    F_(INT, PTR, INT)},
-       {"load_element_long",                   F_(LONG, PTR, INT)},
-       {"load_element_float32",                F_(FLOAT32, PTR, INT)},
-       {"load_element_float64",                F_(FLOAT64, PTR, INT)},
-       {"load_element_nfloat",                 F_(NFLOAT, PTR, INT)},
-       {"store_element_byte",                  F_(PTR, INT, INT)},
-       {"store_element_short",                 F_(PTR, INT, INT)},
-       {"store_element_int",                   F_(PTR, INT, INT)},
-       {"store_element_long",                  F_(PTR, INT, LONG)},
-       {"store_element_float32",               F_(PTR, INT, FLOAT32)},
-       {"store_element_float64",               F_(PTR, INT, FLOAT64)},
-       {"store_element_nfloat",                F_(PTR, INT, NFLOAT)},
-
-       /*
-        * Block operations.
-        */
-       {"memcpy",                                              F_(PTR, PTR, 
PTR)},
-       {"memmove",                                             F_(PTR, PTR, 
PTR)},
-       {"memset",                                              F_(PTR, INT, 
PTR)},
-
-       /*
-        * Allocate memory from the stack.
-        */
-       {"alloca",                                              F_(PTR, PTR, 
EMPTY)},
-
-       /*
-        * Debugging support.
-        */
-       {"mark_offset",                                 F_(EMPTY, INT, EMPTY)},
-       {"mark_breakpoint",                             F_(EMPTY, PTR, PTR)},
-
-       /*
-        * Switch statement support.
-        */
-       {"jump_table",                          F_(ANY, PTR, 
INT)|JIT_OPCODE_IS_JUMP_TABLE},
-};
-
-#if defined(JIT_BACKEND_INTERP)
-
-jit_opcode_info_t const _jit_interp_opcodes[JIT_OP_NUM_INTERP_OPCODES] = {
-
-       /*
-        * Argument variable access opcodes.
-        */
-       {"lda_0_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_0_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_0_short",                 JIT_OPCODE_NINT_ARG},
-       {"lda_0_ushort",                JIT_OPCODE_NINT_ARG},
-       {"lda_0_int",                   JIT_OPCODE_NINT_ARG},
-       {"lda_0_long",                  JIT_OPCODE_NINT_ARG},
-       {"lda_0_float32",               JIT_OPCODE_NINT_ARG},
-       {"lda_0_float64",               JIT_OPCODE_NINT_ARG},
-       {"lda_0_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldaa_0",                      JIT_OPCODE_NINT_ARG},
-       {"lda_1_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_1_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_1_short",                 JIT_OPCODE_NINT_ARG},
-       {"lda_1_ushort",                JIT_OPCODE_NINT_ARG},
-       {"lda_1_int",                   JIT_OPCODE_NINT_ARG},
-       {"lda_1_long",                  JIT_OPCODE_NINT_ARG},
-       {"lda_1_float32",               JIT_OPCODE_NINT_ARG},
-       {"lda_1_float64",               JIT_OPCODE_NINT_ARG},
-       {"lda_1_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldaa_1",                      JIT_OPCODE_NINT_ARG},
-       {"lda_2_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_2_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"lda_2_short",                 JIT_OPCODE_NINT_ARG},
-       {"lda_2_ushort",                JIT_OPCODE_NINT_ARG},
-       {"lda_2_int",                   JIT_OPCODE_NINT_ARG},
-       {"lda_2_long",                  JIT_OPCODE_NINT_ARG},
-       {"lda_2_float32",               JIT_OPCODE_NINT_ARG},
-       {"lda_2_float64",               JIT_OPCODE_NINT_ARG},
-       {"lda_2_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldaa_2",                      JIT_OPCODE_NINT_ARG},
-       {"sta_0_byte",                  JIT_OPCODE_NINT_ARG},
-       {"sta_0_short",                 JIT_OPCODE_NINT_ARG},
-       {"sta_0_int",                   JIT_OPCODE_NINT_ARG},
-       {"sta_0_long",                  JIT_OPCODE_NINT_ARG},
-       {"sta_0_float32",               JIT_OPCODE_NINT_ARG},
-       {"sta_0_float64",               JIT_OPCODE_NINT_ARG},
-       {"sta_0_nfloat",                JIT_OPCODE_NINT_ARG},
-
-       /*
-        * Local variable frame access opcodes.
-        */
-       {"ldl_0_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_0_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_0_short",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_0_ushort",                JIT_OPCODE_NINT_ARG},
-       {"ldl_0_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldl_0_long",                  JIT_OPCODE_NINT_ARG},
-       {"ldl_0_float32",               JIT_OPCODE_NINT_ARG},
-       {"ldl_0_float64",               JIT_OPCODE_NINT_ARG},
-       {"ldl_0_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldla_0",                      JIT_OPCODE_NINT_ARG},
-       {"ldl_1_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_1_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_1_short",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_1_ushort",                JIT_OPCODE_NINT_ARG},
-       {"ldl_1_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldl_1_long",                  JIT_OPCODE_NINT_ARG},
-       {"ldl_1_float32",               JIT_OPCODE_NINT_ARG},
-       {"ldl_1_float64",               JIT_OPCODE_NINT_ARG},
-       {"ldl_1_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldla_1",                      JIT_OPCODE_NINT_ARG},
-       {"ldl_2_sbyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_2_ubyte",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_2_short",                 JIT_OPCODE_NINT_ARG},
-       {"ldl_2_ushort",                JIT_OPCODE_NINT_ARG},
-       {"ldl_2_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldl_2_long",                  JIT_OPCODE_NINT_ARG},
-       {"ldl_2_float32",               JIT_OPCODE_NINT_ARG},
-       {"ldl_2_float64",               JIT_OPCODE_NINT_ARG},
-       {"ldl_2_nfloat",                JIT_OPCODE_NINT_ARG},
-       {"ldla_2",                      JIT_OPCODE_NINT_ARG},
-       {"stl_0_byte",                  JIT_OPCODE_NINT_ARG},
-       {"stl_0_short",                 JIT_OPCODE_NINT_ARG},
-       {"stl_0_int",                   JIT_OPCODE_NINT_ARG},
-       {"stl_0_long",                  JIT_OPCODE_NINT_ARG},
-       {"stl_0_float32",               JIT_OPCODE_NINT_ARG},
-       {"stl_0_float64",               JIT_OPCODE_NINT_ARG},
-       {"stl_0_nfloat",                JIT_OPCODE_NINT_ARG},
-
-       /*
-        * Load constant values.
-        */
-       {"ldc_0_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldc_1_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldc_2_int",                   JIT_OPCODE_NINT_ARG},
-       {"ldc_0_long",                  JIT_OPCODE_CONST_LONG},
-       {"ldc_1_long",                  JIT_OPCODE_CONST_LONG},
-       {"ldc_2_long",                  JIT_OPCODE_CONST_LONG},
-       {"ldc_0_float32",               JIT_OPCODE_CONST_FLOAT32},
-       {"ldc_1_float32",               JIT_OPCODE_CONST_FLOAT32},
-       {"ldc_2_float32",               JIT_OPCODE_CONST_FLOAT32},
-       {"ldc_0_float64",               JIT_OPCODE_CONST_FLOAT64},
-       {"ldc_1_float64",               JIT_OPCODE_CONST_FLOAT64},
-       {"ldc_2_float64",               JIT_OPCODE_CONST_FLOAT64},
-       {"ldc_0_nfloat",                JIT_OPCODE_CONST_NFLOAT},
-       {"ldc_1_nfloat",                JIT_OPCODE_CONST_NFLOAT},
-       {"ldc_2_nfloat",                JIT_OPCODE_CONST_NFLOAT},
-
-       /*
-        * Load return value.
-        */
-       {"ldr_0_int",                   0},
-       {"ldr_0_long",                  0},
-       {"ldr_0_float32",               0},
-       {"ldr_0_float64",               0},
-       {"ldr_0_nfloat",                0},
-
-       /*
-        * Stack management.
-        */
-       {"pop",                         0},
-       {"pop_2",                       0},
-       {"pop_3",                       0},
-
-       /*
-        * Nested function call handling.
-        */
-       {"import_local",                JIT_OPCODE_NINT_ARG_TWO},
-       {"import_arg",                  JIT_OPCODE_NINT_ARG_TWO},
-
-       /*
-        * Marker opcode for the end of a function.
-        */
-       {"end_marker",                  0},
-};
-
-#endif /* JIT_BACKEND_INTERP */
diff --git a/jit/jit-rules-interp.c b/jit/jit-rules-interp.c
index e3f5d80..34b6a57 100644
--- a/jit/jit-rules-interp.c
+++ b/jit/jit-rules-interp.c
@@ -900,7 +900,7 @@ load_value(jit_gencode_t gen, jit_value_t value, int index)
                case JIT_TYPE_USHORT:
                case JIT_TYPE_INT:
                case JIT_TYPE_UINT:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDC_0_INT + 
index);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_LDC_0_INT 
+ index);
                        jit_cache_native(&(gen->posn), 
(jit_nint)(value->address));
                        break;
 
@@ -909,7 +909,7 @@ load_value(jit_gencode_t gen, jit_value_t value, int index)
                        {
                                jit_long long_value;
                                long_value = jit_value_get_long_constant(value);
-                               jit_cache_opcode(&(gen->posn), 
JIT_OP_LDC_0_LONG + index);
+                               jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDC_0_LONG + index);
 #ifdef JIT_NATIVE_INT64
                                jit_cache_native(&(gen->posn), long_value);
 #else
@@ -922,7 +922,7 @@ load_value(jit_gencode_t gen, jit_value_t value, int index)
                        {
                                jit_float32 float32_value;
                                float32_value = 
jit_value_get_float32_constant(value);
-                               jit_cache_opcode(&(gen->posn), 
JIT_OP_LDC_0_FLOAT32 + index);
+                               jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDC_0_FLOAT32 + index);
                                jit_cache_add_n(&(gen->posn), &float32_value, 
sizeof(float32_value));
                                break;
                        }
@@ -931,7 +931,7 @@ load_value(jit_gencode_t gen, jit_value_t value, int index)
                        {
                                jit_float64 float64_value;
                                float64_value = 
jit_value_get_float64_constant(value);
-                               jit_cache_opcode(&(gen->posn), 
JIT_OP_LDC_0_FLOAT64 + index);
+                               jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDC_0_FLOAT64 + index);
                                jit_cache_add_n (&(gen->posn), &float64_value, 
sizeof(float64_value));
                                break;
                        }
@@ -940,7 +940,7 @@ load_value(jit_gencode_t gen, jit_value_t value, int index)
                        {
                                jit_nfloat nfloat_value;
                                nfloat_value = 
jit_value_get_nfloat_constant(value);
-                               jit_cache_opcode(&(gen->posn), 
JIT_OP_LDC_0_NFLOAT + index);
+                               jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDC_0_NFLOAT + index);
                                jit_cache_add_n (&(gen->posn), &nfloat_value, 
sizeof(nfloat_value));
                                break;
                        }
@@ -958,13 +958,13 @@ load_value(jit_gencode_t gen, jit_value_t value, int 
index)
                        switch(index)
                        {
                        case 0:
-                               opcode = JIT_OP_LDL_0_SBYTE;
+                               opcode = JIT_INTERP_OP_LDL_0_SBYTE;
                                break;
                        case 1:
-                               opcode = JIT_OP_LDL_1_SBYTE;
+                               opcode = JIT_INTERP_OP_LDL_1_SBYTE;
                                break;
                        case 2:
-                               opcode = JIT_OP_LDL_2_SBYTE;
+                               opcode = JIT_INTERP_OP_LDL_2_SBYTE;
                                break;
                        default:
                                return;
@@ -978,13 +978,13 @@ load_value(jit_gencode_t gen, jit_value_t value, int 
index)
                        switch(index)
                        {
                        case 0:
-                               opcode = JIT_OP_LDA_0_SBYTE;
+                               opcode = JIT_INTERP_OP_LDA_0_SBYTE;
                                break;
                        case 1:
-                               opcode = JIT_OP_LDA_1_SBYTE;
+                               opcode = JIT_INTERP_OP_LDA_1_SBYTE;
                                break;
                        case 2:
-                               opcode = JIT_OP_LDA_2_SBYTE;
+                               opcode = JIT_INTERP_OP_LDA_2_SBYTE;
                                break;
                        default:
                                return;
@@ -1011,11 +1011,11 @@ store_value(jit_gencode_t gen, jit_value_t value)
        offset = value->frame_offset;
        if(offset >= 0)
        {
-               opcode = _jit_store_opcode(JIT_OP_STL_0_BYTE, 0, value->type);
+               opcode = _jit_store_opcode(JIT_INTERP_OP_STL_0_BYTE, 0, 
value->type);
        }
        else
        {
-               opcode = _jit_store_opcode(JIT_OP_STA_0_BYTE, 0, value->type);
+               opcode = _jit_store_opcode(JIT_INTERP_OP_STA_0_BYTE, 0, 
value->type);
                offset = -(offset + 1);
        }
        jit_cache_opcode(&(gen->posn), opcode);
@@ -1276,13 +1276,13 @@ void _jit_gen_insn(jit_gencode_t gen, jit_function_t 
func,
                _jit_gen_fix_value(insn->value1);
                if(insn->value1->frame_offset >= 0)
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_IMPORT_LOCAL);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_IMPORT_LOCAL);
                        jit_cache_native(&(gen->posn), 
insn->value1->frame_offset);
                        jit_cache_native(&(gen->posn), 
jit_value_get_nint_constant(insn->value2));
                }
                else
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_IMPORT_ARG);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_IMPORT_ARG);
                        jit_cache_native(&(gen->posn), 
-(insn->value1->frame_offset + 1));
                        jit_cache_native(&(gen->posn), 
jit_value_get_nint_constant(insn->value2));
                }
@@ -1346,28 +1346,28 @@ void _jit_gen_insn(jit_gencode_t gen, jit_function_t 
func,
                case JIT_TYPE_USHORT:
                case JIT_TYPE_INT:
                case JIT_TYPE_UINT:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDR_0_INT);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_LDR_0_INT);
                        store_value(gen, insn->value1);
                        break;
 
                case JIT_TYPE_LONG:
                case JIT_TYPE_ULONG:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDR_0_LONG);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDR_0_LONG);
                        store_value(gen, insn->value1);
                        break;
 
                case JIT_TYPE_FLOAT32:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDR_0_FLOAT32);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDR_0_FLOAT32);
                        store_value(gen, insn->value1);
                        break;
 
                case JIT_TYPE_FLOAT64:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDR_0_FLOAT64);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDR_0_FLOAT64);
                        store_value(gen, insn->value1);
                        break;
 
                case JIT_TYPE_NFLOAT:
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDR_0_NFLOAT);
+                       jit_cache_opcode(&(gen->posn), 
JIT_INTERP_OP_LDR_0_NFLOAT);
                        store_value(gen, insn->value1);
                        break;
                }
@@ -1403,12 +1403,12 @@ void _jit_gen_insn(jit_gencode_t gen, jit_function_t 
func,
                _jit_gen_fix_value(insn->value1);
                if(insn->value1->frame_offset >= 0)
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDLA_0);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_LDLA_0);
                        jit_cache_native(&(gen->posn), 
insn->value1->frame_offset);
                }
                else
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_LDAA_0);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_LDAA_0);
                        jit_cache_native(&(gen->posn), 
-(insn->value1->frame_offset + 1));
                }
                store_value(gen, insn->dest);
@@ -1446,15 +1446,15 @@ void _jit_gen_insn(jit_gencode_t gen, jit_function_t 
func,
                size = jit_value_get_nint_constant(insn->value1);
                if(size == 1)
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_POP);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_POP);
                }
                else if(size == 2)
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_POP_2);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_POP_2);
                }
                else if(size == 3)
                {
-                       jit_cache_opcode(&(gen->posn), JIT_OP_POP_3);
+                       jit_cache_opcode(&(gen->posn), JIT_INTERP_OP_POP_3);
                }
                else if(size != 0)
                {
diff --git a/jit/mklabel.sh b/jit/mklabel.sh
index 21b0ba5..959780f 100755
--- a/jit/mklabel.sh
+++ b/jit/mklabel.sh
@@ -152,11 +152,11 @@ pic_table()
 }
 
 # Output the label table (PIC version).
-echo 'static int const main_label_table[JIT_OP_END_MARKER] = {'
+echo 'static int const main_label_table[JIT_INTERP_OP_END_MARKER] = {'
 grep '^#define[        ]*JIT_OP_' "$2" | grep -v 'JIT_OP_NUM_OPCODES' | \
        pic_table "$1" JIT_OP_NOP_label
-grep '^#define[        ]*JIT_OP_' "$3" | grep -v 'JIT_OP_NUM_INTERP_OPCODES' | 
\
-       grep -v 'JIT_OP_END_MARKER' | pic_table "$1" JIT_OP_NOP_label
+grep '^#define[        ]*JIT_INTERP_OP_' "$3" | grep -v 
'JIT_INTERP_OP_NUM_OPCODES' | \
+       grep -v 'JIT_INTERP_OP_END_MARKER' | pic_table "$1" JIT_OP_NOP_label
 echo '};'
 echo ''
 
@@ -270,11 +270,11 @@ non_pic_table()
 }
 
 # Output the label table (non-PIC).
-echo 'static void * main_label_table[JIT_OP_END_MARKER] = {'
+echo 'static void * main_label_table[JIT_INTERP_OP_END_MARKER] = {'
 grep '^#define[        ]*JIT_OP_' "$2" | grep -v 'JIT_OP_NUM_OPCODES' | \
        non_pic_table "$1" JIT_OP_NOP_label
-grep '^#define[        ]*JIT_OP_' "$3" | grep -v 'JIT_OP_NUM_INTERP_OPCODES' | 
\
-       grep -v 'JIT_OP_END_MARKER' | non_pic_table "$1" JIT_OP_NOP_label
+grep '^#define[        ]*JIT_INTERP_OP_' "$3" | grep -v 
'JIT_INTERP_OP_NUM_OPCODES' | \
+       grep -v 'JIT_INTERP_OP_END_MARKER' | non_pic_table "$1" JIT_OP_NOP_label
 echo '};'
 echo ''
 
diff --git a/tools/.gitignore b/tools/.gitignore
index 0e470ed..6dc60bc 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -4,6 +4,8 @@ Makefile.in
 .libs
 gen-apply
 gen-apply.exe
+gen-ops
+gen-ops.exe
 gen-rules
 gen-rules.exe
 *.lo
@@ -13,3 +15,6 @@ gen-rules.exe
 gen-rules-parser.c
 gen-rules-parser.h
 gen-rules-scanner.c
+gen-ops-parser.c
+gen-ops-parser.h
+gen-ops-scanner.c
diff --git a/tools/Makefile.am b/tools/Makefile.am
index d86ee3c..3c27e82 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,5 +1,5 @@
 
-noinst_PROGRAMS = gen-apply gen-rules
+noinst_PROGRAMS = gen-apply gen-rules gen-ops
 
 noinst_HEADERS = gen-apply-macosx.h
 
@@ -7,10 +7,14 @@ gen_apply_SOURCES = gen-apply.c
 
 gen_rules_SOURCES = gen-rules-parser.y gen-rules-scanner.l
 
+gen_ops_SOURCES = gen-ops-scanner.l gen-ops-parser.y
+
 AM_YFLAGS = -d
 
 gen-rules-scanner.l: gen-rules-parser.c
 
+gen-ops-scanner.l: gen-ops-parser.c
+
 all-local: $(top_builddir)/jit/jit-apply-rules.h
 
 $(top_builddir)/jit/jit-apply-rules.h: gen-apply$(EXEEXT)
diff --git a/tools/gen-ops-parser.y b/tools/gen-ops-parser.y
new file mode 100644
index 0000000..35dc051
--- /dev/null
+++ b/tools/gen-ops-parser.y
@@ -0,0 +1,1119 @@
+%{
+/*
+ * gen-ops-parser.y - Bison grammar for the "gen-ops" program.
+ *
+ * Copyright (C) 2010  Southern Storm Software, Pty Ltd.
+ *
+ * This file is part of the libjit library.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <ctype.h>
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#elif defined(HAVE_STRINGS_H)
+# include <strings.h>
+#endif
+
+/*
+ * Imports from the lexical analyser.
+ */
+extern int yylex(void);
+extern void yyrestart(FILE *file);
+#ifdef YYTEXT_POINTER
+extern char *yytext;
+#else
+extern char yytext[];
+#endif
+
+/*
+ * The task to execute
+ */
+#define TASK_GEN_NONE          0
+#define TASK_GEN_HEADER                1
+#define TASK_GEN_TABLE         2
+ 
+/*
+ * Value Flags
+ */
+#define VALUE_FLAG_EMPTY       0
+#define VALUE_FLAG_INT         1
+#define VALUE_FLAG_LONG                2
+#define VALUE_FLAG_FLOAT32     3
+#define VALUE_FLAG_FLOAT64     4
+#define VALUE_FLAG_NFLOAT      5
+#define VALUE_FLAG_ANY         6
+#define VALUE_FLAG_PTR         7
+
+/*
+ * Opcode type flags
+ */
+#define OP_TYPE_BRANCH                 0x0001
+#define OP_TYPE_CALL                   0x0002
+#define OP_TYPE_CALL_EXTERNAL          0x0004
+#define OP_TYPE_ADDRESS_OF_LABEL       0x0008
+#define OP_TYPE_JUMP_TABLE             0x0010
+#define OP_TYPE_REG                    0x0020
+
+/*
+ * Operations
+ */
+#define        OP_NONE                 0x00
+#define        OP_ADD                  0x01
+#define        OP_SUB                  0x02
+#define        OP_MUL                  0x03
+#define        OP_DIV                  0x04
+#define        OP_REM                  0x05
+#define        OP_NEG                  0x06
+#define        OP_AND                  0x07
+#define        OP_OR                   0x08
+#define        OP_XOR                  0x09
+#define        OP_NOT                  0x0A
+#define        OP_EQ                   0x0B
+#define        OP_NE                   0x0C
+#define        OP_LT                   0x0D
+#define        OP_LE                   0x0E
+#define        OP_GT                   0x0F
+#define        OP_GE                   0x10
+#define        OP_SHL                  0x11
+#define        OP_SHR                  0x12
+#define        OP_SHR_UN               0x13
+#define        OP_COPY                 0x14
+#define        OP_ADDRESS_OF           0x15
+
+/*
+ * Current file and line number.
+ */
+extern char *genops_filename;
+extern long genops_linenum;
+
+struct genops_opcode
+{
+       struct genops_opcode   *next;
+       const char             *name;
+       int                     type;
+       int                     oper;
+       int                     dest_flags;
+       int                     input1_flags;
+       int                     input2_flags;
+       const char             *expression;
+};
+
+/*
+ * Opcode declaration list header
+ */
+struct genops_opcode_list
+{
+       const char *declaration;
+       const char *define_start;
+       const char *counter_prefix_expr;
+       struct genops_opcode *first_opcode;
+       struct genops_opcode *last_opcode;
+};
+
+/*
+ * The task to execute.
+ */
+static int genops_task = TASK_GEN_NONE;
+
+/*
+ * The file to execute
+ */
+static FILE *genops_file = 0;
+static int genops_file_needs_close = 0;
+
+/*
+ * Blocks coppied to the resulting file.
+ */
+static const char *start_code_block = 0;
+static const char *start_header_block = 0;
+static const char *end_code_block = 0;
+static const char *end_header_block = 0;
+
+/*
+ * Current opcode declaration header
+ */
+static struct genops_opcode_list *opcode_header = 0;
+
+/*
+ * Report error message.
+ */
+static void
+genops_error_message(char *filename, long linenum, char *msg)
+{
+       fprintf(stderr, "%s(%ld): %s\n", filename, linenum, msg);
+}
+
+/*
+ * Report error messages from the parser.
+ */
+static void
+yyerror(char *msg)
+{
+       genops_error_message(genops_filename, genops_linenum, msg);
+}
+
+/*
+ * Create an opcode declaration header.
+ */
+static void
+genops_create_opcode_header(const char *define_start, const char *declaration,
+                           const char *counter_prefix_expr)
+{
+       struct genops_opcode_list *header;
+
+       header = (struct genops_opcode_list *)malloc(sizeof(struct 
genops_opcode_list));
+       if(!header)
+       {
+               exit(1);
+       }
+       if(counter_prefix_expr && (strlen(counter_prefix_expr) == 0))
+       {
+               counter_prefix_expr = 0;
+       }
+       header->declaration = declaration;
+       header->define_start = define_start;
+       header->counter_prefix_expr = counter_prefix_expr;
+       header->first_opcode = 0;
+       header->last_opcode = 0;
+       opcode_header = header;
+}
+
+/*
+ * Create an opcode entry
+ */
+static struct genops_opcode *
+genops_add_opcode(const char *name, int type, int oper, int dest_flags, int 
input1_flags, int input2_flags, const char *expression)
+{
+       struct genops_opcode *opcode;
+
+       opcode = (struct genops_opcode *) malloc(sizeof(struct genops_opcode));
+       if(!opcode)
+       {
+               exit(1);
+       }
+
+       if(opcode_header->first_opcode == 0)
+       {
+               opcode_header->first_opcode = opcode;
+       }
+       if(opcode_header->last_opcode != 0)
+       {
+               opcode_header->last_opcode->next = opcode;
+       }
+       opcode_header->last_opcode = opcode;
+
+       opcode->next = 0;
+       opcode->name = name;
+       opcode->type = type;
+       opcode->oper = oper;
+       opcode->dest_flags = dest_flags;
+       opcode->input1_flags= input1_flags;
+       opcode->input2_flags= input2_flags;
+       opcode->expression = expression;
+
+       return opcode;
+}
+
+static int
+genops_output_flag(const char *flag, int needs_or)
+{
+       if(needs_or) printf(" | ");
+       printf(flag);
+       return 1;
+}
+
+static int
+genops_output_prefix_flag(const char *prefix, const char *flag, int needs_or)
+{
+       if(needs_or) printf(" | ");
+       printf("%s%s", prefix, flag);
+       return 1;
+}
+
+static int
+genops_output_type(int type, int needs_or)
+{
+
+       if(type & OP_TYPE_BRANCH)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_BRANCH", needs_or);
+       }
+       if(type & OP_TYPE_CALL)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_CALL", needs_or);
+       }
+       if(type & OP_TYPE_CALL_EXTERNAL)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_CALL_EXTERNAL", 
needs_or);
+       }
+       if(type & OP_TYPE_ADDRESS_OF_LABEL)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_ADDROF_LABEL", 
needs_or);
+       }
+       if(type & OP_TYPE_JUMP_TABLE)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_JUMP_TABLE", 
needs_or);
+       }
+       if(type & OP_TYPE_REG)
+       {
+               needs_or = genops_output_flag("JIT_OPCODE_IS_REG", needs_or);
+       }
+
+       return needs_or;
+}
+
+static int
+genops_output_expression(const char *expression, int needs_or)
+{
+       if(expression && (strlen(expression) > 0))
+       {
+               needs_or = genops_output_flag(expression, needs_or);
+       }
+       return needs_or;
+}
+
+static int
+genops_output_oper(int oper, int needs_or)
+{
+       switch(oper)
+       {
+               case OP_ADD:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_ADD", needs_or);
+               }
+               break;
+
+               case OP_SUB:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_SUB", needs_or);
+               }
+               break;
+
+               case OP_MUL:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_MUL", needs_or);
+               }
+               break;
+
+               case OP_DIV:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_DIV", needs_or);
+               }
+               break;
+
+               case OP_REM:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_REM", needs_or);
+               }
+               break;
+
+               case OP_NEG:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_NEG", needs_or);
+               }
+               break;
+
+               case OP_AND:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_AND", needs_or);
+               }
+               break;
+
+               case OP_OR:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_OR", needs_or);
+               }
+               break;
+
+               case OP_XOR:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_XOR", needs_or);
+               }
+               break;
+
+               case OP_NOT:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_NOT", needs_or);
+               }
+               break;
+
+               case OP_EQ:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_EQ", needs_or);
+               }
+               break;
+
+               case OP_NE:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_NE", needs_or);
+               }
+               break;
+
+               case OP_LT:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_LT", needs_or);
+               }
+               break;
+
+               case OP_LE:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_LE", needs_or);
+               }
+               break;
+
+               case OP_GT:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_GT", needs_or);
+               }
+               break;
+
+               case OP_GE:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_GE", needs_or);
+               }
+               break;
+
+               case OP_SHL:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_SHL", needs_or);
+               }
+               break;
+
+               case OP_SHR:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_SHR", needs_or);
+               }
+               break;
+
+               case OP_SHR_UN:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_SHR_UN", needs_or);
+               }
+               break;
+
+               case OP_COPY:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_COPY", needs_or);
+               }
+               break;
+
+               case OP_ADDRESS_OF:
+               {
+                       return genops_output_flag
+                               ("JIT_OPCODE_OPER_ADDRESS_OF", needs_or);
+               }
+               break;
+       }
+       return needs_or;
+}
+
+static int
+genops_output_value_flags(const char *prefix, int flags, int needs_or)
+{
+       switch(flags)
+       {
+               case VALUE_FLAG_EMPTY:
+               {
+                       /* Nothing to do here */
+               }
+               break;
+
+               case VALUE_FLAG_INT:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_INT", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_LONG:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_LONG", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_FLOAT32:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_FLOAT32", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_FLOAT64:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_FLOAT64", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_NFLOAT:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_NFLOAT", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_ANY:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_ANY", needs_or);
+               }
+               break;
+
+               case VALUE_FLAG_PTR:
+               {
+                       return genops_output_prefix_flag
+                               (prefix, "_PTR", needs_or);
+               }
+               break;
+       }
+       return needs_or;
+}
+
+/*
+ * Create an upper-case copy of a string.
+ */
+static char *
+genops_string_upper(const char *string)
+{
+       if(string)
+       {
+               char *cp;
+               char *new_string;
+
+               new_string = strdup(string);
+               for(cp = new_string; *cp; cp++)
+               {
+                       *cp = toupper(*cp);
+               }
+               return new_string;
+       }
+       return 0;
+}
+
+%}
+
+/*
+ * Define the structure of yylval.
+ */
+%union {
+       int                     value;
+       char                   *name;
+       struct
+       {
+               const char     *header;
+               const char     *code;
+       } blocks;
+       struct
+       {
+               const char     *declaration;
+               const char     *define_start;
+               const char     *counter_prefix_expr;
+       } opcode_list_header;
+       struct
+       {
+               const char     *name;
+               int             oper;
+       } opcode_header;
+       struct
+       {
+               int             dest_flags;
+               int             input1_flags;
+               int             input2_flags;
+       } opcode_values;
+       struct
+       {
+               int             type;
+               int             dest_flags;
+               int             input1_flags;
+               int             input2_flags;
+               const char     *expression;
+       } opcode_properties;
+       struct
+       {
+               const char     *name;
+               int             type;
+               int             oper;
+               int             dest_flags;
+               int             input1_flags;
+               int             input2_flags;
+               const char     *expression;
+       } opcode;
+}
+
+/*
+ * Primitive lexical tokens and keywords.
+ */
+%token IDENTIFIER              "an identifier"
+%token CODE_BLOCK              "a block copied to the code"
+%token HEADER_BLOCK            "a block copied to the header"
+%token LITERAL                 "literal string"
+%token K_EMPTY                 "empty"
+%token K_ANY                   "any"
+%token K_INT                   "int"
+%token K_LONG                  "long"
+%token K_PTR                   "ptr"
+%token K_FLOAT32               "float32"
+%token K_FLOAT64               "float64"
+%token K_NFLOAT                        "nfloat"
+%token K_NEG                   "neg"
+%token K_EQ                    "=="
+%token K_NE                    "!="
+%token K_LT                    "lt"
+%token K_LE                    "<="
+%token K_GT                    "gt"
+%token K_GE                    ">="
+%token K_SHL                   "<<"
+%token K_SHR                   ">>"
+%token K_SHR_UN                        "shr_un"
+%token K_ADDRESS_OF            "address_of"
+%token K_ADDRESS_OF_LABEL      "address_of_label"
+%token K_BRANCH                        "branch"
+%token K_CALL                  "call"
+%token K_CALL_EXTERNAL         "call_external"
+%token K_JUMP_TABLE            "jump_table"
+%token K_OP_DEF                        "op_def"
+%token K_OP_TYPE               "op_type"
+%token K_OP_VALUES             "op_values"
+%token K_OPCODES               "opcodes"
+%token K_REG                   "reg"
+
+/*
+ * Define the yylval types of the various non-terminals.
+ */
+%type <name>                   CODE_BLOCK HEADER_BLOCK
+%type <name>                   IDENTIFIER LITERAL Literal
+%type <blocks>                 Blocks
+%type <opcode_list_header>     OpcodeListHeader
+%type <value>                  ValueFlag Op
+%type <value>                  OpcodeType OpcodeTypeFlag
+%type <name>                   OpcodeExpression
+%type <opcode>                 Opcode
+%type <opcode_header>          OpcodeHeader
+%type <opcode_properties>      OpcodeProperties
+%type <opcode_values>          OpcodeValues
+
+%expect 0
+
+%error-verbose
+
+%start Start
+%%
+
+Start
+       : Blocks OpcodeDeclarations Blocks      {
+                       start_code_block = ($1).code;
+                       start_header_block = ($1).header;
+                       end_code_block = ($3).code;;
+                       end_header_block = ($3).header;
+               }
+       ;
+
+Blocks
+       : /* empty */           { ($$).header = 0; ($$).code = 0; }
+       | CODE_BLOCK            { ($$).header = 0; ($$).code = $1; }
+       | HEADER_BLOCK          { ($$).header = $1; ($$).code = 0; }
+       | CODE_BLOCK HEADER_BLOCK       {
+                        ($$).code = $1;
+                        ($$).header = $2;
+               }
+       | HEADER_BLOCK CODE_BLOCK       {
+                        ($$).code = $2;
+                        ($$).header = $1;
+               }
+       ;
+
+OpcodeDeclarations
+       : OpcodeListHeader      {
+                       genops_create_opcode_header(($1).declaration,
+                                                   ($1).define_start,
+                                                   ($1).counter_prefix_expr);
+               }
+               '{' Opcodes '}'
+       ;
+
+OpcodeListHeader
+       : K_OPCODES '(' IDENTIFIER ',' Literal ')'      {
+                       ($$).declaration = $3;
+                       ($$).define_start = $5;
+                       ($$).counter_prefix_expr = 0;
+               }
+       | K_OPCODES '(' IDENTIFIER ',' Literal ',' Literal ')'  {
+                       ($$).declaration = $3;
+                       ($$).define_start = $5;
+                       ($$).counter_prefix_expr = $7;
+               }
+       ;
+
+Opcodes
+       : Opcode                { 
+                       genops_add_opcode(($1).name, ($1).type,
+                                         ($1).oper, ($1).dest_flags,
+                                         ($1).input1_flags,
+                                         ($1).input2_flags,
+                                         ($1).expression);
+               }
+       | Opcodes Opcode        {
+                       genops_add_opcode(($2).name, ($2).type,
+                                         ($2).oper, ($2).dest_flags,
+                                         ($2).input1_flags,
+                                         ($2).input2_flags,
+                                         ($2).expression);
+               }
+       ;
+
+Opcode
+       : OpcodeHeader '{' '}'  {
+                       ($$).name = ($1).name;
+                       ($$).type = 0;
+                       ($$).oper = ($1).oper;
+                       ($$).dest_flags = VALUE_FLAG_EMPTY;
+                       ($$).input1_flags = VALUE_FLAG_EMPTY;
+                       ($$).input2_flags = VALUE_FLAG_EMPTY;
+                       ($$).expression = 0;
+               }
+       | OpcodeHeader '{' OpcodeProperties '}' {
+                       ($$).name = ($1).name;
+                       ($$).type = ($3).type;
+                       ($$).oper = ($1).oper;
+                       ($$).dest_flags = ($3).dest_flags;
+                       ($$).input1_flags = ($3).input1_flags;
+                       ($$).input2_flags = ($3).input2_flags;
+                       ($$).expression = ($3).expression;
+               }
+       ;
+
+OpcodeHeader
+       : K_OP_DEF '(' LITERAL ')'      {
+                       ($$).name = $3;
+                       ($$).oper = OP_NONE;
+               }
+       | K_OP_DEF '(' LITERAL ',' Op ')'       {
+                       ($$).name = $3;
+                       ($$).oper = $5;
+               }
+       ;
+
+OpcodeProperties
+       : OpcodeType            {
+                       ($$).type = $1;
+                       ($$).dest_flags = VALUE_FLAG_EMPTY;
+                       ($$).input1_flags = VALUE_FLAG_EMPTY;
+                       ($$).input2_flags = VALUE_FLAG_EMPTY;
+                       ($$).expression = 0;
+               }
+       | OpcodeValues                  {
+                       ($$).type = 0;
+                       ($$).dest_flags = ($1).dest_flags;
+                       ($$).input1_flags = ($1).input1_flags;
+                       ($$).input2_flags = ($1).input2_flags;
+                       ($$).expression = 0;
+               }
+       | OpcodeExpression              {
+                       ($$).type = 0;
+                       ($$).dest_flags = VALUE_FLAG_EMPTY;
+                       ($$).input1_flags = VALUE_FLAG_EMPTY;
+                       ($$).input2_flags = VALUE_FLAG_EMPTY;
+                       ($$).expression = $1;
+               }
+       | OpcodeProperties ',' OpcodeType       {
+                       ($$).type = $3;
+                       ($$).dest_flags = ($1).dest_flags;
+                       ($$).input1_flags = ($1).input1_flags;
+                       ($$).input2_flags = ($1).input2_flags;
+                       ($$).expression = ($1).expression;
+               }
+       | OpcodeProperties ',' OpcodeValues     {
+                       ($$).type = ($1).type;
+                       ($$).dest_flags = ($3).dest_flags;
+                       ($$).input1_flags = ($3).input1_flags;
+                       ($$).input2_flags = ($3).input2_flags;
+                       ($$).expression = ($1).expression;
+               }
+       | OpcodeProperties ',' OpcodeExpression {
+                       ($$).type = ($1).type;
+                       ($$).dest_flags = ($1).dest_flags;
+                       ($$).input1_flags = ($1).input1_flags;
+                       ($$).input2_flags = ($1).input2_flags;
+                       ($$).expression = $3;
+               }
+       ;
+
+OpcodeType
+       : K_OP_TYPE '(' OpcodeTypeFlag ')'      { $$ = $3; }
+       ;
+
+OpcodeTypeFlag
+       : K_ADDRESS_OF_LABEL    { $$ = OP_TYPE_ADDRESS_OF_LABEL; }
+       | K_BRANCH              { $$ = OP_TYPE_BRANCH; }
+       | K_CALL                { $$ = OP_TYPE_CALL; }
+       | K_CALL_EXTERNAL       { $$ = OP_TYPE_CALL_EXTERNAL; }
+       | K_JUMP_TABLE          { $$ = OP_TYPE_JUMP_TABLE; }
+       | K_REG                 { $$ = OP_TYPE_REG; }
+       ;
+
+OpcodeValues
+       : K_OP_VALUES '(' ValueFlag ')' {
+                       ($$).dest_flags = $3;
+                       ($$).input1_flags = VALUE_FLAG_EMPTY;
+                       ($$).input2_flags = VALUE_FLAG_EMPTY;
+               }
+       |  K_OP_VALUES '(' ValueFlag ',' ValueFlag ')'  {
+                       ($$).dest_flags = $3;
+                       ($$).input1_flags = $5;
+                       ($$).input2_flags = VALUE_FLAG_EMPTY;
+               }
+       |  K_OP_VALUES '(' ValueFlag ',' ValueFlag ',' ValueFlag ')'    {
+                       ($$).dest_flags = $3;
+                       ($$).input1_flags = $5;
+                       ($$).input2_flags = $7;
+               }
+       ;
+
+OpcodeExpression
+       : Literal                       { $$ = $1; }
+       ;
+
+Op
+       : /* empty */                   { $$ = OP_NONE; }
+       | '+'                           { $$ = OP_ADD; }
+       | '-'                           { $$ = OP_SUB; }
+       | '*'                           { $$ = OP_MUL; }
+       | '/'                           { $$ = OP_DIV; }
+       | '%'                           { $$ = OP_REM; }
+       | K_NEG                         { $$ = OP_NEG; }
+       | '&'                           { $$ = OP_AND; }
+       | '|'                           { $$ = OP_OR; }
+       | '^'                           { $$ = OP_XOR; }
+       | '~'                           { $$ = OP_NOT; }
+       | K_SHL                         { $$ = OP_SHL; }
+       | K_SHR                         { $$ = OP_SHR; }
+       | K_SHR_UN                      { $$ = OP_SHR_UN; }
+       | K_EQ                          { $$ = OP_EQ; }
+       | K_NE                          { $$ = OP_NE; }
+       | K_LE                          { $$ = OP_LE; }
+       | '<'                           { $$ = OP_LT; }
+       | K_GE                          { $$ = OP_GE; }
+       | '>'                           { $$ = OP_GT; }
+       | '='                           { $$ = OP_COPY; }
+       | K_ADDRESS_OF                  { $$ = OP_ADDRESS_OF; }
+       ;
+
+ValueFlag
+       : K_EMPTY                       { $$ = VALUE_FLAG_EMPTY; }
+       | K_INT                         { $$ = VALUE_FLAG_INT; }
+       | K_LONG                        { $$ = VALUE_FLAG_LONG; }
+       | K_PTR                         { $$ = VALUE_FLAG_PTR; }
+       | K_FLOAT32                     { $$ = VALUE_FLAG_FLOAT32; }
+       | K_FLOAT64                     { $$ = VALUE_FLAG_FLOAT64; }
+       | K_NFLOAT                      { $$ = VALUE_FLAG_NFLOAT; }
+       | K_ANY                         { $$ = VALUE_FLAG_ANY; }
+       ;
+
+Literal
+       : LITERAL                       { $$ = $1; }
+       | Literal LITERAL               {
+                       char *cp = malloc(strlen($1) + strlen($2) + 1);
+                       if(!cp)
+                       {
+                               exit(1);
+                       }
+                       strcpy(cp, $1);
+                       strcat(cp, $2);
+                       free($1);
+                       free($2);
+                       $$ = cp;
+               }
+       ;
+
+%%
+
+/*
+ * Parse the commandline arguments
+ */
+static int
+genops_parseargs(int argc, char *argv[])
+{
+       int current;
+
+       current = 1;
+       while(current < argc - 1)
+       {
+               if(!strcmp(argv[current], "-H") ||
+                  !strcmp(argv[current], "--header"))
+               {
+                       genops_task = TASK_GEN_HEADER;
+               }
+               else if(!strcmp(argv[current], "-T") ||
+                       !strcmp(argv[current], "--table"))
+               {
+                       genops_task = TASK_GEN_TABLE;
+               }
+               else if(!strcmp(argv[current], "--help"))
+               {
+                       return 1;
+               }
+               else
+               {
+                       fprintf(stderr, "Invalid commandline option %s\n",
+                               argv[current]);
+                       return 1;
+               }
+               ++current;
+       }
+       if(genops_task == TASK_GEN_NONE)
+       {
+               return 1;
+       }
+       if(argc > 1)
+       {
+               if(strcmp(argv[argc - 1], "-"))
+               {
+                       genops_file = fopen(argv[argc - 1], "r");
+                       if(!genops_file)
+                       {
+                               perror(argv[argc - 1]);
+                               return 1;
+                       }
+                       genops_file_needs_close = 1;
+               }
+               else
+               {
+                       genops_file = stdin;
+               }
+       }
+       else
+       {
+               return 1;
+       }
+       return 0;
+}
+
+/*
+ * Output the opcode declaration header
+ */
+static void
+genops_output_defines(const char *define_start, const char 
*counter_prefix_expr)
+{
+       struct genops_opcode *current;
+       int start_len;
+       int opcode_no;
+       int name_len;
+       int num_tabs;
+
+       start_len = strlen(define_start);
+       opcode_no = 0;
+       current = opcode_header->first_opcode;
+       while(current)
+       {
+               char *upper_name;
+
+               upper_name = genops_string_upper(current->name);
+               if(upper_name == 0)
+               {
+                       /* Out of memory */
+                       perror(genops_filename);
+                       exit(1);
+               }
+               printf("#define\t%s%s", define_start, upper_name);
+               name_len = strlen(upper_name) + 8 + start_len;
+               num_tabs = 8 - name_len / 8;
+               while(num_tabs > 0)
+               {
+                       printf("\t");
+                       --num_tabs;
+               }
+               if(counter_prefix_expr)
+               {
+                       printf("(%s + 0x%04X)\n", counter_prefix_expr, 
opcode_no);
+               }
+               else
+               {
+                       printf("0x%04X\n", opcode_no);
+               }
+               free(upper_name);
+               current = current->next;
+               ++opcode_no;
+       }
+       /*
+        * Print the definition for the number of opcodes
+        */
+       printf("#define\t%s%s", define_start, "NUM_OPCODES");
+       name_len = 11 + 8 + start_len;
+       num_tabs = 8 - name_len / 8;
+       while(num_tabs > 0)
+       {
+               printf("\t");
+               --num_tabs;
+       }
+       printf("0x%04X\n", opcode_no);
+}
+
+static void
+genops_output_defs(const char *filename)
+{
+       printf("/%c Automatically generated from %s - DO NOT EDIT %c/\n",
+                  '*', filename, '*');
+       if(start_header_block)
+       {
+               printf("%s", start_header_block);
+       }
+       genops_output_defines(opcode_header->define_start,
+                             opcode_header->counter_prefix_expr);
+       if(end_header_block)
+       {
+               printf("%s", end_header_block);
+       }
+}
+
+/*
+ * Output the opcode description table.
+ */
+static void
+genops_output_ops(void)
+{
+       struct genops_opcode *current;
+
+       printf("%s = {\n", opcode_header->declaration);
+       current = opcode_header->first_opcode;
+       while(current)
+       {
+               int needs_or = 0;
+
+               printf("\t{\"%s\"", current->name);
+               if(current->type || current->oper || current->dest_flags ||
+                  current->input1_flags || current->input2_flags||
+                  current->expression)
+                       printf(", ");
+               needs_or = genops_output_type(current->type, 0);
+               needs_or = genops_output_oper(current->oper, needs_or);
+               needs_or = genops_output_value_flags("JIT_OPCODE_DEST", 
current->dest_flags, needs_or);
+               needs_or = genops_output_value_flags("JIT_OPCODE_SRC1", 
current->input1_flags, needs_or);
+               needs_or = genops_output_value_flags("JIT_OPCODE_SRC2", 
current->input2_flags, needs_or);
+               needs_or = genops_output_expression(current->expression, 
needs_or);
+               if(!needs_or)
+               {
+                       /*
+                        * None of the above flags needed to be printed so
+                        * we have to add the 0 value here.
+                        */
+                       printf(", 0");
+               }
+               printf("}");
+               current = current->next;
+               if(current)
+               {
+                       printf(",\n");
+               }
+               else
+               {
+                       printf("\n");
+               }
+       }
+       printf("};\n");
+}
+
+static void
+genops_output_opcode_table(const char *filename)
+{
+       printf("/%c Automatically generated from %s - DO NOT EDIT %c/\n",
+                  '*', filename, '*');
+       if(start_code_block)
+       {
+               printf("%s", start_code_block);
+       }
+       genops_output_ops();
+       if(end_code_block)
+       {
+               printf("%s", end_code_block);
+       }
+}
+
+#define USAGE \
+"Usage: %s option file\n" \
+"Generates an opcode header or table from opcode definitions\n" \
+"and writes the result to standard output\n\n" \
+"Options:\n" \
+"  -H, --header\tgenerate a header file\n" \
+"  -T, --table\tgenerate a file with the opcode table\n" \
+"  --help\tdisplay this information\n" \
+"\nExactly one of header or table option must be supplied.\n" \
+"If file is - standard input is used.\n"
+
+int main(int argc, char *argv[])
+{
+       if(genops_parseargs(argc, argv))
+       {
+               fprintf(stderr, USAGE, argv[0]);
+               return 1;
+       }
+       genops_filename = argv[argc - 1];
+       genops_linenum = 1;
+       yyrestart(genops_file);
+       if(yyparse())
+       {
+               if(genops_file_needs_close)
+               {
+                       fclose(genops_file);
+               }
+               return 1;
+       }
+       if(genops_file_needs_close)
+       {
+               fclose(genops_file);
+       }
+       switch(genops_task)
+       {
+               case TASK_GEN_HEADER:
+               {
+                       genops_output_defs(genops_filename);
+               }
+               break;
+
+               case TASK_GEN_TABLE:
+               {
+                       genops_output_opcode_table(genops_filename);
+               }
+               break;
+       }
+       return 0;
+}
diff --git a/tools/gen-ops-scanner.l b/tools/gen-ops-scanner.l
new file mode 100644
index 0000000..25af607
--- /dev/null
+++ b/tools/gen-ops-scanner.l
@@ -0,0 +1,336 @@
+%{
+/*
+ * gen-ops-scanner.l - Lex input file for the "gen-ops" scanner.
+ *
+ * Copyright (C) 2010  Southern Storm Software, Pty Ltd.
+ *
+ * This file is part of the libjit library.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "gen-ops-parser.h"
+#include <config.h>
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#elif defined(HAVE_STRINGS_H)
+# include <strings.h>
+#endif
+
+#ifndef HAVE_UNISTD_H
+# define YY_NO_UNISTD_H
+#endif
+
+extern YYSTYPE yylval;
+
+/*
+ * Current file and line number.
+ */
+char *genops_filename = "";
+long genops_linenum = 1;
+
+/*
+ * Return a token code from the lexical analyser.
+ */
+#define        RETURNTOK(x)            return (x)
+
+/*
+ * Forward declarations.
+ */
+static void genops_skip_comment(void);
+static char *genops_read_code_block(void);
+static char *genops_read_header_block(void);
+static char *genops_read_literal(void);
+
+/*
+ * Duplicate a string.
+ */
+static char *genops_strdup(const char *str)
+{
+       char *new_str;
+       if(!str)
+       {
+               return 0;
+       }
+       new_str = (char *)malloc(strlen(str) + 1);
+       if(!new_str)
+       {
+               return 0;
+       }
+       strcpy(new_str, str);
+       return new_str;
+}
+
+%}
+
+%option outfile="lex.yy.c"
+%option noyywrap
+%option nounput
+
+DIGIT                  [0-9]
+IDALPHA                        [a-zA-Z_]
+WHITE                  [ \t\v\r\f]
+
+%%
+
+"empty"                        { RETURNTOK(K_EMPTY); }
+"int"                  { RETURNTOK(K_INT); }
+"long"                 { RETURNTOK(K_LONG); }
+"ptr"                  { RETURNTOK(K_PTR); }
+"float32"              { RETURNTOK(K_FLOAT32); }
+"float64"              { RETURNTOK(K_FLOAT64); }
+"nfloat"               { RETURNTOK(K_NFLOAT); }
+"any"                  { RETURNTOK(K_ANY); }
+"neg"                  { RETURNTOK(K_NEG); }
+"<<"                   { RETURNTOK(K_SHL); }
+">>"                   { RETURNTOK(K_SHR); }
+"shr_un"               { RETURNTOK(K_SHR_UN); }
+"=="                   { RETURNTOK(K_EQ); }
+"!="                   { RETURNTOK(K_NE); }
+"<="                   { RETURNTOK(K_LE); }
+">="                   { RETURNTOK(K_GE); }
+"address_of"           { RETURNTOK(K_ADDRESS_OF); }
+"address_of_label"     { RETURNTOK(K_ADDRESS_OF_LABEL); }
+"branch"               { RETURNTOK(K_BRANCH); }
+"call"                 { RETURNTOK(K_CALL); }
+"call_external"                { RETURNTOK(K_CALL_EXTERNAL); }
+"jump_table"           { RETURNTOK(K_JUMP_TABLE); }
+"op_def"               { RETURNTOK(K_OP_DEF); }
+"op_type"              { RETURNTOK(K_OP_TYPE); }
+"op_values"            { RETURNTOK(K_OP_VALUES); }
+"opcodes"              { RETURNTOK(K_OPCODES); }
+"reg"                  { RETURNTOK(K_REG); }
+
+"!"?{IDALPHA}({DIGIT}|{IDALPHA})*      {
+                       yylval.name = genops_strdup(yytext);
+                       if(!(yylval.name))
+                       {
+                               exit(1);
+                       }
+                       RETURNTOK(IDENTIFIER);
+               }
+
+{WHITE}+               ;
+
+\n                     { ++genops_linenum; }
+
+\"                     { yylval.name = genops_read_literal();
+                         RETURNTOK(LITERAL); }
+
+"%{"                   { yylval.name = genops_read_code_block();
+                         RETURNTOK(CODE_BLOCK); }
+
+"%["                   { yylval.name = genops_read_header_block();
+                         RETURNTOK(HEADER_BLOCK); }
+
+"/*"                   { genops_skip_comment(); }
+
+.                      { RETURNTOK(((int)(yytext[0])) & 0xFF); }
+
+%%
+
+/*
+ * Skip a comment in the input stream.
+ */
+static void genops_skip_comment(void)
+{
+       int ch;
+       for(;;)
+       {
+               ch = input();
+               if(ch == EOF)
+               {
+                       break;
+               }
+               else if(ch == '*')
+               {
+                       ch = input();
+                       while(ch == '*')
+                       {
+                               ch = input();
+                       }
+                       if(ch == EOF || ch == '/')
+                       {
+                               break;
+                       }
+                       else if(ch == '\n')
+                       {
+                               ++genops_linenum;
+                       }
+               }
+               else if(ch == '\n')
+               {
+                       ++genops_linenum;
+               }
+       }
+}
+
+/*
+ * Add a character to a reallocatable buffer.
+ */
+#define        ADD_CH(c)       \
+               do { \
+                       if((buflen + 1) >= bufmax) \
+                       { \
+                               buf = (char *)realloc(buf, bufmax + 64); \
+                               if(!buf) \
+                               { \
+                                       exit(1); \
+                               } \
+                               bufmax += 64; \
+                       } \
+                       buf[buflen++] = (char)c; \
+                       buf[buflen] = (char)'\0'; \
+               } while (0)
+
+/*
+ * Read a literal code block from the input stream.
+ */
+static char *genops_read_code_block(void)
+{
+       char *buf = 0;
+       int buflen = 0;
+       int bufmax = 0;
+       int ch;
+
+       ch = input();
+       for(;;)
+       {
+               if(ch == EOF)
+               {
+                       fprintf(stderr, "Unexpected EOF in code block\n");
+                       exit(1);
+               }
+               if(ch == '\n')
+               {
+                       ADD_CH(ch);
+                       ++genops_linenum;
+               }
+               else if(ch == '%')
+               {
+                       ch = input();
+                       if(ch == '}')
+                       {
+                               break;
+                       }
+                       ADD_CH('%');
+                       continue;
+               }
+               else
+               {
+                       ADD_CH(ch);
+               }
+               ch = input();
+       }
+       return buf;
+}
+
+/*
+ * Read a literal header block from the input stream.
+ */
+static char *genops_read_header_block(void)
+{
+       char *buf = 0;
+       int buflen = 0;
+       int bufmax = 0;
+       int ch;
+
+       ch = input();
+       for(;;)
+       {
+               if(ch == EOF)
+               {
+                       fprintf(stderr, "Unexpected EOF in code block\n");
+                       exit(1);
+               }
+               if(ch == '\n')
+               {
+                       ADD_CH(ch);
+                       ++genops_linenum;
+               }
+               else if(ch == '%')
+               {
+                       ch = input();
+                       if(ch == ']')
+                       {
+                               break;
+                       }
+                       ADD_CH('%');
+                       continue;
+               }
+               else
+               {
+                       ADD_CH(ch);
+               }
+               ch = input();
+       }
+       return buf;
+}
+
+/*
+ * Read a literal string from the input stream.
+ */
+static char *genops_read_literal()
+{
+       char *buf = 0;
+       int buflen = 0;
+       int bufmax = 0;
+       int escape = 0;
+       int ch;
+       for(;;)
+       {
+               ch = input();
+               if(ch == EOF)
+               {
+                       fprintf(stderr, "Unexpected EOF in string literal\n");
+                       exit(1);
+               }
+               if(ch == '\n')
+               {
+                       fprintf(stderr, "Unexpected newline in string 
literal\n");
+                       exit(1);
+               }
+               if(escape)
+               {
+                       escape = 0;
+                       if(ch == 'n')
+                       {
+                               ch = '\n';
+                       }
+                       else if(ch == 't')
+                       {
+                               ch = '\t';
+                       }
+               }
+               else
+               {
+                       if(ch == '\\')
+                       {
+                               escape = 1;
+                               continue;
+                       }
+                       if(ch == '"')
+                       {
+                               break;
+                       }
+               }
+               ADD_CH(ch);
+       }
+       return buf;
+}

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                        |   48 +
 Makefile.am                                      |    2 +-
 config/Makefile.am                               |    1 +
 config/jit-interp-opcodes.ops                    |  225 +++++
 config/jit-opcodes.ops                           |  630 ++++++++++++
 configure.ac                                     |    1 +
 include/jit/Makefile.am                          |    7 +-
 include/jit/jit-opcode.h                         |  610 ------------
 jit/Makefile.am                                  |   16 +-
 jit/jit-dump.c                                   |    2 -
 jit/jit-interp.c                                 |  198 ++--
 jit/jit-interp.h                                 |  155 +---
 jit/jit-opcode.c                                 |  680 -------------
 jit/jit-rules-interp.c                           |   50 +-
 jit/mklabel.sh                                   |   12 +-
 tools/.gitignore                                 |    5 +
 tools/Makefile.am                                |    6 +-
 tools/gen-ops-parser.y                           | 1119 ++++++++++++++++++++++
 tools/{gen-rules-scanner.l => gen-ops-scanner.l} |  164 ++--
 19 files changed, 2288 insertions(+), 1643 deletions(-)
 create mode 100644 config/Makefile.am
 create mode 100644 config/jit-interp-opcodes.ops
 create mode 100644 config/jit-opcodes.ops
 delete mode 100644 include/jit/jit-opcode.h
 delete mode 100644 jit/jit-opcode.c
 create mode 100644 tools/gen-ops-parser.y
 copy tools/{gen-rules-scanner.l => gen-ops-scanner.l} (58%)


hooks/post-receive
-- 
DotGNU Portable.NET Just In Time compiler (libjit)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]