Index: /trunk/src/recompiler_new/Sun/config-host.h
===================================================================
--- /trunk/src/recompiler_new/Sun/config-host.h	(revision 13730)
+++ /trunk/src/recompiler_new/Sun/config-host.h	(revision 13731)
@@ -21,5 +21,5 @@
 
 
-#if defined(RT_ARCH_AMD64) || defined(HOST_X86_64) /* The latter, for dyngen when cross compiling (windows, l4, etc). */
+#if defined(RT_ARCH_AMD64)
 # define HOST_X86_64 1
 # define HOST_LONG_BITS 64
Index: /trunk/src/recompiler_new/VBoxRecompiler.c
===================================================================
--- /trunk/src/recompiler_new/VBoxRecompiler.c	(revision 13730)
+++ /trunk/src/recompiler_new/VBoxRecompiler.c	(revision 13731)
@@ -3080,4 +3080,7 @@
     VBOX_CHECK_ADDR(SrcGCPhys);
     PGMPhysRead(cpu_single_env->pVM, SrcGCPhys, pvDst, cb);
+#ifdef DEBUG_PHYS
+    LogRel(("read(%d): %p\n", cb, SrcGCPhys));
+#endif
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
 }
@@ -3094,6 +3097,9 @@
     STAM_PROFILE_ADV_START(&gStatMemRead, a);
     VBOX_CHECK_ADDR(SrcGCPhys);
-    val = PGMR3PhysReadU8(cpu_single_env->pVM, SrcGCPhys);
+    val = PGMR3PhysReadU8(cpu_single_env->pVM, SrcGCPhys);    
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("readu8: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3112,4 +3118,7 @@
     val = PGMR3PhysReadU8(cpu_single_env->pVM, SrcGCPhys);
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("reads8: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3128,4 +3137,7 @@
     val = PGMR3PhysReadU16(cpu_single_env->pVM, SrcGCPhys);
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("readu16: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3144,4 +3156,7 @@
     val = PGMR3PhysReadU16(cpu_single_env->pVM, SrcGCPhys);
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("reads16: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3160,4 +3175,7 @@
     val = PGMR3PhysReadU32(cpu_single_env->pVM, SrcGCPhys);
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("readu32: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3176,4 +3194,7 @@
     val = PGMR3PhysReadU32(cpu_single_env->pVM, SrcGCPhys);
     STAM_PROFILE_ADV_STOP(&gStatMemRead, a);
+#ifdef DEBUG_PHYS
+    LogRel(("reads32: %x <- %p\n", val, SrcGCPhys));
+#endif
     return val;
 }
@@ -3224,4 +3245,5 @@
     PGMPhysWrite(cpu_single_env->pVM, DstGCPhys, pvSrc, cb);
     STAM_PROFILE_ADV_STOP(&gStatMemWrite, a);
+    LogRel(("write(%d): %p\n", cb, DstGCPhys));
 }
 
@@ -3239,4 +3261,5 @@
     PGMR3PhysWriteU8(cpu_single_env->pVM, DstGCPhys, val);
     STAM_PROFILE_ADV_STOP(&gStatMemWrite, a);
+    LogRel(("writeu8: %x -> %p\n", val, DstGCPhys));
 }
 
@@ -3254,4 +3277,5 @@
     PGMR3PhysWriteU16(cpu_single_env->pVM, DstGCPhys, val);
     STAM_PROFILE_ADV_STOP(&gStatMemWrite, a);
+    LogRel(("writeu16: %x -> %p\n", val, DstGCPhys));
 }
 
@@ -3269,4 +3293,5 @@
     PGMR3PhysWriteU32(cpu_single_env->pVM, DstGCPhys, val);
     STAM_PROFILE_ADV_STOP(&gStatMemWrite, a);
+    LogRel(("writeu32: %x -> %p\n", val, DstGCPhys));
 }
 
Index: /trunk/src/recompiler_new/dyngen-exec.h
===================================================================
--- /trunk/src/recompiler_new/dyngen-exec.h	(revision 13730)
+++ /trunk/src/recompiler_new/dyngen-exec.h	(revision 13731)
@@ -277,41 +277,4 @@
 #endif
 
-#ifdef __i386__
-#define EXIT_TB() asm volatile ("ret")
-#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __x86_64__
-#define EXIT_TB() asm volatile ("ret")
-#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __powerpc__
-#define EXIT_TB() asm volatile ("blr")
-#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __s390__
-#define EXIT_TB() asm volatile ("br %r14")
-#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __alpha__
-#define EXIT_TB() asm volatile ("ret")
-#endif
-#ifdef __ia64__
-#define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;")
-#define GOTO_LABEL_PARAM(n) asm volatile ("br.sptk.many " \
-					  ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __sparc__
-#define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0; nop")
-#define GOTO_LABEL_PARAM(n) asm volatile ("ba " ASM_NAME(__op_gen_label) #n ";nop")
-#endif
-#ifdef __arm__
-#define EXIT_TB() asm volatile ("b exec_loop")
-#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
-#endif
-#ifdef __mc68000
-#define EXIT_TB() asm volatile ("rts")
-#endif
-
-
 #ifdef VBOX
 #define GETPC() ASMReturnAddress() 
