]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge from trunk, r2532 (AMD64: Fix PCMPxSTRx variant $0x46, #306664)
authorJulian Seward <jseward@acm.org>
Mon, 17 Sep 2012 18:00:06 +0000 (18:00 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 17 Sep 2012 18:00:06 +0000 (18:00 +0000)
git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_8_BRANCH@2536

VEX/priv/guest_amd64_toIR.c
VEX/priv/guest_generic_x87.c

index 39a6ae579072a980c98eff0a95ff5de98db02034..b690e5e6fa7c872a0fa0eb60c88d5f05010262bb 100644 (file)
@@ -16919,6 +16919,7 @@ static Long dis_PCMPxSTRx ( VexAbiInfo* vbi, Prefix pfx,
       case 0x00:
       case 0x02: case 0x08: case 0x0A: case 0x0C: case 0x12:
       case 0x1A: case 0x38: case 0x3A: case 0x44: case 0x4A:
+      case 0x46:
          break;
       case 0x01: // the 16-bit character versions of the above
       case 0x03: case 0x09: case 0x0B: case 0x0D: case 0x13:
index 0e9741447b10d1d2f4ce4e90696cd40652aad818..b4ed0345ef2b037b2797a3441af95d177ffd4733 100644 (file)
@@ -798,6 +798,7 @@ Bool compute_PCMPxSTRx ( /*OUT*/V128* resV,
       case 0x00:
       case 0x02: case 0x08: case 0x0A: case 0x0C: case 0x12:
       case 0x1A: case 0x38: case 0x3A: case 0x44: case 0x4A:
+      case 0x46:
          break;
       default:
          return False;
@@ -960,6 +961,46 @@ Bool compute_PCMPxSTRx ( /*OUT*/V128* resV,
       return True;
    }
 
+   /*----------------------------------------*/
+   /*-- ranges, signed byte data           --*/
+   /*----------------------------------------*/
+
+   if (agg == 1/*ranges*/
+       && fmt == 2/*sb*/) {
+
+      /* argL: string,  argR: range-pairs */
+      UInt   ri, si;
+      Char*  argL    = (Char*)argLV;
+      Char*  argR    = (Char*)argRV;
+      UInt   boolRes = 0;
+      UInt   validL  = ~(zmaskL | -zmaskL);  // not(left(zmaskL))
+      UInt   validR  = ~(zmaskR | -zmaskR);  // not(left(zmaskR))
+      for (si = 0; si < 16; si++) {
+         if ((validL & (1 << si)) == 0)
+            // run off the end of the string
+            break;
+         UInt m = 0;
+         for (ri = 0; ri < 16; ri += 2) {
+            if ((validR & (3 << ri)) != (3 << ri)) break;
+            if (argR[ri] <= argL[si] && argL[si] <= argR[ri+1]) { 
+               m = 1; break;
+            }
+         }
+         boolRes |= (m << si);
+      }
+
+      // boolRes is "pre-invalidated"
+      UInt intRes1 = boolRes & 0xFFFF;
+
+      // generate I-format output
+      compute_PCMPxSTRx_gen_output(
+         resV, resOSZACP,
+         intRes1, zmaskL, zmaskR, validL, pol, idx, isxSTRM
+      );
+
+      return True;
+   }
+
    return False;
 }