From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: RFA: Test ability to access i386 SSE registers Date: Wed, 12 May 2004 05:26:00 -0000 Message-id: X-SW-Source: 2004-05/msg00361.html It's late; there is surely some Kool-Aid around here I have forgotten to drink. 2004-05-12 Jim Blandy * gdb.arch/i386-sse.exp, gdb.arch/i386-sse.c: New tests. Index: gdb/testsuite/gdb.arch/i386-sse.c =================================================================== RCS file: gdb/testsuite/gdb.arch/i386-sse.c diff -N gdb/testsuite/gdb.arch/i386-sse.c *** gdb/testsuite/gdb.arch/i386-sse.c 1 Jan 1970 00:00:00 -0000 --- gdb/testsuite/gdb.arch/i386-sse.c 12 May 2004 05:23:51 -0000 *************** *** 0 **** --- 1,106 ---- + /* Test program for SSE registers. + + Copyright 2004 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + #include + + + typedef struct { + float f[4]; + } v4sf_t; + + + v4sf_t data[8] = + { + { { 0.0, 0.25, 0.50, 0.75 } }, + { { 1.0, 1.25, 1.50, 1.75 } }, + { { 2.0, 2.25, 2.50, 2.75 } }, + { { 3.0, 3.25, 3.50, 3.75 } }, + { { 4.0, 4.25, 4.50, 4.75 } }, + { { 5.0, 5.25, 5.50, 5.75 } }, + { { 6.0, 6.25, 6.50, 6.75 } }, + { { 7.0, 7.25, 7.50, 7.75 } }, + }; + + + void + cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) + { + __asm__("cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "0" (op)); + } + + + /* After executing 'cpuid' with %eax set to 1, this bit of %edx is set + if the processor supports the SSE extensions. */ + #define CPUID_EDX_SSE (1 << 25) + + + int + have_sse (void) + { + int eax, ebx, ecx, edx; + + cpuid (1, &eax, &ebx, &ecx, &edx); + + if (edx & CPUID_EDX_SSE) + return 1; + else + return 0; + } + + int + main (int argc, char **argv) + { + if (have_sse ()) + { + asm ("movaps 0(%0), %%xmm0\n\t" + "movaps 16(%0), %%xmm1\n\t" + "movaps 32(%0), %%xmm2\n\t" + "movaps 48(%0), %%xmm3\n\t" + "movaps 64(%0), %%xmm4\n\t" + "movaps 80(%0), %%xmm5\n\t" + "movaps 96(%0), %%xmm6\n\t" + "movaps 112(%0), %%xmm7\n\t" + : /* no output operands */ + : "r" (data) + : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"); + + puts ("Hi!"); /* first breakpoint here */ + + asm ( + "movaps %%xmm0, 0(%0)\n\t" + "movaps %%xmm1, 16(%0)\n\t" + "movaps %%xmm2, 32(%0)\n\t" + "movaps %%xmm3, 48(%0)\n\t" + "movaps %%xmm4, 64(%0)\n\t" + "movaps %%xmm5, 80(%0)\n\t" + "movaps %%xmm6, 96(%0)\n\t" + "movaps %%xmm7, 112(%0)\n\t" + : /* no output operands */ + : "r" (data) + : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"); + + puts ("Bye!"); /* second breakpoint here */ + } + + return 0; + } Index: gdb/testsuite/gdb.arch/i386-sse.exp =================================================================== RCS file: gdb/testsuite/gdb.arch/i386-sse.exp diff -N gdb/testsuite/gdb.arch/i386-sse.exp *** gdb/testsuite/gdb.arch/i386-sse.exp 1 Jan 1970 00:00:00 -0000 --- gdb/testsuite/gdb.arch/i386-sse.exp 12 May 2004 05:23:51 -0000 *************** *** 0 **** --- 1,74 ---- + # Copyright 2004 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + # Please email any bugs, comments, and/or additions to this file to: + # bug-gdb@gnu.org + + # This file is part of the gdb testsuite. + + if $tracelevel { + strace $tracelevel + } + + set prms_id 0 + set bug_id 0 + + if ![istarget "i?86-*-*"] then { + verbose "Skipping i386 SSE tests." + return + } + + set testfile "i386-sse" + set srcfile ${testfile}.c + set binfile ${objdir}/${subdir}/${testfile} + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + if ![runto_main] then { + gdb_suppress_tests + } + + gdb_test "break [gdb_get_line_number "first breakpoint here"]" \ + "Breakpoint .* at .*i386-sse.c.*" \ + "set breakpoint in main" + gdb_continue_to_breakpoint "continue to first breakpoint in main" + + foreach r {0 1 2 3 4 5 6 7} { + gdb_test "print \$xmm$r.v4_float" \ + ".. = {$r, $r.25, $r.5, $r.75}.*" \ + "check contents of %xmm$r" + } + + foreach r {0 1 2 3 4 5 6 7} { + gdb_test "set var \$xmm$r.v4_float\[0\] = $r + 10" "" "set %xmm$r" + } + + gdb_test "break [gdb_get_line_number "second breakpoint here"]" \ + "Breakpoint .* at .*i386-sse.c.*" \ + "set breakpoint in main" + gdb_continue_to_breakpoint "continue to second breakpoint in main" + + foreach r {0 1 2 3 4 5 6 7} { + gdb_test "print data\[$r\]" \ + ".. = {f = {[expr $r + 10], $r.25, $r.5, $r.75}}.*" \ + "check contents of data\[$r\]" + }