]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/valgrind/src/valgrind-3.6.0-svn/memcheck/mc_machine.c
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / memcheck / mc_machine.c
index 61494d9e3c490c43daa21e4fff5f7d194f83753e..0c72b2dd903ff00103ac1eb67823a54078393cef 100644 (file)
 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestPPC64State)
 #endif
 
+#if defined(VGA_s390x)
+# include "libvex_guest_s390x.h"
+# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestS390XState)
+#endif
+
 #if defined(VGA_arm)
 # include "libvex_guest_arm.h"
 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestARMState)
@@ -195,98 +200,139 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o == GOF(VRSAVE)    && sz == 4) return -1;
    if (o == GOF(REDIR_SP)  && sz == 8) return -1;
 
-   tl_assert(SZB(FPR0) == 8);
-   if (o == GOF(FPR0) && sz == 8) return o;
-   if (o == GOF(FPR1) && sz == 8) return o;
-   if (o == GOF(FPR2) && sz == 8) return o;
-   if (o == GOF(FPR3) && sz == 8) return o;
-   if (o == GOF(FPR4) && sz == 8) return o;
-   if (o == GOF(FPR5) && sz == 8) return o;
-   if (o == GOF(FPR6) && sz == 8) return o;
-   if (o == GOF(FPR7) && sz == 8) return o;
-   if (o == GOF(FPR8) && sz == 8) return o;
-   if (o == GOF(FPR9) && sz == 8) return o;
-   if (o == GOF(FPR10) && sz == 8) return o;
-   if (o == GOF(FPR11) && sz == 8) return o;
-   if (o == GOF(FPR12) && sz == 8) return o;
-   if (o == GOF(FPR13) && sz == 8) return o;
-   if (o == GOF(FPR14) && sz == 8) return o;
-   if (o == GOF(FPR15) && sz == 8) return o;
-   if (o == GOF(FPR16) && sz == 8) return o;
-   if (o == GOF(FPR17) && sz == 8) return o;
-   if (o == GOF(FPR18) && sz == 8) return o;
-   if (o == GOF(FPR19) && sz == 8) return o;
-   if (o == GOF(FPR20) && sz == 8) return o;
-   if (o == GOF(FPR21) && sz == 8) return o;
-   if (o == GOF(FPR22) && sz == 8) return o;
-   if (o == GOF(FPR23) && sz == 8) return o;
-   if (o == GOF(FPR24) && sz == 8) return o;
-   if (o == GOF(FPR25) && sz == 8) return o;
-   if (o == GOF(FPR26) && sz == 8) return o;
-   if (o == GOF(FPR27) && sz == 8) return o;
-   if (o == GOF(FPR28) && sz == 8) return o;
-   if (o == GOF(FPR29) && sz == 8) return o;
-   if (o == GOF(FPR30) && sz == 8) return o;
-   if (o == GOF(FPR31) && sz == 8) return o;
+   // With ISA 2.06, the "Vector-Scalar Floating-point" category
+   // provides facilities to support vector and scalar binary floating-
+   // point operations.  A unified register file is an integral part
+   // of this new facility, combining floating point and vector registers
+   // using a 64x128-bit vector.  These are referred to as VSR[0..63].
+   // The floating point registers are now mapped into double word element 0
+   // of VSR[0..31]. The 32x128-bit vector registers defined by the "Vector
+   // Facility [Category: Vector]" are now mapped to VSR[32..63].
+
+   //  Floating point registers . . .
+   if (o == GOF(VSR0) && sz == 8) return o;
+   if (o == GOF(VSR1) && sz == 8) return o;
+   if (o == GOF(VSR2) && sz == 8) return o;
+   if (o == GOF(VSR3) && sz == 8) return o;
+   if (o == GOF(VSR4) && sz == 8) return o;
+   if (o == GOF(VSR5) && sz == 8) return o;
+   if (o == GOF(VSR6) && sz == 8) return o;
+   if (o == GOF(VSR7) && sz == 8) return o;
+   if (o == GOF(VSR8) && sz == 8) return o;
+   if (o == GOF(VSR9) && sz == 8) return o;
+   if (o == GOF(VSR10) && sz == 8) return o;
+   if (o == GOF(VSR11) && sz == 8) return o;
+   if (o == GOF(VSR12) && sz == 8) return o;
+   if (o == GOF(VSR13) && sz == 8) return o;
+   if (o == GOF(VSR14) && sz == 8) return o;
+   if (o == GOF(VSR15) && sz == 8) return o;
+   if (o == GOF(VSR16) && sz == 8) return o;
+   if (o == GOF(VSR17) && sz == 8) return o;
+   if (o == GOF(VSR18) && sz == 8) return o;
+   if (o == GOF(VSR19) && sz == 8) return o;
+   if (o == GOF(VSR20) && sz == 8) return o;
+   if (o == GOF(VSR21) && sz == 8) return o;
+   if (o == GOF(VSR22) && sz == 8) return o;
+   if (o == GOF(VSR23) && sz == 8) return o;
+   if (o == GOF(VSR24) && sz == 8) return o;
+   if (o == GOF(VSR25) && sz == 8) return o;
+   if (o == GOF(VSR26) && sz == 8) return o;
+   if (o == GOF(VSR27) && sz == 8) return o;
+   if (o == GOF(VSR28) && sz == 8) return o;
+   if (o == GOF(VSR29) && sz == 8) return o;
+   if (o == GOF(VSR30) && sz == 8) return o;
+   if (o == GOF(VSR31) && sz == 8) return o;
 
    /* For the various byte sized XER/CR pieces, use offset 8
-      in VR0 .. VR31. */
-   tl_assert(SZB(VR0) == 16);
-   if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VR0);
-   if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VR1);
-   if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VR2);
-   if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VR3);
-
-   if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VR4);
-   if (o == GOF(CR0_0)   && sz == 1) return 8 +GOF(VR5);
-   if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VR6);
-   if (o == GOF(CR1_0)   && sz == 1) return 8 +GOF(VR7);
-   if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VR8);
-   if (o == GOF(CR2_0)   && sz == 1) return 8 +GOF(VR9);
-   if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VR10);
-   if (o == GOF(CR3_0)   && sz == 1) return 8 +GOF(VR11);
-   if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VR12);
-   if (o == GOF(CR4_0)   && sz == 1) return 8 +GOF(VR13);
-   if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VR14);
-   if (o == GOF(CR5_0)   && sz == 1) return 8 +GOF(VR15);
-   if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VR16);
-   if (o == GOF(CR6_0)   && sz == 1) return 8 +GOF(VR17);
-   if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VR18);
-   if (o == GOF(CR7_0)   && sz == 1) return 8 +GOF(VR19);
-
-   /* Vector registers .. use offset 0 in VR0 .. VR31. */
-   if (o >= GOF(VR0)  && o+sz <= GOF(VR0) +SZB(VR0))  return 0+ GOF(VR0);
-   if (o >= GOF(VR1)  && o+sz <= GOF(VR1) +SZB(VR1))  return 0+ GOF(VR1);
-   if (o >= GOF(VR2)  && o+sz <= GOF(VR2) +SZB(VR2))  return 0+ GOF(VR2);
-   if (o >= GOF(VR3)  && o+sz <= GOF(VR3) +SZB(VR3))  return 0+ GOF(VR3);
-   if (o >= GOF(VR4)  && o+sz <= GOF(VR4) +SZB(VR4))  return 0+ GOF(VR4);
-   if (o >= GOF(VR5)  && o+sz <= GOF(VR5) +SZB(VR5))  return 0+ GOF(VR5);
-   if (o >= GOF(VR6)  && o+sz <= GOF(VR6) +SZB(VR6))  return 0+ GOF(VR6);
-   if (o >= GOF(VR7)  && o+sz <= GOF(VR7) +SZB(VR7))  return 0+ GOF(VR7);
-   if (o >= GOF(VR8)  && o+sz <= GOF(VR8) +SZB(VR8))  return 0+ GOF(VR8);
-   if (o >= GOF(VR9)  && o+sz <= GOF(VR9) +SZB(VR9))  return 0+ GOF(VR9);
-   if (o >= GOF(VR10) && o+sz <= GOF(VR10)+SZB(VR10)) return 0+ GOF(VR10);
-   if (o >= GOF(VR11) && o+sz <= GOF(VR11)+SZB(VR11)) return 0+ GOF(VR11);
-   if (o >= GOF(VR12) && o+sz <= GOF(VR12)+SZB(VR12)) return 0+ GOF(VR12);
-   if (o >= GOF(VR13) && o+sz <= GOF(VR13)+SZB(VR13)) return 0+ GOF(VR13);
-   if (o >= GOF(VR14) && o+sz <= GOF(VR14)+SZB(VR14)) return 0+ GOF(VR14);
-   if (o >= GOF(VR15) && o+sz <= GOF(VR15)+SZB(VR15)) return 0+ GOF(VR15);
-   if (o >= GOF(VR16) && o+sz <= GOF(VR16)+SZB(VR16)) return 0+ GOF(VR16);
-   if (o >= GOF(VR17) && o+sz <= GOF(VR17)+SZB(VR17)) return 0+ GOF(VR17);
-   if (o >= GOF(VR18) && o+sz <= GOF(VR18)+SZB(VR18)) return 0+ GOF(VR18);
-   if (o >= GOF(VR19) && o+sz <= GOF(VR19)+SZB(VR19)) return 0+ GOF(VR19);
-   if (o >= GOF(VR20) && o+sz <= GOF(VR20)+SZB(VR20)) return 0+ GOF(VR20);
-   if (o >= GOF(VR21) && o+sz <= GOF(VR21)+SZB(VR21)) return 0+ GOF(VR21);
-   if (o >= GOF(VR22) && o+sz <= GOF(VR22)+SZB(VR22)) return 0+ GOF(VR22);
-   if (o >= GOF(VR23) && o+sz <= GOF(VR23)+SZB(VR23)) return 0+ GOF(VR23);
-   if (o >= GOF(VR24) && o+sz <= GOF(VR24)+SZB(VR24)) return 0+ GOF(VR24);
-   if (o >= GOF(VR25) && o+sz <= GOF(VR25)+SZB(VR25)) return 0+ GOF(VR25);
-   if (o >= GOF(VR26) && o+sz <= GOF(VR26)+SZB(VR26)) return 0+ GOF(VR26);
-   if (o >= GOF(VR27) && o+sz <= GOF(VR27)+SZB(VR27)) return 0+ GOF(VR27);
-   if (o >= GOF(VR28) && o+sz <= GOF(VR28)+SZB(VR28)) return 0+ GOF(VR28);
-   if (o >= GOF(VR29) && o+sz <= GOF(VR29)+SZB(VR29)) return 0+ GOF(VR29);
-   if (o >= GOF(VR30) && o+sz <= GOF(VR30)+SZB(VR30)) return 0+ GOF(VR30);
-   if (o >= GOF(VR31) && o+sz <= GOF(VR31)+SZB(VR31)) return 0+ GOF(VR31);
+      in VSR0 .. VSR19. */
+   tl_assert(SZB(VSR0) == 16);
+   if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VSR0);
+   if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VSR1);
+   if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VSR2);
+   if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VSR3);
+
+   if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VSR4);
+   if (o == GOF(CR0_0)   && sz == 1) return 8 +GOF(VSR5);
+   if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VSR6);
+   if (o == GOF(CR1_0)   && sz == 1) return 8 +GOF(VSR7);
+   if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VSR8);
+   if (o == GOF(CR2_0)   && sz == 1) return 8 +GOF(VSR9);
+   if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VSR10);
+   if (o == GOF(CR3_0)   && sz == 1) return 8 +GOF(VSR11);
+   if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VSR12);
+   if (o == GOF(CR4_0)   && sz == 1) return 8 +GOF(VSR13);
+   if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VSR14);
+   if (o == GOF(CR5_0)   && sz == 1) return 8 +GOF(VSR15);
+   if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VSR16);
+   if (o == GOF(CR6_0)   && sz == 1) return 8 +GOF(VSR17);
+   if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VSR18);
+   if (o == GOF(CR7_0)   && sz == 1) return 8 +GOF(VSR19);
+
+   /* Vector registers .. use offset 0 in VSR0 .. VSR63. */
+   if (o >= GOF(VSR0)  && o+sz <= GOF(VSR0) +SZB(VSR0))  return 0+ GOF(VSR0);
+   if (o >= GOF(VSR1)  && o+sz <= GOF(VSR1) +SZB(VSR1))  return 0+ GOF(VSR1);
+   if (o >= GOF(VSR2)  && o+sz <= GOF(VSR2) +SZB(VSR2))  return 0+ GOF(VSR2);
+   if (o >= GOF(VSR3)  && o+sz <= GOF(VSR3) +SZB(VSR3))  return 0+ GOF(VSR3);
+   if (o >= GOF(VSR4)  && o+sz <= GOF(VSR4) +SZB(VSR4))  return 0+ GOF(VSR4);
+   if (o >= GOF(VSR5)  && o+sz <= GOF(VSR5) +SZB(VSR5))  return 0+ GOF(VSR5);
+   if (o >= GOF(VSR6)  && o+sz <= GOF(VSR6) +SZB(VSR6))  return 0+ GOF(VSR6);
+   if (o >= GOF(VSR7)  && o+sz <= GOF(VSR7) +SZB(VSR7))  return 0+ GOF(VSR7);
+   if (o >= GOF(VSR8)  && o+sz <= GOF(VSR8) +SZB(VSR8))  return 0+ GOF(VSR8);
+   if (o >= GOF(VSR9)  && o+sz <= GOF(VSR9) +SZB(VSR9))  return 0+ GOF(VSR9);
+   if (o >= GOF(VSR10) && o+sz <= GOF(VSR10)+SZB(VSR10)) return 0+ GOF(VSR10);
+   if (o >= GOF(VSR11) && o+sz <= GOF(VSR11)+SZB(VSR11)) return 0+ GOF(VSR11);
+   if (o >= GOF(VSR12) && o+sz <= GOF(VSR12)+SZB(VSR12)) return 0+ GOF(VSR12);
+   if (o >= GOF(VSR13) && o+sz <= GOF(VSR13)+SZB(VSR13)) return 0+ GOF(VSR13);
+   if (o >= GOF(VSR14) && o+sz <= GOF(VSR14)+SZB(VSR14)) return 0+ GOF(VSR14);
+   if (o >= GOF(VSR15) && o+sz <= GOF(VSR15)+SZB(VSR15)) return 0+ GOF(VSR15);
+   if (o >= GOF(VSR16) && o+sz <= GOF(VSR16)+SZB(VSR16)) return 0+ GOF(VSR16);
+   if (o >= GOF(VSR17) && o+sz <= GOF(VSR17)+SZB(VSR17)) return 0+ GOF(VSR17);
+   if (o >= GOF(VSR18) && o+sz <= GOF(VSR18)+SZB(VSR18)) return 0+ GOF(VSR18);
+   if (o >= GOF(VSR19) && o+sz <= GOF(VSR19)+SZB(VSR19)) return 0+ GOF(VSR19);
+   if (o >= GOF(VSR20) && o+sz <= GOF(VSR20)+SZB(VSR20)) return 0+ GOF(VSR20);
+   if (o >= GOF(VSR21) && o+sz <= GOF(VSR21)+SZB(VSR21)) return 0+ GOF(VSR21);
+   if (o >= GOF(VSR22) && o+sz <= GOF(VSR22)+SZB(VSR22)) return 0+ GOF(VSR22);
+   if (o >= GOF(VSR23) && o+sz <= GOF(VSR23)+SZB(VSR23)) return 0+ GOF(VSR23);
+   if (o >= GOF(VSR24) && o+sz <= GOF(VSR24)+SZB(VSR24)) return 0+ GOF(VSR24);
+   if (o >= GOF(VSR25) && o+sz <= GOF(VSR25)+SZB(VSR25)) return 0+ GOF(VSR25);
+   if (o >= GOF(VSR26) && o+sz <= GOF(VSR26)+SZB(VSR26)) return 0+ GOF(VSR26);
+   if (o >= GOF(VSR27) && o+sz <= GOF(VSR27)+SZB(VSR27)) return 0+ GOF(VSR27);
+   if (o >= GOF(VSR28) && o+sz <= GOF(VSR28)+SZB(VSR28)) return 0+ GOF(VSR28);
+   if (o >= GOF(VSR29) && o+sz <= GOF(VSR29)+SZB(VSR29)) return 0+ GOF(VSR29);
+   if (o >= GOF(VSR30) && o+sz <= GOF(VSR30)+SZB(VSR30)) return 0+ GOF(VSR30);
+   if (o >= GOF(VSR31) && o+sz <= GOF(VSR31)+SZB(VSR31)) return 0+ GOF(VSR31);
+   if (o >= GOF(VSR32) && o+sz <= GOF(VSR32)+SZB(VSR32)) return 0+ GOF(VSR32);
+   if (o >= GOF(VSR33) && o+sz <= GOF(VSR33)+SZB(VSR33)) return 0+ GOF(VSR33);
+   if (o >= GOF(VSR34) && o+sz <= GOF(VSR34)+SZB(VSR34)) return 0+ GOF(VSR34);
+   if (o >= GOF(VSR35) && o+sz <= GOF(VSR35)+SZB(VSR35)) return 0+ GOF(VSR35);
+   if (o >= GOF(VSR36) && o+sz <= GOF(VSR36)+SZB(VSR36)) return 0+ GOF(VSR36);
+   if (o >= GOF(VSR37) && o+sz <= GOF(VSR37)+SZB(VSR37)) return 0+ GOF(VSR37);
+   if (o >= GOF(VSR38) && o+sz <= GOF(VSR38)+SZB(VSR38)) return 0+ GOF(VSR38);
+   if (o >= GOF(VSR39) && o+sz <= GOF(VSR39)+SZB(VSR39)) return 0+ GOF(VSR39);
+   if (o >= GOF(VSR40) && o+sz <= GOF(VSR40)+SZB(VSR40)) return 0+ GOF(VSR40);
+   if (o >= GOF(VSR41) && o+sz <= GOF(VSR41)+SZB(VSR41)) return 0+ GOF(VSR41);
+   if (o >= GOF(VSR42) && o+sz <= GOF(VSR42)+SZB(VSR42)) return 0+ GOF(VSR42);
+   if (o >= GOF(VSR43) && o+sz <= GOF(VSR43)+SZB(VSR43)) return 0+ GOF(VSR43);
+   if (o >= GOF(VSR44) && o+sz <= GOF(VSR44)+SZB(VSR44)) return 0+ GOF(VSR44);
+   if (o >= GOF(VSR45) && o+sz <= GOF(VSR45)+SZB(VSR45)) return 0+ GOF(VSR45);
+   if (o >= GOF(VSR46) && o+sz <= GOF(VSR46)+SZB(VSR46)) return 0+ GOF(VSR46);
+   if (o >= GOF(VSR47) && o+sz <= GOF(VSR47)+SZB(VSR47)) return 0+ GOF(VSR47);
+   if (o >= GOF(VSR48) && o+sz <= GOF(VSR48)+SZB(VSR48)) return 0+ GOF(VSR48);
+   if (o >= GOF(VSR49) && o+sz <= GOF(VSR49)+SZB(VSR49)) return 0+ GOF(VSR49);
+   if (o >= GOF(VSR50) && o+sz <= GOF(VSR50)+SZB(VSR50)) return 0+ GOF(VSR50);
+   if (o >= GOF(VSR51) && o+sz <= GOF(VSR51)+SZB(VSR51)) return 0+ GOF(VSR51);
+   if (o >= GOF(VSR52) && o+sz <= GOF(VSR52)+SZB(VSR52)) return 0+ GOF(VSR52);
+   if (o >= GOF(VSR53) && o+sz <= GOF(VSR53)+SZB(VSR53)) return 0+ GOF(VSR53);
+   if (o >= GOF(VSR54) && o+sz <= GOF(VSR54)+SZB(VSR54)) return 0+ GOF(VSR54);
+   if (o >= GOF(VSR55) && o+sz <= GOF(VSR55)+SZB(VSR55)) return 0+ GOF(VSR55);
+   if (o >= GOF(VSR56) && o+sz <= GOF(VSR56)+SZB(VSR56)) return 0+ GOF(VSR56);
+   if (o >= GOF(VSR57) && o+sz <= GOF(VSR57)+SZB(VSR57)) return 0+ GOF(VSR57);
+   if (o >= GOF(VSR58) && o+sz <= GOF(VSR58)+SZB(VSR58)) return 0+ GOF(VSR58);
+   if (o >= GOF(VSR59) && o+sz <= GOF(VSR59)+SZB(VSR59)) return 0+ GOF(VSR59);
+   if (o >= GOF(VSR60) && o+sz <= GOF(VSR60)+SZB(VSR60)) return 0+ GOF(VSR60);
+   if (o >= GOF(VSR61) && o+sz <= GOF(VSR61)+SZB(VSR61)) return 0+ GOF(VSR61);
+   if (o >= GOF(VSR62) && o+sz <= GOF(VSR62)+SZB(VSR62)) return 0+ GOF(VSR62);
+   if (o >= GOF(VSR63) && o+sz <= GOF(VSR63)+SZB(VSR63)) return 0+ GOF(VSR63);
 
    VG_(printf)("MC_(get_otrack_shadow_offset)(ppc64)(off=%d,sz=%d)\n",
                offset,szB);
