/* Tests that Valgrind coredump support for SSE registers works correctly by producing a core dump analyzable by mdb. Basic register set is tested in coredump_single_thread. */ #include #include __attribute__((noinline)) static void inner(void) { /* Set XMM registers to apriori known values. Unfortunately there is no instruction to load an immediate value directly into xmm register. */ __asm__ __volatile__("\n" "pushl $0x12345678\n" "pushl $0x9abcdef0\n" "pushl $0xfedbca98\n" "pushl $0x76543210\n" "movups (%%esp), %%xmm0\n" "pushl $0x23456789\n" "pushl $0x09876543\n" "pushl $0x21fedcba\n" "pushl $0x9467feca\n" "movups (%%esp), %%xmm1\n" "pushl $0xabcdabcd\n" "pushl $0xcedecede\n" "pushl $0xfabafaba\n" "pushl $0x50656754\n" "movups (%%esp), %%xmm2\n" "pushl $0x03050608\n" "pushl $0x1d1b4b15\n" "pushl $0x25272120\n" "pushl $0x373a3d35\n" "movups (%%esp), %%xmm3\n" "pushl $0x9abcdef0\n" "pushl $0x76543210\n" "pushl $0x12345678\n" "pushl $0xfedbca98\n" "movups (%%esp), %%xmm4\n" "pushl $0x9467feca\n" "pushl $0x23456789\n" "pushl $0x21fedcba\n" "pushl $0x09876543\n" "movups (%%esp), %%xmm5\n" "pushl $0x50656754\n" "pushl $0xcedecede\n" "pushl $0xabcdabcd\n" "pushl $0xfabafaba\n" "movups (%%esp), %%xmm6\n" "pushl $0x373a3d35\n" "pushl $0x1d1b4b15\n" "pushl $0x03050608\n" "pushl $0x25272120\n" "movups (%%esp), %%xmm7\n" "movl $0x1, %%eax\n" "movl $0x1234, (%%eax)\n" // should cause SEGV here : // no output registers : // no input registers : "memory", "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"); } __attribute__((noinline)) static void outer(void) { inner(); } int main(int argc, const char *argv[]) { outer(); return 0; }