Viewing file: pr6526.c (1.13 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* Check that the XF registers are not clobbered by an integer division that is done using double precision FPU division. */
/* { dg-do run { target { default_single_fpu && has_xf_regs } } } */ /* { dg-options "-O1 -mdiv=call-fp" } */
#include <assert.h> #include <stdlib.h>
extern void __set_fpscr (int);
void write_xf0 (float* f) { __asm__ __volatile__ ("frchg; fmov.s @%0,fr0; frchg" : : "r" (f) : "memory"); } void read_xf0 (float* f) { __asm__ __volatile__ ("frchg; fmov.s fr0,@%0; frchg" : : "r" (f) : "memory"); }
int __attribute__ ((noinline)) test_00 (int a, int b) { return a / b; }
unsigned int __attribute__ ((noinline)) test_01 (unsigned a, unsigned b) { return a / b; }
int __attribute__ ((noinline)) test_02 (int x) { return x & 0; }
int main (void) { float test_value; int r = 0;
/* Set FPSCR.FR to 1. */ __set_fpscr (0x200000);
test_value = 123; write_xf0 (&test_value); r += test_00 (40, 4); read_xf0 (&test_value); assert (test_value == 123);
test_value = 321; write_xf0 (&test_value); r += test_01 (50, 5); read_xf0 (&test_value); assert (test_value == 321);
return test_02 (r); }
|