Index: unk/src/recompiler_new/dyngen.c
===================================================================
--- /trunk/src/recompiler_new/dyngen.c	(revision 13730)
+++ 	(revision )
@@ -1,3214 +1,0 @@
-/*
- *  Generic Dynamic compiler generator
- * 
- *  Copyright (c) 2003 Fabrice Bellard
- *
- *  The COFF object format support was extracted from Kazu's QEMU port
- *  to Win32.
- *
- *  Mach-O Support by Matt Reda and Pierre d'Herbemont
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program 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 General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * Sun GPL Disclaimer: For the avoidance of doubt, except that if any license choice
- * other than GPL or LGPL is available it will apply instead, Sun elects to use only
- * the General Public License version 2 (GPLv2) at this time for any software where
- * a choice of GPL license versions is made available with the language indicating
- * that GPLv2 or any later version may be used, or where a choice of which version
- * of the GPL is applied is otherwise unspecified.
- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "config-host.h"
-
-/* NOTE: we test CONFIG_WIN32 instead of _WIN32 to enabled cross
-   compilation */
-#if defined(CONFIG_WIN32)
-#define CONFIG_FORMAT_COFF
-#elif defined(CONFIG_DARWIN)
-#define CONFIG_FORMAT_MACH
-#elif defined(CONFIG_OS2)
-#define CONFIG_FORMAT_AOUT
-#else
-#define CONFIG_FORMAT_ELF
-#endif
-
-#ifdef CONFIG_FORMAT_ELF
-
-/* elf format definitions. We use these macros to test the CPU to
-   allow cross compilation (this tool must be ran on the build
-   platform) */
-#if defined(HOST_I386)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_386
-#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
-#undef ELF_USES_RELOCA
-
-#elif defined(HOST_X86_64)
-
-#define ELF_CLASS	ELFCLASS64
-#define ELF_ARCH	EM_X86_64
-#define elf_check_arch(x) ((x) == EM_X86_64)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_PPC)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_PPC
-#define elf_check_arch(x) ((x) == EM_PPC)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_S390)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_S390
-#define elf_check_arch(x) ((x) == EM_S390)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_ALPHA)
-
-#define ELF_CLASS	ELFCLASS64
-#define ELF_ARCH	EM_ALPHA
-#define elf_check_arch(x) ((x) == EM_ALPHA)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_IA64)
-
-#define ELF_CLASS	ELFCLASS64
-#define ELF_ARCH	EM_IA_64
-#define elf_check_arch(x) ((x) == EM_IA_64)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_SPARC)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_SPARC
-#define elf_check_arch(x) ((x) == EM_SPARC || (x) == EM_SPARC32PLUS)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_SPARC64)
-
-#define ELF_CLASS	ELFCLASS64
-#define ELF_ARCH	EM_SPARCV9
-#define elf_check_arch(x) ((x) == EM_SPARCV9)
-#define ELF_USES_RELOCA
-
-#elif defined(HOST_ARM)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_ARM
-#define elf_check_arch(x) ((x) == EM_ARM)
-#define ELF_USES_RELOC
-
-#elif defined(HOST_M68K)
-
-#define ELF_CLASS	ELFCLASS32
-#define ELF_ARCH	EM_68K
-#define elf_check_arch(x) ((x) == EM_68K)
-#define ELF_USES_RELOCA
-
-#else
-#error unsupported CPU - please update the code
-#endif
-
-#include "elf.h"
-
-#if ELF_CLASS == ELFCLASS32
-typedef int32_t host_long;
-typedef uint32_t host_ulong;
-#define swabls(x) swab32s(x)
-#define swablss(x) swab32ss(x)
-#else
-typedef int64_t host_long;
-typedef uint64_t host_ulong;
-#define swabls(x) swab64s(x)
-#define swablss(x) swab64ss(x)
-#endif
-
-#ifdef ELF_USES_RELOCA
-#define SHT_RELOC SHT_RELA
-#else
-#define SHT_RELOC SHT_REL
-#endif
-
-#define EXE_RELOC ELF_RELOC
-#define EXE_SYM ElfW(Sym)
-
-#endif /* CONFIG_FORMAT_ELF */
-
-#ifdef CONFIG_FORMAT_COFF
-
-#include "a.out.h"
-
-typedef int32_t host_long;
-typedef uint32_t host_ulong;
-
-#define FILENAMELEN 256
-
-typedef struct coff_sym {
-    struct external_syment *st_syment;
-    char st_name[FILENAMELEN];
-    uint32_t st_value;
-    int  st_size;
-    uint8_t st_type;
-    uint8_t st_shndx;
-} coff_Sym;
-
-typedef struct coff_rel {
-    struct external_reloc *r_reloc;
-    int  r_offset;
-    uint8_t r_type;
-} coff_Rel;
-
-#define EXE_RELOC struct coff_rel
-#define EXE_SYM struct coff_sym
-
-#endif /* CONFIG_FORMAT_COFF */
-
-#ifdef CONFIG_FORMAT_MACH
-
-#include <mach-o/loader.h>
-#include <mach-o/nlist.h>
-#include <mach-o/reloc.h>
-#if !defined(HOST_I386)
-#include <mach-o/ppc/reloc.h>
-#endif 
-
-# define check_mach_header(x) (x.magic == MH_MAGIC)
-typedef int32_t host_long;
-typedef uint32_t host_ulong;
-
-struct nlist_extended
-{
-   union {
-   char *n_name; 
-   long  n_strx; 
-   } n_un;
-   unsigned char n_type; 
-   unsigned char n_sect; 
-   short st_desc;
-   unsigned long st_value;
-   unsigned long st_size;
-};
-
-#define EXE_RELOC struct relocation_info
-#define EXE_SYM struct nlist_extended
-#if defined(HOST_I386)
-# define r_offset r_address
-#endif 
-
-#endif /* CONFIG_FORMAT_MACH */
-
-#ifdef CONFIG_FORMAT_AOUT
-
-#include "a_out.h"
-
-typedef int32_t host_long;
-typedef uint32_t host_ulong;
-
-struct nlist_extended
-{
-    union {
-      char *n_name;
-      struct nlist *n_next;
-      long n_strx;
-    } n_un;
-    unsigned char n_type;
-    char n_other;
-    short n_desc;
-    unsigned long st_value; /* n_value -> st_value */
-    unsigned long st_size;  /* added */
-};
-
-#define EXE_RELOC struct relocation_info
-#define EXE_SYM struct nlist_extended
-#define r_offset r_address
-
-#endif /* CONFIG_FORMAT_AOUT */
-
-#include "bswap.h"
-
-enum {
-    OUT_GEN_OP,
-    OUT_CODE,
-    OUT_INDEX_OP
-};
-
-/* all dynamically generated functions begin with this code */
-#define OP_PREFIX "op_"
-
-int do_swap;
-
-void __attribute__((noreturn)) __attribute__((format (printf, 1, 2))) error(const char *fmt, ...)
-{
-    va_list ap;
-    va_start(ap, fmt);
-    fprintf(stderr, "dyngen: ");
-    vfprintf(stderr, fmt, ap);
-    fprintf(stderr, "\n");
-    va_end(ap);
-    exit(1);
-}
-
-void *load_data(int fd, long offset, unsigned int size)
-{
-    char *data;
-
-    data = malloc(size);
-    if (!data)
-        return NULL;
-    lseek(fd, offset, SEEK_SET);
-    if (read(fd, data, size) != size) {
-        free(data);
-        return NULL;
-    }
-    return data;
-}
-
-int strstart(const char *str, const char *val, const char **ptr)
-{
-    const char *p, *q;
-    p = str;
-    q = val;
-    while (*q != '\0') {
-        if (*p != *q)
-            return 0;
-        p++;
-        q++;
-    }
-    if (ptr)
-        *ptr = p;
-    return 1;
-}
-
-void pstrcpy(char *buf, int buf_size, const char *str)
-{
-    int c;
-    char *q = buf;
-
-    if (buf_size <= 0)
-        return;
-
-    for(;;) {
-        c = *str++;
-        if (c == 0 || q >= buf + buf_size - 1)
-            break;
-        *q++ = c;
-    }
-    *q = '\0';
-}
-
-void swab16s(uint16_t *p)
-{
-    *p = bswap16(*p);
-}
-
-void swab32s(uint32_t *p)
-{
-    *p = bswap32(*p);
-}
-
-void swab32ss(int32_t *p)
-{
-    *p = bswap32(*p);
-}
-
-void swab64s(uint64_t *p)
-{
-    *p = bswap64(*p);
-}
-
-void swab64ss(int64_t *p)
-{
-    *p = bswap64(*p);
-}
-
-uint16_t get16(uint16_t *p)
-{
-    uint16_t val;
-    val = *p;
-    if (do_swap)
-        val = bswap16(val);
-    return val;
-}
-
-uint32_t get32(uint32_t *p)
-{
-    uint32_t val;
-    val = *p;
-    if (do_swap)
-        val = bswap32(val);
-    return val;
-}
-
-void put16(uint16_t *p, uint16_t val)
-{
-    if (do_swap)
-        val = bswap16(val);
-    *p = val;
-}
-
-void put32(uint32_t *p, uint32_t val)
-{
-    if (do_swap)
-        val = bswap32(val);
-    *p = val;
-}
-
-/* executable information */
-EXE_SYM *symtab;
-int nb_syms;
-int text_shndx;
-uint8_t *text;
-EXE_RELOC *relocs;
-int nb_relocs;
-
-#ifdef CONFIG_FORMAT_ELF
-
-/* ELF file info */
-struct elf_shdr *shdr;
-uint8_t **sdata;
-struct elfhdr ehdr;
-char *strtab;
-
-int elf_must_swap(struct elfhdr *h)
-{
-  union {
-      uint32_t i;
-      uint8_t b[4];
-  } swaptest;
-
-  swaptest.i = 1;
-  return (h->e_ident[EI_DATA] == ELFDATA2MSB) != 
-      (swaptest.b[0] == 0);
-}
-  
-void elf_swap_ehdr(struct elfhdr *h)
-{
-    swab16s(&h->e_type);			/* Object file type */
-    swab16s(&h->	e_machine);		/* Architecture */
-    swab32s(&h->	e_version);		/* Object file version */
-    swabls(&h->	e_entry);		/* Entry point virtual address */
-    swabls(&h->	e_phoff);		/* Program header table file offset */
-    swabls(&h->	e_shoff);		/* Section header table file offset */
-    swab32s(&h->	e_flags);		/* Processor-specific flags */
-    swab16s(&h->	e_ehsize);		/* ELF header size in bytes */
-    swab16s(&h->	e_phentsize);		/* Program header table entry size */
-    swab16s(&h->	e_phnum);		/* Program header table entry count */
-    swab16s(&h->	e_shentsize);		/* Section header table entry size */
-    swab16s(&h->	e_shnum);		/* Section header table entry count */
-    swab16s(&h->	e_shstrndx);		/* Section header string table index */
-}
-
-void elf_swap_shdr(struct elf_shdr *h)
-{
-  swab32s(&h->	sh_name);		/* Section name (string tbl index) */
-  swab32s(&h->	sh_type);		/* Section type */
-  swabls(&h->	sh_flags);		/* Section flags */
-  swabls(&h->	sh_addr);		/* Section virtual addr at execution */
-  swabls(&h->	sh_offset);		/* Section file offset */
-  swabls(&h->	sh_size);		/* Section size in bytes */
-  swab32s(&h->	sh_link);		/* Link to another section */
-  swab32s(&h->	sh_info);		/* Additional section information */
-  swabls(&h->	sh_addralign);		/* Section alignment */
-  swabls(&h->	sh_entsize);		/* Entry size if section holds table */
-}
-
-void elf_swap_phdr(struct elf_phdr *h)
-{
-    swab32s(&h->p_type);			/* Segment type */
-    swabls(&h->p_offset);		/* Segment file offset */
-    swabls(&h->p_vaddr);		/* Segment virtual address */
-    swabls(&h->p_paddr);		/* Segment physical address */
-    swabls(&h->p_filesz);		/* Segment size in file */
-    swabls(&h->p_memsz);		/* Segment size in memory */
-    swab32s(&h->p_flags);		/* Segment flags */
-    swabls(&h->p_align);		/* Segment alignment */
-}
-
-void elf_swap_rel(ELF_RELOC *rel)
-{
-    swabls(&rel->r_offset);
-    swabls(&rel->r_info);
-#ifdef ELF_USES_RELOCA
-    swablss(&rel->r_addend);
-#endif
-}
-
-struct elf_shdr *find_elf_section(struct elf_shdr *shdr, int shnum, const char *shstr, 
-                                  const char *name)
-{
-    int i;
-    const char *shname;
-    struct elf_shdr *sec;
-
-    for(i = 0; i < shnum; i++) {
-        sec = &shdr[i];
-        if (!sec->sh_name)
-            continue;
-        shname = shstr + sec->sh_name;
-        if (!strcmp(shname, name))
-            return sec;
-    }
-    return NULL;
-}
-
-int find_reloc(int sh_index)
-{
-    struct elf_shdr *sec;
-    int i;
-
-    for(i = 0; i < ehdr.e_shnum; i++) {
-        sec = &shdr[i];
-        if (sec->sh_type == SHT_RELOC && sec->sh_info == sh_index) 
-            return i;
-    }
-    return 0;
-}
-
-static host_ulong get_rel_offset(EXE_RELOC *rel)
-{
-    return rel->r_offset;
-}
-
-static char *get_rel_sym_name(EXE_RELOC *rel)
-{
-    return strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-}
-
-static char *get_sym_name(EXE_SYM *sym)
-{
-    return strtab + sym->st_name;
-}
-
-/* load an elf object file */
-int load_object(const char *filename)
-{
-    int fd;
-    struct elf_shdr *sec, *symtab_sec, *strtab_sec, *text_sec;
-    int i, j;
-    ElfW(Sym) *sym;
-    char *shstr;
-    ELF_RELOC *rel;
-    
-    fd = open(filename, O_RDONLY
-#ifdef O_BINARY
-              | O_BINARY
-#endif 
-              );
-    if (fd < 0) 
-        error("can't open file '%s'", filename);
-    
-    /* Read ELF header.  */
-    if (read(fd, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
-        error("unable to read file header");
-
-    /* Check ELF identification.  */
-    if (ehdr.e_ident[EI_MAG0] != ELFMAG0
-     || ehdr.e_ident[EI_MAG1] != ELFMAG1
-     || ehdr.e_ident[EI_MAG2] != ELFMAG2
-     || ehdr.e_ident[EI_MAG3] != ELFMAG3
-     || ehdr.e_ident[EI_VERSION] != EV_CURRENT) {
-        error("bad ELF header");
-    }
-
-    do_swap = elf_must_swap(&ehdr);
-    if (do_swap)
-        elf_swap_ehdr(&ehdr);
-    if (ehdr.e_ident[EI_CLASS] != ELF_CLASS)
-        error("Unsupported ELF class (%#x)", ehdr.e_ident[EI_CLASS]);
-    if (ehdr.e_type != ET_REL)
-        error("ELF object file expected");
-    if (ehdr.e_version != EV_CURRENT)
-        error("Invalid ELF version");
-    if (!elf_check_arch(ehdr.e_machine))
-        error("Unsupported CPU (e_machine=%d)", ehdr.e_machine);
-
-    /* read section headers */
-    shdr = load_data(fd, ehdr.e_shoff, ehdr.e_shnum * sizeof(struct elf_shdr));
-    if (do_swap) {
-        for(i = 0; i < ehdr.e_shnum; i++) {
-            elf_swap_shdr(&shdr[i]);
-        }
-    }
-
-    /* read all section data */
-    sdata = malloc(sizeof(void *) * ehdr.e_shnum);
-    memset(sdata, 0, sizeof(void *) * ehdr.e_shnum);
-    
-    for(i = 0;i < ehdr.e_shnum; i++) {
-        sec = &shdr[i];
-        if (sec->sh_type != SHT_NOBITS)
-            sdata[i] = load_data(fd, sec->sh_offset, sec->sh_size);
-    }
-
-    sec = &shdr[ehdr.e_shstrndx];
-    shstr = (char *)sdata[ehdr.e_shstrndx];
-
-    /* swap relocations */
-    for(i = 0; i < ehdr.e_shnum; i++) {
-        sec = &shdr[i];
-        if (sec->sh_type == SHT_RELOC) {
-            nb_relocs = sec->sh_size / sec->sh_entsize;
-            if (do_swap) {
-                for(j = 0, rel = (ELF_RELOC *)sdata[i]; j < nb_relocs; j++, rel++)
-                    elf_swap_rel(rel);
-            }
-        }
-    }
-    /* text section */
-
-    text_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".text");
-    if (!text_sec)
-        error("could not find .text section");
-    text_shndx = text_sec - shdr;
-    text = sdata[text_shndx];
-
-    /* find text relocations, if any */
-    relocs = NULL;
-    nb_relocs = 0;
-    i = find_reloc(text_shndx);
-    if (i != 0) {
-        relocs = (ELF_RELOC *)sdata[i];
-        nb_relocs = shdr[i].sh_size / shdr[i].sh_entsize;
-    }
-
-    symtab_sec = find_elf_section(shdr, ehdr.e_shnum, shstr, ".symtab");
-    if (!symtab_sec)
-        error("could not find .symtab section");
-    strtab_sec = &shdr[symtab_sec->sh_link];
-
-    symtab = (ElfW(Sym) *)sdata[symtab_sec - shdr];
-    strtab = (char *)sdata[symtab_sec->sh_link];
-    
-    nb_syms = symtab_sec->sh_size / sizeof(ElfW(Sym));
-    if (do_swap) {
-        for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-            swab32s(&sym->st_name);
-            swabls(&sym->st_value);
-            swabls(&sym->st_size);
-            swab16s(&sym->st_shndx);
-        }
-    }
-    close(fd);
-    return 0;
-}
-
-#endif /* CONFIG_FORMAT_ELF */
-
-#ifdef CONFIG_FORMAT_COFF
-
-/* COFF file info */
-struct external_scnhdr *shdr;
-uint8_t **sdata;
-struct external_filehdr fhdr;
-struct external_syment *coff_symtab;
-char *strtab;
-int coff_text_shndx, coff_data_shndx;
-
-int data_shndx;
-
-#define STRTAB_SIZE 4
-
-#define DIR32   0x06
-#define DISP32  0x14
-
-#define T_FUNCTION  0x20
-#define C_EXTERNAL  2
-
-void sym_ent_name(struct external_syment *ext_sym, EXE_SYM *sym)
-{
-    char *q;
-    int c, i, len;
-    
-    if (ext_sym->e.e.e_zeroes != 0) {
-        q = sym->st_name;
-        for(i = 0; i < 8; i++) {
-            c = ext_sym->e.e_name[i];
-            if (c == '\0')
-                break;
-            *q++ = c;
-        }
-        *q = '\0';
-    } else {
-        pstrcpy(sym->st_name, sizeof(sym->st_name), strtab + ext_sym->e.e.e_offset);
-    }
-
-    /* now convert the name to a C name (suppress the leading '_') */
-    if (sym->st_name[0] == '_') {
-        len = strlen(sym->st_name);
-        memmove(sym->st_name, sym->st_name + 1, len - 1);
-        sym->st_name[len - 1] = '\0';
-    }
-}
-
-char *name_for_dotdata(struct coff_rel *rel)
-{
-	int i;
-	struct coff_sym *sym;
-	uint32_t text_data;
-
-	text_data = *(uint32_t *)(text + rel->r_offset);
-
-	for (i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-		if (sym->st_syment->e_scnum == data_shndx &&
-                    text_data >= sym->st_value &&
-                    text_data < sym->st_value + sym->st_size) {
-                    
-                    return sym->st_name;
-
-		}
-	}
-	return NULL;
-}
-
-static char *get_sym_name(EXE_SYM *sym)
-{
-    return sym->st_name;
-}
-
-static char *get_rel_sym_name(EXE_RELOC *rel)
-{
-    char *name;
-    name = get_sym_name(symtab + *(uint32_t *)(rel->r_reloc->r_symndx));
-    if (!strcmp(name, ".data"))
-        name = name_for_dotdata(rel);
-    if (name[0] == '.')
-        return NULL;
-    return name;
-}
-
-static host_ulong get_rel_offset(EXE_RELOC *rel)
-{
-    return rel->r_offset;
-}
-
-struct external_scnhdr *find_coff_section(struct external_scnhdr *shdr, int shnum, const char *name)
-{
-    int i;
-    const char *shname;
-    struct external_scnhdr *sec;
-
-    for(i = 0; i < shnum; i++) {
-        sec = &shdr[i];
-        if (!sec->s_name)
-            continue;
-        shname = sec->s_name;
-        if (!strcmp(shname, name))
-            return sec;
-    }
-    return NULL;
-}
-
-/* load a coff object file */
-int load_object(const char *filename)
-{
-    int fd;
-    struct external_scnhdr *sec, *text_sec, *data_sec;
-    int i;
-    struct external_syment *ext_sym;
-    struct external_reloc *coff_relocs;
-    struct external_reloc *ext_rel;
-    uint32_t *n_strtab;
-    EXE_SYM *sym;
-    EXE_RELOC *rel;
-	
-    fd = open(filename, O_RDONLY 
-#ifdef O_BINARY
-              | O_BINARY
-#endif
-              );
-    if (fd < 0) 
-        error("can't open file '%s'", filename);
-    
-    /* Read COFF header.  */
-    if (read(fd, &fhdr, sizeof (fhdr)) != sizeof (fhdr))
-        error("unable to read file header");
-
-    /* Check COFF identification.  */
-    if (fhdr.f_magic != I386MAGIC) {
-        error("bad COFF header");
-    }
-    do_swap = 0;
-
-    /* read section headers */
-    shdr = load_data(fd, sizeof(struct external_filehdr) + fhdr.f_opthdr, fhdr.f_nscns * sizeof(struct external_scnhdr));
-	
-    /* read all section data */
-    sdata = malloc(sizeof(void *) * fhdr.f_nscns);
-    memset(sdata, 0, sizeof(void *) * fhdr.f_nscns);
-    
-    const char *p;
-    for(i = 0;i < fhdr.f_nscns; i++) {
-        sec = &shdr[i];
-        if (!strstart(sec->s_name,  ".bss", &p))
-            sdata[i] = load_data(fd, sec->s_scnptr, sec->s_size);
-    }
-
-
-    /* text section */
-    text_sec = find_coff_section(shdr, fhdr.f_nscns, ".text");
-    if (!text_sec)
-        error("could not find .text section");
-    coff_text_shndx = text_sec - shdr;
-    text = sdata[coff_text_shndx];
-
-    /* data section */
-    data_sec = find_coff_section(shdr, fhdr.f_nscns, ".data");
-    if (!data_sec)
-        error("could not find .data section");
-    coff_data_shndx = data_sec - shdr;
-    
-    coff_symtab = load_data(fd, fhdr.f_symptr, fhdr.f_nsyms*SYMESZ);
-    for (i = 0, ext_sym = coff_symtab; i < nb_syms; i++, ext_sym++) {
-        for(i=0;i<8;i++)
-            printf(" %02x", ((uint8_t *)ext_sym->e.e_name)[i]);
-        printf("\n");
-    }
-
-
-    n_strtab = load_data(fd, (fhdr.f_symptr + fhdr.f_nsyms*SYMESZ), STRTAB_SIZE);
-    strtab = load_data(fd, (fhdr.f_symptr + fhdr.f_nsyms*SYMESZ), *n_strtab); 
-    
-    nb_syms = fhdr.f_nsyms;
-
-    for (i = 0, ext_sym = coff_symtab; i < nb_syms; i++, ext_sym++) {
-      if (strstart(ext_sym->e.e_name, ".text", NULL))
-		  text_shndx = ext_sym->e_scnum;
-	  if (strstart(ext_sym->e.e_name, ".data", NULL))
-		  data_shndx = ext_sym->e_scnum;
-    }
-
-	/* set coff symbol */
-	symtab = malloc(sizeof(struct coff_sym) * nb_syms);
-
-	int aux_size, j;
-	for (i = 0, ext_sym = coff_symtab, sym = symtab; i < nb_syms; i++, ext_sym++, sym++) {
-		memset(sym, 0, sizeof(*sym));
-		sym->st_syment = ext_sym;
-		sym_ent_name(ext_sym, sym);
-		sym->st_value = ext_sym->e_value;
-
-		aux_size = *(int8_t *)ext_sym->e_numaux;
-		if (ext_sym->e_scnum == text_shndx && ext_sym->e_type == T_FUNCTION) {
-			for (j = aux_size + 1; j < nb_syms - i; j++) {
-				if ((ext_sym + j)->e_scnum == text_shndx &&
-					(ext_sym + j)->e_type == T_FUNCTION ){
-					sym->st_size = (ext_sym + j)->e_value - ext_sym->e_value;
-					break;
-				} else if (j == nb_syms - i - 1) {
-					sec = &shdr[coff_text_shndx];
-					sym->st_size = sec->s_size - ext_sym->e_value;
-					break;
-				}
-			}
-		} else if (ext_sym->e_scnum == data_shndx && *(uint8_t *)ext_sym->e_sclass == C_EXTERNAL) {
-			for (j = aux_size + 1; j < nb_syms - i; j++) {
-				if ((ext_sym + j)->e_scnum == data_shndx) {
-					sym->st_size = (ext_sym + j)->e_value - ext_sym->e_value;
-					break;
-				} else if (j == nb_syms - i - 1) {
-					sec = &shdr[coff_data_shndx];
-					sym->st_size = sec->s_size - ext_sym->e_value;
-					break;
-				}
-			}
-		} else {
-			sym->st_size = 0;
-		}
-		
-		sym->st_type = ext_sym->e_type;
-		sym->st_shndx = ext_sym->e_scnum;
-	}
-
-		
-    /* find text relocations, if any */
-    sec = &shdr[coff_text_shndx];
-    coff_relocs = load_data(fd, sec->s_relptr, sec->s_nreloc*RELSZ);
-    nb_relocs = sec->s_nreloc;
-
-    /* set coff relocation */
-    relocs = malloc(sizeof(struct coff_rel) * nb_relocs);
-    for (i = 0, ext_rel = coff_relocs, rel = relocs; i < nb_relocs; 
-         i++, ext_rel++, rel++) {
-        memset(rel, 0, sizeof(*rel));
-        rel->r_reloc = ext_rel;
-        rel->r_offset = *(uint32_t *)ext_rel->r_vaddr;
-        rel->r_type = *(uint16_t *)ext_rel->r_type;
-    }
-    return 0;
-}
-
-#endif /* CONFIG_FORMAT_COFF */
-
-#ifdef CONFIG_FORMAT_MACH
-
-/* File Header */
-struct mach_header 	mach_hdr;
-
-/* commands */
-struct segment_command 	*segment = 0;
-struct dysymtab_command *dysymtabcmd = 0;
-struct symtab_command 	*symtabcmd = 0;
-
-/* section */
-struct section 	*section_hdr;
-struct section *text_sec_hdr;
-uint8_t 	**sdata;
-
-/* relocs */
-struct relocation_info *relocs;
-	
-/* symbols */
-EXE_SYM			*symtab;
-struct nlist 	*symtab_std;
-char			*strtab;
-
-/* indirect symbols */
-uint32_t 	*tocdylib;
-
-/* Utility functions */
-
-static inline char *find_str_by_index(int index)
-{
-    return strtab+index;
-}
-
-/* Used by dyngen common code */
-static char *get_sym_name(EXE_SYM *sym)
-{
-	char *name = find_str_by_index(sym->n_un.n_strx);
-	
-	if ( sym->n_type & N_STAB ) /* Debug symbols are ignored */
-		return "debug";
-			
-	if(!name)
-		return name;
-	if(name[0]=='_')
-		return name + 1;
-	else
-		return name;
-}
-
-/* find a section index given its segname, sectname */
-static int find_mach_sec_index(struct section *section_hdr, int shnum, const char *segname, 
-                                  const char *sectname)
-{
-    int i;
-    struct section *sec = section_hdr;
-
-    for(i = 0; i < shnum; i++, sec++) {
-        if (!sec->segname || !sec->sectname)
-            continue;
-        if (!strcmp(sec->sectname, sectname) && !strcmp(sec->segname, segname))
-            return i;
-    }
-    return -1;
-}
-
-/* find a section header given its segname, sectname */
-struct section *find_mach_sec_hdr(struct section *section_hdr, int shnum, const char *segname, 
-                                  const char *sectname)
-{
-    int index = find_mach_sec_index(section_hdr, shnum, segname, sectname);
-	if(index == -1)
-		return NULL;
-	return section_hdr+index;
-}
-
-
-#if defined(HOST_PPC)
-static inline void fetch_next_pair_value(struct relocation_info * rel, unsigned int *value)
-{
-    struct scattered_relocation_info * scarel;
-	
-    if(R_SCATTERED & rel->r_address) {
-        scarel = (struct scattered_relocation_info*)rel;
-        if(scarel->r_type != PPC_RELOC_PAIR)
-            error("fetch_next_pair_value: looking for a pair which was not found (1)");
-        *value = scarel->r_value;
-    } else {
-		if(rel->r_type != PPC_RELOC_PAIR)
-			error("fetch_next_pair_value: looking for a pair which was not found (2)");
-		*value = rel->r_address;
-	}
-}
-#endif
-
-/* find a sym name given its value, in a section number */
-static const char * find_sym_with_value_and_sec_number( int value, int sectnum, int * offset )
-{
-	int i, ret = -1;
-	
-	for( i = 0 ; i < nb_syms; i++ )
-	{
-	    if( !(symtab[i].n_type & N_STAB) && (symtab[i].n_type & N_SECT) &&
-			 (symtab[i].n_sect ==  sectnum) && (symtab[i].st_value <= value) )
-		{
-			if( (ret<0) || (symtab[i].st_value >= symtab[ret].st_value) )
-				ret = i;
-		}
-	}
-	if( ret < 0 ) {
-		*offset = 0;
-		return 0;
-	} else {
-		*offset = value - symtab[ret].st_value;
-		return get_sym_name(&symtab[ret]);
-	}
-}
-
-/* 
- *  Find symbol name given a (virtual) address, and a section which is of type 
- *  S_NON_LAZY_SYMBOL_POINTERS or S_LAZY_SYMBOL_POINTERS or S_SYMBOL_STUBS
- */
-static const char * find_reloc_name_in_sec_ptr(int address, struct section * sec_hdr)
-{
-    unsigned int tocindex, symindex, size;
-    const char *name = 0;
-    
-    /* Sanity check */
-    if(!( address >= sec_hdr->addr && address < (sec_hdr->addr + sec_hdr->size) ) )
-        return (char*)0;
-		
-	if( sec_hdr->flags & S_SYMBOL_STUBS ){
-		size = sec_hdr->reserved2;
-		if(size == 0)
-		    error("size = 0");
-		
-	}
-	else if( sec_hdr->flags & S_LAZY_SYMBOL_POINTERS ||
-	            sec_hdr->flags & S_NON_LAZY_SYMBOL_POINTERS)
-		size = sizeof(unsigned long);
-	else
-		return 0;
-		
-    /* Compute our index in toc */
-	tocindex = (address - sec_hdr->addr)/size;
-	symindex = tocdylib[sec_hdr->reserved1 + tocindex];
-	
-	name = get_sym_name(&symtab[symindex]);
-
-    return name;
-}
-
-static const char * find_reloc_name_given_its_address(int address)
-{
-    unsigned int i;
-    for(i = 0; i < segment->nsects ; i++)
-    {
-        const char * name = find_reloc_name_in_sec_ptr(address, &section_hdr[i]);
-        if((long)name != -1)
-            return name;
-    }
-    return 0;
-}
-
-static const char * get_reloc_name(EXE_RELOC * rel, int * sslide)
-{
-	char * name = 0;
-	struct scattered_relocation_info * sca_rel = (struct scattered_relocation_info*)rel;
-	int sectnum = rel->r_symbolnum;
-	int sectoffset;
-	int other_half=0;
-	
-	/* init the slide value */
-	*sslide = 0;
-	
-	if(R_SCATTERED & rel->r_address)
-		return (char *)find_reloc_name_given_its_address(sca_rel->r_value);
-
-	if(rel->r_extern)
-	{
-		/* ignore debug sym */
-		if ( symtab[rel->r_symbolnum].n_type & N_STAB ) 
-			return 0;
-		return get_sym_name(&symtab[rel->r_symbolnum]);
-	}
-
-#if defined(HOST_I386)
-	/* ignore internal pc relative fixups where both ends are in the text section. */
-	if (rel->r_pcrel && !rel->r_extern && rel->r_symbolnum == 1 /* ASSUMES text */)
-		return NULL;
-#endif 
-
-	/* Intruction contains an offset to the symbols pointed to, in the rel->r_symbolnum section */
-	sectoffset = *(uint32_t *)(text + rel->r_address) & 0xffff;
-			
-	if(sectnum==0xffffff)
-		return 0;
-
-	/* Sanity Check */
-	if(sectnum > segment->nsects)
-		error("sectnum > segment->nsects");
-
-#if defined(HOST_PPC)
-	switch(rel->r_type)
-	{
-		case PPC_RELOC_LO16: fetch_next_pair_value(rel+1, &other_half); sectoffset |= (other_half << 16);
-			break;
-		case PPC_RELOC_HI16: fetch_next_pair_value(rel+1, &other_half); sectoffset = (sectoffset << 16) | (uint16_t)(other_half & 0xffff);
-			break;
-		case PPC_RELOC_HA16: fetch_next_pair_value(rel+1, &other_half); sectoffset = (sectoffset << 16) + (int16_t)(other_half & 0xffff);
-			break;
-		case PPC_RELOC_BR24:
-			sectoffset = ( *(uint32_t *)(text + rel->r_address) & 0x03fffffc );
-			if (sectoffset & 0x02000000) sectoffset |= 0xfc000000;
-			break;
-		default:
-			error("switch(rel->type) not found");
-	}
-#elif defined(HOST_I386)
-	/* The intruction contains the addend. */
-	sectoffset = *(uint32_t *)(text + rel->r_address);
-#else
-#error unsupported mach-o host
-#endif 
-
-	if(rel->r_pcrel)
-		sectoffset += rel->r_address;
-			
-#if defined(HOST_PPC)
-	if (rel->r_type == PPC_RELOC_BR24)
-		name = (char *)find_reloc_name_in_sec_ptr((int)sectoffset, &section_hdr[sectnum-1]);
-#endif
-
-	/* search it in the full symbol list, if not found */
-	if(!name)
-		name = (char *)find_sym_with_value_and_sec_number(sectoffset, sectnum, sslide);
-	
-	return name;
-}
-
-#if defined(HOST_I386)
-static const char *get_rel_sym_name_and_addend(EXE_RELOC *rel, int *addend)
-{
-	const char *name = NULL;
-
-    if (R_SCATTERED & rel->r_address) {
-		unsigned int i;
-		struct scattered_relocation_info * sca_rel = (struct scattered_relocation_info*)rel;
-		if (sca_rel->r_length != 2 || rel->r_pcrel) {
-			error("Fully implement R_SCATTERED! r_address=%#x r_type=%#x r_length=%d r_pcrel=%d r_value=%#x\n", 
-				  (int)sca_rel->r_address, sca_rel->r_type, sca_rel->r_length, sca_rel->r_pcrel, sca_rel->r_value);
-		}
-
-		/* this seems to be the way to calc the addend. */
-		*addend = *(int32_t *)(text + sca_rel->r_address) - sca_rel->r_value;
-
-		/* todo: do we need to ignore internal relocations? */
-#if 0
-		if (sca_rel->r_pcrel ...)
-			return NULL;
-#endif
-
-		/* find_reloc_name_given_its_address doesn't do the right thing here, so 
-		   we locate the section and use find_sym_with_value_and_sec_number  */
-		for (i = 0; i < segment->nsects ; i++) {
-			if ((uintptr_t)sca_rel->r_value - section_hdr[i].addr < section_hdr[i].size) {
-				int off = 0;
-				name = find_sym_with_value_and_sec_number(sca_rel->r_value, i + 1, &off);
-				if (name) {
-					*addend += off;
-					 break;
-				}
-			}
-		}
-		if (!name)
-			error("Fully implement R_SCATTERED! r_address=%#x r_type=%#x r_length=%d r_pcrel=%d r_value=%#x\n", 
-				  (int)sca_rel->r_address, sca_rel->r_type, sca_rel->r_length, sca_rel->r_pcrel, sca_rel->r_value);
-	}
-	else 
-	{
-		/* ignore debug syms (paranoia). */
-		if (symtab[rel->r_symbolnum].n_type & N_STAB)
-			return NULL;
-
-		/* ignore internal pc relative fixups where both ends are in the text section. */
-		if (rel->r_pcrel && !rel->r_extern && rel->r_symbolnum == 1 /* ASSUMES text */)
-			return NULL;
-
-		/* get the addend, it is in the instruction stream. */
-		*addend = *(int32_t *)(text + rel->r_address);
-		if (rel->r_pcrel)
-			*addend += rel->r_address;
-
-		/* external fixups are easy. */
-		if (rel->r_extern)
-		{
-			if (rel->r_symbolnum >= nb_syms) 
-				error("rel->r_symbolnum (%d) >= nb_syms (%d)", rel->r_symbolnum, nb_syms);
-			name = get_sym_name(&symtab[rel->r_symbolnum]);
-		}
-		else
-		{
-			/* sanity checks. */
-			if (rel->r_symbolnum == 0xffffff)
-				return NULL;
-			if (rel->r_symbolnum > segment->nsects)
-				error("sectnum (%d) > segment->nsects (%d)", rel->r_symbolnum, segment->nsects);
-			if (rel->r_pcrel) 
-				error("internal pcrel fixups not implemented");
-
-			/* search for the symbol. */
-			name = find_sym_with_value_and_sec_number(*addend, rel->r_symbolnum, addend);
-		}
-	}
-    return name;
-}
-#endif /* HOST_I386 */
-
-/* Used by dyngen common code */
-static const char * get_rel_sym_name(EXE_RELOC * rel)
-{
-	int sslide;
-#if defined(HOST_I386)
-	return get_rel_sym_name_and_addend(rel, &sslide);
-#else
-	return get_reloc_name( rel, &sslide);
-#endif
-}
-
-/* Used by dyngen common code */
-static host_ulong get_rel_offset(EXE_RELOC *rel)
-{
-	struct scattered_relocation_info * sca_rel = (struct scattered_relocation_info*)rel;
-    if(R_SCATTERED & rel->r_address)
-		return sca_rel->r_address;
-	else
-		return rel->r_address;
-}
-
-/* load a mach-o object file */
-int load_object(const char *filename)
-{
-	int fd;
-	unsigned int offset_to_segment = 0;
-    unsigned int offset_to_dysymtab = 0;
-    unsigned int offset_to_symtab = 0;
-    struct load_command lc;
-    unsigned int i, j;
-	EXE_SYM *sym;
-	struct nlist *syment;
-    
-	fd = open(filename, O_RDONLY
-#ifdef O_BINARY
-                  | O_BINARY
-#endif
-                  );
-    if (fd < 0) 
-        error("can't open file '%s'", filename);
-		
-    /* Read Mach header.  */
-    if (read(fd, &mach_hdr, sizeof (mach_hdr)) != sizeof (mach_hdr))
-        error("unable to read file header");
-
-    /* Check Mach identification.  */
-    if (!check_mach_header(mach_hdr)) {
-        error("bad Mach header");
-    }
-
-#if defined(HOST_PPC)
-    if (mach_hdr.cputype != CPU_TYPE_POWERPC)
-#elif defined(HOST_I386)
-    if (mach_hdr.cputype != CPU_TYPE_X86)
-#else
-#error unsupported host
-#endif 
-        error("Unsupported CPU");
-        
-    if (mach_hdr.filetype != MH_OBJECT)
-        error("Unsupported Mach Object");
-    
-    /* read segment headers */
-    for(i=0, j=sizeof(mach_hdr); i<mach_hdr.ncmds ; i++)
-    {
-        if(read(fd, &lc, sizeof(struct load_command)) != sizeof(struct load_command))
-            error("unable to read load_command");
-        if(lc.cmd == LC_SEGMENT)
-        {
-            offset_to_segment = j;
-            lseek(fd, offset_to_segment, SEEK_SET);
-            segment = malloc(sizeof(struct segment_command));
-            if(read(fd, segment, sizeof(struct segment_command)) != sizeof(struct segment_command))
-                error("unable to read LC_SEGMENT");
-        }
-        if(lc.cmd == LC_DYSYMTAB)
-        {
-            offset_to_dysymtab = j;
-            lseek(fd, offset_to_dysymtab, SEEK_SET);
-            dysymtabcmd = malloc(sizeof(struct dysymtab_command));
-            if(read(fd, dysymtabcmd, sizeof(struct dysymtab_command)) != sizeof(struct dysymtab_command))
-                error("unable to read LC_DYSYMTAB");
-        }
-        if(lc.cmd == LC_SYMTAB)
-        {
-            offset_to_symtab = j;
-            lseek(fd, offset_to_symtab, SEEK_SET);
-            symtabcmd = malloc(sizeof(struct symtab_command));
-            if(read(fd, symtabcmd, sizeof(struct symtab_command)) != sizeof(struct symtab_command))
-                error("unable to read LC_SYMTAB");
-        }
-        j+=lc.cmdsize;
-
-        lseek(fd, j, SEEK_SET);
-    }
-
-    if(!segment)
-        error("unable to find LC_SEGMENT");
-
-    /* read section headers */
-    section_hdr = load_data(fd, offset_to_segment + sizeof(struct segment_command), segment->nsects * sizeof(struct section));
-
-    /* read all section data */
-    sdata = (uint8_t **)malloc(sizeof(void *) * segment->nsects);
-    memset(sdata, 0, sizeof(void *) * segment->nsects);
-    
-	/* Load the data in section data */
-	for(i = 0; i < segment->nsects; i++) {
-        sdata[i] = load_data(fd, section_hdr[i].offset, section_hdr[i].size);
-    }
-	
-    /* text section */
-	text_sec_hdr = find_mach_sec_hdr(section_hdr, segment->nsects, SEG_TEXT, SECT_TEXT);
-	i = find_mach_sec_index(section_hdr, segment->nsects, SEG_TEXT, SECT_TEXT);
-	if (i == -1 || !text_sec_hdr)
-        error("could not find __TEXT,__text section");
-    text = sdata[i];
-	
-    /* Make sure dysym was loaded */
-    if(!(int)dysymtabcmd)
-        error("could not find __DYSYMTAB segment");
-    
-    /* read the table of content of the indirect sym */
-    tocdylib = load_data( fd, dysymtabcmd->indirectsymoff, dysymtabcmd->nindirectsyms * sizeof(uint32_t) );
-    
-    /* Make sure symtab was loaded  */
-    if(!(int)symtabcmd)
-        error("could not find __SYMTAB segment");
-    nb_syms = symtabcmd->nsyms;
-
-    symtab_std = load_data(fd, symtabcmd->symoff, symtabcmd->nsyms * sizeof(struct nlist));
-    strtab = load_data(fd, symtabcmd->stroff, symtabcmd->strsize);
-	
-	symtab = malloc(sizeof(EXE_SYM) * nb_syms);
-	
-	/* Now transform the symtab, to an extended version, with the sym size, and the C name */
-	for(i = 0, sym = symtab, syment = symtab_std; i < nb_syms; i++, sym++, syment++) {
-        struct nlist *sym_cur, *sym_next = 0;
-        unsigned int j;
-		memset(sym, 0, sizeof(*sym));
-		
-		if ( syment->n_type & N_STAB ) /* Debug symbols are skipped */
-            continue;
-			
-		memcpy(sym, syment, sizeof(*syment));
-
-#if defined(VBOX)
-        /* don't bother calcing size of internal symbol local symbols. */
-        if (strstart(find_str_by_index(sym->n_un.n_strx), ".L", NULL)) {
-            sym->st_size = 0;
-            continue;
-        }
-#endif 
-			
-		/* Find the following symbol in order to get the current symbol size */
-        for (j = 0, sym_cur = symtab_std; j < nb_syms; j++, sym_cur++) {
-            if (    sym_cur->n_sect != /*syment->n_sect*/ 1
-                ||  (sym_cur->n_type & N_STAB)
-                ||  sym_cur->n_value <= syment->n_value)
-                continue;
-            if (     sym_next
-                &&   sym_next->n_value <= sym_cur->n_value)
-                continue;
-#if defined(HOST_I386)
-            /* Ignore local labels (.Lxxx). */
-            if (strstart(find_str_by_index(sym_cur->n_un.n_strx), ".L", NULL))
-                continue;
-#endif 
-            /* a good one */
-            sym_next = sym_cur;
-        }
-		if(sym_next)
-            sym->st_size = sym_next->n_value - sym->st_value;
-		else
-            sym->st_size = text_sec_hdr->size - sym->st_value;
-	}
-	
-    /* Find Reloc */
-    relocs = load_data(fd, text_sec_hdr->reloff, text_sec_hdr->nreloc * sizeof(struct relocation_info));
-    nb_relocs = text_sec_hdr->nreloc;
-
-	close(fd);
-	return 0;
-}
-
-#endif /* CONFIG_FORMAT_MACH */
-
-#ifdef CONFIG_FORMAT_AOUT
-
-struct exec *aout_hdr;
-struct nlist *symtab_std;
-char *strtab;
-
-
-/* Utility functions */
-
-static inline char *find_str_by_index(int index)
-{
-    return strtab+index;
-}
-
-/* Used by dyngen common code */
-static char *get_sym_name(EXE_SYM *sym)
-{
-    char *name = find_str_by_index(sym->n_un.n_strx);
-
-    if (sym->n_type & N_STAB) /* Debug symbols are ignored */
-        return "debug";
-    if (name && name[0] == '_')
-        return name + 1;
-    return name;
-}
-
-static int type_to_sec_number(unsigned type)
-{
-    switch (type)
-    {
-        case 0:       case 0     |N_EXT:    case N_WEAKU:   return N_UNDF;
-        case N_ABS:   case N_ABS |N_EXT:    case N_WEAKA:   return N_ABS;
-        case N_TEXT:  case N_TEXT|N_EXT:    case N_WEAKT:   return N_TEXT;
-        case N_DATA:  case N_DATA|N_EXT:    case N_WEAKD:   return N_DATA;
-        case N_BSS:   case N_BSS |N_EXT:    case N_WEAKB:   return N_BSS;
-        case N_SETA:  case N_SETA|N_EXT:                    return N_SETA;
-        case N_SETT:  case N_SETT|N_EXT:                    return N_SETT;
-        case N_SETD:  case N_SETD|N_EXT:                    return N_SETD;
-
-        default:
-          return type;
-    }
-}
-
-/* find a sym name given its value, in a section number */
-static const char *find_sym_with_value_and_sec_number(long value, int sec, int *offset)
-{
-    int i, ret = -1;
-	
-    for (i = 0; i < nb_syms; i++) {
-        if (    !(symtab[i].n_type & N_STAB)
-            &&  type_to_sec_number(symtab[i].n_type) == sec
-            &&  symtab[i].st_value <= value
-            &&  (   ret < 0
-                 || symtab[i].st_value >= symtab[ret].st_value)) {
-            ret = i;
-        }
-    }
-    if (ret < 0) {
-        *offset = 0;
-        return 0;
-    }
-    *offset = value - symtab[ret].st_value;
-    return get_sym_name(&symtab[ret]);
-}
-
-static const char *get_rel_sym_name_and_addend(EXE_RELOC *rel, int *sslide)
-{
-    int sec;
-    int off;
-
-    *sslide = 0;
-
-    if (rel->r_extern)
-    {
-        /* ignore debug sym */
-        if (symtab[rel->r_symbolnum].n_type & N_STAB)
-            return 0;
-
-        /* The intruction contains the addend. */
-        off = *(uint32_t *)(text + rel->r_address);
-        if (rel->r_pcrel)
-            off += rel->r_address;
-        *sslide = off;
-        return get_sym_name(&symtab[rel->r_symbolnum]);
-    }
-    if (rel->r_symbolnum == 0xffffff)
-        return 0;
-
-    sec = rel->r_symbolnum & ~N_EXT;
-    /* sanity */
-    switch (sec)
-    {
-        case N_TEXT: case N_DATA: case N_BSS: case N_ABS: break;
-        default: error("invalid section %d", sec);
-    }
-
-    /* The intruction contains the addend. */
-    off = *(uint32_t *)(text + rel->r_address);
-    if (rel->r_pcrel)
-        off += rel->r_address;
-			
-    /* search it in the full symbol list, if not found */
-    return find_sym_with_value_and_sec_number(off, sec, sslide);
-}
-
-/* Used by dyngen common code */
-static const char * get_rel_sym_name(EXE_RELOC *rel)
-{
-    int ignored;
-    return get_rel_sym_name_and_addend(rel, &ignored);
-}
-
-/* Used by dyngen common code */
-static host_ulong get_rel_offset(EXE_RELOC *rel)
-{
-    return rel->r_address;
-}
-
-/* load an a.out object file */
-int load_object(const char *filename)
-{
-    FILE *pf;
-    long file_size;
-    unsigned i;
-    EXE_SYM *dst_sym;
-    struct nlist *src_sym;
-
-    /*
-     * Open the file and validate the header.
-     */
-    pf = fopen(filename, "rb");
-    if (!pf)
-        error("can't open file '%s'", filename);
-
-    /* we're optimistic, read the entire file first. */
-    if (fseek(pf, 0, SEEK_END) != 0)
-      error("Input file '%s' is not seekable", filename);
-    file_size = ftell(pf);
-    fseek(pf, 0L, SEEK_SET);
-
-    aout_hdr = malloc(file_size + 1);
-    if (!aout_hdr)
-        error("malloc(%ld) failed", file_size + 1);
-    if (fread(aout_hdr, 1, file_size, pf) != file_size)
-        error("error reading '%s'", filename);
-    fclose(pf);
-
-    /* validate the header. */
-    if (N_MAGIC(*aout_hdr) != OMAGIC)
-        error("unknown magic: %lo", N_MAGIC(*aout_hdr));
-    if (N_MACHTYPE(*aout_hdr) != M_386 && N_MACHTYPE(*aout_hdr) != 0)
-        error("unsupported machtype: %d", N_MACHTYPE(*aout_hdr));
-
-    /* setup globals. */
-    strtab = (char *)((uint8_t *)aout_hdr + N_STROFF(*aout_hdr));
-    symtab_std = (struct nlist *)((uint8_t *)aout_hdr + N_SYMOFF(*aout_hdr));
-
-    relocs = (struct relocation_info *)((uint8_t *)aout_hdr + N_TRELOFF(*aout_hdr));
-    nb_syms = aout_hdr->a_syms / sizeof(struct nlist);
-    text_shndx = 1;
-    text = (uint8_t *)aout_hdr + N_TXTOFF(*aout_hdr);
-    nb_relocs = aout_hdr->a_trsize / sizeof(relocs[0]);
-
-    /*
-     * Now transform the symtab, to an extended version, with the sym size, and the C name
-     */
-    src_sym = symtab_std;
-    dst_sym = symtab = malloc(sizeof(EXE_SYM) * nb_syms);
-    if (!dst_sym)
-        error("malloc(%zd) failed", sizeof(EXE_SYM) * nb_syms);
-    for (i = 0; i < nb_syms; i++, src_sym++, dst_sym++) {
-        struct nlist *sym_next = NULL;
-        struct nlist *sym_cur;
-        unsigned sec;
-        unsigned j;
-
-        /* copy the symbol and find the name. */
-        dst_sym->n_un.n_strx = src_sym->n_un.n_strx;
-        dst_sym->n_type = src_sym->n_type;
-        dst_sym->n_other = src_sym->n_other;
-        dst_sym->n_desc = src_sym->n_desc;
-        dst_sym->st_value = src_sym->n_value;
-        dst_sym->st_size = 0;
-        if (src_sym->n_type & N_STAB)
-            continue; /* skip debug symbols. */
-
-        /* Find the following symbol in order to get the current symbol size */
-        sec = type_to_sec_number(dst_sym->n_type);
-        for (j = 0, sym_cur = symtab_std; j < nb_syms; j++, sym_cur++) {
-            if (    type_to_sec_number(sym_cur->n_type) != sec
-                ||  (sym_cur->n_type & N_STAB)
-                ||  sym_cur->n_value <= dst_sym->st_value)
-                continue;
-            if (     sym_next
-                &&   sym_next->n_value <= sym_cur->n_value)
-                 continue;
-            /* good one */
-            sym_next = sym_cur;
-        }
-        if (sym_next)
-            dst_sym->st_size = sym_next->n_value - dst_sym->st_value;
-        else
-            dst_sym->st_size = aout_hdr->a_text - dst_sym->st_value;
-    }
-	
-    return 0;
-}
-
-#endif /* CONFIG_FORMAT_AOUT */
-
-
-void get_reloc_expr(char *name, int name_size, const char *sym_name)
-{
-    const char *p;
-
-    if (strstart(sym_name, "__op_param", &p)) {
-        snprintf(name, name_size, "param%s", p);
-    } else if (strstart(sym_name, "__op_gen_label", &p)) {
-        snprintf(name, name_size, "gen_labels[param%s]", p);
-    } else {
-#ifdef HOST_SPARC
-        if (sym_name[0] == '.')
-            snprintf(name, name_size,
-                     "(long)(&__dot_%s)",
-                     sym_name + 1);
-        else
-#endif
-            snprintf(name, name_size, "(long)(&%s)", sym_name);
-    }
-}
-
-#ifdef HOST_IA64
-
-#define PLT_ENTRY_SIZE	16	/* 1 bundle containing "brl" */
-
-struct plt_entry {
-    struct plt_entry *next;
-    const char *name;
-    unsigned long addend;
-} *plt_list;
-
-static int
-get_plt_index (const char *name, unsigned long addend)
-{
-    struct plt_entry *plt, *prev= NULL;
-    int index = 0;
-
-    /* see if we already have an entry for this target: */
-    for (plt = plt_list; plt; ++index, prev = plt, plt = plt->next)
-	if (strcmp(plt->name, name) == 0 && plt->addend == addend)
-	    return index;
-
-    /* nope; create a new PLT entry: */
-
-    plt = malloc(sizeof(*plt));
-    if (!plt) {
-	perror("malloc");
-	exit(1);
-    }
-    memset(plt, 0, sizeof(*plt));
-    plt->name = strdup(name);
-    plt->addend = addend;
-
-    /* append to plt-list: */
-    if (prev)
-	prev->next = plt;
-    else
-	plt_list = plt;
-    return index;
-}
-
-#endif
-
-#ifdef HOST_ARM
-
-int arm_emit_ldr_info(const char *name, unsigned long start_offset,
-                      FILE *outfile, uint8_t *p_start, uint8_t *p_end,
-                      ELF_RELOC *relocs, int nb_relocs)
-{
-    uint8_t *p;
-    uint32_t insn;
-    int offset, min_offset, pc_offset, data_size, spare, max_pool;
-    uint8_t data_allocated[1024];
-    unsigned int data_index;
-    int type;
-    
-    memset(data_allocated, 0, sizeof(data_allocated));
-    
-    p = p_start;
-    min_offset = p_end - p_start;
-    spare = 0x7fffffff;
-    while (p < p_start + min_offset) {
-        insn = get32((uint32_t *)p);
-        /* TODO: Armv5e ldrd.  */
-        /* TODO: VFP load.  */
-        if ((insn & 0x0d5f0000) == 0x051f0000) {
-            /* ldr reg, [pc, #im] */
-            offset = insn & 0xfff;
-            if (!(insn & 0x00800000))
-                offset = -offset;
-            max_pool = 4096;
-            type = 0;
-        } else if ((insn & 0x0e5f0f00) == 0x0c1f0100) {
-            /* FPA ldf.  */
-            offset = (insn & 0xff) << 2;
-            if (!(insn & 0x00800000))
-                offset = -offset;
-            max_pool = 1024;
-            type = 1;
-        } else if ((insn & 0x0fff0000) == 0x028f0000) {
-            /* Some gcc load a doubleword immediate with
-               add regN, pc, #imm
-               ldmia regN, {regN, regM}
-               Hope and pray the compiler never generates somethin like
-               add reg, pc, #imm1; ldr reg, [reg, #-imm2]; */
-            int r;
-
-            r = (insn & 0xf00) >> 7;
-            offset = ((insn & 0xff) >> r) | ((insn & 0xff) << (32 - r));
-            max_pool = 1024;
-            type = 2;
-        } else {
-            max_pool = 0;
-            type = -1;
-        }
-        if (type >= 0) {
-            /* PC-relative load needs fixing up.  */
-            if (spare > max_pool - offset)
-                spare = max_pool - offset;
-            if ((offset & 3) !=0)
-                error("%s:%04x: pc offset must be 32 bit aligned", 
-                      name, start_offset + p - p_start);
-            if (offset < 0)
-                error("%s:%04x: Embedded literal value",
-                      name, start_offset + p - p_start);
-            pc_offset = p - p_start + offset + 8;
-            if (pc_offset <= (p - p_start) || 
-                pc_offset >= (p_end - p_start))
-                error("%s:%04x: pc offset must point inside the function code", 
-                      name, start_offset + p - p_start);
-            if (pc_offset < min_offset)
-                min_offset = pc_offset;
-            if (outfile) {
-                /* The intruction position */
-                fprintf(outfile, "    arm_ldr_ptr->ptr = gen_code_ptr + %d;\n", 
-                        p - p_start);
-                /* The position of the constant pool data.  */
-                data_index = ((p_end - p_start) - pc_offset) >> 2;
-                fprintf(outfile, "    arm_ldr_ptr->data_ptr = arm_data_ptr - %d;\n", 
-                        data_index);
-                fprintf(outfile, "    arm_ldr_ptr->type = %d;\n", type);
-                fprintf(outfile, "    arm_ldr_ptr++;\n");
-            }
-        }
-        p += 4;
-    }
-
-    /* Copy and relocate the constant pool data.  */
-    data_size = (p_end - p_start) - min_offset;
-    if (data_size > 0 && outfile) {
-        spare += min_offset;
-        fprintf(outfile, "    arm_data_ptr -= %d;\n", data_size >> 2);
-        fprintf(outfile, "    arm_pool_ptr -= %d;\n", data_size);
-        fprintf(outfile, "    if (arm_pool_ptr > gen_code_ptr + %d)\n"
-                         "        arm_pool_ptr = gen_code_ptr + %d;\n",
-                         spare, spare);
-
-        data_index = 0;
-        for (pc_offset = min_offset;
-             pc_offset < p_end - p_start;
-             pc_offset += 4) {
-
-            ELF_RELOC *rel;
-            int i, addend, type;
-            const char *sym_name;
-            char relname[1024];
-
-            /* data value */
-            addend = get32((uint32_t *)(p_start + pc_offset));
-            relname[0] = '\0';
-            for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                if (rel->r_offset == (pc_offset + start_offset)) {
-                    sym_name = get_rel_sym_name(rel);
-                    /* the compiler leave some unnecessary references to the code */
-                    get_reloc_expr(relname, sizeof(relname), sym_name);
-                    type = ELF32_R_TYPE(rel->r_info);
-                    if (type != R_ARM_ABS32)
-                        error("%s: unsupported data relocation", name);
-                    break;
-                }
-            }
-            fprintf(outfile, "    arm_data_ptr[%d] = 0x%x",
-                    data_index, addend);
-            if (relname[0] != '\0')
-                fprintf(outfile, " + %s", relname);
-            fprintf(outfile, ";\n");
-
-            data_index++;
-        }
-    }
-
-    if (p == p_start)
-        goto arm_ret_error;
-    p -= 4;
-    insn = get32((uint32_t *)p);
-    /* The last instruction must be an ldm instruction.  There are several
-       forms generated by gcc:
-        ldmib sp, {..., pc}  (implies a sp adjustment of +4)
-        ldmia sp, {..., pc}
-        ldmea fp, {..., pc} */
-    if ((insn & 0xffff8000) == 0xe99d8000) {
-        if (outfile) {
-            fprintf(outfile,
-                    "    *(uint32_t *)(gen_code_ptr + %d) = 0xe28dd004;\n",
-                    p - p_start);
-        }
-        p += 4;
-    } else if ((insn & 0xffff8000) != 0xe89d8000
-        && (insn & 0xffff8000) != 0xe91b8000) {
-    arm_ret_error:
-        if (!outfile)
-            printf("%s: invalid epilog\n", name);
-    }
-    return p - p_start;
-}
-#endif
-
-
-#define MAX_ARGS 3
-
-/* generate op code */
-void gen_code(const char *name, host_ulong offset, host_ulong size, 
-              FILE *outfile, int gen_switch)
-{
-    int copy_size = 0;
-    uint8_t *p_start, *p_end;
-    host_ulong start_offset;
-    int nb_args, i, n;
-    uint8_t args_present[MAX_ARGS];
-    const char *sym_name, *p;
-    EXE_RELOC *rel;
-
-    /* Compute exact size excluding prologue and epilogue instructions.
-     * Increment start_offset to skip epilogue instructions, then compute
-     * copy_size the indicate the size of the remaining instructions (in
-     * bytes).
-     */
-    p_start = text + offset;
-    p_end = p_start + size;
-    start_offset = offset;
-#if defined(HOST_I386) || defined(HOST_X86_64)
-#if defined(CONFIG_FORMAT_COFF) || defined(CONFIG_FORMAT_AOUT) || defined(CONFIG_FORMAT_MACH)
-    {
-        uint8_t *p;
-        p = p_end - 1;
-        if (p == p_start)
-            error("empty code for %s", name);
-        while (*p != 0xc3) {
-            p--;
-            if (p <= p_start)
-                error("ret or jmp expected at the end of %s", name);
-        }
-        copy_size = p - p_start;
-    }
-#else
-    {
-        int len;
-        len = p_end - p_start;
-        if (len == 0)
-            error("empty code for %s", name);
-        if (p_end[-1] == 0xc3) {
-            len--;
-        } else {
-            error("ret or jmp expected at the end of %s", name);
-        }
-        copy_size = len;
-    }
-#endif    
-#elif defined(HOST_PPC)
-    {
-        uint8_t *p;
-        p = (void *)(p_end - 4);
-        if (p == p_start)
-            error("empty code for %s", name);
-        if (get32((uint32_t *)p) != 0x4e800020)
-            error("blr expected at the end of %s", name);
-        copy_size = p - p_start;
-    }
-#elif defined(HOST_S390)
-    {
-        uint8_t *p;
-        p = (void *)(p_end - 2);
-        if (p == p_start)
-            error("empty code for %s", name);
-        if (get16((uint16_t *)p) != 0x07fe && get16((uint16_t *)p) != 0x07f4)
-            error("br %%r14 expected at the end of %s", name);
-        copy_size = p - p_start;
-    }
-#elif defined(HOST_ALPHA)
-    {
-        uint8_t *p;
-        p = p_end - 4;
-#if 0
-        /* XXX: check why it occurs */
-        if (p == p_start)
-            error("empty code for %s", name);
-#endif
-        if (get32((uint32_t *)p) != 0x6bfa8001)
-            error("ret expected at the end of %s", name);
-        copy_size = p - p_start;	    
-    }
-#elif defined(HOST_IA64)
-    {
-        uint8_t *p;
-        p = (void *)(p_end - 4);
-        if (p == p_start)
-            error("empty code for %s", name);
-        /* br.ret.sptk.many b0;; */
-        /* 08 00 84 00 */
-        if (get32((uint32_t *)p) != 0x00840008)
-            error("br.ret.sptk.many b0;; expected at the end of %s", name);
-	copy_size = p_end - p_start;
-    }
-#elif defined(HOST_SPARC)
-    {
-#define INSN_SAVE       0x9de3a000
-#define INSN_RET        0x81c7e008
-#define INSN_RETL       0x81c3e008
-#define INSN_RESTORE    0x81e80000
-#define INSN_RETURN     0x81cfe008
-#define INSN_NOP        0x01000000
-#define INSN_ADD_SP     0x9c03a000 /* add %sp, nn, %sp */
-#define INSN_SUB_SP     0x9c23a000 /* sub %sp, nn, %sp */
-
-        uint32_t start_insn, end_insn1, end_insn2;
-        uint8_t *p;
-        p = (void *)(p_end - 8);
-        if (p <= p_start)
-            error("empty code for %s", name);
-        start_insn = get32((uint32_t *)(p_start + 0x0));
-        end_insn1 = get32((uint32_t *)(p + 0x0));
-        end_insn2 = get32((uint32_t *)(p + 0x4));
-        if (((start_insn & ~0x1fff) == INSN_SAVE) ||
-            (start_insn & ~0x1fff) == INSN_ADD_SP) {
-            p_start += 0x4;
-            start_offset += 0x4;
-            if (end_insn1 == INSN_RET && end_insn2 == INSN_RESTORE)
-                /* SPARC v7: ret; restore; */ ;
-            else if (end_insn1 == INSN_RETURN && end_insn2 == INSN_NOP)
-                /* SPARC v9: return; nop; */ ;
-            else if (end_insn1 == INSN_RETL && (end_insn2 & ~0x1fff) == INSN_SUB_SP)
-                /* SPARC v7: retl; sub %sp, nn, %sp; */ ;
-            else
-
-                error("ret; restore; not found at end of %s", name);
-        } else if (end_insn1 == INSN_RETL && end_insn2 == INSN_NOP) {
-            ;
-        } else {
-            error("No save at the beginning of %s", name);
-        }
-#if 0
-        /* Skip a preceeding nop, if present.  */
-        if (p > p_start) {
-            skip_insn = get32((uint32_t *)(p - 0x4));
-            if (skip_insn == INSN_NOP)
-                p -= 4;
-        }
-#endif
-        copy_size = p - p_start;
-    }
-#elif defined(HOST_SPARC64)
-    {
-#define INSN_SAVE       0x9de3a000
-#define INSN_RET        0x81c7e008
-#define INSN_RETL       0x81c3e008
-#define INSN_RESTORE    0x81e80000
-#define INSN_RETURN     0x81cfe008
-#define INSN_NOP        0x01000000
-#define INSN_ADD_SP     0x9c03a000 /* add %sp, nn, %sp */
-#define INSN_SUB_SP     0x9c23a000 /* sub %sp, nn, %sp */
-
-        uint32_t start_insn, end_insn1, end_insn2, skip_insn;
-        uint8_t *p;
-        p = (void *)(p_end - 8);
-#if 0
-        /* XXX: check why it occurs */
-        if (p <= p_start)
-            error("empty code for %s", name);
-#endif
-        start_insn = get32((uint32_t *)(p_start + 0x0));
-        end_insn1 = get32((uint32_t *)(p + 0x0));
-        end_insn2 = get32((uint32_t *)(p + 0x4));
-        if (((start_insn & ~0x1fff) == INSN_SAVE) ||
-            (start_insn & ~0x1fff) == INSN_ADD_SP) {
-            p_start += 0x4;
-            start_offset += 0x4;
-            if (end_insn1 == INSN_RET && end_insn2 == INSN_RESTORE)
-                /* SPARC v7: ret; restore; */ ;
-            else if (end_insn1 == INSN_RETURN && end_insn2 == INSN_NOP)
-                /* SPARC v9: return; nop; */ ;
-            else if (end_insn1 == INSN_RETL && (end_insn2 & ~0x1fff) == INSN_SUB_SP)
-                /* SPARC v7: retl; sub %sp, nn, %sp; */ ;
-            else
-
-                error("ret; restore; not found at end of %s", name);
-        } else if (end_insn1 == INSN_RETL && end_insn2 == INSN_NOP) {
-            ;
-        } else {
-            error("No save at the beginning of %s", name);
-        }
-        
-        /* Skip a preceeding nop, if present.  */
-        if (p > p_start) {
-            skip_insn = get32((uint32_t *)(p - 0x4));
-            if (skip_insn == 0x01000000)
-                p -= 4;
-        }
-        
-        copy_size = p - p_start;
-    }
-#elif defined(HOST_ARM)
-    {
-        uint32_t insn;
-
-        if ((p_end - p_start) <= 16)
-            error("%s: function too small", name);
-        if (get32((uint32_t *)p_start) != 0xe1a0c00d ||
-            (get32((uint32_t *)(p_start + 4)) & 0xffff0000) != 0xe92d0000 ||
-            get32((uint32_t *)(p_start + 8)) != 0xe24cb004)
-            error("%s: invalid prolog", name);
-        p_start += 12;
-        start_offset += 12;
-        insn = get32((uint32_t *)p_start);
-        if ((insn & 0xffffff00) == 0xe24dd000) {
-            /* Stack adjustment.  Assume op uses the frame pointer.  */
-            p_start -= 4;
-            start_offset -= 4;
-        }
-        copy_size = arm_emit_ldr_info(name, start_offset, NULL, p_start, p_end, 
-                                      relocs, nb_relocs);
-    }
-#elif defined(HOST_M68K)
-    {
-        uint8_t *p;
-        p = (void *)(p_end - 2);
-        if (p == p_start)
-            error("empty code for %s", name);
-        /* remove NOP's, probably added for alignment */
-        while ((get16((uint16_t *)p) == 0x4e71) &&
-               (p>p_start)) 
-            p -= 2;
-        if (get16((uint16_t *)p) != 0x4e75)
-            error("rts expected at the end of %s", name);
-        copy_size = p - p_start;
-    }
-#else
-#error unsupported CPU
-#endif
-
-    /* compute the number of arguments by looking at the relocations */
-    for(i = 0;i < MAX_ARGS; i++)
-        args_present[i] = 0;
-
-    for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-        host_ulong offset = get_rel_offset(rel);
-        if (offset >= start_offset &&
-	    offset < start_offset + (p_end - p_start)) {
-            sym_name = get_rel_sym_name(rel);
-            if(!sym_name)
-                continue;
-            if (strstart(sym_name, "__op_param", &p) ||
-                strstart(sym_name, "__op_gen_label", &p)) {
-                n = strtoul(p, NULL, 10);
-                if (n > MAX_ARGS)
-                    error("too many arguments in %s", name);
-                args_present[n - 1] = 1;
-            }
-        }
-    }
-    
-    nb_args = 0;
-    while (nb_args < MAX_ARGS && args_present[nb_args])
-        nb_args++;
-    for(i = nb_args; i < MAX_ARGS; i++) {
-        if (args_present[i])
-            error("inconsistent argument numbering in %s", name);
-    }
-
-    if (gen_switch == 2) {
-        fprintf(outfile, "DEF(%s, %d, %d)\n", name + 3, nb_args, copy_size);
-    } else if (gen_switch == 1) {
-
-        /* output C code */
-        fprintf(outfile, "case INDEX_%s: {\n", name);
-        if (nb_args > 0) {
-            fprintf(outfile, "    long ");
-            for(i = 0; i < nb_args; i++) {
-                if (i != 0)
-                    fprintf(outfile, ", ");
-                fprintf(outfile, "param%d", i + 1);
-            }
-            fprintf(outfile, ";\n");
-        }
-#if defined(HOST_IA64)
-        fprintf(outfile, "    extern char %s;\n", name);
-#else
-        fprintf(outfile, "    extern void %s();\n", name);
-#endif
-
-        for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-            host_ulong offset = get_rel_offset(rel);
-            if (offset >= start_offset &&
-                offset < start_offset + (p_end - p_start)) {
-                sym_name = get_rel_sym_name(rel);
-                if(!sym_name)
-                    continue;
-                if (*sym_name && 
-#ifdef VBOX
-                    !strstart(sym_name, "remR3PhysWrite", NULL) &&
-                    !strstart(sym_name, "remR3PhysRead", NULL) &&
-#endif
-                    !strstart(sym_name, "__op_param", NULL) &&
-                    !strstart(sym_name, "__op_jmp", NULL) &&
-                    !strstart(sym_name, "__op_gen_label", NULL)) {
-#if defined(HOST_SPARC)
-		    if (sym_name[0] == '.') {
-			fprintf(outfile,
-				"extern char __dot_%s __asm__(\"%s\");\n",
-				sym_name+1, sym_name);
-			continue;
-		    }
-#endif
-#if defined(__APPLE__)
-/* set __attribute((unused)) on darwin because we wan't to avoid warning when we don't use the symbol */
-                    fprintf(outfile, "extern char %s __attribute__((unused));\n", sym_name);
-#elif defined(HOST_IA64)
-			if (ELF64_R_TYPE(rel->r_info) != R_IA64_PCREL21B)
-				/*
-				 * PCREL21 br.call targets generally
-				 * are out of range and need to go
-				 * through an "import stub".
-				 */
-				fprintf(outfile, "    extern char %s;\n",
-					sym_name);
-#else
-                    /* don't include memcpy here as this external reference wouldn't work anyway! */
-                    if (strcmp(sym_name, "memcpy"))
-                        fprintf(outfile, "extern char %s;\n", sym_name);
-#endif
-                }
-            }
-        }
-
-        fprintf(outfile, "    memcpy(gen_code_ptr, (void *)((char *)&%s+%d), %d);\n",
-					name, (int)(start_offset - offset), copy_size);
-
-        /* emit code offset information */
-        {
-            EXE_SYM *sym;
-            const char *sym_name, *p;
-            unsigned long val;
-            int n;
-
-            for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-                sym_name = get_sym_name(sym);
-                if (strstart(sym_name, "__op_label", &p)) {
-                    uint8_t *ptr;
-                    unsigned long offset;
-                    
-                    /* test if the variable refers to a label inside
-                       the code we are generating */
-#ifdef CONFIG_FORMAT_COFF
-                    if (sym->st_shndx == text_shndx) {
-                        ptr = sdata[coff_text_shndx];
-                    } else if (sym->st_shndx == data_shndx) {
-                        ptr = sdata[coff_data_shndx];
-                    } else {
-                        ptr = NULL;
-                    }
-#elif defined(CONFIG_FORMAT_MACH)
-                    if(!sym->n_sect)
-                        continue;
-                    ptr = sdata[sym->n_sect-1];
-#elif defined(CONFIG_FORMAT_AOUT)
-                    switch (type_to_sec_number(sym->n_type))
-                    {
-                        case N_TEXT:    ptr = (uint8_t *)aout_hdr + N_TXTOFF(*aout_hdr); break;
-                        case N_DATA:    ptr = (uint8_t *)aout_hdr + N_DATOFF(*aout_hdr); break;
-                        default:        ptr = NULL;
-                    }
-#else
-                    ptr = sdata[sym->st_shndx];
-#endif
-                    if (!ptr)
-                        error("__op_labelN in invalid section");
-                    offset = sym->st_value;
-#ifdef CONFIG_FORMAT_MACH
-                    offset -= section_hdr[sym->n_sect-1].addr;
-#elif defined(CONFIG_FORMAT_AOUT)
-                    if (type_to_sec_number(sym->n_type) == N_DATA)
-                        offset -= aout_hdr->a_text;
-#endif
-                    val = *(unsigned long *)(ptr + offset);
-#ifdef ELF_USES_RELOCA
-                    {
-                        int reloc_shndx, nb_relocs1, j;
-
-                        /* try to find a matching relocation */
-                        reloc_shndx = find_reloc(sym->st_shndx);
-                        if (reloc_shndx) {
-                            nb_relocs1 = shdr[reloc_shndx].sh_size / 
-                                shdr[reloc_shndx].sh_entsize;
-                            rel = (ELF_RELOC *)sdata[reloc_shndx];
-                            for(j = 0; j < nb_relocs1; j++) {
-                                if (rel->r_offset == offset) {
-				    val = rel->r_addend;
-                                    break;
-                                }
-				rel++;
-                            }
-                        }
-                    }
-#endif                    
-                    if (val >= start_offset && val <= start_offset + copy_size) {
-                        n = strtol(p, NULL, 10);
-                        fprintf(outfile, "    label_offsets[%d] = %ld + (gen_code_ptr - gen_code_buf);\n", n, (long)(val - start_offset));
-                    }
-                }
-            }
-        }
-
-        /* load parameres in variables */
-        for(i = 0; i < nb_args; i++) {
-            fprintf(outfile, "    param%d = *opparam_ptr++;\n", i + 1);
-        }
-
-        /* patch relocations */
-#if defined(HOST_I386) 
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                host_ulong offset = get_rel_offset(rel);
-                if (offset >= start_offset &&
-		    offset < start_offset + copy_size) {
-#if defined(CONFIG_FORMAT_AOUT) || defined(CONFIG_FORMAT_MACH)
-                    sym_name = get_rel_sym_name_and_addend(rel, &addend);
-#else
-                    sym_name = get_rel_sym_name(rel);
-#endif
-                    if (!sym_name)
-                        continue;
-                    reloc_offset = offset - start_offset;
-                    if (strstart(sym_name, "__op_jmp", &p)) {
-                        int n;
-                        n = strtol(p, NULL, 10);
-                        /* __op_jmp relocations are done at
-                           runtime to do translated block
-                           chaining: the offset of the instruction
-                           needs to be stored */
-                        fprintf(outfile, "    jmp_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n",
-                                n, reloc_offset);
-                        continue;
-                    }
-
-                    get_reloc_expr(name, sizeof(name), sym_name);
-#if !defined(CONFIG_FORMAT_AOUT) && !defined(CONFIG_FORMAT_MACH)
-                    addend = get32((uint32_t *)(text + offset));
-#endif
-#ifdef CONFIG_FORMAT_ELF
-                    type = ELF32_R_TYPE(rel->r_info);
-                    switch(type) {
-                    case R_386_32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-                    case R_386_PC32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d;\n", 
-                                reloc_offset, name, reloc_offset, addend);
-                        break;
-                    default:
-                        error("unsupported i386 relocation (%d)", type);
-                    }
-#elif defined(CONFIG_FORMAT_COFF)
-                    {
-                        char *temp_name;
-                        int j;
-                        EXE_SYM *sym;
-                        temp_name = get_sym_name(symtab + *(uint32_t *)(rel->r_reloc->r_symndx));
-                        if (!strcmp(temp_name, ".data")) {
-                            for (j = 0, sym = symtab; j < nb_syms; j++, sym++) {
-                                if (strstart(sym->st_name, sym_name, NULL)) {
-                                    addend -= sym->st_value;
-                                }
-                            }
-                        }
-                    }
-                    type = rel->r_type;
-                    switch(type) {
-                    case DIR32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-                    case DISP32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d -4;\n", 
-                                reloc_offset, name, reloc_offset, addend);
-                        break;
-                    default:
-                        error("unsupported i386 relocation (%d)", type);
-                    }
-#elif defined(CONFIG_FORMAT_AOUT) || defined(CONFIG_FORMAT_MACH)
-                    if (rel->r_pcrel) {
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d;\n",
-                                offset - start_offset, name, offset - start_offset, addend);
-                    } else {
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
-                                offset - start_offset, name, addend);
-                    }
-                    (void)type;
-#else
-#error unsupport object format
-#endif
-                }
-                }
-            }
-#elif defined(HOST_X86_64)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                if (rel->r_offset >= start_offset &&
-		    rel->r_offset < start_offset + copy_size) {
-                    sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-                    get_reloc_expr(name, sizeof(name), sym_name);
-                    type = ELF32_R_TYPE(rel->r_info);
-                    addend = rel->r_addend;
-                    reloc_offset = rel->r_offset - start_offset;
-                    switch(type) {
-                    case R_X86_64_32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = (uint32_t)%s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-                    case R_X86_64_32S:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = (int32_t)%s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-                    case R_X86_64_PC32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d;\n", 
-                                reloc_offset, name, reloc_offset, addend);
-                        break;
-#ifdef VBOX /** @todo Re-check the sanity of this */
-                    case R_X86_64_64:
-                        fprintf(outfile, "    *(uint64_t *)(gen_code_ptr + %d) = (uint64_t)%s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-#endif 
-                    default:
-                        error("unsupported X86_64 relocation (%d)", type);
-                    }
-                }
-                }
-            }
-#elif defined(HOST_PPC)
-            {
-#ifdef CONFIG_FORMAT_ELF
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                    if (rel->r_offset >= start_offset &&
-			rel->r_offset < start_offset + copy_size) {
-                        sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-                        reloc_offset = rel->r_offset - start_offset;
-                        if (strstart(sym_name, "__op_jmp", &p)) {
-                            int n;
-                            n = strtol(p, NULL, 10);
-                            /* __op_jmp relocations are done at
-                               runtime to do translated block
-                               chaining: the offset of the instruction
-                               needs to be stored */
-                            fprintf(outfile, "    jmp_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n",
-                                    n, reloc_offset);
-                            continue;
-                        }
-                        
-                        get_reloc_expr(name, sizeof(name), sym_name);
-                        type = ELF32_R_TYPE(rel->r_info);
-                        addend = rel->r_addend;
-                        switch(type) {
-                        case R_PPC_ADDR32:
-                            fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_PPC_ADDR16_LO:
-                            fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_PPC_ADDR16_HI:
-                            fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_PPC_ADDR16_HA:
-                            fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_PPC_REL24:
-                            /* warning: must be at 32 MB distancy */
-                            fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n", 
-                                    reloc_offset, reloc_offset, name, reloc_offset, addend);
-                            break;
-                        default:
-                            error("unsupported powerpc relocation (%d)", type);
-                        }
-                    }
-                }
-#elif defined(CONFIG_FORMAT_MACH)
-				struct scattered_relocation_info *scarel;
-				struct relocation_info * rel;
-				char final_sym_name[256];
-				const char *sym_name;
-				const char *p;
-				int slide, sslide;
-				int i;
-	
-				for(i = 0, rel = relocs; i < nb_relocs; i++, rel++) {
-					unsigned int offset, length, value = 0;
-					unsigned int type, pcrel, isym = 0;
-					unsigned int usesym = 0;
-				
-					if(R_SCATTERED & rel->r_address) {
-						scarel = (struct scattered_relocation_info*)rel;
-						offset = (unsigned int)scarel->r_address;
-						length = scarel->r_length;
-						pcrel = scarel->r_pcrel;
-						type = scarel->r_type;
-						value = scarel->r_value;
-					} else {
-						value = isym = rel->r_symbolnum;
-						usesym = (rel->r_extern);
-						offset = rel->r_address;
-						length = rel->r_length;
-						pcrel = rel->r_pcrel;
-						type = rel->r_type;
-					}
-				
-					slide = offset - start_offset;
-		
-					if (!(offset >= start_offset && offset < start_offset + size)) 
-						continue;  /* not in our range */
-
-					sym_name = get_reloc_name(rel, &sslide);
-					
-					if(usesym && symtab[isym].n_type & N_STAB)
-						continue; /* don't handle STAB (debug sym) */
-					
-					if (sym_name && strstart(sym_name, "__op_jmp", &p)) {
-						int n;
-						n = strtol(p, NULL, 10);
-						fprintf(outfile, "    jmp_offsets[%d] = %d + (gen_code_ptr - gen_code_buf);\n",
-							n, slide);
-						continue; /* Nothing more to do */
-					}
-					
-					if(!sym_name)
-					{
-						fprintf(outfile, "/* #warning relocation not handled in %s (value 0x%x, %s, offset 0x%x, length 0x%x, %s, type 0x%x) */\n",
-						           name, value, usesym ? "use sym" : "don't use sym", offset, length, pcrel ? "pcrel":"", type);
-						continue; /* dunno how to handle without final_sym_name */
-					}
-													   
-                                        get_reloc_expr(final_sym_name, sizeof(final_sym_name), 
-                                                       sym_name);
-					switch(type) {
-					case PPC_RELOC_BR24:
-					    if (!strstart(sym_name,"__op_gen_label",&p)) {
-    						fprintf(outfile, "{\n");
-    						fprintf(outfile, "    uint32_t imm = *(uint32_t *)(gen_code_ptr + %d) & 0x3fffffc;\n", slide);
-    						fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((imm + ((long)%s - (long)gen_code_ptr) + %d) & 0x03fffffc);\n", 
-											slide, slide, name, sslide );
-    						fprintf(outfile, "}\n");
-    					} else {
-							fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | (((long)%s - (long)gen_code_ptr - %d) & 0x03fffffc);\n",
-											slide, slide, final_sym_name, slide);
-    					}
-						break;
-					case PPC_RELOC_HI16:
-						fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d + 2) = (%s + %d) >> 16;\n", 
-							slide, final_sym_name, sslide);
-						break;
-					case PPC_RELOC_LO16:
-						fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d + 2) = (%s + %d);\n", 
-					slide, final_sym_name, sslide);
-                            break;
-					case PPC_RELOC_HA16:
-						fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d + 2) = (%s + %d + 0x8000) >> 16;\n", 
-							slide, final_sym_name, sslide);
-						break;
-				default:
-					error("unsupported powerpc relocation (%d)", type);
-				}
-			}
-#else
-#error unsupport object format
-#endif
-            }
-#elif defined(HOST_S390)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                    if (rel->r_offset >= start_offset &&
-			rel->r_offset < start_offset + copy_size) {
-                        sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-                        get_reloc_expr(name, sizeof(name), sym_name);
-                        type = ELF32_R_TYPE(rel->r_info);
-                        addend = rel->r_addend;
-                        reloc_offset = rel->r_offset - start_offset;
-                        switch(type) {
-                        case R_390_32:
-                            fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_390_16:
-                            fprintf(outfile, "    *(uint16_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        case R_390_8:
-                            fprintf(outfile, "    *(uint8_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                    reloc_offset, name, addend);
-                            break;
-                        default:
-                            error("unsupported s390 relocation (%d)", type);
-                        }
-                    }
-                }
-            }
-#elif defined(HOST_ALPHA)
-            {
-                for (i = 0, rel = relocs; i < nb_relocs; i++, rel++) {
-		    if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) {
-			int type;
-                        long reloc_offset;
-
-			type = ELF64_R_TYPE(rel->r_info);
-			sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;
-                        reloc_offset = rel->r_offset - start_offset;
-			switch (type) {
-			case R_ALPHA_GPDISP:
-			    /* The gp is just 32 bit, and never changes, so it's easiest to emit it
-			       as an immediate instead of constructing it from the pv or ra.  */
-			    fprintf(outfile, "    immediate_ldah(gen_code_ptr + %ld, gp);\n",
-				    reloc_offset);
-			    fprintf(outfile, "    immediate_lda(gen_code_ptr + %ld, gp);\n",
-				    reloc_offset + (int)rel->r_addend);
-			    break;
-			case R_ALPHA_LITUSE:
-			    /* jsr to literal hint. Could be used to optimize to bsr. Ignore for
-			       now, since some called functions (libc) need pv to be set up.  */
-			    break;
-			case R_ALPHA_HINT:
-			    /* Branch target prediction hint. Ignore for now.  Should be already
-			       correct for in-function jumps.  */
-			    break;
-			case R_ALPHA_LITERAL:
-			    /* Load a literal from the GOT relative to the gp.  Since there's only a
-			       single gp, nothing is to be done.  */
-			    break;
-			case R_ALPHA_GPRELHIGH:
-			    /* Handle fake relocations against __op_param symbol.  Need to emit the
-			       high part of the immediate value instead.  Other symbols need no
-			       special treatment.  */
-			    if (strstart(sym_name, "__op_param", &p))
-				fprintf(outfile, "    immediate_ldah(gen_code_ptr + %ld, param%s);\n",
-					reloc_offset, p);
-			    break;
-			case R_ALPHA_GPRELLOW:
-			    if (strstart(sym_name, "__op_param", &p))
-				fprintf(outfile, "    immediate_lda(gen_code_ptr + %ld, param%s);\n",
-					reloc_offset, p);
-			    break;
-			case R_ALPHA_BRSGP:
-			    /* PC-relative jump. Tweak offset to skip the two instructions that try to
-			       set up the gp from the pv.  */
-			    fprintf(outfile, "    fix_bsr(gen_code_ptr + %ld, (uint8_t *) &%s - (gen_code_ptr + %ld + 4) + 8);\n",
-				    reloc_offset, sym_name, reloc_offset);
-			    break;
-			default:
-			    error("unsupported Alpha relocation (%d)", type);
-			}
-		    }
-                }
-            }
-#elif defined(HOST_IA64)
-            {
-		unsigned long sym_idx;
-		long code_offset;
-                char name[256];
-                int type;
-                long addend;
-
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-		    sym_idx = ELF64_R_SYM(rel->r_info);
-                    if (rel->r_offset < start_offset
-			|| rel->r_offset >= start_offset + copy_size)
-			continue;
-		    sym_name = (strtab + symtab[sym_idx].st_name);
-		    code_offset = rel->r_offset - start_offset;
-		    if (strstart(sym_name, "__op_jmp", &p)) {
-			int n;
-			n = strtol(p, NULL, 10);
-			/* __op_jmp relocations are done at
-			   runtime to do translated block
-			   chaining: the offset of the instruction
-			   needs to be stored */
-			fprintf(outfile, "    jmp_offsets[%d] ="
-				"%ld + (gen_code_ptr - gen_code_buf);\n",
-				n, code_offset);
-			continue;
-		    }
-		    get_reloc_expr(name, sizeof(name), sym_name);
-		    type = ELF64_R_TYPE(rel->r_info);
-		    addend = rel->r_addend;
-		    switch(type) {
-		      case R_IA64_IMM64:
-			  fprintf(outfile,
-				  "    ia64_imm64(gen_code_ptr + %ld, "
-				  "%s + %ld);\n",
-				  code_offset, name, addend);
-			  break;
-		      case R_IA64_LTOFF22X:
-		      case R_IA64_LTOFF22:
-			  fprintf(outfile, "    IA64_LTOFF(gen_code_ptr + %ld,"
-				  " %s + %ld, %d);\n",
-				  code_offset, name, addend,
-				  (type == R_IA64_LTOFF22X));
-			  break;
-		      case R_IA64_LDXMOV:
-			  fprintf(outfile,
-				  "    ia64_ldxmov(gen_code_ptr + %ld,"
-				  " %s + %ld);\n", code_offset, name, addend);
-			  break;
-
-		      case R_IA64_PCREL21B:
-			  if (strstart(sym_name, "__op_gen_label", NULL)) {
-			      fprintf(outfile,
-				      "    ia64_imm21b(gen_code_ptr + %ld,"
-				      " (long) (%s + %ld -\n\t\t"
-				      "((long) gen_code_ptr + %ld)) >> 4);\n",
-				      code_offset, name, addend,
-				      code_offset & ~0xfUL);
-			  } else {
-			      fprintf(outfile,
-				      "    IA64_PLT(gen_code_ptr + %ld, "
-				      "%d);\t/* %s + %ld */\n",
-				      code_offset,
-				      get_plt_index(sym_name, addend),
-				      sym_name, addend);
-			  }
-			  break;
-		      default:
-			  error("unsupported ia64 relocation (0x%x)",
-				type);
-		    }
-                }
-		fprintf(outfile, "    ia64_nop_b(gen_code_ptr + %d);\n",
-			copy_size - 16 + 2);
-            }
-#elif defined(HOST_SPARC)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                    if (rel->r_offset >= start_offset &&
-			rel->r_offset < start_offset + copy_size) {
-                        sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name;
-                        get_reloc_expr(name, sizeof(name), sym_name);
-                        type = ELF32_R_TYPE(rel->r_info);
-                        addend = rel->r_addend;
-                        reloc_offset = rel->r_offset - start_offset;
-                        switch(type) {
-                        case R_SPARC_32:
-                            fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                    reloc_offset, name, addend);
-			    break;
-			case R_SPARC_HI22:
-                            fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3fffff) "
-				    " | (((%s + %d) >> 10) & 0x3fffff);\n",
-                                    reloc_offset, reloc_offset, name, addend);
-			    break;
-			case R_SPARC_LO10:
-                            fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3ff) "
-				    " | ((%s + %d) & 0x3ff);\n",
-                                    reloc_offset, reloc_offset, name, addend);
-			    break;
-			case R_SPARC_WDISP30:
-			    fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3fffffff) "
-				    " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) "
-				    "    & 0x3fffffff);\n",
-				    reloc_offset, reloc_offset, name, addend,
-				    reloc_offset);
-			    break;
-                        case R_SPARC_WDISP22:
-                            fprintf(outfile,
-                                    "    *(uint32_t *)(gen_code_ptr + %d) = "
-                                    "((*(uint32_t *)(gen_code_ptr + %d)) "
-                                    " & ~0x3fffff) "
-                                    " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) "
-                                    "    & 0x3fffff);\n",
-                                    rel->r_offset - start_offset,
-                                    rel->r_offset - start_offset,
-                                    name, addend,
-                                    rel->r_offset - start_offset);
-                            break;
-                        default:
-                            error("unsupported sparc relocation (%d)", type);
-                        }
-                    }
-                }
-            }
-#elif defined(HOST_SPARC64)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                    if (rel->r_offset >= start_offset &&
-			rel->r_offset < start_offset + copy_size) {
-                        sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;
-                        get_reloc_expr(name, sizeof(name), sym_name);
-                        type = ELF32_R_TYPE(rel->r_info);
-                        addend = rel->r_addend;
-                        reloc_offset = rel->r_offset - start_offset;
-                        switch(type) {
-                        case R_SPARC_32:
-                            fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
-                                    reloc_offset, name, addend);
-			    break;
-			case R_SPARC_HI22:
-                            fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3fffff) "
-				    " | (((%s + %d) >> 10) & 0x3fffff);\n",
-                                    reloc_offset, reloc_offset, name, addend);
-			    break;
-			case R_SPARC_LO10:
-                            fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3ff) "
-				    " | ((%s + %d) & 0x3ff);\n",
-                                    reloc_offset, reloc_offset, name, addend);
-			    break;
-                        case R_SPARC_OLO10:
-                            addend += ELF64_R_TYPE_DATA (rel->r_info);
-                            fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3ff) "
-				    " | ((%s + %d) & 0x3ff);\n",
-                                    reloc_offset, reloc_offset, name, addend);
-			    break;
-			case R_SPARC_WDISP30:
-			    fprintf(outfile,
-				    "    *(uint32_t *)(gen_code_ptr + %d) = "
-				    "((*(uint32_t *)(gen_code_ptr + %d)) "
-				    " & ~0x3fffffff) "
-				    " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) "
-				    "    & 0x3fffffff);\n",
-				    reloc_offset, reloc_offset, name, addend,
-				    reloc_offset);
-			    break;
-                        case R_SPARC_WDISP22:
-                            fprintf(outfile,
-                                    "    *(uint32_t *)(gen_code_ptr + %d) = "
-                                    "((*(uint32_t *)(gen_code_ptr + %d)) "
-                                    " & ~0x3fffff) "
-                                    " | ((((%s + %d) - (long)(gen_code_ptr + %d))>>2) "
-                                    "    & 0x3fffff);\n",
-                                    reloc_offset, reloc_offset, name, addend,
-				    reloc_offset);
-                            break;
-                        default:
-			    error("unsupported sparc64 relocation (%d) for symbol %s", type, name);
-                        }
-                    }
-                }
-            }
-#elif defined(HOST_ARM)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-                uint32_t insn;
-
-                insn = get32((uint32_t *)(p_start + 4));
-                /* If prologue ends in sub sp, sp, #const then assume
-                   op has a stack frame and needs the frame pointer.  */
-                if ((insn & 0xffffff00) == 0xe24dd000) {
-                    int i;
-                    uint32_t opcode;
-                    opcode = 0xe28db000; /* add fp, sp, #0.  */
-#if 0
-/* ??? Need to undo the extra stack adjustment at the end of the op.
-   For now just leave the stack misaligned and hope it doesn't break anything
-   too important.  */
-                    if ((insn & 4) != 0) {
-                        /* Preserve doubleword stack alignment.  */
-                        fprintf(outfile,
-                                "    *(uint32_t *)(gen_code_ptr + 4)= 0x%x;\n",
-                                insn + 4);
-                        opcode -= 4;
-                    }
-#endif
-                    insn = get32((uint32_t *)(p_start - 4));
-                    /* Calculate the size of the saved registers,
-                       excluding pc.  */
-                    for (i = 0; i < 15; i++) {
-                        if (insn & (1 << i))
-                            opcode += 4;
-                    }
-                    fprintf(outfile,
-                            "    *(uint32_t *)gen_code_ptr = 0x%x;\n", opcode);
-                }
-                arm_emit_ldr_info(name, start_offset, outfile, p_start, p_end,
-                                  relocs, nb_relocs);
-
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                if (rel->r_offset >= start_offset &&
-		    rel->r_offset < start_offset + copy_size) {
-                    sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-                    /* the compiler leave some unnecessary references to the code */
-                    if (sym_name[0] == '\0')
-                        continue;
-                    get_reloc_expr(name, sizeof(name), sym_name);
-                    type = ELF32_R_TYPE(rel->r_info);
-                    addend = get32((uint32_t *)(text + rel->r_offset));
-                    reloc_offset = rel->r_offset - start_offset;
-                    switch(type) {
-                    case R_ARM_ABS32:
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", 
-                                reloc_offset, name, addend);
-                        break;
-                    case R_ARM_PC24:
-                    case R_ARM_JUMP24:
-                    case R_ARM_CALL:
-                        fprintf(outfile, "    arm_reloc_pc24((uint32_t *)(gen_code_ptr + %d), 0x%x, %s);\n", 
-                                reloc_offset, addend, name);
-                        break;
-                    default:
-                        error("unsupported arm relocation (%d)", type);
-                    }
-                }
-                }
-            }
-#elif defined(HOST_M68K)
-            {
-                char name[256];
-                int type;
-                int addend;
-                int reloc_offset;
-		Elf32_Sym *sym;
-                for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-                if (rel->r_offset >= start_offset &&
-		    rel->r_offset < start_offset + copy_size) {
-		    sym = &(symtab[ELFW(R_SYM)(rel->r_info)]);
-                    sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
-                    get_reloc_expr(name, sizeof(name), sym_name);
-                    type = ELF32_R_TYPE(rel->r_info);
-                    addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend;
-                    reloc_offset = rel->r_offset - start_offset;
-                    switch(type) {
-                    case R_68K_32:
-		        fprintf(outfile, "    /* R_68K_32 RELOC, offset %x */\n", rel->r_offset) ;
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s + %#x;\n", 
-                                reloc_offset, name, addend );
-                        break;
-                    case R_68K_PC32:
-		        fprintf(outfile, "    /* R_68K_PC32 RELOC, offset %x */\n", rel->r_offset);
-                        fprintf(outfile, "    *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %#x) + %#x;\n", 
-                                reloc_offset, name, reloc_offset, /*sym->st_value+*/ addend);
-                        break;
-                    default:
-                        error("unsupported m68k relocation (%d)", type);
-                    }
-                }
-                }
-            }
-#else
-#error unsupported CPU
-#endif
-        fprintf(outfile, "    gen_code_ptr += %d;\n", copy_size);
-        fprintf(outfile, "}\n");
-        fprintf(outfile, "break;\n\n");
-    } else {
-        fprintf(outfile, "static inline void gen_%s(", name);
-        if (nb_args == 0) {
-            fprintf(outfile, "void");
-        } else {
-            for(i = 0; i < nb_args; i++) {
-                if (i != 0)
-                    fprintf(outfile, ", ");
-                fprintf(outfile, "long param%d", i + 1);
-            }
-        }
-        fprintf(outfile, ")\n");
-        fprintf(outfile, "{\n");
-        for(i = 0; i < nb_args; i++) {
-            fprintf(outfile, "    *gen_opparam_ptr++ = param%d;\n", i + 1);
-        }
-        fprintf(outfile, "    *gen_opc_ptr++ = INDEX_%s;\n", name);
-        fprintf(outfile, "}\n\n");
-    }
-}
-
-int gen_file(FILE *outfile, int out_type)
-{
-    int i;
-    EXE_SYM *sym;
-
-    if (out_type == OUT_INDEX_OP) {
-        fprintf(outfile, "DEF(end, 0, 0)\n");
-        fprintf(outfile, "DEF(nop, 0, 0)\n");
-        fprintf(outfile, "DEF(nop1, 1, 0)\n");
-        fprintf(outfile, "DEF(nop2, 2, 0)\n");
-        fprintf(outfile, "DEF(nop3, 3, 0)\n");
-        for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-            const char *name;
-            name = get_sym_name(sym);
-            if (strstart(name, OP_PREFIX, NULL)) {
-                gen_code(name, sym->st_value, sym->st_size, outfile, 2);
-            }
-        }
-    } else if (out_type == OUT_GEN_OP) {
-        /* generate gen_xxx functions */
-        fprintf(outfile, "#include \"dyngen-op.h\"\n");
-        for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-            const char *name;
-            name = get_sym_name(sym);
-            if (strstart(name, OP_PREFIX, NULL)) {
-#if defined(CONFIG_FORMAT_ELF) || defined(CONFIG_FORMAT_COFF)
-                if (sym->st_shndx != text_shndx)
-                    error("invalid section for opcode (0x%x)", sym->st_shndx);
-#endif
-                gen_code(name, sym->st_value, sym->st_size, outfile, 0);
-            }
-        }
-        
-    } else {
-        /* generate big code generation switch */
-
-#ifdef HOST_ARM
-        /* We need to know the size of all the ops so we can figure out when
-           to emit constant pools.  This must be consistent with opc.h.  */
-fprintf(outfile,
-"static const uint32_t arm_opc_size[] = {\n"
-"  0,\n" /* end */
-"  0,\n" /* nop */
-"  0,\n" /* nop1 */
-"  0,\n" /* nop2 */
-"  0,\n"); /* nop3 */
-        for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-            const char *name;
-            name = get_sym_name(sym);
-            if (strstart(name, OP_PREFIX, NULL)) {
-                fprintf(outfile, "  %d,\n", sym->st_size);
-            }
-	}
-fprintf(outfile,
-"};\n");
-#endif
-
-fprintf(outfile,
-"int dyngen_code(uint8_t *gen_code_buf,\n"
-"                uint16_t *label_offsets, uint16_t *jmp_offsets,\n"
-"                const uint16_t *opc_buf, const uint32_t *opparam_buf, const long *gen_labels)\n"
-"{\n"
-"    uint8_t *gen_code_ptr;\n"
-"    const uint16_t *opc_ptr;\n"
-"    const uint32_t *opparam_ptr;\n");
-
-#ifdef HOST_ARM
-/* Arm is tricky because it uses constant pools for loading immediate values.
-   We assume (and require) each function is code followed by a constant pool.
-   All the ops are small so this should be ok.  For each op we figure
-   out how much "spare" range we have in the load instructions.  This allows
-   us to insert subsequent ops in between the op and the constant pool,
-   eliminating the neeed to jump around the pool.
-
-   We currently generate:
-   
-   [ For this example we assume merging would move op1_pool out of range.
-     In practice we should be able to combine many ops before the offset
-     limits are reached. ]
-   op1_code;
-   op2_code;
-   goto op3;
-   op2_pool;
-   op1_pool;
-op3:
-   op3_code;
-   ret;
-   op3_pool;
-
-   Ideally we'd put op1_pool before op2_pool, but that requires two passes.
- */
-fprintf(outfile,
-"    uint8_t *last_gen_code_ptr = gen_code_buf;\n"
-"    LDREntry *arm_ldr_ptr = arm_ldr_table;\n"
-"    uint32_t *arm_data_ptr = arm_data_table + ARM_LDR_TABLE_SIZE;\n"
-/* Initialise the parmissible pool offset to an arbitary large value.  */
-"    uint8_t *arm_pool_ptr = gen_code_buf + 0x1000000;\n");
-#endif
-#ifdef HOST_IA64
-    {
-	long addend, not_first = 0;
-	unsigned long sym_idx;
-	int index, max_index;
-	const char *sym_name;
-	EXE_RELOC *rel;
-
-	max_index = -1;
-	for (i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-	    sym_idx = ELF64_R_SYM(rel->r_info);
-	    sym_name = (strtab + symtab[sym_idx].st_name);
-	    if (strstart(sym_name, "__op_gen_label", NULL))
-		continue;
-	    if (ELF64_R_TYPE(rel->r_info) != R_IA64_PCREL21B)
-		continue;
-
-	    addend = rel->r_addend;
-	    index = get_plt_index(sym_name, addend);
-	    if (index <= max_index)
-		continue;
-	    max_index = index;
-	    fprintf(outfile, "    extern void %s(void);\n", sym_name);
-	}
-
-	fprintf(outfile,
-		"    struct ia64_fixup *plt_fixes = NULL, "
-		"*ltoff_fixes = NULL;\n"
-		"    static long plt_target[] = {\n\t");
-
-	max_index = -1;
-	for (i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
-	    sym_idx = ELF64_R_SYM(rel->r_info);
-	    sym_name = (strtab + symtab[sym_idx].st_name);
-	    if (strstart(sym_name, "__op_gen_label", NULL))
-		continue;
-	    if (ELF64_R_TYPE(rel->r_info) != R_IA64_PCREL21B)
-		continue;
-
-	    addend = rel->r_addend;
-	    index = get_plt_index(sym_name, addend);
-	    if (index <= max_index)
-		continue;
-	    max_index = index;
-
-	    if (not_first)
-		fprintf(outfile, ",\n\t");
-	    not_first = 1;
-	    if (addend)
-		fprintf(outfile, "(long) &%s + %ld", sym_name, addend);
-	    else
-		fprintf(outfile, "(long) &%s", sym_name);
-	}
-	fprintf(outfile, "\n    };\n"
-	    "    unsigned int plt_offset[%u] = { 0 };\n", max_index + 1);
-    }
-#endif
-
-fprintf(outfile,
-"\n"
-"    gen_code_ptr = gen_code_buf;\n"
-"    opc_ptr = opc_buf;\n"
-"    opparam_ptr = opparam_buf;\n");
-
-	/* Generate prologue, if needed. */ 
-
-fprintf(outfile,
-"    for(;;) {\n");
-
-#ifdef HOST_ARM
-/* Generate constant pool if needed */
-fprintf(outfile,
-"            if (gen_code_ptr + arm_opc_size[*opc_ptr] >= arm_pool_ptr) {\n"
-"                gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, "
-"arm_ldr_ptr, arm_data_ptr, arm_data_table + ARM_LDR_TABLE_SIZE, 1);\n"
-"                last_gen_code_ptr = gen_code_ptr;\n"
-"                arm_ldr_ptr = arm_ldr_table;\n"
-"                arm_data_ptr = arm_data_table + ARM_LDR_TABLE_SIZE;\n"
-"                arm_pool_ptr = gen_code_ptr + 0x1000000;\n"
-"            }\n");
-#endif
-
-fprintf(outfile,
-"        switch(*opc_ptr++) {\n");
-
-        for(i = 0, sym = symtab; i < nb_syms; i++, sym++) {
-            const char *name;
-            name = get_sym_name(sym);
-            if (strstart(name, OP_PREFIX, NULL)) {
-#if 0
-                printf("%4d: %s pos=0x%08x len=%d\n", 
-                       i, name, sym->st_value, sym->st_size);
-#endif
-#if defined(CONFIG_FORMAT_ELF) || defined(CONFIG_FORMAT_COFF)
-                if (sym->st_shndx != text_shndx)
-                    error("invalid section for opcode (0x%x)", sym->st_shndx);
-#endif
-                gen_code(name, sym->st_value, sym->st_size, outfile, 1);
-            }
-        }
-
-fprintf(outfile,
-"        case INDEX_op_nop:\n"
-"            break;\n"
-"        case INDEX_op_nop1:\n"
-"            opparam_ptr++;\n"
-"            break;\n"
-"        case INDEX_op_nop2:\n"
-"            opparam_ptr += 2;\n"
-"            break;\n"
-"        case INDEX_op_nop3:\n"
-"            opparam_ptr += 3;\n"
-"            break;\n"
-"        default:\n"
-"            goto the_end;\n"
-"        }\n");
-
-
-fprintf(outfile,
-"    }\n"
-" the_end:\n"
-);
-#ifdef HOST_IA64
-    fprintf(outfile,
-	    "    {\n"
-	    "      extern char code_gen_buffer[];\n"
-	    "      ia64_apply_fixes(&gen_code_ptr, ltoff_fixes, "
-	    "(uint64_t) code_gen_buffer + 2*(1<<20), plt_fixes,\n\t\t\t"
-	    "sizeof(plt_target)/sizeof(plt_target[0]),\n\t\t\t"
-	    "plt_target, plt_offset);\n    }\n");
-#endif
-
-/* generate some code patching */ 
-#ifdef HOST_ARM
-fprintf(outfile,
-"if (arm_data_ptr != arm_data_table + ARM_LDR_TABLE_SIZE)\n"
-"    gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, "
-"arm_ldr_ptr, arm_data_ptr, arm_data_table + ARM_LDR_TABLE_SIZE, 0);\n");
-#endif
-    /* flush instruction cache */
-    fprintf(outfile, "flush_icache_range((unsigned long)gen_code_buf, (unsigned long)gen_code_ptr);\n");
-
-    fprintf(outfile, "return gen_code_ptr -  gen_code_buf;\n");
-    fprintf(outfile, "}\n\n");
-
-    }
-
-    return 0;
-}
-
-void usage(void)
-{
-    printf("dyngen (c) 2003 Fabrice Bellard\n"
-           "usage: dyngen [-o outfile] [-c] objfile\n"
-           "Generate a dynamic code generator from an object file\n"
-           "-c     output enum of operations\n"
-           "-g     output gen_op_xx() functions\n"
-           );
-    exit(1);
-}
-
-int main(int argc, char **argv)
-{
-    int c, out_type;
-    const char *filename, *outfilename;
-    FILE *outfile;
-
-    outfilename = "out.c";
-    out_type = OUT_CODE;
-    for(;;) {
-        c = getopt(argc, argv, "ho:cg");
-        if (c == -1)
-            break;
-        switch(c) {
-        case 'h':
-            usage();
-            break;
-        case 'o':
-            outfilename = optarg;
-            break;
-        case 'c':
-            out_type = OUT_INDEX_OP;
-            break;
-        case 'g':
-            out_type = OUT_GEN_OP;
-            break;
-        }
-    }
-    if (optind >= argc)
-        usage();
-    filename = argv[optind];
-    outfile = fopen(outfilename, "w");
-    if (!outfile)
-        error("could not open '%s'", outfilename);
-
-    load_object(filename);
-    gen_file(outfile, out_type);
-    fclose(outfile);
-    return 0;
-}
-
-/* bird added: */
-/*
- * Local Variables:
- *  mode: c
- *  c-file-style: k&r
- *  c-basic-offset: 4
- *  tab-width: 4
- *  indent-tabs-mode: t
- * End:
- */
-
Index: /trunk/src/recompiler_new/exec-all.h
===================================================================
--- /trunk/src/recompiler_new/exec-all.h	(revision 13730)
+++ /trunk/src/recompiler_new/exec-all.h	(revision 13731)
@@ -348,5 +348,5 @@
 #if !defined(CONFIG_USER_ONLY)
 
