Skip to content

Commit b5ca153

Browse files
author
sewardj
committed
Add test cases for PCMPxSTRx cases 0x70 and 0x19. Pertains to #359952.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15910 a5019735-40e9-0310-863c-91ae7b9d1cf9
1 parent 2ba681d commit b5ca153

File tree

4 files changed

+229
-1
lines changed

4 files changed

+229
-1
lines changed

none/tests/amd64/pcmpstr64.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ Bool pcmpXstrX_WRK ( /*OUT*/V128* resV,
207207
case 0x12: case 0x14: case 0x18: case 0x1A:
208208
case 0x30: case 0x34: case 0x38: case 0x3A:
209209
case 0x40: case 0x42: case 0x44: case 0x46: case 0x4A:
210+
case 0x70:
210211
break;
211212
default:
212213
return False;
@@ -1969,6 +1970,86 @@ void istri_14 ( void )
19691970
}
19701971

19711972

1973+
//////////////////////////////////////////////////////////
1974+
// //
1975+
// ISTRI_70 //
1976+
// //
1977+
//////////////////////////////////////////////////////////
1978+
1979+
UInt h_pcmpistri_70 ( V128* argL, V128* argR )
1980+
{
1981+
V128 block[2];
1982+
memcpy(&block[0], argL, sizeof(V128));
1983+
memcpy(&block[1], argR, sizeof(V128));
1984+
ULong res, flags;
1985+
__asm__ __volatile__(
1986+
"subq $1024, %%rsp" "\n\t"
1987+
"movdqu 0(%2), %%xmm2" "\n\t"
1988+
"movdqu 16(%2), %%xmm11" "\n\t"
1989+
"pcmpistri $0x70, %%xmm2, %%xmm11" "\n\t"
1990+
"pushfq" "\n\t"
1991+
"popq %%rdx" "\n\t"
1992+
"movq %%rcx, %0" "\n\t"
1993+
"movq %%rdx, %1" "\n\t"
1994+
"addq $1024, %%rsp" "\n\t"
1995+
: /*out*/ "=r"(res), "=r"(flags) : "r"/*in*/(&block[0])
1996+
: "rcx","rdx","xmm0","xmm2","xmm11","cc","memory"
1997+
);
1998+
return ((flags & 0x8D5) << 16) | (res & 0xFFFF);
1999+
}
2000+
2001+
UInt s_pcmpistri_70 ( V128* argLU, V128* argRU )
2002+
{
2003+
V128 resV;
2004+
UInt resOSZACP, resECX;
2005+
Bool ok
2006+
= pcmpXstrX_WRK( &resV, &resOSZACP, argLU, argRU,
2007+
zmask_from_V128(argLU),
2008+
zmask_from_V128(argRU),
2009+
0x70, False/*!isSTRM*/
2010+
);
2011+
assert(ok);
2012+
resECX = resV.uInt[0];
2013+
return (resOSZACP << 16) | resECX;
2014+
}
2015+
2016+
void istri_70 ( void )
2017+
{
2018+
char* wot = "70";
2019+
UInt(*h)(V128*,V128*) = h_pcmpistri_70;
2020+
UInt(*s)(V128*,V128*) = s_pcmpistri_70;
2021+
2022+
try_istri(wot,h,s, "abcdacbdabcdabcd", "000000000000000a");
2023+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000000b");
2024+
try_istri(wot,h,s, "abcdabcdabcdabcd", "00000000000000ab");
2025+
try_istri(wot,h,s, "abcdabc0abcdabcd", "000000000000abcd");
2026+
2027+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000abcd");
2028+
try_istri(wot,h,s, "0bcdabcdabcdabcd", "000000000000abcd");
2029+
try_istri(wot,h,s, "abcdabcdabcda0cd", "000000000000abcd");
2030+
try_istri(wot,h,s, "abcdabcdabcdab0d", "000000000000abcd");
2031+
try_istri(wot,h,s, "abcdabcdabcdabc0", "000000000000abcd");
2032+
2033+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000abcd");
2034+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000a0cd");
2035+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000ab0d");
2036+
try_istri(wot,h,s, "abcdabcdabcdabcd", "000000000000abc0");
2037+
2038+
try_istri(wot,h,s, "0000000000000000", "0000000000000000");
2039+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
2040+
2041+
try_istri(wot,h,s, "0000abcdabcdabcd", "000000000000abcd");
2042+
try_istri(wot,h,s, "0000abcdabcdabcd", "000000000000dcba");
2043+
try_istri(wot,h,s, "0000abcdabcdabcd", "000000000000bbbb");
2044+
try_istri(wot,h,s, "0000abcdabcdabcd", "000000000000baba");
2045+
2046+
try_istri(wot,h,s, "0000abcdabcdabcd", "00000000000baba0");
2047+
2048+
try_istri(wot,h,s, "0ddc0ffeebadf00d", "00000000cafebabe");
2049+
try_istri(wot,h,s, "0ddc0ffeebadfeed", "00000000cafebabe");
2050+
}
2051+
2052+
19722053
//////////////////////////////////////////////////////////
19732054
// //
19742055
// main //
@@ -1995,5 +2076,6 @@ int main ( void )
19952076
istri_0E();
19962077
istri_14();
19972078
istri_34();
2079+
istri_70();
19982080
return 0;
19992081
}

