From: Julian Seward Date: Thu, 13 Aug 2015 14:19:48 +0000 (+0000) Subject: Add test cases for PCMPxSTRx case 0x18. X-Git-Tag: svn/VALGRIND_3_11_0~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19a7577acd0221bca60c8209658a2325846ae135;p=thirdparty%2Fvalgrind.git Add test cases for PCMPxSTRx case 0x18. Pertains to #348574, vex r3172. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15535 --- diff --git a/none/tests/amd64/pcmpstr64.c b/none/tests/amd64/pcmpstr64.c index bc37237769..06940121e3 100644 --- a/none/tests/amd64/pcmpstr64.c +++ b/none/tests/amd64/pcmpstr64.c @@ -204,7 +204,7 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV, unvalidated cases in the code base. */ switch (imm8) { case 0x00: case 0x02: case 0x08: case 0x0A: case 0x0C: case 0x0E: - case 0x12: case 0x14: case 0x1A: + case 0x12: case 0x14: case 0x18: case 0x1A: case 0x30: case 0x34: case 0x38: case 0x3A: case 0x40: case 0x42: case 0x44: case 0x46: case 0x4A: break; @@ -783,6 +783,99 @@ void istri_08 ( void ) +////////////////////////////////////////////////////////// +// // +// ISTRI_18 // +// // +////////////////////////////////////////////////////////// + +UInt h_pcmpistri_18 ( 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 $0x18, %%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_18 ( 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), + 0x18, False/*!isSTRM*/ + ); + assert(ok); + resECX = resV.uInt[0]; + return (resOSZACP << 16) | resECX; +} + +void istri_18 ( void ) +{ + char* wot = "18"; + UInt(*h)(V128*,V128*) = h_pcmpistri_18; + UInt(*s)(V128*,V128*) = s_pcmpistri_18; + + try_istri(wot,h,s, "0000000000000000", "0000000000000000"); + + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaa2aaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaa2aaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaa2aa", "aaaaaaaaaaaaaaaa"); + + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaa2aaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaa2aaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaa2a"); + + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "baaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "b9aaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + + try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaa7aaa"); + try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaa2aaa4aaa"); + + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa"); + + try_istri(wot,h,s, "aaaaaaaaaaaa0aaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaa0aaa"); + try_istri(wot,h,s, "aaaaaaaaaaaa0aaa", "aaaaaaaaaaaa0aaa"); + + try_istri(wot,h,s, "aaaaaaaa0aaaaaaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaa0aaa"); + try_istri(wot,h,s, "aaaaaaaa0aaaaaaa", "aaaaaaaaaaaa0aaa"); + + try_istri(wot,h,s, "aaaaaaaaaaaa0aaa", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaa0aaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaa0aaa", "aaaaaaaa0aaaaaaa"); + + try_istri(wot,h,s, "0000000000000000", "aaaaaaaa0aaaaaaa"); + try_istri(wot,h,s, "8000000000000000", "aaaaaaaa0aaaaaaa"); + try_istri(wot,h,s, "0000000000000001", "aaaaaaaa0aaaaaaa"); + + try_istri(wot,h,s, "0000000000000000", "aaaaaaaaaaaaaaaa"); + try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "0000000000000000"); +} + + + ////////////////////////////////////////////////////////// // // // ISTRI_1A // @@ -1887,6 +1980,7 @@ int main ( void ) istri_4A(); istri_3A(); istri_08(); + istri_18(); istri_1A(); istri_02(); istri_0C(); diff --git a/none/tests/amd64/pcmpstr64.stdout.exp b/none/tests/amd64/pcmpstr64.stdout.exp index 994d4d0631..492158613d 100644 --- a/none/tests/amd64/pcmpstr64.stdout.exp +++ b/none/tests/amd64/pcmpstr64.stdout.exp @@ -88,6 +88,36 @@ istri 08 8000000000000000 aaaaaaaa0aaaaaaa -> 00c10007 00c10007 istri 08 0000000000000001 aaaaaaaa0aaaaaaa -> 00c10007 00c10007 istri 08 0000000000000000 aaaaaaaaaaaaaaaa -> 00400010 00400010 istri 08 aaaaaaaaaaaaaaaa 0000000000000000 -> 00800010 00800010 +istri 18 0000000000000000 0000000000000000 -> 00c00010 00c00010 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 18 aaaa2aaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000b 0001000b +istri 18 aaaaaaaaa2aaaaaa aaaaaaaaaaaaaaaa -> 00010006 00010006 +istri 18 aaaaaaaaaaaaa2aa aaaaaaaaaaaaaaaa -> 00010002 00010002 +istri 18 aaaaaaaaaaaaaaaa aaaa2aaaaaaaaaaa -> 0001000b 0001000b +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaa2aaaaaa -> 00010006 00010006 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaa2a -> 00010001 00010001 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 18 baaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000f 0001000f +istri 18 b9aaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000e 0001000e +istri 18 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000d 0001000d +istri 18 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000d 0001000d +istri 18 b9baaaaaaaaaaaaa aaaaaaaaaaaa7aaa -> 00010003 00010003 +istri 18 b9baaaaaaaaaaaaa aaaaaaaa2aaa4aaa -> 00010003 00010003 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 18 aaaaaaaaaaaa0aaa aaaaaaaaaaaaaaaa -> 00410003 00410003 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaa0aaa -> 00810003 00810003 +istri 18 aaaaaaaaaaaa0aaa aaaaaaaaaaaa0aaa -> 00c00010 00c00010 +istri 18 aaaaaaaa0aaaaaaa aaaaaaaaaaaaaaaa -> 00410007 00410007 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaaaaaa0aaa -> 00810003 00810003 +istri 18 aaaaaaaa0aaaaaaa aaaaaaaaaaaa0aaa -> 00c10003 00c10003 +istri 18 aaaaaaaaaaaa0aaa aaaaaaaaaaaaaaaa -> 00410003 00410003 +istri 18 aaaaaaaaaaaaaaaa aaaaaaaa0aaaaaaa -> 00810007 00810007 +istri 18 aaaaaaaaaaaa0aaa aaaaaaaa0aaaaaaa -> 00c10003 00c10003 +istri 18 0000000000000000 aaaaaaaa0aaaaaaa -> 08c10000 08c10000 +istri 18 8000000000000000 aaaaaaaa0aaaaaaa -> 08c10000 08c10000 +istri 18 0000000000000001 aaaaaaaa0aaaaaaa -> 08c10000 08c10000 +istri 18 0000000000000000 aaaaaaaaaaaaaaaa -> 08410000 08410000 +istri 18 aaaaaaaaaaaaaaaa 0000000000000000 -> 08810000 08810000 istri 1A 0000000000000000 0000000000000000 -> 00c00010 00c00010 istri 1A aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 istri 1A aaaa2aaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000b 0001000b