-void tlb_fill(target_ulong addr, int is_write, int is_user,
+void tlb_fill(target_ulong addr, int is_write, int mmu_idx,
               void *retaddr);
 
@@ -391,51 +391,35 @@
    is the offset relative to phys_ram_base */
 #ifndef VBOX
-static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr)
-#else
-DECLINLINE(target_ulong) get_phys_addr_code(CPUState *env, target_ulong addr)
-#endif
-{
-    int is_user, index, pd;
-
-    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-#if defined(TARGET_I386)
-    is_user = ((env->hflags & HF_CPL_MASK) == 3);
-#elif defined (TARGET_PPC)
-    is_user = msr_pr;
-#elif defined (TARGET_MIPS)
-    is_user = ((env->hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_UM);
-#elif defined (TARGET_SPARC)
-    is_user = (env->psrs == 0);
-#elif defined (TARGET_ARM)
-    is_user = ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR);
-#elif defined (TARGET_SH4)
-    is_user = ((env->sr & SR_MD) == 0);
-#else
-#error unimplemented CPU
-#endif
-#ifndef VBOX
-    if (__builtin_expect(env->tlb_table[is_user][index].addr_code !=
-                         (addr & TARGET_PAGE_MASK), 0)) {
-#else
-    if (RT_UNLIKELY(env->tlb_table[is_user][index].addr_code !=
-                         (addr & TARGET_PAGE_MASK))) {
-#endif
+static inline target_ulong get_phys_addr_code(CPUState *env1, target_ulong addr)
+#else
+DECLINLINE(target_ulong) get_phys_addr_code(CPUState *env1, target_ulong addr)
+#endif
+{
+    int mmu_idx, page_index, pd;
+
+    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    mmu_idx = cpu_mmu_index(env1);
+    if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code !=
+                 (addr & TARGET_PAGE_MASK))) {
         ldub_code(addr);
     }
-    pd = env->tlb_table[is_user][index].addr_code & ~TARGET_PAGE_MASK;
+    pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
     if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
 # ifdef VBOX
         /* deal with non-MMIO access handlers. */
-        return remR3PhysGetPhysicalAddressCode(env, addr, &env->tlb_table[is_user][index]);
+        return remR3PhysGetPhysicalAddressCode(env1, addr, &env1->tlb_table[mmu_idx][page_index]);
+# elif defined(TARGET_SPARC) || defined(TARGET_MIPS)
+        do_unassigned_access(addr, 0, 1, 0, 4);
+#else
+        cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
+#endif
+    }
+
+# if defined(VBOX) && defined(REM_PHYS_ADDR_IN_TLB)
+    return addr + env1->tlb_table[mmu_idx][page_index].addend;
+# elif defined(VBOX)
+    return remR3HCVirt2GCPhys(env, (void *)(addr + env1->tlb_table[mmu_idx][page_index].addend));
 # else
-        cpu_abort(env, "Trying to execute code outside RAM or ROM at 0x%08lx\n", addr);
-# endif
-    }
-# if defined(VBOX) && defined(REM_PHYS_ADDR_IN_TLB)
-    return addr + env->tlb_table[is_user][index].addend;
-# elif defined(VBOX)
-    return remR3HCVirt2GCPhys(env, (void *)(addr + env->tlb_table[is_user][index].addend));
-# else
-    return addr + env->tlb_table[is_user][index].addend - (unsigned long)phys_ram_base;
+    return addr + env1->tlb_table[mmu_idx][page_index].addend - (unsigned long)phys_ram_base;
 # endif
 }
