From: Julian Seward Date: Mon, 17 Sep 2012 13:43:57 +0000 (+0000) Subject: Add test cases for PCMPxSTRx variant $0x46. See #306664. X-Git-Tag: svn/VALGRIND_3_9_0~679 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d362026f49ca7546193093fb40d7aef8a10238ac;p=thirdparty%2Fvalgrind.git Add test cases for PCMPxSTRx variant $0x46. See #306664. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12979 --- diff --git a/none/tests/amd64/pcmpstr64.c b/none/tests/amd64/pcmpstr64.c index b3a07b515d..9e53202160 100644 --- a/none/tests/amd64/pcmpstr64.c +++ b/none/tests/amd64/pcmpstr64.c @@ -10,6 +10,7 @@ typedef unsigned int UInt; typedef signed int Int; typedef unsigned char UChar; +typedef signed char Char; typedef unsigned long long int ULong; typedef UChar Bool; #define False ((Bool)0) @@ -204,7 +205,7 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV, switch (imm8) { case 0x00: case 0x02: case 0x08: case 0x0C: case 0x12: case 0x1A: - case 0x38: case 0x3A: case 0x44: case 0x4A: + case 0x38: case 0x3A: case 0x44: case 0x46: case 0x4A: break; default: return False; @@ -371,6 +372,47 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV, return True; } + /*----------------------------------------*/ + /*-- ranges, signed byte data --*/ + /*----------------------------------------*/ + + if (agg == 1/*ranges*/ + && fmt == 2/*sb*/ + && !isSTRM) { + + /* 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 + pcmpXstrX_WRK_gen_output_fmt_I( + resV, resOSZACP, + intRes1, zmaskL, zmaskR, validL, pol, idx + ); + + return True; + } + return False; } @@ -1075,6 +1117,11 @@ void istri_44 ( void ) try_istri(wot,h,s, "0123456789abcdef", "00000000dca86532"); try_istri(wot,h,s, "123456789abcdef1", "00000000dca86532"); + + try_istri(wot,h,s, "163887ec041a9b72", "fcd75adb9b3e895a"); + try_istri(wot,h,s, "fc937cbfbf53f8e2", "0d136bcb024d3fb7"); + try_istri(wot,h,s, "2ca34182c29a82ab", "302ebd646775ab54"); + try_istri(wot,h,s, "3f2987608c11be6f", "a9ecb661f8e0a8cb"); } @@ -1253,6 +1300,89 @@ void istri_38 ( void ) +////////////////////////////////////////////////////////// +// // +// ISTRI_46 // +// // +////////////////////////////////////////////////////////// + +UInt h_pcmpistri_46 ( V128* argL, V128* argR ) +{ + V128 block[2]; + memcpy(&block[0], argL, sizeof(V128)); + memcpy(&block[1], argR, sizeof(V128)); + ULong res, flags; + __asm__ __volatile__( + "subq $1024, %%rsp" "\n\t" + "movdqu 0(%2), %%xmm2" "\n\t" + "movdqu 16(%2), %%xmm11" "\n\t" + "pcmpistri $0x46, %%xmm2, %%xmm11" "\n\t" + "pushfq" "\n\t" + "popq %%rdx" "\n\t" + "movq %%rcx, %0" "\n\t" + "movq %%rdx, %1" "\n\t" + "addq $1024, %%rsp" "\n\t" + : /*out*/ "=r"(res), "=r"(flags) : "r"/*in*/(&block[0]) + : "rcx","rdx","xmm0","xmm2","xmm11","cc","memory" + ); + return ((flags & 0x8D5) << 16) | (res & 0xFFFF); +} + +UInt s_pcmpistri_46 ( V128* argLU, V128* argRU ) +{ + V128 resV; + UInt resOSZACP, resECX; + Bool ok + = pcmpXstrX_WRK( &resV, &resOSZACP, argLU, argRU, + zmask_from_V128(argLU), + zmask_from_V128(argRU), + 0x46, False/*!isSTRM*/ + ); + assert(ok); + resECX = resV.uInt[0]; + return (resOSZACP << 16) | resECX; +} + +void istri_46 ( void ) +{ + char* wot = "46"; + UInt(*h)(V128*,V128*) = h_pcmpistri_46; + UInt(*s)(V128*,V128*) = s_pcmpistri_46; + + try_istri(wot,h,s, "aaaabbbbccccdddd", "00000000000000bc"); + try_istri(wot,h,s, "aaaabbbbccccdddd", "00000000000000cb"); + try_istri(wot,h,s, "baaabbbbccccdddd", "00000000000000cb"); + try_istri(wot,h,s, "baaabbbbccccdddc", "00000000000000cb"); + + try_istri(wot,h,s, "bbbbbbbbbbbbbbbb", "00000000000000cb"); + try_istri(wot,h,s, "bbbbbbbb0bbbbbbb", "00000000000000cb"); + try_istri(wot,h,s, "bbbbbbbbbbbbbb0b", "00000000000000cb"); + try_istri(wot,h,s, "bbbbbbbbbbbbbbb0", "00000000000000cb"); + try_istri(wot,h,s, "0000000000000000", "00000000000000cb"); + + try_istri(wot,h,s, "0000000000000000", "0000000000000000"); + + try_istri(wot,h,s, "bbbbbbbbbbbbbbbb", "00000000000000cb"); + try_istri(wot,h,s, "bbbbbbbbbbbbbbbb", "000000000000000b"); + try_istri(wot,h,s, "b4b4b4b4b4b4b4b4", "00000000000062cb"); + + try_istri(wot,h,s, "b4b4b4b4b4b4b4b4", "00000000000002cb"); + try_istri(wot,h,s, "b4b4b4b4b4b4b4b4", "00000000000000cb"); + try_istri(wot,h,s, "b4b4b4b4b4b4b4b4", "000000000000000b"); + + try_istri(wot,h,s, "0123456789abcdef", "000000fecb975421"); + try_istri(wot,h,s, "123456789abcdef1", "000000fecb975421"); + + try_istri(wot,h,s, "0123456789abcdef", "00000000dca86532"); + try_istri(wot,h,s, "123456789abcdef1", "00000000dca86532"); + + try_istri(wot,h,s, "163887ec041a9b72", "fcd75adb9b3e895a"); + try_istri(wot,h,s, "fc937cbfbf53f8e2", "0d136bcb024d3fb7"); + try_istri(wot,h,s, "2ca34182c29a82ab", "302ebd646775ab54"); + try_istri(wot,h,s, "3f2987608c11be6f", "a9ecb661f8e0a8cb"); +} + + ////////////////////////////////////////////////////////// // // // main // @@ -1271,5 +1401,6 @@ int main ( void ) istri_44(); istri_00(); istri_38(); + istri_46(); return 0; } diff --git a/none/tests/amd64/pcmpstr64.stdout.exp b/none/tests/amd64/pcmpstr64.stdout.exp index c94e0a4714..e326d16cd4 100644 --- a/none/tests/amd64/pcmpstr64.stdout.exp +++ b/none/tests/amd64/pcmpstr64.stdout.exp @@ -208,6 +208,10 @@ istri 44 0123456789abcdef 000000fecb975421 -> 08c1000e 08c1000e istri 44 123456789abcdef1 000000fecb975421 -> 0881000f 0881000f istri 44 0123456789abcdef 00000000dca86532 -> 00c1000d 00c1000d istri 44 123456789abcdef1 00000000dca86532 -> 0081000e 0081000e +istri 44 163887ec041a9b72 fcd75adb9b3e895a -> 00410004 00410004 +istri 44 fc937cbfbf53f8e2 0d136bcb024d3fb7 -> 0081000d 0081000d +istri 44 2ca34182c29a82ab 302ebd646775ab54 -> 0081000b 0081000b +istri 44 3f2987608c11be6f a9ecb661f8e0a8cb -> 00c10007 00c10007 istri 00 abcdacbdabcdabcd 000000000000000a -> 00810003 00810003 istri 00 abcdabcdabcdabcd 000000000000000b -> 00810002 00810002 istri 00 abcdabcdabcdabcd 00000000000000ab -> 00810002 00810002 @@ -260,3 +264,27 @@ istri 38 8000000000000000 aaaaaaaa0aaaaaaa -> 00c10007 00c10007 istri 38 0000000000000001 aaaaaaaa0aaaaaaa -> 08c10000 08c10000 istri 38 0000000000000000 aaaaaaaaaaaaaaaa -> 00400010 00400010 istri 38 aaaaaaaaaaaaaaaa 0000000000000000 -> 08810000 08810000 +istri 46 aaaabbbbccccdddd 00000000000000bc -> 00800010 00800010 +istri 46 aaaabbbbccccdddd 00000000000000cb -> 0081000b 0081000b +istri 46 baaabbbbccccdddd 00000000000000cb -> 0081000f 0081000f +istri 46 baaabbbbccccdddc 00000000000000cb -> 0881000f 0881000f +istri 46 bbbbbbbbbbbbbbbb 00000000000000cb -> 0881000f 0881000f +istri 46 bbbbbbbb0bbbbbbb 00000000000000cb -> 08c10006 08c10006 +istri 46 bbbbbbbbbbbbbb0b 00000000000000cb -> 08c10000 08c10000 +istri 46 bbbbbbbbbbbbbbb0 00000000000000cb -> 00c00010 00c00010 +istri 46 0000000000000000 00000000000000cb -> 00c00010 00c00010 +istri 46 0000000000000000 0000000000000000 -> 00c00010 00c00010 +istri 46 bbbbbbbbbbbbbbbb 00000000000000cb -> 0881000f 0881000f +istri 46 bbbbbbbbbbbbbbbb 000000000000000b -> 00800010 00800010 +istri 46 b4b4b4b4b4b4b4b4 00000000000062cb -> 0881000f 0881000f +istri 46 b4b4b4b4b4b4b4b4 00000000000002cb -> 0081000f 0081000f +istri 46 b4b4b4b4b4b4b4b4 00000000000000cb -> 0081000f 0081000f +istri 46 b4b4b4b4b4b4b4b4 000000000000000b -> 00800010 00800010 +istri 46 0123456789abcdef 000000fecb975421 -> 08c1000e 08c1000e +istri 46 123456789abcdef1 000000fecb975421 -> 0881000f 0881000f +istri 46 0123456789abcdef 00000000dca86532 -> 00c1000d 00c1000d +istri 46 123456789abcdef1 00000000dca86532 -> 0081000e 0081000e +istri 46 163887ec041a9b72 fcd75adb9b3e895a -> 08410006 08410006 +istri 46 fc937cbfbf53f8e2 0d136bcb024d3fb7 -> 0881000f 0881000f +istri 46 2ca34182c29a82ab 302ebd646775ab54 -> 0081000f 0081000f +istri 46 3f2987608c11be6f a9ecb661f8e0a8cb -> 00c10007 00c10007