none/tests/amd64/pcmpstr64.stdout.exp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,3 +458,25 @@ istri 34 163887ec041a9b72 fcd75adb9b3e895a -> 08410000 08410000
458458
istri 34 fc937cbfbf53f8e2 0d136bcb024d3fb7 -> 08810000 08810000
459459
istri 34 2ca34182c29a82ab 302ebd646775ab54 -> 08810000 08810000
460460
istri 34 3f2987608c11be6f a9ecb661f8e0a8cb -> 08c10000 08c10000
461+
istri 70 abcdacbdabcdabcd 000000000000000a -> 0881000e 0881000e
462+
istri 70 abcdabcdabcdabcd 000000000000000b -> 0881000f 0881000f
463+
istri 70 abcdabcdabcdabcd 00000000000000ab -> 0881000d 0881000d
464+
istri 70 abcdabc0abcdabcd 000000000000abcd -> 00c00010 00c00010
465+
istri 70 abcdabcdabcdabcd 000000000000abcd -> 00800010 00800010
466+
istri 70 0bcdabcdabcdabcd 000000000000abcd -> 00c00010 00c00010
467+
istri 70 abcdabcdabcda0cd 000000000000abcd -> 00c00010 00c00010
468+
istri 70 abcdabcdabcdab0d 000000000000abcd -> 00c00010 00c00010
469+
istri 70 abcdabcdabcdabc0 000000000000abcd -> 00c00010 00c00010
470+
istri 70 abcdabcdabcdabcd 000000000000abcd -> 00800010 00800010
471+
istri 70 abcdabcdabcdabcd 000000000000a0cd -> 0081000f 0081000f
472+
istri 70 abcdabcdabcdabcd 000000000000ab0d -> 0081000f 0081000f
473+
istri 70 abcdabcdabcdabcd 000000000000abc0 -> 0881000f 0881000f
474+
istri 70 0000000000000000 0000000000000000 -> 00c00010 00c00010
475+
istri 70 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000010 00000010
476+
istri 70 0000abcdabcdabcd 000000000000abcd -> 00c00010 00c00010
477+
istri 70 0000abcdabcdabcd 000000000000dcba -> 00c00010 00c00010
478+
istri 70 0000abcdabcdabcd 000000000000bbbb -> 08c1000b 08c1000b
479+
istri 70 0000abcdabcdabcd 000000000000baba -> 08c10009 08c10009
480+
istri 70 0000abcdabcdabcd 00000000000baba0 -> 08c1000b 08c1000b
481+
istri 70 0ddc0ffeebadf00d 00000000cafebabe -> 08c10000 08c10000
482+
istri 70 0ddc0ffeebadfeed 00000000cafebabe -> 08c10004 08c10004