Index: /trunk/src/recompiler_new/exec.c
===================================================================
--- /trunk/src/recompiler_new/exec.c	(revision 13730)
+++ /trunk/src/recompiler_new/exec.c	(revision 13731)
@@ -2299,5 +2299,5 @@
 int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
                       target_phys_addr_t paddr, int prot,
-                      int is_user, int is_softmmu)
+                      int mmu_idx, int is_softmmu)
 {
     return 0;
Index: /trunk/src/recompiler_new/osdep.h
===================================================================
--- /trunk/src/recompiler_new/osdep.h	(revision 13730)
+++ /trunk/src/recompiler_new/osdep.h	(revision 13731)
@@ -30,4 +30,9 @@
 # define NULL 0
 #endif
+
+#define fflush(file)            RTLogFlush(NULL)
+#define printf(...)             LogIt(LOG_INSTANCE, 0, LOG_GROUP_REM_PRINTF, (__VA_ARGS__))
+#define fprintf(logfile, ...)   LogIt(LOG_INSTANCE, 0, LOG_GROUP_REM_PRINTF, (__VA_ARGS__))
+
 
 #else /* !VBOX */
Index: /trunk/src/recompiler_new/softmmu_header.h
===================================================================
--- /trunk/src/recompiler_new/softmmu_header.h	(revision 13730)
+++ /trunk/src/recompiler_new/softmmu_header.h	(revision 13731)
@@ -81,29 +81,93 @@
 
 #if (DATA_SIZE <= 4) && (TARGET_LONG_BITS == 32) && defined(__i386__) && \
-    (ACCESS_TYPE < NB_MMU_MODES) && defined(ASM_SOFTMMU)
-
-#ifdef VBOX
-/* generic store macro */
-
-DELCINLINE(void) glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE v)
-{
-    int index;
-    target_ulong addr;
-    unsigned long physaddr;
-    int is_user;
-
-    addr = ptr;
-    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-    is_user = CPU_MMU_INDEX;
-    if (__builtin_expect(env->tlb_table[is_user][index].addr_write != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))), 0)) {
-        glue(glue(__st, SUFFIX), MMUSUFFIX)(addr, v, is_user);
-    } else {
-        physaddr = addr + env->tlb_table[is_user][index].addend;
-        glue(glue(st, SUFFIX), _raw)((uint8_t *)physaddr, v);
-    }
-}
-
-#else /* !VBOX */
+    (ACCESS_TYPE < NB_MMU_MODES) && defined(ASM_SOFTMMU) && !defined(VBOX)
+
+static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(target_ulong ptr)
+{
+    int res;
+
+    asm volatile ("movl %1, %%edx\n"
+                  "movl %1, %%eax\n"
+                  "shrl %3, %%edx\n"
+                  "andl %4, %%eax\n"
+                  "andl %2, %%edx\n"
+                  "leal %5(%%edx, %%ebp), %%edx\n"
+                  "cmpl (%%edx), %%eax\n"
+                  "movl %1, %%eax\n"
+                  "je 1f\n"
+                  "movl %6, %%edx\n"
+                  "call %7\n"
+                  "movl %%eax, %0\n"
+                  "jmp 2f\n"
+                  "1:\n"
+                  "addl 12(%%edx), %%eax\n"
+#if DATA_SIZE == 1
+                  "movzbl (%%eax), %0\n"
+#elif DATA_SIZE == 2
+                  "movzwl (%%eax), %0\n"
+#elif DATA_SIZE == 4
+                  "movl (%%eax), %0\n"
+#else
+#error unsupported size
+#endif
+                  "2:\n"
+                  : "=r" (res)
+                  : "r" (ptr),
+                  "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS),
+                  "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS),
+                  "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
+                  "m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)),
+                  "i" (CPU_MMU_INDEX),
+                  "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX))
+                  : "%eax", "%ecx", "%edx", "memory", "cc");
+    return res;
+}
+
+#if DATA_SIZE <= 2
+static inline int glue(glue(lds, SUFFIX), MEMSUFFIX)(target_ulong ptr)
+{
+    int res;
+
+    asm volatile ("movl %1, %%edx\n"
+                  "movl %1, %%eax\n"
+                  "shrl %3, %%edx\n"
+                  "andl %4, %%eax\n"
+                  "andl %2, %%edx\n"
+                  "leal %5(%%edx, %%ebp), %%edx\n"
+                  "cmpl (%%edx), %%eax\n"
+                  "movl %1, %%eax\n"
+                  "je 1f\n"
+                  "movl %6, %%edx\n"
+                  "call %7\n"
+#if DATA_SIZE == 1
+                  "movsbl %%al, %0\n"
+#elif DATA_SIZE == 2
+                  "movswl %%ax, %0\n"
+#else
+#error unsupported size
+#endif
+                  "jmp 2f\n"
+                  "1:\n"
+                  "addl 12(%%edx), %%eax\n"
+#if DATA_SIZE == 1
+                  "movsbl (%%eax), %0\n"
+#elif DATA_SIZE == 2
+                  "movswl (%%eax), %0\n"
+#else
+#error unsupported size
+#endif
+                  "2:\n"
+                  : "=r" (res)
+                  : "r" (ptr),
+                  "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS),
+                  "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS),
+                  "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
+                  "m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)),
+                  "i" (CPU_MMU_INDEX),
+                  "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX))
+                  : "%eax", "%ecx", "%edx", "memory", "cc");
+    return res;
+}
+#endif
 
 static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE v)
