From: Julian Seward Date: Wed, 19 Oct 2011 20:17:50 +0000 (+0000) Subject: Add test cases for PCMPxSTRx case 0x38. See #273318. X-Git-Tag: svn/VALGRIND_3_7_0~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c7425309e2bbb2c47a93aa2899bf48db0510c14;p=thirdparty%2Fvalgrind.git Add test cases for PCMPxSTRx case 0x38. See #273318. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12168 --- diff --git a/none/tests/amd64/pcmpstr64.c b/none/tests/amd64/pcmpstr64.c index 71a344f97e..7d508f90f4 100644 --- a/none/tests/amd64/pcmpstr64.c +++ b/none/tests/amd64/pcmpstr64.c @@ -204,7 +204,7 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV, switch (imm8) { case 0x00: case 0x02: case 0x08: case 0x0C: case 0x12: case 0x1A: - case 0x3A: case 0x44: case 0x4A: + case 0x38: case 0x3A: case 0x44: case 0x4A: break; default: return False; @@ -1155,6 +1155,98 @@ void istri_00 ( void ) } +////////////////////////////////////////////////////////// +// // +// ISTRI_38 // +// // +////////////////////////////////////////////////////////// + +UInt h_pcmpistri_38 ( 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 $0x38, %%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_38 ( 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), + 0x38, False/*!isSTRM*/ + ); + assert(ok); + resECX = resV.uInt[0]; + return (resOSZACP << 16) | resECX; +} + +void istri_38 ( void ) +{ + char* wot = "38"; + UInt(*h)(V128*,V128*) = h_pcmpistri_38; + UInt(*s)(V128*,V128*) = s_pcmpistri_38; + + 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"); +} + + ////////////////////////////////////////////////////////// // // @@ -1173,5 +1265,6 @@ int main ( void ) istri_12(); istri_44(); istri_00(); + istri_38(); return 0; } diff --git a/none/tests/amd64/pcmpstr64.stdout.exp b/none/tests/amd64/pcmpstr64.stdout.exp index a5596cd894..eaf653172e 100644 --- a/none/tests/amd64/pcmpstr64.stdout.exp +++ b/none/tests/amd64/pcmpstr64.stdout.exp @@ -226,3 +226,33 @@ istri 00 0000abcdabcdabcd 000000000000baba -> 00c10002 00c10002 istri 00 0000abcdabcdabcd 00000000000baba0 -> 00c00010 00c00010 istri 00 0ddc0ffeebadf00d 00000000cafebabe -> 00c00010 00c00010 istri 00 0ddc0ffeebadfeed 00000000cafebabe -> 00c10001 00c10001 +istri 38 0000000000000000 0000000000000000 -> 08c10000 08c10000 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 38 aaaa2aaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000b 0001000b +istri 38 aaaaaaaaa2aaaaaa aaaaaaaaaaaaaaaa -> 00010006 00010006 +istri 38 aaaaaaaaaaaaa2aa aaaaaaaaaaaaaaaa -> 00010002 00010002 +istri 38 aaaaaaaaaaaaaaaa aaaa2aaaaaaaaaaa -> 0001000b 0001000b +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaa2aaaaaa -> 00010006 00010006 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaa2a -> 00010001 00010001 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 38 baaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000f 0001000f +istri 38 b9aaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000e 0001000e +istri 38 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000d 0001000d +istri 38 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 0001000d 0001000d +istri 38 b9baaaaaaaaaaaaa aaaaaaaaaaaa7aaa -> 00010003 00010003 +istri 38 b9baaaaaaaaaaaaa aaaaaaaa2aaa4aaa -> 00010003 00010003 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010 +istri 38 aaaaaaaaaaaa0aaa aaaaaaaaaaaaaaaa -> 00400010 00400010 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaa0aaa -> 00810003 00810003 +istri 38 aaaaaaaaaaaa0aaa aaaaaaaaaaaa0aaa -> 00c10003 00c10003 +istri 38 aaaaaaaa0aaaaaaa aaaaaaaaaaaaaaaa -> 00400010 00400010 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaaaaaa0aaa -> 00810003 00810003 +istri 38 aaaaaaaa0aaaaaaa aaaaaaaaaaaa0aaa -> 00c10003 00c10003 +istri 38 aaaaaaaaaaaa0aaa aaaaaaaaaaaaaaaa -> 00400010 00400010 +istri 38 aaaaaaaaaaaaaaaa aaaaaaaa0aaaaaaa -> 00810007 00810007 +istri 38 aaaaaaaaaaaa0aaa aaaaaaaa0aaaaaaa -> 00c10007 00c10007 +istri 38 0000000000000000 aaaaaaaa0aaaaaaa -> 00c10007 00c10007 +istri 38 8000000000000000 aaaaaaaa0aaaaaaa -> 00c10007 00c10007 +istri 38 0000000000000001 aaaaaaaa0aaaaaaa -> 08c10000 08c10000 +istri 38 0000000000000000 aaaaaaaaaaaaaaaa -> 00400010 00400010 +istri 38 aaaaaaaaaaaaaaaa 0000000000000000 -> 08810000 08810000