none/tests/amd64/pcmpstr64w.c

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ Bool pcmpXstrX_WRK_wide ( /*OUT*/V128* resV,
209209
unvalidated cases in the code base. */
210210
switch (imm8) {
211211
case 0x01: case 0x03: case 0x09: case 0x0B: case 0x0D:
212-
case 0x13: case 0x1B:
212+
case 0x13: case 0x19: case 0x1B:
213213
case 0x39: case 0x3B:
214214
case 0x45: case 0x4B:
215215
break;
@@ -1253,6 +1253,99 @@ void istri_39 ( void )
12531253

12541254

12551255

1256+
//////////////////////////////////////////////////////////
1257+
// //
1258+
// ISTRI_19 //
1259+
// //
1260+
//////////////////////////////////////////////////////////
1261+
1262+
UInt h_pcmpistri_19 ( V128* argL, V128* argR )
1263+
{
1264+
V128 block[2];
1265+
memcpy(&block[0], argL, sizeof(V128));
1266+
memcpy(&block[1], argR, sizeof(V128));
1267+
ULong res, flags;
1268+
__asm__ __volatile__(
1269+
"subq $1024, %%rsp" "\n\t"
1270+
"movdqu 0(%2), %%xmm2" "\n\t"
1271+
"movdqu 16(%2), %%xmm11" "\n\t"
1272+
"pcmpistri $0x19, %%xmm2, %%xmm11" "\n\t"
1273+
"pushfq" "\n\t"
1274+
"popq %%rdx" "\n\t"
1275+
"movq %%rcx, %0" "\n\t"
1276+
"movq %%rdx, %1" "\n\t"
1277+
"addq $1024, %%rsp" "\n\t"
1278+
: /*out*/ "=r"(res), "=r"(flags) : "r"/*in*/(&block[0])
1279+
: "rcx","rdx","xmm0","xmm2","xmm11","cc","memory"
1280+
);
1281+
return ((flags & 0x8D5) << 16) | (res & 0xFFFF);
1282+
}
1283+
1284+
UInt s_pcmpistri_19 ( V128* argLU, V128* argRU )
1285+
{
1286+
V128 resV;
1287+
UInt resOSZACP, resECX;
1288+
Bool ok
1289+
= pcmpXstrX_WRK_wide( &resV, &resOSZACP, argLU, argRU,
1290+
zmask_from_V128(argLU),
1291+
zmask_from_V128(argRU),
1292+
0x19, False/*!isSTRM*/
1293+
);
1294+
assert(ok);
1295+
resECX = resV.uInt[0];
1296+
return (resOSZACP << 16) | resECX;
1297+
}
1298+
1299+
void istri_19 ( void )
1300+
{
1301+
char* wot = "19";
1302+
UInt(*h)(V128*,V128*) = h_pcmpistri_19;
1303+
UInt(*s)(V128*,V128*) = s_pcmpistri_19;
1304+
1305+
try_istri(wot,h,s, "0000000000000000", "0000000000000000");
1306+
1307+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1308+
try_istri(wot,h,s, "aaaa2aaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1309+
try_istri(wot,h,s, "aaaaaaaaa2aaaaaa", "aaaaaaaaaaaaaaaa");
1310+
try_istri(wot,h,s, "aaaaaaaaaaaaa2aa", "aaaaaaaaaaaaaaaa");
1311+
1312+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaa2aaaaaaaaaaa");
1313+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaa2aaaaaa");
1314+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaa2a");
1315+
1316+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1317+
try_istri(wot,h,s, "baaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1318+
try_istri(wot,h,s, "b9aaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1319+
try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1320+
1321+
try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1322+
try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaaaaaa7aaa");
1323+
try_istri(wot,h,s, "b9baaaaaaaaaaaaa", "aaaaaaaa2aaa4aaa");
1324+
1325+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaa");
1326+
1327+
try_istri(wot,h,s, "aaaaaaaaaaaa00aa", "aaaaaaaaaaaaaaaa");
1328+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaa00aa");
1329+
try_istri(wot,h,s, "aaaaaaaaaaaa00aa", "aaaaaaaaaaaa00aa");
1330+
1331+
try_istri(wot,h,s, "aaaaaaaa00aaaaaa", "aaaaaaaaaaaaaaaa");
1332+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaa00aa");
1333+
try_istri(wot,h,s, "aaaaaaaa00aaaaaa", "aaaaaaaaaaaa00aa");
1334+
1335+
try_istri(wot,h,s, "aaaaaaaaaaaa00aa", "aaaaaaaaaaaaaaaa");
1336+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "aaaaaaaa00aaaaaa");
1337+
try_istri(wot,h,s, "aaaaaaaaaaaa00aa", "aaaaaaaa00aaaaaa");
1338+
1339+
try_istri(wot,h,s, "0000000000000000", "aaaaaaaa00aaaaaa");
1340+
try_istri(wot,h,s, "8000000000000000", "aaaaaaaa00aaaaaa");
1341+
try_istri(wot,h,s, "0000000000000001", "aaaaaaaa00aaaaaa");
1342+
1343+
try_istri(wot,h,s, "0000000000000000", "aaaaaaaaaaaaaaaa");
1344+
try_istri(wot,h,s, "aaaaaaaaaaaaaaaa", "0000000000000000");
1345+
}
1346+
1347+
1348+
12561349
//////////////////////////////////////////////////////////
12571350
// //
12581351
// main //
@@ -1271,5 +1364,6 @@ int main ( void )
12711364
istri_45();
12721365
istri_01();
12731366
istri_39();
1367+
istri_19();
12741368
return 0;
12751369
}

none/tests/amd64/pcmpstr64w.stdout.exp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,3 +258,33 @@ istri 39 8000000000000000 aaaaaaaa00aaaaaa -> 00c10003 00c10003
258258
istri 39 0000000000000001 aaaaaaaa00aaaaaa -> 08c10000 08c10000
259259
istri 39 0000000000000000 aaaaaaaaaaaaaaaa -> 00400008 00400008
260260
istri 39 aaaaaaaaaaaaaaaa 0000000000000000 -> 08810000 08810000
261+
istri 19 0000000000000000 0000000000000000 -> 00c00008 00c00008
262+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000008 00000008
263+
istri 19 aaaa2aaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00010005 00010005
264+
istri 19 aaaaaaaaa2aaaaaa aaaaaaaaaaaaaaaa -> 00010003 00010003
265+
istri 19 aaaaaaaaaaaaa2aa aaaaaaaaaaaaaaaa -> 00010001 00010001
266+
istri 19 aaaaaaaaaaaaaaaa aaaa2aaaaaaaaaaa -> 00010005 00010005
267+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaa2aaaaaa -> 00010003 00010003
268+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaa2a -> 08010000 08010000
269+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000008 00000008
270+
istri 19 baaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00010007 00010007
271+
istri 19 b9aaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00010007 00010007
272+
istri 19 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00010006 00010006
273+
istri 19 b9baaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00010006 00010006
274+
istri 19 b9baaaaaaaaaaaaa aaaaaaaaaaaa7aaa -> 00010001 00010001
275+
istri 19 b9baaaaaaaaaaaaa aaaaaaaa2aaa4aaa -> 00010001 00010001
276+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -> 00000008 00000008
277+
istri 19 aaaaaaaaaaaa00aa aaaaaaaaaaaaaaaa -> 00410001 00410001
278+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaa00aa -> 00810001 00810001
279+
istri 19 aaaaaaaaaaaa00aa aaaaaaaaaaaa00aa -> 00c00008 00c00008
280+
istri 19 aaaaaaaa00aaaaaa aaaaaaaaaaaaaaaa -> 00410003 00410003
281+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaaaaaa00aa -> 00810001 00810001
282+
istri 19 aaaaaaaa00aaaaaa aaaaaaaaaaaa00aa -> 00c10001 00c10001
283+
istri 19 aaaaaaaaaaaa00aa aaaaaaaaaaaaaaaa -> 00410001 00410001
284+
istri 19 aaaaaaaaaaaaaaaa aaaaaaaa00aaaaaa -> 00810003 00810003
285+
istri 19 aaaaaaaaaaaa00aa aaaaaaaa00aaaaaa -> 00c10001 00c10001
286+
istri 19 0000000000000000 aaaaaaaa00aaaaaa -> 08c10000 08c10000
287+
istri 19 8000000000000000 aaaaaaaa00aaaaaa -> 08c10000 08c10000
288+
istri 19 0000000000000001 aaaaaaaa00aaaaaa -> 08c10000 08c10000
289+
istri 19 0000000000000000 aaaaaaaaaaaaaaaa -> 08410000 08410000
290+
istri 19 aaaaaaaaaaaaaaaa 0000000000000000 -> 08810000 08810000

0 commit comments

Comments
 (0)