@@ -127,7 +191,6 @@
 #error unsupported size
 #endif
-                  "pushl %6\n"
+                  "movl %6, %%ecx\n"
                   "call %7\n"
-                  "popl %%eax\n"
                   "jmp 2f\n"
                   "1:\n"
@@ -143,11 +206,13 @@
 #endif
                   "2:\n"
-                  : 
-                  : "r" (ptr), 
-/* NOTE: 'q' would be needed as constraint, but we could not use it
-   with T1 ! */
-                  "r" (v), 
-                  "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS), 
-                  "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), 
+                  :
+                  : "r" (ptr),
+#if DATA_SIZE == 1
+                  "q" (v),
+#else
+                  "r" (v),
+#endif
+                  "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS),
+                  "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS),
                   "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
                   "m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_write)),
@@ -156,6 +221,4 @@
                   : "%eax", "%ecx", "%edx", "memory", "cc");
 }
-#endif /* !VBOX */
-
 #else
 
@@ -168,23 +231,19 @@
 #endif
 {
-    int index;
+
+    int page_index;
     RES_TYPE res;
     target_ulong addr;
     unsigned long physaddr;
-    int is_user;
+    int mmu_idx;
 
     addr = ptr;
-    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-    is_user = CPU_MMU_INDEX;
-#ifndef VBOX
-    if (__builtin_expect(env->tlb_table[is_user][index].ADDR_READ != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))), 0)) {
-#else
-    if  (RT_UNLIKELY(env->tlb_table[is_user][index].ADDR_READ != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
-#endif
-        res = glue(glue(__ld, SUFFIX), MMUSUFFIX)(addr, is_user);
+    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    mmu_idx = CPU_MMU_INDEX;
+    if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ !=
+                 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
+        res = glue(glue(__ld, SUFFIX), MMUSUFFIX)(addr, mmu_idx);
     } else {
-        physaddr = addr + env->tlb_table[is_user][index].addend;
+        physaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
         res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)physaddr);
     }
