18eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* Tests that Valgrind coredump support for XMM registers works correctly
28eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   by producing a core dump analyzable by mdb.
38eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   Basic register set is tested in coredump_single_thread. */
48eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
58eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include <stdio.h>
68eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include <sys/types.h>
78eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
88eb8bab992e3998c33770b0cdb16059a8b918a06sewardj__attribute__((noinline))
98eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic void inner(void) {
108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   const char *input =
118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x12\x34\x56\x78\x9a\xbc\xde\xf0\xfe\xdb\xca\x98\x76\x54\x32\x10"
128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x23\x45\x67\x89\x09\x87\x65\x43\x21\xfe\xdc\xba\x94\x67\xfe\xca"
138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\xab\xcd\xab\xcd\xce\xde\xce\xde\xfa\xba\xfa\xba\x50\x65\x67\x54"
148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x03\x05\x06\x08\x1d\x1b\x4b\x15\x25\x27\x21\x20\x37\x3a\x3d\x35"
158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x9a\xbc\xde\xf0\x76\x54\x32\x10\x12\x34\x56\x78\xfe\xdb\xca\x98"
168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x94\x67\xfe\xca\x23\x45\x67\x89\x21\xfe\xdc\xba\x09\x87\x65\x43"
178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x50\x65\x67\x54\xce\xde\xce\xde\xab\xcd\xab\xcd\xfa\xba\xfa\xba"
188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x37\x3a\x3d\x35\x1d\x1b\x4b\x15\x03\x05\x06\x08\x25\x27\x21\x20"
198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x24\x15\xb1\x5e\x00\x96\x83\xdd\xdc\x92\x66\x29\xbc\x35\xb1\x8a"
208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\xc6\x72\x50\x4b\xbd\x8e\x9a\x95\xc6\xf7\xd3\x30\xd5\x34\x68\x22"
218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\xc8\xd1\xca\xb6\xf4\x5c\xd1\xc7\x03\xdb\xc8\xb5\x8a\x1a\xf3\xbd"
228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x10\x60\x6d\x52\xa2\xd7\x75\x21\x35\x08\xfa\xe5\xa3\x4b\x5c\x9d"
238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\xab\x87\x21\xbe\xb0\xbc\x32\x72\x2c\x22\x00\x6f\xf5\x63\x80\x6e"
248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x3d\x33\x4a\xab\xef\x9f\x3b\xf0\x25\xc3\x20\xa6\xe9\x55\x07\x0a"
258eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x78\x29\xa1\xb8\xa5\xfd\xd2\xdf\x25\x6a\x53\xba\x6a\x9c\x06\x04"
268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   "\x36\x39\x9e\x9b\x04\xdd\x2d\x24\xe1\xa7\x34\x95\x93\xef\x67\x2a";
278eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
288eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   /* Set 128-bit wide XMM registers to apriori known values. */
298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   __asm__ __volatile__("\n"
308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd   0(%[input]), %%xmm0\n"
318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  16(%[input]), %%xmm1\n"
328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  32(%[input]), %%xmm2\n"
338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  48(%[input]), %%xmm3\n"
348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  64(%[input]), %%xmm4\n"
358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  80(%[input]), %%xmm5\n"
368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd  96(%[input]), %%xmm6\n"
378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 112(%[input]), %%xmm7\n"
388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 128(%[input]), %%xmm8\n"
398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 144(%[input]), %%xmm9\n"
408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 160(%[input]), %%xmm10\n"
418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 176(%[input]), %%xmm11\n"
428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 192(%[input]), %%xmm12\n"
438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 208(%[input]), %%xmm13\n"
448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 224(%[input]), %%xmm14\n"
458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movupd 240(%[input]), %%xmm15\n"
468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movq $0x1, %%rax\n"
478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      "movq $0x1234, (%%rax)\n"  // should cause SEGV here
488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      : // no output registers
498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      : [input]  "r" (input)
508eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      : "memory", "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6",
518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13",
528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        "%xmm14", "%xmm15");
538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj__attribute__((noinline))
568eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic void outer(void)
578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj{
588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   inner();
598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
618eb8bab992e3998c33770b0cdb16059a8b918a06sewardjint main(int argc, const char *argv[])
628eb8bab992e3998c33770b0cdb16059a8b918a06sewardj{
638eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   outer();
648eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return 0;
658eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
66