revision 1011:fdd58619b760
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 1011:fdd58619b760 |
parent | 1006:3a169c224c12 |
child | 1012:0b8cc74ac83a |
author | nkeynes |
date | Sun Apr 12 07:24:45 2009 +0000 (15 years ago) |
branch | xlat-refactor |
Restructure operand types -
rename to forms to avoid conflict for actual data types
temporary operands are now a first class form
remove explicit types for immediates - now implied by opcode
Initial work on promote-source-reg pass
rename to forms to avoid conflict for actual data types
temporary operands are now a first class form
remove explicit types for immediates - now implied by opcode
Initial work on promote-source-reg pass
1.1 --- a/src/Makefile.am Tue Apr 07 10:55:03 2009 +00001.2 +++ b/src/Makefile.am Sun Apr 12 07:24:45 2009 +00001.3 @@ -83,10 +83,10 @@1.4 xlat/xltcache.h mem.c util.c1.6 test_testsh4xir_LDADD = @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@1.7 -test_testsh4xir_SOURCES = test/testsh4xir.c xlat/xir.c xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c1.8 +test_testsh4xir_SOURCES = test/testsh4xir.c xlat/xir.c xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c xlat/regalloc.c1.10 test_testxir_LDADD = @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@1.11 -test_testxir_SOURCES = test/testxir.c xlat/xir.c xlat/xir.h xlat/xirsup.c xlat/xiropt.c xlat/xiropt.h1.12 +test_testxir_SOURCES = test/testxir.c xlat/xir.c xlat/xir.h xlat/xirsup.c xlat/xiropt.h1.14 check_PROGRAMS += test/testsh4x86 test/testsh4xir test/testxir1.15 endif
2.1 --- a/src/Makefile.in Tue Apr 07 10:55:03 2009 +00002.2 +++ b/src/Makefile.in Sun Apr 12 07:24:45 2009 +00002.3 @@ -216,17 +216,18 @@2.4 test_testsh4x86_DEPENDENCIES =2.5 am__dirstamp = $(am__leading_dot)dirstamp2.6 am__test_testsh4xir_SOURCES_DIST = test/testsh4xir.c xlat/xir.c \2.7 - xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c2.8 + xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c \2.9 + xlat/regalloc.c2.10 @BUILD_SH4X86_TRUE@am_test_testsh4xir_OBJECTS = testsh4xir.$(OBJEXT) \2.11 @BUILD_SH4X86_TRUE@ xir.$(OBJEXT) sh4xir.$(OBJEXT) \2.12 -@BUILD_SH4X86_TRUE@ x86target.$(OBJEXT) x86gen.$(OBJEXT)2.13 +@BUILD_SH4X86_TRUE@ x86target.$(OBJEXT) x86gen.$(OBJEXT) \2.14 +@BUILD_SH4X86_TRUE@ regalloc.$(OBJEXT)2.15 test_testsh4xir_OBJECTS = $(am_test_testsh4xir_OBJECTS)2.16 test_testsh4xir_DEPENDENCIES =2.17 am__test_testxir_SOURCES_DIST = test/testxir.c xlat/xir.c xlat/xir.h \2.18 - xlat/xirsup.c xlat/xiropt.c xlat/xiropt.h2.19 + xlat/xirsup.c xlat/xiropt.h2.20 @BUILD_SH4X86_TRUE@am_test_testxir_OBJECTS = testxir.$(OBJEXT) \2.21 -@BUILD_SH4X86_TRUE@ xir.$(OBJEXT) xirsup.$(OBJEXT) \2.22 -@BUILD_SH4X86_TRUE@ xiropt.$(OBJEXT)2.23 +@BUILD_SH4X86_TRUE@ xir.$(OBJEXT) xirsup.$(OBJEXT)2.24 test_testxir_OBJECTS = $(am_test_testxir_OBJECTS)2.25 test_testxir_DEPENDENCIES =2.26 am_test_testxlt_OBJECTS = testxlt.$(OBJEXT) xltcache.$(OBJEXT)2.27 @@ -491,9 +492,9 @@2.28 @BUILD_SH4X86_TRUE@ xlat/xltcache.h mem.c util.c2.30 @BUILD_SH4X86_TRUE@test_testsh4xir_LDADD = @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@2.31 -@BUILD_SH4X86_TRUE@test_testsh4xir_SOURCES = test/testsh4xir.c xlat/xir.c xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c2.32 +@BUILD_SH4X86_TRUE@test_testsh4xir_SOURCES = test/testsh4xir.c xlat/xir.c xlat/xir.h sh4/sh4xir.c xlat/x86/x86target.c xlat/x86/x86gen.c xlat/regalloc.c2.33 @BUILD_SH4X86_TRUE@test_testxir_LDADD = @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@2.34 -@BUILD_SH4X86_TRUE@test_testxir_SOURCES = test/testxir.c xlat/xir.c xlat/xir.h xlat/xirsup.c xlat/xiropt.c xlat/xiropt.h2.35 +@BUILD_SH4X86_TRUE@test_testxir_SOURCES = test/testxir.c xlat/xir.c xlat/xir.h xlat/xirsup.c xlat/xiropt.h2.36 lxdream_LDADD = @GLIB_LIBS@ @GTK_LIBS@ @LIBPNG_LIBS@ @PULSE_LIBS@ @ESOUND_LIBS@ @ALSA_LIBS@ @SDL_LIBS@ $(INTLLIBS)2.37 gendec_LDADD = @GLIB_LIBS@ @GTK_LIBS@ $(INTLLIBS)2.38 genglsl_LDADD = @GLIB_LIBS@ @GTK_LIBS@ $(INTLLIBS)2.39 @@ -674,6 +675,7 @@2.40 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pmm.Po@am__quote@2.41 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvr2.Po@am__quote@2.42 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvr2mem.Po@am__quote@2.43 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regalloc.Po@am__quote@2.44 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendsave.Po@am__quote@2.45 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendsort.Po@am__quote@2.46 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scene.Po@am__quote@2.47 @@ -710,7 +712,6 @@2.48 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86gen.Po@am__quote@2.49 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86target.Po@am__quote@2.50 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xir.Po@am__quote@2.51 -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xiropt.Po@am__quote@2.52 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xirsup.Po@am__quote@2.53 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xltcache.Po@am__quote@2.54 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yuv.Po@am__quote@2.55 @@ -1933,6 +1934,20 @@2.56 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.57 @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o x86gen.obj `if test -f 'xlat/x86/x86gen.c'; then $(CYGPATH_W) 'xlat/x86/x86gen.c'; else $(CYGPATH_W) '$(srcdir)/xlat/x86/x86gen.c'; fi`2.59 +regalloc.o: xlat/regalloc.c2.60 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regalloc.o -MD -MP -MF "$(DEPDIR)/regalloc.Tpo" -c -o regalloc.o `test -f 'xlat/regalloc.c' || echo '$(srcdir)/'`xlat/regalloc.c; \2.61 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/regalloc.Tpo" "$(DEPDIR)/regalloc.Po"; else rm -f "$(DEPDIR)/regalloc.Tpo"; exit 1; fi2.62 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xlat/regalloc.c' object='regalloc.o' libtool=no @AMDEPBACKSLASH@2.63 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.64 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regalloc.o `test -f 'xlat/regalloc.c' || echo '$(srcdir)/'`xlat/regalloc.c2.65 +2.66 +regalloc.obj: xlat/regalloc.c2.67 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regalloc.obj -MD -MP -MF "$(DEPDIR)/regalloc.Tpo" -c -o regalloc.obj `if test -f 'xlat/regalloc.c'; then $(CYGPATH_W) 'xlat/regalloc.c'; else $(CYGPATH_W) '$(srcdir)/xlat/regalloc.c'; fi`; \2.68 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/regalloc.Tpo" "$(DEPDIR)/regalloc.Po"; else rm -f "$(DEPDIR)/regalloc.Tpo"; exit 1; fi2.69 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xlat/regalloc.c' object='regalloc.obj' libtool=no @AMDEPBACKSLASH@2.70 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.71 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regalloc.obj `if test -f 'xlat/regalloc.c'; then $(CYGPATH_W) 'xlat/regalloc.c'; else $(CYGPATH_W) '$(srcdir)/xlat/regalloc.c'; fi`2.72 +2.73 testxir.o: test/testxir.c2.74 @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testxir.o -MD -MP -MF "$(DEPDIR)/testxir.Tpo" -c -o testxir.o `test -f 'test/testxir.c' || echo '$(srcdir)/'`test/testxir.c; \2.75 @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/testxir.Tpo" "$(DEPDIR)/testxir.Po"; else rm -f "$(DEPDIR)/testxir.Tpo"; exit 1; fi2.76 @@ -1961,20 +1976,6 @@2.77 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.78 @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xirsup.obj `if test -f 'xlat/xirsup.c'; then $(CYGPATH_W) 'xlat/xirsup.c'; else $(CYGPATH_W) '$(srcdir)/xlat/xirsup.c'; fi`2.80 -xiropt.o: xlat/xiropt.c2.81 -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xiropt.o -MD -MP -MF "$(DEPDIR)/xiropt.Tpo" -c -o xiropt.o `test -f 'xlat/xiropt.c' || echo '$(srcdir)/'`xlat/xiropt.c; \2.82 -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xiropt.Tpo" "$(DEPDIR)/xiropt.Po"; else rm -f "$(DEPDIR)/xiropt.Tpo"; exit 1; fi2.83 -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xlat/xiropt.c' object='xiropt.o' libtool=no @AMDEPBACKSLASH@2.84 -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.85 -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xiropt.o `test -f 'xlat/xiropt.c' || echo '$(srcdir)/'`xlat/xiropt.c2.86 -2.87 -xiropt.obj: xlat/xiropt.c2.88 -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xiropt.obj -MD -MP -MF "$(DEPDIR)/xiropt.Tpo" -c -o xiropt.obj `if test -f 'xlat/xiropt.c'; then $(CYGPATH_W) 'xlat/xiropt.c'; else $(CYGPATH_W) '$(srcdir)/xlat/xiropt.c'; fi`; \2.89 -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xiropt.Tpo" "$(DEPDIR)/xiropt.Po"; else rm -f "$(DEPDIR)/xiropt.Tpo"; exit 1; fi2.90 -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xlat/xiropt.c' object='xiropt.obj' libtool=no @AMDEPBACKSLASH@2.91 -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.92 -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xiropt.obj `if test -f 'xlat/xiropt.c'; then $(CYGPATH_W) 'xlat/xiropt.c'; else $(CYGPATH_W) '$(srcdir)/xlat/xiropt.c'; fi`2.93 -2.94 testxlt.o: test/testxlt.c2.95 @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testxlt.o -MD -MP -MF "$(DEPDIR)/testxlt.Tpo" -c -o testxlt.o `test -f 'test/testxlt.c' || echo '$(srcdir)/'`test/testxlt.c; \2.96 @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/testxlt.Tpo" "$(DEPDIR)/testxlt.Po"; else rm -f "$(DEPDIR)/testxlt.Tpo"; exit 1; fi
3.1 --- a/src/sh4/sh4x86.in Tue Apr 07 10:55:03 2009 +00003.2 +++ b/src/sh4/sh4x86.in Sun Apr 12 07:24:45 2009 +00003.3 @@ -2379,11 +2379,11 @@3.4 check_fpuen();3.5 if( sh4_x86.double_prec == 0 ) {3.6 if( sh4_x86.sse3_enabled ) {3.7 - MOVAPS_rbpdisp_xmm( REG_OFFSET(fr[0][FVm<<2]), 4 );3.8 - MULPS_rbpdisp_xmm( REG_OFFSET(fr[0][FVn<<2]), 4 );3.9 + MOVAPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[0][FVm<<2]), 4 );3.10 + MULPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[0][FVn<<2]), 4 );3.11 HADDPS_xmm_xmm( 4, 4 );3.12 HADDPS_xmm_xmm( 4, 4 );3.13 - MOVSS_xmm_rbpdisp( 4, REG_OFFSET(fr[0][(FVn<<2)+2]) );3.14 + MOVSS_xmm_r32disp( 4, REG_RBP, REG_OFFSET(fr[0][(FVn<<2)+2]) );3.15 } else {3.16 push_fr( FVm<<2 );3.17 push_fr( FVn<<2 );3.18 @@ -2409,13 +2409,13 @@3.19 check_fpuen();3.20 if( sh4_x86.double_prec == 0 ) {3.21 if( sh4_x86.sse3_enabled ) {3.22 - MOVAPS_rbpdisp_xmm( REG_OFFSET(fr[1][0]), 1 ); // M1 M0 M3 M23.23 - MOVAPS_rbpdisp_xmm( REG_OFFSET(fr[1][4]), 0 ); // M5 M4 M7 M63.24 - MOVAPS_rbpdisp_xmm( REG_OFFSET(fr[1][8]), 3 ); // M9 M8 M11 M103.25 - MOVAPS_rbpdisp_xmm( REG_OFFSET(fr[1][12]), 2 );// M13 M12 M15 M143.26 + MOVAPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[1][0]), 1 ); // M1 M0 M3 M23.27 + MOVAPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[1][4]), 0 ); // M5 M4 M7 M63.28 + MOVAPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[1][8]), 3 ); // M9 M8 M11 M103.29 + MOVAPS_r32disp_xmm( REG_RBP, REG_OFFSET(fr[1][12]), 2 );// M13 M12 M15 M143.31 - MOVSLDUP_rbpdisp_xmm( REG_OFFSET(fr[0][FVn<<2]), 4 ); // V1 V1 V3 V33.32 - MOVSHDUP_rbpdisp_xmm( REG_OFFSET(fr[0][FVn<<2]), 5 ); // V0 V0 V2 V23.33 + MOVSLDUP_r32disp_xmm( REG_RBP, REG_OFFSET(fr[0][FVn<<2]), 4 ); // V1 V1 V3 V33.34 + MOVSHDUP_r32disp_xmm( REG_RBP, REG_OFFSET(fr[0][FVn<<2]), 5 ); // V0 V0 V2 V23.35 MOV_xmm_xmm( 4, 6 );3.36 MOV_xmm_xmm( 5, 7 );3.37 MOVLHPS_xmm_xmm( 4, 4 ); // V1 V1 V1 V13.38 @@ -2429,7 +2429,7 @@3.39 ADDPS_xmm_xmm( 5, 4 );3.40 ADDPS_xmm_xmm( 7, 6 );3.41 ADDPS_xmm_xmm( 6, 4 );3.42 - MOVAPS_xmm_rbpdisp( 4, REG_OFFSET(fr[0][FVn<<2]) );3.43 + MOVAPS_xmm_r32disp( 4, REG_RBP, REG_OFFSET(fr[0][FVn<<2]) );3.44 } else {3.45 LEAP_rbpdisp_rptr( REG_OFFSET(fr[0][FVn<<2]), REG_EAX );3.46 CALL1_ptr_r32( sh4_ftrv, REG_EAX );
4.1 --- a/src/sh4/sh4xir.in Tue Apr 07 10:55:03 2009 +00004.2 +++ b/src/sh4/sh4xir.in Sun Apr 12 07:24:45 2009 +00004.3 @@ -37,11 +37,11 @@4.4 #define R_Q REG_OFFSET(q)4.5 #define R_S REG_OFFSET(s)4.6 #define R_FR(frn) REG_OFFSET(fr[0][(frn)^1])4.7 -#define R_DR(frn) REG_OFFSET(fr[0][frn])4.8 +#define R_DR(frn) REG_OFFSET(fr[0][(frn)&0x0E])4.9 #define R_DRL(f) REG_OFFSET(fr[(f)&1][(f)|0x01])4.10 #define R_DRH(f) REG_OFFSET(fr[(f)&1][(f)&0x0E])4.11 #define R_XF(frn) REG_OFFSET(fr[1][(frn)^1])4.12 -#define R_XD(frn) REG_OFFSET(fr[1][frn^1])4.13 +#define R_XD(frn) REG_OFFSET(fr[1][(frn)&0x0E])4.14 #define R_FV(fvn) REG_OFFSET(fr[0][fvn<<2])4.15 #define R_XMTRX R_XD(0)4.16 #define R_FPSCR REG_OFFSET(fpscr)4.17 @@ -72,8 +72,46 @@4.18 "store_queue", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,4.19 "new_pc", "event_pending", "event_type", "delay_slot", "slice_cycle", "bus_cycle", "state", "xlat_mode" };4.21 -struct xlat_source_machine sh4_source_machine = { "sH4", &sh4r,4.22 - sh4_register_names, R_PC, R_NEW_PC, R_T, R_M, R_Q, R_S,4.23 +static const char *sh4_quad_register_names[] = /* From FR1 to MACH */4.24 + {"dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14",4.25 + "xd0", "xd2", "xd4", "xd6", "xd8", "xd10", "xd12", "xd14",4.26 + NULL, "mac" };4.27 +static const char *sh4_vec4_register_names[] = /* From FR1 to XF14 */4.28 + {"fv0", "fv4", "fv8", "fv12", "xfv0", "xfv4", "xfv8", "xfv12" };4.29 +4.30 +static const char *sh4_get_register_name( uint32_t reg, xir_type_t ty )4.31 +{4.32 + switch( ty ) {4.33 + case XTY_LONG:4.34 + case XTY_FLOAT:4.35 + if( reg <= R_SH4_MODE ) {4.36 + return sh4_register_names[reg>>2];4.37 + }4.38 + break;4.39 + case XTY_QUAD:4.40 + case XTY_DOUBLE:4.41 + if( reg >= R_DR(0) && reg <= R_MACH ) {4.42 + return sh4_quad_register_names[(reg-R_DR(0))>>3];4.43 + }4.44 + break;4.45 + case XTY_VEC4F:4.46 + if( reg >= R_DR(0) && reg <= R_XD(14) ) {4.47 + return sh4_vec4_register_names[(reg-R_DR(0))>>4];4.48 + }4.49 + break;4.50 + case XTY_MAT16F:4.51 + if( reg = R_XMTRX ) {4.52 + return "xmtrx";4.53 + } else if( reg == R_DR(0) ) {4.54 + return "mtrx";4.55 + }4.56 + }4.57 + return NULL;4.58 +}4.59 +4.60 +struct xlat_source_machine sh4_source_machine = { "SH4", &sh4r,4.61 + R_PC, R_NEW_PC, R_T, R_M, R_Q, R_S,4.62 + sh4_get_register_name,4.63 sh4_decode_basic_block };4.65 /**4.66 @@ -89,21 +127,55 @@4.68 static struct sh4_xir_state sh4_xir;4.70 -#define XOP1E( op, arg0 ) do{ \4.71 - xir_op_t ins = xir_append_op2(xbb, op, SOURCE_REGISTER_OPERAND, arg0, NO_OPERAND, 0); \4.72 - ins->exc = write_postexc(xbb, (in_delay_slot ? pc-2 : pc) ); \4.73 - ins->next = xbb->ir_ptr; \4.74 - xbb->ir_ptr->prev = ins; \4.75 - } while(0)4.76 -#define XOP2E( op, arg0, arg1 ) do{ \4.77 - xir_op_t ins = xir_append_op2(xbb, op, SOURCE_REGISTER_OPERAND, arg0, SOURCE_REGISTER_OPERAND, arg1); \4.78 - ins->exc = write_postexc(xbb, (in_delay_slot ? pc-2 : pc) ); \4.79 - ins->exc->prev = ins; \4.80 - ins->next = xbb->ir_ptr; \4.81 - xbb->ir_ptr->prev = ins; \4.82 - } while(0)4.83 +/**4.84 + * Create a standard exception-taking stub sub-block - updates SPC, slice_cycle, and exits4.85 + * @return the first xir_op_t of the exception block.4.86 + */4.87 +static inline xir_op_t write_exc( xir_basic_block_t xbb, sh4addr_t pc, int exc_code )4.88 +{4.89 + xir_op_t start = xbb->ir_ptr;4.90 + XOPCALL1I( sh4_raise_exception, exc_code );4.91 + if( pc != xbb->pc_begin ) {4.92 + XOP2IS( OP_ADD, pc - xbb->pc_begin, R_SPC );4.93 + }4.94 + XOP2IS( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.95 + XOP1S( OP_BR, R_SPC )->next = NULL;4.96 + start->prev = NULL;4.97 + return start;4.98 +}4.99 +4.100 +/**4.101 + * Create an instruction with a standard post-exception stub sub-block (ie4.102 + * sh4_raise_exception or similar has already been called - update SPC +4.103 + * slice_cycle and exit).4.104 + * @return the first xir_op_t of the exception block.4.105 + */4.106 +static xir_op_t xir_append_op2_exc( xir_basic_block_t xbb, int op, int arg0form, uint32_t arg0, int arg1form, uint32_t arg1, sh4addr_t pc )4.107 +{4.108 + xir_op_t ins = xir_append_op2( xbb, op, arg0form, arg0, arg1form, arg1 );4.109 + ins->exc = xbb->ir_ptr;4.110 + ins->exc->prev = ins;4.111 +4.112 + if( pc != xbb->pc_begin ) {4.113 + XOP2IS( OP_ADD, pc - xbb->pc_begin, R_SPC );4.114 + }4.115 + XOP2IS( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.116 + XOP1S( OP_BR, R_SPC )->next = NULL;4.117 +4.118 + ins->next = xbb->ir_ptr;4.119 + xbb->ir_ptr->prev = ins;4.120 + return ins;4.121 +}4.122 +4.123 +#define XOP1SE( op, arg0 ) xir_append_op2_exc( xbb, op, SOURCE_OPERAND, arg0, NO_OPERAND, 0, (in_delay_slot ? pc-2 : pc))4.124 +#define XOP1TE( op, arg0 ) xir_append_op2_exc( xbb, op, TEMP_OPERAND, arg0, NO_OPERAND, 0, (in_delay_slot ? pc-2 : pc))4.125 +#define XOP2SSE( op, arg0, arg1 ) xir_append_op2_exc( xbb, op, SOURCE_OPERAND, arg0, SOURCE_OPERAND, arg1, (in_delay_slot ? pc-2 : pc))4.126 +#define XOP2STE( op, arg0, arg1 ) xir_append_op2_exc( xbb, op, SOURCE_OPERAND, arg0, TEMP_OPERAND, arg1, (in_delay_slot ? pc-2 : pc))4.127 +#define XOP2TSE( op, arg0, arg1 ) xir_append_op2_exc( xbb, op, TEMP_OPERAND, arg0, SOURCE_OPERAND, arg1, (in_delay_slot ? pc-2 : pc))4.128 +#define XOP2TTE( op, arg0, arg1 ) xir_append_op2_exc( xbb, op, TEMP_OPERAND, arg0, TEMP_OPERAND, arg1, (in_delay_slot ? pc-2 : pc))4.129 +4.130 #define ALIGN(m,r,code) do { \4.131 - xir_op_t ins = xir_append_op2(xbb, OP_RAISEMNE, INT_IMM_OPERAND, m, SOURCE_REGISTER_OPERAND, r); \4.132 + xir_op_t ins = xir_append_op2(xbb, OP_RAISEMNE, IMMEDIATE_OPERAND, m, SOURCE_OPERAND, r); \4.133 ins->exc = write_exc(xbb, (in_delay_slot ? pc-2 : pc), code); \4.134 ins->exc->prev = ins; \4.135 ins->next = xbb->ir_ptr; \4.136 @@ -115,7 +187,7 @@4.138 #define UNDEF(ir) if( in_delay_slot ) { SLOTILLEGAL(); return 2; } else { ILLEGAL(); return 2; }4.139 #define CHECKFPUEN() if( !sh4_xir.fpuen_checked ) { \4.140 - xir_op_t ins = XOP2I( OP_RAISEMNE, SR_FD, R_SR ); \4.141 + xir_op_t ins = XOP2IS( OP_RAISEMNE, SR_FD, R_SR ); \4.142 if( in_delay_slot ) { \4.143 ins->exc = write_exc(xbb, pc-2, EXC_SLOT_FPU_DISABLED); \4.144 } else { \4.145 @@ -138,370 +210,336 @@4.146 #define UNTRANSLATABLE(pc) !IS_IN_ICACHE(pc)4.148 #define EMU_DELAY_SLOT() do { \4.149 - XOP2I( OP_ADD, (pc+2 - xbb->pc_begin), R_PC ); \4.150 - XOP2I( OP_MOV, 1, R_DELAY_SLOT ); \4.151 + XOP2IS( OP_ADD, (pc+2 - xbb->pc_begin), R_PC ); \4.152 + XOP2IS( OP_MOV, 1, R_DELAY_SLOT ); \4.153 XOP0( OP_BARRIER ); \4.154 XOPCALL0( sh4_execute_instruction ); \4.155 - XOP1( OP_BR, R_PC ); \4.156 + XOP1S( OP_BR, R_PC ); \4.157 } while(0)4.160 -/**4.161 - * Create a standard post-exception stub sub-block (ie sh4_raise_exception or similar has4.162 - * already been called - update SPC + slice_cycle and exit).4.163 - * @return the first xir_op_t of the exception block.4.164 - */4.165 -static inline xir_op_t write_postexc( xir_basic_block_t xbb, sh4addr_t pc )4.166 -{4.167 - xir_op_t start = xbb->ir_ptr;4.168 - if( pc != xbb->pc_begin ) {4.169 - XOP2I( OP_ADD, pc - xbb->pc_begin, R_SPC );4.170 - }4.171 - XOP2I( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.172 - XOP1( OP_BR, R_SPC )->next = NULL;4.173 - start->prev = NULL;4.174 - return start;4.175 -}4.176 -4.177 -/**4.178 - * Create a standard exception-taking stub sub-block - updates SPC, slice_cycle, and exits4.179 - * @return the first xir_op_t of the exception block.4.180 - */4.181 -static inline xir_op_t write_exc( xir_basic_block_t xbb, sh4addr_t pc, int exc_code )4.182 -{4.183 - xir_op_t start = xbb->ir_ptr;4.184 - XOPCALL1I( sh4_raise_exception, exc_code );4.185 - if( pc != xbb->pc_begin ) {4.186 - XOP2I( OP_ADD, pc - xbb->pc_begin, R_SPC );4.187 - }4.188 - XOP2I( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.189 - XOP1( OP_BR, R_SPC )->next = NULL;4.190 - start->prev = NULL;4.191 - return start;4.192 -}4.193 -4.194 static sh4addr_t sh4_decode_instruction( xir_basic_block_t xbb, sh4addr_t pc, gboolean in_delay_slot )4.195 {4.196 assert( IS_IN_ICACHE(pc) );4.197 uint16_t ir = *(uint16_t *)GET_ICACHE_PTR(pc);4.199 %%4.200 -ADD Rm, Rn {: XOP2( OP_ADD, R_R(Rm), R_R(Rn) ); :}4.201 -ADD #imm, Rn {: XOP2I( OP_ADD, imm, R_R(Rn) ); :}4.202 +ADD Rm, Rn {: XOP2SS( OP_ADD, R_R(Rm), R_R(Rn) ); :}4.203 +ADD #imm, Rn {: XOP2IS( OP_ADD, imm, R_R(Rn) ); :}4.204 ADDC Rm, Rn {:4.205 - XOP1CC( OP_LD, CC_C, R_T );4.206 - XOP2( OP_ADDCS, R_R(Rm), R_R(Rn) );4.207 - XOP1CC( OP_ST, CC_C, R_T );4.208 + XOP1SCC( OP_LD, CC_C, R_T );4.209 + XOP2SS( OP_ADDCS, R_R(Rm), R_R(Rn) );4.210 + XOP1SCC( OP_ST, CC_C, R_T );4.211 :}4.212 -ADDV Rm, Rn {: XOP2( OP_ADDS, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_OV, R_T ); :}4.213 -AND Rm, Rn {: XOP2( OP_AND, R_R(Rm), R_R(Rn) ); :}4.214 -AND #imm, R0 {: XOP2I( OP_AND, imm, R_R0 ); :}4.215 -CMP/EQ Rm, Rn {: XOP2( OP_CMP, Rm, R_R(Rn) ); XOP1CC( OP_ST, CC_EQ, R_T ); :}4.216 -CMP/EQ #imm, R0 {: XOP2I( OP_CMP, imm, R_R0 ); XOP1CC( OP_ST, CC_EQ, R_T ); :}4.217 -CMP/GE Rm, Rn {: XOP2( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_SGE, R_T ); :}4.218 -CMP/GT Rm, Rn {: XOP2( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_SGT, R_T ); :}4.219 -CMP/HI Rm, Rn {: XOP2( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_UGT, R_T ); :}4.220 -CMP/HS Rm, Rn {: XOP2( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_UGE, R_T ); :}4.221 -CMP/PL Rn {: XOP2I( OP_CMP, 0, R_R(Rn) ); XOP1CC( OP_ST, CC_SGT, R_T ); :}4.222 -CMP/PZ Rn {: XOP2I( OP_CMP, 0, R_R(Rn) ); XOP1CC( OP_ST, CC_SGE, R_T ); :}4.223 -CMP/STR Rm, Rn {: XOP2( OP_CMPSTR, R_R(Rm), R_R(Rn) ); :}4.224 +ADDV Rm, Rn {: XOP2SS( OP_ADDS, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_OV, R_T ); :}4.225 +AND Rm, Rn {: XOP2SS( OP_AND, R_R(Rm), R_R(Rn) ); :}4.226 +AND #imm, R0 {: XOP2IS( OP_AND, imm, R_R0 ); :}4.227 +CMP/EQ Rm, Rn {: XOP2SS( OP_CMP, Rm, R_R(Rn) ); XOP1SCC( OP_ST, CC_EQ, R_T ); :}4.228 +CMP/EQ #imm, R0 {: XOP2IS( OP_CMP, imm, R_R0 ); XOP1SCC( OP_ST, CC_EQ, R_T ); :}4.229 +CMP/GE Rm, Rn {: XOP2SS( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_SGE, R_T ); :}4.230 +CMP/GT Rm, Rn {: XOP2SS( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_SGT, R_T ); :}4.231 +CMP/HI Rm, Rn {: XOP2SS( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_UGT, R_T ); :}4.232 +CMP/HS Rm, Rn {: XOP2SS( OP_CMP, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_UGE, R_T ); :}4.233 +CMP/PL Rn {: XOP2IS( OP_CMP, 0, R_R(Rn) ); XOP1SCC( OP_ST, CC_SGT, R_T ); :}4.234 +CMP/PZ Rn {: XOP2IS( OP_CMP, 0, R_R(Rn) ); XOP1SCC( OP_ST, CC_SGE, R_T ); :}4.235 +CMP/STR Rm, Rn {: XOP2SS( OP_CMPSTR, R_R(Rm), R_R(Rn) ); :}4.236 DIV0S Rm, Rn {:4.237 - XOP2( OP_MOV, R_R(Rm), R_M );4.238 - XOP2I( OP_SLR, 31, R_M );4.239 - XOP2( OP_MOV, R_R(Rn), R_Q );4.240 - XOP2I( OP_SLR, 31, R_Q );4.241 - XOP2( OP_CMP, R_M, R_Q );4.242 - XOP1CC( OP_ST, CC_NE, R_T );4.243 + XOP2SS( OP_MOV, R_R(Rm), R_M );4.244 + XOP2IS( OP_SLR, 31, R_M );4.245 + XOP2SS( OP_MOV, R_R(Rn), R_Q );4.246 + XOP2IS( OP_SLR, 31, R_Q );4.247 + XOP2SS( OP_CMP, R_M, R_Q );4.248 + XOP1SCC( OP_ST, CC_NE, R_T );4.249 :}4.250 DIV0U {:4.251 - XOP2I( OP_MOV, 0, R_M );4.252 - XOP2I( OP_MOV, 0, R_Q );4.253 - XOP2I( OP_MOV, 0, R_T );4.254 + XOP2IS( OP_MOV, 0, R_M );4.255 + XOP2IS( OP_MOV, 0, R_Q );4.256 + XOP2IS( OP_MOV, 0, R_T );4.257 :}4.258 -DIV1 Rm, Rn {: XOP2( OP_DIV1, R_R(Rm), R_R(Rn) ); :}4.259 +DIV1 Rm, Rn {: XOP2SS( OP_DIV1, R_R(Rm), R_R(Rn) ); :}4.260 DMULS.L Rm, Rn {:4.261 - XOP2( OP_MOVSX32, R_R(Rm), R_MAC );4.262 - XOP2( OP_MOVSX32, R_R(Rn), REG_TMP0 );4.263 - XOP2( OP_MULQ, REG_TMPQ0, R_MAC );4.264 + XOP2SS( OP_MOVSX32, R_R(Rm), R_MAC );4.265 + XOP2ST( OP_MOVSX32, R_R(Rn), REG_TMP0 );4.266 + XOP2TS( OP_MULQ, REG_TMPQ0, R_MAC );4.267 :}4.268 DMULU.L Rm, Rn {:4.269 - XOP2( OP_MOVZX32, R_R(Rm), R_MAC );4.270 - XOP2( OP_MOVZX32, R_R(Rn), REG_TMP0 ) ;4.271 - XOP2( OP_MULQ, REG_TMP0, R_MAC );4.272 + XOP2SS( OP_MOVZX32, R_R(Rm), R_MAC );4.273 + XOP2ST( OP_MOVZX32, R_R(Rn), REG_TMP0 ) ;4.274 + XOP2TS( OP_MULQ, REG_TMP0, R_MAC );4.275 :}4.276 -DT Rn {: XOP1( OP_DEC, R_R(Rn) ); :}4.277 -EXTS.B Rm, Rn {: XOP2( OP_MOVSX8, R_R(Rm), R_R(Rn)); :}4.278 -EXTS.W Rm, Rn {: XOP2( OP_MOVSX16, R_R(Rm), R_R(Rn)); :}4.279 -EXTU.B Rm, Rn {: XOP2( OP_MOVZX8, R_R(Rm), R_R(Rn)); :}4.280 -EXTU.W Rm, Rn {: XOP2( OP_MOVZX16, R_R(Rm), R_R(Rn)); :}4.281 +DT Rn {: XOP1S( OP_DEC, R_R(Rn) ); :}4.282 +EXTS.B Rm, Rn {: XOP2SS( OP_MOVSX8, R_R(Rm), R_R(Rn)); :}4.283 +EXTS.W Rm, Rn {: XOP2SS( OP_MOVSX16, R_R(Rm), R_R(Rn)); :}4.284 +EXTU.B Rm, Rn {: XOP2SS( OP_MOVZX8, R_R(Rm), R_R(Rn)); :}4.285 +EXTU.W Rm, Rn {: XOP2SS( OP_MOVZX16, R_R(Rm), R_R(Rn)); :}4.286 MAC.L @Rm+, @Rn+ {:4.287 RALIGN32(R_R(Rm));4.288 if( Rm == Rn ) {4.289 - XOP2E( OP_LOADL, R_R(Rm), REG_TMP0 );4.290 - XOP2( OP_MOV, R_R(Rm), REG_TMP1 );4.291 - XOP2I( OP_ADD, 4, REG_TMP1 );4.292 - XOP2E( OP_LOADL, REG_TMP1, REG_TMP1 );4.293 - XOP2I( OP_ADD, 8, R_R(Rm) );4.294 + XOP2STE( OP_LOADL, R_R(Rm), REG_TMP0 );4.295 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP1 );4.296 + XOP2IT( OP_ADD, 4, REG_TMP1 );4.297 + XOP2TTE( OP_LOADL, REG_TMP1, REG_TMP1 );4.298 + XOP2IS( OP_ADD, 8, R_R(Rm) );4.299 } else {4.300 RALIGN32(R_R(Rn));4.301 - XOP2E( OP_LOADL, R_R(Rm), REG_TMP0 );4.302 - XOP2E( OP_LOADL, R_R(Rn), REG_TMP1 );4.303 - XOP2I( OP_ADD, 4, R_R(Rm) );4.304 - XOP2I( OP_ADD, 4, R_R(Rn) );4.305 + XOP2STE( OP_LOADL, R_R(Rm), REG_TMP0 );4.306 + XOP2STE( OP_LOADL, R_R(Rn), REG_TMP1 );4.307 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.308 + XOP2IS( OP_ADD, 4, R_R(Rn) );4.309 }4.310 - XOP2( OP_MOVSX32, REG_TMP0, REG_TMPQ0 );4.311 - XOP2( OP_MOVSX32, REG_TMP1, REG_TMPQ1 );4.312 - XOP2( OP_MULQ, REG_TMPQ0, REG_TMPQ1 );4.313 - XOP2( OP_ADDQSAT48, REG_TMPQ1, R_MAC );4.314 + XOP2TT( OP_MOVSX32, REG_TMP0, REG_TMPQ0 );4.315 + XOP2TT( OP_MOVSX32, REG_TMP1, REG_TMPQ1 );4.316 + XOP2TT( OP_MULQ, REG_TMPQ0, REG_TMPQ1 );4.317 + XOP2TS( OP_ADDQSAT48, REG_TMPQ1, R_MAC );4.318 :}4.319 MAC.W @Rm+, @Rn+ {:4.320 RALIGN32(R_R(Rm));4.321 if( Rm == Rn ) {4.322 - XOP2E( OP_LOADW, R_R(Rm), REG_TMP0 );4.323 - XOP2( OP_MOV, R_R(Rm), REG_TMP1 );4.324 - XOP2I( OP_ADD, 2, REG_TMP1 );4.325 - XOP2E( OP_LOADW, REG_TMP1, REG_TMP1 );4.326 - XOP2I( OP_ADD, 4, R_R(Rm) );4.327 + XOP2STE( OP_LOADW, R_R(Rm), REG_TMP0 );4.328 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP1 );4.329 + XOP2IT( OP_ADD, 2, REG_TMP1 );4.330 + XOP2TTE( OP_LOADW, REG_TMP1, REG_TMP1 );4.331 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.332 } else {4.333 RALIGN32(Rn);4.334 - XOP2E( OP_LOADW, R_R(Rm), REG_TMP0 );4.335 - XOP2E( OP_LOADW, R_R(Rn), REG_TMP1 );4.336 - XOP2I( OP_ADD, 2, R_R(Rm) );4.337 - XOP2I( OP_ADD, 2, R_R(Rn) );4.338 + XOP2STE( OP_LOADW, R_R(Rm), REG_TMP0 );4.339 + XOP2STE( OP_LOADW, R_R(Rn), REG_TMP1 );4.340 + XOP2IS( OP_ADD, 2, R_R(Rm) );4.341 + XOP2IS( OP_ADD, 2, R_R(Rn) );4.342 }4.343 - XOP2( OP_MOVSX32, REG_TMP0, REG_TMPQ0 );4.344 - XOP2( OP_MOVSX32, REG_TMP1, REG_TMPQ1 );4.345 - XOP2( OP_MULQ, REG_TMPQ0, REG_TMPQ1 );4.346 - XOP2( OP_ADDQSAT32, REG_TMPQ1, R_MAC );4.347 + XOP2TT( OP_MOVSX32, REG_TMP0, REG_TMPQ0 );4.348 + XOP2TT( OP_MOVSX32, REG_TMP1, REG_TMPQ1 );4.349 + XOP2TT( OP_MULQ, REG_TMPQ0, REG_TMPQ1 );4.350 + XOP2TS( OP_ADDQSAT32, REG_TMPQ1, R_MAC );4.351 :}4.352 -MOVT Rn {: XOP2( OP_MOV, R_R(Rn), R_T ); :}4.353 +MOVT Rn {: XOP2SS( OP_MOV, R_R(Rn), R_T ); :}4.354 MUL.L Rm, Rn {:4.355 - XOP2( OP_MOV, R_R(Rm), R_MACL );4.356 - XOP2( OP_MUL, R_R(Rn), R_MACL );4.357 + XOP2SS( OP_MOV, R_R(Rm), R_MACL );4.358 + XOP2SS( OP_MUL, R_R(Rn), R_MACL );4.359 :}4.360 MULS.W Rm, Rn {:4.361 - XOP2( OP_MOVSX16, R_R(Rm), REG_TMP0 );4.362 - XOP2( OP_MOVSX16, R_R(Rn), R_MACL );4.363 - XOP2( OP_MUL, REG_TMP0, R_MACL );4.364 + XOP2ST( OP_MOVSX16, R_R(Rm), REG_TMP0 );4.365 + XOP2SS( OP_MOVSX16, R_R(Rn), R_MACL );4.366 + XOP2TS( OP_MUL, REG_TMP0, R_MACL );4.367 :}4.368 MULU.W Rm, Rn {:4.369 - XOP2( OP_MOVZX16, R_R(Rm), REG_TMP0 );4.370 - XOP2( OP_MOVZX16, R_R(Rn), R_MACL );4.371 - XOP2( OP_MUL, REG_TMP0, R_MACL );4.372 + XOP2ST( OP_MOVZX16, R_R(Rm), REG_TMP0 );4.373 + XOP2SS( OP_MOVZX16, R_R(Rn), R_MACL );4.374 + XOP2TS( OP_MUL, REG_TMP0, R_MACL );4.375 :}4.376 NEG Rm, Rn {:4.377 - XOP2( OP_NEG, R_R(Rm), R_R(Rn) );4.378 + XOP2SS( OP_NEG, R_R(Rm), R_R(Rn) );4.379 :}4.380 NEGC Rm, Rn {:4.381 - XOP1CC( OP_LD, CC_C, R_T );4.382 + XOP1SCC( OP_LD, CC_C, R_T );4.383 if( Rm == Rn ) {4.384 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.385 - XOP2I(OP_MOV, 0, R_R(Rn) );4.386 - XOP2( OP_SUBBS, REG_TMP0, R_R(Rn) );4.387 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.388 + XOP2IS(OP_MOV, 0, R_R(Rn) );4.389 + XOP2TS( OP_SUBBS, REG_TMP0, R_R(Rn) );4.390 } else {4.391 - XOP2I(OP_MOV, 0, R_R(Rn) );4.392 - XOP2( OP_SUBBS, R_R(Rm), R_R(Rn) );4.393 + XOP2IS(OP_MOV, 0, R_R(Rn) );4.394 + XOP2SS( OP_SUBBS, R_R(Rm), R_R(Rn) );4.395 }4.396 - XOP1CC( OP_ST, CC_C, R_T );4.397 + XOP1SCC( OP_ST, CC_C, R_T );4.398 :}4.399 NOT Rm, Rn {:4.400 - XOP2( OP_NOT, R_R(Rm), R_R(Rn) );4.401 + XOP2SS( OP_NOT, R_R(Rm), R_R(Rn) );4.402 :}4.403 -OR Rm, Rn {: XOP2( OP_OR, R_R(Rm), R_R(Rn) ); :}4.404 -OR #imm, R0 {: XOP2I( OP_OR, imm, R_R0 ); :}4.405 -ROTCL Rn {: XOP1CC( OP_LD, CC_C, R_T ); XOP2I( OP_RCL, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.406 -ROTCR Rn {: XOP1CC( OP_LD, CC_C, R_T ); XOP2I( OP_RCR, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.407 -ROTL Rn {: XOP2I( OP_ROL, 1, R_R(Rn) ); :}4.408 -ROTR Rn {: XOP2I( OP_ROR, 1, R_R(Rn) ); :}4.409 -SHAD Rm, Rn {: XOP2( OP_SHAD, R_R(Rm), R_R(Rn) ); :}4.410 -SHLD Rm, Rn {: XOP2( OP_SHLD, R_R(Rm), R_R(Rn) ); :}4.411 -SHAL Rn {: XOP2I( OP_SLLS, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.412 -SHAR Rn {: XOP2I( OP_SARS, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.413 -SHLL Rn {: XOP2I( OP_SLLS, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.414 -SHLL2 Rn {: XOP2I( OP_SLL, 2, R_R(Rn) ); :}4.415 -SHLL8 Rn {: XOP2I( OP_SLL, 8, R_R(Rn) ); :}4.416 -SHLL16 Rn {: XOP2I( OP_SLL, 16, R_R(Rn) ); :}4.417 -SHLR Rn {: XOP2I( OP_SLRS, 1, R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T); :}4.418 -SHLR2 Rn {: XOP2I( OP_SLR, 2, R_R(Rn) ); :}4.419 -SHLR8 Rn {: XOP2I( OP_SLR, 8, R_R(Rn) ); :}4.420 -SHLR16 Rn {: XOP2I( OP_SLR, 16, R_R(Rn) ); :}4.421 +OR Rm, Rn {: XOP2SS( OP_OR, R_R(Rm), R_R(Rn) ); :}4.422 +OR #imm, R0 {: XOP2IS( OP_OR, imm, R_R0 ); :}4.423 +ROTCL Rn {: XOP1SCC( OP_LD, CC_C, R_T ); XOP2IS( OP_RCL, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.424 +ROTCR Rn {: XOP1SCC( OP_LD, CC_C, R_T ); XOP2IS( OP_RCR, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.425 +ROTL Rn {: XOP2IS( OP_ROL, 1, R_R(Rn) ); :}4.426 +ROTR Rn {: XOP2IS( OP_ROR, 1, R_R(Rn) ); :}4.427 +SHAD Rm, Rn {: XOP2SS( OP_SHAD, R_R(Rm), R_R(Rn) ); :}4.428 +SHLD Rm, Rn {: XOP2SS( OP_SHLD, R_R(Rm), R_R(Rn) ); :}4.429 +SHAL Rn {: XOP2IS( OP_SLLS, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.430 +SHAR Rn {: XOP2IS( OP_SARS, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.431 +SHLL Rn {: XOP2IS( OP_SLLS, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.432 +SHLL2 Rn {: XOP2IS( OP_SLL, 2, R_R(Rn) ); :}4.433 +SHLL8 Rn {: XOP2IS( OP_SLL, 8, R_R(Rn) ); :}4.434 +SHLL16 Rn {: XOP2IS( OP_SLL, 16, R_R(Rn) ); :}4.435 +SHLR Rn {: XOP2IS( OP_SLRS, 1, R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T); :}4.436 +SHLR2 Rn {: XOP2IS( OP_SLR, 2, R_R(Rn) ); :}4.437 +SHLR8 Rn {: XOP2IS( OP_SLR, 8, R_R(Rn) ); :}4.438 +SHLR16 Rn {: XOP2IS( OP_SLR, 16, R_R(Rn) ); :}4.439 SUB Rm, Rn {:4.440 if( Rm == Rn ) {4.441 /* Break false dependence */4.442 - XOP2I( OP_MOV, 0, R_R(Rn) );4.443 + XOP2IS( OP_MOV, 0, R_R(Rn) );4.444 } else {4.445 - XOP2( OP_SUB, R_R(Rm), R_R(Rn) );4.446 + XOP2SS( OP_SUB, R_R(Rm), R_R(Rn) );4.447 }4.448 :}4.449 -SUBC Rm, Rn {: XOP1CC( OP_LD, CC_C, R_T ); XOP2( OP_SUBBS, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_C, R_T ); :}4.450 -SUBV Rm, Rn {: XOP2( OP_SUB, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_OV, R_T ); :}4.451 +SUBC Rm, Rn {: XOP1SCC( OP_LD, CC_C, R_T ); XOP2SS( OP_SUBBS, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_C, R_T ); :}4.452 +SUBV Rm, Rn {: XOP2SS( OP_SUB, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_OV, R_T ); :}4.453 SWAP.B Rm, Rn {:4.454 if( Rm != Rn ) {4.455 - XOP2( OP_MOV, R_R(Rm), R_R(Rn) );4.456 + XOP2SS( OP_MOV, R_R(Rm), R_R(Rn) );4.457 }4.458 - XOP2I( OP_SHUFFLE, 0x1243, R_R(Rn) );4.459 + XOP2IS( OP_SHUFFLE, 0x1243, R_R(Rn) );4.460 :}4.461 SWAP.W Rm, Rn {:4.462 if( Rm != Rn ) {4.463 - XOP2( OP_MOV, R_R(Rm), R_R(Rn) );4.464 + XOP2SS( OP_MOV, R_R(Rm), R_R(Rn) );4.465 }4.466 - XOP2I( OP_SHUFFLE, 0x3412, R_R(Rn) );4.467 + XOP2IS( OP_SHUFFLE, 0x3412, R_R(Rn) );4.468 :}4.469 -TST Rm, Rn {: XOP2( OP_TST, R_R(Rm), R_R(Rn) ); XOP1CC( OP_ST, CC_EQ, R_T ); :}4.470 -TST #imm, R0 {: XOP2I( OP_TST, imm, R_R0 ); XOP1CC( OP_ST, CC_EQ, R_T ); :}4.471 +TST Rm, Rn {: XOP2SS( OP_TST, R_R(Rm), R_R(Rn) ); XOP1SCC( OP_ST, CC_EQ, R_T ); :}4.472 +TST #imm, R0 {: XOP2IS( OP_TST, imm, R_R0 ); XOP1SCC( OP_ST, CC_EQ, R_T ); :}4.473 XOR Rm, Rn {:4.474 if( Rm == Rn ) {4.475 /* Break false dependence */4.476 - XOP2I( OP_MOV, 0, R_R(Rn) );4.477 + XOP2IS( OP_MOV, 0, R_R(Rn) );4.478 } else {4.479 - XOP2( OP_XOR, R_R(Rm), R_R(Rn) );4.480 + XOP2SS( OP_XOR, R_R(Rm), R_R(Rn) );4.481 }4.482 :}4.483 -XOR #imm, R0 {: XOP2I( OP_XOR, imm, R_R0 ); :}4.484 +XOR #imm, R0 {: XOP2IS( OP_XOR, imm, R_R0 ); :}4.485 XTRCT Rm, Rn {:4.486 - XOP2( OP_MOV, R_R(Rm), REG_TMP0 );4.487 - XOP2I( OP_SLL, 16, REG_TMP0 );4.488 - XOP2I( OP_SLR, 16, R_R(Rn) );4.489 - XOP2( OP_OR, REG_TMP0, R_R(Rn) );4.490 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP0 );4.491 + XOP2IT( OP_SLL, 16, REG_TMP0 );4.492 + XOP2IS( OP_SLR, 16, R_R(Rn) );4.493 + XOP2TS( OP_OR, REG_TMP0, R_R(Rn) );4.494 :}4.495 -MOV Rm, Rn {: XOP2( OP_MOV, R_R(Rm), R_R(Rn) ); :}4.496 -MOV #imm, Rn {: XOP2I( OP_MOV, imm, R_R(Rn) ); :}4.497 +MOV Rm, Rn {: XOP2SS( OP_MOV, R_R(Rm), R_R(Rn) ); :}4.498 +MOV #imm, Rn {: XOP2IS( OP_MOV, imm, R_R(Rn) ); :}4.500 AND.B #imm, @(R0, GBR) {:4.501 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.502 - XOP2( OP_ADD, R_GBR, REG_TMP0 );4.503 - XOP2E( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.504 - XOP2I( OP_AND, imm, REG_TMP1 );4.505 - XOP2E( OP_STOREB, REG_TMP0, REG_TMP1 );4.506 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.507 + XOP2ST( OP_ADD, R_GBR, REG_TMP0 );4.508 + XOP2TTE( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.509 + XOP2IT( OP_AND, imm, REG_TMP1 );4.510 + XOP2TTE( OP_STOREB, REG_TMP0, REG_TMP1 );4.511 :}4.512 OR.B #imm, @(R0, GBR) {:4.513 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.514 - XOP2( OP_ADD, R_GBR, REG_TMP0 );4.515 - XOP2E( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.516 - XOP2I( OP_OR, imm, REG_TMP1 );4.517 - XOP2E( OP_STOREB, REG_TMP0, REG_TMP1 );4.518 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.519 + XOP2ST( OP_ADD, R_GBR, REG_TMP0 );4.520 + XOP2TTE( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.521 + XOP2IT( OP_OR, imm, REG_TMP1 );4.522 + XOP2TTE( OP_STOREB, REG_TMP0, REG_TMP1 );4.523 :}4.524 TAS.B @Rn {:4.525 - XOP1( OP_OCBP, R_R(Rn) );4.526 - XOP2E( OP_LOADBFW, R_R(Rn), REG_TMP0 );4.527 - XOP2I( OP_CMP, 0, REG_TMP0 );4.528 - XOP1CC(OP_ST, CC_EQ, R_T );4.529 - XOP2I( OP_OR, 0x80, REG_TMP0 );4.530 - XOP2E( OP_STOREB, R_R(Rn), REG_TMP0 );4.531 + XOP1S( OP_OCBP, R_R(Rn) );4.532 + XOP2STE( OP_LOADBFW, R_R(Rn), REG_TMP0 );4.533 + XOP2IT( OP_CMP, 0, REG_TMP0 );4.534 + XOP1SCC(OP_ST, CC_EQ, R_T );4.535 + XOP2IT( OP_OR, 0x80, REG_TMP0 );4.536 + XOP2STE( OP_STOREB, R_R(Rn), REG_TMP0 );4.537 :}4.538 TST.B #imm, @(R0, GBR) {:4.539 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.540 - XOP2( OP_ADD, R_GBR, REG_TMP0 );4.541 - XOP2E( OP_LOADB, REG_TMP0, REG_TMP0 );4.542 - XOP2I( OP_TST, imm, REG_TMP0 );4.543 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.544 + XOP2ST( OP_ADD, R_GBR, REG_TMP0 );4.545 + XOP2TTE( OP_LOADB, REG_TMP0, REG_TMP0 );4.546 + XOP2IT( OP_TST, imm, REG_TMP0 );4.547 :}4.548 XOR.B #imm, @(R0, GBR) {:4.549 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.550 - XOP2( OP_ADD, R_GBR, REG_TMP0 );4.551 - XOP2E( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.552 - XOP2I( OP_XOR, imm, REG_TMP1 );4.553 - XOP2E( OP_STOREB, REG_TMP0, REG_TMP1 );4.554 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.555 + XOP2ST( OP_ADD, R_GBR, REG_TMP0 );4.556 + XOP2TTE( OP_LOADBFW, REG_TMP0, REG_TMP1 );4.557 + XOP2IT( OP_XOR, imm, REG_TMP1 );4.558 + XOP2TTE( OP_STOREB, REG_TMP0, REG_TMP1 );4.559 :}4.561 MOV.B Rm, @Rn {:4.562 - XOP2E( OP_STOREB, R_R(Rn), R_R(Rm) );4.563 + XOP2SSE( OP_STOREB, R_R(Rn), R_R(Rm) );4.564 :}4.565 MOV.B Rm, @-Rn {:4.566 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.567 - XOP2I( OP_ADD, -1, REG_TMP0 );4.568 - XOP2E( OP_STOREB, REG_TMP0, R_R(Rm) );4.569 - XOP2I( OP_ADD, -1, R_R(Rn) );4.570 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.571 + XOP2IT( OP_ADD, -1, REG_TMP0 );4.572 + XOP2TSE( OP_STOREB, REG_TMP0, R_R(Rm) );4.573 + XOP2IS( OP_ADD, -1, R_R(Rn) );4.574 :}4.575 MOV.B Rm, @(R0, Rn) {:4.576 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.577 - XOP2( OP_ADD, R_R0, REG_TMP0 );4.578 - XOP2E( OP_STOREB, REG_TMP0, R_R(Rm) );4.579 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.580 + XOP2ST( OP_ADD, R_R0, REG_TMP0 );4.581 + XOP2TSE( OP_STOREB, REG_TMP0, R_R(Rm) );4.582 :}4.583 MOV.B R0, @(disp, GBR) {:4.584 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.585 - XOP2I( OP_ADD, disp, REG_TMP0 );4.586 - XOP2E( OP_STOREB, REG_TMP0, R_R0 );4.587 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.588 + XOP2IT( OP_ADD, disp, REG_TMP0 );4.589 + XOP2TSE( OP_STOREB, REG_TMP0, R_R0 );4.590 :}4.591 MOV.B R0, @(disp, Rn) {:4.592 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.593 - XOP2I( OP_ADD, disp, REG_TMP0 );4.594 - XOP2E( OP_STOREB, REG_TMP0, R_R0 );4.595 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.596 + XOP2IT( OP_ADD, disp, REG_TMP0 );4.597 + XOP2TSE( OP_STOREB, REG_TMP0, R_R0 );4.598 :}4.599 MOV.B @Rm, Rn {:4.600 - XOP2E( OP_LOADB, R_R(Rm), R_R(Rn) );4.601 + XOP2SSE( OP_LOADB, R_R(Rm), R_R(Rn) );4.602 :}4.603 MOV.B @Rm+, Rn {:4.604 - XOP2E( OP_LOADB, R_R(Rm), R_R(Rn) );4.605 + XOP2SSE( OP_LOADB, R_R(Rm), R_R(Rn) );4.606 if( Rm != Rn ) {4.607 - XOP2I( OP_ADD, 1, R_R(Rm) );4.608 + XOP2IS( OP_ADD, 1, R_R(Rm) );4.609 }4.610 :}4.611 MOV.B @(R0, Rm), Rn {:4.612 - XOP2( OP_MOV, R_R(Rm), REG_TMP0 );4.613 - XOP2( OP_ADD, R_R0, REG_TMP0 );4.614 - XOP2E(OP_LOADB, REG_TMP0, R_R(Rn) );4.615 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP0 );4.616 + XOP2ST( OP_ADD, R_R0, REG_TMP0 );4.617 + XOP2TSE(OP_LOADB, REG_TMP0, R_R(Rn) );4.618 :}4.619 MOV.B @(disp, GBR), R0 {:4.620 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.621 - XOP2I(OP_ADD, disp, REG_TMP0 );4.622 - XOP2E(OP_LOADB, REG_TMP0, R_R0 );4.623 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.624 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.625 + XOP2TSE(OP_LOADB, REG_TMP0, R_R0 );4.626 :}4.627 MOV.B @(disp, Rm), R0 {:4.628 - XOP2( OP_MOV, R_R(Rm), REG_TMP0 );4.629 - XOP2I(OP_ADD, disp, REG_TMP0 );4.630 - XOP2E(OP_LOADB, REG_TMP0, R_R0 );4.631 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP0 );4.632 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.633 + XOP2TSE(OP_LOADB, REG_TMP0, R_R0 );4.634 :}4.635 MOV.L Rm, @Rn {:4.636 WALIGN32( R_R(Rn) );4.637 - XOP2E( OP_STOREL, R_R(Rn), R_R(Rm) );4.638 + XOP2SSE( OP_STOREL, R_R(Rn), R_R(Rm) );4.639 :}4.640 MOV.L Rm, @-Rn {:4.641 WALIGN32( R_R(Rn) );4.642 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.643 - XOP2I(OP_ADD, -4, REG_TMP0 );4.644 - XOP2( OP_STOREL, REG_TMP0, R_R(Rm) );4.645 - XOP2I(OP_ADD, -4, R_R(Rn) );4.646 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.647 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.648 + XOP2TS( OP_STOREL, REG_TMP0, R_R(Rm) );4.649 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.650 :}4.651 MOV.L Rm, @(R0, Rn) {:4.652 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.653 - XOP2( OP_ADD, R_R0, REG_TMP0 );4.654 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.655 + XOP2ST( OP_ADD, R_R0, REG_TMP0 );4.656 WALIGN32( REG_TMP0 );4.657 - XOP2E(OP_STOREL, REG_TMP0, R_R(Rm) );4.658 + XOP2TSE(OP_STOREL, REG_TMP0, R_R(Rm) );4.659 :}4.660 MOV.L R0, @(disp, GBR) {:4.661 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.662 - XOP2I(OP_ADD, disp, REG_TMP0 );4.663 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.664 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.665 WALIGN32( REG_TMP0 );4.666 - XOP2E(OP_STOREL, REG_TMP0, R_R0 );4.667 + XOP2TSE(OP_STOREL, REG_TMP0, R_R0 );4.668 :}4.669 MOV.L Rm, @(disp, Rn) {:4.670 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.671 - XOP2I(OP_ADD, disp, REG_TMP0 );4.672 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.673 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.674 WALIGN32( REG_TMP0 );4.675 - XOP2E(OP_STOREL, REG_TMP0, R_R(Rm) );4.676 + XOP2TSE(OP_STOREL, REG_TMP0, R_R(Rm) );4.677 :}4.678 MOV.L @Rm, Rn {:4.679 RALIGN32( R_R(Rm) );4.680 - XOP2E(OP_LOADL, R_R(Rm), R_R(Rn) );4.681 + XOP2SSE(OP_LOADL, R_R(Rm), R_R(Rn) );4.682 :}4.683 MOV.L @Rm+, Rn {:4.684 RALIGN32( R_R(Rm) );4.685 - XOP2E( OP_LOADL, R_R(Rm), R_R(Rn) );4.686 + XOP2SSE( OP_LOADL, R_R(Rm), R_R(Rn) );4.687 if( R_R(Rm) != R_R(Rn) ) {4.688 - XOP2I( OP_ADD, 4, R_R(Rm) );4.689 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.690 }4.691 :}4.692 MOV.L @(R0, Rm), Rn {:4.693 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.694 - XOP2( OP_ADD, R_R(Rm), REG_TMP0 );4.695 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.696 + XOP2ST( OP_ADD, R_R(Rm), REG_TMP0 );4.697 RALIGN32( REG_TMP0 );4.698 - XOP2E(OP_LOADL, REG_TMP0, R_R(Rn) );4.699 + XOP2TSE(OP_LOADL, REG_TMP0, R_R(Rn) );4.700 :}4.701 MOV.L @(disp, GBR), R0 {:4.702 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.703 - XOP2I(OP_ADD, disp, REG_TMP0 );4.704 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.705 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.706 RALIGN32( REG_TMP0 );4.707 - XOP2E(OP_LOADL, REG_TMP0, R_R0 );4.708 + XOP2TSE(OP_LOADL, REG_TMP0, R_R0 );4.709 :}4.710 MOV.L @(disp, PC), Rn {:4.711 if( in_delay_slot ) {4.712 @@ -520,74 +558,74 @@4.713 // behaviour to confirm) Unlikely to be anyone depending on this4.714 // behaviour though.4.715 sh4ptr_t ptr = GET_ICACHE_PTR(target);4.716 - XOP2P( OP_MOV, ptr, R_R(Rn) );4.717 + XOP2PS( OP_LOADPTRL, ptr, R_R(Rn) );4.718 } else {4.719 // Note: we use sh4r.pc for the calc as we could be running at a4.720 // different virtual address than the translation was done with,4.721 // but we can safely assume that the low bits are the same.4.722 - XOP2( OP_MOV, R_PC, REG_TMP0 );4.723 - XOP2( OP_ADD, (pc-xbb->pc_begin) + disp + 4 - (pc&0x03), REG_TMP0 );4.724 - XOP2E(OP_LOADL, REG_TMP0, R_R(Rn) );4.725 + XOP2ST( OP_MOV, R_PC, REG_TMP0 );4.726 + XOP2IT( OP_ADD, (pc-xbb->pc_begin) + disp + 4 - (pc&0x03), REG_TMP0 );4.727 + XOP2TSE(OP_LOADL, REG_TMP0, R_R(Rn) );4.728 }4.729 }4.730 :}4.731 MOV.L @(disp, Rm), Rn {:4.732 - XOP2( OP_MOV, R_R(Rm), REG_TMP0 );4.733 - XOP2I(OP_ADD, disp, REG_TMP0 );4.734 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP0 );4.735 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.736 RALIGN32( REG_TMP0 );4.737 - XOP2E(OP_LOADL, REG_TMP0, R_R(Rn) );4.738 + XOP2TSE(OP_LOADL, REG_TMP0, R_R(Rn) );4.739 :}4.740 MOV.W Rm, @Rn {:4.741 WALIGN16( R_R(Rn) );4.742 - XOP2E(OP_STOREW, R_R(Rn), R_R(Rm) );4.743 + XOP2SSE(OP_STOREW, R_R(Rn), R_R(Rm) );4.744 :}4.745 MOV.W Rm, @-Rn {:4.746 WALIGN16( R_R(Rn) );4.747 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.748 - XOP2I(OP_ADD, -2, REG_TMP0 );4.749 - XOP2E(OP_STOREW, REG_TMP0, R_R(Rm) );4.750 - XOP2I(OP_ADD, -2, R_R(Rn) );4.751 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.752 + XOP2IT(OP_ADD, -2, REG_TMP0 );4.753 + XOP2TSE(OP_STOREW, REG_TMP0, R_R(Rm) );4.754 + XOP2IS(OP_ADD, -2, R_R(Rn) );4.755 :}4.756 MOV.W Rm, @(R0, Rn) {:4.757 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.758 - XOP2( OP_ADD, R_R(Rn), REG_TMP0 );4.759 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.760 + XOP2ST( OP_ADD, R_R(Rn), REG_TMP0 );4.761 WALIGN16( REG_TMP0 );4.762 - XOP2E(OP_STOREW, REG_TMP0, R_R(Rm) );4.763 + XOP2TSE(OP_STOREW, REG_TMP0, R_R(Rm) );4.764 :}4.765 MOV.W R0, @(disp, GBR) {:4.766 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.767 - XOP2I(OP_ADD, disp, REG_TMP0 );4.768 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.769 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.770 WALIGN16( REG_TMP0 );4.771 - XOP2( OP_STOREW, REG_TMP0, R_R0 );4.772 + XOP2TS( OP_STOREW, REG_TMP0, R_R0 );4.773 :}4.774 MOV.W R0, @(disp, Rn) {:4.775 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.776 - XOP2I(OP_ADD, disp, REG_TMP0 );4.777 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.778 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.779 WALIGN16( REG_TMP0 );4.780 - XOP2E(OP_STOREW, REG_TMP0, R_R0 );4.781 + XOP2TSE(OP_STOREW, REG_TMP0, R_R0 );4.782 :}4.783 MOV.W @Rm, Rn {:4.784 RALIGN16( R_R(Rm) );4.785 - XOP2E(OP_LOADW, R_R(Rm), R_R(Rn) );4.786 + XOP2SSE(OP_LOADW, R_R(Rm), R_R(Rn) );4.787 :}4.788 MOV.W @Rm+, Rn {:4.789 RALIGN16( R_R(Rm) );4.790 - XOP2E(OP_LOADW, R_R(Rm), R_R(Rn) );4.791 + XOP2SSE(OP_LOADW, R_R(Rm), R_R(Rn) );4.792 if( Rm != Rn ) {4.793 - XOP2I( OP_ADD, 2, R_R(Rm) );4.794 + XOP2IS( OP_ADD, 2, R_R(Rm) );4.795 }4.796 :}4.797 MOV.W @(R0, Rm), Rn {:4.798 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.799 - XOP2( OP_ADD, R_R(Rm), REG_TMP0 );4.800 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.801 + XOP2ST( OP_ADD, R_R(Rm), REG_TMP0 );4.802 RALIGN16( REG_TMP0 );4.803 - XOP2E(OP_LOADW, REG_TMP0, R_R(Rn) );4.804 + XOP2TSE(OP_LOADW, REG_TMP0, R_R(Rn) );4.805 :}4.806 MOV.W @(disp, GBR), R0 {:4.807 - XOP2( OP_MOV, R_GBR, REG_TMP0 );4.808 - XOP2I(OP_ADD, disp, REG_TMP0 );4.809 + XOP2ST( OP_MOV, R_GBR, REG_TMP0 );4.810 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.811 RALIGN16( REG_TMP0 );4.812 - XOP2E(OP_LOADW, REG_TMP0, R_R0 );4.813 + XOP2TSE(OP_LOADW, REG_TMP0, R_R0 );4.814 :}4.815 MOV.W @(disp, PC), Rn {:4.816 if( in_delay_slot ) {4.817 @@ -606,296 +644,296 @@4.818 // behaviour to confirm) Unlikely to be anyone depending on this4.819 // behaviour though.4.820 sh4ptr_t ptr = GET_ICACHE_PTR(target);4.821 - XOP2P( OP_MOV, ptr, REG_TMP0 );4.822 - XOP2( OP_MOVSX16, REG_TMP0, R_R(Rn) );4.823 + XOP2PT( OP_LOADPTRL, ptr, REG_TMP0 );4.824 + XOP2TS( OP_MOVSX16, REG_TMP0, R_R(Rn) );4.825 } else {4.826 // Note: we use sh4r.pc for the calc as we could be running at a4.827 // different virtual address than the translation was done with,4.828 // but we can safely assume that the low bits are the same.4.829 - XOP2( OP_MOV, R_PC, REG_TMP0 );4.830 - XOP2( OP_ADD, (pc - xbb->pc_begin) + disp + 4, REG_TMP0 );4.831 - XOP2E(OP_LOADW, REG_TMP0, R_R(Rn) );4.832 + XOP2ST( OP_MOV, R_PC, REG_TMP0 );4.833 + XOP2IT( OP_ADD, (pc - xbb->pc_begin) + disp + 4, REG_TMP0 );4.834 + XOP2TSE(OP_LOADW, REG_TMP0, R_R(Rn) );4.835 }4.836 }4.837 :}4.838 MOV.W @(disp, Rm), R0 {:4.839 - XOP2( OP_MOV, R_R(Rm), REG_TMP0 );4.840 - XOP2I(OP_ADD, disp, REG_TMP0 );4.841 + XOP2ST( OP_MOV, R_R(Rm), REG_TMP0 );4.842 + XOP2IT(OP_ADD, disp, REG_TMP0 );4.843 RALIGN16( REG_TMP0 );4.844 - XOP2E(OP_LOADW, REG_TMP0, R_R0 );4.845 + XOP2TSE(OP_LOADW, REG_TMP0, R_R0 );4.846 :}4.847 MOVA @(disp, PC), R0 {:4.848 if( in_delay_slot ) {4.849 SLOTILLEGAL();4.850 return 2;4.851 } else {4.852 - XOP2( OP_MOV, R_PC, R_R0 );4.853 - XOP2I( OP_ADD, (pc - xbb->pc_begin) + disp + 4 - (pc&0x03), R_R0 );4.854 + XOP2SS( OP_MOV, R_PC, R_R0 );4.855 + XOP2IS( OP_ADD, (pc - xbb->pc_begin) + disp + 4 - (pc&0x03), R_R0 );4.856 }4.857 :}4.858 MOVCA.L R0, @Rn {:4.859 - XOP2E(OP_STORELCA, R_R(Rn), R_R0 );4.860 + XOP2SSE(OP_STORELCA, R_R(Rn), R_R0 );4.861 :}4.862 LDTLB {:4.863 CHECKPRIV();4.864 XOPCALL0( MMU_ldtlb );4.865 :}4.866 -OCBI @Rn {: XOP1E( OP_OCBI, R_R(Rn) ); :}4.867 -OCBP @Rn {: XOP1E( OP_OCBP, R_R(Rn) ); :}4.868 -OCBWB @Rn {: XOP1E( OP_OCBWB, R_R(Rn) ); :}4.869 -PREF @Rn {: XOP1E( OP_PREF, R_R(Rn) ); :}4.870 +OCBI @Rn {: XOP1SE( OP_OCBI, R_R(Rn) ); :}4.871 +OCBP @Rn {: XOP1SE( OP_OCBP, R_R(Rn) ); :}4.872 +OCBWB @Rn {: XOP1SE( OP_OCBWB, R_R(Rn) ); :}4.873 +PREF @Rn {: XOP1SE( OP_PREF, R_R(Rn) ); :}4.875 CLRMAC {:4.876 - XOP2I( OP_MOV, 0, R_MACL );4.877 - XOP2I( OP_MOV, 0, R_MACH );4.878 + XOP2IS( OP_MOV, 0, R_MACL );4.879 + XOP2IS( OP_MOV, 0, R_MACH );4.880 :}4.881 -CLRS {: XOP2I( OP_MOV, 0, R_S ); :}4.882 -CLRT {: XOP2I( OP_MOV, 0, R_T ); :}4.883 -SETS {: XOP2I( OP_MOV, 1, R_S ); :}4.884 -SETT {: XOP2I( OP_MOV, 1, R_T ); :}4.885 +CLRS {: XOP2IS( OP_MOV, 0, R_S ); :}4.886 +CLRT {: XOP2IS( OP_MOV, 0, R_T ); :}4.887 +SETS {: XOP2IS( OP_MOV, 1, R_S ); :}4.888 +SETT {: XOP2IS( OP_MOV, 1, R_T ); :}4.889 FMOV FRm, FRn {:4.890 CHECKFPUEN();4.891 if( sh4_xir.double_size ) {4.892 - XOP2( OP_MOVQ, (FRm&1) ? R_XD(FRm) : R_DR(FRm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.893 + XOP2SS( OP_MOVQ, (FRm&1) ? R_XD(FRm) : R_DR(FRm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.894 } else {4.895 - XOP2( OP_MOV, R_FR(FRm), R_FR(FRn) );4.896 + XOP2SS( OP_MOV, R_FR(FRm), R_FR(FRn) );4.897 }4.898 :}4.899 FMOV FRm, @Rn {:4.900 CHECKFPUEN();4.901 if( sh4_xir.double_size ) {4.902 WALIGN64( R_R(Rn) );4.903 - XOP2E( OP_STOREQ, R_R(Rn), (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.904 + XOP2SSE( OP_STOREQ, R_R(Rn), (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.905 } else {4.906 WALIGN32( R_R(Rn) );4.907 - XOP2E( OP_STOREL, R_R(Rn), R_FR(FRm) );4.908 + XOP2SSE( OP_STOREL, R_R(Rn), R_FR(FRm) );4.909 }4.910 :}4.911 FMOV @Rm, FRn {:4.912 CHECKFPUEN();4.913 if( sh4_xir.double_size ) {4.914 RALIGN64( R_R(Rm) );4.915 - XOP2E( OP_LOADQ, R_R(Rm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.916 + XOP2SSE( OP_LOADQ, R_R(Rm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.917 } else {4.918 RALIGN32( R_R(Rm) );4.919 - XOP2E( OP_LOADL, R_R(Rm), R_FR(FRn) );4.920 + XOP2SSE( OP_LOADL, R_R(Rm), R_FR(FRn) );4.921 }4.922 :}4.923 FMOV FRm, @-Rn {:4.924 CHECKFPUEN();4.925 if( sh4_xir.double_size ) {4.926 WALIGN64( R_R(Rn) );4.927 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.928 - XOP2I(OP_ADD, -8, REG_TMP0 );4.929 - XOP2E(OP_STOREQ, REG_TMP0, (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.930 - XOP2I(OP_ADD, -8, R_R(Rn) );4.931 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.932 + XOP2IT(OP_ADD, -8, REG_TMP0 );4.933 + XOP2TSE(OP_STOREQ, REG_TMP0, (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.934 + XOP2IS(OP_ADD, -8, R_R(Rn) );4.935 } else {4.936 WALIGN32( R_R(Rn) );4.937 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.938 - XOP2I(OP_ADD, -4, REG_TMP0 );4.939 - XOP2E(OP_STOREL, REG_TMP0, R_FR(FRm) );4.940 - XOP2I(OP_ADD, -4, R_R(Rn) );4.941 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.942 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.943 + XOP2TSE(OP_STOREL, REG_TMP0, R_FR(FRm) );4.944 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.945 }4.946 :}4.947 FMOV @Rm+, FRn {:4.948 CHECKFPUEN();4.949 if( sh4_xir.double_size ) {4.950 RALIGN64( R_R(Rm) );4.951 - XOP2( OP_LOADQ, R_R(Rm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.952 - XOP2I( OP_ADD, 8, R_R(Rm) );4.953 + XOP2SSE( OP_LOADQ, R_R(Rm), (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.954 + XOP2IS( OP_ADD, 8, R_R(Rm) );4.955 } else {4.956 RALIGN32( R_R(Rm) );4.957 - XOP2( OP_LOADL, R_R(Rm), R_FR(FRn) );4.958 - XOP2I( OP_ADD, 4, R_R(Rm) );4.959 + XOP2SSE( OP_LOADL, R_R(Rm), R_FR(FRn) );4.960 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.961 }4.962 :}4.963 FMOV FRm, @(R0, Rn) {:4.964 CHECKFPUEN();4.965 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.966 - XOP2( OP_ADD, R_R(Rn), REG_TMP0 );4.967 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.968 + XOP2ST( OP_ADD, R_R(Rn), REG_TMP0 );4.969 if( sh4_xir.double_size ) {4.970 WALIGN64( REG_TMP0 );4.971 - XOP2E( OP_STOREQ, REG_TMP0, (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.972 + XOP2TSE( OP_STOREQ, REG_TMP0, (FRm&1) ? R_XD(FRm) : R_DR(FRm) );4.973 } else {4.974 WALIGN32( REG_TMP0 );4.975 - XOP2E( OP_STOREL, REG_TMP0, R_FR(FRm) );4.976 + XOP2TSE( OP_STOREL, REG_TMP0, R_FR(FRm) );4.977 }4.978 :}4.979 FMOV @(R0, Rm), FRn {:4.980 CHECKFPUEN();4.981 - XOP2( OP_MOV, R_R0, REG_TMP0 );4.982 - XOP2( OP_ADD, R_R(Rm), REG_TMP0 );4.983 + XOP2ST( OP_MOV, R_R0, REG_TMP0 );4.984 + XOP2ST( OP_ADD, R_R(Rm), REG_TMP0 );4.985 if( sh4_xir.double_size ) {4.986 RALIGN64( REG_TMP0 );4.987 - XOP2E( OP_LOADQ, REG_TMP0, (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.988 + XOP2TSE( OP_LOADQ, REG_TMP0, (FRn&1) ? R_XD(FRn) : R_DR(FRn) );4.989 } else {4.990 RALIGN32( REG_TMP0 );4.991 - XOP2E( OP_LOADL, REG_TMP0, R_FR(FRn) );4.992 + XOP2TSE( OP_LOADL, REG_TMP0, R_FR(FRn) );4.993 }4.994 :}4.995 FLDI0 FRn {: /* IFF PR=0 */4.996 CHECKFPUEN();4.997 if( sh4_xir.double_prec == 0 ) {4.998 - XOP2F( OP_MOV, 0.0, R_FR(FRn) );4.999 + XOP2FS( OP_MOV, 0.0, R_FR(FRn) );4.1000 }4.1001 :}4.1002 FLDI1 FRn {: /* IFF PR=0 */4.1003 CHECKFPUEN();4.1004 if( sh4_xir.double_prec == 0 ) {4.1005 - XOP2F( OP_MOV, 1.0, R_FR(FRn) );4.1006 + XOP2FS( OP_MOV, 1.0, R_FR(FRn) );4.1007 }4.1008 :}4.1009 FLOAT FPUL, FRn {:4.1010 CHECKFPUEN();4.1011 if( sh4_xir.double_prec ) {4.1012 - XOP2( OP_ITOD, R_FPUL, R_DR(FRn) );4.1013 + XOP2SS( OP_ITOD, R_FPUL, R_DR(FRn) );4.1014 } else {4.1015 - XOP2( OP_ITOF, R_FPUL, R_FR(FRn) );4.1016 + XOP2SS( OP_ITOF, R_FPUL, R_FR(FRn) );4.1017 }4.1018 :}4.1019 FTRC FRm, FPUL {:4.1020 CHECKFPUEN();4.1021 if( sh4_xir.double_prec ) {4.1022 - XOP2( OP_DTOI, R_DR(FRm), R_FPUL );4.1023 + XOP2SS( OP_DTOI, R_DR(FRm), R_FPUL );4.1024 } else {4.1025 - XOP2( OP_FTOI, R_FR(FRm), R_FPUL );4.1026 + XOP2SS( OP_FTOI, R_FR(FRm), R_FPUL );4.1027 }4.1028 :}4.1029 FLDS FRm, FPUL {:4.1030 CHECKFPUEN();4.1031 - XOP2( OP_MOV, R_FR(FRm), R_FPUL );4.1032 + XOP2SS( OP_MOV, R_FR(FRm), R_FPUL );4.1033 :}4.1034 FSTS FPUL, FRn {:4.1035 CHECKFPUEN();4.1036 - XOP2( OP_MOV, R_FPUL, R_FR(FRn) );4.1037 + XOP2SS( OP_MOV, R_FPUL, R_FR(FRn) );4.1038 :}4.1039 FCNVDS FRm, FPUL {:4.1040 CHECKFPUEN();4.1041 if( sh4_xir.double_prec && !sh4_xir.double_size ) {4.1042 - XOP2( OP_DTOF, R_DR(FRm), R_FPUL );4.1043 + XOP2SS( OP_DTOF, R_DR(FRm), R_FPUL );4.1044 }4.1045 :}4.1046 FCNVSD FPUL, FRn {:4.1047 CHECKFPUEN();4.1048 if( sh4_xir.double_prec && !sh4_xir.double_size ) {4.1049 - XOP2( OP_FTOD, R_FPUL, R_DR(FRn) );4.1050 + XOP2SS( OP_FTOD, R_FPUL, R_DR(FRn) );4.1051 }4.1052 :}4.1053 FABS FRn {:4.1054 CHECKFPUEN();4.1055 if( sh4_xir.double_prec ) {4.1056 - XOP1( OP_ABSD, R_DR(FRn) );4.1057 + XOP2SS( OP_ABSD, R_DR(FRn), R_DR(FRn) );4.1058 } else {4.1059 - XOP1( OP_ABSF, R_FR(FRn) );4.1060 + XOP2SS( OP_ABSF, R_FR(FRn), R_FR(FRn) );4.1061 }4.1062 :}4.1063 FADD FRm, FRn {:4.1064 CHECKFPUEN();4.1065 if( sh4_xir.double_prec ) {4.1066 - XOP2( OP_ADDD, R_DR(FRm), R_DR(FRn) );4.1067 + XOP2SS( OP_ADDD, R_DR(FRm), R_DR(FRn) );4.1068 } else {4.1069 - XOP2( OP_ADDF, R_FR(FRm), R_FR(FRn) );4.1070 + XOP2SS( OP_ADDF, R_FR(FRm), R_FR(FRn) );4.1071 }4.1072 :}4.1073 FDIV FRm, FRn {:4.1074 CHECKFPUEN();4.1075 if( sh4_xir.double_prec ) {4.1076 - XOP2( OP_DIVD, R_DR(FRm), R_DR(FRn) );4.1077 + XOP2SS( OP_DIVD, R_DR(FRm), R_DR(FRn) );4.1078 } else {4.1079 - XOP2( OP_DIVF, R_FR(FRm), R_FR(FRn) );4.1080 + XOP2SS( OP_DIVF, R_FR(FRm), R_FR(FRn) );4.1081 }4.1082 :}4.1083 FMAC FR0, FRm, FRn {:4.1084 CHECKFPUEN();4.1085 if( sh4_xir.double_prec == 0 ) {4.1086 - XOP2( OP_MOV, R_FR(0), REG_TMP0 );4.1087 - XOP2( OP_MULF, R_FR(FRm), REG_TMP0 );4.1088 - XOP2( OP_ADDF, REG_TMP0, R_FR(FRn) );4.1089 + XOP2ST( OP_MOV, R_FR(0), REG_TMP0 );4.1090 + XOP2ST( OP_MULF, R_FR(FRm), REG_TMP0 );4.1091 + XOP2TS( OP_ADDF, REG_TMP0, R_FR(FRn) );4.1092 }4.1093 :}4.1094 FMUL FRm, FRn {:4.1095 CHECKFPUEN();4.1096 if( sh4_xir.double_prec ) {4.1097 - XOP2( OP_MULD, R_DR(FRm), R_DR(FRn) );4.1098 + XOP2SS( OP_MULD, R_DR(FRm), R_DR(FRn) );4.1099 } else {4.1100 - XOP2( OP_MULF, R_FR(FRm), R_FR(FRn) );4.1101 + XOP2SS( OP_MULF, R_FR(FRm), R_FR(FRn) );4.1102 }4.1103 :}4.1104 FNEG FRn {:4.1105 CHECKFPUEN();4.1106 if( sh4_xir.double_prec ) {4.1107 - XOP1( OP_NEGD, R_DR(FRn) );4.1108 + XOP2SS( OP_NEGD, R_DR(FRn), R_DR(FRn) );4.1109 } else {4.1110 - XOP1( OP_NEGF, R_FR(FRn) );4.1111 + XOP2SS( OP_NEGF, R_FR(FRn), R_FR(FRn) );4.1112 }4.1113 :}4.1114 FSRRA FRn {:4.1115 CHECKFPUEN();4.1116 if( sh4_xir.double_prec == 0 ) {4.1117 - XOP1( OP_RSQRTF, R_FR(FRn) );4.1118 + XOP2SS( OP_RSQRTF, R_FR(FRn), R_FR(FRn) );4.1119 }4.1120 :}4.1121 FSQRT FRn {:4.1122 CHECKFPUEN();4.1123 if( sh4_xir.double_prec ) {4.1124 - XOP1( OP_SQRTD, R_DR(FRn) );4.1125 + XOP2SS( OP_SQRTD, R_DR(FRn), R_DR(FRn) );4.1126 } else {4.1127 - XOP1( OP_SQRTF, R_FR(FRn) );4.1128 + XOP2SS( OP_SQRTF, R_FR(FRn), R_FR(FRn) );4.1129 }4.1130 :}4.1131 FSUB FRm, FRn {:4.1132 CHECKFPUEN();4.1133 if( sh4_xir.double_prec ) {4.1134 - XOP2( OP_SUBD, R_DR(FRm), R_DR(FRn) );4.1135 + XOP2SS( OP_SUBD, R_DR(FRm), R_DR(FRn) );4.1136 } else {4.1137 - XOP2( OP_SUBF, R_FR(FRm), R_FR(FRn) );4.1138 + XOP2SS( OP_SUBF, R_FR(FRm), R_FR(FRn) );4.1139 }4.1140 :}4.1141 FCMP/EQ FRm, FRn {:4.1142 CHECKFPUEN();4.1143 if( sh4_xir.double_prec ) {4.1144 - XOP2( OP_CMPD, R_DR(FRm), R_DR(FRn) );4.1145 + XOP2SS( OP_CMPD, R_DR(FRm), R_DR(FRn) );4.1146 } else {4.1147 - XOP2( OP_CMPF, R_FR(FRm), R_FR(FRn) );4.1148 + XOP2SS( OP_CMPF, R_FR(FRm), R_FR(FRn) );4.1149 }4.1150 - XOP1CC( OP_ST, CC_EQ, R_T );4.1151 + XOP1SCC( OP_ST, CC_EQ, R_T );4.1152 :}4.1153 FCMP/GT FRm, FRn {:4.1154 CHECKFPUEN();4.1155 if( sh4_xir.double_prec ) {4.1156 - XOP2( OP_CMPD, R_DR(FRm), R_DR(FRn) );4.1157 + XOP2SS( OP_CMPD, R_DR(FRm), R_DR(FRn) );4.1158 } else {4.1159 - XOP2( OP_CMPF, R_FR(FRm), R_FR(FRn) );4.1160 + XOP2SS( OP_CMPF, R_FR(FRm), R_FR(FRn) );4.1161 }4.1162 - XOP1CC( OP_ST, CC_SGT, R_T );4.1163 + XOP1SCC( OP_ST, CC_SGT, R_T );4.1164 :}4.1165 FSCA FPUL, FRn {:4.1166 CHECKFPUEN();4.1167 if( sh4_xir.double_prec == 0 ) {4.1168 - XOP2( OP_SINCOSF, R_FPUL, R_DR(FRn) );4.1169 + XOP2SS( OP_SINCOSF, R_FPUL, R_DR(FRn) );4.1170 }4.1171 :}4.1172 FIPR FVm, FVn {:4.1173 CHECKFPUEN();4.1174 if( sh4_xir.double_prec == 0 ) {4.1175 - XOP2( OP_DOTPRODV, R_FV(FVm), R_FV(FVn) );4.1176 + XOP2SS( OP_DOTPRODV, R_FV(FVm), R_FV(FVn) );4.1177 }4.1178 :}4.1179 FTRV XMTRX, FVn {:4.1180 CHECKFPUEN();4.1181 if( sh4_xir.double_prec == 0 ) {4.1182 - XOP2( OP_MATMULV, R_XMTRX, R_FV(FVn) );4.1183 + XOP2SS( OP_MATMULV, R_XMTRX, R_FV(FVn) );4.1184 }4.1185 :}4.1186 FRCHG {:4.1187 CHECKFPUEN();4.1188 - XOP2I( OP_XOR, FPSCR_FR, R_FPSCR );4.1189 + XOP2IS( OP_XOR, FPSCR_FR, R_FPSCR );4.1190 XOPCALL0( sh4_switch_fr_banks );4.1191 :}4.1192 FSCHG {:4.1193 CHECKFPUEN();4.1194 - XOP2I( OP_XOR, FPSCR_SZ, R_FPSCR );4.1195 - XOP2I( OP_XOR, FPSCR_SZ, R_SH4_MODE );4.1196 + XOP2IS( OP_XOR, FPSCR_SZ, R_FPSCR );4.1197 + XOP2IS( OP_XOR, FPSCR_SZ, R_SH4_MODE );4.1198 sh4_xir.double_size = !sh4_xir.double_size;4.1199 :}4.1200 LDC Rm, SR {:4.1201 @@ -903,20 +941,20 @@4.1202 SLOTILLEGAL();4.1203 } else {4.1204 CHECKPRIV();4.1205 - XOPCALL1( sh4_write_sr, R_R(Rm) );4.1206 + XOPCALL1S( sh4_write_sr, R_R(Rm) );4.1207 }4.1208 return 2;4.1209 :}4.1210 -LDC Rm, GBR {: XOP2( OP_MOV, R_R(Rm), R_GBR ); :}4.1211 -LDC Rm, VBR {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_VBR ); :}4.1212 -LDC Rm, SSR {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_SSR ); :}4.1213 -LDC Rm, SGR {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_SGR ); :}4.1214 -LDC Rm, SPC {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_SPC ); :}4.1215 -LDC Rm, DBR {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_DBR ); :}4.1216 -LDC Rm, Rn_BANK {: CHECKPRIV(); XOP2( OP_MOV, R_R(Rm), R_BANK(Rn_BANK) ); :}4.1217 +LDC Rm, GBR {: XOP2SS( OP_MOV, R_R(Rm), R_GBR ); :}4.1218 +LDC Rm, VBR {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_VBR ); :}4.1219 +LDC Rm, SSR {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_SSR ); :}4.1220 +LDC Rm, SGR {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_SGR ); :}4.1221 +LDC Rm, SPC {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_SPC ); :}4.1222 +LDC Rm, DBR {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_DBR ); :}4.1223 +LDC Rm, Rn_BANK {: CHECKPRIV(); XOP2SS( OP_MOV, R_R(Rm), R_BANK(Rn_BANK) ); :}4.1224 LDC.L @Rm+, GBR {:4.1225 - XOP2E( OP_LOADL, R_R(Rm), R_GBR );4.1226 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1227 + XOP2SSE( OP_LOADL, R_R(Rm), R_GBR );4.1228 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1229 :}4.1230 LDC.L @Rm+, SR {:4.1231 if( in_delay_slot ) {4.1232 @@ -924,225 +962,225 @@4.1233 } else {4.1234 CHECKPRIV();4.1235 RALIGN32( R_R(Rm) );4.1236 - XOP2E( OP_LOADL, R_R(Rm), REG_TMP0 );4.1237 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1238 - XOPCALL1( sh4_write_sr, REG_TMP0 );4.1239 + XOP2STE( OP_LOADL, R_R(Rm), REG_TMP0 );4.1240 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1241 + XOPCALL1T( sh4_write_sr, REG_TMP0 );4.1242 }4.1243 return 2;4.1244 :}4.1245 LDC.L @Rm+, VBR {:4.1246 CHECKPRIV();4.1247 RALIGN32( R_R(Rm) );4.1248 - XOP2E( OP_LOADL, R_R(Rm), R_VBR );4.1249 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1250 + XOP2SSE( OP_LOADL, R_R(Rm), R_VBR );4.1251 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1252 :}4.1253 LDC.L @Rm+, SSR {:4.1254 CHECKPRIV();4.1255 RALIGN32( R_R(Rm) );4.1256 - XOP2E( OP_LOADL, R_R(Rm), R_SSR );4.1257 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1258 + XOP2SSE( OP_LOADL, R_R(Rm), R_SSR );4.1259 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1260 :}4.1261 LDC.L @Rm+, SGR {:4.1262 CHECKPRIV();4.1263 RALIGN32( R_R(Rm) );4.1264 - XOP2E( OP_LOADL, R_R(Rm), R_SGR );4.1265 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1266 + XOP2SSE( OP_LOADL, R_R(Rm), R_SGR );4.1267 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1268 :}4.1269 LDC.L @Rm+, SPC {:4.1270 CHECKPRIV();4.1271 RALIGN32( R_R(Rm) );4.1272 - XOP2E( OP_LOADL, R_R(Rm), R_SPC );4.1273 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1274 + XOP2SSE( OP_LOADL, R_R(Rm), R_SPC );4.1275 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1276 :}4.1277 LDC.L @Rm+, DBR {:4.1278 CHECKPRIV();4.1279 RALIGN32( R_R(Rm) );4.1280 - XOP2E( OP_LOADL, R_R(Rm), R_DBR );4.1281 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1282 + XOP2SSE( OP_LOADL, R_R(Rm), R_DBR );4.1283 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1284 :}4.1285 LDC.L @Rm+, Rn_BANK {:4.1286 CHECKPRIV();4.1287 RALIGN32( R_R(Rm) );4.1288 - XOP2E( OP_LOADL, R_R(Rm), R_BANK(Rn_BANK) );4.1289 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1290 + XOP2SSE( OP_LOADL, R_R(Rm), R_BANK(Rn_BANK) );4.1291 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1292 :}4.1293 LDS Rm, FPSCR {:4.1294 CHECKFPUEN();4.1295 - XOPCALL1( sh4_write_fpscr, R_R(Rm) );4.1296 + XOPCALL1S( sh4_write_fpscr, R_R(Rm) );4.1297 return 2;4.1298 :}4.1299 LDS Rm, FPUL {:4.1300 CHECKFPUEN();4.1301 - XOP2( OP_MOV, R_R(Rm), R_FPUL );4.1302 + XOP2SS( OP_MOV, R_R(Rm), R_FPUL );4.1303 :}4.1304 -LDS Rm, MACH {: XOP2( OP_MOV, R_R(Rm), R_MACH ); :}4.1305 -LDS Rm, MACL {: XOP2( OP_MOV, R_R(Rm), R_MACL ); :}4.1306 -LDS Rm, PR {: XOP2( OP_MOV, R_R(Rm), R_PR ); :}4.1307 +LDS Rm, MACH {: XOP2SS( OP_MOV, R_R(Rm), R_MACH ); :}4.1308 +LDS Rm, MACL {: XOP2SS( OP_MOV, R_R(Rm), R_MACL ); :}4.1309 +LDS Rm, PR {: XOP2SS( OP_MOV, R_R(Rm), R_PR ); :}4.1310 LDS.L @Rm+, FPSCR {:4.1311 CHECKFPUEN();4.1312 RALIGN32( R_R(Rm) );4.1313 - XOP2E( OP_LOADL, R_R(Rm), REG_TMP0 );4.1314 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1315 - XOPCALL1( sh4_write_fpscr, REG_TMP0 );4.1316 + XOP2STE( OP_LOADL, R_R(Rm), REG_TMP0 );4.1317 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1318 + XOPCALL1T( sh4_write_fpscr, REG_TMP0 );4.1319 return 2;4.1320 :}4.1321 LDS.L @Rm+, FPUL {:4.1322 CHECKFPUEN();4.1323 RALIGN32( R_R(Rm) );4.1324 - XOP2E( OP_LOADL, R_R(Rm), R_FPUL );4.1325 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1326 + XOP2SSE( OP_LOADL, R_R(Rm), R_FPUL );4.1327 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1328 :}4.1329 LDS.L @Rm+, MACH {:4.1330 RALIGN32( R_R(Rm) );4.1331 - XOP2E( OP_LOADL, R_R(Rm), R_MACH );4.1332 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1333 + XOP2SSE( OP_LOADL, R_R(Rm), R_MACH );4.1334 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1335 :}4.1336 LDS.L @Rm+, MACL {:4.1337 RALIGN32( R_R(Rm) );4.1338 - XOP2E( OP_LOADL, R_R(Rm), R_MACL );4.1339 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1340 + XOP2SSE( OP_LOADL, R_R(Rm), R_MACL );4.1341 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1342 :}4.1343 LDS.L @Rm+, PR {:4.1344 RALIGN32( R_R(Rm) );4.1345 - XOP2E( OP_LOADL, R_R(Rm), R_PR );4.1346 - XOP2I( OP_ADD, 4, R_R(Rm) );4.1347 + XOP2SSE( OP_LOADL, R_R(Rm), R_PR );4.1348 + XOP2IS( OP_ADD, 4, R_R(Rm) );4.1349 :}4.1350 STC SR, Rn {:4.1351 CHECKPRIV();4.1352 - XOPCALLR( sh4_read_sr, R_R(Rn) );4.1353 + XOPCALLRS( sh4_read_sr, R_R(Rn) );4.1354 :}4.1355 -STC GBR, Rn {: XOP2( OP_MOV, R_GBR, R_R(Rn) ); :}4.1356 -STC VBR, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_VBR, R_R(Rn) ); :}4.1357 -STC SSR, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_SSR, R_R(Rn) ); :}4.1358 -STC SPC, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_SPC, R_R(Rn) ); :}4.1359 -STC SGR, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_SGR, R_R(Rn) ); :}4.1360 -STC DBR, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_DBR, R_R(Rn) ); :}4.1361 -STC Rm_BANK, Rn {: CHECKPRIV(); XOP2( OP_MOV, R_BANK(Rm_BANK), R_R(Rn) ); :}4.1362 +STC GBR, Rn {: XOP2SS( OP_MOV, R_GBR, R_R(Rn) ); :}4.1363 +STC VBR, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_VBR, R_R(Rn) ); :}4.1364 +STC SSR, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_SSR, R_R(Rn) ); :}4.1365 +STC SPC, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_SPC, R_R(Rn) ); :}4.1366 +STC SGR, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_SGR, R_R(Rn) ); :}4.1367 +STC DBR, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_DBR, R_R(Rn) ); :}4.1368 +STC Rm_BANK, Rn {: CHECKPRIV(); XOP2SS( OP_MOV, R_BANK(Rm_BANK), R_R(Rn) ); :}4.1369 STC.L SR, @-Rn {:4.1370 CHECKPRIV();4.1371 - XOPCALLR( sh4_read_sr, REG_TMP1 );4.1372 + XOPCALLRT( sh4_read_sr, REG_TMP1 );4.1373 WALIGN32( R_R(Rn) );4.1374 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1375 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1376 - XOP2E(OP_STOREL, REG_TMP0, REG_TMP1 );4.1377 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1378 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1379 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1380 + XOP2TTE(OP_STOREL, REG_TMP0, REG_TMP1 );4.1381 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1382 :}4.1383 STC.L VBR, @-Rn {:4.1384 CHECKPRIV();4.1385 WALIGN32( R_R(Rn) );4.1386 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1387 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1388 - XOP2E(OP_STOREL, REG_TMP0, R_VBR );4.1389 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1390 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1391 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1392 + XOP2TSE(OP_STOREL, REG_TMP0, R_VBR );4.1393 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1394 :}4.1395 STC.L SSR, @-Rn {:4.1396 CHECKPRIV();4.1397 WALIGN32( R_R(Rn) );4.1398 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1399 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1400 - XOP2E(OP_STOREL, REG_TMP0, R_SSR );4.1401 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1402 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1403 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1404 + XOP2TSE(OP_STOREL, REG_TMP0, R_SSR );4.1405 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1406 :}4.1407 STC.L SPC, @-Rn {:4.1408 CHECKPRIV();4.1409 WALIGN32( R_R(Rn) );4.1410 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1411 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1412 - XOP2E(OP_STOREL, REG_TMP0, R_SPC );4.1413 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1414 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1415 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1416 + XOP2TSE(OP_STOREL, REG_TMP0, R_SPC );4.1417 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1418 :}4.1419 STC.L SGR, @-Rn {:4.1420 CHECKPRIV();4.1421 WALIGN32( R_R(Rn) );4.1422 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1423 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1424 - XOP2E(OP_STOREL, REG_TMP0, R_SGR );4.1425 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1426 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1427 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1428 + XOP2TSE(OP_STOREL, REG_TMP0, R_SGR );4.1429 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1430 :}4.1431 STC.L DBR, @-Rn {:4.1432 CHECKPRIV();4.1433 WALIGN32( R_R(Rn) );4.1434 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1435 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1436 - XOP2E(OP_STOREL, REG_TMP0, R_DBR );4.1437 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1438 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1439 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1440 + XOP2TSE(OP_STOREL, REG_TMP0, R_DBR );4.1441 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1442 :}4.1443 STC.L Rm_BANK, @-Rn {:4.1444 CHECKPRIV();4.1445 WALIGN32( R_R(Rn) );4.1446 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1447 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1448 - XOP2E(OP_STOREL, REG_TMP0, R_BANK(Rm_BANK) );4.1449 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1450 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1451 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1452 + XOP2TSE(OP_STOREL, REG_TMP0, R_BANK(Rm_BANK) );4.1453 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1454 :}4.1455 STC.L GBR, @-Rn {:4.1456 WALIGN32( R_R(Rn) );4.1457 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1458 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1459 - XOP2E(OP_STOREL, REG_TMP0, R_GBR );4.1460 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1461 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1462 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1463 + XOP2TSE(OP_STOREL, REG_TMP0, R_GBR );4.1464 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1465 :}4.1466 STS FPSCR, Rn {:4.1467 CHECKFPUEN();4.1468 - XOP2( OP_MOV, R_FPSCR, R_R(Rn) );4.1469 + XOP2SS( OP_MOV, R_FPSCR, R_R(Rn) );4.1470 :}4.1471 STS FPUL, Rn {:4.1472 CHECKFPUEN();4.1473 - XOP2( OP_MOV, R_FPUL, R_R(Rn) );4.1474 + XOP2SS( OP_MOV, R_FPUL, R_R(Rn) );4.1475 :}4.1476 STS MACH, Rn {:4.1477 - XOP2( OP_MOV, R_MACH, R_R(Rn) );4.1478 + XOP2SS( OP_MOV, R_MACH, R_R(Rn) );4.1479 :}4.1480 STS MACL, Rn {:4.1481 - XOP2( OP_MOV, R_MACL, R_R(Rn) );4.1482 + XOP2SS( OP_MOV, R_MACL, R_R(Rn) );4.1483 :}4.1484 STS PR, Rn {:4.1485 - XOP2( OP_MOV, R_PR, R_R(Rn) );4.1486 + XOP2SS( OP_MOV, R_PR, R_R(Rn) );4.1487 :}4.1488 STS.L FPSCR, @-Rn {:4.1489 CHECKFPUEN();4.1490 WALIGN32( R_R(Rn) );4.1491 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1492 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1493 - XOP2E(OP_STOREL, REG_TMP0, R_FPSCR );4.1494 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1495 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1496 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1497 + XOP2TSE(OP_STOREL, REG_TMP0, R_FPSCR );4.1498 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1499 :}4.1500 STS.L FPUL, @-Rn {:4.1501 CHECKFPUEN();4.1502 WALIGN32( R_R(Rn) );4.1503 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1504 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1505 - XOP2E(OP_STOREL, REG_TMP0, R_FPUL );4.1506 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1507 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1508 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1509 + XOP2TSE(OP_STOREL, REG_TMP0, R_FPUL );4.1510 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1511 :}4.1512 STS.L MACH, @-Rn {:4.1513 WALIGN32( R_R(Rn) );4.1514 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1515 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1516 - XOP2E(OP_STOREL, REG_TMP0, R_MACH );4.1517 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1518 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1519 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1520 + XOP2TSE(OP_STOREL, REG_TMP0, R_MACH );4.1521 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1522 :}4.1523 STS.L MACL, @-Rn {:4.1524 WALIGN32( R_R(Rn) );4.1525 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1526 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1527 - XOP2E(OP_STOREL, REG_TMP0, R_MACL );4.1528 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1529 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1530 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1531 + XOP2TSE(OP_STOREL, REG_TMP0, R_MACL );4.1532 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1533 :}4.1534 STS.L PR, @-Rn {:4.1535 WALIGN32( R_R(Rn) );4.1536 - XOP2( OP_MOV, R_R(Rn), REG_TMP0 );4.1537 - XOP2I(OP_ADD, -4, REG_TMP0 );4.1538 - XOP2E(OP_STOREL, REG_TMP0, R_PR );4.1539 - XOP2I(OP_ADD, -4, R_R(Rn) );4.1540 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP0 );4.1541 + XOP2IT(OP_ADD, -4, REG_TMP0 );4.1542 + XOP2TSE(OP_STOREL, REG_TMP0, R_PR );4.1543 + XOP2IS(OP_ADD, -4, R_R(Rn) );4.1544 :}4.1546 BF disp {:4.1547 if( in_delay_slot ) {4.1548 SLOTILLEGAL();4.1549 } else {4.1550 - XOP2I( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1551 - XOP2I( OP_CMP, 0, R_T );4.1552 + XOP2IS( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1553 + XOP2IS( OP_CMP, 0, R_T );4.1554 XOP2IICC( OP_BRCOND, CC_EQ, disp+pc+4-xbb->pc_begin, pc+2-xbb->pc_begin );4.1555 }4.1556 return 2;4.1557 @@ -1153,16 +1191,16 @@4.1558 return 2;4.1559 } else {4.1560 if( UNTRANSLATABLE(pc+2 ) ) {4.1561 - XOP2I( OP_CMP, 0, R_T );4.1562 + XOP2IS( OP_CMP, 0, R_T );4.1563 XOP2IICC( OP_BRCONDDEL, CC_EQ, disp+pc+4-xbb->pc_begin, pc+4-xbb->pc_begin );4.1564 EMU_DELAY_SLOT();4.1565 return 2;4.1566 } else {4.1567 - XOP2( OP_MOV, R_T, REG_TMP2 );4.1568 + XOP2ST( OP_MOV, R_T, REG_TMP2 );4.1569 sh4_decode_instruction( xbb, pc+2, TRUE );4.1570 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1571 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1572 - XOP2I( OP_CMP, 0, REG_TMP2 );4.1573 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1574 + XOP2IT( OP_CMP, 0, REG_TMP2 );4.1575 XOP2IICC( OP_BRCOND, CC_EQ, disp+pc+4-xbb->pc_begin, pc+4-xbb->pc_begin );4.1576 }4.1577 return 4;4.1578 @@ -1173,8 +1211,8 @@4.1579 if( in_delay_slot ) {4.1580 SLOTILLEGAL();4.1581 } else {4.1582 - XOP2I( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1583 - XOP2I( OP_CMP, 1, R_T );4.1584 + XOP2IS( OP_ADD, (pc+2 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1585 + XOP2IS( OP_CMP, 1, R_T );4.1586 XOP2IICC( OP_BRCOND, CC_EQ, disp+pc+4-xbb->pc_begin, pc+2-xbb->pc_begin );4.1587 }4.1588 return 2;4.1589 @@ -1185,16 +1223,16 @@4.1590 return 2;4.1591 } else {4.1592 if( UNTRANSLATABLE(pc+2 ) ) {4.1593 - XOP2I( OP_CMP, 1, R_T );4.1594 + XOP2IS( OP_CMP, 1, R_T );4.1595 XOP2IICC( OP_BRCONDDEL, CC_EQ, disp+pc+4-xbb->pc_begin, pc+2-xbb->pc_begin );4.1596 EMU_DELAY_SLOT();4.1597 return 2;4.1598 } else {4.1599 - XOP2( OP_MOV, R_T, REG_TMP2 );4.1600 + XOP2ST( OP_MOV, R_T, REG_TMP2 );4.1601 sh4_decode_instruction( xbb, pc+2, TRUE );4.1602 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1603 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1604 - XOP2I( OP_CMP, 1, REG_TMP2 );4.1605 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1606 + XOP2IT( OP_CMP, 1, REG_TMP2 );4.1607 XOP2IICC( OP_BRCOND, CC_EQ, disp+pc+4-xbb->pc_begin, pc+4-xbb->pc_begin );4.1608 }4.1609 return 4;4.1610 @@ -1207,14 +1245,14 @@4.1611 return 2;4.1612 } else {4.1613 if( UNTRANSLATABLE(pc+2) ) {4.1614 - XOP2( OP_MOV, R_PC, R_NEW_PC );4.1615 - XOP2I( OP_ADD, pc+disp+4-xbb->pc_begin, R_NEW_PC );4.1616 + XOP2SS( OP_MOV, R_PC, R_NEW_PC );4.1617 + XOP2IS( OP_ADD, pc+disp+4-xbb->pc_begin, R_NEW_PC );4.1618 EMU_DELAY_SLOT();4.1619 return 2;4.1620 } else {4.1621 sh4_decode_instruction( xbb, pc+2, TRUE );4.1622 if( xbb->ir_ptr->prev == NULL || !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1623 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1624 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1625 XOP1I( OP_BRREL, pc+disp+4-xbb->pc_begin );4.1626 }4.1627 return 4;4.1628 @@ -1226,18 +1264,18 @@4.1629 SLOTILLEGAL();4.1630 return 2;4.1631 } else {4.1632 - XOP2( OP_MOV, R_R(Rn), REG_TMP2 );4.1633 - XOP2( OP_ADD, R_PC, REG_TMP2 );4.1634 - XOP2I( OP_ADD, pc - xbb->pc_begin + 4, REG_TMP2 );4.1635 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP2 );4.1636 + XOP2ST( OP_ADD, R_PC, REG_TMP2 );4.1637 + XOP2IT( OP_ADD, pc - xbb->pc_begin + 4, REG_TMP2 );4.1638 if( UNTRANSLATABLE(pc+2) ) {4.1639 - XOP2( OP_MOV, REG_TMP2, R_NEW_PC );4.1640 + XOP2TS( OP_MOV, REG_TMP2, R_NEW_PC );4.1641 EMU_DELAY_SLOT();4.1642 return 2;4.1643 } else {4.1644 sh4_decode_instruction( xbb, pc + 2, TRUE );4.1645 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1646 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1647 - XOP1( OP_BR, REG_TMP2 );4.1648 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1649 + XOP1T( OP_BR, REG_TMP2 );4.1650 }4.1651 return 4;4.1652 }4.1653 @@ -1248,17 +1286,17 @@4.1654 SLOTILLEGAL();4.1655 return 2;4.1656 } else {4.1657 - XOP2( OP_MOV, R_PC, R_PR );4.1658 - XOP2I( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1659 + XOP2SS( OP_MOV, R_PC, R_PR );4.1660 + XOP2IS( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1661 if( UNTRANSLATABLE(pc+2) ) {4.1662 - XOP2( OP_MOV, R_PC, R_NEW_PC );4.1663 - XOP2I( OP_ADD, pc+disp+4-xbb->pc_begin, R_NEW_PC );4.1664 + XOP2SS( OP_MOV, R_PC, R_NEW_PC );4.1665 + XOP2IS( OP_ADD, pc+disp+4-xbb->pc_begin, R_NEW_PC );4.1666 EMU_DELAY_SLOT();4.1667 return 2;4.1668 } else {4.1669 sh4_decode_instruction( xbb, pc+2, TRUE );4.1670 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1671 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1672 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1673 XOP1I( OP_BRREL, pc+disp+4-xbb->pc_begin );4.1674 }4.1675 return 4;4.1676 @@ -1270,20 +1308,20 @@4.1677 SLOTILLEGAL();4.1678 return 2;4.1679 } else {4.1680 - XOP2( OP_MOV, R_PC, R_PR );4.1681 - XOP2I( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1682 - XOP2( OP_MOV, R_R(Rn), REG_TMP2 );4.1683 - XOP2( OP_ADD, R_PC, REG_TMP2 );4.1684 - XOP2I( OP_ADD, pc - xbb->pc_begin + 4, REG_TMP2 );4.1685 + XOP2SS( OP_MOV, R_PC, R_PR );4.1686 + XOP2IS( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1687 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP2 );4.1688 + XOP2ST( OP_ADD, R_PC, REG_TMP2 );4.1689 + XOP2IT( OP_ADD, pc - xbb->pc_begin + 4, REG_TMP2 );4.1690 if( UNTRANSLATABLE(pc+2) ) {4.1691 - XOP2( OP_MOV, REG_TMP2, R_NEW_PC );4.1692 + XOP2TS( OP_MOV, REG_TMP2, R_NEW_PC );4.1693 EMU_DELAY_SLOT();4.1694 return 2;4.1695 } else {4.1696 sh4_decode_instruction( xbb, pc+2, TRUE );4.1697 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1698 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1699 - XOP1( OP_BR, REG_TMP2 );4.1700 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1701 + XOP1T( OP_BR, REG_TMP2 );4.1702 }4.1703 return 4;4.1704 }4.1705 @@ -1295,15 +1333,15 @@4.1706 return 2;4.1707 } else {4.1708 if( UNTRANSLATABLE(pc+2) ) {4.1709 - XOP2( OP_MOV, R_R(Rn), R_NEW_PC );4.1710 + XOP2SS( OP_MOV, R_R(Rn), R_NEW_PC );4.1711 EMU_DELAY_SLOT();4.1712 return 2;4.1713 } else {4.1714 - XOP2( OP_MOV, R_R(Rn), REG_TMP2 );4.1715 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP2 );4.1716 sh4_decode_instruction( xbb, pc+2, TRUE );4.1717 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1718 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1719 - XOP1( OP_BR, REG_TMP2 );4.1720 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1721 + XOP1T( OP_BR, REG_TMP2 );4.1722 }4.1723 return 4;4.1724 }4.1725 @@ -1314,18 +1352,18 @@4.1726 SLOTILLEGAL();4.1727 return 2;4.1728 } else {4.1729 - XOP2( OP_MOV, R_PC, R_PR );4.1730 - XOP2I( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1731 + XOP2SS( OP_MOV, R_PC, R_PR );4.1732 + XOP2IS( OP_ADD, pc - xbb->pc_begin + 4, R_PR );4.1733 if( UNTRANSLATABLE(pc+2) ) {4.1734 - XOP2( OP_MOV, R_R(Rn), R_NEW_PC );4.1735 + XOP2SS( OP_MOV, R_R(Rn), R_NEW_PC );4.1736 EMU_DELAY_SLOT();4.1737 return 2;4.1738 } else {4.1739 - XOP2( OP_MOV, R_R(Rn), REG_TMP2 );4.1740 + XOP2ST( OP_MOV, R_R(Rn), REG_TMP2 );4.1741 sh4_decode_instruction( xbb, pc+2, TRUE );4.1742 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1743 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1744 - XOP1( OP_BR, REG_TMP2 );4.1745 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1746 + XOP1T( OP_BR, REG_TMP2 );4.1747 }4.1748 return 4;4.1749 }4.1750 @@ -1338,16 +1376,16 @@4.1751 return 2;4.1752 } else {4.1753 if( UNTRANSLATABLE(pc+2) ) {4.1754 - XOP2( OP_MOV, R_SPC, R_NEW_PC );4.1755 + XOP2SS( OP_MOV, R_SPC, R_NEW_PC );4.1756 EMU_DELAY_SLOT();4.1757 return 2;4.1758 } else {4.1759 - XOP2( OP_MOV, R_SPC, REG_TMP2 );4.1760 - XOPCALL1( sh4_write_sr, R_SSR );4.1761 + XOP2ST( OP_MOV, R_SPC, REG_TMP2 );4.1762 + XOPCALL1S( sh4_write_sr, R_SSR );4.1763 sh4_decode_instruction( xbb, pc+2, TRUE );4.1764 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1765 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1766 - XOP1( OP_BR, REG_TMP2 );4.1767 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1768 + XOP1T( OP_BR, REG_TMP2 );4.1769 }4.1770 return 4;4.1771 }4.1772 @@ -1359,15 +1397,15 @@4.1773 return 2;4.1774 } else {4.1775 if( UNTRANSLATABLE(pc+2) ) {4.1776 - XOP2( OP_MOV, R_PR, R_NEW_PC );4.1777 + XOP2SS( OP_MOV, R_PR, R_NEW_PC );4.1778 EMU_DELAY_SLOT();4.1779 return 2;4.1780 } else {4.1781 - XOP2( OP_MOV, R_PR, REG_TMP2 );4.1782 + XOP2ST( OP_MOV, R_PR, REG_TMP2 );4.1783 sh4_decode_instruction( xbb, pc+2, TRUE );4.1784 if( !XOP_IS_TERMINATOR( xbb->ir_ptr->prev ) ) {4.1785 - XOP2I( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1786 - XOP1( OP_BR, REG_TMP2 );4.1787 + XOP2IS( OP_ADD, (pc+4 - xbb->pc_begin) * sh4_cpu_period, R_SLICE_CYCLE );4.1788 + XOP1T( OP_BR, REG_TMP2 );4.1789 }4.1790 return 4;4.1791 }
5.1 --- a/src/test/testsh4xir.c Tue Apr 07 10:55:03 2009 +00005.2 +++ b/src/test/testsh4xir.c Sun Apr 12 07:24:45 2009 +00005.3 @@ -135,16 +135,19 @@5.5 struct xir_basic_block xbb;5.6 xbb.source = &sh4_source_machine;5.7 + xbb.target = &x86_target_machine;5.8 xbb.ir_alloc_begin = &xir[0];5.9 xbb.ir_alloc_end = &xir[MAX_XIR_OPS];5.10 xbb.ir_begin = xbb.ir_ptr = xbb.ir_end = xbb.ir_alloc_begin;5.11 xbb.pc_begin = start_addr;5.12 xbb.pc_end = start_addr+4096;5.13 + xir_clear_basic_block(&xbb);5.14 xbb.source->decode_basic_block( &xbb );5.16 - x86_target_machine.lower( &xbb, xbb.ir_begin, xbb.ir_end );5.17 - xir_set_register_names( sh4_source_machine.reg_names, x86_target_machine.reg_names );5.18 + //x86_target_machine.lower( &xbb, xbb.ir_begin, xbb.ir_end );5.19 + xir_promote_source_registers( &xbb, xbb.ir_begin, xbb.ir_end );5.20 xir_set_symbol_table( debug_symbols );5.21 - xir_dump_block( &xir[0], NULL );5.22 + xir_dump_block( &xbb );5.23 + xir_verify_block( &xbb, xbb.ir_begin, xbb.ir_end );5.24 return 0;5.25 }
6.1 --- a/src/test/testxir.c Tue Apr 07 10:55:03 2009 +00006.2 +++ b/src/test/testxir.c Sun Apr 12 07:24:45 2009 +00006.3 @@ -22,19 +22,23 @@6.5 void test_shuffle()6.6 {6.7 + int tmp1, tmp2;6.8 struct xir_op op[64];6.9 struct xir_basic_block bb;6.10 xir_basic_block_t xbb = &bb;6.11 bb.ir_alloc_begin = bb.ir_begin = bb.ir_end = bb.ir_ptr = &op[0];6.12 bb.ir_alloc_end = &op[64];6.13 + xir_clear_basic_block( xbb );6.14 + tmp1 = xir_alloc_temp_reg( xbb, XTY_LONG, -1 );6.15 + tmp2 = xir_alloc_temp_reg( xbb, XTY_LONG, -1 );6.17 - XOP2I( OP_SHUFFLE, 0x1243, REG_TMP1 );6.18 - XOP2I( OP_SHUFFLE, 0x3412, REG_TMP1 );6.19 - XOP2I( OP_SHUFFLE, 0x1243, REG_TMP1 );6.20 - XOP2I( OP_SHUFFLE, 0x3412, REG_TMP1 );6.21 - XOP2I( OP_SHUFFLE, 0x1234, REG_TMP1 );6.22 - XOP2I( OP_SHUFFLE, 0x1111, REG_TMP2 );6.23 - XOP2I( OP_SHUFFLE, 0x0123, REG_TMP1 );6.24 + XOP2IT( OP_SHUFFLE, 0x1243, REG_TMP1 );6.25 + XOP2IT( OP_SHUFFLE, 0x3412, REG_TMP1 );6.26 + XOP2IT( OP_SHUFFLE, 0x1243, REG_TMP1 );6.27 + XOP2IT( OP_SHUFFLE, 0x3412, REG_TMP1 );6.28 + XOP2IT( OP_SHUFFLE, 0x1234, REG_TMP1 );6.29 + XOP2IT( OP_SHUFFLE, 0x1111, REG_TMP2 );6.30 + XOP2IT( OP_SHUFFLE, 0x0123, REG_TMP1 );6.31 XOP1I( OP_BR, 0x8C001000 );6.32 (bb.ir_ptr-1)->next = NULL;6.33 bb.ir_end = bb.ir_ptr-1;6.34 @@ -54,13 +58,14 @@6.35 assert( xir_shuffle_lower_size( &op[4] ) == 0);6.36 assert( xir_shuffle_lower_size( &op[5] ) == 12);6.37 assert( xir_shuffle_lower_size( &op[6] ) == 1);6.38 - xir_shuffle_lower( xbb, &op[0], REG_TMP3, REG_TMP4 );6.39 - xir_shuffle_lower( xbb, &op[1], REG_TMP3, REG_TMP4 );6.40 - xir_shuffle_lower( xbb, &op[3], REG_TMP3, REG_TMP4 );6.41 - xir_shuffle_lower( xbb, &op[4], REG_TMP3, REG_TMP4 );6.42 - xir_shuffle_lower( xbb, &op[5], REG_TMP3, REG_TMP4 );6.43 - xir_shuffle_lower( xbb, &op[6], REG_TMP3, REG_TMP4 );6.44 - xir_dump_block( &op[0], NULL );6.45 + xir_shuffle_lower( xbb, &op[0], tmp1, tmp2 );6.46 + xir_shuffle_lower( xbb, &op[1], tmp1, tmp2 );6.47 + xir_shuffle_lower( xbb, &op[3], tmp1, tmp2 );6.48 + xir_shuffle_lower( xbb, &op[4], tmp1, tmp2 );6.49 + xir_shuffle_lower( xbb, &op[5], tmp1, tmp2 );6.50 + xir_shuffle_lower( xbb, &op[6], tmp1, tmp2 );6.51 + xir_dump_block( xbb );6.52 + xir_verify_block( xbb, xbb->ir_begin, xbb->ir_end );6.53 }
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +00007.2 +++ b/src/xlat/regalloc.c Sun Apr 12 07:24:45 2009 +00007.3 @@ -0,0 +1,108 @@7.4 +/**7.5 + * $Id: regalloc.h 931 2008-10-31 02:57:59Z nkeynes $7.6 + *7.7 + * Register allocation based on simple linear scan7.8 + *7.9 + * Copyright (c) 2008 Nathan Keynes.7.10 + *7.11 + * This program is free software; you can redistribute it and/or modify7.12 + * it under the terms of the GNU General Public License as published by7.13 + * the Free Software Foundation; either version 2 of the License, or7.14 + * (at your option) any later version.7.15 + *7.16 + * This program is distributed in the hope that it will be useful,7.17 + * but WITHOUT ANY WARRANTY; without even the implied warranty of7.18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7.19 + * GNU General Public License for more details.7.20 + */7.21 +7.22 +#include <stdlib.h>7.23 +#include <string.h>7.24 +#include "lxdream.h"7.25 +#include "xir.h"7.26 +7.27 +7.28 +/**7.29 + * Promote all source registers to temporaries, in preparation for regalloc.7.30 + * In case of partial aliasing, we flush back to memory before reloading (this7.31 + * needs to be improved)7.32 + */7.33 +void xir_promote_source_registers( xir_basic_block_t xbb, xir_op_t start, xir_op_t end )7.34 +{7.35 + struct temp_reg {7.36 + gboolean is_dirty;7.37 + xir_op_t last_access;7.38 + };7.39 +7.40 + struct temp_reg all_temp_regs[MAX_TEMP_REGISTER+1];7.41 +7.42 +7.43 + /* -1 if byte is not allocated to a temporary, otherwise temp id */7.44 + int16_t source_regs[MAX_SOURCE_REGISTER+1];7.45 +7.46 + memset( source_regs, -1, sizeof(source_regs) );7.47 + memset( all_temp_regs, 0, sizeof(all_temp_regs) );7.48 +7.49 + for( xir_op_t it = start; it != NULL; it = it->next ) {7.50 + if( XOP_IS_SRC(it,0) ) {7.51 + int r = XOP_REG(it,0);7.52 + int s = XOP_OPSIZE(it,0);7.53 + int t = source_regs[r];7.54 + if( t == -1 ) {7.55 + t = xir_alloc_temp_reg( xbb, XOP_OPTYPE(it,0), r );7.56 + source_regs[r] = t;7.57 + if( XOP_READS_OP1(it) ) {7.58 + xir_insert_op( XOP2ST( OP_MOV, r, t ), it );7.59 + }7.60 + }7.61 + it->operand[0].form = TEMP_OPERAND;7.62 + it->operand[0].value.i = t;7.63 + all_temp_regs[t].last_access = it;7.64 + all_temp_regs[t].is_dirty |= XOP_WRITES_OP1(it);7.65 + }7.66 +7.67 + if( XOP_IS_SRC(it,1) ) {7.68 + int r = XOP_REG(it,1);7.69 + int s = XOP_OPSIZE(it,1);7.70 + int t = source_regs[r];7.71 + if( t == -1 ) {7.72 + t = xir_alloc_temp_reg( xbb, XOP_OPTYPE(it,1), r );7.73 + source_regs[r] = t;7.74 + if( XOP_READS_OP2(it) ) {7.75 + xir_insert_op( XOP2ST( OP_MOV, r, t ), it );7.76 + }7.77 + }7.78 + it->operand[1].form = TEMP_OPERAND;7.79 + it->operand[1].value.i = t;7.80 + all_temp_regs[t].last_access = it;7.81 + all_temp_regs[t].is_dirty |= XOP_WRITES_OP2(it);7.82 + }7.83 +7.84 + if( it == end )7.85 + break;7.86 + }7.87 +7.88 + for( int i=0; i<xbb->next_temp_reg; i++ ) {7.89 + if( all_temp_regs[i].last_access != NULL && all_temp_regs[i].is_dirty ) {7.90 + xir_insert_op( XOP2TS( OP_MOV, i, xbb->temp_regs[i].home_register ),7.91 + all_temp_regs[i].last_access->next );7.92 + }7.93 + }7.94 +}7.95 +7.96 +7.97 +/**7.98 + * General constraints:7.99 + * Temporaries can't be spilled, must be held in a target register7.100 + *7.101 + * 3 categories of target register:7.102 + * Argument (ie EAX/EDX for ia32): assign call arguments to appropriate regs7.103 + * first. Any available lifetime rolls over to the general volatile regs7.104 + * Volatile (caller-saved): Assign variables with lifetime between calls first7.105 + * Non-volatile (callee-saved): Everything else with cost-balancing (each7.106 + * register used costs the equivalent of a spill/unspill pair)7.107 + *7.108 + * For x86, argument regs are EAX + EDX, ECX is volatile, and ESI/EDI/EBX are non-volatile.7.109 + * For x86-64, arguments regs are EDI + ESI, EBX, R8-R11 are volatile, and R12-R15 are non-volatile.7.110 + * (ESP+EBP are reserved either way)7.111 + */7.112 \ No newline at end of file
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +00008.2 +++ b/src/xlat/regalloc.h Sun Apr 12 07:24:45 2009 +00008.3 @@ -0,0 +1,34 @@8.4 +/**8.5 + * $Id: regalloc.h 931 2008-10-31 02:57:59Z nkeynes $8.6 + *8.7 + * Register allocation based on simple linear scan8.8 + *8.9 + * Copyright (c) 2008 Nathan Keynes.8.10 + *8.11 + * This program is free software; you can redistribute it and/or modify8.12 + * it under the terms of the GNU General Public License as published by8.13 + * the Free Software Foundation; either version 2 of the License, or8.14 + * (at your option) any later version.8.15 + *8.16 + * This program is distributed in the hope that it will be useful,8.17 + * but WITHOUT ANY WARRANTY; without even the implied warranty of8.18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8.19 + * GNU General Public License for more details.8.20 + */8.21 +8.22 +#ifndef lxdream_regalloc_H8.23 +#define lxdream_regalloc_H 18.24 +8.25 +#include "xlat/xir.h"8.26 +8.27 +typedef struct target_machine_reg {8.28 +8.29 +} *target_machine_reg_t;8.30 +8.31 +/**8.32 + * Allocate registers from the source machine to the target machine8.33 + */8.34 +void xlat_register_alloc( xir_op_t start, xir_op_t end, target_machine_reg_t target_registers );8.35 +8.36 +8.37 +#endif /* !lxdream_regalloc_H */
9.1 --- a/src/xlat/x86/x86gen.c Tue Apr 07 10:55:03 2009 +00009.2 +++ b/src/xlat/x86/x86gen.c Sun Apr 12 07:24:45 2009 +00009.3 @@ -105,69 +105,81 @@9.4 #define IS_X86_64() (sizeof(void *)==8)9.5 #define IS_XMM_REG(op,n) (XOP_REG(op,n) >= MIN_XMM_REGISTER && XOP_REG(op,n) <= MAX_AMD64_XMM_REGISTER)9.7 -#define RBP_OFFSET (-128)9.8 +#define NONE NO_OPERAND9.9 +#define SRC SOURCE_OPERAND9.10 +#define DST DEST_OPERAND9.11 +#define TMP TEMP_OPERAND9.12 +#define IMM IMMEDIATE_OPERAND9.14 -#define NONE NO_OPERAND9.15 -#define SRC SOURCE_REGISTER_OPERAND9.16 -#define TGT TARGET_REGISTER_OPERAND9.17 -#define IMM INT_IMM_OPERAND9.18 -#define FLT FLOAT_IMM_OPERAND9.19 -#define DBL DOUBLE_IMM_OPERAND9.20 +#define MAX_X86_GENERAL_REGISTER 79.21 +#define MAX_AMD64_GENERAL_REGISTER 159.22 +#define MIN_XMM_REGISTER 169.23 +#define MAX_X86_XMM_REGISTER 239.24 +#define MAX_AMD64_XMM_REGISTER 319.26 -#define MAX_X86_GENERAL_REGISTER (MIN_TARGET_REGISTER+7)9.27 -#define MAX_AMD64_GENERAL_REGISTER (MIN_TARGET_REGISTER+15)9.28 -#define MIN_XMM_REGISTER (MIN_TARGET_REGISTER+16)9.29 -#define MAX_X86_XMM_REGISTER (MIN_TARGET_REGISTER+23)9.30 -#define MAX_AMD64_XMM_REGISTER (MIN_TARGET_REGISTER+31)9.31 +#define SRCADDR(op,n) (XOP_REG(op,n) - 128)9.32 +#define TMPADDR(op,n) (XOP_REG(op,n)) /* FIXME */9.34 -#define ILLOP(op) FATAL("Illegal x86 opcode %s %d %d\n", XIR_OPCODE_TABLE[op->opcode], op->operand[0].type, op->operand[1].type)9.35 +#define ILLOP(op) FATAL("Illegal x86 opcode %s %d %d\n", XIR_OPCODE_TABLE[op->opcode], op->operand[0].form, op->operand[1].form)9.37 // Convenience macros9.38 #define X86L_IMMS_REG(opname, op) \9.39 - if( XOP_IS_FORM(op,IMM,TGT) ) { opname##_imms_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.40 - else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imms_rbpdisp(XOP_INT(op,0),XOP_REG(op,1)+RBP_OFFSET); } \9.41 + if( XOP_IS_FORM(op,IMM,DST) ) { opname##_imms_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.42 + else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imms_r32disp(XOP_INT(op,0),REG_RBP,SRCADDR(op,1)); } \9.43 + else if( XOP_IS_FORM(op,IMM,TMP) ) { opname##_imms_r32disp(XOP_INT(op,0),REG_RSP,TMPADDR(op,1)); } \9.44 else { ILLOP(op); }9.46 -#define X86L_REG_TGT(opname,op) \9.47 - if( XOP_IS_FORM(op,TGT,TGT) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.48 - else if( XOP_IS_FORM(op,SRC,TGT) ) { opname##_rbpdisp_r32(XOP_REG(op,0)+RBP_OFFSET,XOP_REG(op,1)); } \9.49 +#define X86L_REG_DST(opname,op) \9.50 + if( XOP_IS_FORM(op,DST,DST) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.51 + else if( XOP_IS_FORM(op,SRC,DST) ) { opname##_r32disp_r32(REG_RBP, SRCADDR(op,0),XOP_REG(op,1)); } \9.52 + else if( XOP_IS_FORM(op,TMP,DST) ) { opname##_r32disp_r32(REG_RSP, TMPADDR(op,0),XOP_REG(op,1)); } \9.53 else { ILLOP(op); }9.55 -#define X86F_REG_TGT(opname,op ) \9.56 - if( XOP_IS_FORM(op,TGT,TGT) ) { opname##_xmm_xmm(XOP_REG(op,0),XOP_REG(op,1)); } \9.57 - else if( XOP_IS_FORM(op,SRC,TGT) ) { opname##_rbpdisp_xmm(XOP_REG(op,0)+RBP_OFFSET,XOP_REG(op,1)); } \9.58 +#define X86F_REG_DST(opname,op ) \9.59 + if( XOP_IS_FORM(op,DST,DST) ) { opname##_xmm_xmm(XOP_REG(op,0),XOP_REG(op,1)); } \9.60 + else if( XOP_IS_FORM(op,SRC,DST) ) { opname##_r32disp_xmm(REG_RBP, SRCADDR(op,0),XOP_REG(op,1)); } \9.61 + else if( XOP_IS_FORM(op,TMP,DST) ) { opname##_r32disp_xmm(REG_RSP, TMPADDR(op,0),XOP_REG(op,1)); } \9.62 else { ILLOP(op); }9.64 #define X86L_REG_REG(opname,op) \9.65 - if( XOP_IS_FORM(op,TGT,TGT) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.66 - else if( XOP_IS_FORM(op,SRC,TGT) ) { opname##_rbpdisp_r32(XOP_REG(op,0)+RBP_OFFSET,XOP_REG(op,1)); } \9.67 - else if( XOP_IS_FORM(op,TGT,SRC) ) { opname##_r32_rbpdisp(XOP_REG(op,0),XOP_REG(op,1)+RBP_OFFSET); } \9.68 + if( XOP_IS_FORM(op,DST,DST) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.69 + else if( XOP_IS_FORM(op,SRC,DST) ) { opname##_r32disp_r32(REG_RBP, SRCADDR(op,0),XOP_REG(op,1)); } \9.70 + else if( XOP_IS_FORM(op,DST,SRC) ) { opname##_r32_r32disp(XOP_REG(op,0),REG_RBP, SRCADDR(op,1)); } \9.71 + else if( XOP_IS_FORM(op,TMP,DST) ) { opname##_r32disp_r32(REG_RSP, TMPADDR(op,0),XOP_REG(op,1)); } \9.72 + else if( XOP_IS_FORM(op,DST,TMP) ) { opname##_r32_r32disp(XOP_REG(op,0),REG_RSP, TMPADDR(op,1)); } \9.73 else { ILLOP(op); }9.75 #define X86L_REG(opname,op) \9.76 - if( XOP_IS_TGTREG(op,0) ) { opname##_r32(XOP_REG(op,0)); } \9.77 - else if( XOP_IS_SRCREG(op,0) ) { opname##_rbpdisp(XOP_REG(op,0)+RBP_OFFSET); } \9.78 + if( XOP_IS_DST(op,0) ) { opname##_r32(XOP_REG(op,0)); } \9.79 + else if( XOP_IS_SRC(op,0) ) { opname##_r32disp(REG_RBP,SRCADDR(op,0)); } \9.80 + else if( XOP_IS_TMP(op,0) ) { opname##_r32disp(REG_RSP,TMPADDR(op,0)); } \9.81 else { ILLOP(op); }9.83 #define X86L_CL_REG(opname,op) \9.84 - if( XOP_IS_FORM(op,TGT,TGT) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32(XOP_REG(op,1)); } \9.85 - else if( XOP_IS_FORM(op,TGT,SRC) && XOP_REG(op,0) == REG_CL ) { opname##_cl_rbpdisp(XOP_REG(op,1)+RBP_OFFSET); } \9.86 + if( XOP_IS_FORM(op,DST,DST) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32(XOP_REG(op,1)); } \9.87 + else if( XOP_IS_FORM(op,DST,SRC) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32disp(REG_RBP, SRCADDR(op,1)); } \9.88 + else if( XOP_IS_FORM(op,DST,TMP) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32disp(REG_RSP, TMPADDR(op,1)); } \9.89 else { ILLOP(op); }9.91 #define X86L_IMMCL_REG(opname,op) \9.92 - if( XOP_IS_FORM(op,IMM,TGT) ) { opname##_imm_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.93 - else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imm_rbpdisp(XOP_INT(op,0),XOP_REG(op,1)+RBP_OFFSET); } \9.94 - else if( XOP_IS_FORM(op,TGT,TGT) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32(XOP_REG(op,1)); } \9.95 - else if( XOP_IS_FORM(op,TGT,SRC) && XOP_REG(op,0) == REG_CL ) { opname##_cl_rbpdisp(XOP_REG(op,1)+RBP_OFFSET); } \9.96 + if( XOP_IS_FORM(op,IMM,DST) ) { opname##_imm_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.97 + else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imm_r32disp(XOP_INT(op,0),REG_RBP, SRCADDR(op,1)); } \9.98 + else if( XOP_IS_FORM(op,IMM,TMP) ) { opname##_imm_r32disp(XOP_INT(op,0),REG_RSP, TMPADDR(op,1)); } \9.99 + else if( XOP_IS_FORM(op,DST,DST) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32(XOP_REG(op,1)); } \9.100 + else if( XOP_IS_FORM(op,DST,SRC) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32disp(REG_RBP, SRCADDR(op,1)); } \9.101 + else if( XOP_IS_FORM(op,DST,TMP) && XOP_REG(op,0) == REG_CL ) { opname##_cl_r32disp(REG_RSP, TMPADDR(op,1)); } \9.102 else { ILLOP(op); }9.104 // Standard ALU forms - imms,reg or reg,reg9.105 #define X86L_ALU_REG(opname,op) \9.106 - if( XOP_IS_FORM(op,IMM,TGT) ) { opname##_imms_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.107 - else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imms_rbpdisp(XOP_INT(op,0),XOP_REG(op,1)+RBP_OFFSET); } \9.108 - else if( XOP_IS_FORM(op,TGT,TGT) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.109 - else if( XOP_IS_FORM(op,SRC,TGT) ) { opname##_rbpdisp_r32(XOP_REG(op,0)+RBP_OFFSET,XOP_REG(op,1)); } \9.110 - else if( XOP_IS_FORM(op,TGT,SRC) ) { opname##_r32_rbpdisp(XOP_REG(op,0),XOP_REG(op,1)+RBP_OFFSET); } \9.111 + if( XOP_IS_FORM(op,IMM,DST) ) { opname##_imms_r32(XOP_INT(op,0),XOP_REG(op,1)); } \9.112 + else if( XOP_IS_FORM(op,IMM,SRC) ) { opname##_imms_r32disp(XOP_INT(op,0),REG_RBP, SRCADDR(op,1)); } \9.113 + else if( XOP_IS_FORM(op,IMM,TMP) ) { opname##_imms_r32disp(XOP_INT(op,0),REG_RSP, TMPADDR(op,1)); } \9.114 + else if( XOP_IS_FORM(op,DST,DST) ) { opname##_r32_r32(XOP_REG(op,0),XOP_REG(op,1)); } \9.115 + else if( XOP_IS_FORM(op,SRC,DST) ) { opname##_r32disp_r32(REG_RBP, SRCADDR(op,0),XOP_REG(op,1)); } \9.116 + else if( XOP_IS_FORM(op,DST,SRC) ) { opname##_r32_r32disp(XOP_REG(op,0),REG_RBP, SRCADDR(op,1)); } \9.117 + else if( XOP_IS_FORM(op,TMP,DST) ) { opname##_r32disp_r32(REG_RSP, TMPADDR(op,0),XOP_REG(op,1)); } \9.118 + else if( XOP_IS_FORM(op,DST,TMP) ) { opname##_r32_r32disp(XOP_REG(op,0),REG_RSP, TMPADDR(op,1)); } \9.119 else { ILLOP(op); }9.121 uint32_t x86_target_get_code_size( xir_op_t begin, xir_op_t end )9.122 @@ -194,17 +206,19 @@9.123 /* No code to generate */9.124 break;9.125 case OP_MOV:9.126 - if( XOP_IS_FORM(it, IMM, SRC) ) {9.127 - MOVL_imm32_rbpdisp( XOP_INT(it,0), XOP_REG2(it)+RBP_OFFSET );9.128 - } else if( XOP_IS_FORM(it, IMM, TGT) ) {9.129 + if( XOP_IS_FORM(it, IMM, DST) ) {9.130 MOVL_imm32_r32( XOP_INT(it,0), XOP_REG2(it) );9.131 - } else if( XOP_IS_FORM(it, TGT, SRC) ) {9.132 + } else if( XOP_IS_FORM(it, IMM, SRC) ) {9.133 + MOVL_imm32_r32disp( XOP_INT(it,0), REG_RBP, SRCADDR(it,1) );9.134 + } else if( XOP_IS_FORM(it, IMM, TMP) ) {9.135 + MOVL_imm32_r32disp( XOP_INT(it,0), REG_RSP, TMPADDR(it,1) );9.136 + } else if( XOP_IS_FORM(it, DST, SRC) ) {9.137 if( IS_XMM_REG(it,0) ) {9.138 - MOVSS_xmm_rbpdisp( XOP_REG1(it), XOP_REG2(it)+RBP_OFFSET );9.139 + MOVSS_xmm_r32disp( XOP_REG1(it), REG_RBP, SRCADDR(it,1) );9.140 } else {9.141 - MOVL_r32_rbpdisp( XOP_REG1(it), XOP_REG2(it)+RBP_OFFSET );9.142 + MOVL_r32_r32disp( XOP_REG1(it), REG_RBP, SRCADDR(it,1) );9.143 }9.144 - } else if( XOP_IS_FORM(it, TGT, TGT) ) {9.145 + } else if( XOP_IS_FORM(it, DST, DST) ) {9.146 if( IS_XMM_REG(it,0) ) {9.147 if( IS_XMM_REG(it,1) ) {9.148 MOVSS_xmm_xmm( XOP_REG1(it), XOP_REG2(it) );9.149 @@ -216,11 +230,11 @@9.150 } else {9.151 MOVL_r32_r32( XOP_REG1(it), XOP_REG2(it) );9.152 }9.153 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.154 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.155 if( IS_XMM_REG(it,1) ) {9.156 - MOVSS_rbpdisp_xmm( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.157 + MOVSS_r32disp_xmm( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.158 } else {9.159 - MOVL_rbpdisp_r32( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.160 + MOVL_r32disp_r32( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.161 }9.162 } else {9.163 ILLOP(it);9.164 @@ -229,7 +243,7 @@9.165 case OP_MOVQ:9.166 if( XOP_IS_FORM(it, IMM, SRC) ) {9.167 ILLOP(it);9.168 - } else if( XOP_IS_FORM(it, IMM, TGT) ) {9.169 + } else if( XOP_IS_FORM(it, IMM, DST) ) {9.170 if( IS_XMM_REG(it,0) ) {9.171 if( XOP_INT(it,0) == 0 ) {9.172 XORPD_xmm_xmm( XOP_REG2(it), XOP_REG2(it) );9.173 @@ -237,13 +251,13 @@9.174 } else {9.175 MOVQ_imm64_r64( XOP_INT(it,0), XOP_REG2(it) );9.176 }9.177 - } else if( XOP_IS_FORM(it, TGT, SRC) ) {9.178 + } else if( XOP_IS_FORM(it, DST, SRC) ) {9.179 if( IS_XMM_REG(it,0) ) {9.180 - MOVSD_xmm_rbpdisp( XOP_REG1(it), XOP_REG2(it)+RBP_OFFSET );9.181 + MOVSD_xmm_r32disp( XOP_REG1(it), REG_RBP, SRCADDR(it,1) );9.182 } else {9.183 - MOVQ_r64_rbpdisp( XOP_REG1(it), XOP_REG2(it)+RBP_OFFSET );9.184 + MOVQ_r64_r64disp( XOP_REG1(it), REG_RBP, SRCADDR(it,1) );9.185 }9.186 - } else if( XOP_IS_FORM(it, TGT, TGT) ) {9.187 + } else if( XOP_IS_FORM(it, DST, DST) ) {9.188 if( IS_XMM_REG(it,0) ) {9.189 if( IS_XMM_REG(it,1) ) {9.190 MOVSD_xmm_xmm( XOP_REG1(it), XOP_REG2(it) );9.191 @@ -255,48 +269,48 @@9.192 } else {9.193 MOVQ_r64_r64( XOP_REG1(it), XOP_REG2(it) );9.194 }9.195 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.196 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.197 if( IS_XMM_REG(it,1) ) {9.198 - MOVSD_rbpdisp_xmm( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.199 + MOVSD_r32disp_xmm( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.200 } else {9.201 - MOVQ_rbpdisp_r64( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.202 + MOVQ_r64disp_r64( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.203 }9.204 } else {9.205 ILLOP(it);9.206 }9.207 break;9.208 case OP_MOVSX8:9.209 - if( XOP_IS_FORM(it, TGT, TGT) ) {9.210 + if( XOP_IS_FORM(it, DST, DST) ) {9.211 MOVSXL_r8_r32( XOP_REG1(it), XOP_REG2(it) );9.212 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.213 - MOVSXL_rbpdisp8_r32( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.214 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.215 + MOVSXL_r32disp8_r32( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.216 } else {9.217 ILLOP(it);9.218 }9.219 break;9.220 case OP_MOVSX16:9.221 - if( XOP_IS_FORM(it, TGT, TGT) ) {9.222 + if( XOP_IS_FORM(it, DST, DST) ) {9.223 MOVSXL_r16_r32( XOP_REG1(it), XOP_REG2(it) );9.224 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.225 - MOVSXL_rbpdisp16_r32( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.226 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.227 + MOVSXL_r32disp16_r32( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.228 } else {9.229 ILLOP(it);9.230 }9.231 break;9.232 case OP_MOVZX8:9.233 - if( XOP_IS_FORM(it, TGT, TGT) ) {9.234 + if( XOP_IS_FORM(it, DST, DST) ) {9.235 MOVZXL_r8_r32( XOP_REG1(it), XOP_REG2(it) );9.236 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.237 - MOVZXL_rbpdisp8_r32( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.238 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.239 + MOVZXL_r32disp8_r32( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.240 } else {9.241 ILLOP(it);9.242 }9.243 break;9.244 case OP_MOVZX16:9.245 - if( XOP_IS_FORM(it, TGT, TGT) ) {9.246 + if( XOP_IS_FORM(it, DST, DST) ) {9.247 MOVZXL_r16_r32( XOP_REG1(it), XOP_REG2(it) );9.248 - } else if( XOP_IS_FORM(it, SRC, TGT) ) {9.249 - MOVZXL_rbpdisp16_r32( XOP_REG1(it)+RBP_OFFSET, XOP_REG2(it) );9.250 + } else if( XOP_IS_FORM(it, SRC, DST) ) {9.251 + MOVZXL_r32disp16_r32( REG_RBP, SRCADDR(it,0), XOP_REG2(it) );9.252 } else {9.253 ILLOP(it);9.254 }9.255 @@ -308,16 +322,16 @@9.256 case OP_CMP:9.257 X86L_ALU_REG(CMPL,it); break;9.258 case OP_DEC:9.259 - if( XOP_IS_FORM(it,TGT,NONE) ) {9.260 + if( XOP_IS_FORM(it,DST,NONE) ) {9.261 DECL_r32(XOP_REG(it,0));9.262 } else if( XOP_IS_FORM(it,SRC,NONE) ) {9.263 - DECL_rbpdisp(XOP_REG(it,0)+RBP_OFFSET);9.264 + DECL_r32disp( REG_RBP, SRCADDR(it,0) );9.265 } else {9.266 ILLOP(it);9.267 }9.268 break;9.269 case OP_MUL:9.270 - X86L_REG_TGT(IMULL,it);9.271 + X86L_REG_DST(IMULL,it);9.272 break;9.273 case OP_NEG: X86L_REG(NEGL,it); break;9.274 case OP_NOT: X86L_REG(NOTL,it); break;9.275 @@ -336,7 +350,7 @@9.276 case OP_SUB:9.277 case OP_SUBS: X86L_ALU_REG(SUBL,it); break;9.278 case OP_SHUFFLE:9.279 - if( XOP_IS_FORM(it,IMM,TGT) ) {9.280 + if( XOP_IS_FORM(it,IMM,DST) ) {9.281 if( XOP_INT(it,0) == 0x4321 ) {9.282 BSWAPL_r32( XOP_REG(it,1) );9.283 } else if( it->operand[1].value.i == 0x1243 ) {9.284 @@ -353,63 +367,63 @@9.285 case OP_ABSD:9.286 // Why is there no SSE FP ABS instruction?9.287 break;9.288 - case OP_ADDF: X86F_REG_TGT(ADDSS,it); break;9.289 - case OP_ADDD: X86F_REG_TGT(ADDSD,it); break;9.290 + case OP_ADDF: X86F_REG_DST(ADDSS,it); break;9.291 + case OP_ADDD: X86F_REG_DST(ADDSD,it); break;9.292 case OP_CMPF:9.293 break;9.294 case OP_CMPD: // UCOMISD9.295 break;9.296 - case OP_DIVF: X86F_REG_TGT(DIVSS,it); break;9.297 - case OP_DIVD: X86F_REG_TGT(DIVSD,it); break;9.298 - case OP_MULF: X86F_REG_TGT(MULSS,it); break;9.299 - case OP_MULD: X86F_REG_TGT(MULSD,it); break;9.300 - case OP_RSQRTF:X86F_REG_TGT(RSQRTSS,it); break;9.301 - case OP_SQRTF: X86F_REG_TGT(SQRTSS,it); break;9.302 - case OP_SQRTD: X86F_REG_TGT(SQRTSD,it); break;9.303 - case OP_SUBF: X86F_REG_TGT(SUBSS,it); break;9.304 - case OP_SUBD: X86F_REG_TGT(SUBSD,it); break;9.305 + case OP_DIVF: X86F_REG_DST(DIVSS,it); break;9.306 + case OP_DIVD: X86F_REG_DST(DIVSD,it); break;9.307 + case OP_MULF: X86F_REG_DST(MULSS,it); break;9.308 + case OP_MULD: X86F_REG_DST(MULSD,it); break;9.309 + case OP_RSQRTF:X86F_REG_DST(RSQRTSS,it); break;9.310 + case OP_SQRTF: X86F_REG_DST(SQRTSS,it); break;9.311 + case OP_SQRTD: X86F_REG_DST(SQRTSD,it); break;9.312 + case OP_SUBF: X86F_REG_DST(SUBSS,it); break;9.313 + case OP_SUBD: X86F_REG_DST(SUBSD,it); break;9.315 case OP_DOTPRODV:9.316 - MULPS_rbpdisp_xmm( XOP_REG1(it), 4 );9.317 + MULPS_r32disp_xmm( REG_RBP, SRCADDR(it,0), 4 );9.318 HADDPS_xmm_xmm( 4, 4 );9.319 HADDPS_xmm_xmm( 4, 4 );9.320 - MOVSS_xmm_rbpdisp( 4, XOP_REG1(it) );9.321 + MOVSS_xmm_r32disp( 4, REG_RBP, SRCADDR(it,0) );9.322 break;9.323 case OP_SINCOSF:9.324 case OP_MATMULV:9.325 break;9.326 case OP_FTOD:9.327 - if( XOP_IS_FORM(it,TGT,TGT) ) {9.328 + if( XOP_IS_FORM(it,DST,DST) ) {9.329 CVTSS2SD_xmm_xmm( XOP_REG(it,0), XOP_REG(it,1) );9.330 - } else if( XOP_IS_FORM(it,SRC,TGT) ) {9.331 - CVTSS2SD_rbpdisp_xmm( XOP_REG(it,0)+RBP_OFFSET, XOP_REG(it,1) );9.332 + } else if( XOP_IS_FORM(it,SRC,DST) ) {9.333 + CVTSS2SD_r32disp_xmm( REG_RBP, SRCADDR(it,0), XOP_REG(it,1) );9.334 } else {9.335 ILLOP(it);9.336 }9.337 break;9.338 case OP_DTOF:9.339 - if( XOP_IS_FORM(it,TGT,TGT) ) {9.340 + if( XOP_IS_FORM(it,DST,DST) ) {9.341 CVTSS2SD_xmm_xmm( XOP_REG(it,0), XOP_REG(it,1) );9.342 - } else if( XOP_IS_FORM(it, SRC,TGT) ) {9.343 - CVTSS2SD_rbpdisp_xmm( XOP_REG(it,0)+RBP_OFFSET, XOP_REG(it,1) );9.344 + } else if( XOP_IS_FORM(it, SRC,DST) ) {9.345 + CVTSS2SD_r32disp_xmm( REG_RBP, SRCADDR(it,0), XOP_REG(it,1) );9.346 } else {9.347 ILLOP(it);9.348 }9.349 break;9.350 case OP_ITOD:9.351 - if( XOP_IS_FORM(it,TGT,TGT) ) {9.352 + if( XOP_IS_FORM(it,DST,DST) ) {9.353 CVTSI2SDL_r32_xmm( XOP_REG(it,0), XOP_REG(it,1) );9.354 - } else if( XOP_IS_FORM(it,SRC,TGT) ) {9.355 - CVTSI2SDL_rbpdisp_xmm( XOP_REG(it,0)+RBP_OFFSET, XOP_REG(it,1) );9.356 + } else if( XOP_IS_FORM(it,SRC,DST) ) {9.357 + CVTSI2SDL_r32disp_xmm( REG_RBP, SRCADDR(it,0), XOP_REG(it,1) );9.358 } else {9.359 ILLOP(it);9.360 }9.361 break;9.362 case OP_DTOI:9.363 - if( XOP_IS_FORM(it,TGT,TGT) ) {9.364 + if( XOP_IS_FORM(it,DST,DST) ) {9.365 CVTSD2SIL_xmm_r32( XOP_REG(it,0), XOP_REG(it,1) );9.366 - } else if( XOP_IS_FORM(it,SRC,TGT) ) {9.367 - CVTSD2SIL_rbpdisp_r32( XOP_REG(it,0)+RBP_OFFSET, XOP_REG(it,1) );9.368 + } else if( XOP_IS_FORM(it,SRC,DST) ) {9.369 + CVTSD2SIL_r32disp_r32( REG_RBP, SRCADDR(it,0), XOP_REG(it,1) );9.370 } else {9.371 ILLOP(it);9.372 }9.373 @@ -423,9 +437,9 @@9.374 case OP_BRCONDDEL:9.376 case OP_CALL0:9.377 - if( XOP_IS_INTIMM(it,0) ) {9.378 + if( XOP_IS_IMM(it,0) ) {9.379 CALL_imm32( XOP_INT(it,0) );9.380 - } else if( XOP_IS_SRCREG(it,0) ) {9.381 + } else if( XOP_IS_SRC(it,0) ) {9.382 CALL_r32( XOP_INT(it,0) );9.383 } else {9.384 ILLOP(it);9.385 @@ -437,20 +451,20 @@9.386 } else {9.387 ss = 2;9.388 }9.389 - if( XOP_IS_FORM(it,IMM,TGT) ) {9.390 + if( XOP_IS_FORM(it,IMM,DST) ) {9.391 MOVP_sib_rptr(ss, XOP_REG(it,1), -1, XOP_INT(it,0), XOP_REG(it,1));9.392 - } else if( XOP_IS_FORM(it,TGT,TGT) ) {9.393 + } else if( XOP_IS_FORM(it,DST,DST) ) {9.394 MOVP_sib_rptr(ss, XOP_REG(it,1), XOP_REG(it,0), 0, XOP_REG(it,1));9.395 } else {9.396 ILLOP(it);9.397 }9.398 break;9.399 case OP_CALLLUT:9.400 - if( XOP_IS_FORM(it,TGT,IMM) ) {9.401 + if( XOP_IS_FORM(it,DST,IMM) ) {9.402 CALL_r32disp(XOP_REG(it,0),XOP_INT(it,1));9.403 - } else if( XOP_IS_FORM(it,TGT,TGT) ) {9.404 + } else if( XOP_IS_FORM(it,DST,DST) ) {9.405 CALL_sib(0,XOP_REG(it,0),XOP_REG(it,1),0);9.406 - } else if( XOP_IS_FORM(it,IMM,TGT) ) {9.407 + } else if( XOP_IS_FORM(it,IMM,DST) ) {9.408 CALL_r32disp(XOP_REG(it,1),XOP_INT(it,0));9.409 } else {9.410 ILLOP(it);9.411 @@ -467,14 +481,14 @@9.412 case OP_DIV1:9.413 break;9.414 case OP_SHAD:9.415 - assert( it->operand[0].type == TGT && XOP_REG(it,0) == REG_ECX );9.416 + assert( it->operand[0].form == DST && XOP_REG(it,0) == REG_ECX );9.417 CMPL_imms_r32(0,REG_ECX);9.418 JNGE_label(shad_shr);9.419 X86L_CL_REG(SHLL,it);9.420 JMP_label(shad_end);9.422 JMP_TARGET(shad_shr);9.423 - if( IS_X86_64() && it->operand[1].type == TGT ) {9.424 + if( IS_X86_64() && it->operand[1].form == DST ) {9.425 /* We can do this a little more simply with a 64-bit shift */9.426 ORL_imms_r32(0xFFFFFFE0,REG_ECX);9.427 NEGL_r32(REG_ECX);9.428 @@ -488,10 +502,12 @@9.429 JMP_label(shad_end2);9.431 JMP_TARGET(emptyshr);9.432 - if( it->operand[1].type == TGT ) {9.433 + if( it->operand[1].form == DST ) {9.434 SARL_imm_r32( 31, XOP_REG(it,1) );9.435 + } else if( it->operand[1].form == SRC ) {9.436 + SARL_imm_r32disp( 32, REG_RBP, SRCADDR(it,1) );9.437 } else {9.438 - SARL_imm_rbpdisp( 32, XOP_REG(it,1)+RBP_OFFSET );9.439 + SARL_imm_r32disp( 32, REG_RSP, TMPADDR(it,1) );9.440 }9.441 JMP_TARGET(shad_end2);9.442 }9.443 @@ -499,14 +515,14 @@9.444 break;9.446 case OP_SHLD:9.447 - assert( it->operand[0].type == TGT && XOP_REG(it,0) == REG_ECX );9.448 + assert( it->operand[0].form == DST && XOP_REG(it,0) == REG_ECX );9.449 CMPL_imms_r32(0,REG_ECX);9.450 JNGE_label(shld_shr);9.451 X86L_CL_REG(SHLL,it);9.452 JMP_label(shld_end);9.454 JMP_TARGET(shld_shr);9.455 - if( IS_X86_64() && it->operand[1].type == TGT ) {9.456 + if( IS_X86_64() && it->operand[1].form == DST ) {9.457 /* We can do this a little more simply with a 64-bit shift */9.458 ORL_imms_r32(0xFFFFFFE0,REG_ECX);9.459 NEGL_r32(REG_ECX);
10.1 --- a/src/xlat/x86/x86op.h Tue Apr 07 10:55:03 2009 +000010.2 +++ b/src/xlat/x86/x86op.h Sun Apr 12 07:24:45 2009 +000010.3 @@ -317,16 +317,16 @@10.4 #define x86_encode_r32_mem32(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(0,opcode,rr,rb,rx,ss,disp32)10.5 #define x86_encode_r64_mem64(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,rb,rx,ss,disp32)10.6 #define x86_encode_rptr_memptr(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(PREF_PTR,opcode,rr,rb,rx,ss,disp32)10.7 -#define x86_encode_r32_mem32disp32(opcode,rr,rb,disp32) x86_encode_modrm(0,opcode,rr,rb,-1,0,disp32)10.8 -#define x86_encode_r64_mem64disp64(opcode,rr,rb,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,rb,-1,0,disp32)10.9 +#define x86_encode_r32_r32disp32(opcode,rr,rb,disp32) x86_encode_modrm(0,opcode,rr,rb,-1,0,disp32)10.10 +#define x86_encode_r64_r64disp32(opcode,rr,rb,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,rb,-1,0,disp32)10.11 #define x86_encode_r32_ripdisp32(opcode,rr,disp32) x86_encode_modrm_rip(0,opcode,rr,disp32)10.12 #define x86_encode_r64_ripdisp64(opcode,rr,disp32) x86_encode_modrm_rip(PREF_REXW,opcode,rr,disp32)10.14 /* Convenience versions for the common rbp/rsp relative displacements */10.15 #define x86_encode_r32_rbpdisp32(opcode,rr,disp32) x86_encode_modrm(0,opcode,rr,REG_RBP,-1,0,disp32)10.16 -#define x86_encode_r64_rbpdisp64(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RBP,-1,0,disp32)10.17 +#define x86_encode_r64_rbpdisp32(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RBP,-1,0,disp32)10.18 #define x86_encode_r32_rspdisp32(opcode,rr,disp32) x86_encode_modrm(0,opcode,rr,REG_RSP,-1,0,disp32)10.19 -#define x86_encode_r64_rspdisp64(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RSP,-1,0,disp32)10.20 +#define x86_encode_r64_rspdisp32(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RSP,-1,0,disp32)10.22 /* Immediate-selection variants (for instructions with imm8s/imm32 variants) */10.23 #define x86_encode_imms_rm32(opcode8,opcode32,reg,imm,rb) \10.24 @@ -342,11 +342,11 @@10.25 if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_rbpdisp32(opcode8,reg,disp); OP((int8_t)imm); \10.26 } else { x86_encode_r32_rbpdisp32(opcode32,reg,disp); OP32(imm); }10.27 #define x86_encode_imms_r32disp32(opcode8,opcode32,reg,imm,rb,disp) \10.28 - if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_mem32disp32(opcode8,reg,rb,disp); OP((int8_t)imm); \10.29 - } else { x86_encode_r32_mem32disp32(opcode32,reg,rb,disp); OP32(imm); }10.30 -#define x86_encode_imms_rbpdisp64(opcode8,opcode32,reg,imm,disp) \10.31 - if( IS_INT8(((int32_t)imm)) ) { x86_encode_r64_rbpdisp64(opcode8,reg,disp); OP((int8_t)imm); \10.32 - } else { x86_encode_r64_rbpdisp64(opcode32,reg,disp); OP32(imm); }10.33 + if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_r32disp32(opcode8,reg,rb,disp); OP((int8_t)imm); \10.34 + } else { x86_encode_r32_r32disp32(opcode32,reg,rb,disp); OP32(imm); }10.35 +#define x86_encode_imms_r64disp32(opcode8,opcode32,reg,imm,rb,disp) \10.36 + if( IS_INT8(((int32_t)imm)) ) { x86_encode_r64_r64disp32(opcode8,reg,rb,disp); OP((int8_t)imm); \10.37 + } else { x86_encode_r64_r64disp32(opcode32,reg,rb,disp); OP32(imm); }10.39 /*************************** Instruction definitions ***********************/10.40 /* Note this does not try to be an exhaustive definition of the instruction -10.41 @@ -356,9 +356,12 @@10.42 #define ADCB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 2, r1); OP(imm)10.43 #define ADCB_r8_r8(r1,r2) x86_encode_r32_rm32(0x10, r1, r2)10.44 #define ADCL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 2, imm, r1)10.45 +#define ADCL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83, 0x81, 2, imm, rb, d)10.46 #define ADCL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83, 0x81, 2, imm, disp)10.47 #define ADCL_r32_r32(r1,r2) x86_encode_r32_rm32(0x11, r1, r2)10.48 +#define ADCL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x11, r1, rb, d)10.49 #define ADCL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x11, r1, disp)10.50 +#define ADCL_r32disp_r32(rb,disp,r1) x86_encode_r32_r32disp32(0x13, r1, rb, disp)10.51 #define ADCL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x13, r1, disp)10.52 #define ADCQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 2, imm, r1)10.53 #define ADCQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x11, r1, r2)10.54 @@ -369,8 +372,9 @@10.55 #define ADDL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83, 0x81, 0, imm, rb, d)10.56 #define ADDL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83, 0x81, 0, imm, disp)10.57 #define ADDL_r32_r32(r1,r2) x86_encode_r32_rm32(0x01, r1, r2)10.58 +#define ADDL_r32_r32disp(r1,r2,dsp) x86_encode_r32_r32disp32(0x01, r1, r2, dsp)10.59 #define ADDL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x01, r1, disp)10.60 -#define ADDL_r32_r32disp(r1,r2,dsp) x86_encode_r32_mem32disp32(0x01, r1, r2, dsp)10.61 +#define ADDL_r32disp_r32(rb,disp,r1) x86_encode_r32_r32disp32(0x03, r1, rb, disp)10.62 #define ADDL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x03, r1, disp)10.63 #define ADDQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 0, imm, r1)10.64 #define ADDQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x01, r1, r2)10.65 @@ -378,9 +382,12 @@10.66 #define ANDB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 4, r1); OP(imm)10.67 #define ANDB_r8_r8(r1,r2) x86_encode_r32_rm32(0x20, r1, r2)10.68 #define ANDL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 4, imm, r1)10.69 +#define ANDL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83,0x81,4,imm,rb,d)10.70 #define ANDL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83,0x81,4,imm,disp)10.71 #define ANDL_r32_r32(r1,r2) x86_encode_r32_rm32(0x21, r1, r2)10.72 +#define ANDL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x21, r1, rb, d)10.73 #define ANDL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x21, r1, disp)10.74 +#define ANDL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x23, r1, rb, d)10.75 #define ANDL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x23, r1, disp)10.76 #define ANDQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x21, r1, r2)10.77 #define ANDQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 4, imm, r1)10.78 @@ -393,16 +400,21 @@10.79 #define CLD() OP(0xFC)10.80 #define CMC() OP(0xF5)10.82 -#define CMOVCCL_cc_r32_r32(cc,r1,r2) x86_encode_r32_rm32(0x0F40+(cc), r2, r1)10.83 -#define CMOVCCL_cc_rbpdisp_r32(cc,d,r1) x86_encode_r32_rbpdisp32(0x0F40+(cc), r1, d)10.84 +#define CMOVCCL_cc_r32_r32(cc,r1,r2) x86_encode_r32_rm32(0x0F40+(cc), r2, r1)10.85 +#define CMOVCCL_cc_r32disp_r32(cc,rb,d,r1) x86_encode_r32_r32disp32(0x0F40+(cc), r1, rb, d)10.86 +#define CMOVCCL_cc_rbpdisp_r32(cc,d,r1) x86_encode_r32_rbpdisp32(0x0F40+(cc), r1, d)10.88 #define CMPB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 7, r1); OP(imm)10.89 +#define CMPB_imms_r32disp(imm,rb,d) x86_encode_r32_r32disp32(0x80, 7, rb, d); OP(imm)10.90 #define CMPB_imms_rbpdisp(imm,disp) x86_encode_r32_rbpdisp32(0x80, 7, disp); OP(imm)10.91 #define CMPB_r8_r8(r1,r2) x86_encode_r32_rm32(0x38, r1, r2)10.92 #define CMPL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 7, imm, r1)10.93 +#define CMPL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83, 0x81, 7, imm, rb, d)10.94 #define CMPL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83, 0x81, 7, imm, disp)10.95 #define CMPL_r32_r32(r1,r2) x86_encode_r32_rm32(0x39, r1, r2)10.96 +#define CMPL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x39, r1, rb, d)10.97 #define CMPL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x39, r1, disp)10.98 +#define CMPL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x3B, r1, rb, d)10.99 #define CMPL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x3B, r1, disp)10.100 #define CMPQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 7, imm, r1)10.101 #define CMPQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x39, r1, r2)10.102 @@ -411,60 +423,71 @@10.103 #define CDOQ() OP(PREF_REXW); OP(0x99)10.105 #define DECL_r32(r1) x86_encode_r32_rm32(0xFF,1,r1) /* NB single-op form unavailable in 64-bit mode */10.106 +#define DECL_r32disp(rb,d) x86_encode_r32_r32disp32(0xFF,1,rb,d)10.107 #define DECL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xFF,1,disp)10.108 #define DECQ_r64(r1) x86_encode_r64_rm64(0xFF,1,r1)10.109 -#define DECQ_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xFF,1,disp)10.110 +#define DECQ_r64disp(rb,d) x86_encode_r64_r64disp32(0xFF,1,rb,d)10.111 +#define DECQ_rbpdisp(disp) x86_encode_r64_rbpdisp32(0xFF,1,disp)10.113 #define IDIVL_r32(r1) x86_encode_r32_rm32(0xF7, 7, r1)10.114 +#define IDIVL_r32disp(rb,d) x86_encode_r32_r32disp32(0xF7, 7, rb, d)10.115 #define IDIVL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xF7, 7, disp)10.116 #define IDIVQ_r64(r1) x86_encode_r64_rm64(0xF7, 7, r1)10.118 #define IMULL_imms_r32(imm,r1) x86_encode_imms_rm32(0x6B,0x69, r1, imm, r1)10.119 #define IMULL_r32(r1) x86_encode_r32_rm32(0xF7, 5, r1)10.120 #define IMULL_r32_r32(r1,r2) x86_encode_r32_rm32(0x0FAF, r2, r1)10.121 +#define IMULL_r32disp(rb,d) x86_encode_r32_r32disp32(0xF7, 5, rb, d)10.122 +#define IMULL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x0FAF, r1, rb, d)10.123 #define IMULL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xF7, 5, disp)10.124 #define IMULL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0FAF, r1, disp)10.125 #define IMULL_rspdisp(disp) x86_encode_r32_rspdisp32(0xF7, 5, disp)10.126 #define IMULL_rspdisp_r32(disp,r1) x86_encode_r32_rspdisp32(0x0FAF, r1, disp)10.127 #define IMULQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x6B,0x69, r1, imm, r1)10.128 #define IMULQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x0FAF, r2, r1)10.129 -#define IMULQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp64(0x0FAF, r1, disp)10.130 +#define IMULQ_r64disp_r64(rb,d,r1) x86_encode_r64_r64disp32(0x0FAF, r1, rb, d)10.131 +#define IMULQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp32(0x0FAF, r1, disp)10.133 #define INCL_r32(r1) x86_encode_r32_rm32(0xFF,0,r1) /* NB single-op form unavailable in 64-bit mode */10.134 +#define INCL_r32disp(rb,d) x86_encode_r32_r32disp32(0xFF,0,rb,d)10.135 #define INCL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xFF,0,disp)10.136 #define INCQ_r64(r1) x86_encode_r64_rm64(0xFF,0,r1)10.137 -#define INCQ_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xFF,0,disp)10.138 +#define INCQ_r64disp(rb,d) x86_encode_r64_r64disp32(0xFF,0,rb,d)10.139 +#define INCQ_rbpdisp(disp) x86_encode_r64_rbpdisp32(0xFF,0,disp)10.141 #define LEAL_r32disp_r32(r1,disp,r2) x86_encode_r32_mem32(0x8D, r2, r1, -1, 0, disp)10.142 #define LEAL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x8D, r1, disp)10.143 #define LEAL_sib_r32(ss,ii,bb,d,r1) x86_encode_r32_mem32(0x8D, r1, bb, ii, ss, d)10.144 -#define LEAQ_r64disp_r64(r1,disp,r2) x86_encode_r64_mem64(0x8D, r2, r1, -1, 0, disp)10.145 -#define LEAQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp64(0x8D, r1, disp)10.146 +#define LEAQ_r64disp_r64(r1,disp,r2) x86_encode_r64_r64disp32(0x8D, r2, r1, disp)10.147 +#define LEAQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp32(0x8D, r1, disp)10.148 #define LEAP_rptrdisp_rptr(r1,d,r2) x86_encode_rptr_memptr(0x8D, r2, r1, -1, 0, disp)10.149 #define LEAP_rbpdisp_rptr(disp,r1) x86_encode_rptr_memptr(0x8D, r1, REG_RBP, -1, 0, disp)10.150 #define LEAP_sib_rptr(ss,ii,bb,d,r1) x86_encode_rptr_memptr(0x8D, r1, bb, ii, ss, d)10.152 #define MOVB_r8_r8(r1,r2) x86_encode_r32_rm32(0x88, r1, r2)10.153 #define MOVL_imm32_r32(i32,r1) x86_encode_opcode32(0xB8, r1); OP32(i32)10.154 +#define MOVL_imm32_r32disp(i,rb,d) x86_encode_r32_r32disp32(0xC7,0,rb,d); OP32(i)10.155 #define MOVL_imm32_rbpdisp(i,disp) x86_encode_r32_rbpdisp32(0xC7,0,disp); OP32(i)10.156 #define MOVL_imm32_rspdisp(i,disp) x86_encode_r32_rspdisp32(0xC7,0,disp); OP32(i)10.157 #define MOVL_moffptr_eax(p) OP(0xA1); OPPTR(p)10.158 #define MOVL_r32_r32(r1,r2) x86_encode_r32_rm32(0x89, r1, r2)10.159 -#define MOVL_r32_r32disp(r1,r2,dsp) x86_encode_r32_mem32disp32(0x89, r1, r2, dsp)10.160 +#define MOVL_r32_r32disp(r1,r2,dsp) x86_encode_r32_r32disp32(0x89, r1, r2, dsp)10.161 #define MOVL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x89, r1, disp)10.162 #define MOVL_r32_rspdisp(r1,disp) x86_encode_r32_rspdisp32(0x89, r1, disp)10.163 #define MOVL_r32_sib(r1,ss,ii,bb,d) x86_encode_r32_mem32(0x89, r1, bb, ii, ss, d)10.164 -#define MOVL_r32disp_r32(r1,dsp,r2) x86_encode_r32_mem32disp32(0x8B, r2, r1, dsp)10.165 +#define MOVL_r32disp_r32(r1,dsp,r2) x86_encode_r32_r32disp32(0x8B, r2, r1, dsp)10.166 #define MOVL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x8B, r1, disp)10.167 #define MOVL_rspdisp_r32(disp,r1) x86_encode_r32_rspdisp32(0x8B, r1, disp)10.168 #define MOVL_sib_r32(ss,ii,bb,d,r1) x86_encode_r32_mem32(0x8B, r1, bb, ii, ss, d)10.169 #define MOVQ_imm64_r64(i64,r1) x86_encode_opcode64(0xB8, r1); OP64(i64)10.170 #define MOVQ_moffptr_rax(p) OP(PREF_REXW); OP(0xA1); OPPTR(p)10.171 #define MOVQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x89, r1, r2)10.172 -#define MOVQ_r64_rbpdisp(r1,disp) x86_encode_r64_rbpdisp64(0x89, r1, disp)10.173 -#define MOVQ_r64_rspdisp(r1,disp) x86_encode_r64_rspdisp64(0x89, r1, disp)10.174 -#define MOVQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp64(0x8B, r1, disp)10.175 -#define MOVQ_rspdisp_r64(disp,r1) x86_encode_r64_rspdisp64(0x8B, r1, disp)10.176 +#define MOVQ_r64_r64disp(r1,rb,d) x86_encode_r64_r64disp32(0x89, r1, rb, d)10.177 +#define MOVQ_r64_rbpdisp(r1,disp) x86_encode_r64_rbpdisp32(0x89, r1, disp)10.178 +#define MOVQ_r64_rspdisp(r1,disp) x86_encode_r64_rspdisp32(0x89, r1, disp)10.179 +#define MOVQ_r64disp_r64(rb,d,r1) x86_encode_r64_r64disp32(0x8B, r1, rb, d)10.180 +#define MOVQ_rbpdisp_r64(disp,r1) x86_encode_r64_rbpdisp32(0x8B, r1, disp)10.181 +#define MOVQ_rspdisp_r64(disp,r1) x86_encode_r64_rspdisp32(0x8B, r1, disp)10.182 #define MOVP_immptr_rptr(p,r1) x86_encode_opcodereg( PREF_PTR, 0xB8, r1); OPPTR(p)10.183 #define MOVP_moffptr_rax(p) if( sizeof(void*)==8 ) { OP(PREF_REXW); } OP(0xA1); OPPTR(p)10.184 #define MOVP_rptr_rptr(r1,r2) x86_encode_reg_rm(PREF_PTR, 0x89, r1, r2)10.185 @@ -472,39 +495,50 @@10.187 #define MOVSXL_r8_r32(r1,r2) x86_encode_r32_rm32(0x0FBE, r2, r1)10.188 #define MOVSXL_r16_r32(r1,r2) x86_encode_r32_rm32(0x0FBF, r2, r1)10.189 +#define MOVSXL_r32disp8_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FBE, r1, r, d)10.190 +#define MOVSXL_r32disp16_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FBF, r1, r, d)10.191 #define MOVSXL_rbpdisp8_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0FBE, r1, disp)10.192 #define MOVSXL_rbpdisp16_r32(dsp,r1) x86_encode_r32_rbpdisp32(0x0FBF, r1, dsp)10.193 #define MOVSXQ_imm32_r64(i32,r1) x86_encode_r64_rm64(0xC7, 0, r1); OP32(i32) /* Technically a MOV */10.194 #define MOVSXQ_r8_r64(r1,r2) x86_encode_r64_rm64(0x0FBE, r2, r1)10.195 #define MOVSXQ_r16_r64(r1,r2) x86_encode_r64_rm64(0x0FBF, r2, r1)10.196 #define MOVSXQ_r32_r64(r1,r2) x86_encode_r64_rm64(0x63, r2, r1)10.197 -#define MOVSXQ_rbpdisp32_r64(dsp,r1) x86_encode_r64_rbpdisp64(0x63, r1, dsp)10.198 +#define MOVSXQ_r64disp32_r64(r,d,r1) x86_encode_r64_r64disp32(0x63, r1, r, d)10.199 +#define MOVSXQ_rbpdisp32_r64(dsp,r1) x86_encode_r64_rbpdisp32(0x63, r1, dsp)10.201 #define MOVZXL_r8_r32(r1,r2) x86_encode_r32_rm32(0x0FB6, r2, r1)10.202 #define MOVZXL_r16_r32(r1,r2) x86_encode_r32_rm32(0x0FB7, r2, r1)10.203 +#define MOVZXL_r32disp8_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FB6, r1, r, d)10.204 +#define MOVZXL_r32disp16_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FB7, r1, r, d)10.205 #define MOVZXL_rbpdisp8_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0FB6, r1, disp)10.206 #define MOVZXL_rbpdisp16_r32(dsp,r1) x86_encode_r32_rbpdisp32(0x0FB7, r1, dsp)10.208 #define MULL_r32(r1) x86_encode_r32_rm32(0xF7, 4, r1)10.209 +#define MULL_r32disp(rb,d) x86_encode_r32_r32disp32(0xF7,4,rb,d)10.210 #define MULL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xF7,4,disp)10.211 #define MULL_rspdisp(disp) x86_encode_r32_rspdisp32(0xF7,4,disp)10.213 #define NEGB_r8(r1) x86_encode_r32_rm32(0xF6, 3, r1)10.214 #define NEGL_r32(r1) x86_encode_r32_rm32(0xF7, 3, r1)10.215 +#define NEGL_r32disp(rb,d) x86_encode_r32_r32disp32(0xF7, 3, rb, d)10.216 #define NEGL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xF7, 3, disp)10.217 #define NEGQ_r64(r1) x86_encode_r64_rm64(0xF7, 3, r1)10.219 #define NOTB_r8(r1) x86_encode_r32_rm32(0xF6, 2, r1)10.220 #define NOTL_r32(r1) x86_encode_r32_rm32(0xF7, 2, r1)10.221 +#define NOTL_r32disp(rb,d) x86_encode_r32_r32disp32(0xF7, 2, rb, d)10.222 #define NOTL_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xF7, 2, disp)10.223 #define NOTQ_r64(r1) x86_encode_r64_rm64(0xF7, 2, r1)10.225 #define ORB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 1, r1); OP(imm)10.226 #define ORB_r8_r8(r1,r2) x86_encode_r32_rm32(0x08, r1, r2)10.227 #define ORL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 1, imm, r1)10.228 +#define ORL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83,0x81,1,imm,rb,d)10.229 #define ORL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83,0x81,1,imm,disp)10.230 #define ORL_r32_r32(r1,r2) x86_encode_r32_rm32(0x09, r1, r2)10.231 +#define ORL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x09, r1, rb, d)10.232 #define ORL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x09, r1, disp)10.233 +#define ORL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x0B, r1, rb, d)10.234 #define ORL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0B, r1, disp)10.235 #define ORQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 1, imm, r1)10.236 #define ORQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x09, r1, r2)10.237 @@ -515,97 +549,101 @@10.238 #define PUSH_r32(r1) x86_encode_opcode32(0x50, r1)10.240 #define RCLL_cl_r32(r1) x86_encode_r32_rm32(0xD3,2,r1)10.241 -#define RCLL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,2,disp)10.242 +#define RCLL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,2,rb,d)10.243 #define RCLL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,2,r1); } else { x86_encode_r32_rm32(0xC1,2,r1); OP(imm); }10.244 -#define RCLL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,2,disp); } else { x86_encode_r32_rbpdisp32(0xC1,2,disp); OP(imm); }10.245 +#define RCLL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,2,rb,d); } else { x86_encode_r32_r32disp32(0xC1,2,rb,d); OP(imm); }10.246 #define RCLQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,2,r1)10.247 -#define RCLQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,2,disp)10.248 +#define RCLQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,2,rb,d)10.249 #define RCLQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,2,r1); } else { x86_encode_r64_rm64(0xC1,2,r1); OP(imm); }10.250 -#define RCLQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,2,disp); } else { x86_encode_r64_rbpdisp64(0xC1,2,disp); OP(imm); }10.251 +#define RCLQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,2,rb,d); } else { x86_encode_r64_r64disp32(0xC1,2,rb,d); OP(imm); }10.253 #define RCRL_cl_r32(r1) x86_encode_r32_rm32(0xD3,3,r1)10.254 -#define RCRL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,3,disp)10.255 +#define RCRL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,3,rb,d)10.256 #define RCRL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,3,r1); } else { x86_encode_r32_rm32(0xC1,3,r1); OP(imm); }10.257 -#define RCRL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,3,disp); } else { x86_encode_r32_rbpdisp32(0xC1,3,disp); OP(imm); }10.258 +#define RCRL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,3,rb,d); } else { x86_encode_r32_r32disp32(0xC1,3,rb,d); OP(imm); }10.259 #define RCRQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,3,r1)10.260 -#define RCRQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,3,disp)10.261 +#define RCRQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,3,rb,d)10.262 #define RCRQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,3,r1); } else { x86_encode_r64_rm64(0xC1,3,r1); OP(imm); }10.263 -#define RCRQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,3,disp); } else { x86_encode_r64_rbpdisp64(0xC1,3,disp); OP(imm); }10.264 +#define RCRQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,3,rb,d); } else { x86_encode_r64_r64disp32(0xC1,3,rb,d); OP(imm); }10.266 #define ROLL_cl_r32(r1) x86_encode_r32_rm32(0xD3,0,r1)10.267 -#define ROLL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,0,disp)10.268 +#define ROLL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,0,rb,d)10.269 #define ROLL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,0,r1); } else { x86_encode_r32_rm32(0xC1,0,r1); OP(imm); }10.270 -#define ROLL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,0,disp); } else { x86_encode_r32_rbpdisp32(0xC1,0,disp); OP(imm); }10.271 +#define ROLL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,0,rb,d); } else { x86_encode_r32_r32disp32(0xC1,0,rb,d); OP(imm); }10.272 #define ROLQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,0,r1)10.273 -#define ROLQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,0,disp)10.274 +#define ROLQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,0,rb,d)10.275 #define ROLQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,0,r1); } else { x86_encode_r64_rm64(0xC1,0,r1); OP(imm); }10.276 -#define ROLQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,0,disp); } else { x86_encode_r64_rbpdisp64(0xC1,0,disp); OP(imm); }10.277 +#define ROLQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,0,rb,d); } else { x86_encode_r64_r64disp32(0xC1,0,rb,d); OP(imm); }10.279 #define RORL_cl_r32(r1) x86_encode_r32_rm32(0xD3,1,r1)10.280 -#define RORL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,1,disp)10.281 +#define RORL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,1,rb,d)10.282 #define RORL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,1,r1); } else { x86_encode_r32_rm32(0xC1,1,r1); OP(imm); }10.283 -#define RORL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,1,disp); } else { x86_encode_r32_rbpdisp32(0xC1,1,disp); OP(imm); }10.284 +#define RORL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,1,rb,d); } else { x86_encode_r32_r32disp32(0xC1,1,rb,d); OP(imm); }10.285 #define RORQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,1,r1)10.286 -#define RORQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,1,disp)10.287 +#define RORQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,1,rb,d)10.288 #define RORQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,1,r1); } else { x86_encode_r64_rm64(0xC1,1,r1); OP(imm); }10.289 -#define RORQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,1,disp); } else { x86_encode_r64_rbpdisp64(0xC1,1,disp); OP(imm); }10.290 +#define RORQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,1,rb,d); } else { x86_encode_r64_r64disp32(0xC1,1,rb,d); OP(imm); }10.292 #define SARL_cl_r32(r1) x86_encode_r32_rm32(0xD3,7,r1)10.293 -#define SARL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,7,disp)10.294 +#define SARL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,7,rb,d)10.295 #define SARL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,7,r1); } else { x86_encode_r32_rm32(0xC1,7,r1); OP(imm); }10.296 -#define SARL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,7,disp); } else { x86_encode_r32_rbpdisp32(0xC1,7,disp); OP(imm); }10.297 +#define SARL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,7,rb,d); } else { x86_encode_r32_r32disp32(0xC1,7,rb,d); OP(imm); }10.298 #define SARQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,7,r1)10.299 -#define SARQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,7,disp)10.300 +#define SARQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,7,rb,d)10.301 #define SARQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,7,r1); } else { x86_encode_r64_rm64(0xC1,7,r1); OP(imm); }10.302 -#define SARQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,7,disp); } else { x86_encode_r64_rbpdisp64(0xC1,7,disp); OP(imm); }10.303 +#define SARQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,7,rb,d); } else { x86_encode_r64_r64disp32(0xC1,7,rb,d); OP(imm); }10.305 #define SHLL_cl_r32(r1) x86_encode_r32_rm32(0xD3,4,r1)10.306 -#define SHLL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,4,disp)10.307 +#define SHLL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,4,rb,d)10.308 #define SHLL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,4,r1); } else { x86_encode_r32_rm32(0xC1,4,r1); OP(imm); }10.309 -#define SHLL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,4,disp); } else { x86_encode_r32_rbpdisp32(0xC1,4,disp); OP(imm); }10.310 +#define SHLL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,4,rb,d); } else { x86_encode_r32_r32disp32(0xC1,4,rb,d); OP(imm); }10.311 #define SHLQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,4,r1)10.312 -#define SHLQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,4,disp)10.313 +#define SHLQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,4,rb,d)10.314 #define SHLQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,4,r1); } else { x86_encode_r64_rm64(0xC1,4,r1); OP(imm); }10.315 -#define SHLQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,4,disp); } else { x86_encode_r64_rbpdisp64(0xC1,4,disp); OP(imm); }10.316 +#define SHLQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,4,rb,d); } else { x86_encode_r64_r64disp32(0xC1,4,rb,d); OP(imm); }10.318 #define SHLDL_cl_r32_r32(r1,r2) x86_encode_r32_rm32(0x0FA5,r1,r2)10.319 -#define SHLDL_cl_r32_rbpdisp(r1,d) x86_encode_r32_rbpdisp32(0x0FA5,r1,d)10.320 +#define SHLDL_cl_r32_r32disp(r1,d) x86_encode_r32_r32disp32(0x0FA5,r1,d)10.321 #define SHLDL_imm_r32_r32(imm,r1,r2) x86_encode_r32_rm32(0x0FA4,r1,r2); OP(imm)10.322 -#define SHLDL_imm_r32_rbpdisp(i,r,d) x86_encode_r32_rbpdisp32(0x0FA4,r,d); OP(imm)10.323 +#define SHLDL_imm_r32_r32disp(i,r,d) x86_encode_r32_r32disp32(0x0FA4,r,d); OP(imm)10.324 #define SHLDQ_cl_r64_r64(r1,r2) x86_encode_r64_rm64(0x0FA5,r1,r2)10.325 -#define SHLDQ_cl_r64_rbpdisp(r1,d) x86_encode_r64_rbpdisp64(0x0FA5,r1,d)10.326 +#define SHLDQ_cl_r64_r64disp(r1,d) x86_encode_r64_r64disp32(0x0FA5,r1,d)10.327 #define SHLDQ_imm_r64_r64(imm,r1,r2) x86_encode_r64_rm64(0x0FA4,r1,r2); OP(imm)10.328 -#define SHLDQ_imm_r64_rbpdisp(i,r,d) x86_encode_r64_rbpdisp64(0x0FA4,r,d); OP(imm)10.329 +#define SHLDQ_imm_r64_r64disp(i,r,d) x86_encode_r64_r64disp32(0x0FA4,r,d); OP(imm)10.331 #define SHRL_cl_r32(r1) x86_encode_r32_rm32(0xD3,5,r1)10.332 -#define SHRL_cl_rbpdisp(disp) x86_encode_r32_rbpdisp32(0xD3,5,disp)10.333 +#define SHRL_cl_r32disp(rb,d) x86_encode_r32_r32disp32(0xD3,5,rb,d)10.334 #define SHRL_imm_r32(imm,r1) if( imm == 1 ) { x86_encode_r32_rm32(0xD1,5,r1); } else { x86_encode_r32_rm32(0xC1,5,r1); OP(imm); }10.335 -#define SHRL_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r32_rbpdisp32(0xD1,5,disp); } else { x86_encode_r32_rbpdisp32(0xC1,5,disp); OP(imm); }10.336 +#define SHRL_imm_r32disp(imm,rb,d) if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,5,rb,d); } else { x86_encode_r32_r32disp32(0xC1,5,rb,d); OP(imm); }10.337 #define SHRQ_cl_r64(r1) x86_encode_r64_rm64(0xD3,5,r1)10.338 -#define SHRQ_cl_rbpdisp(disp) x86_encode_r64_rbpdisp64(0xD3,5,disp)10.339 +#define SHRQ_cl_r64disp(rb,d) x86_encode_r64_r64disp32(0xD3,5,rb,d)10.340 #define SHRQ_imm_r64(imm,r1) if( imm == 1 ) { x86_encode_r64_rm64(0xD1,5,r1); } else { x86_encode_r64_rm64(0xC1,5,r1); OP(imm); }10.341 -#define SHRQ_imm_rbpdisp(imm,disp) if( imm == 1 ) { x86_encode_r64_rbpdisp64(0xD1,5,disp); } else { x86_encode_r64_rbpdisp64(0xC1,5,disp); OP(imm); }10.342 +#define SHRQ_imm_r64disp(imm,rb,d) if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,5,rb,d); } else { x86_encode_r64_r64disp32(0xC1,5,rb,d); OP(imm); }10.344 -#define SHRDL_cl_r32_r32(r1,r2) x86_encode_r32_rm32(0x0FAD,r1,r2)10.345 -#define SHRDL_cl_r32_rbpdisp(r1,d) x86_encode_r32_rbpdisp32(0x0FAD,r1,d)10.346 -#define SHRDL_imm_r32_r32(imm,r1,r2) x86_encode_r32_rm32(0x0FAC,r1,r2); OP(imm)10.347 -#define SHRDL_imm_r32_rbpdisp(i,r,d) x86_encode_r32_rbpdisp32(0x0FAC,r,d); OP(imm)10.348 -#define SHRDQ_cl_r64_r64(r1,r2) x86_encode_r64_rm64(0x0FAD,r1,r2)10.349 -#define SHRDQ_cl_r64_rbpdisp(r1,d) x86_encode_r64_rbpdisp64(0x0FAD,r1,d)10.350 -#define SHRDQ_imm_r64_r64(imm,r1,r2) x86_encode_r64_rm64(0x0FAC,r1,r2); OP(imm)10.351 -#define SHRDQ_imm_r64_rbpdisp(i,r,d) x86_encode_r64_rbpdisp64(0x0FAC,r,d); OP(imm)10.352 +#define SHRDL_cl_r32_r32(r1,r2) x86_encode_r32_rm32(0x0FAD,r1,r2)10.353 +#define SHRDL_cl_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x0FAD,r1,rb,d)10.354 +#define SHRDL_imm_r32_r32(imm,r1,r2) x86_encode_r32_rm32(0x0FAC,r1,r2); OP(imm)10.355 +#define SHRDL_imm_r32_r32disp(i,r,rb,d) x86_encode_r32_r32disp32(0x0FAC,r,rb,d); OP(imm)10.356 +#define SHRDQ_cl_r64_r64(r1,r2) x86_encode_r64_rm64(0x0FAD,r1,r2)10.357 +#define SHRDQ_cl_r64_r64disp(r1,rb,d) x86_encode_r64_r64disp32(0x0FAD,r1,rb,d)10.358 +#define SHRDQ_imm_r64_r64(imm,r1,r2) x86_encode_r64_rm64(0x0FAC,r1,r2); OP(imm)10.359 +#define SHRDQ_imm_r64_r64disp(i,r,rb,d) x86_encode_r64_r64disp32(0x0FAC,r,rb,d); OP(imm)10.361 #define SBBB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 3, r1); OP(imm)10.362 #define SBBB_r8_r8(r1,r2) x86_encode_r32_rm32(0x18, r1, r2)10.363 #define SBBL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 3, imm, r1)10.364 +#define SBBL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83,0x81,3,imm,rb,d)10.365 #define SBBL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83,0x81,3,imm,disp)10.366 #define SBBL_r32_r32(r1,r2) x86_encode_r32_rm32(0x19, r1, r2)10.367 +#define SBBL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x19, r1, rb,d)10.368 #define SBBL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x19, r1, disp)10.369 +#define SBBL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x1B, r1, rb,d)10.370 #define SBBL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x1B, r1, disp)10.371 #define SBBQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 3, imm, r1)10.372 #define SBBQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x19, r1, r2)10.374 #define SETCCB_cc_r8(cc,r1) x86_encode_r32_rm32(0x0F90+(cc), 0, r1)10.375 +#define SETCCB_cc_r32disp(cc,rb,d) x86_encode_r32_r32disp32(0x0F90+(cc), 0, rb, d)10.376 #define SETCCB_cc_rbpdisp(cc,disp) x86_encode_r32_rbpdisp32(0x0F90+(cc), 0, disp)10.378 #define STC() OP(0xF9)10.379 @@ -614,9 +652,12 @@10.380 #define SUBB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 5, r1); OP(imm)10.381 #define SUBB_r8_r8(r1,r2) x86_encode_r32_rm32(0x28, r1, r2)10.382 #define SUBL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 5, imm, r1)10.383 +#define SUBL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83,0x81,5,imm,rb,d)10.384 #define SUBL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83,0x81,5,imm,disp)10.385 #define SUBL_r32_r32(r1,r2) x86_encode_r32_rm32(0x29, r1, r2)10.386 +#define SUBL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x29, r1, rb, d)10.387 #define SUBL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x29, r1, disp)10.388 +#define SUBL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x2B, r1, rb, d)10.389 #define SUBL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x2B, r1, disp)10.390 #define SUBQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 5, imm, r1)10.391 #define SUBQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x29, r1, r2)10.392 @@ -624,9 +665,12 @@10.393 #define TESTB_imms_r8(imm,r1) x86_encode_r32_rm32(0xF6, 0, r1); OP(imm)10.394 #define TESTB_r8_r8(r1,r2) x86_encode_r32_rm32(0x84, r1, r2)10.395 #define TESTL_imms_r32(imm,r1) x86_encode_r32_rm32(0xF7, 0, r1); OP32(imm)10.396 +#define TESTL_imms_r32disp(imm,r,d) x86_encode_r32_r32disp32(0xF7, 0, r, d); OP32(imm)10.397 #define TESTL_imms_rbpdisp(imm,dsp) x86_encode_r32_rbpdisp32(0xF7, 0, dsp); OP32(imm)10.398 #define TESTL_r32_r32(r1,r2) x86_encode_r32_rm32(0x85, r1, r2)10.399 +#define TESTL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x85, r1, rb, d)10.400 #define TESTL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x85, r1, disp)10.401 +#define TESTL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x85, r1, rb, d) /* Same OP */10.402 #define TESTL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x85, r1, disp) /* Same OP */10.403 #define TESTQ_imms_r64(imm,r1) x86_encode_r64_rm64(0xF7, 0, r1); OP32(imm)10.404 #define TESTQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x85, r1, r2)10.405 @@ -638,18 +682,21 @@10.406 #define XORB_imms_r8(imm,r1) x86_encode_r32_rm32(0x80, 6, r1); OP(imm)10.407 #define XORB_r8_r8(r1,r2) x86_encode_r32_rm32(0x30, r1, r2)10.408 #define XORL_imms_r32(imm,r1) x86_encode_imms_rm32(0x83, 0x81, 6, imm, r1)10.409 +#define XORL_imms_r32disp(imm,rb,d) x86_encode_imms_r32disp32(0x83,0x81,6,imm,rb,d)10.410 #define XORL_imms_rbpdisp(imm,disp) x86_encode_imms_rbpdisp32(0x83,0x81,6,imm,disp)10.411 #define XORL_r32_r32(r1,r2) x86_encode_r32_rm32(0x31, r1, r2)10.412 +#define XORL_r32_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x31, r1, rb, d)10.413 #define XORL_r32_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x31, r1, disp)10.414 +#define XORL_r32disp_r32(rb,d,r1) x86_encode_r32_r32disp32(0x33, r1, rb, d)10.415 #define XORL_rbpdisp_r32(disp,r1) x86_encode_r32_rbpdisp32(0x33, r1, disp)10.416 #define XORQ_imms_r64(imm,r1) x86_encode_imms_rm64(0x83, 0x81, 6, imm, r1)10.417 #define XORQ_r64_r64(r1,r2) x86_encode_r64_rm64(0x31, r1, r2)10.419 /* Control flow */10.420 #define CALL_rel(rel) OP(0xE8); OP32(rel)10.421 -#define CALL_imm32(ptr) x86_encode_r32_mem32disp32(0xFF, 2, -1, ptr)10.422 +#define CALL_imm32(ptr) x86_encode_r32_r32disp32(0xFF, 2, -1, ptr)10.423 #define CALL_r32(r1) x86_encode_r32_rm32(0xFF, 2, r1)10.424 -#define CALL_r32disp(r1,disp) x86_encode_r32_mem32disp32(0xFF, 2, r1, disp)10.425 +#define CALL_r32disp(r1,disp) x86_encode_r32_r32disp32(0xFF, 2, r1, disp)10.426 #define CALL_sib(ss,ii,bb,disp) x86_encode_r32_mem32(0xFF, 2, bb, ii, ss, disp)10.428 #define JCC_cc_rel8(cc,rel) OP(0x70+(cc)); OP(rel)10.429 @@ -661,7 +708,7 @@10.430 #define JMP_rel(rel) if( IS_INT8(rel) ) { JMP_rel8((int8_t)rel); } else { JMP_rel32(rel); }10.431 #define JMP_prerel(rel) if( IS_INT8(((int32_t)rel)-2) ) { JMP_rel8(((int8_t)rel)-2); } else { JMP_rel32(((int32_t)rel)-5); }10.432 #define JMP_r32(r1,disp) x86_encode_r32_rm32(0xFF, 4, r1)10.433 -#define JMP_r32disp(r1,disp) x86_encode_r32_mem32disp32(0xFF, 4, r1, disp)10.434 +#define JMP_r32disp(r1,disp) x86_encode_r32_r32disp32(0xFF, 4, r1, disp)10.435 #define RET() OP(0xC3)10.436 #define RET_imm(imm) OP(0xC2); OP16(imm)10.438 @@ -686,12 +733,12 @@10.439 #define FCHS_st0() OP(0xD9); OP(0xE0)10.440 #define FCOMIP_st(st) OP(0xDF); OP(0xF0+(st))10.441 #define FDIVP_st(st) OP(0xDE); OP(0xF8+(st))10.442 -#define FILD_r32disp(r32, disp) x86_encode_r32_mem32disp32(0xDB, 0, r32, disp)10.443 +#define FILD_r32disp(r32, disp) x86_encode_r32_r32disp32(0xDB, 0, r32, disp)10.444 #define FLD0_st0() OP(0xD9); OP(0xEE);10.445 #define FLD1_st0() OP(0xD9); OP(0xE8);10.446 -#define FLDCW_r32disp(r32, disp) x86_encode_r32_mem32disp32(0xD9, 5, r32, disp)10.447 +#define FLDCW_r32disp(r32, disp) x86_encode_r32_r32disp32(0xD9, 5, r32, disp)10.448 #define FMULP_st(st) OP(0xDE); OP(0xC8+(st))10.449 -#define FNSTCW_r32disp(r32, disp) x86_encode_r32_mem32disp32(0xD9, 7, r32, disp)10.450 +#define FNSTCW_r32disp(r32, disp) x86_encode_r32_r32disp32(0xD9, 7, r32, disp)10.451 #define FPOP_st() OP(0xDD); OP(0xC0); OP(0xD9); OP(0xF7)10.452 #define FSUBP_st(st) OP(0xDE); OP(0xE8+(st))10.453 #define FSQRT_st0() OP(0xD9); OP(0xFA)10.454 @@ -711,190 +758,190 @@10.455 #define MOVQ_xmm_r64(r1,r2) OP(0x66); x86_encode_r64_rm64(0x0F7E, r1, r2)10.457 /* SSE Packed floating point instructions */10.458 -#define ADDPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F58, r1, disp)10.459 +#define ADDPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F58, r1, rb,d)10.460 #define ADDPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F58, r2, r1)10.461 -#define ANDPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F54, r1, disp)10.462 +#define ANDPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F54, r1, rb,d)10.463 #define ANDPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F54, r2, r1)10.464 -#define ANDNPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F55, r1, disp)10.465 +#define ANDNPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F55, r1, rb,d)10.466 #define ANDNPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F55, r2, r1)10.467 -#define CMPPS_cc_rbpdisp_xmm(cc,d,r) x86_encode_r32_rbpdisp32(0x0FC2, r, d); OP(cc)10.468 +#define CMPPS_cc_r32disp_xmm(cc,rb,d,r) x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)10.469 #define CMPPS_cc_xmm_xmm(cc,r1,r2) x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)10.470 -#define DIVPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F5E, r1, disp)10.471 +#define DIVPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)10.472 #define DIVPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F5E, r2, r1)10.473 -#define MAXPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F5F, r1, disp)10.474 +#define MAXPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)10.475 #define MAXPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F5F, r2, r1)10.476 -#define MINPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F5D, r1, disp)10.477 +#define MINPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)10.478 #define MINPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F5D, r2, r1)10.479 #define MOV_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F28, r2, r1)10.480 -#define MOVAPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F28, r1, disp)10.481 -#define MOVAPS_xmm_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x0F29, r1, disp)10.482 +#define MOVAPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F28, r1, rb,d)10.483 +#define MOVAPS_xmm_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x0F29, r1, rb,d)10.484 #define MOVHLPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F12, r2, r1)10.485 -#define MOVHPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F16, r1, disp)10.486 -#define MOVHPS_xmm_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x0F17, r1, disp)10.487 +#define MOVHPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F16, r1, rb,d)10.488 +#define MOVHPS_xmm_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x0F17, r1, rb,d)10.489 #define MOVLHPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F16, r2, r1)10.490 -#define MOVLPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F12, r1, disp)10.491 -#define MOVLPS_xmm_rbpdisp(r1,disp) x86_encode_r32_rbpdisp32(0x0F13, r1, disp)10.492 -#define MOVUPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F10, r1, disp)10.493 -#define MOVUPS_xmm_rbpdisp(disp,r1) x86_encode_r32_rbpdisp32(0x0F11, r1, disp)10.494 +#define MOVLPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F12, r1, rb,d)10.495 +#define MOVLPS_xmm_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x0F13, r1, rb,d)10.496 +#define MOVUPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F10, r1, rb,d)10.497 +#define MOVUPS_xmm_r32disp(r1,rb,d) x86_encode_r32_r32disp32(0x0F11, r1, rb,d)10.498 #define MULPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F59, r2, r1)10.499 -#define MULPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0xF59, r1, disp)10.500 -#define ORPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F56, r1, disp)10.501 +#define MULPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0xF59, r1, rb,d)10.502 +#define ORPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F56, r1, rb,d)10.503 #define ORPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F56, r2, r1)10.504 -#define RCPPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0xF53, r1, disp)10.505 +#define RCPPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0xF53, r1, rb,d)10.506 #define RCPPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F53, r2, r1)10.507 -#define RSQRTPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F52, r1, disp)10.508 +#define RSQRTPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F52, r1, rb,d)10.509 #define RSQRTPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F52, r2, r1)10.510 -#define SHUFPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0FC6, r1, disp)10.511 +#define SHUFPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0FC6, r1, rb,d)10.512 #define SHUFPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0FC6, r2, r1)10.513 -#define SQRTPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F51, r1, disp)10.514 +#define SQRTPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F51, r1, rb,d)10.515 #define SQRTPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F51, r2, r1)10.516 -#define SUBPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F5C, r1, disp)10.517 +#define SUBPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)10.518 #define SUBPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F5C, r2, r1)10.519 -#define UNPCKHPS_rbpdisp_xmm(dsp,r1) x86_encode_r32_rbpdisp32(0x0F15, r1, disp)10.520 +#define UNPCKHPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F15, r1, rb,d)10.521 #define UNPCKHPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F15, r2, r1)10.522 -#define UNPCKLPS_rbpdisp_xmm(dsp,r1) x86_encode_r32_rbpdisp32(0x0F14, r1, disp)10.523 +#define UNPCKLPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F14, r1, rb,d)10.524 #define UNPCKLPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F14, r2, r1)10.525 -#define XORPS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F57, r1, disp)10.526 +#define XORPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F57, r1, rb,d)10.527 #define XORPS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F57, r2, r1)10.529 /* SSE Scalar floating point instructions */10.530 -#define ADDSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F58, r1, disp)10.531 +#define ADDSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)10.532 #define ADDSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F58, r2, r1)10.533 -#define CMPSS_cc_rbpdisp_xmm(cc,d,r) OP(0xF3); x86_encode_r32_rbpdisp32(0x0FC2, r, d); OP(cc)10.534 +#define CMPSS_cc_r32disp_xmm(cc,rb,d,r) OP(0xF3); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)10.535 #define CMPSS_cc_xmm_xmm(cc,r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)10.536 -#define COMISS_rbpdisp_xmm(disp,r1) x86_encode_r32_rbpdisp32(0x0F2F, r1, disp)10.537 +#define COMISS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F2F, r1, rb,d)10.538 #define COMISS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F2F, r2, r1)10.539 #define CVTSI2SSL_r32_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F2A, r2, r1)10.540 -#define CVTSI2SSL_rbpdisp_xmm(d,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F2A, r1, d)10.541 +#define CVTSI2SSL_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F2A, r1, rb,d)10.542 #define CVTSI2SSQ_r64_xmm(r1,r2) OP(0xF3); x86_encode_r64_rm64(0x0F2A, r2, r1)10.543 -#define CVTSI2SSQ_rbpdisp_xmm(d,r1) OP(0xF3); x86_encode_r64_rbpdisp64(0x0F2A, r1, d)10.544 +#define CVTSI2SSQ_r64disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r64_r64disp32(0x0F2A, r1, rb,d)10.545 #define CVTSS2SIL_xmm_r32(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F2D, r2, r1)10.546 -#define CVTSS2SIL_rbpdisp_r32(d,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F2D, r1, d)10.547 +#define CVTSS2SIL_r32disp_r32(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F2D, r1, rb, d)10.548 #define CVTSS2SIQ_xmm_r64(r1,r2) OP(0xF3); x86_encode_r64_rm64(0x0F2D, r2, r1)10.549 -#define CVTSS2SIQ_rbpdisp_r64(d,r1) OP(0xF3); x86_encode_r64_rbpdisp64(0x0F2D, r1, d)10.550 +#define CVTSS2SIQ_r64disp_r64(rb,d,r1) OP(0xF3); x86_encode_r64_r64disp32(0x0F2D, r1, rb, d)10.551 #define CVTTSS2SIL_xmm_r32(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F2C, r2, r1)10.552 -#define CVTTSS2SIL_rbpdisp_r32(d,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F2C, r1, d)10.553 +#define CVTTSS2SIL_r32disp_r32(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F2C, r1, rb, d)10.554 #define CVTTSS2SIQ_xmm_r64(r1,r2) OP(0xF3); x86_encode_r64_rm64(0x0F2C, r2, r1)10.555 -#define CVTTSS2SIQ_rbpdisp_r64(d,r1) OP(0xF3); x86_encode_r64_rbpdisp64(0x0F2C, r1, d)10.556 -#define DIVSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F5E, r1, disp)10.557 +#define CVTTSS2SIQ_r64disp_r64(rb,d,r1) OP(0xF3); x86_encode_r64_r64disp32(0x0F2C, r1, rb, d)10.558 +#define DIVSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)10.559 #define DIVSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F5E, r2, r1)10.560 -#define MAXSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F5F, r1, disp)10.561 +#define MAXSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)10.562 #define MAXSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F5F, r2, r1)10.563 -#define MINSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F5D, r1, disp)10.564 +#define MINSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)10.565 #define MINSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F5D, r2, r1)10.566 -#define MOVSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F10, r1, disp)10.567 -#define MOVSS_xmm_rbpdisp(r1,disp) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F11, r1, disp)10.568 +#define MOVSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F10, r1, rb,d)10.569 +#define MOVSS_xmm_r32disp(r1,rb,d) OP(0xF3); x86_encode_r32_r32disp32(0x0F11, r1, rb,d)10.570 #define MOVSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F10, r2, r1)10.571 -#define MULSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0xF59, r1, disp)10.572 +#define MULSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0xF59, r1, rb,d)10.573 #define MULSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F59, r2, r1)10.574 -#define RCPSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0xF53, r1, disp)10.575 +#define RCPSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0xF53, r1, rb,d)10.576 #define RCPSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F53, r2, r1)10.577 -#define RSQRTSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F52, r1, disp)10.578 +#define RSQRTSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F52, r1, rb,d)10.579 #define RSQRTSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F52, r2, r1)10.580 -#define SQRTSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F51, r1, disp)10.581 +#define SQRTSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F51, r1, rb,d)10.582 #define SQRTSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F51, r2, r1)10.583 -#define SUBSS_rbpdisp_xmm(disp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F5C, r1, disp)10.584 +#define SUBSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)10.585 #define SUBSS_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F5C, r2, r1)10.586 -#define UCOMISS_rbpdisp_xmm(dsp,r1) x86_encode_r32_rbpdisp32(0x0F2E, r1, dsp)10.587 +#define UCOMISS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F2E, r1, rb,d)10.588 #define UCOMISS_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F2E, r2, r1)10.590 /* SSE2 Packed floating point instructions */10.591 -#define ADDPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F58, r1, disp)10.592 +#define ADDPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)10.593 #define ADDPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F58, r2, r1)10.594 -#define ANDPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F54, r1, disp)10.595 +#define ANDPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F54, r1, rb,d)10.596 #define ANDPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F54, r2, r1)10.597 -#define ANDNPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F55, r1, disp)10.598 +#define ANDNPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F55, r1, rb,d)10.599 #define ANDNPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F55, r2, r1)10.600 -#define CMPPD_cc_rbpdisp_xmm(cc,d,r) OP(0x66); x86_encode_r32_rbpdisp32(0x0FC2, r, d); OP(cc)10.601 +#define CMPPD_cc_r32disp_xmm(cc,rb,d,r) OP(0x66); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)10.602 #define CMPPD_cc_xmm_xmm(cc,r1,r2) OP(0x66); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)10.603 -#define CVTPD2PS_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F5A, r1, dsp)10.604 +#define CVTPD2PS_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)10.605 #define CVTPD2PS_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F5A, r2, r1)10.606 -#define CVTPS2PD_rbpdisp_xmm(dsp,r1) x86_encode_r32_rbpdisp32(0x0F5A, r1, dsp)10.607 +#define CVTPS2PD_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)10.608 #define CVTPS2PD_xmm_xmm(r1,r2) x86_encode_r32_rm32(0x0F5A, r2, r1)10.609 -#define DIVPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F5E, r1, disp)10.610 +#define DIVPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)10.611 #define DIVPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F5E, r2, r1)10.612 -#define MAXPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F5F, r1, disp)10.613 +#define MAXPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)10.614 #define MAXPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F5F, r2, r1)10.615 -#define MINPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F5D, r1, disp)10.616 +#define MINPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)10.617 #define MINPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F5D, r2, r1)10.618 -#define MOVHPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F16, r1, disp)10.619 -#define MOVHPD_xmm_rbpdisp(r1,disp) OP(0x66); x86_encode_r32_rbpdisp32(0x0F17, r1, disp)10.620 -#define MOVLPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F12, r1, disp)10.621 -#define MOVLPD_xmm_rbpdisp(r1,disp) OP(0x66); x86_encode_r32_rbpdisp32(0x0F13, r1, disp)10.622 -#define MULPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0xF59, r1, disp)10.623 +#define MOVHPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F16, r1, rb,d)10.624 +#define MOVHPD_xmm_r32disp(r1,rb,d) OP(0x66); x86_encode_r32_r32disp32(0x0F17, r1, rb,d)10.625 +#define MOVLPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F12, r1, rb,d)10.626 +#define MOVLPD_xmm_r32disp(r1,rb,d) OP(0x66); x86_encode_r32_r32disp32(0x0F13, r1, rb,d)10.627 +#define MULPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0xF59, r1, rb,d)10.628 #define MULPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F59, r2, r1)10.629 -#define ORPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F56, r1, disp)10.630 +#define ORPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F56, r1, rb,d)10.631 #define ORPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F56, r2, r1)10.632 -#define SHUFPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0FC6, r1, disp)10.633 +#define SHUFPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0FC6, r1, rb,d)10.634 #define SHUFPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0FC6, r2, r1)10.635 -#define SUBPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F5C, r1, disp)10.636 +#define SUBPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)10.637 #define SUBPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F5C, r2, r1)10.638 -#define UNPCKHPD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F15, r1, disp)10.639 +#define UNPCKHPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F15, r1, disp)10.640 #define UNPCKHPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F15, r2, r1)10.641 -#define UNPCKLPD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F14, r1, disp)10.642 +#define UNPCKLPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F14, r1, disp)10.643 #define UNPCKLPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F14, r2, r1)10.644 -#define XORPD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F57, r1, disp)10.645 +#define XORPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F57, r1, rb,d)10.646 #define XORPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F57, r2, r1)10.649 /* SSE2 Scalar floating point instructions */10.650 -#define ADDSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F58, r1, disp)10.651 +#define ADDSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)10.652 #define ADDSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F58, r2, r1)10.653 -#define CMPSD_cc_rbpdisp_xmm(cc,d,r) OP(0xF2); x86_encode_r32_rbpdisp32(0x0FC2, r, d); OP(cc)10.654 +#define CMPSD_cc_r32disp_xmm(cc,rb,d,r) OP(0xF2); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)10.655 #define CMPSD_cc_xmm_xmm(cc,r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)10.656 #define CVTSI2SDL_r32_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F2A, r2, r1)10.657 -#define CVTSI2SDL_rbpdisp_xmm(d,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F2A, r1, d)10.658 +#define CVTSI2SDL_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F2A, r1, rb,d)10.659 #define CVTSI2SDQ_r64_xmm(r1,r2) OP(0xF2); x86_encode_r64_rm64(0x0F2A, r2, r1)10.660 -#define CVTSI2SDQ_rbpdisp_xmm(d,r1) OP(0xF2); x86_encode_r64_rbpdisp64(0x0F2A, r1, d)10.661 +#define CVTSI2SDQ_r64disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r64_r64disp32(0x0F2A, r1, rb,d)10.662 #define CVTSD2SIL_xmm_r32(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F2D, r2, r1)10.663 -#define CVTSD2SIL_rbpdisp_r32(d,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F2D, r1, d)10.664 +#define CVTSD2SIL_r32disp_r32(rb, d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F2D, r1, rb, d)10.665 #define CVTSD2SIQ_xmm_r64(r1,r2) OP(0xF2); x86_encode_r64_rm64(0x0F2D, r2, r1)10.666 -#define CVTSD2SIQ_rbpdisp_r64(d,r1) OP(0xF2); x86_encode_r64_rbpdisp64(0x0F2D, r1, d)10.667 -#define CVTSD2SS_rbpdisp_xmm(dsp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F5A, r1, dsp)10.668 +#define CVTSD2SIQ_r64disp_r64(rb,d,r1) OP(0xF2); x86_encode_r64_r64disp32(0x0F2D, r1, rb, d)10.669 +#define CVTSD2SS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)10.670 #define CVTSD2SS_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F5A, r2, r1)10.671 -#define CVTSS2SD_rbpdisp_xmm(dsp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F5A, r1, dsp)10.672 +#define CVTSS2SD_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)10.673 #define CVTSS2SD_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F5A, r2, r1)10.674 #define CVTTSD2SIL_xmm_r32(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F2C, r2, r1)10.675 -#define CVTTSD2SIL_rbpdisp_r32(d,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F2C, r1, d)10.676 +#define CVTTSD2SIL_r32disp_r32(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F2C, r1, rb, d)10.677 #define CVTTSD2SIQ_xmm_r64(r1,r2) OP(0xF2); x86_encode_r64_rm64(0x0F2C, r2, r1)10.678 -#define CVTTSD2SIQ_rbpdisp_r64(d,r1) OP(0xF2); x86_encode_r64_rbpdisp64(0x0F2C, r1, d)10.679 +#define CVTTSD2SIQ_r64disp_r64(rb,d,r1) OP(0xF2); x86_encode_r64_r64disp32(0x0F2C, r1, rb, d)10.681 -#define COMISD_rbpdisp_xmm(disp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F2F, r1, disp)10.682 +#define COMISD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F2F, r1, rb,d)10.683 #define COMISD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F2F, r2, r1)10.684 -#define DIVSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F5E, r1, disp)10.685 +#define DIVSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)10.686 #define DIVSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F5E, r2, r1)10.687 -#define MAXSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F5F, r1, disp)10.688 +#define MAXSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)10.689 #define MAXSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F5F, r2, r1)10.690 -#define MINSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F5D, r1, disp)10.691 +#define MINSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)10.692 #define MINSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F5D, r2, r1)10.693 -#define MOVSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F10, r1, disp)10.694 -#define MOVSD_xmm_rbpdisp(r1,disp) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F11, r1, disp)10.695 +#define MOVSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F10, r1, rb,d)10.696 +#define MOVSD_xmm_r32disp(r1,rb,d) OP(0xF2); x86_encode_r32_r32disp32(0x0F11, r1, rb,d)10.697 #define MOVSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F10, r2, r1)10.698 -#define MULSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0xF59, r1, disp)10.699 +#define MULSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0xF59, r1, rb,d)10.700 #define MULSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F59, r2, r1)10.701 -#define SQRTSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F51, r1, disp)10.702 +#define SQRTSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F51, r1, rb,d)10.703 #define SQRTSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F51, r2, r1)10.704 -#define SUBSD_rbpdisp_xmm(disp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F5C, r1, disp)10.705 +#define SUBSD_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)10.706 #define SUBSD_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F5C, r2, r1)10.707 -#define UCOMISD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F2E, r1, dsp)10.708 +#define UCOMISD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F2E, r1, rb,d)10.709 #define UCOMISD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F2E, r2, r1)10.711 /* SSE3 floating point instructions */10.712 -#define ADDSUBPD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0FD0, r1, dsp)10.713 +#define ADDSUBPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0FD0, r1, rb,d)10.714 #define ADDSUBPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0FD0, r2, r1)10.715 -#define ADDSUBPS_rbpdisp_xmm(dsp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0FD0, r1, dsp)10.716 +#define ADDSUBPS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0FD0, r1, rb,d)10.717 #define ADDSUBPS_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0FD0, r2, r1)10.718 -#define HADDPD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F7C, r1, dsp)10.719 +#define HADDPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F7C, r1, rb,d)10.720 #define HADDPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F7C, r2, r1)10.721 -#define HADDPS_rbpdisp_xmm(dsp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F7C, r1, dsp)10.722 +#define HADDPS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F7C, r1, rb,d)10.723 #define HADDPS_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F7C, r2, r1)10.724 -#define HSUBPD_rbpdisp_xmm(dsp,r1) OP(0x66); x86_encode_r32_rbpdisp32(0x0F7D, r1, dsp)10.725 +#define HSUBPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F7D, r1, rb,d)10.726 #define HSUBPD_xmm_xmm(r1,r2) OP(0x66); x86_encode_r32_rm32(0x0F7D, r2, r1)10.727 -#define HSUBPS_rbpdisp_xmm(dsp,r1) OP(0xF2); x86_encode_r32_rbpdisp32(0x0F7D, r1, dsp)10.728 +#define HSUBPS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F7D, r1, rb,d)10.729 #define HSUBPS_xmm_xmm(r1,r2) OP(0xF2); x86_encode_r32_rm32(0x0F7D, r2, r1)10.730 -#define MOVSHDUP_rbpdisp_xmm(dsp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F16, r1, dsp)10.731 +#define MOVSHDUP_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F16, r1, rb,d)10.732 #define MOVSHDUP_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F16, r2, r1)10.733 -#define MOVSLDUP_rbpdisp_xmm(dsp,r1) OP(0xF3); x86_encode_r32_rbpdisp32(0x0F12, r1, dsp)10.734 +#define MOVSLDUP_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F12, r1, rb,d)10.735 #define MOVSLDUP_xmm_xmm(r1,r2) OP(0xF3); x86_encode_r32_rm32(0x0F12, r2, r1)10.737 /************************ Import calling conventions *************************/
11.1 --- a/src/xlat/x86/x86target.c Tue Apr 07 10:55:03 2009 +000011.2 +++ b/src/xlat/x86/x86target.c Sun Apr 12 07:24:45 2009 +000011.3 @@ -21,19 +21,49 @@11.4 #include "xlat/xlat.h"11.5 #include "xlat/x86/x86op.h"11.7 -static char *x86_reg_names[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",11.8 - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",11.9 - "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",11.10 - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" };11.11 +static char *x86_reg_names[] =11.12 + { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",11.13 + "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d",11.14 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",11.15 + "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" };11.17 -void x86_target_lower( xir_basic_block_t xbb, xir_op_t begin, xir_op_t end );11.18 +static char *x86_quad_reg_names[] =11.19 + { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",11.20 + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" };11.21 +11.22 uint32_t x86_target_get_code_size( xir_op_t begin, xir_op_t end );11.23 uint32_t x86_target_codegen( target_data_t td, xir_op_t begin, xir_op_t end );11.24 +static gboolean x86_target_is_legal( xir_opcode_t op, xir_operand_form_t arg0, xir_operand_form_t arg1 );11.25 +static void x86_target_lower( xir_basic_block_t xbb, xir_op_t begin, xir_op_t end );11.27 -struct xlat_target_machine x86_target_machine = { "x86", x86_reg_names,11.28 - NULL, x86_target_lower, x86_target_get_code_size, x86_target_codegen11.29 +static const char *x86_get_register_name( uint32_t reg, xir_type_t ty )11.30 +{11.31 + if( ty == XTY_QUAD && reg < 16 ) {11.32 + return x86_quad_reg_names[reg];11.33 + } else {11.34 + return x86_reg_names[reg];11.35 + }11.36 +}11.37 +11.38 +struct xlat_target_machine x86_target_machine = { "x86", x86_get_register_name,11.39 + x86_target_is_legal, x86_target_lower, x86_target_get_code_size, x86_target_codegen11.40 };11.42 +static gboolean x86_target_is_legal( xir_opcode_t op, xir_operand_form_t arg0, xir_operand_form_t arg1 )11.43 +{11.44 + switch( op ) {11.45 + case OP_DEC: case OP_ST: case OP_LD:11.46 + case OP_SHUFFLE:11.47 + return arg0 == IMMEDIATE_OPERAND && arg1 == DEST_OPERAND;11.48 + }11.49 + if( arg0 == DEST_OPERAND ) {11.50 + if( arg1 == DEST_OPERAND ) {11.51 + return TRUE;11.52 + } else if( arg1 == SOURCE_OPERAND || arg1 == TEMP_OPERAND ) {11.53 + }11.54 + }11.55 +11.56 +}11.59 /******************************************************************************11.60 @@ -51,11 +81,11 @@11.61 * displacement.11.62 */11.63 static inline void xir_append_xlat( xir_basic_block_t xbb, void *address_space,11.64 - int opertype, int operval )11.65 + int opertype, int operval, int tmpq )11.66 {11.67 if( sizeof(void *) == 8 ) {11.68 - xir_append_ptr_op2( xbb, OP_MOVQ, address_space, SOURCE_REGISTER_OPERAND, REG_TMP4 );11.69 - xir_append_op2( xbb, OP_XLAT, SOURCE_REGISTER_OPERAND, REG_TMP4, opertype, operval );11.70 + xir_append_ptr_op2( xbb, OP_MOVQ, address_space, TEMP_OPERAND, tmpq );11.71 + xir_append_op2( xbb, OP_XLAT, TEMP_OPERAND, tmpq, opertype, operval );11.72 } else {11.73 xir_append_ptr_op2( xbb, OP_XLAT, address_space, opertype, operval );11.74 }11.75 @@ -70,94 +100,105 @@11.76 * call/lut %tmp3, $operation_offset11.77 * mov %eax, result11.78 */11.79 -static void lower_mem_load( xir_basic_block_t xbb, xir_op_t it, void *addr_space, int offset )11.80 +static void lower_mem_load( xir_basic_block_t xbb, xir_op_t it, void *addr_space, int offset,11.81 + int tmpl, int tmpq)11.82 {11.83 xir_op_t start =11.84 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ARG1 );11.85 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.86 - xir_append_op2( xbb, OP_SLR, INT_IMM_OPERAND, 12, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.87 - xir_append_xlat( xbb, addr_space, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.88 + xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, DEST_OPERAND, REG_ARG1 );11.89 + xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, TEMP_OPERAND, tmpl );11.90 + xir_append_op2( xbb, OP_SLR, IMMEDIATE_OPERAND, 12, TEMP_OPERAND, tmpl );11.91 + xir_append_xlat( xbb, addr_space, TEMP_OPERAND, tmpl, tmpq );11.92 xir_insert_block(start,xbb->ir_ptr-1, it);11.93 if( XOP_WRITES_OP2(it) ) {11.94 - xir_insert_op( xir_append_op2( xbb, OP_MOV, TARGET_REGISTER_OPERAND, REG_RESULT1, it->operand[1].type, it->operand[1].value.i ), it->next );11.95 + xir_insert_op( xir_append_op2( xbb, OP_MOV, DEST_OPERAND, REG_RESULT1, it->operand[1].form, it->operand[1].value.i ), it->next );11.96 }11.97 /* Replace original op with CALLLUT */11.98 it->opcode = OP_CALLLUT;11.99 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.100 - it->operand[0].value.i = REG_TMP3;11.101 - it->operand[1].type = INT_IMM_OPERAND;11.102 + it->operand[0].form = TEMP_OPERAND;11.103 + it->operand[0].value.i = tmpl;11.104 + it->operand[1].form = IMMEDIATE_OPERAND;11.105 it->operand[1].value.i = offset;11.106 }11.108 -static void lower_mem_store( xir_basic_block_t xbb, xir_op_t it, void *addr_space, int offset )11.109 +static void lower_mem_store( xir_basic_block_t xbb, xir_op_t it, void *addr_space, int offset,11.110 + int tmpl, int tmpq)11.111 {11.112 xir_op_t start =11.113 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ARG1 );11.114 - xir_append_op2( xbb, OP_MOV, it->operand[1].type, it->operand[1].value.i, TARGET_REGISTER_OPERAND, REG_ARG2 );11.115 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.116 - xir_append_op2( xbb, OP_SLR, INT_IMM_OPERAND, 12, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.117 - xir_append_xlat( xbb, addr_space, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.118 + xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, DEST_OPERAND, REG_ARG1 );11.119 + xir_append_op2( xbb, OP_MOV, it->operand[1].form, it->operand[1].value.i, DEST_OPERAND, REG_ARG2 );11.120 + xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, TEMP_OPERAND, tmpl );11.121 + xir_append_op2( xbb, OP_SLR, IMMEDIATE_OPERAND, 12, TEMP_OPERAND, tmpl );11.122 + xir_append_xlat( xbb, addr_space, TEMP_OPERAND, tmpl, tmpq );11.123 xir_insert_block(start,xbb->ir_ptr-1, it);11.124 /* Replace original op with CALLLUT */11.125 it->opcode = OP_CALLLUT;11.126 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.127 - it->operand[0].value.i = REG_TMP3;11.128 - it->operand[1].type = INT_IMM_OPERAND;11.129 + it->operand[0].form = TEMP_OPERAND;11.130 + it->operand[0].value.i = tmpl;11.131 + it->operand[1].form = IMMEDIATE_OPERAND;11.132 it->operand[1].value.i = offset;11.133 }11.135 -static void lower_mem_loadq( xir_basic_block_t xbb, xir_op_t it, void *addr_space )11.136 +static void lower_mem_loadq( xir_basic_block_t xbb, xir_op_t it, void *addr_space,11.137 + int tmpl, int tmpq )11.138 {11.139 - int resulttype = it->operand[1].type;11.140 + int addrtype = it->operand[0].form;11.141 + int addrval = it->operand[0].value.i;11.142 + int resulttype = it->operand[1].form;11.143 uint32_t resultval = it->operand[1].value.i;11.145 /* First block */11.146 xir_op_t start =11.147 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ARG1 );11.148 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.149 - xir_append_op2( xbb, OP_SLR, INT_IMM_OPERAND, 12, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.150 - xir_append_xlat( xbb, addr_space, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.151 + xir_append_op2( xbb, OP_MOV, addrtype, addrval, TEMP_OPERAND, tmpl );11.152 + xir_append_op2( xbb, OP_SLR, IMMEDIATE_OPERAND, 12, TEMP_OPERAND, tmpl );11.153 + xir_append_xlat( xbb, addr_space, TEMP_OPERAND, tmpl, tmpq );11.154 + xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, DEST_OPERAND, REG_ARG1 );11.155 xir_insert_block(start,xbb->ir_ptr-1, it);11.156 /* Replace original op with CALLLUT */11.157 it->opcode = OP_CALLLUT;11.158 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.159 - it->operand[0].value.i = REG_TMP3;11.160 - it->operand[1].type = INT_IMM_OPERAND;11.161 + it->operand[0].form = TEMP_OPERAND;11.162 + it->operand[0].value.i = tmpl;11.163 + it->operand[1].form = IMMEDIATE_OPERAND;11.164 it->operand[1].value.i = MEM_FUNC_OFFSET(read_long);11.166 /* Second block */11.167 - start = xir_append_op2( xbb, OP_MOV, TARGET_REGISTER_OPERAND, REG_RESULT1, resulttype, resultval+1 );11.168 - xir_append_op2( xbb, OP_ADD, INT_IMM_OPERAND, 4, SOURCE_REGISTER_OPERAND, REG_ARG1 );11.169 - xir_op_t fin = xir_append_op2( xbb, OP_CALLLUT, SOURCE_REGISTER_OPERAND, REG_TMP3, INT_IMM_OPERAND, MEM_FUNC_OFFSET(read_long) );11.170 - xir_append_op2( xbb, OP_MOV, TARGET_REGISTER_OPERAND, REG_RESULT1, resulttype, resultval );11.171 + start = xir_append_op2( xbb, OP_MOV, DEST_OPERAND, REG_RESULT1, resulttype, resultval+4 );11.172 + xir_append_op2( xbb, OP_MOV, addrtype, addrval, DEST_OPERAND, REG_ARG1 );11.173 + xir_append_op2( xbb, OP_ADD, IMMEDIATE_OPERAND, 4, DEST_OPERAND, REG_ARG1 );11.174 + xir_op_t fin = xir_append_op2( xbb, OP_CALLLUT, TEMP_OPERAND, tmpl, IMMEDIATE_OPERAND, MEM_FUNC_OFFSET(read_long) );11.175 + xir_append_op2( xbb, OP_MOV, DEST_OPERAND, REG_RESULT1, resulttype, resultval );11.176 fin->exc = it->exc;11.177 xir_insert_block(start, xbb->ir_ptr-1, it->next);11.178 }11.180 -static void lower_mem_storeq( xir_basic_block_t xbb, xir_op_t it, void *addr_space )11.181 +static void lower_mem_storeq( xir_basic_block_t xbb, xir_op_t it, void *addr_space,11.182 + int tmpl, int tmpq)11.183 {11.184 - int argtype = it->operand[1].type;11.185 + int addrtype = it->operand[0].form;11.186 + int addrval = it->operand[0].value.i;11.187 + int argtype = it->operand[1].form;11.188 uint32_t argval = it->operand[1].value.i;11.190 /* First block */11.191 xir_op_t start =11.192 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ARG1 );11.193 - xir_append_op2( xbb, OP_MOV, argtype, argval+1, TARGET_REGISTER_OPERAND, REG_ARG2 );11.194 - xir_append_op2( xbb, OP_MOV, it->operand[0].type, it->operand[0].value.i, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.195 - xir_append_op2( xbb, OP_SLR, INT_IMM_OPERAND, 12, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.196 - xir_append_xlat( xbb, addr_space, SOURCE_REGISTER_OPERAND, REG_TMP3 );11.197 + xir_append_op2( xbb, OP_MOV, addrtype, addrval, TEMP_OPERAND, tmpl );11.198 + xir_append_op2( xbb, OP_SLR, IMMEDIATE_OPERAND, 12, TEMP_OPERAND, tmpl );11.199 + xir_append_xlat( xbb, addr_space, TEMP_OPERAND, tmpl, tmpq );11.200 + xir_append_op2( xbb, OP_MOV, addrtype, addrval, DEST_OPERAND, REG_ARG1 );11.201 + xir_append_op2( xbb, OP_MOV, argtype, argval+4, DEST_OPERAND, REG_ARG2 );11.202 xir_insert_block(start,xbb->ir_ptr-1, it);11.203 /* Replace original op with CALLLUT */11.204 it->opcode = OP_CALLLUT;11.205 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.206 - it->operand[0].value.i = REG_TMP3;11.207 - it->operand[1].type = INT_IMM_OPERAND;11.208 + it->operand[0].form = TEMP_OPERAND;11.209 + it->operand[0].value.i = tmpl;11.210 + it->operand[1].form = IMMEDIATE_OPERAND;11.211 it->operand[1].value.i = MEM_FUNC_OFFSET(read_long);11.213 /* Second block */11.214 - xir_append_op2( xbb, OP_MOV, argtype, argval, TARGET_REGISTER_OPERAND, REG_ARG2 );11.215 - xir_append_op2( xbb, OP_ADD, INT_IMM_OPERAND, 4, SOURCE_REGISTER_OPERAND, REG_ARG1 );11.216 - xir_op_t fin = xir_append_op2( xbb, OP_CALLLUT, SOURCE_REGISTER_OPERAND, REG_TMP3, INT_IMM_OPERAND, MEM_FUNC_OFFSET(read_long) );11.217 + start =11.218 + xir_append_op2( xbb, OP_MOV, addrtype, addrval, DEST_OPERAND, REG_ARG1 );11.219 + xir_append_op2( xbb, OP_ADD, IMMEDIATE_OPERAND, 4, DEST_OPERAND, REG_ARG1 );11.220 + xir_append_op2( xbb, OP_MOV, argtype, argval, DEST_OPERAND, REG_ARG2 );11.221 + xir_op_t fin = xir_append_op2( xbb, OP_CALLLUT, TEMP_OPERAND, tmpl, IMMEDIATE_OPERAND, MEM_FUNC_OFFSET(read_long) );11.222 fin->exc = it->exc;11.223 xir_insert_block(start, xbb->ir_ptr-1, it->next);11.224 }11.225 @@ -172,8 +213,13 @@11.226 * Run in reverse order so we can track liveness of the flags as we go (for ALU11.227 * lowering to flags-modifying instructions)11.228 */11.229 -void x86_target_lower( xir_basic_block_t xbb, xir_op_t start, xir_op_t end )11.230 +static void x86_target_lower( xir_basic_block_t xbb, xir_op_t start, xir_op_t end )11.231 {11.232 + int tmpl = xir_alloc_temp_reg( xbb, XTY_LONG, -1 );11.233 + int tmp2 = xir_alloc_temp_reg( xbb, XTY_LONG, -1 );11.234 + int tmpq = xir_alloc_temp_reg( xbb, XTY_QUAD, -1 );11.235 + int tmpd = -1, tmpf = -1; /* allocate these when we need them */11.236 +11.237 gboolean flags_live = FALSE;11.238 xir_op_t it;11.239 for( it=end; it != NULL; it = it->prev ) {11.240 @@ -188,8 +234,8 @@11.241 case OP_SUBB: case OP_SDIV:11.242 it->opcode++;11.243 if( flags_live ) {11.244 - xir_insert_op( XOP1( OP_SAVEFLAGS, REG_TMP5 ), it );11.245 - xir_insert_op( XOP1( OP_RESTFLAGS, REG_TMP5 ), it->next );11.246 + xir_insert_op( XOP1T( OP_SAVEFLAGS, tmp2 ), it );11.247 + xir_insert_op( XOP1T( OP_RESTFLAGS, tmp2 ), it->next );11.248 }11.249 break;11.251 @@ -197,31 +243,31 @@11.252 /* Promote to *S form since we don't have a non-flag version */11.253 it->opcode++;11.254 if( flags_live ) {11.255 - xir_insert_op( XOP1( OP_SAVEFLAGS, REG_TMP5 ), it );11.256 - xir_insert_op( XOP1( OP_RESTFLAGS, REG_TMP5 ), it->next );11.257 + xir_insert_op( XOP1T( OP_SAVEFLAGS, tmp2 ), it );11.258 + xir_insert_op( XOP1T( OP_RESTFLAGS, tmp2 ), it->next );11.259 }11.260 -11.261 + /* Fallthrough */11.262 case OP_SARS: case OP_SLLS: case OP_SLRS:11.263 case OP_RCL: case OP_RCR: case OP_ROLS: case OP_RORS:11.264 /* Insert mov %reg, %ecx */11.265 - if( it->operand[0].type == SOURCE_REGISTER_OPERAND ) {11.266 - xir_insert_op( xir_append_op2( xbb, OP_MOV, SOURCE_REGISTER_OPERAND, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ECX ), it );11.267 - it->operand[0].type = TARGET_REGISTER_OPERAND;11.268 + if( XOP_IS_REG(it,0) ) {11.269 + xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, DEST_OPERAND, REG_ECX ), it );11.270 + it->operand[0].form = DEST_OPERAND;11.271 it->operand[0].value.i = REG_ECX;11.272 }11.273 break;11.274 case OP_SHLD: case OP_SHAD:11.275 /* Insert mov %reg, %ecx */11.276 - if( it->operand[0].type == SOURCE_REGISTER_OPERAND ) {11.277 - xir_insert_op( xir_append_op2( xbb, OP_MOV, SOURCE_REGISTER_OPERAND, it->operand[0].value.i, TARGET_REGISTER_OPERAND, REG_ECX ), it );11.278 - it->operand[0].type = TARGET_REGISTER_OPERAND;11.279 + if( XOP_IS_REG(it,0) ) {11.280 + xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[0].form, it->operand[0].value.i, DEST_OPERAND, REG_ECX ), it );11.281 + it->operand[0].form = DEST_OPERAND;11.282 it->operand[0].value.i = REG_ECX;11.283 - } else if( it->operand[0].type == INT_IMM_OPERAND ) {11.284 + } else if( it->operand[0].form == IMMEDIATE_OPERAND ) {11.285 /* Simplify down to SAR/SLL/SLR where we have a constant shift */11.286 if( it->operand[0].value.i == 0 ) {11.287 /* No-op */11.288 it->opcode = OP_NOP;11.289 - it->operand[1].type = it->operand[0].type = NO_OPERAND;11.290 + it->operand[1].form = it->operand[0].form = NO_OPERAND;11.291 } else if( it->operand[0].value.i > 0 ) {11.292 it->opcode = OP_SLL;11.293 } else if( (it->operand[0].value.i & 0x1F) == 0 ) {11.294 @@ -243,87 +289,89 @@11.295 break;11.297 case OP_CALL1: /* Reduce to mov reg, %eax; call0 ptr */11.298 - xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[1].type, it->operand[1].value.i, TARGET_REGISTER_OPERAND, REG_ARG1 ), it );11.299 + xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[1].form, it->operand[1].value.i, DEST_OPERAND, REG_ARG1 ), it );11.300 it->opcode = OP_CALL0;11.301 - it->operand[1].type = NO_OPERAND;11.302 + it->operand[1].form = NO_OPERAND;11.303 break;11.304 case OP_CALLR: /* reduce to call0 ptr, mov result, reg */11.305 - xir_insert_op( xir_append_op2( xbb, OP_MOV, TARGET_REGISTER_OPERAND, REG_RESULT1, it->operand[1].type, it->operand[1].value.i), it->next );11.306 + xir_insert_op( xir_append_op2( xbb, OP_MOV, DEST_OPERAND, REG_RESULT1, it->operand[1].form, it->operand[1].value.i), it->next );11.307 it->opcode = OP_CALL0;11.308 - it->operand[1].type = NO_OPERAND;11.309 + it->operand[1].form = NO_OPERAND;11.310 break;11.311 case OP_LOADB:11.312 - lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_byte) );11.313 + lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_byte), tmpl, tmpq );11.314 break;11.315 case OP_LOADW:11.316 - lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_word) );11.317 + lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_word), tmpl, tmpq );11.318 break;11.319 case OP_LOADL:11.320 - lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_long) );11.321 + lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_long), tmpl, tmpq );11.322 break;11.323 case OP_LOADBFW:11.324 - lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_byte_for_write) );11.325 + lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(read_byte_for_write), tmpl, tmpq );11.326 break;11.327 case OP_LOADQ:11.328 - lower_mem_loadq( xbb, it, xbb->address_space );11.329 + lower_mem_loadq( xbb, it, xbb->address_space, tmpl, tmpq );11.330 break;11.331 case OP_PREF:11.332 - lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(prefetch) );11.333 + lower_mem_load( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(prefetch), tmpl, tmpq );11.334 break;11.335 case OP_OCBI:11.336 case OP_OCBP:11.337 case OP_OCBWB:11.338 break;11.339 case OP_STOREB:11.340 - lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_byte) );11.341 + lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_byte), tmpl, tmpq );11.342 break;11.343 case OP_STOREW:11.344 - lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_word) );11.345 + lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_word), tmpl, tmpq );11.346 break;11.347 case OP_STOREL:11.348 - lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_long) );11.349 + lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_long), tmpl, tmpq );11.350 break;11.351 case OP_STORELCA:11.352 - lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_long) );11.353 + lower_mem_store( xbb, it, xbb->address_space, MEM_FUNC_OFFSET(write_long), tmpl, tmpq );11.354 break;11.355 case OP_STOREQ:11.356 - lower_mem_storeq( xbb, it, xbb->address_space );11.357 + lower_mem_storeq( xbb, it, xbb->address_space, tmpl, tmpq );11.358 break;11.360 case OP_SHUFFLE:11.361 - assert( it->operand[0].type == INT_IMM_OPERAND );11.362 + assert( it->operand[0].form == IMMEDIATE_OPERAND );11.363 if( it->operand[0].value.i = 0x2134 ) { /* Swap low bytes */11.364 /* This is an xchg al,ah, but we need to force the operand into one of the bottom 4 registers */11.365 - xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[1].type, it->operand[1].value.i, TARGET_REGISTER_OPERAND, REG_EAX ), it);11.366 - it->operand[1].type = TARGET_REGISTER_OPERAND;11.367 + xir_insert_op( xir_append_op2( xbb, OP_MOV, it->operand[1].form, it->operand[1].value.i, DEST_OPERAND, REG_EAX ), it);11.368 + it->operand[1].form = DEST_OPERAND;11.369 it->operand[1].value.i = REG_EAX;11.370 } else if( it->operand[0].value.i != 0x4321 ) {11.371 /* 4321 is a full byteswap (directly supported) - use shift/mask/or11.372 * sequence for anything else. Although we could use PSHUF...11.373 */11.374 - it = xir_shuffle_lower( xbb, it, REG_TMP3, REG_TMP4 );11.375 + it = xir_shuffle_lower( xbb, it, tmpl, tmp2 );11.376 }11.377 break;11.378 case OP_NEGF:11.379 - xir_insert_op( xir_append_op2( xbb, OP_MOV, INT_IMM_OPERAND, 0, SOURCE_REGISTER_OPERAND, REG_TMP4 ), it);11.380 - xir_insert_op( xir_append_op2( xbb, OP_MOV, SOURCE_REGISTER_OPERAND, REG_TMP4,it->operand[0].type, it->operand[0].value.i), it->next );11.381 + if( tmpf == -1 ) tmpf = xir_alloc_temp_reg( xbb, XTY_FLOAT, -1 );11.382 + xir_insert_op( xir_append_op2( xbb, OP_MOV, IMMEDIATE_OPERAND, 0, TEMP_OPERAND, tmpf ), it);11.383 + xir_insert_op( xir_append_op2( xbb, OP_MOV, TEMP_OPERAND, tmpf,it->operand[0].form, it->operand[0].value.i), it->next );11.384 it->opcode = OP_SUBF;11.385 - it->operand[1].type = SOURCE_REGISTER_OPERAND;11.386 - it->operand[1].value.i = REG_TMP4;11.387 + it->operand[1].form = TEMP_OPERAND;11.388 + it->operand[1].value.i = tmpf;11.389 break;11.390 case OP_NEGD:11.391 - xir_insert_op( xir_append_op2( xbb, OP_MOVQ, INT_IMM_OPERAND, 0, SOURCE_REGISTER_OPERAND, REG_TMPQ0 ), it);11.392 - xir_insert_op( xir_append_op2( xbb, OP_MOVQ, SOURCE_REGISTER_OPERAND, REG_TMPQ0,it->operand[0].type, it->operand[0].value.i), it->next );11.393 + if( tmpd == -1 ) tmpd = xir_alloc_temp_reg( xbb, XTY_DOUBLE, -1 );11.394 + xir_insert_op( xir_append_op2( xbb, OP_MOVQ, IMMEDIATE_OPERAND, 0, TEMP_OPERAND, REG_TMPQ0 ), it);11.395 + xir_insert_op( xir_append_op2( xbb, OP_MOVQ, TEMP_OPERAND, tmpd,it->operand[0].form, it->operand[0].value.i), it->next );11.396 it->opcode = OP_SUBD;11.397 - it->operand[1].type = SOURCE_REGISTER_OPERAND;11.398 - it->operand[1].value.i = REG_TMPQ0;11.399 + it->operand[1].form = TEMP_OPERAND;11.400 + it->operand[1].value.i = tmpd;11.401 break;11.402 case OP_XLAT:11.403 /* Insert temp register if translating through a 64-bit pointer */11.404 - if( XOP_IS_PTRIMM(it, 0) && sizeof(void *) == 8 && it->operand[0].value.q >= 0x100000000LL ) {11.405 - xir_insert_op( XOP2P( OP_MOVQ, it->operand[0].value.p, REG_TMP4 ), it );11.406 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.407 - it->operand[0].value.i = REG_TMP4;11.408 + if( XOP_IS_IMMP(it, 0) && sizeof(void *) == 8 && it->operand[0].value.q >= 0x100000000LL ) {11.409 + xir_insert_op( XOP2PT( OP_MOVQ, it->operand[0].value.p, tmpq ), it );11.410 + it->operand[0].form = TEMP_OPERAND;11.411 + it->operand[0].value.i = tmpq;11.412 }11.413 break;11.414 }11.415 @@ -335,7 +383,7 @@11.416 }11.418 /* Lower pointer operands to INT or QUAD according to address and value size. */11.419 - if( it->operand[0].type == POINTER_OPERAND ) {11.420 + if( XOP_IS_IMMP(it,0) ) {11.421 if( sizeof(void *) == 8 && it->operand[0].value.q >= 0x100000000LL ) {11.422 if( it->opcode == OP_MOV ) {11.423 // Promote MOV ptr, reg to MOVQ ptr, reg11.424 @@ -346,17 +394,15 @@11.425 * (We only check the first operand as there are no instructions that11.426 * permit the second operand to be an immediate pointer.11.427 */11.428 - xir_insert_op( xir_append_op2( xbb, OP_MOVQ, POINTER_OPERAND, it->operand[0].value.q, SOURCE_REGISTER_OPERAND, REG_TMP4 ), it );11.429 - it->operand[0].type = SOURCE_REGISTER_OPERAND;11.430 - it->operand[1].value.i = REG_TMP4;11.431 + xir_insert_op( xir_append_op2( xbb, OP_MOVQ, IMMEDIATE_OPERAND, it->operand[0].value.q, TEMP_OPERAND, tmpq ), it );11.432 + it->operand[0].form = TEMP_OPERAND;11.433 + it->operand[1].value.i = tmpq;11.434 }11.435 - it->operand[0].type = QUAD_IMM_OPERAND;11.436 } else {11.437 if( it->opcode == OP_MOVQ ) {11.438 /* Lower a MOVQ of a 32-bit quantity to a MOV, and save the 5 bytes */11.439 it->opcode = OP_MOV;11.440 }11.441 - it->operand[0].type = INT_IMM_OPERAND;11.442 }11.443 }
12.1 --- a/src/xlat/xir.c Tue Apr 07 10:55:03 2009 +000012.2 +++ b/src/xlat/xir.c Sun Apr 12 07:24:45 2009 +000012.3 @@ -20,15 +20,17 @@12.4 #include <string.h>12.5 #include <assert.h>12.6 #include "xlat/xir.h"12.7 +#include "xlat/xlat.h"12.9 -static const char **xir_source_register_names = NULL;12.10 -static const char **xir_target_register_names = NULL;12.11 static const struct xir_symbol_entry *xir_symbol_table = NULL;12.13 static const char *XIR_CC_NAMES[] = {12.14 "ov", "no", "uge", "ult", "ule", "ugt", "eq", "ne",12.15 "neg", "pos", "sge", "slt", "sle", "sgt" };12.16 -static const int XIR_OPERAND_SIZE[] = { 4, 8, 4, 8, 16, 64, 0, 0 };12.17 +static const char XIR_TYPE_CODES[] = { 'l', 'q', 'f', 'd', 'v', 'm' };12.18 +12.19 +const int XIR_OPERAND_SIZE[] = { 4, 8, 4, 8, 16, 64, (sizeof(void *)), 0 };12.20 +12.22 const struct xir_opcode_entry XIR_OPCODE_TABLE[] = {12.23 { "NOP", OPM_NO },12.24 @@ -99,7 +101,6 @@12.25 { "TST", OPM_R_R_TW },12.26 { "XOR", OPM_R_RW },12.27 { "XORS", OPM_R_RW_TW },12.28 - { "XLAT", OPM_R_RW },12.30 { "ABSD", OPM_DR_DW },12.31 { "ABSF", OPM_FR_FW },12.32 @@ -163,9 +164,13 @@12.33 { "RAISE/ME", OPM_R_R | OPM_EXC },12.34 { "RAISE/MNE", OPM_R_R | OPM_EXC },12.36 + /* Native/pointer operations */12.37 { "CALL/LUT", OPM_R_R | OPM_EXC },12.38 { "CALL1", OPM_R_R | OPM_CLB },12.39 { "CALLR", OPM_R_W | OPM_CLB },12.40 + { "LOADPTRL", OPM_R_W | 0x060 },12.41 + { "LOADPTRQ", OPM_R_W | 0x160 },12.42 + { "XLAT", OPM_R_RW | 0x600 }, /* Xlat Rm, Rn - Read native [Rm+Rn] and store in Rn */12.44 { "ADDQSAT32", OPM_R_R | OPM_CLBT|OPM_Q_Q },12.45 { "ADDQSAT48", OPM_R_R | OPM_CLBT|OPM_Q_Q },12.46 @@ -176,10 +181,23 @@12.48 };12.50 -void xir_set_register_names( const char **source_regs, const char **target_regs )12.51 +void xir_clear_basic_block( xir_basic_block_t xbb )12.52 {12.53 - xir_source_register_names = source_regs;12.54 - xir_target_register_names = target_regs;12.55 + xbb->next_temp_reg = 0;12.56 + xir_alloc_temp_reg( xbb, XTY_LONG, -1 );12.57 + xir_alloc_temp_reg( xbb, XTY_LONG, -1 );12.58 + xir_alloc_temp_reg( xbb, XTY_LONG, -1 );12.59 + xir_alloc_temp_reg( xbb, XTY_QUAD, -1 );12.60 + xir_alloc_temp_reg( xbb, XTY_QUAD, -1 );12.61 +}12.62 +12.63 +uint32_t xir_alloc_temp_reg( xir_basic_block_t xbb, xir_type_t type, int home )12.64 +{12.65 + assert( xbb->next_temp_reg <= MAX_TEMP_REGISTER );12.66 + int reg = xbb->next_temp_reg++;12.67 + xbb->temp_regs[reg].type = type;12.68 + xbb->temp_regs[reg].home_register = home;12.69 + return reg;12.70 }12.72 void xir_set_symbol_table( const struct xir_symbol_entry *symtab )12.73 @@ -200,54 +218,75 @@12.74 return NULL;12.75 }12.77 -int xir_snprint_operand( char *buf, int buflen, xir_operand_t op )12.78 +static int xir_snprint_operand( char *buf, int buflen, xir_basic_block_t xbb, xir_operand_t op, xir_type_t ty )12.79 {12.80 const char *name;12.81 - switch( op->type ) {12.82 - case INT_IMM_OPERAND:12.83 - return snprintf( buf, buflen, "$0x%x", op->value.i );12.84 - case FLOAT_IMM_OPERAND:12.85 - return snprintf( buf, buflen, "%f", op->value.f );12.86 - case DOUBLE_IMM_OPERAND:12.87 - return snprintf( buf, buflen, "%f", op->value.f );12.88 - case POINTER_OPERAND:12.89 - name = xir_lookup_symbol( op->value.p );12.90 + xir_temp_register_t tmp;12.91 +12.92 + switch( op->form ) {12.93 + case IMMEDIATE_OPERAND:12.94 + switch( ty ) {12.95 + case XTY_LONG:12.96 + return snprintf( buf, buflen, "$0x%x", op->value.i );12.97 + case XTY_QUAD:12.98 + return snprintf( buf, buflen, "$0x%lld", op->value.q );12.99 + case XTY_FLOAT:12.100 + return snprintf( buf, buflen, "%f", op->value.f );12.101 + case XTY_DOUBLE:12.102 + return snprintf( buf, buflen, "%f", op->value.f );12.103 + case XTY_PTR:12.104 + name = xir_lookup_symbol( op->value.p );12.105 + if( name != NULL ) {12.106 + return snprintf( buf, buflen, "*%s", name );12.107 + } else {12.108 + return snprintf( buf, buflen, "*%p", op->value.p );12.109 + }12.110 + default:12.111 + return snprintf( buf, buflen, "ILLOP" );12.112 + }12.113 + break;12.114 + case SOURCE_OPERAND:12.115 + name = xbb->source->get_register_name(op->value.i, ty);12.116 if( name != NULL ) {12.117 - return snprintf( buf, buflen, "*%s", name );12.118 + return snprintf( buf, buflen, "%%%s", name );12.119 } else {12.120 - return snprintf( buf, buflen, "*%p", op->value.p );12.121 + return snprintf( buf, buflen, "%%src%d", op->value.i );12.122 }12.123 - case SOURCE_REGISTER_OPERAND:12.124 - if( op->value.i >= MIN_SOURCE_REGISTER && op->value.i <= MAX_SOURCE_REGISTER ) {12.125 - if( xir_source_register_names ) {12.126 - return snprintf( buf, buflen, "%%%s", xir_source_register_names[(op->value.i-MIN_SOURCE_REGISTER)>>2] );12.127 - } else {12.128 - return snprintf( buf, buflen, "%%src%d", op->value.i-MIN_SOURCE_REGISTER );12.129 - }12.130 + break;12.131 + case TEMP_OPERAND:12.132 + tmp = &xbb->temp_regs[op->value.i];12.133 + if( tmp->home_register != -1 &&12.134 + (name = xbb->source->get_register_name(tmp->home_register,ty)) != NULL ) {12.135 + return snprintf( buf, buflen, "%%%s.%c%d", name,12.136 + XIR_TYPE_CODES[tmp->type], op->value.i );12.137 } else {12.138 - return snprintf( buf, buflen, "%%tmp%d", op->value.i-MIN_TEMP_REGISTER );12.139 + return snprintf( buf, buflen, "%%tmp%c%d",12.140 + XIR_TYPE_CODES[tmp->type], op->value.i );12.141 }12.142 - case TARGET_REGISTER_OPERAND:12.143 - if( xir_target_register_names ) {12.144 - return snprintf( buf, buflen, "%%%s", xir_target_register_names[op->value.i-MIN_TARGET_REGISTER] );12.145 + case DEST_OPERAND:12.146 + name = xbb->target->get_register_name(op->value.i, ty);12.147 + if( name != NULL ) {12.148 + return snprintf( buf, buflen, "%%%s", name );12.149 } else {12.150 - return snprintf( buf, buflen, "%%dst%d", op->value.i-MIN_TARGET_REGISTER );12.151 + return snprintf( buf, buflen, "%%dst%d", op->value.i );12.152 }12.153 default:12.154 return snprintf( buf, buflen, "ILLOP" );12.155 }12.156 }12.158 -void xir_print_instruction( FILE *out, xir_op_t i )12.159 +static void xir_print_instruction( FILE *out, xir_basic_block_t xbb, xir_op_t i )12.160 {12.161 char operands[64] = "";12.163 - if( i->operand[0].type != NO_OPERAND ) {12.164 - int pos = xir_snprint_operand( operands, sizeof(operands), &i->operand[0] );12.165 - if( i->operand[1].type != NO_OPERAND ) {12.166 + if( i->operand[0].form != NO_OPERAND ) {12.167 + int pos = xir_snprint_operand( operands, sizeof(operands), xbb, &i->operand[0],12.168 + XOP_OPTYPE(i,0));12.169 + if( i->operand[1].form != NO_OPERAND ) {12.170 strncat( operands, ", ", sizeof(operands)-pos );12.171 pos += 2;12.172 - xir_snprint_operand( operands+pos, sizeof(operands)-pos, &i->operand[1] );12.173 + xir_snprint_operand( operands+pos, sizeof(operands)-pos, xbb, &i->operand[1],12.174 + XOP_OPTYPE(i,1) );12.175 }12.176 }12.177 if( i->cond == CC_TRUE ) {12.178 @@ -263,7 +302,7 @@12.179 * Sanity check a block of IR to make sure that12.180 * operands match up with the expected values etc12.181 */12.182 -void xir_verify_block( xir_op_t start, xir_op_t end )12.183 +void xir_verify_block( xir_basic_block_t xbb, xir_op_t start, xir_op_t end )12.184 {12.185 xir_op_t it;12.186 int flags_written = 0;12.187 @@ -271,30 +310,43 @@12.188 assert( it != NULL && "Unexpected end of block" );12.189 assert( it->cond >= CC_TRUE && it->cond <= CC_SGT && "Invalid condition code" );12.190 if( XOP_HAS_0_OPERANDS(it) ) {12.191 - assert( it->operand[0].type == NO_OPERAND && it->operand[1].type == NO_OPERAND );12.192 + assert( it->operand[0].form == NO_OPERAND && it->operand[1].form == NO_OPERAND );12.193 } else if( XOP_HAS_1_OPERAND(it) ) {12.194 - assert( it->operand[0].type != NO_OPERAND && it->operand[1].type == NO_OPERAND );12.195 + assert( it->operand[0].form != NO_OPERAND && it->operand[1].form == NO_OPERAND );12.196 } else if( XOP_HAS_2_OPERANDS(it) ) {12.197 - assert( it->operand[0].type != NO_OPERAND && it->operand[1].type != NO_OPERAND );12.198 + assert( it->operand[0].form != NO_OPERAND && it->operand[1].form != NO_OPERAND );12.199 }12.201 if( it->opcode == OP_ENTER ) {12.202 assert( it->prev == NULL && "Enter instruction must have no predecessors" );12.203 assert( it == start && "Enter instruction must occur at the start of the block" );12.204 - assert( it->operand[0].type == INT_IMM_OPERAND && "Enter instruction must have an immediate operand" );12.205 + assert( it->operand[0].form == IMMEDIATE_OPERAND && "Enter instruction must have an immediate operand" );12.206 } else if( it->opcode == OP_ST || it->opcode == OP_LD ) {12.207 assert( it->cond != CC_TRUE && "Opcode not permitted with True condition code" );12.208 }12.210 if( XOP_WRITES_OP1(it) ) {12.211 - assert( (it->operand[0].type == SOURCE_REGISTER_OPERAND ||12.212 - it->operand[0].type == TARGET_REGISTER_OPERAND) && "Writable operand 1 requires a register" );12.213 + assert( XOP_IS_REG(it,0) && "Writable operand 1 requires a register" );12.214 }12.215 if( XOP_WRITES_OP2(it) ) {12.216 - assert( (it->operand[1].type == SOURCE_REGISTER_OPERAND ||12.217 - it->operand[1].type == TARGET_REGISTER_OPERAND) && "Writable operand 2 requires a register" );12.218 + assert( XOP_IS_REG(it,1) && "Writable operand 2 requires a register" );12.219 }12.220 -12.221 +12.222 + if( XOP_IS_SRC(it,0) ) {12.223 + assert( XOP_REG(it,0) <= MAX_SOURCE_REGISTER && "Undefined source register" );12.224 + } else if( XOP_IS_TMP(it,0) ) {12.225 + assert( XOP_REG(it,0) < xbb->next_temp_reg && "Undefined temporary register" );12.226 + } else if( XOP_IS_DST(it,0) ) {12.227 + assert( XOP_REG(it,0) <= MAX_DEST_REGISTER && "Undefined target register" );12.228 + }12.229 + if( XOP_IS_SRC(it,1) ) {12.230 + assert( XOP_REG(it,1) <= MAX_SOURCE_REGISTER && "Undefined source register" );12.231 + } else if( XOP_IS_TMP(it,1) ) {12.232 + assert( XOP_REG(it,1) < xbb->next_temp_reg && "Undefined temporary register" );12.233 + } else if( XOP_IS_DST(it,1) ) {12.234 + assert( XOP_REG(it,1) <= MAX_DEST_REGISTER && "Undefined target register" );12.235 + }12.236 +12.237 if( XOP_READS_FLAGS(it) ) {12.238 assert( flags_written && "Flags used without prior definition in block" );12.239 }12.240 @@ -305,7 +357,7 @@12.241 if( XOP_HAS_EXCEPTION(it) ) {12.242 assert( it->exc != NULL && "Missing exception block" );12.243 assert( it->exc->prev == it && "Exception back-link broken" );12.244 - xir_verify_block( it->exc, NULL ); // Verify exception sub-block12.245 + xir_verify_block( xbb, it->exc, NULL ); // Verify exception sub-block12.246 } else {12.247 assert( it->exc == NULL && "Unexpected exception block" );12.248 }12.249 @@ -320,13 +372,13 @@12.250 }12.251 }12.253 -xir_op_t xir_append_op2( xir_basic_block_t xbb, int op, int arg0type, uint32_t arg0, int arg1type, uint32_t arg1 )12.254 +xir_op_t xir_append_op2( xir_basic_block_t xbb, int op, int arg0form, uint32_t arg0, int arg1form, uint32_t arg1 )12.255 {12.256 xbb->ir_ptr->opcode = op;12.257 xbb->ir_ptr->cond = CC_TRUE;12.258 - xbb->ir_ptr->operand[0].type = arg0type;12.259 + xbb->ir_ptr->operand[0].form = arg0form;12.260 xbb->ir_ptr->operand[0].value.i = arg0;12.261 - xbb->ir_ptr->operand[1].type = arg1type;12.262 + xbb->ir_ptr->operand[1].form = arg1form;12.263 xbb->ir_ptr->operand[1].value.i = arg1;12.264 xbb->ir_ptr->exc = NULL;12.265 xbb->ir_ptr->next = xbb->ir_ptr+1;12.266 @@ -334,13 +386,13 @@12.267 return xbb->ir_ptr++;12.268 }12.270 -xir_op_t xir_append_op2cc( xir_basic_block_t xbb, int op, xir_cc_t cc, int arg0type, uint32_t arg0, int arg1type, uint32_t arg1 )12.271 +xir_op_t xir_append_op2cc( xir_basic_block_t xbb, int op, xir_cc_t cc, int arg0form, uint32_t arg0, int arg1form, uint32_t arg1 )12.272 {12.273 xbb->ir_ptr->opcode = op;12.274 xbb->ir_ptr->cond = cc;12.275 - xbb->ir_ptr->operand[0].type = arg0type;12.276 + xbb->ir_ptr->operand[0].form = arg0form;12.277 xbb->ir_ptr->operand[0].value.i = arg0;12.278 - xbb->ir_ptr->operand[1].type = arg1type;12.279 + xbb->ir_ptr->operand[1].form = arg1form;12.280 xbb->ir_ptr->operand[1].value.i = arg1;12.281 xbb->ir_ptr->exc = NULL;12.282 xbb->ir_ptr->next = xbb->ir_ptr+1;12.283 @@ -348,13 +400,13 @@12.284 return xbb->ir_ptr++;12.285 }12.287 -xir_op_t xir_append_float_op2( xir_basic_block_t xbb, int op, float imm1, int arg1type, uint32_t arg1 )12.288 +xir_op_t xir_append_float_op2( xir_basic_block_t xbb, int op, float imm1, int arg1form, uint32_t arg1 )12.289 {12.290 xbb->ir_ptr->opcode = op;12.291 xbb->ir_ptr->cond = CC_TRUE;12.292 - xbb->ir_ptr->operand[0].type = FLOAT_IMM_OPERAND;12.293 + xbb->ir_ptr->operand[0].form = IMMEDIATE_OPERAND;12.294 xbb->ir_ptr->operand[0].value.i = imm1;12.295 - xbb->ir_ptr->operand[1].type = arg1type;12.296 + xbb->ir_ptr->operand[1].form = arg1form;12.297 xbb->ir_ptr->operand[1].value.i = arg1;12.298 xbb->ir_ptr->exc = NULL;12.299 xbb->ir_ptr->next = xbb->ir_ptr+1;12.300 @@ -362,13 +414,13 @@12.301 return xbb->ir_ptr++;12.302 }12.304 -xir_op_t xir_append_ptr_op2( xir_basic_block_t xbb, int op, void *arg0, int arg1type, uint32_t arg1 )12.305 +xir_op_t xir_append_ptr_op2( xir_basic_block_t xbb, int op, void *arg0, int arg1form, uint32_t arg1 )12.306 {12.307 xbb->ir_ptr->opcode = op;12.308 xbb->ir_ptr->cond = CC_TRUE;12.309 - xbb->ir_ptr->operand[0].type = POINTER_OPERAND;12.310 + xbb->ir_ptr->operand[0].form = IMMEDIATE_OPERAND;12.311 xbb->ir_ptr->operand[0].value.p = arg0;12.312 - xbb->ir_ptr->operand[1].type = arg1type;12.313 + xbb->ir_ptr->operand[1].form = arg1form;12.314 xbb->ir_ptr->operand[1].value.i = arg1;12.315 xbb->ir_ptr->exc = NULL;12.316 xbb->ir_ptr->next = xbb->ir_ptr+1;12.317 @@ -407,19 +459,7 @@12.318 }12.319 }12.321 -int xir_get_operand_size( xir_op_t op, int operand )12.322 -{12.323 - int mode = XIR_OPCODE_TABLE[op->opcode].mode;12.324 - if( operand == 0 ) {12.325 - mode >>= 4;12.326 - } else {12.327 - mode >>= 8;12.328 - }12.329 - mode &= 0x07;12.330 - return XIR_OPERAND_SIZE[mode];12.331 -}12.332 -12.333 -void xir_print_block( FILE *out, xir_op_t start, xir_op_t end )12.334 +void xir_print_block( FILE *out, xir_basic_block_t xbb, xir_op_t start, xir_op_t end )12.335 {12.336 xir_op_t it = start;12.337 xir_op_t exc = NULL;12.338 @@ -428,20 +468,20 @@12.339 if( it->exc ) {12.340 while( exc ) {12.341 fprintf( out, "%40c ", ' ' );12.342 - xir_print_instruction( out, exc );12.343 + xir_print_instruction( out, xbb, exc );12.344 fprintf( out, "\n" );12.345 exc = exc->next;12.346 }12.347 exc = it->exc;12.348 }12.349 - xir_print_instruction( out, it );12.350 + xir_print_instruction( out, xbb, it );12.351 if( exc ) {12.352 if( it->exc ) {12.353 fprintf( out, "=> " );12.354 } else {12.355 fprintf( out, " " );12.356 }12.357 - xir_print_instruction( out, exc );12.358 + xir_print_instruction( out, xbb, exc );12.359 exc = exc->next;12.360 }12.361 fprintf( out, "\n" );12.362 @@ -451,8 +491,7 @@12.363 }12.364 }12.366 -void xir_dump_block( xir_op_t start, xir_op_t end )12.367 +void xir_dump_block( xir_basic_block_t xbb )12.368 {12.369 - xir_print_block( stdout, start, end );12.370 - xir_verify_block( start, end );12.371 + xir_print_block( stdout, xbb, xbb->ir_begin, xbb->ir_end );12.372 }
13.1 --- a/src/xlat/xir.h Tue Apr 07 10:55:03 2009 +000013.2 +++ b/src/xlat/xir.h Sun Apr 12 07:24:45 2009 +000013.3 @@ -48,26 +48,17 @@13.4 * somehow.13.5 ****************************************************************************/13.7 -/* Registers 0..127 belong to the source machine, all higher numbers are temporaries */13.8 -#define MIN_SOURCE_REGISTER 013.9 #define MAX_SOURCE_REGISTER 102313.10 -#define MIN_TEMP_REGISTER 102413.11 -#define MAX_TEMP_REGISTER 153513.12 +#define MAX_TEMP_REGISTER 51113.13 +#define MAX_DEST_REGISTER 12713.15 -/* Target registers have a separate 'address' space. */13.16 -#define MIN_TARGET_REGISTER 013.17 -#define MAX_TARGET_REGISTER 12713.18 +/* Preallocated temporaries for convenience */13.19 +#define REG_TMP0 013.20 +#define REG_TMP1 113.21 +#define REG_TMP2 213.22 +#define REG_TMPQ0 313.23 +#define REG_TMPQ1 413.25 -/* Convenience defines */13.26 -#define REG_TMP0 (MIN_TEMP_REGISTER)13.27 -#define REG_TMP1 (MIN_TEMP_REGISTER+1)13.28 -#define REG_TMP2 (MIN_TEMP_REGISTER+2)13.29 -#define REG_TMP3 (MIN_TEMP_REGISTER+3)13.30 -#define REG_TMP4 (MIN_TEMP_REGISTER+4)13.31 -#define REG_TMP5 (MIN_TEMP_REGISTER+5)13.32 -13.33 -#define REG_TMPQ0 (MIN_TEMP_REGISTER+128)13.34 -#define REG_TMPQ1 (MIN_TEMP_REGISTER+129)13.36 /**13.37 * Operands are either integer, float, or double, and are either immediate or13.38 @@ -77,17 +68,14 @@13.39 */13.40 typedef enum {13.41 NO_OPERAND = 0,13.42 - SOURCE_REGISTER_OPERAND =1, // Source (or temp) register13.43 - TARGET_REGISTER_OPERAND =2,13.44 - INT_IMM_OPERAND = 3,13.45 - QUAD_IMM_OPERAND = 4,13.46 - FLOAT_IMM_OPERAND = 5,13.47 - DOUBLE_IMM_OPERAND = 6,13.48 - POINTER_OPERAND = 7, // Native target pointer, eg direct memory access13.49 -} xir_operand_type_t;13.50 + SOURCE_OPERAND =1, // Source (or temp) register13.51 + DEST_OPERAND =2,13.52 + TEMP_OPERAND=3,13.53 + IMMEDIATE_OPERAND=413.54 +} xir_operand_form_t;13.56 typedef struct xir_operand {13.57 - xir_operand_type_t type;13.58 + xir_operand_form_t form;13.59 union {13.60 uint32_t i;13.61 uint64_t q;13.62 @@ -97,6 +85,16 @@13.63 } value;13.64 } *xir_operand_t;13.66 +typedef enum {13.67 + XTY_LONG = 0, /* 32-bit integer */13.68 + XTY_QUAD = 1, /* 64-bit integer */13.69 + XTY_FLOAT = 2, /* 32-bit float */13.70 + XTY_DOUBLE = 3,/* 64-bit float */13.71 + XTY_VEC4F = 4,/* 4x 32-bit floats (16 bytes) */13.72 + XTY_MAT16F = 5,/* 4x4x 32-bit floats (64 bytes) */13.73 + XTY_PTR = 6, /* Native pointer (of appropriate size) */13.74 +} xir_type_t;13.75 +13.76 /* Condition codes */13.77 typedef enum {13.78 CC_TRUE = -1, /* Always */13.79 @@ -193,7 +191,6 @@13.80 OP_TST,13.81 OP_XOR,13.82 OP_XORS,13.83 - OP_XLAT,13.85 /* FPU */13.86 OP_ABSD,13.87 @@ -250,10 +247,13 @@13.88 OP_RAISEMNE, // imm mask in, reg in - branch to exception if (reg & mask) != 013.91 - // Native calls (not source machine calls)13.92 + // Native operations13.93 OP_CALLLUT, // Call indirect through base pointer (reg) + displacement13.94 OP_CALL1, // Call function with single argument and no return value13.95 OP_CALLR, // Call function with no arguments and a single return value13.96 + OP_LOADPTRL,13.97 + OP_LOADPTRQ,13.98 + OP_XLAT,13.100 /********************** SH4-specific macro operations *************************/13.101 /* TODO: These need to be broken down into smaller operations eventually,13.102 @@ -380,6 +380,11 @@13.103 typedef struct xlat_source_machine *xlat_source_machine_t;13.104 typedef struct xlat_target_machine *xlat_target_machine_t;13.106 +typedef struct xir_temp_register {13.107 + xir_type_t type;13.108 + uint32_t home_register; /* corresponding source register, or -1 for none */13.109 +} *xir_temp_register_t;13.110 +13.111 /**13.112 * Source data structure. This mainly exists to manage memory for XIR operations13.113 */13.114 @@ -391,7 +396,10 @@13.115 xir_op_t ir_alloc_end; /* End of allocation */13.116 uint32_t pc_begin; /* first instruction */13.117 uint32_t pc_end; /* next instruction after end */13.118 + struct xir_temp_register temp_regs[MAX_TEMP_REGISTER+1]; /* temporary register table */13.119 + uint32_t next_temp_reg;13.120 xlat_source_machine_t source;13.121 + xlat_target_machine_t target;13.122 struct mem_region_fn **address_space; /* source machine memory access table */13.123 } *xir_basic_block_t;13.125 @@ -462,17 +470,8 @@13.126 void *ptr;13.127 };13.129 -extern const struct xir_opcode_entry XIR_OPCODE_TABLE[];13.130 -#define XOP_IS_SRCREG(op,n) (op->operand[n].type == SOURCE_REGISTER_OPERAND)13.131 -#define XOP_IS_TGTREG(op,n) (op->operand[n].type == TARGET_REGISTER_OPERAND)13.132 -#define XOP_IS_INTIMM(op,n) (op->operand[n].type == INT_IMM_OPERAND)13.133 -#define XOP_IS_FLOATIMM(op,n) (op->operand[n].type == FLOAT_IMM_OPERAND)13.134 -#define XOP_IS_DOUBLEIMM(op,n) (op->operand[n].type == DOUBLE_IMM_OPERAND)13.135 -#define XOP_IS_QUADIMM(op,n) (op->operand[n].type == QUAD_IMM_OPERAND)13.136 -#define XOP_IS_PTRIMM(op,n) (op->operand[n].type == POINTER_OPERAND)13.137 -#define XOP_IS_IMM(op,n) (op->operand[n].type > TARGET_REGISTER_OPERAND)13.138 -#define XOP_IS_REG(op,n) (XOP_IS_SRCREG(op,n)||XOP_IS_TGTREG(op,n)13.139 -#define XOP_IS_FORM(op,t1,t2) (op->operand[0].type == t1 && op->operand[1].type == t2)13.140 +extern const struct xir_opcode_entry XIR_OPCODE_TABLE[];13.141 +extern const int XIR_OPERAND_SIZE[];13.143 #define XOP_REG(op,n) (op->operand[n].value.i)13.144 #define XOP_REG1(op) XOP_REG(op,0)13.145 @@ -501,33 +500,69 @@13.146 #define XOP_READS_REG2(op) (XOP_READS_OP2(op) && XOP_IS_REG(op,1))13.147 #define XOP_WRITES_REG2(op) (XOP_WRITES_OP2(op) && XOP_IS_REG(op,1))13.149 -#define XOP_TYPE1(op) (op->operand[0].type)13.150 -#define XOP_TYPE2(op) (op->operand[1].type)13.151 +#define XOP_TYPE1(op) ((XIR_OPCODE_TABLE[op->opcode].mode >> 4) & 0x0F)13.152 +#define XOP_TYPE2(op) ((XIR_OPCODE_TABLE[op->opcode].mode >> 8) & 0x0F)13.153 +#define XOP_FORM1(op) (op->operand[0].form)13.154 +#define XOP_FORM2(op) (op->operand[1].form)13.155 #define XOP_OPERAND(op,i) (&op->operand[i])13.156 +#define XOP_OPTYPE(op,n) (n == 0 ? XOP_TYPE1(op) : XOP_TYPE2(op))13.157 +#define XOP_OPSIZE(op,n) (XIR_OPERAND_SIZE[XOP_OPTYPE(op,n)])13.159 -/******************************* OP Constructors ******************************/13.160 +#define XOP_IS_SRC(op,n) (op->operand[n].form == SOURCE_OPERAND)13.161 +#define XOP_IS_DST(op,n) (op->operand[n].form == DEST_OPERAND)13.162 +#define XOP_IS_TMP(op,n) (op->operand[n].form == TEMP_OPERAND)13.163 +#define XOP_IS_IMM(op,n) (op->operand[n].form == IMMEDIATE_OPERAND)13.164 +#define XOP_IS_IMMF(op,n) (XOP_IS_IMM(op,n) && XOP_OPTYPE(op,n) == XTY_FLOAT)13.165 +#define XOP_IS_IMMD(op,n) (XOP_IS_IMM(op,n) && XOP_OPTYPE(op,n) == XTY_DOUBLE)13.166 +#define XOP_IS_IMML(op,n) (XOP_IS_IMM(op,n) && XOP_OPTYPE(op,n) == XTY_LONG)13.167 +#define XOP_IS_IMMQ(op,n) (XOP_IS_IMM(op,n) && XOP_OPTYPE(op,n) == XTY_QUAD)13.168 +#define XOP_IS_IMMP(op,n) (XOP_IS_IMM(op,n) && XOP_OPTYPE(op,n) == XTY_PTR)13.169 +#define XOP_IS_REG(op,n) (op->operand[n].form >= SOURCE_OPERAND && op->operand[n].form <= TEMP_OPERAND)13.170 +#define XOP_IS_FORM(op,t1,t2) (op->operand[0].form == t1 && op->operand[1].form == t2)13.172 -xir_op_t xir_append_op2( xir_basic_block_t xbb, int op, int arg0type, uint32_t arg0, int arg1type, uint32_t arg1 );13.173 -xir_op_t xir_append_op2cc( xir_basic_block_t xbb, int op, int cc, int arg0type, uint32_t arg0, int arg1type, uint32_t arg1 );13.174 -xir_op_t xir_append_float_op2( xir_basic_block_t xbb, int op, float imm1, int arg1type, uint32_t arg1 );13.175 -xir_op_t xir_append_ptr_op2( xir_basic_block_t xbb, int op, void *arg0, int arg1type, uint32_t arg1 );13.176 +/******************************* IR Construction ******************************/13.178 +/**13.179 + * Clear out a basic block structure, ready for reuse13.180 + */13.181 +void xir_clear_basic_block( xir_basic_block_t xbb );13.183 -#define XOP1( op, arg0 ) xir_append_op2(xbb, op, SOURCE_REGISTER_OPERAND, arg0, NO_OPERAND, 0)13.184 -#define XOP1CC( op, cc, arg0 ) xir_append_op2cc(xbb, op, cc, SOURCE_REGISTER_OPERAND, arg0, NO_OPERAND, 0)13.185 -#define XOP1I( op, arg0 ) xir_append_op2(xbb, op, INT_IMM_OPERAND, arg0, NO_OPERAND, 0)13.186 -#define XOP2I( op, arg0, arg1 ) xir_append_op2(xbb, op, INT_IMM_OPERAND, arg0, SOURCE_REGISTER_OPERAND, arg1)13.187 -#define XOP2II( op, arg0, arg1 ) xir_append_op2(xbb, op, INT_IMM_OPERAND, arg0, INT_IMM_OPERAND, arg1)13.188 -#define XOP2IICC( op, cc, arg0, arg1 ) xir_append_op2cc(xbb, op, cc, INT_IMM_OPERAND, arg0, INT_IMM_OPERAND, arg1)13.189 -#define XOP2( op, arg0, arg1 ) xir_append_op2(xbb, op, SOURCE_REGISTER_OPERAND, arg0, SOURCE_REGISTER_OPERAND, arg1)13.190 -#define XOP2CC( op, cc, arg0, arg1 ) xir_append_op2cc(xbb, op, cc, SOURCE_REGISTER_OPERAND, arg0, SOURCE_REGISTER_OPERAND, arg1)13.191 -#define XOP2F( op, arg0, arg1 ) xir_append_float_op2(xbb, op, arg0, SOURCE_REGISTER_OPERAND, arg1)13.192 -#define XOP2P( op, arg0, arg1 ) xir_append_ptr_op2(xbb, op, arg0, SOURCE_REGISTER_OPERAND, arg1)13.193 +/**13.194 + * Allocate a temporary register of the given type, with given home position13.195 + * (-1 for a pure temporary)13.196 + */13.197 +uint32_t xir_alloc_temp_reg( xir_basic_block_t xbb, xir_type_t type, int home );13.198 +13.199 +xir_op_t xir_append_op2( xir_basic_block_t xbb, int op, int arg0form, uint32_t arg0, int arg1form, uint32_t arg1 );13.200 +xir_op_t xir_append_op2cc( xir_basic_block_t xbb, int op, int cc, int arg0form, uint32_t arg0, int arg1form, uint32_t arg1 );13.201 +xir_op_t xir_append_float_op2( xir_basic_block_t xbb, int op, float imm1, int arg1form, uint32_t arg1 );13.202 +xir_op_t xir_append_ptr_op2( xir_basic_block_t xbb, int op, void *arg0, int arg1form, uint32_t arg1 );13.203 +13.204 +13.205 +#define XOP1I( op, arg0 ) xir_append_op2(xbb, op, IMMEDIATE_OPERAND, arg0, NO_OPERAND, 0)13.206 +#define XOP1S( op, arg0 ) xir_append_op2(xbb, op, SOURCE_OPERAND, arg0, NO_OPERAND, 0)13.207 +#define XOP1SCC( op, cc, arg0 ) xir_append_op2cc(xbb, op, cc, SOURCE_OPERAND, arg0, NO_OPERAND, 0)13.208 +#define XOP1T( op, arg0 ) xir_append_op2(xbb, op, TEMP_OPERAND, arg0, NO_OPERAND, 0)13.209 +#define XOP1TCC( op, cc, arg0 ) xir_append_op2cc(xbb, op, cc, TEMP_OPERAND, arg0, NO_OPERAND, 0)13.210 +#define XOP2IS( op, arg0, arg1 ) xir_append_op2(xbb, op, IMMEDIATE_OPERAND, arg0, SOURCE_OPERAND, arg1)13.211 +#define XOP2IT( op, arg0, arg1 ) xir_append_op2(xbb, op, IMMEDIATE_OPERAND, arg0, TEMP_OPERAND, arg1)13.212 +#define XOP2II( op, arg0, arg1 ) xir_append_op2(xbb, op, IMMEDIATE_OPERAND, arg0, IMMEDIATE_OPERAND, arg1)13.213 +#define XOP2IICC( op, cc, arg0, arg1 ) xir_append_op2cc(xbb, op, cc, IMMEDIATE_OPERAND, arg0, IMMEDIATE_OPERAND, arg1)13.214 +#define XOP2SS( op, arg0, arg1 ) xir_append_op2(xbb, op, SOURCE_OPERAND, arg0, SOURCE_OPERAND, arg1)13.215 +#define XOP2ST( op, arg0, arg1 ) xir_append_op2(xbb, op, SOURCE_OPERAND, arg0, TEMP_OPERAND, arg1)13.216 +#define XOP2TS( op, arg0, arg1 ) xir_append_op2(xbb, op, TEMP_OPERAND, arg0, SOURCE_OPERAND, arg1)13.217 +#define XOP2TT( op, arg0, arg1 ) xir_append_op2(xbb, op, TEMP_OPERAND, arg0, TEMP_OPERAND, arg1)13.218 +#define XOP2CC( op, cc, arg0, arg1 ) xir_append_op2cc(xbb, op, cc, SOURCE_OPERAND, arg0, SOURCE_OPERAND, arg1)13.219 +#define XOP2FS( op, arg0, arg1 ) xir_append_float_op2(xbb, op, arg0, SOURCE_OPERAND, arg1)13.220 +#define XOP2PS( op, arg0, arg1 ) xir_append_ptr_op2(xbb, op, arg0, SOURCE_OPERAND, arg1)13.221 +#define XOP2PT( op, arg0, arg1 ) xir_append_ptr_op2(xbb, op, arg0, TEMP_OPERAND, arg1)13.222 #define XOP0( op ) xir_append_op2(xbb, op, NO_OPERAND, 0, NO_OPERAND, 0)13.223 #define XOPCALL0( arg0 ) xir_append_ptr_op2(xbb, OP_CALL0, arg0, NO_OPERAND, 0)13.224 -#define XOPCALL1( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALL1, arg0, SOURCE_REGISTER_OPERAND, arg1)13.225 -#define XOPCALL1I( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALL1, arg0, INT_IMM_OPERAND, arg1)13.226 -#define XOPCALLR( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALLR, arg0, SOURCE_REGISTER_OPERAND, arg1)13.227 +#define XOPCALL1I( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALL1, arg0, IMMEDIATE_OPERAND, arg1)13.228 +#define XOPCALL1S( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALL1, arg0, SOURCE_OPERAND, arg1)13.229 +#define XOPCALL1T( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALL1, arg0, TEMP_OPERAND, arg1)13.230 +#define XOPCALLRS( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALLR, arg0, SOURCE_OPERAND, arg1)13.231 +#define XOPCALLRT( arg0, arg1 ) xir_append_ptr_op2(xbb, OP_CALLR, arg0, TEMP_OPERAND, arg1)13.233 /**************************** IR Modification ******************************/13.235 @@ -584,13 +619,7 @@13.236 * Verify the integrity of an IR block - abort with assertion failure on any13.237 * errors.13.238 */13.239 -void xir_verify_block( xir_op_t start, xir_op_t end );13.240 -13.241 -/**13.242 - * Set the register name mappings for source and target registers - only really13.243 - * used for debug output13.244 - */13.245 -void xir_set_register_names( const char **source_regs, const char **target_regs );13.246 +void xir_verify_block( xir_basic_block_t xbb, xir_op_t begin, xir_op_t end );13.248 /**13.249 * Set the symbol table mappings for target points - also only really for13.250 @@ -601,7 +630,7 @@13.251 /**13.252 * Dump the specified block of IR to stdout13.253 */13.254 -void xir_dump_block( xir_op_t start, xir_op_t end );13.255 +void xir_dump_block( xir_basic_block_t xbb );13.258 #endif /* !lxdream_xir_H */
14.1 --- a/src/xlat/xirsup.c Tue Apr 07 10:55:03 2009 +000014.2 +++ b/src/xlat/xirsup.c Sun Apr 12 07:24:45 2009 +000014.3 @@ -127,8 +127,8 @@14.5 if( arg == 0x1234 ) { /* Identity - NOP */14.6 it->opcode = OP_NOP;14.7 - it->operand[0].type = NO_OPERAND;14.8 - it->operand[1].type = NO_OPERAND;14.9 + it->operand[0].form = NO_OPERAND;14.10 + it->operand[1].form = NO_OPERAND;14.11 return it;14.12 }14.14 @@ -149,33 +149,33 @@14.15 arg >>= 4;14.16 }14.18 - int shiftertype = it->operand[1].type, shifterval = it->operand[1].value.i;14.19 + int shifterform = it->operand[1].form, shifterval = it->operand[1].value.i;14.20 xir_op_t seq = xbb->ir_ptr;14.22 for( i=first; i<=last; i++ ) {14.23 if( mask_for_shift[i+3] != 0 ) {14.24 uint32_t maxmask = 0xFFFFFFFF;14.25 if( first != i ) {14.26 - shiftertype = SOURCE_REGISTER_OPERAND;14.27 + shifterform = TEMP_OPERAND;14.28 if( last == i ) {14.29 shifterval = tmp1;14.30 } else {14.31 shifterval = tmp2;14.32 - xir_append_op2( xbb, OP_MOV, SOURCE_REGISTER_OPERAND, tmp1, shiftertype, shifterval );14.33 + xir_append_op2( xbb, OP_MOV, TEMP_OPERAND, tmp1, shifterform, shifterval );14.34 }14.35 }14.36 if( i < 0 ) {14.37 - xir_append_op2( xbb, OP_SLR, INT_IMM_OPERAND, (-i)<<3, shiftertype, shifterval );14.38 + xir_append_op2( xbb, OP_SLR, IMMEDIATE_OPERAND, (-i)<<3, shifterform, shifterval );14.39 maxmask >>= ((-i)<<3);14.40 } else if( i > 0 ) {14.41 - xir_append_op2( xbb, OP_SLL, INT_IMM_OPERAND, i<<3, shiftertype, shifterval );14.42 + xir_append_op2( xbb, OP_SLL, IMMEDIATE_OPERAND, i<<3, shifterform, shifterval );14.43 maxmask <<= (i<<3);14.44 }14.45 if( mask_for_shift[i+3] != maxmask ) {14.46 - xir_append_op2( xbb, OP_AND, INT_IMM_OPERAND, mask_for_shift[i+3], shiftertype, shifterval );14.47 + xir_append_op2( xbb, OP_AND, IMMEDIATE_OPERAND, mask_for_shift[i+3], shifterform, shifterval );14.48 }14.49 if( first != i ) {14.50 - xir_append_op2( xbb, OP_OR, shiftertype, shifterval, it->operand[1].type, it->operand[1].value.i );14.51 + xir_append_op2( xbb, OP_OR, shifterform, shifterval, it->operand[1].form, it->operand[1].value.i );14.52 }14.53 }14.54 }14.55 @@ -183,14 +183,14 @@14.56 /* Replace original shuffle with either a temp move or a nop */14.57 if( first != last ) {14.58 it->opcode = OP_MOV;14.59 - it->operand[0].type = it->operand[1].type;14.60 + it->operand[0].form = it->operand[1].form;14.61 it->operand[0].value.i = it->operand[1].value.i;14.62 - it->operand[1].type = SOURCE_REGISTER_OPERAND;14.63 + it->operand[1].form = TEMP_OPERAND;14.64 it->operand[1].value.i = tmp1;14.65 } else {14.66 it->opcode = OP_NOP;14.67 - it->operand[0].type = NO_OPERAND;14.68 - it->operand[1].type = NO_OPERAND;14.69 + it->operand[0].form = NO_OPERAND;14.70 + it->operand[1].form = NO_OPERAND;14.71 }14.73 /* Finally insert the new sequence after the original op */
15.1 --- a/src/xlat/xlat.h Tue Apr 07 10:55:03 2009 +000015.2 +++ b/src/xlat/xlat.h Sun Apr 12 07:24:45 2009 +000015.3 @@ -30,7 +30,6 @@15.4 struct xlat_source_machine {15.5 const char *name;15.6 void *state_data; /* Pointer to source machine state structure */15.7 - const char **reg_names; /* Register names, indexed by offset/4 */15.8 uint32_t pc_offset; /* Offset of source PC, relative to state_data */15.9 uint32_t delayed_pc_offset; /* Offset of source delayed PC offset, relative to state_data */15.10 uint32_t t_offset; /* Offset of source T reg, relative to state_data */15.11 @@ -39,6 +38,12 @@15.12 uint32_t s_offset;15.14 /**15.15 + * Return the name of the register with the given type,15.16 + * or NULL if no such register exists15.17 + */15.18 + const char * (*get_register_name)( uint32_t reg, xir_type_t type );15.19 +15.20 + /**15.21 * Decode a basic block of instructions from start, stopping after a15.22 * control transfer or before the given end instruction.15.23 * @param sd source data. This method should set the address_space field.15.24 @@ -51,17 +56,21 @@15.25 /* Target machine description (no these are not meant to be symmetrical) */15.26 struct xlat_target_machine {15.27 const char *name;15.28 - /* Register information */15.29 - const char **reg_names;15.31 /* Required functions */15.33 /**15.34 + * Return the name of the register with the given type,15.35 + * or NULL if no such register exists15.36 + */15.37 + const char * (*get_register_name)( uint32_t reg, xir_type_t type );15.38 +15.39 + /**15.40 * Test if the given operands are legal for the opcode. Note that it is assumed that15.41 * target register operands are always legal. This is used by the register allocator15.42 * to determine when it can fuse load/stores with another operation.15.43 */15.44 - gboolean (*is_legal)( xir_opcode_t op, xir_operand_type_t arg0, xir_operand_type_t arg1 );15.45 + gboolean (*is_legal)( xir_opcode_t op, xir_operand_form_t arg0, xir_operand_form_t arg1 );15.47 /**15.48 * Lower IR closer to the machine, handling machine-specific issues that can't
.