@@ -354,98 +400,139 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o == GOF(REDIR_SP)  && sz == 4) return -1;
    if (o == GOF(SPRG3_RO)  && sz == 4) return -1;
 
-   tl_assert(SZB(FPR0) == 8);
-   if (o == GOF(FPR0) && sz == 8) return o;
-   if (o == GOF(FPR1) && sz == 8) return o;
-   if (o == GOF(FPR2) && sz == 8) return o;
-   if (o == GOF(FPR3) && sz == 8) return o;
-   if (o == GOF(FPR4) && sz == 8) return o;
-   if (o == GOF(FPR5) && sz == 8) return o;
-   if (o == GOF(FPR6) && sz == 8) return o;
-   if (o == GOF(FPR7) && sz == 8) return o;
-   if (o == GOF(FPR8) && sz == 8) return o;
-   if (o == GOF(FPR9) && sz == 8) return o;
-   if (o == GOF(FPR10) && sz == 8) return o;
-   if (o == GOF(FPR11) && sz == 8) return o;
-   if (o == GOF(FPR12) && sz == 8) return o;
-   if (o == GOF(FPR13) && sz == 8) return o;
-   if (o == GOF(FPR14) && sz == 8) return o;
-   if (o == GOF(FPR15) && sz == 8) return o;
-   if (o == GOF(FPR16) && sz == 8) return o;
-   if (o == GOF(FPR17) && sz == 8) return o;
-   if (o == GOF(FPR18) && sz == 8) return o;
-   if (o == GOF(FPR19) && sz == 8) return o;
-   if (o == GOF(FPR20) && sz == 8) return o;
-   if (o == GOF(FPR21) && sz == 8) return o;
-   if (o == GOF(FPR22) && sz == 8) return o;
-   if (o == GOF(FPR23) && sz == 8) return o;
-   if (o == GOF(FPR24) && sz == 8) return o;
-   if (o == GOF(FPR25) && sz == 8) return o;
-   if (o == GOF(FPR26) && sz == 8) return o;
-   if (o == GOF(FPR27) && sz == 8) return o;
-   if (o == GOF(FPR28) && sz == 8) return o;
-   if (o == GOF(FPR29) && sz == 8) return o;
-   if (o == GOF(FPR30) && sz == 8) return o;
-   if (o == GOF(FPR31) && sz == 8) return o;
+   // With ISA 2.06, the "Vector-Scalar Floating-point" category
+   // provides facilities to support vector and scalar binary floating-
+   // point operations.  A unified register file is an integral part
+   // of this new facility, combining floating point and vector registers
+   // using a 64x128-bit vector.  These are referred to as VSR[0..63].
+   // The floating point registers are now mapped into double word element 0
+   // of VSR[0..31]. The 32x128-bit vector registers defined by the "Vector
+   // Facility [Category: Vector]" are now mapped to VSR[32..63].
+
+   //  Floating point registers . . .
+   if (o == GOF(VSR0) && sz == 8) return o;
+   if (o == GOF(VSR1) && sz == 8) return o;
+   if (o == GOF(VSR2) && sz == 8) return o;
+   if (o == GOF(VSR3) && sz == 8) return o;
+   if (o == GOF(VSR4) && sz == 8) return o;
+   if (o == GOF(VSR5) && sz == 8) return o;
+   if (o == GOF(VSR6) && sz == 8) return o;
+   if (o == GOF(VSR7) && sz == 8) return o;
+   if (o == GOF(VSR8) && sz == 8) return o;
+   if (o == GOF(VSR9) && sz == 8) return o;
+   if (o == GOF(VSR10) && sz == 8) return o;
+   if (o == GOF(VSR11) && sz == 8) return o;
+   if (o == GOF(VSR12) && sz == 8) return o;
+   if (o == GOF(VSR13) && sz == 8) return o;
+   if (o == GOF(VSR14) && sz == 8) return o;
+   if (o == GOF(VSR15) && sz == 8) return o;
+   if (o == GOF(VSR16) && sz == 8) return o;
+   if (o == GOF(VSR17) && sz == 8) return o;
+   if (o == GOF(VSR18) && sz == 8) return o;
+   if (o == GOF(VSR19) && sz == 8) return o;
+   if (o == GOF(VSR20) && sz == 8) return o;
+   if (o == GOF(VSR21) && sz == 8) return o;
+   if (o == GOF(VSR22) && sz == 8) return o;
+   if (o == GOF(VSR23) && sz == 8) return o;
+   if (o == GOF(VSR24) && sz == 8) return o;
+   if (o == GOF(VSR25) && sz == 8) return o;
+   if (o == GOF(VSR26) && sz == 8) return o;
+   if (o == GOF(VSR27) && sz == 8) return o;
+   if (o == GOF(VSR28) && sz == 8) return o;
+   if (o == GOF(VSR29) && sz == 8) return o;
+   if (o == GOF(VSR30) && sz == 8) return o;
+   if (o == GOF(VSR31) && sz == 8) return o;
 
    /* For the various byte sized XER/CR pieces, use offset 8
-      in VR0 .. VR31. */
-   tl_assert(SZB(VR0) == 16);
-   if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VR0);
-   if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VR1);
-   if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VR2);
-   if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VR3);
-
-   if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VR4);
-   if (o == GOF(CR0_0)   && sz == 1) return 8 +GOF(VR5);
-   if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VR6);
-   if (o == GOF(CR1_0)   && sz == 1) return 8 +GOF(VR7);
-   if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VR8);
-   if (o == GOF(CR2_0)   && sz == 1) return 8 +GOF(VR9);
-   if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VR10);
-   if (o == GOF(CR3_0)   && sz == 1) return 8 +GOF(VR11);
-   if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VR12);
-   if (o == GOF(CR4_0)   && sz == 1) return 8 +GOF(VR13);
-   if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VR14);
-   if (o == GOF(CR5_0)   && sz == 1) return 8 +GOF(VR15);
-   if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VR16);
-   if (o == GOF(CR6_0)   && sz == 1) return 8 +GOF(VR17);
-   if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VR18);
-   if (o == GOF(CR7_0)   && sz == 1) return 8 +GOF(VR19);
-
-   /* Vector registers .. use offset 0 in VR0 .. VR31. */
-   if (o >= GOF(VR0)  && o+sz <= GOF(VR0) +SZB(VR0))  return 0+ GOF(VR0);
-   if (o >= GOF(VR1)  && o+sz <= GOF(VR1) +SZB(VR1))  return 0+ GOF(VR1);
-   if (o >= GOF(VR2)  && o+sz <= GOF(VR2) +SZB(VR2))  return 0+ GOF(VR2);
-   if (o >= GOF(VR3)  && o+sz <= GOF(VR3) +SZB(VR3))  return 0+ GOF(VR3);
-   if (o >= GOF(VR4)  && o+sz <= GOF(VR4) +SZB(VR4))  return 0+ GOF(VR4);
-   if (o >= GOF(VR5)  && o+sz <= GOF(VR5) +SZB(VR5))  return 0+ GOF(VR5);
-   if (o >= GOF(VR6)  && o+sz <= GOF(VR6) +SZB(VR6))  return 0+ GOF(VR6);
-   if (o >= GOF(VR7)  && o+sz <= GOF(VR7) +SZB(VR7))  return 0+ GOF(VR7);
-   if (o >= GOF(VR8)  && o+sz <= GOF(VR8) +SZB(VR8))  return 0+ GOF(VR8);
-   if (o >= GOF(VR9)  && o+sz <= GOF(VR9) +SZB(VR9))  return 0+ GOF(VR9);
-   if (o >= GOF(VR10) && o+sz <= GOF(VR10)+SZB(VR10)) return 0+ GOF(VR10);
-   if (o >= GOF(VR11) && o+sz <= GOF(VR11)+SZB(VR11)) return 0+ GOF(VR11);
-   if (o >= GOF(VR12) && o+sz <= GOF(VR12)+SZB(VR12)) return 0+ GOF(VR12);
-   if (o >= GOF(VR13) && o+sz <= GOF(VR13)+SZB(VR13)) return 0+ GOF(VR13);
-   if (o >= GOF(VR14) && o+sz <= GOF(VR14)+SZB(VR14)) return 0+ GOF(VR14);
-   if (o >= GOF(VR15) && o+sz <= GOF(VR15)+SZB(VR15)) return 0+ GOF(VR15);
-   if (o >= GOF(VR16) && o+sz <= GOF(VR16)+SZB(VR16)) return 0+ GOF(VR16);
-   if (o >= GOF(VR17) && o+sz <= GOF(VR17)+SZB(VR17)) return 0+ GOF(VR17);
-   if (o >= GOF(VR18) && o+sz <= GOF(VR18)+SZB(VR18)) return 0+ GOF(VR18);
-   if (o >= GOF(VR19) && o+sz <= GOF(VR19)+SZB(VR19)) return 0+ GOF(VR19);
-   if (o >= GOF(VR20) && o+sz <= GOF(VR20)+SZB(VR20)) return 0+ GOF(VR20);
-   if (o >= GOF(VR21) && o+sz <= GOF(VR21)+SZB(VR21)) return 0+ GOF(VR21);
-   if (o >= GOF(VR22) && o+sz <= GOF(VR22)+SZB(VR22)) return 0+ GOF(VR22);
-   if (o >= GOF(VR23) && o+sz <= GOF(VR23)+SZB(VR23)) return 0+ GOF(VR23);
-   if (o >= GOF(VR24) && o+sz <= GOF(VR24)+SZB(VR24)) return 0+ GOF(VR24);
-   if (o >= GOF(VR25) && o+sz <= GOF(VR25)+SZB(VR25)) return 0+ GOF(VR25);
-   if (o >= GOF(VR26) && o+sz <= GOF(VR26)+SZB(VR26)) return 0+ GOF(VR26);
-   if (o >= GOF(VR27) && o+sz <= GOF(VR27)+SZB(VR27)) return 0+ GOF(VR27);
-   if (o >= GOF(VR28) && o+sz <= GOF(VR28)+SZB(VR28)) return 0+ GOF(VR28);
-   if (o >= GOF(VR29) && o+sz <= GOF(VR29)+SZB(VR29)) return 0+ GOF(VR29);
-   if (o >= GOF(VR30) && o+sz <= GOF(VR30)+SZB(VR30)) return 0+ GOF(VR30);
-   if (o >= GOF(VR31) && o+sz <= GOF(VR31)+SZB(VR31)) return 0+ GOF(VR31);
+      in VSR0 .. VSR19. */
+   tl_assert(SZB(VSR0) == 16);
+   if (o == GOF(XER_SO) && sz == 1) return 8 +GOF(VSR0);
+   if (o == GOF(XER_OV) && sz == 1) return 8 +GOF(VSR1);
+   if (o == GOF(XER_CA) && sz == 1) return 8 +GOF(VSR2);
+   if (o == GOF(XER_BC) && sz == 1) return 8 +GOF(VSR3);
+
+   if (o == GOF(CR0_321) && sz == 1) return 8 +GOF(VSR4);
+   if (o == GOF(CR0_0)   && sz == 1) return 8 +GOF(VSR5);
+   if (o == GOF(CR1_321) && sz == 1) return 8 +GOF(VSR6);
+   if (o == GOF(CR1_0)   && sz == 1) return 8 +GOF(VSR7);
+   if (o == GOF(CR2_321) && sz == 1) return 8 +GOF(VSR8);
+   if (o == GOF(CR2_0)   && sz == 1) return 8 +GOF(VSR9);
+   if (o == GOF(CR3_321) && sz == 1) return 8 +GOF(VSR10);
+   if (o == GOF(CR3_0)   && sz == 1) return 8 +GOF(VSR11);
+   if (o == GOF(CR4_321) && sz == 1) return 8 +GOF(VSR12);
+   if (o == GOF(CR4_0)   && sz == 1) return 8 +GOF(VSR13);
+   if (o == GOF(CR5_321) && sz == 1) return 8 +GOF(VSR14);
+   if (o == GOF(CR5_0)   && sz == 1) return 8 +GOF(VSR15);
+   if (o == GOF(CR6_321) && sz == 1) return 8 +GOF(VSR16);
+   if (o == GOF(CR6_0)   && sz == 1) return 8 +GOF(VSR17);
+   if (o == GOF(CR7_321) && sz == 1) return 8 +GOF(VSR18);
+   if (o == GOF(CR7_0)   && sz == 1) return 8 +GOF(VSR19);
+
+   /* Vector registers .. use offset 0 in VSR0 .. VSR63. */
+   if (o >= GOF(VSR0)  && o+sz <= GOF(VSR0) +SZB(VSR0))  return 0+ GOF(VSR0);
+   if (o >= GOF(VSR1)  && o+sz <= GOF(VSR1) +SZB(VSR1))  return 0+ GOF(VSR1);
+   if (o >= GOF(VSR2)  && o+sz <= GOF(VSR2) +SZB(VSR2))  return 0+ GOF(VSR2);
+   if (o >= GOF(VSR3)  && o+sz <= GOF(VSR3) +SZB(VSR3))  return 0+ GOF(VSR3);
+   if (o >= GOF(VSR4)  && o+sz <= GOF(VSR4) +SZB(VSR4))  return 0+ GOF(VSR4);
+   if (o >= GOF(VSR5)  && o+sz <= GOF(VSR5) +SZB(VSR5))  return 0+ GOF(VSR5);
+   if (o >= GOF(VSR6)  && o+sz <= GOF(VSR6) +SZB(VSR6))  return 0+ GOF(VSR6);
+   if (o >= GOF(VSR7)  && o+sz <= GOF(VSR7) +SZB(VSR7))  return 0+ GOF(VSR7);
+   if (o >= GOF(VSR8)  && o+sz <= GOF(VSR8) +SZB(VSR8))  return 0+ GOF(VSR8);
+   if (o >= GOF(VSR9)  && o+sz <= GOF(VSR9) +SZB(VSR9))  return 0+ GOF(VSR9);
+   if (o >= GOF(VSR10) && o+sz <= GOF(VSR10)+SZB(VSR10)) return 0+ GOF(VSR10);
+   if (o >= GOF(VSR11) && o+sz <= GOF(VSR11)+SZB(VSR11)) return 0+ GOF(VSR11);
+   if (o >= GOF(VSR12) && o+sz <= GOF(VSR12)+SZB(VSR12)) return 0+ GOF(VSR12);
+   if (o >= GOF(VSR13) && o+sz <= GOF(VSR13)+SZB(VSR13)) return 0+ GOF(VSR13);
+   if (o >= GOF(VSR14) && o+sz <= GOF(VSR14)+SZB(VSR14)) return 0+ GOF(VSR14);
+   if (o >= GOF(VSR15) && o+sz <= GOF(VSR15)+SZB(VSR15)) return 0+ GOF(VSR15);
+   if (o >= GOF(VSR16) && o+sz <= GOF(VSR16)+SZB(VSR16)) return 0+ GOF(VSR16);
+   if (o >= GOF(VSR17) && o+sz <= GOF(VSR17)+SZB(VSR17)) return 0+ GOF(VSR17);
+   if (o >= GOF(VSR18) && o+sz <= GOF(VSR18)+SZB(VSR18)) return 0+ GOF(VSR18);
+   if (o >= GOF(VSR19) && o+sz <= GOF(VSR19)+SZB(VSR19)) return 0+ GOF(VSR19);
+   if (o >= GOF(VSR20) && o+sz <= GOF(VSR20)+SZB(VSR20)) return 0+ GOF(VSR20);
+   if (o >= GOF(VSR21) && o+sz <= GOF(VSR21)+SZB(VSR21)) return 0+ GOF(VSR21);
+   if (o >= GOF(VSR22) && o+sz <= GOF(VSR22)+SZB(VSR22)) return 0+ GOF(VSR22);
+   if (o >= GOF(VSR23) && o+sz <= GOF(VSR23)+SZB(VSR23)) return 0+ GOF(VSR23);
+   if (o >= GOF(VSR24) && o+sz <= GOF(VSR24)+SZB(VSR24)) return 0+ GOF(VSR24);
+   if (o >= GOF(VSR25) && o+sz <= GOF(VSR25)+SZB(VSR25)) return 0+ GOF(VSR25);
+   if (o >= GOF(VSR26) && o+sz <= GOF(VSR26)+SZB(VSR26)) return 0+ GOF(VSR26);
+   if (o >= GOF(VSR27) && o+sz <= GOF(VSR27)+SZB(VSR27)) return 0+ GOF(VSR27);
+   if (o >= GOF(VSR28) && o+sz <= GOF(VSR28)+SZB(VSR28)) return 0+ GOF(VSR28);
+   if (o >= GOF(VSR29) && o+sz <= GOF(VSR29)+SZB(VSR29)) return 0+ GOF(VSR29);
+   if (o >= GOF(VSR30) && o+sz <= GOF(VSR30)+SZB(VSR30)) return 0+ GOF(VSR30);
+   if (o >= GOF(VSR31) && o+sz <= GOF(VSR31)+SZB(VSR31)) return 0+ GOF(VSR31);
+   if (o >= GOF(VSR32) && o+sz <= GOF(VSR32)+SZB(VSR32)) return 0+ GOF(VSR32);
+   if (o >= GOF(VSR33) && o+sz <= GOF(VSR33)+SZB(VSR33)) return 0+ GOF(VSR33);
+   if (o >= GOF(VSR34) && o+sz <= GOF(VSR34)+SZB(VSR34)) return 0+ GOF(VSR34);
+   if (o >= GOF(VSR35) && o+sz <= GOF(VSR35)+SZB(VSR35)) return 0+ GOF(VSR35);
+   if (o >= GOF(VSR36) && o+sz <= GOF(VSR36)+SZB(VSR36)) return 0+ GOF(VSR36);
+   if (o >= GOF(VSR37) && o+sz <= GOF(VSR37)+SZB(VSR37)) return 0+ GOF(VSR37);
+   if (o >= GOF(VSR38) && o+sz <= GOF(VSR38)+SZB(VSR38)) return 0+ GOF(VSR38);
+   if (o >= GOF(VSR39) && o+sz <= GOF(VSR39)+SZB(VSR39)) return 0+ GOF(VSR39);
+   if (o >= GOF(VSR40) && o+sz <= GOF(VSR40)+SZB(VSR40)) return 0+ GOF(VSR40);
+   if (o >= GOF(VSR41) && o+sz <= GOF(VSR41)+SZB(VSR41)) return 0+ GOF(VSR41);
+   if (o >= GOF(VSR42) && o+sz <= GOF(VSR42)+SZB(VSR42)) return 0+ GOF(VSR42);
+   if (o >= GOF(VSR43) && o+sz <= GOF(VSR43)+SZB(VSR43)) return 0+ GOF(VSR43);
+   if (o >= GOF(VSR44) && o+sz <= GOF(VSR44)+SZB(VSR44)) return 0+ GOF(VSR44);
+   if (o >= GOF(VSR45) && o+sz <= GOF(VSR45)+SZB(VSR45)) return 0+ GOF(VSR45);
+   if (o >= GOF(VSR46) && o+sz <= GOF(VSR46)+SZB(VSR46)) return 0+ GOF(VSR46);
+   if (o >= GOF(VSR47) && o+sz <= GOF(VSR47)+SZB(VSR47)) return 0+ GOF(VSR47);
+   if (o >= GOF(VSR48) && o+sz <= GOF(VSR48)+SZB(VSR48)) return 0+ GOF(VSR48);
+   if (o >= GOF(VSR49) && o+sz <= GOF(VSR49)+SZB(VSR49)) return 0+ GOF(VSR49);
+   if (o >= GOF(VSR50) && o+sz <= GOF(VSR50)+SZB(VSR50)) return 0+ GOF(VSR50);
+   if (o >= GOF(VSR51) && o+sz <= GOF(VSR51)+SZB(VSR51)) return 0+ GOF(VSR51);
+   if (o >= GOF(VSR52) && o+sz <= GOF(VSR52)+SZB(VSR52)) return 0+ GOF(VSR52);
+   if (o >= GOF(VSR53) && o+sz <= GOF(VSR53)+SZB(VSR53)) return 0+ GOF(VSR53);
+   if (o >= GOF(VSR54) && o+sz <= GOF(VSR54)+SZB(VSR54)) return 0+ GOF(VSR54);
+   if (o >= GOF(VSR55) && o+sz <= GOF(VSR55)+SZB(VSR55)) return 0+ GOF(VSR55);
+   if (o >= GOF(VSR56) && o+sz <= GOF(VSR56)+SZB(VSR56)) return 0+ GOF(VSR56);
+   if (o >= GOF(VSR57) && o+sz <= GOF(VSR57)+SZB(VSR57)) return 0+ GOF(VSR57);
+   if (o >= GOF(VSR58) && o+sz <= GOF(VSR58)+SZB(VSR58)) return 0+ GOF(VSR58);
+   if (o >= GOF(VSR59) && o+sz <= GOF(VSR59)+SZB(VSR59)) return 0+ GOF(VSR59);
+   if (o >= GOF(VSR60) && o+sz <= GOF(VSR60)+SZB(VSR60)) return 0+ GOF(VSR60);
+   if (o >= GOF(VSR61) && o+sz <= GOF(VSR61)+SZB(VSR61)) return 0+ GOF(VSR61);
+   if (o >= GOF(VSR62) && o+sz <= GOF(VSR62)+SZB(VSR62)) return 0+ GOF(VSR62);
+   if (o >= GOF(VSR63) && o+sz <= GOF(VSR63)+SZB(VSR63)) return 0+ GOF(VSR63);
 
    VG_(printf)("MC_(get_otrack_shadow_offset)(ppc32)(off=%d,sz=%d)\n",
                offset,szB);
