blob: 2d8c8831841d360676caa880c4968c8a48f10df8 [file] [log] [blame]
/* 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 <stdio.h>
#include <sys/types.h>
__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;
}