@@ -199,22 +258,17 @@
 #endif
 {
-    int res, index;
+    int res, page_index;
     target_ulong addr;
     unsigned long physaddr;
-    int is_user;
+    int mmu_idx;
 
     addr = ptr;
-    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-    is_user = CPU_MMU_INDEX;
-#ifndef VBOX
-    if (__builtin_expect(env->tlb_table[is_user][index].ADDR_READ != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))), 0)) {
-#else
-    if (RT_UNLIKELY(env->tlb_table[is_user][index].ADDR_READ != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
-#endif
-        res = (DATA_STYPE)glue(glue(__ld, SUFFIX), MMUSUFFIX)(addr, is_user);
+    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    mmu_idx = CPU_MMU_INDEX;
+    if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ !=
+                 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
+        res = (DATA_STYPE)glue(glue(__ld, SUFFIX), MMUSUFFIX)(addr, mmu_idx);
     } else {
-        physaddr = addr + env->tlb_table[is_user][index].addend;
+        physaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
         res = glue(glue(lds, SUFFIX), _raw)((uint8_t *)physaddr);
     }
@@ -232,22 +286,17 @@
 #endif
 {
-    int index;
+    int page_index;
     target_ulong addr;
     unsigned long physaddr;
-    int is_user;
+    int mmu_idx;
 
     addr = ptr;
-    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
-    is_user = CPU_MMU_INDEX;
-#ifndef VBOX
-    if (__builtin_expect(env->tlb_table[is_user][index].addr_write != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))), 0)) {
-#else
-    if (RT_UNLIKELY(env->tlb_table[is_user][index].addr_write != 
-                         (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
-#endif
-        glue(glue(__st, SUFFIX), MMUSUFFIX)(addr, v, is_user);
+    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+    mmu_idx = CPU_MMU_INDEX;
+    if (unlikely(env->tlb_table[mmu_idx][page_index].addr_write !=
+                 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
+        glue(glue(__st, SUFFIX), MMUSUFFIX)(addr, v, mmu_idx);
     } else {
-        physaddr = addr + env->tlb_table[is_user][index].addend;
+        physaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
         glue(glue(st, SUFFIX), _raw)((uint8_t *)physaddr, v);
     }
Index: /trunk/src/recompiler_new/softmmu_template.h
===================================================================
--- /trunk/src/recompiler_new/softmmu_template.h	(revision 13730)
+++ /trunk/src/recompiler_new/softmmu_template.h	(revision 13731)
@@ -57,6 +57,6 @@
 #endif
 
-static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr, 
-                                                        int is_user,
+static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
+                                                        int mmu_idx,
                                                         void *retaddr);
 #ifndef VBOX
@@ -207,5 +207,5 @@
 static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(target_ulong addr, 
                                                    DATA_TYPE val, 
-                                                   int is_user,
+                                                   int mmu_idx,
                                                    void *retaddr);
 
@@ -299,5 +299,4 @@
 }
 
-/* handles all unaligned cases */
 /* handles all unaligned cases */
 static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(target_ulong addr,
Index: /trunk/src/recompiler_new/target-i386/cpu.h
===================================================================
--- /trunk/src/recompiler_new/target-i386/cpu.h	(revision 13730)
+++ /trunk/src/recompiler_new/target-i386/cpu.h	(revision 13731)
@@ -635,5 +635,4 @@
     uint32_t smbase;
     int old_exception;  /* exception in flight */
-  
 
     CPU_COMMON
Index: unk/src/recompiler_new/target-i386/op.c
===================================================================
--- /trunk/src/recompiler_new/target-i386/op.c	(revision 13730)
+++ 	(revision )
@@ -1,2595 +1,0 @@
-/*
- *  i386 micro operations
- * 
- *  Copyright (c) 2003 Fabrice Bellard
- *
- * This 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 of the License, or (at your option) any later version.
- *
- * This 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 this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * Sun LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
- * other than GPL or LGPL is available it will apply instead, Sun elects to use only
- * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
- * a choice of LGPL license versions is made available with the language indicating
- * that LGPLv2 or any later version may be used, or where a choice of which version
- * of the LGPL is applied is otherwise unspecified.
- */
-
-#define ASM_SOFTMMU
-#include "exec.h"
-
-/* n must be a constant to be efficient */
-static inline target_long lshift(target_long x, int n)
-{
-    if (n >= 0)
-        return x << n;
-    else
-        return x >> (-n);
-}
-
-/* we define the various pieces of code used by the JIT */
-
-#define REG EAX
-#define REGNAME _EAX
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG ECX
-#define REGNAME _ECX
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG EDX
-#define REGNAME _EDX
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG EBX
-#define REGNAME _EBX
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG ESP
-#define REGNAME _ESP
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG EBP
-#define REGNAME _EBP
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG ESI
-#define REGNAME _ESI
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG EDI
-#define REGNAME _EDI
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#ifdef TARGET_X86_64
-
-#define REG (env->regs[8])
-#define REGNAME _R8
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[9])
-#define REGNAME _R9
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[10])
-#define REGNAME _R10
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[11])
-#define REGNAME _R11
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[12])
-#define REGNAME _R12
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[13])
-#define REGNAME _R13
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[14])
-#define REGNAME _R14
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#define REG (env->regs[15])
-#define REGNAME _R15
-#include "opreg_template.h"
-#undef REG
-#undef REGNAME
-
-#endif
-
-/* operations with flags */
-
-/* update flags with T0 and T1 (add/sub case) */
-void OPPROTO op_update2_cc(void)
-{
-    CC_SRC = T1;
-    CC_DST = T0;
-}
-
-/* update flags with T0 (logic operation case) */
-void OPPROTO op_update1_cc(void)
-{
-    CC_DST = T0;
-}
-
-void OPPROTO op_update_neg_cc(void)
-{
-    CC_SRC = -T0;
-    CC_DST = T0;
-}
-
-void OPPROTO op_cmpl_T0_T1_cc(void)
-{
-    CC_SRC = T1;
-    CC_DST = T0 - T1;
-}
-
-void OPPROTO op_update_inc_cc(void)
-{
-    CC_SRC = cc_table[CC_OP].compute_c();
-    CC_DST = T0;
-}
-
-void OPPROTO op_testl_T0_T1_cc(void)
-{
-    CC_DST = T0 & T1;
-}
-
-/* operations without flags */
-
-void OPPROTO op_addl_T0_T1(void)
-{
-    T0 += T1;
-}
-
-void OPPROTO op_orl_T0_T1(void)
-{
-    T0 |= T1;
-}
-
-void OPPROTO op_andl_T0_T1(void)
-{
-    T0 &= T1;
-}
-
-void OPPROTO op_subl_T0_T1(void)
-{
-    T0 -= T1;
-}
-
-void OPPROTO op_xorl_T0_T1(void)
-{
-    T0 ^= T1;
-}
-
-void OPPROTO op_negl_T0(void)
-{
-    T0 = -T0;
-}
-
-void OPPROTO op_incl_T0(void)
-{
-    T0++;
-}
-
-void OPPROTO op_decl_T0(void)
-{
-    T0--;
-}
-
-void OPPROTO op_notl_T0(void)
-{
-    T0 = ~T0;
-}
-
-void OPPROTO op_bswapl_T0(void)
-{
-    T0 = bswap32(T0);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_bswapq_T0(void)
-{
-    helper_bswapq_T0();
-}
-#endif
-
-/* multiply/divide */
-
-/* XXX: add eflags optimizations */
-/* XXX: add non P4 style flags */
-
-void OPPROTO op_mulb_AL_T0(void)
-{
-    unsigned int res;
-    res = (uint8_t)EAX * (uint8_t)T0;
-    EAX = (EAX & ~0xffff) | res;
-    CC_DST = res;
-    CC_SRC = (res & 0xff00);
-}
-
-void OPPROTO op_imulb_AL_T0(void)
-{
-    int res;
-    res = (int8_t)EAX * (int8_t)T0;
-    EAX = (EAX & ~0xffff) | (res & 0xffff);
-    CC_DST = res;
-    CC_SRC = (res != (int8_t)res);
-}
-
-void OPPROTO op_mulw_AX_T0(void)
-{
-    unsigned int res;
-    res = (uint16_t)EAX * (uint16_t)T0;
-    EAX = (EAX & ~0xffff) | (res & 0xffff);
-    EDX = (EDX & ~0xffff) | ((res >> 16) & 0xffff);
-    CC_DST = res;
-    CC_SRC = res >> 16;
-}
-
-void OPPROTO op_imulw_AX_T0(void)
-{
-    int res;
-    res = (int16_t)EAX * (int16_t)T0;
-    EAX = (EAX & ~0xffff) | (res & 0xffff);
-    EDX = (EDX & ~0xffff) | ((res >> 16) & 0xffff);
-    CC_DST = res;
-    CC_SRC = (res != (int16_t)res);
-}
-
-void OPPROTO op_mull_EAX_T0(void)
-{
-    uint64_t res;
-    res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0);
-    EAX = (uint32_t)res;
-    EDX = (uint32_t)(res >> 32);
-    CC_DST = (uint32_t)res;
-    CC_SRC = (uint32_t)(res >> 32);
-}
-
-void OPPROTO op_imull_EAX_T0(void)
-{
-    int64_t res;
-    res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0);
-    EAX = (uint32_t)(res);
-    EDX = (uint32_t)(res >> 32);
-    CC_DST = res;
-    CC_SRC = (res != (int32_t)res);
-}
-
-void OPPROTO op_imulw_T0_T1(void)
-{
-    int res;
-    res = (int16_t)T0 * (int16_t)T1;
-    T0 = res;
-    CC_DST = res;
-    CC_SRC = (res != (int16_t)res);
-}
-
-void OPPROTO op_imull_T0_T1(void)
-{
-    int64_t res;
-    res = (int64_t)((int32_t)T0) * (int64_t)((int32_t)T1);
-    T0 = res;
-    CC_DST = res;
-    CC_SRC = (res != (int32_t)res);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_mulq_EAX_T0(void)
-{
-    helper_mulq_EAX_T0();
-}
-
-void OPPROTO op_imulq_EAX_T0(void)
-{
-    helper_imulq_EAX_T0();
-}
-
-void OPPROTO op_imulq_T0_T1(void)
-{
-    helper_imulq_T0_T1();
-}
-#endif
-
-/* division, flags are undefined */
-
-void OPPROTO op_divb_AL_T0(void)
-{
-    unsigned int num, den, q, r;
-
-    num = (EAX & 0xffff);
-    den = (T0 & 0xff);
-    if (den == 0) {
-        raise_exception(EXCP00_DIVZ);
-    }
-    q = (num / den);
-    if (q > 0xff)
-        raise_exception(EXCP00_DIVZ);
-    q &= 0xff;
-    r = (num % den) & 0xff;
-    EAX = (EAX & ~0xffff) | (r << 8) | q;
-}
-
-void OPPROTO op_idivb_AL_T0(void)
-{
-    int num, den, q, r;
-
-    num = (int16_t)EAX;
-    den = (int8_t)T0;
-    if (den == 0) {
-        raise_exception(EXCP00_DIVZ);
-    }
-    q = (num / den);
-    if (q != (int8_t)q)
-        raise_exception(EXCP00_DIVZ);
-    q &= 0xff;
-    r = (num % den) & 0xff;
-    EAX = (EAX & ~0xffff) | (r << 8) | q;
-}
-
-void OPPROTO op_divw_AX_T0(void)
-{
-    unsigned int num, den, q, r;
-
-    num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
-    den = (T0 & 0xffff);
-    if (den == 0) {
-        raise_exception(EXCP00_DIVZ);
-    }
-    q = (num / den);
-    if (q > 0xffff)
-        raise_exception(EXCP00_DIVZ);
-    q &= 0xffff;
-    r = (num % den) & 0xffff;
-    EAX = (EAX & ~0xffff) | q;
-    EDX = (EDX & ~0xffff) | r;
-}
-
-void OPPROTO op_idivw_AX_T0(void)
-{
-    int num, den, q, r;
-
-    num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
-    den = (int16_t)T0;
-    if (den == 0) {
-        raise_exception(EXCP00_DIVZ);
-    }
-    q = (num / den);
-    if (q != (int16_t)q)
-        raise_exception(EXCP00_DIVZ);
-    q &= 0xffff;
-    r = (num % den) & 0xffff;
-    EAX = (EAX & ~0xffff) | q;
-    EDX = (EDX & ~0xffff) | r;
-}
-
-void OPPROTO op_divl_EAX_T0(void)
-{
-    helper_divl_EAX_T0();
-}
-
-void OPPROTO op_idivl_EAX_T0(void)
-{
-    helper_idivl_EAX_T0();
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_divq_EAX_T0(void)
-{
-    helper_divq_EAX_T0();
-}
-
-void OPPROTO op_idivq_EAX_T0(void)
-{
-    helper_idivq_EAX_T0();
-}
-#endif
-
-/* constant load & misc op */
-
-/* XXX: consistent names */
-void OPPROTO op_movl_T0_imu(void)
-{
-    T0 = (uint32_t)PARAM1;
-}
-
-void OPPROTO op_movl_T0_im(void)
-{
-    T0 = (int32_t)PARAM1;
-}
-
-void OPPROTO op_addl_T0_im(void)
-{
-    T0 += PARAM1;
-}
-
-void OPPROTO op_andl_T0_ffff(void)
-{
-    T0 = T0 & 0xffff;
-}
-
-void OPPROTO op_andl_T0_im(void)
-{
-    T0 = T0 & PARAM1;
-}
-
-void OPPROTO op_movl_T0_T1(void)
-{
-    T0 = T1;
-}
-
-void OPPROTO op_movl_T1_imu(void)
-{
-    T1 = (uint32_t)PARAM1;
-}
-
-void OPPROTO op_movl_T1_im(void)
-{
-    T1 = (int32_t)PARAM1;
-}
-
-void OPPROTO op_addl_T1_im(void)
-{
-    T1 += PARAM1;
-}
-
-void OPPROTO op_movl_T1_A0(void)
-{
-    T1 = A0;
-}
-
-void OPPROTO op_movl_A0_im(void)
-{
-    A0 = (uint32_t)PARAM1;
-}
-
-void OPPROTO op_addl_A0_im(void)
-{
-    A0 = (uint32_t)(A0 + PARAM1);
-}
-
-void OPPROTO op_movl_A0_seg(void)
-{
-#ifdef VBOX
-    /** @todo Not very efficient, but the least invasive. */
-    /** @todo Pass segment register index as parameter in translate.c. */
-    uint32_t idx = (PARAM1 - offsetof(CPUX86State,segs[0].base)) / sizeof(SegmentCache);
-
-    if (env->segs[idx].newselector && !(env->eflags & VM_MASK)) {
-        sync_seg(env, idx, env->segs[idx].newselector);
-    }
-#if 0 /* breaks Solaris */
-    /* Loading a null selector into a segment register is valid, but using it is most definitely not! */
-    if (    (env->cr[0] & (CR0_PE_MASK|CR0_PG_MASK)) == (CR0_PE_MASK|CR0_PG_MASK)
-        &&  !(env->eflags & VM_MASK)
-        &&  env->segs[idx].selector == 0) {
-        raise_exception(EXCP0D_GPF);
-    }
-#endif
-    A0 = (uint32_t)env->segs[idx].base;
-    FORCE_RET();
-#else  /* !VBOX */
-    A0 = (uint32_t)*(target_ulong *)((char *)env + PARAM1);
-#endif /* !VBOX */
-}
-
-void OPPROTO op_addl_A0_seg(void)
-{
-#ifdef VBOX
-    uint32_t idx = (PARAM1 - offsetof(CPUX86State,segs[0].base)) / sizeof(SegmentCache);
-
-    if (env->segs[idx].newselector && !(env->eflags & VM_MASK)) {
-        sync_seg(env, idx, env->segs[idx].newselector);
-    }
-#if 0 /* breaks Solaris */
-    /* Loading a null selector into a segment register is valid, but using it is most definitely not! */
-    if (    (env->cr[0] & (CR0_PE_MASK|CR0_PG_MASK)) == (CR0_PE_MASK|CR0_PG_MASK)
-        &&  !(env->eflags & VM_MASK)
-        &&  env->segs[idx].selector == 0) {
-        raise_exception(EXCP0D_GPF);
-    }
-#endif
-    A0 = (uint32_t)(A0 + env->segs[idx].base);
-    FORCE_RET();
-#else  /* !VBOX */
-    A0 = (uint32_t)(A0 + *(target_ulong *)((char *)env + PARAM1));
-#endif /* !VBOX */
-}
-
-void OPPROTO op_addl_A0_AL(void)
-{
-    A0 = (uint32_t)(A0 + (EAX & 0xff));
-}
-
-#ifdef WORDS_BIGENDIAN
-typedef union UREG64 {
-    struct { uint16_t v3, v2, v1, v0; } w;
-    struct { uint32_t v1, v0; } l;
-    uint64_t q;
-} UREG64;
-#else
-typedef union UREG64 {
-    struct { uint16_t v0, v1, v2, v3; } w;
-    struct { uint32_t v0, v1; } l;
-    uint64_t q;
-} UREG64;
-#endif
-
-#ifdef TARGET_X86_64
-
-#define PARAMQ1 \
-({\
-    UREG64 __p;\
-    __p.l.v1 = PARAM1;\
-    __p.l.v0 = PARAM2;\
-    __p.q;\
-}) 
-
-void OPPROTO op_movq_T0_im64(void)
-{
-    T0 = PARAMQ1;
-}
-
-void OPPROTO op_movq_T1_im64(void)
-{
-    T1 = PARAMQ1;
-}
-
-void OPPROTO op_movq_A0_im(void)
-{
-    A0 = (int32_t)PARAM1;
-}
-
-void OPPROTO op_movq_A0_im64(void)
-{
-    A0 = PARAMQ1;
-}
-
-void OPPROTO op_addq_A0_im(void)
-{
-    A0 = (A0 + (int32_t)PARAM1);
-}
-
-void OPPROTO op_addq_A0_im64(void)
-{
-    A0 = (A0 + PARAMQ1);
-}
-
-void OPPROTO op_movq_A0_seg(void)
-{
-#ifdef VBOX
-    uint32_t idx = (PARAM1 - offsetof(CPUX86State,segs[0].base)) / sizeof(SegmentCache);
-
-    if (env->segs[idx].newselector && !(env->eflags & VM_MASK))
-        sync_seg(env, idx, env->segs[idx].newselector);
-    A0 = (target_ulong)env->segs[idx].base;
-#else  /* !VBOX */
-    A0 = *(target_ulong *)((char *)env + PARAM1);
-#endif /* !VBOX */
-}
-
-void OPPROTO op_addq_A0_seg(void)
-{
-#ifdef VBOX
-    uint32_t idx = (PARAM1 - offsetof(CPUX86State,segs[0].base)) / sizeof(SegmentCache);
-
-    if (env->segs[idx].newselector && !(env->eflags & VM_MASK))
-        sync_seg(env, idx, env->segs[idx].newselector);
-    A0 += (target_ulong)env->segs[idx].base;
-#else  /* !VBOX */
-    A0 += *(target_ulong *)((char *)env + PARAM1);
-#endif /* !VBOX */
-}
-
-void OPPROTO op_addq_A0_AL(void)
-{
-    A0 = (A0 + (EAX & 0xff));
-}
-
-#endif
-
-void OPPROTO op_andl_A0_ffff(void)
-{
-    A0 = A0 & 0xffff;
-}
-
-/* memory access */
-
-#define MEMSUFFIX _raw
-#include "ops_mem.h"
-
-#if !defined(CONFIG_USER_ONLY)
-#define MEMSUFFIX _kernel
-#include "ops_mem.h"
-
-#define MEMSUFFIX _user
-#include "ops_mem.h"
-#endif
-
-/* indirect jump */
-
-void OPPROTO op_jmp_T0(void)
-{
-    EIP = T0;
-}
-
-void OPPROTO op_movl_eip_im(void)
-{
-    EIP = (uint32_t)PARAM1;
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_movq_eip_im(void)
-{
-    EIP = (int32_t)PARAM1;
-}
-
-void OPPROTO op_movq_eip_im64(void)
-{
-    EIP = PARAMQ1;
-}
-#endif
-
-void OPPROTO op_hlt(void)
-{
-    helper_hlt();
-}
-
-void OPPROTO op_monitor(void)
-{
-    helper_monitor();
-}
-
-void OPPROTO op_mwait(void)
-{
-    helper_mwait();
-}
-
-void OPPROTO op_debug(void)
-{
-    env->exception_index = EXCP_DEBUG;
-    cpu_loop_exit();
-}
-
-void OPPROTO op_raise_interrupt(void)
-{
-    int intno, next_eip_addend;
-    intno = PARAM1;
-    next_eip_addend = PARAM2;
-    raise_interrupt(intno, 1, 0, next_eip_addend);
-}
-
-void OPPROTO op_raise_exception(void)
-{
-    int exception_index;
-    exception_index = PARAM1;
-    raise_exception(exception_index);
-}
-
-void OPPROTO op_into(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    if (eflags & CC_O) {
-        raise_interrupt(EXCP04_INTO, 1, 0, PARAM1);
-    }
-    FORCE_RET();
-}
-
-void OPPROTO op_cli(void)
-{
-    env->eflags &= ~IF_MASK;
-}
-
-void OPPROTO op_sti(void)
-{
-    env->eflags |= IF_MASK;
-}
-
-void OPPROTO op_set_inhibit_irq(void)
-{
-    env->hflags |= HF_INHIBIT_IRQ_MASK;
-}
-
-void OPPROTO op_reset_inhibit_irq(void)
-{
-    env->hflags &= ~HF_INHIBIT_IRQ_MASK;
-}
-
-void OPPROTO op_rsm(void)
-{
-    helper_rsm();
-}
-
-#ifndef VBOX 
-#if 0
-/* vm86plus instructions */
-void OPPROTO op_cli_vm(void)
-{
-    env->eflags &= ~VIF_MASK;
-}
-
-void OPPROTO op_sti_vm(void)
-{
-    env->eflags |= VIF_MASK;
-    if (env->eflags & VIP_MASK) {
-        EIP = PARAM1;
-        raise_exception(EXCP0D_GPF);
-    }
-    FORCE_RET();
-}
-#endif
-
-#else /* VBOX */
-void OPPROTO op_cli_vme(void)
-{
-    env->eflags &= ~VIF_MASK;
-}
-
-void OPPROTO op_sti_vme(void)
-{
-    /* First check, then change eflags according to the AMD manual */
-    if (env->eflags & VIP_MASK) {
-        raise_exception(EXCP0D_GPF);
-    }
-    env->eflags |= VIF_MASK;
-    FORCE_RET();
-}
-#endif /* VBOX */
-
-void OPPROTO op_boundw(void)
-{
-    int low, high, v;
-    low = ldsw(A0);
-    high = ldsw(A0 + 2);
-    v = (int16_t)T0;
-    if (v < low || v > high) {
-        raise_exception(EXCP05_BOUND);
-    }
-    FORCE_RET();
-}
-
-void OPPROTO op_boundl(void)
-{
-    int low, high, v;
-    low = ldl(A0);
-    high = ldl(A0 + 4);
-    v = T0;
-    if (v < low || v > high) {
-        raise_exception(EXCP05_BOUND);
-    }
-    FORCE_RET();
-}
-
-void OPPROTO op_cmpxchg8b(void)
-{
-    helper_cmpxchg8b();
-}
-
-void OPPROTO op_single_step(void)
-{
-    helper_single_step();
-}
-
-void OPPROTO op_movl_T0_0(void)
-{
-    T0 = 0;
-}
-
-#ifdef VBOX
-void OPPROTO op_check_external_event(void)
-{
-    if (    (env->interrupt_request & (  CPU_INTERRUPT_EXTERNAL_EXIT
-                                       | CPU_INTERRUPT_EXTERNAL_TIMER
-                                       | CPU_INTERRUPT_EXTERNAL_DMA))
-        ||  (   (env->interrupt_request & CPU_INTERRUPT_EXTERNAL_HARD)
-             && (env->eflags & IF_MASK)
-             && !(env->hflags & HF_INHIBIT_IRQ_MASK) ) )
-    {
-        helper_external_event();
-    }
-}
-
-void OPPROTO op_record_call(void)
-{
-    helper_record_call();
-}
-
-#endif /* VBOX */
-
-void OPPROTO op_exit_tb(void)
-{
-    EXIT_TB();
-}
-
-/* multiple size ops */
-
-#define ldul ldl
-
-#define SHIFT 0
-#include "ops_template.h"
-#undef SHIFT
-
-#define SHIFT 1
-#include "ops_template.h"
-#undef SHIFT
-
-#define SHIFT 2
-#include "ops_template.h"
-#undef SHIFT
-
-#ifdef TARGET_X86_64
-
-#define SHIFT 3
-#include "ops_template.h"
-#undef SHIFT
-
-#endif
-
-/* sign extend */
-
-void OPPROTO op_movsbl_T0_T0(void)
-{
-    T0 = (int8_t)T0;
-}
-
-void OPPROTO op_movzbl_T0_T0(void)
-{
-    T0 = (uint8_t)T0;
-}
-
-void OPPROTO op_movswl_T0_T0(void)
-{
-    T0 = (int16_t)T0;
-}
-
-void OPPROTO op_movzwl_T0_T0(void)
-{
-    T0 = (uint16_t)T0;
-}
-
-void OPPROTO op_movswl_EAX_AX(void)
-{
-    EAX = (uint32_t)((int16_t)EAX);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_movslq_T0_T0(void)
-{
-    T0 = (int32_t)T0;
-}
-
-void OPPROTO op_movslq_RAX_EAX(void)
-{
-    EAX = (int32_t)EAX;
-}
-#endif
-
-void OPPROTO op_movsbw_AX_AL(void)
-{
-    EAX = (EAX & ~0xffff) | ((int8_t)EAX & 0xffff);
-}
-
-void OPPROTO op_movslq_EDX_EAX(void)
-{
-    EDX = (uint32_t)((int32_t)EAX >> 31);
-}
-
-void OPPROTO op_movswl_DX_AX(void)
-{
-    EDX = (EDX & ~0xffff) | (((int16_t)EAX >> 15) & 0xffff);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_movsqo_RDX_RAX(void)
-{
-    EDX = (int64_t)EAX >> 63;
-}
-#endif
-
-/* string ops helpers */
-
-void OPPROTO op_addl_ESI_T0(void)
-{
-    ESI = (uint32_t)(ESI + T0);
-}
-
-void OPPROTO op_addw_ESI_T0(void)
-{
-    ESI = (ESI & ~0xffff) | ((ESI + T0) & 0xffff);
-}
-
-void OPPROTO op_addl_EDI_T0(void)
-{
-    EDI = (uint32_t)(EDI + T0);
-}
-
-void OPPROTO op_addw_EDI_T0(void)
-{
-    EDI = (EDI & ~0xffff) | ((EDI + T0) & 0xffff);
-}
-
-void OPPROTO op_decl_ECX(void)
-{
-    ECX = (uint32_t)(ECX - 1);
-}
-
-void OPPROTO op_decw_ECX(void)
-{
-    ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_addq_ESI_T0(void)
-{
-    ESI = (ESI + T0);
-}
-
-void OPPROTO op_addq_EDI_T0(void)
-{
-    EDI = (EDI + T0);
-}
-
-void OPPROTO op_decq_ECX(void)
-{
-    ECX--;
-}
-#endif
-
-/* push/pop utils */
-
-void op_addl_A0_SS(void)
-{
-    A0 = (uint32_t)(A0 + env->segs[R_SS].base);
-}
-
-void op_subl_A0_2(void)
-{
-    A0 = (uint32_t)(A0 - 2);
-}
-
-void op_subl_A0_4(void)
-{
-    A0 = (uint32_t)(A0 - 4);
-}
-
-void op_addl_ESP_4(void)
-{
-    ESP = (uint32_t)(ESP + 4);
-}
-
-void op_addl_ESP_2(void)
-{
-    ESP = (uint32_t)(ESP + 2);
-}
-
-void op_addw_ESP_4(void)
-{
-    ESP = (ESP & ~0xffff) | ((ESP + 4) & 0xffff);
-}
-
-void op_addw_ESP_2(void)
-{
-    ESP = (ESP & ~0xffff) | ((ESP + 2) & 0xffff);
-}
-
-void op_addl_ESP_im(void)
-{
-    ESP = (uint32_t)(ESP + PARAM1);
-}
-
-void op_addw_ESP_im(void)
-{
-    ESP = (ESP & ~0xffff) | ((ESP + PARAM1) & 0xffff);
-}
-
-#ifdef TARGET_X86_64
-void op_subq_A0_2(void)
-{
-    A0 -= 2;
-}
-
-void op_subq_A0_8(void)
-{
-    A0 -= 8;
-}
-
-void op_addq_ESP_8(void)
-{
-    ESP += 8;
-}
-
-void op_addq_ESP_im(void)
-{
-    ESP += PARAM1;
-}
-#endif
-
-void OPPROTO op_rdtsc(void)
-{
-    helper_rdtsc();
-}
-
-void OPPROTO op_cpuid(void)
-{
-    helper_cpuid();
-}
-
-void OPPROTO op_enter_level(void)
-{
-    helper_enter_level(PARAM1, PARAM2);
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_enter64_level(void)
-{
-    helper_enter64_level(PARAM1, PARAM2);
-}
-#endif
-
-void OPPROTO op_sysenter(void)
-{
-    helper_sysenter();
-}
-
-void OPPROTO op_sysexit(void)
-{
-    helper_sysexit();
-}
-
-#ifdef TARGET_X86_64
-void OPPROTO op_syscall(void)
-{
-    helper_syscall(PARAM1);
-}
-
-void OPPROTO op_sysret(void)
-{
-    helper_sysret(PARAM1);
-}
-#endif
-
-void OPPROTO op_rdmsr(void)
-{
-    helper_rdmsr();
-}
-
-void OPPROTO op_wrmsr(void)
-{
-    helper_wrmsr();
-}
-
-/* bcd */
-
-/* XXX: exception */
-void OPPROTO op_aam(void)
-{
-    int base = PARAM1;
-    int al, ah;
-    al = EAX & 0xff;
-    ah = al / base;
-    al = al % base;
-    EAX = (EAX & ~0xffff) | al | (ah << 8);
-    CC_DST = al;
-}
-
-void OPPROTO op_aad(void)
-{
-    int base = PARAM1;
-    int al, ah;
-    al = EAX & 0xff;
-    ah = (EAX >> 8) & 0xff;
-    al = ((ah * base) + al) & 0xff;
-    EAX = (EAX & ~0xffff) | al;
-    CC_DST = al;
-}
-
-void OPPROTO op_aaa(void)
-{
-    int icarry;
-    int al, ah, af;
-    int eflags;
-
-    eflags = cc_table[CC_OP].compute_all();
-    af = eflags & CC_A;
-    al = EAX & 0xff;
-    ah = (EAX >> 8) & 0xff;
-
-    icarry = (al > 0xf9);
-    if (((al & 0x0f) > 9 ) || af) {
-        al = (al + 6) & 0x0f;
-        ah = (ah + 1 + icarry) & 0xff;
-        eflags |= CC_C | CC_A;
-    } else {
-        eflags &= ~(CC_C | CC_A);
-        al &= 0x0f;
-    }
-    EAX = (EAX & ~0xffff) | al | (ah << 8);
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-void OPPROTO op_aas(void)
-{
-    int icarry;
-    int al, ah, af;
-    int eflags;
-
-    eflags = cc_table[CC_OP].compute_all();
-    af = eflags & CC_A;
-    al = EAX & 0xff;
-    ah = (EAX >> 8) & 0xff;
-
-    icarry = (al < 6);
-    if (((al & 0x0f) > 9 ) || af) {
-        al = (al - 6) & 0x0f;
-        ah = (ah - 1 - icarry) & 0xff;
-        eflags |= CC_C | CC_A;
-    } else {
-        eflags &= ~(CC_C | CC_A);
-        al &= 0x0f;
-    }
-    EAX = (EAX & ~0xffff) | al | (ah << 8);
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-void OPPROTO op_daa(void)
-{
-    int al, af, cf;
-    int eflags;
-
-    eflags = cc_table[CC_OP].compute_all();
-    cf = eflags & CC_C;
-    af = eflags & CC_A;
-    al = EAX & 0xff;
-
-    eflags = 0;
-    if (((al & 0x0f) > 9 ) || af) {
-        al = (al + 6) & 0xff;
-        eflags |= CC_A;
-    }
-    if ((al > 0x9f) || cf) {
-        al = (al + 0x60) & 0xff;
-        eflags |= CC_C;
-    }
-    EAX = (EAX & ~0xff) | al;
-    /* well, speed is not an issue here, so we compute the flags by hand */
-    eflags |= (al == 0) << 6; /* zf */
-    eflags |= parity_table[al]; /* pf */
-    eflags |= (al & 0x80); /* sf */
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-void OPPROTO op_das(void)
-{
-    int al, al1, af, cf;
-    int eflags;
-
-    eflags = cc_table[CC_OP].compute_all();
-    cf = eflags & CC_C;
-    af = eflags & CC_A;
-    al = EAX & 0xff;
-
-    eflags = 0;
-    al1 = al;
-    if (((al & 0x0f) > 9 ) || af) {
-        eflags |= CC_A;
-        if (al < 6 || cf)
-            eflags |= CC_C;
-        al = (al - 6) & 0xff;
-    }
-    if ((al1 > 0x99) || cf) {
-        al = (al - 0x60) & 0xff;
-        eflags |= CC_C;
-    }
-    EAX = (EAX & ~0xff) | al;
-    /* well, speed is not an issue here, so we compute the flags by hand */
-    eflags |= (al == 0) << 6; /* zf */
-    eflags |= parity_table[al]; /* pf */
-    eflags |= (al & 0x80); /* sf */
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-/* segment handling */
-
-/* never use it with R_CS */
-void OPPROTO op_movl_seg_T0(void)
-{
-    load_seg(PARAM1, T0);
-}
-
-/* faster VM86 version */
-void OPPROTO op_movl_seg_T0_vm(void)
-{
-    int selector;
-    SegmentCache *sc;
-    
-    selector = T0 & 0xffff;
-    /* env->segs[] access */
-    sc = (SegmentCache *)((char *)env + PARAM1);
-    sc->selector = selector;
-    sc->base = (selector << 4);
-#ifdef VBOX
-    sc->flags = 0; /* clear attributes */
-#endif
-}
-
-void OPPROTO op_movl_T0_seg(void)
-{
-    T0 = env->segs[PARAM1].selector;
-}
-
-void OPPROTO op_lsl(void)
-{
-    helper_lsl();
-}
-
-void OPPROTO op_lar(void)
-{
-    helper_lar();
-}
-
-void OPPROTO op_verr(void)
-{
-    helper_verr();
-}
-
-void OPPROTO op_verw(void)
-{
-    helper_verw();
-}
-
-void OPPROTO op_arpl(void)
-{
-    if ((T0 & 3) < (T1 & 3)) {
-        /* XXX: emulate bug or 0xff3f0000 oring as in bochs ? */
-        T0 = (T0 & ~3) | (T1 & 3);
-        T1 = CC_Z;
-   } else {
-        T1 = 0;
-    }
-    FORCE_RET();
-}
-            
-void OPPROTO op_arpl_update(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    CC_SRC = (eflags & ~CC_Z) | T1;
-}
-    
-/* T0: segment, T1:eip */
-void OPPROTO op_ljmp_protected_T0_T1(void)
-{
-    helper_ljmp_protected_T0_T1(PARAM1);
-}
-
-void OPPROTO op_lcall_real_T0_T1(void)
-{
-    helper_lcall_real_T0_T1(PARAM1, PARAM2);
-}
-
-void OPPROTO op_lcall_protected_T0_T1(void)
-{
-    helper_lcall_protected_T0_T1(PARAM1, PARAM2);
-}
-
-void OPPROTO op_iret_real(void)
-{
-    helper_iret_real(PARAM1);
-}
-
-void OPPROTO op_iret_protected(void)
-{
-    helper_iret_protected(PARAM1, PARAM2);
-}
-
-void OPPROTO op_lret_protected(void)
-{
-    helper_lret_protected(PARAM1, PARAM2);
-}
-
-void OPPROTO op_lldt_T0(void)
-{
-    helper_lldt_T0();
-}
-
-void OPPROTO op_ltr_T0(void)
-{
-    helper_ltr_T0();
-}
-
-/* CR registers access */
-void OPPROTO op_movl_crN_T0(void)
-{
-    helper_movl_crN_T0(PARAM1);
-}
-
-#if !defined(CONFIG_USER_ONLY) 
-void OPPROTO op_movtl_T0_cr8(void)
-{
-    T0 = cpu_get_apic_tpr(env);
-}
-#endif
-
-/* DR registers access */
-void OPPROTO op_movl_drN_T0(void)
-{
-    helper_movl_drN_T0(PARAM1);
-}
-
-void OPPROTO op_lmsw_T0(void)
-{
-    /* only 4 lower bits of CR0 are modified. PE cannot be set to zero
-       if already set to one. */
-    T0 = (env->cr[0] & ~0xe) | (T0 & 0xf);
-    helper_movl_crN_T0(0);
-}
-
-void OPPROTO op_invlpg_A0(void)
-{
-    helper_invlpg(A0);
-}
-
-void OPPROTO op_movl_T0_env(void)
-{
-    T0 = *(uint32_t *)((char *)env + PARAM1);
-}
-
-void OPPROTO op_movl_env_T0(void)
-{
-    *(uint32_t *)((char *)env + PARAM1) = T0;
-}
-
-void OPPROTO op_movl_env_T1(void)
-{
-    *(uint32_t *)((char *)env + PARAM1) = T1;
-}
-
-void OPPROTO op_movtl_T0_env(void)
-{
-    T0 = *(target_ulong *)((char *)env + PARAM1);
-}
-
-void OPPROTO op_movtl_env_T0(void)
-{
-    *(target_ulong *)((char *)env + PARAM1) = T0;
-}
-
-void OPPROTO op_movtl_T1_env(void)
-{
-    T1 = *(target_ulong *)((char *)env + PARAM1);
-}
-
-void OPPROTO op_movtl_env_T1(void)
-{
-    *(target_ulong *)((char *)env + PARAM1) = T1;
-}
-
-void OPPROTO op_clts(void)
-{
-    env->cr[0] &= ~CR0_TS_MASK;
-    env->hflags &= ~HF_TS_MASK;
-}
-
-/* flags handling */
-
-void OPPROTO op_goto_tb0(void)
-{
-    GOTO_TB(op_goto_tb0, PARAM1, 0);
-}
-
-void OPPROTO op_goto_tb1(void)
-{
-    GOTO_TB(op_goto_tb1, PARAM1, 1);
-}
-
-void OPPROTO op_jmp_label(void)
-{
-    GOTO_LABEL_PARAM(1);
-}
-
-void OPPROTO op_jnz_T0_label(void)
-{
-    if (T0)
-        GOTO_LABEL_PARAM(1);
-    FORCE_RET();
-}
-
-void OPPROTO op_jz_T0_label(void)
-{
-    if (!T0)
-        GOTO_LABEL_PARAM(1);
-    FORCE_RET();
-}
-
-/* slow set cases (compute x86 flags) */
-void OPPROTO op_seto_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (eflags >> 11) & 1;
-}
-
-void OPPROTO op_setb_T0_cc(void)
-{
-    T0 = cc_table[CC_OP].compute_c();
-}
-
-void OPPROTO op_setz_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (eflags >> 6) & 1;
-}
-
-void OPPROTO op_setbe_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (eflags & (CC_Z | CC_C)) != 0;
-}
-
-void OPPROTO op_sets_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (eflags >> 7) & 1;
-}
-
-void OPPROTO op_setp_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (eflags >> 2) & 1;
-}
-
-void OPPROTO op_setl_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = ((eflags ^ (eflags >> 4)) >> 7) & 1;
-}
-
-void OPPROTO op_setle_T0_cc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    T0 = (((eflags ^ (eflags >> 4)) & 0x80) || (eflags & CC_Z)) != 0;
-}
-
-void OPPROTO op_xor_T0_1(void)
-{
-    T0 ^= 1;
-}
-
-void OPPROTO op_set_cc_op(void)
-{
-    CC_OP = PARAM1;
-}
-
-void OPPROTO op_mov_T0_cc(void)
-{
-    T0 = cc_table[CC_OP].compute_all();
-}
-
-/* XXX: clear VIF/VIP in all ops ? */
-#ifdef VBOX
-/* XXX: AMD docs say they remain unchanged. */
-#endif
-
-void OPPROTO op_movl_eflags_T0(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK));
-}
-
-void OPPROTO op_movw_eflags_T0(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK) & 0xffff);
-}
-
-void OPPROTO op_movl_eflags_T0_io(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK));
-}
-
-void OPPROTO op_movw_eflags_T0_io(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK) & 0xffff);
-}
-
-void OPPROTO op_movl_eflags_T0_cpl0(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK));
-}
-
-void OPPROTO op_movw_eflags_T0_cpl0(void)
-{
-    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK) & 0xffff);
-}
-
-#ifndef VBOX
-#if 0
-/* vm86plus version */
-void OPPROTO op_movw_eflags_T0_vm(void)
-{
-    int eflags;
-    eflags = T0;
-    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
-    DF = 1 - (2 * ((eflags >> 10) & 1));
-    /* we also update some system flags as in user mode */
-    env->eflags = (env->eflags & ~(FL_UPDATE_MASK16 | VIF_MASK)) |
-        (eflags & FL_UPDATE_MASK16);
-    if (eflags & IF_MASK) {
-        env->eflags |= VIF_MASK;
-        if (env->eflags & VIP_MASK) {
-            EIP = PARAM1;
-            raise_exception(EXCP0D_GPF);
-        }
-    }
-    FORCE_RET();
-}
-
-void OPPROTO op_movl_eflags_T0_vm(void)
-{
-    int eflags;
-    eflags = T0;
-    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
-    DF = 1 - (2 * ((eflags >> 10) & 1));
-    /* we also update some system flags as in user mode */
-    env->eflags = (env->eflags & ~(FL_UPDATE_MASK32 | VIF_MASK)) |
-        (eflags & FL_UPDATE_MASK32);
-    if (eflags & IF_MASK) {
-        env->eflags |= VIF_MASK;
-        if (env->eflags & VIP_MASK) {
-            EIP = PARAM1;
-            raise_exception(EXCP0D_GPF);
-        }
-    }
-    FORCE_RET();
-}
-#endif
-
-#else /* VBOX */
-/* IOPL != 3, CR4.VME=1 */
-void OPPROTO op_movw_eflags_T0_vme(void)
-{
-    unsigned int new_eflags = T0;
-
-    /* if virtual interrupt pending and (virtual) interrupts will be enabled -> #GP */
-    /* if TF will be set -> #GP */
-    if (    ((new_eflags & IF_MASK) && (env->eflags & VIP_MASK)) 
-        ||  (new_eflags & TF_MASK)) {
-        raise_exception(EXCP0D_GPF);
-    } else {
-        load_eflags(new_eflags, (TF_MASK | AC_MASK | ID_MASK | NT_MASK) & 0xffff);
-
-        if (new_eflags & IF_MASK) {
-            env->eflags |= VIF_MASK;
-        } else {
-            env->eflags &= ~VIF_MASK;
-        }
-    }
-
-    FORCE_RET();
-}
-#endif /* VBOX */
-
-/* XXX: compute only O flag */
-void OPPROTO op_movb_eflags_T0(void)
-{
-    int of;
-    of = cc_table[CC_OP].compute_all() & CC_O;
-    CC_SRC = (T0 & (CC_S | CC_Z | CC_A | CC_P | CC_C)) | of;
-}
-
-void OPPROTO op_movl_T0_eflags(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    eflags |= (DF & DF_MASK);
-    eflags |= env->eflags & ~(VM_MASK | RF_MASK);
-    T0 = eflags;
-}
-
-/* vm86plus version */
-#ifdef VBOX /* #if 0 */
-void OPPROTO op_movl_T0_eflags_vme(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    eflags |= (DF & DF_MASK);
-    eflags |= env->eflags & ~(VM_MASK | RF_MASK | IF_MASK);
-    if (env->eflags & VIF_MASK)
-        eflags |= IF_MASK;
-    T0 = eflags;
-}
-#endif /* VBOX / 0 */
-
-void OPPROTO op_cld(void)
-{
-    DF = 1;
-}
-
-void OPPROTO op_std(void)
-{
-    DF = -1;
-}
-
-void OPPROTO op_clc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    eflags &= ~CC_C;
-    CC_SRC = eflags;
-}
-
-void OPPROTO op_stc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    eflags |= CC_C;
-    CC_SRC = eflags;
-}
-
-void OPPROTO op_cmc(void)
-{
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    eflags ^= CC_C;
-    CC_SRC = eflags;
-}
-
-void OPPROTO op_salc(void)
-{
-    int cf;
-    cf = cc_table[CC_OP].compute_c();
-    EAX = (EAX & ~0xff) | ((-cf) & 0xff);
-}
-
-static int compute_all_eflags(void)
-{
-    return CC_SRC;
-}
-
-static int compute_c_eflags(void)
-{
-    return CC_SRC & CC_C;
-}
-
-CCTable cc_table[CC_OP_NB] = {
-    [CC_OP_DYNAMIC] = { /* should never happen */ },
-
-    [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },
-
-    [CC_OP_MULB] = { compute_all_mulb, compute_c_mull },
-    [CC_OP_MULW] = { compute_all_mulw, compute_c_mull },
-    [CC_OP_MULL] = { compute_all_mull, compute_c_mull },
-
-    [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },
-    [CC_OP_ADDW] = { compute_all_addw, compute_c_addw  },
-    [CC_OP_ADDL] = { compute_all_addl, compute_c_addl  },
-
-    [CC_OP_ADCB] = { compute_all_adcb, compute_c_adcb },
-    [CC_OP_ADCW] = { compute_all_adcw, compute_c_adcw  },
-    [CC_OP_ADCL] = { compute_all_adcl, compute_c_adcl  },
-
-    [CC_OP_SUBB] = { compute_all_subb, compute_c_subb  },
-    [CC_OP_SUBW] = { compute_all_subw, compute_c_subw  },
-    [CC_OP_SUBL] = { compute_all_subl, compute_c_subl  },
-    
-    [CC_OP_SBBB] = { compute_all_sbbb, compute_c_sbbb  },
-    [CC_OP_SBBW] = { compute_all_sbbw, compute_c_sbbw  },
-    [CC_OP_SBBL] = { compute_all_sbbl, compute_c_sbbl  },
-    
-    [CC_OP_LOGICB] = { compute_all_logicb, compute_c_logicb },
-    [CC_OP_LOGICW] = { compute_all_logicw, compute_c_logicw },
-    [CC_OP_LOGICL] = { compute_all_logicl, compute_c_logicl },
-    
-    [CC_OP_INCB] = { compute_all_incb, compute_c_incl },
-    [CC_OP_INCW] = { compute_all_incw, compute_c_incl },
-    [CC_OP_INCL] = { compute_all_incl, compute_c_incl },
-    
-    [CC_OP_DECB] = { compute_all_decb, compute_c_incl },
-    [CC_OP_DECW] = { compute_all_decw, compute_c_incl },
-    [CC_OP_DECL] = { compute_all_decl, compute_c_incl },
-    
-    [CC_OP_SHLB] = { compute_all_shlb, compute_c_shlb },
-    [CC_OP_SHLW] = { compute_all_shlw, compute_c_shlw },
-    [CC_OP_SHLL] = { compute_all_shll, compute_c_shll },
-
-    [CC_OP_SARB] = { compute_all_sarb, compute_c_sarl },
-    [CC_OP_SARW] = { compute_all_sarw, compute_c_sarl },
-    [CC_OP_SARL] = { compute_all_sarl, compute_c_sarl },
-
-#ifdef TARGET_X86_64
-    [CC_OP_MULQ] = { compute_all_mulq, compute_c_mull },
-
-    [CC_OP_ADDQ] = { compute_all_addq, compute_c_addq  },
-
-    [CC_OP_ADCQ] = { compute_all_adcq, compute_c_adcq  },
-
-    [CC_OP_SUBQ] = { compute_all_subq, compute_c_subq  },
-    
-    [CC_OP_SBBQ] = { compute_all_sbbq, compute_c_sbbq  },
-    
-    [CC_OP_LOGICQ] = { compute_all_logicq, compute_c_logicq },
-    
-    [CC_OP_INCQ] = { compute_all_incq, compute_c_incl },
-
-    [CC_OP_DECQ] = { compute_all_decq, compute_c_incl },
-
-    [CC_OP_SHLQ] = { compute_all_shlq, compute_c_shlq },
-
-    [CC_OP_SARQ] = { compute_all_sarq, compute_c_sarl },
-#endif
-};
-
-/* floating point support. Some of the code for complicated x87
-   functions comes from the LGPL'ed x86 emulator found in the Willows
-   TWIN windows emulator. */
-
-/* fp load FT0 */
-
-void OPPROTO op_flds_FT0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = ldl(A0);
-    FT0 = FP_CONVERT.f;
-#else
-    FT0 = ldfl(A0);
-#endif
-}
-
-void OPPROTO op_fldl_FT0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i64 = ldq(A0);
-    FT0 = FP_CONVERT.d;
-#else
-    FT0 = ldfq(A0);
-#endif
-}
-
-/* helpers are needed to avoid static constant reference. XXX: find a better way */
-#ifdef USE_INT_TO_FLOAT_HELPERS
-
-void helper_fild_FT0_A0(void)
-{
-    FT0 = (CPU86_LDouble)ldsw(A0);
-}
-
-void helper_fildl_FT0_A0(void)
-{
-    FT0 = (CPU86_LDouble)((int32_t)ldl(A0));
-}
-
-void helper_fildll_FT0_A0(void)
-{
-    FT0 = (CPU86_LDouble)((int64_t)ldq(A0));
-}
-
-void OPPROTO op_fild_FT0_A0(void)
-{
-    helper_fild_FT0_A0();
-}
-
-void OPPROTO op_fildl_FT0_A0(void)
-{
-    helper_fildl_FT0_A0();
-}
-
-void OPPROTO op_fildll_FT0_A0(void)
-{
-    helper_fildll_FT0_A0();
-}
-
-#else
-
-void OPPROTO op_fild_FT0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = ldsw(A0);
-    FT0 = (CPU86_LDouble)FP_CONVERT.i32;
-#else
-    FT0 = (CPU86_LDouble)ldsw(A0);
-#endif
-}
-
-void OPPROTO op_fildl_FT0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = (int32_t) ldl(A0);
-    FT0 = (CPU86_LDouble)FP_CONVERT.i32;
-#else
-    FT0 = (CPU86_LDouble)((int32_t)ldl(A0));
-#endif
-}
-
-void OPPROTO op_fildll_FT0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i64 = (int64_t) ldq(A0);
-    FT0 = (CPU86_LDouble)FP_CONVERT.i64;
-#else
-    FT0 = (CPU86_LDouble)((int64_t)ldq(A0));
-#endif
-}
-#endif
-
-/* fp load ST0 */
-
-void OPPROTO op_flds_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = ldl(A0);
-    env->fpregs[new_fpstt].d = FP_CONVERT.f;
-#else
-    env->fpregs[new_fpstt].d = ldfl(A0);
-#endif
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void OPPROTO op_fldl_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i64 = ldq(A0);
-    env->fpregs[new_fpstt].d = FP_CONVERT.d;
-#else
-    env->fpregs[new_fpstt].d = ldfq(A0);
-#endif
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void OPPROTO op_fldt_ST0_A0(void)
-{
-    helper_fldt_ST0_A0();
-}
-
-/* helpers are needed to avoid static constant reference. XXX: find a better way */
-#ifdef USE_INT_TO_FLOAT_HELPERS
-
-void helper_fild_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)ldsw(A0);
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void helper_fildl_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)((int32_t)ldl(A0));
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void helper_fildll_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)((int64_t)ldq(A0));
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void OPPROTO op_fild_ST0_A0(void)
-{
-    helper_fild_ST0_A0();
-}
-
-void OPPROTO op_fildl_ST0_A0(void)
-{
-    helper_fildl_ST0_A0();
-}
-
-void OPPROTO op_fildll_ST0_A0(void)
-{
-    helper_fildll_ST0_A0();
-}
-
-#else
-
-void OPPROTO op_fild_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = ldsw(A0);
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i32;
-#else
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)ldsw(A0);
-#endif
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void OPPROTO op_fildl_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i32 = (int32_t) ldl(A0);
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i32;
-#else
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)((int32_t)ldl(A0));
-#endif
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-void OPPROTO op_fildll_ST0_A0(void)
-{
-    int new_fpstt;
-    new_fpstt = (env->fpstt - 1) & 7;
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.i64 = (int64_t) ldq(A0);
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)FP_CONVERT.i64;
-#else
-    env->fpregs[new_fpstt].d = (CPU86_LDouble)((int64_t)ldq(A0));
-#endif
-    env->fpstt = new_fpstt;
-    env->fptags[new_fpstt] = 0; /* validate stack entry */
-}
-
-#endif
-
-/* fp store */
-
-void OPPROTO op_fsts_ST0_A0(void)
-{
-#ifdef USE_FP_CONVERT
-    FP_CONVERT.f = (float)ST0;
-    stfl(A0, FP_CONVERT.f);
-#else
-    stfl(A0, (float)ST0);
-#endif
-    FORCE_RET();
-}
-
-void OPPROTO op_fstl_ST0_A0(void)
-{
-    stfq(A0, (double)ST0);
-    FORCE_RET();
-}
-
-void OPPROTO op_fstt_ST0_A0(void)
-{
-    helper_fstt_ST0_A0();
-}
-
-void OPPROTO op_fist_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int val;
-
-    d = ST0;
-    val = floatx_to_int32(d, &env->fp_status);
-    if (val != (int16_t)val)
-        val = -32768;
-    stw(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fistl_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int val;
-
-    d = ST0;
-    val = floatx_to_int32(d, &env->fp_status);
-    stl(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fistll_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int64_t val;
-
-    d = ST0;
-    val = floatx_to_int64(d, &env->fp_status);
-    stq(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fistt_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int val;
-
-    d = ST0;
-    val = floatx_to_int32_round_to_zero(d, &env->fp_status);
-    if (val != (int16_t)val)
-        val = -32768;
-    stw(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fisttl_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int val;
-
-    d = ST0;
-    val = floatx_to_int32_round_to_zero(d, &env->fp_status);
-    stl(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fisttll_ST0_A0(void)
-{
-#if defined(__sparc__) && !defined(__sparc_v9__)
-    register CPU86_LDouble d asm("o0");
-#else
-    CPU86_LDouble d;
-#endif
-    int64_t val;
-
-    d = ST0;
-    val = floatx_to_int64_round_to_zero(d, &env->fp_status);
-    stq(A0, val);
-    FORCE_RET();
-}
-
-void OPPROTO op_fbld_ST0_A0(void)
-{
-    helper_fbld_ST0_A0();
-}
-
-void OPPROTO op_fbst_ST0_A0(void)
-{
-    helper_fbst_ST0_A0();
-}
-
-/* FPU move */
-
-void OPPROTO op_fpush(void)
-{
-    fpush();
-}
-
-void OPPROTO op_fpop(void)
-{
-    fpop();
-}
-
-void OPPROTO op_fdecstp(void)
-{
-    env->fpstt = (env->fpstt - 1) & 7;
-    env->fpus &= (~0x4700);
-}
-
-void OPPROTO op_fincstp(void)
-{
-    env->fpstt = (env->fpstt + 1) & 7;
-    env->fpus &= (~0x4700);
-}
-
-void OPPROTO op_ffree_STN(void)
-{
-    env->fptags[(env->fpstt + PARAM1) & 7] = 1;
-}
-
-void OPPROTO op_fmov_ST0_FT0(void)
-{
-    ST0 = FT0;
-}
-
-void OPPROTO op_fmov_FT0_STN(void)
-{
-    FT0 = ST(PARAM1);
-}
-
-void OPPROTO op_fmov_ST0_STN(void)
-{
-    ST0 = ST(PARAM1);
-}
-
-void OPPROTO op_fmov_STN_ST0(void)
-{
-    ST(PARAM1) = ST0;
-}
-
-void OPPROTO op_fxchg_ST0_STN(void)
-{
-    CPU86_LDouble tmp;
-    tmp = ST(PARAM1);
-    ST(PARAM1) = ST0;
-    ST0 = tmp;
-}
-
-/* FPU operations */
-
-const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500};
-
-void OPPROTO op_fcom_ST0_FT0(void)
-{
-    int ret;
-
-    ret = floatx_compare(ST0, FT0, &env->fp_status);
-    env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1];
-    FORCE_RET();
-}
-
-void OPPROTO op_fucom_ST0_FT0(void)
-{
-    int ret;
-
-    ret = floatx_compare_quiet(ST0, FT0, &env->fp_status);
-    env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret+ 1];
-    FORCE_RET();
-}
-
-const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C};
-
-void OPPROTO op_fcomi_ST0_FT0(void)
-{
-    int eflags;
-    int ret;
-
-    ret = floatx_compare(ST0, FT0, &env->fp_status);
-    eflags = cc_table[CC_OP].compute_all();
-    eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1];
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-void OPPROTO op_fucomi_ST0_FT0(void)
-{
-    int eflags;
-    int ret;
-
-    ret = floatx_compare_quiet(ST0, FT0, &env->fp_status);
-    eflags = cc_table[CC_OP].compute_all();
-    eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1];
-    CC_SRC = eflags;
-    FORCE_RET();
-}
-
-void OPPROTO op_fcmov_ST0_STN_T0(void)
-{
-    if (T0) {
-        ST0 = ST(PARAM1);
-    }
-    FORCE_RET();
-}
-
-void OPPROTO op_fadd_ST0_FT0(void)
-{
-    ST0 += FT0;
-}
-
-void OPPROTO op_fmul_ST0_FT0(void)
-{
-    ST0 *= FT0;
-}
-
-void OPPROTO op_fsub_ST0_FT0(void)
-{
-    ST0 -= FT0;
-}
-
-void OPPROTO op_fsubr_ST0_FT0(void)
-{
-    ST0 = FT0 - ST0;
-}
-
-void OPPROTO op_fdiv_ST0_FT0(void)
-{
-    ST0 = helper_fdiv(ST0, FT0);
-}
-
-void OPPROTO op_fdivr_ST0_FT0(void)
-{
-    ST0 = helper_fdiv(FT0, ST0);
-}
-
-/* fp operations between STN and ST0 */
-
-void OPPROTO op_fadd_STN_ST0(void)
-{
-    ST(PARAM1) += ST0;
-}
-
-void OPPROTO op_fmul_STN_ST0(void)
-{
-    ST(PARAM1) *= ST0;
-}
-
-void OPPROTO op_fsub_STN_ST0(void)
-{
-    ST(PARAM1) -= ST0;
-}
-
-void OPPROTO op_fsubr_STN_ST0(void)
-{
-    CPU86_LDouble *p;
-    p = &ST(PARAM1);
-    *p = ST0 - *p;
-}
-
-void OPPROTO op_fdiv_STN_ST0(void)
-{
-    CPU86_LDouble *p;
-    p = &ST(PARAM1);
-    *p = helper_fdiv(*p, ST0);
-}
-
-void OPPROTO op_fdivr_STN_ST0(void)
-{
-    CPU86_LDouble *p;
-    p = &ST(PARAM1);
-    *p = helper_fdiv(ST0, *p);
-}
-
-/* misc FPU operations */
-void OPPROTO op_fchs_ST0(void)
-{
-    ST0 = floatx_chs(ST0);
-}
-
-void OPPROTO op_fabs_ST0(void)
-{
-    ST0 = floatx_abs(ST0);
-}
-
-void OPPROTO op_fxam_ST0(void)
-{
-    helper_fxam_ST0();
-}
-
-void OPPROTO op_fld1_ST0(void)
-{
-    ST0 = f15rk[1];
-}
-
-void OPPROTO op_fldl2t_ST0(void)
-{
-    ST0 = f15rk[6];
-}
-
-void OPPROTO op_fldl2e_ST0(void)
-{
-    ST0 = f15rk[5];
-}
-
-void OPPROTO op_fldpi_ST0(void)
-{
-    ST0 = f15rk[2];
-}
-
-void OPPROTO op_fldlg2_ST0(void)
-{
-    ST0 = f15rk[3];
-}
-
-void OPPROTO op_fldln2_ST0(void)
-{
-    ST0 = f15rk[4];
-}
-
-void OPPROTO op_fldz_ST0(void)
-{
-    ST0 = f15rk[0];
-}
-
-void OPPROTO op_fldz_FT0(void)
-{
-    FT0 = f15rk[0];
-}
-
-/* associated heplers to reduce generated code length and to simplify
-   relocation (FP constants are usually stored in .rodata section) */
-
-void OPPROTO op_f2xm1(void)
-{
-    helper_f2xm1();
-}
-
-void OPPROTO op_fyl2x(void)
-{
-    helper_fyl2x();
-}
-
-void OPPROTO op_fptan(void)
-{
-    helper_fptan();
-}
-
-void OPPROTO op_fpatan(void)
-{
-    helper_fpatan();
-}
-
-void OPPROTO op_fxtract(void)
-{
-    helper_fxtract();
-}
-
-void OPPROTO op_fprem1(void)
-{
-    helper_fprem1();
-}
-
-
-void OPPROTO op_fprem(void)
-{
-    helper_fprem();
-}
-
-void OPPROTO op_fyl2xp1(void)
-{
-    helper_fyl2xp1();
-}
-
-void OPPROTO op_fsqrt(void)
-{
-    helper_fsqrt();
-}
-
-void OPPROTO op_fsincos(void)
-{
-    helper_fsincos();
-}
-
-void OPPROTO op_frndint(void)
-{
-    helper_frndint();
-}
-
-void OPPROTO op_fscale(void)
-{
-    helper_fscale();
-}
-
-void OPPROTO op_fsin(void)
-{
-    helper_fsin();
-}
-
-void OPPROTO op_fcos(void)
-{
-    helper_fcos();
-}
-
-void OPPROTO op_fnstsw_A0(void)
-{
-    int fpus;
-    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
-    stw(A0, fpus);
-    FORCE_RET();
-}
-
-void OPPROTO op_fnstsw_EAX(void)
-{
-    int fpus;
-    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
-    EAX = (EAX & ~0xffff) | fpus;
-}
-
-void OPPROTO op_fnstcw_A0(void)
-{
-    stw(A0, env->fpuc);
-    FORCE_RET();
-}
-
-void OPPROTO op_fldcw_A0(void)
-{
-    env->fpuc = lduw(A0);
-    update_fp_status();
-}
-
-void OPPROTO op_fclex(void)
-{
-    env->fpus &= 0x7f00;
-}
-
-void OPPROTO op_fwait(void)
-{
-    if (env->fpus & FPUS_SE)
-        fpu_raise_exception();
-    FORCE_RET();
-}
-
-void OPPROTO op_fninit(void)
-{
-    env->fpus = 0;
-    env->fpstt = 0;
-    env->fpuc = 0x37f;
-    env->fptags[0] = 1;
-    env->fptags[1] = 1;
-    env->fptags[2] = 1;
-    env->fptags[3] = 1;
-    env->fptags[4] = 1;
-    env->fptags[5] = 1;
-    env->fptags[6] = 1;
-    env->fptags[7] = 1;
-}
-
-void OPPROTO op_fnstenv_A0(void)
-{
-    helper_fstenv(A0, PARAM1);
-}
-
-void OPPROTO op_fldenv_A0(void)
-{
-    helper_fldenv(A0, PARAM1);
-}
-
-void OPPROTO op_fnsave_A0(void)
-{
-    helper_fsave(A0, PARAM1);
-}
-
-void OPPROTO op_frstor_A0(void)
-{
-    helper_frstor(A0, PARAM1);
-}
-
-/* threading support */
-void OPPROTO op_lock(void)
-{
-    cpu_lock();
-}
-
-void OPPROTO op_unlock(void)
-{
-    cpu_unlock();
-}
-
-/* SSE support */
-static inline void memcpy16(void *d, void *s)
-{
-    ((uint32_t *)d)[0] = ((uint32_t *)s)[0];
-    ((uint32_t *)d)[1] = ((uint32_t *)s)[1];
-    ((uint32_t *)d)[2] = ((uint32_t *)s)[2];
-    ((uint32_t *)d)[3] = ((uint32_t *)s)[3];
-}
-
-void OPPROTO op_movo(void)
-{
-    /* XXX: badly generated code */
-    XMMReg *d, *s;
-    d = (XMMReg *)((char *)env + PARAM1);
-    s = (XMMReg *)((char *)env + PARAM2);
-    memcpy16(d, s);
-}
-
-void OPPROTO op_movq(void)
-{
-    uint64_t *d, *s;
-    d = (uint64_t *)((char *)env + PARAM1);
-    s = (uint64_t *)((char *)env + PARAM2);
-    *d = *s;
-}
-
-void OPPROTO op_movl(void)
-{
-    uint32_t *d, *s;
-    d = (uint32_t *)((char *)env + PARAM1);
-    s = (uint32_t *)((char *)env + PARAM2);
-    *d = *s;
-}
-
-void OPPROTO op_movq_env_0(void)
-{
-    uint64_t *d;
-    d = (uint64_t *)((char *)env + PARAM1);
-    *d = 0;
-}
-
-void OPPROTO op_fxsave_A0(void)
-{
-    helper_fxsave(A0, PARAM1);
-}
-
-void OPPROTO op_fxrstor_A0(void)
-{
-    helper_fxrstor(A0, PARAM1);
-}
-
-/* XXX: optimize by storing fptt and fptags in the static cpu state */
-void OPPROTO op_enter_mmx(void)
-{
-    env->fpstt = 0;
-    *(uint32_t *)(env->fptags) = 0;
-    *(uint32_t *)(env->fptags + 4) = 0;
-}
-
-void OPPROTO op_emms(void)
-{
-    /* set to empty state */
-    *(uint32_t *)(env->fptags) = 0x01010101;
-    *(uint32_t *)(env->fptags + 4) = 0x01010101;
-}
-
-#define SHIFT 0
-#include "ops_sse.h"
-
-#define SHIFT 1
-#include "ops_sse.h"
-
-#ifdef VBOX
-/* Instantiate the structure signatures. */
-# define REM_STRUCT_OP 1
-# include "../Sun/structs.h"
-#endif
-
