Push subarchitecture stuff through the x86 parts.


git-svn-id: svn://svn.valgrind.org/vex/trunk@689 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/main/vex_main.c b/priv/main/vex_main.c
index cbc4084..c41b87b 100644
--- a/priv/main/vex_main.c
+++ b/priv/main/vex_main.c
@@ -193,10 +193,10 @@
    HInstr*      (*genReload)   ( HReg, Int );
    void         (*ppInstr)     ( HInstr* );
    void         (*ppReg)       ( HReg );
-   HInstrArray* (*iselBB)      ( IRBB* );
+   HInstrArray* (*iselBB)      ( IRBB*, VexSubArch );
    IRBB*        (*bbToIR)      ( UChar*, Addr64, Int*, 
                                  Bool(*)(Addr64), 
-                                 Bool(*)(Addr64), Bool );
+                                 Bool(*)(Addr64), Bool, VexSubArch );
    Int          (*emit)        ( UChar*, Int, HInstr* );
    IRExpr*      (*specHelper)  ( Char*, IRExpr** );
    Bool         (*preciseMemExnsFn) ( Int, Int );
@@ -254,6 +254,9 @@
          emit        = (Int(*)(UChar*,Int,HInstr*)) emit_X86Instr;
 	 host_is_bigendian = False;
          host_word_type    = Ity_I32;
+         vassert(subarch_host == VexSubArchX86_sse0
+                 || subarch_host == VexSubArchX86_sse1
+                 || subarch_host == VexSubArchX86_sse2);
          break;
 
       default:
@@ -270,6 +273,9 @@
          guest_sizeB      = sizeof(VexGuestX86State);
          guest_word_type  = Ity_I32;
          guest_layout     = &x86guest_layout;
+         vassert(subarch_guest == VexSubArchX86_sse0
+                 || subarch_guest == VexSubArchX86_sse1
+                 || subarch_guest == VexSubArchX86_sse2);
          break;
 
       case VexArchARM:
@@ -285,6 +291,13 @@
          vpanic("LibVEX_Translate: unsupported guest insn set");
    }
 
+   /* yet more sanity checks ... */
+   if (arch_guest == VexArchX86 && arch_host == VexArchX86) {
+      /* doesn't necessarily have to be true, but if it isn't it means
+         we are simulating one flavour of x86 on a different one, which
+         is pretty strange. */
+      vassert(subarch_guest == subarch_host);
+   }
 
    if (vex_traceflags & VEX_TRACE_FE)
       vex_printf("\n------------------------" 
@@ -296,7 +309,8 @@
 		   guest_bytes_read,
 		   byte_accessible,
                    chase_into_ok,
-		   host_is_bigendian );
+		   host_is_bigendian,
+                   subarch_guest );
 
    if (irbb == NULL) {
       /* Access failure. */
@@ -384,7 +398,7 @@
                    " Instruction selection "
                    "------------------------\n");
 
-   vcode = iselBB ( irbb );
+   vcode = iselBB ( irbb, subarch_host );
 
    if (vex_traceflags & VEX_TRACE_VCODE)
       vex_printf("\n");