@@ -493,6 +580,7 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o == GOF(RIP)     && sz == 8) return -1; /* slot unused */
    if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
    if (o == GOF(IDFLAG)  && sz == 8) return -1; /* slot used for %DH */
+   if (o == GOF(ACFLAG)  && sz == 8) return -1; /* slot unused */
    if (o == GOF(FS_ZERO) && sz == 8) return -1; /* slot unused */
    if (o == GOF(GS_0x60) && sz == 8) return -1; /* slot unused */
    if (o == GOF(TISTART) && sz == 8) return -1; /* slot unused */
@@ -609,6 +697,7 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o == GOF(ACFLAG)  && sz == 4) return -1; /* slot unused */
    if (o == GOF(TISTART) && sz == 4) return -1; /* slot unused */
    if (o == GOF(TILEN)   && sz == 4) return -1; /* slot unused */
+   if (o == GOF(NRADDR)  && sz == 4) return -1; /* slot unused */
 
    /* Treat %AH, %BH, %CH, %DH as independent registers.  To do this
       requires finding 4 unused 32-bit slots in the second-shadow
@@ -680,6 +769,54 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
 #  undef GOF
 #  undef SZB
 
+   /* -------------------- s390x -------------------- */
+
+#  elif defined(VGA_s390x)
+#  define GOF(_fieldname) \
+      (offsetof(VexGuestS390XState,guest_##_fieldname))
+   Int  o      = offset;
+   Int  sz     = szB;
+   tl_assert(sz > 0);
+   tl_assert(host_is_big_endian());
+
+   /* no matter what byte(s) we change, we have changed the full 8 byte value
+      and need to track this change for the whole register */
+   if (o >= GOF(r0) && sz <= 8 && o <= (GOF(r15) + 8 - sz))
+      return GOF(r0) + ((o-GOF(r0)) & -8) ;
+
+
+   /* fprs are accessed 4 or 8 byte at once. Again, we track that change for
+      the full register */
+   if ((sz == 8 || sz == 4) && o >= GOF(f0) && o <= GOF(f15)+8-sz)
+      return GOF(f0) + ((o-GOF(f0)) & -8) ;
+
+   /* access registers are accessed 4 bytes at once */
+   if (sz == 4 && o >= GOF(a0) && o <= GOF(a15))
+         return o;
+
+   /* we access the guest counter either fully or one of the 4byte words */
+   if (o == GOF(counter) && (sz == 8 || sz ==4))
+      return o;
+   if (o == GOF(counter) + 4 && sz == 4)
+      return o;
+
+   if (o == GOF(CC_OP)) return -1;
+   if (o == GOF(CC_DEP1)) return o;
+   if (o == GOF(CC_DEP2)) return o;
+   if (o == GOF(CC_NDEP)) return -1;
+   if (o == GOF(TISTART)) return -1;
+   if (o == GOF(TILEN)) return -1;
+   if (o == GOF(NRADDR)) return -1;
+   if (o == GOF(IP_AT_SYSCALL)) return -1;
+   if (o == GOF(fpc)) return -1;
+   if (o == GOF(IA)) return -1;
+   if (o == GOF(SYSNO)) return -1;
+   VG_(printf)("MC_(get_otrack_shadow_offset)(s390x)(off=%d,sz=%d)\n",
+               offset,szB);
+   tl_assert(0);
+#  undef GOF
+
+
    /* --------------------- arm --------------------- */
 
 #  elif defined(VGA_arm)
@@ -721,6 +858,11 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
 
    if (o == GOF(QFLAG32) && sz == 4) return o;
 
+   if (o == GOF(GEFLAG0) && sz == 4) return o;
+   if (o == GOF(GEFLAG1) && sz == 4) return o;
+   if (o == GOF(GEFLAG2) && sz == 4) return o;
+   if (o == GOF(GEFLAG3) && sz == 4) return o;
+
    //if (o == GOF(SYSCALLNO)     && sz == 4) return -1; /* slot unused */
    //if (o == GOF(CC)     && sz == 4) return -1; /* slot unused */
    //if (o == GOF(EMWARN)     && sz == 4) return -1; /* slot unused */
@@ -731,22 +873,61 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o == GOF(TPIDRURO) && sz == 4) return -1;
    if (o == GOF(ITSTATE)  && sz == 4) return -1;
 
-   if (o >= GOF(D0)  && o+sz <= GOF(D0) +SZB(D0))  return GOF(D0);
-   if (o >= GOF(D1)  && o+sz <= GOF(D1) +SZB(D1))  return GOF(D1);
-   if (o >= GOF(D2)  && o+sz <= GOF(D2) +SZB(D2))  return GOF(D2);
-   if (o >= GOF(D3)  && o+sz <= GOF(D3) +SZB(D3))  return GOF(D3);
-   if (o >= GOF(D4)  && o+sz <= GOF(D4) +SZB(D4))  return GOF(D4);
-   if (o >= GOF(D5)  && o+sz <= GOF(D5) +SZB(D5))  return GOF(D5);
-   if (o >= GOF(D6)  && o+sz <= GOF(D6) +SZB(D6))  return GOF(D6);
-   if (o >= GOF(D7)  && o+sz <= GOF(D7) +SZB(D7))  return GOF(D7);
-   if (o >= GOF(D8)  && o+sz <= GOF(D8) +SZB(D8))  return GOF(D8);
-   if (o >= GOF(D9)  && o+sz <= GOF(D9) +SZB(D9))  return GOF(D9);
-   if (o >= GOF(D10) && o+sz <= GOF(D10)+SZB(D10)) return GOF(D10);
-   if (o >= GOF(D11) && o+sz <= GOF(D11)+SZB(D11)) return GOF(D11);
-   if (o >= GOF(D12) && o+sz <= GOF(D12)+SZB(D12)) return GOF(D12);
-   if (o >= GOF(D13) && o+sz <= GOF(D13)+SZB(D13)) return GOF(D13);
-   if (o >= GOF(D14) && o+sz <= GOF(D14)+SZB(D14)) return GOF(D14);
-   if (o >= GOF(D15) && o+sz <= GOF(D15)+SZB(D15)) return GOF(D15);
+   /* Accesses to F or D registers */
+   if (sz == 4 || sz == 8) {
+      if (o >= GOF(D0)  && o+sz <= GOF(D0) +SZB(D0))  return GOF(D0);
+      if (o >= GOF(D1)  && o+sz <= GOF(D1) +SZB(D1))  return GOF(D1);
+      if (o >= GOF(D2)  && o+sz <= GOF(D2) +SZB(D2))  return GOF(D2);
+      if (o >= GOF(D3)  && o+sz <= GOF(D3) +SZB(D3))  return GOF(D3);
+      if (o >= GOF(D4)  && o+sz <= GOF(D4) +SZB(D4))  return GOF(D4);
+      if (o >= GOF(D5)  && o+sz <= GOF(D5) +SZB(D5))  return GOF(D5);
+      if (o >= GOF(D6)  && o+sz <= GOF(D6) +SZB(D6))  return GOF(D6);
+      if (o >= GOF(D7)  && o+sz <= GOF(D7) +SZB(D7))  return GOF(D7);
+      if (o >= GOF(D8)  && o+sz <= GOF(D8) +SZB(D8))  return GOF(D8);
+      if (o >= GOF(D9)  && o+sz <= GOF(D9) +SZB(D9))  return GOF(D9);
+      if (o >= GOF(D10) && o+sz <= GOF(D10)+SZB(D10)) return GOF(D10);
+      if (o >= GOF(D11) && o+sz <= GOF(D11)+SZB(D11)) return GOF(D11);
+      if (o >= GOF(D12) && o+sz <= GOF(D12)+SZB(D12)) return GOF(D12);
+      if (o >= GOF(D13) && o+sz <= GOF(D13)+SZB(D13)) return GOF(D13);
+      if (o >= GOF(D14) && o+sz <= GOF(D14)+SZB(D14)) return GOF(D14);
+      if (o >= GOF(D15) && o+sz <= GOF(D15)+SZB(D15)) return GOF(D15);
+      if (o >= GOF(D16) && o+sz <= GOF(D16)+SZB(D16)) return GOF(D16);
+      if (o >= GOF(D17) && o+sz <= GOF(D17)+SZB(D17)) return GOF(D17);
+      if (o >= GOF(D18) && o+sz <= GOF(D18)+SZB(D18)) return GOF(D18);
+      if (o >= GOF(D19) && o+sz <= GOF(D19)+SZB(D19)) return GOF(D19);
+      if (o >= GOF(D20) && o+sz <= GOF(D20)+SZB(D20)) return GOF(D20);
+      if (o >= GOF(D21) && o+sz <= GOF(D21)+SZB(D21)) return GOF(D21);
+      if (o >= GOF(D22) && o+sz <= GOF(D22)+SZB(D22)) return GOF(D22);
+      if (o >= GOF(D23) && o+sz <= GOF(D23)+SZB(D23)) return GOF(D23);
+      if (o >= GOF(D24) && o+sz <= GOF(D24)+SZB(D24)) return GOF(D24);
+      if (o >= GOF(D25) && o+sz <= GOF(D25)+SZB(D25)) return GOF(D25);
+      if (o >= GOF(D26) && o+sz <= GOF(D26)+SZB(D26)) return GOF(D26);
+      if (o >= GOF(D27) && o+sz <= GOF(D27)+SZB(D27)) return GOF(D27);
+      if (o >= GOF(D28) && o+sz <= GOF(D28)+SZB(D28)) return GOF(D28);
+      if (o >= GOF(D29) && o+sz <= GOF(D29)+SZB(D29)) return GOF(D29);
+      if (o >= GOF(D30) && o+sz <= GOF(D30)+SZB(D30)) return GOF(D30);
+      if (o >= GOF(D31) && o+sz <= GOF(D31)+SZB(D31)) return GOF(D31);
+   }
+
+   /* Accesses to Q registers */
+   if (sz == 16) {
+      if (o >= GOF(D0)  && o+sz <= GOF(D0) +2*SZB(D0))  return GOF(D0);  // Q0
+      if (o >= GOF(D2)  && o+sz <= GOF(D2) +2*SZB(D2))  return GOF(D2);  // Q1
+      if (o >= GOF(D4)  && o+sz <= GOF(D4) +2*SZB(D4))  return GOF(D4);  // Q2
+      if (o >= GOF(D6)  && o+sz <= GOF(D6) +2*SZB(D6))  return GOF(D6);  // Q3
+      if (o >= GOF(D8)  && o+sz <= GOF(D8) +2*SZB(D8))  return GOF(D8);  // Q4
+      if (o >= GOF(D10) && o+sz <= GOF(D10)+2*SZB(D10)) return GOF(D10); // Q5
+      if (o >= GOF(D12) && o+sz <= GOF(D12)+2*SZB(D12)) return GOF(D12); // Q6
+      if (o >= GOF(D14) && o+sz <= GOF(D14)+2*SZB(D14)) return GOF(D14); // Q7
+      if (o >= GOF(D16) && o+sz <= GOF(D16)+2*SZB(D16)) return GOF(D16); // Q8
+      if (o >= GOF(D18) && o+sz <= GOF(D18)+2*SZB(D18)) return GOF(D18); // Q9
+      if (o >= GOF(D20) && o+sz <= GOF(D20)+2*SZB(D20)) return GOF(D20); // Q10
+      if (o >= GOF(D22) && o+sz <= GOF(D22)+2*SZB(D22)) return GOF(D22); // Q11
+      if (o >= GOF(D24) && o+sz <= GOF(D24)+2*SZB(D24)) return GOF(D24); // Q12
+      if (o >= GOF(D26) && o+sz <= GOF(D26)+2*SZB(D26)) return GOF(D26); // Q13
+      if (o >= GOF(D28) && o+sz <= GOF(D28)+2*SZB(D28)) return GOF(D28); // Q14
+      if (o >= GOF(D30) && o+sz <= GOF(D30)+2*SZB(D30)) return GOF(D30); // Q15
+   }
 
    VG_(printf)("MC_(get_otrack_shadow_offset)(arm)(off=%d,sz=%d)\n",
                offset,szB);
@@ -843,6 +1024,11 @@ IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr )
    VG_(printf)("\n");
    tl_assert(0);
 
+   /* --------------------- s390x --------------------- */
+#  elif defined(VGA_s390x)
+   /* Should never het here because s390x does not use Ist_PutI
+      and Iex_GetI. */
+   tl_assert(0);
 #  else
 #    error "FIXME: not implemented for this architecture"
 #  endif