Index: coregrind/vg_to_ucode.c
===================================================================
RCS file: /cvsroot/valgrind/valgrind/coregrind/vg_to_ucode.c,v
retrieving revision 1.98
diff -u -r1.98 vg_to_ucode.c
--- coregrind/vg_to_ucode.c	13 Oct 2003 07:30:40 -0000	1.98
+++ coregrind/vg_to_ucode.c	15 Oct 2003 13:51:50 -0000
@@ -6457,6 +6457,50 @@
          eip = dis_MMXop_regmem_to_reg ( cb, sorb, eip, opc, "psra", True );
          break;
 
+      case 0xA1: /* POP %FS */
+      case 0xA9: /* POP %GS */
+         {
+            Int sreg = INVALID_TEMPREG;
+            vg_assert(sz == 4);
+            switch(opc) {
+            case 0xA1: sreg = R_FS; break;
+            case 0xA9: sreg = R_GS; break;
+            }
+
+            t1 = newTemp(cb); t2 = newTemp(cb);
+            uInstr2(cb, GET,    4, ArchReg, R_ESP,    TempReg,  t2);
+            uInstr2(cb, LOAD,   2, TempReg, t2,       TempReg,  t1);
+            uInstr2(cb, ADD,    4, Literal, 0,        TempReg,  t2);
+            uLiteral(cb, sz);
+            uInstr2(cb, PUT,    4, TempReg, t2,       ArchReg,  R_ESP);
+            uInstr2(cb, PUTSEG, 2, TempReg, t1,       ArchRegS, sreg);
+            if (dis)
+               VG_(printf)("pop %s\n", VG_(name_of_seg_reg)(sreg));
+            break;
+         }
+
+      case 0xA0: /* PUSH %FS */
+      case 0xA8: /* PUSH %GS */
+         {
+            Int sreg = INVALID_TEMPREG;
+            vg_assert(sz == 4);
+            switch(opc) {
+            case 0xA0: sreg = R_FS; break;
+            case 0xA8: sreg = R_GS; break;
+            }
+
+            t1 = newTemp(cb); t2 = newTemp(cb);
+            uInstr2(cb, GETSEG, 2, ArchRegS, sreg,  TempReg, t1);
+            uInstr2(cb, GET,    4, ArchReg,  R_ESP, TempReg, t2);
+            uInstr2(cb, SUB,    4, Literal,  0,     TempReg, t2);
+            uLiteral(cb, 4);
+            uInstr2(cb, PUT,    4, TempReg,  t2,    ArchReg, R_ESP);
+            uInstr2(cb, STORE,  2, TempReg,  t1,    TempReg, t2);
+            if (dis)
+               VG_(printf)("push %s\n", VG_(name_of_seg_reg)(sreg));
+            break;
+         }
+
       /* =-=-=-=-=-=-=-=-=- unimp2 =-=-=-=-=-=-=-=-=-=-= */
 
       default:
