/* { dg-do run { target { powerpc*-*-* && lp64 } } } */ /* { dg-require-effective-target hard_dfp } */ /* { dg-options "-O2 -std=c99" } */ #ifdef DEBUG #include #endif #define DRN_MASK 0x700000000LL /* DRN field mask */ void abort (void); int main () { int i; int val, bit; double fpscr_val; union blah { double d; unsigned long long ll; } conv_val; unsigned long long ll_value; register double f14; /* __builtin_set_fpscr_drn() builtin can take a const or a variable value between 0 and 7 as the argument. */ /* Test builtin decimal float rounding mode with const argument. */ __builtin_set_fpscr_drn(7); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != 0x700000000) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(7) did not set rounding mode to 7.\n"); #else abort(); #endif } __builtin_set_fpscr_drn(2); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != 0x200000000) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(2) did not set rounding mode to 2.\n"); #else abort(); #endif } __builtin_set_fpscr_drn(5); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != 0x500000000) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(5) did not set rounding mode to 5.\n"); #else abort(); #endif } /* Test builtin decimal float rounding mode with variable as argument. */ val = 7; __builtin_set_fpscr_drn(val); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != ((unsigned long long)val << 32)) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n", val, val); #else abort(); #endif } val = 0; __builtin_set_fpscr_drn(val); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != ((unsigned long long)val << 32)) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n", val, val); #else abort(); #endif } val = 2; __builtin_set_fpscr_drn(val); conv_val.d = __builtin_mffs(); ll_value = conv_val.ll & DRN_MASK; if (ll_value != ((unsigned long long)val << 32)) { #ifdef DEBUG printf("ERROR, __builtin_set_fpscr_drn(val=%d) did not set rounding mode to %d.\n", val, val); #else abort(); #endif } }