1*418b0f93SJoseph Myers /* Test SSE exceptions. */ 2*418b0f93SJoseph Myers 3*418b0f93SJoseph Myers #include <float.h> 4*418b0f93SJoseph Myers #include <stdint.h> 5*418b0f93SJoseph Myers #include <stdio.h> 6*418b0f93SJoseph Myers 7*418b0f93SJoseph Myers volatile float f_res; 8*418b0f93SJoseph Myers volatile double d_res; 9*418b0f93SJoseph Myers 10*418b0f93SJoseph Myers volatile float f_snan = __builtin_nansf(""); 11*418b0f93SJoseph Myers volatile float f_half = 0.5f; 12*418b0f93SJoseph Myers volatile float f_third = 1.0f / 3.0f; 13*418b0f93SJoseph Myers volatile float f_nan = __builtin_nanl(""); 14*418b0f93SJoseph Myers volatile float f_inf = __builtin_inff(); 15*418b0f93SJoseph Myers volatile float f_ninf = -__builtin_inff(); 16*418b0f93SJoseph Myers volatile float f_one = 1.0f; 17*418b0f93SJoseph Myers volatile float f_two = 2.0f; 18*418b0f93SJoseph Myers volatile float f_zero = 0.0f; 19*418b0f93SJoseph Myers volatile float f_nzero = -0.0f; 20*418b0f93SJoseph Myers volatile float f_min = FLT_MIN; 21*418b0f93SJoseph Myers volatile float f_true_min = 0x1p-149f; 22*418b0f93SJoseph Myers volatile float f_max = FLT_MAX; 23*418b0f93SJoseph Myers volatile float f_nmax = -FLT_MAX; 24*418b0f93SJoseph Myers 25*418b0f93SJoseph Myers volatile double d_snan = __builtin_nans(""); 26*418b0f93SJoseph Myers volatile double d_half = 0.5; 27*418b0f93SJoseph Myers volatile double d_third = 1.0 / 3.0; 28*418b0f93SJoseph Myers volatile double d_nan = __builtin_nan(""); 29*418b0f93SJoseph Myers volatile double d_inf = __builtin_inf(); 30*418b0f93SJoseph Myers volatile double d_ninf = -__builtin_inf(); 31*418b0f93SJoseph Myers volatile double d_one = 1.0; 32*418b0f93SJoseph Myers volatile double d_two = 2.0; 33*418b0f93SJoseph Myers volatile double d_zero = 0.0; 34*418b0f93SJoseph Myers volatile double d_nzero = -0.0; 35*418b0f93SJoseph Myers volatile double d_min = DBL_MIN; 36*418b0f93SJoseph Myers volatile double d_true_min = 0x1p-1074; 37*418b0f93SJoseph Myers volatile double d_max = DBL_MAX; 38*418b0f93SJoseph Myers volatile double d_nmax = -DBL_MAX; 39*418b0f93SJoseph Myers 40*418b0f93SJoseph Myers volatile int32_t i32_max = INT32_MAX; 41*418b0f93SJoseph Myers 42*418b0f93SJoseph Myers #define IE (1 << 0) 43*418b0f93SJoseph Myers #define ZE (1 << 2) 44*418b0f93SJoseph Myers #define OE (1 << 3) 45*418b0f93SJoseph Myers #define UE (1 << 4) 46*418b0f93SJoseph Myers #define PE (1 << 5) 47*418b0f93SJoseph Myers #define EXC (IE | ZE | OE | UE | PE) 48*418b0f93SJoseph Myers 49*418b0f93SJoseph Myers uint32_t mxcsr_default = 0x1f80; 50*418b0f93SJoseph Myers uint32_t mxcsr_ftz = 0x9f80; 51*418b0f93SJoseph Myers 52*418b0f93SJoseph Myers int main(void) 53*418b0f93SJoseph Myers { 54*418b0f93SJoseph Myers uint32_t mxcsr; 55*418b0f93SJoseph Myers int32_t i32_res; 56*418b0f93SJoseph Myers int ret = 0; 57*418b0f93SJoseph Myers 58*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 59*418b0f93SJoseph Myers d_res = f_snan; 60*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 61*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 62*418b0f93SJoseph Myers printf("FAIL: widen float snan\n"); 63*418b0f93SJoseph Myers ret = 1; 64*418b0f93SJoseph Myers } 65*418b0f93SJoseph Myers 66*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 67*418b0f93SJoseph Myers f_res = d_min; 68*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 69*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 70*418b0f93SJoseph Myers printf("FAIL: narrow float underflow\n"); 71*418b0f93SJoseph Myers ret = 1; 72*418b0f93SJoseph Myers } 73*418b0f93SJoseph Myers 74*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 75*418b0f93SJoseph Myers f_res = d_max; 76*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 77*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 78*418b0f93SJoseph Myers printf("FAIL: narrow float overflow\n"); 79*418b0f93SJoseph Myers ret = 1; 80*418b0f93SJoseph Myers } 81*418b0f93SJoseph Myers 82*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 83*418b0f93SJoseph Myers f_res = d_third; 84*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 85*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 86*418b0f93SJoseph Myers printf("FAIL: narrow float inexact\n"); 87*418b0f93SJoseph Myers ret = 1; 88*418b0f93SJoseph Myers } 89*418b0f93SJoseph Myers 90*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 91*418b0f93SJoseph Myers f_res = d_snan; 92*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 93*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 94*418b0f93SJoseph Myers printf("FAIL: narrow float snan\n"); 95*418b0f93SJoseph Myers ret = 1; 96*418b0f93SJoseph Myers } 97*418b0f93SJoseph Myers 98*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 99*418b0f93SJoseph Myers __asm__ volatile ("roundss $4, %0, %0" : "=x" (f_res) : "0" (f_min)); 100*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 101*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 102*418b0f93SJoseph Myers printf("FAIL: roundss min\n"); 103*418b0f93SJoseph Myers ret = 1; 104*418b0f93SJoseph Myers } 105*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 106*418b0f93SJoseph Myers __asm__ volatile ("roundss $12, %0, %0" : "=x" (f_res) : "0" (f_min)); 107*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 108*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 109*418b0f93SJoseph Myers printf("FAIL: roundss no-inexact min\n"); 110*418b0f93SJoseph Myers ret = 1; 111*418b0f93SJoseph Myers } 112*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 113*418b0f93SJoseph Myers __asm__ volatile ("roundss $4, %0, %0" : "=x" (f_res) : "0" (f_snan)); 114*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 115*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 116*418b0f93SJoseph Myers printf("FAIL: roundss snan\n"); 117*418b0f93SJoseph Myers ret = 1; 118*418b0f93SJoseph Myers } 119*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 120*418b0f93SJoseph Myers __asm__ volatile ("roundss $12, %0, %0" : "=x" (f_res) : "0" (f_snan)); 121*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 122*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 123*418b0f93SJoseph Myers printf("FAIL: roundss no-inexact snan\n"); 124*418b0f93SJoseph Myers ret = 1; 125*418b0f93SJoseph Myers } 126*418b0f93SJoseph Myers 127*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 128*418b0f93SJoseph Myers __asm__ volatile ("roundsd $4, %0, %0" : "=x" (d_res) : "0" (d_min)); 129*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 130*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 131*418b0f93SJoseph Myers printf("FAIL: roundsd min\n"); 132*418b0f93SJoseph Myers ret = 1; 133*418b0f93SJoseph Myers } 134*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 135*418b0f93SJoseph Myers __asm__ volatile ("roundsd $12, %0, %0" : "=x" (d_res) : "0" (d_min)); 136*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 137*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 138*418b0f93SJoseph Myers printf("FAIL: roundsd no-inexact min\n"); 139*418b0f93SJoseph Myers ret = 1; 140*418b0f93SJoseph Myers } 141*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 142*418b0f93SJoseph Myers __asm__ volatile ("roundsd $4, %0, %0" : "=x" (d_res) : "0" (d_snan)); 143*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 144*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 145*418b0f93SJoseph Myers printf("FAIL: roundsd snan\n"); 146*418b0f93SJoseph Myers ret = 1; 147*418b0f93SJoseph Myers } 148*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 149*418b0f93SJoseph Myers __asm__ volatile ("roundsd $12, %0, %0" : "=x" (d_res) : "0" (d_snan)); 150*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 151*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 152*418b0f93SJoseph Myers printf("FAIL: roundsd no-inexact snan\n"); 153*418b0f93SJoseph Myers ret = 1; 154*418b0f93SJoseph Myers } 155*418b0f93SJoseph Myers 156*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 157*418b0f93SJoseph Myers __asm__ volatile ("comiss %1, %0" : : "x" (f_nan), "x" (f_zero)); 158*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 159*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 160*418b0f93SJoseph Myers printf("FAIL: comiss nan\n"); 161*418b0f93SJoseph Myers ret = 1; 162*418b0f93SJoseph Myers } 163*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 164*418b0f93SJoseph Myers __asm__ volatile ("ucomiss %1, %0" : : "x" (f_nan), "x" (f_zero)); 165*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 166*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 167*418b0f93SJoseph Myers printf("FAIL: ucomiss nan\n"); 168*418b0f93SJoseph Myers ret = 1; 169*418b0f93SJoseph Myers } 170*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 171*418b0f93SJoseph Myers __asm__ volatile ("ucomiss %1, %0" : : "x" (f_snan), "x" (f_zero)); 172*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 173*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 174*418b0f93SJoseph Myers printf("FAIL: ucomiss snan\n"); 175*418b0f93SJoseph Myers ret = 1; 176*418b0f93SJoseph Myers } 177*418b0f93SJoseph Myers 178*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 179*418b0f93SJoseph Myers __asm__ volatile ("comisd %1, %0" : : "x" (d_nan), "x" (d_zero)); 180*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 181*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 182*418b0f93SJoseph Myers printf("FAIL: comisd nan\n"); 183*418b0f93SJoseph Myers ret = 1; 184*418b0f93SJoseph Myers } 185*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 186*418b0f93SJoseph Myers __asm__ volatile ("ucomisd %1, %0" : : "x" (d_nan), "x" (d_zero)); 187*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 188*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 189*418b0f93SJoseph Myers printf("FAIL: ucomisd nan\n"); 190*418b0f93SJoseph Myers ret = 1; 191*418b0f93SJoseph Myers } 192*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 193*418b0f93SJoseph Myers __asm__ volatile ("ucomisd %1, %0" : : "x" (d_snan), "x" (d_zero)); 194*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 195*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 196*418b0f93SJoseph Myers printf("FAIL: ucomisd snan\n"); 197*418b0f93SJoseph Myers ret = 1; 198*418b0f93SJoseph Myers } 199*418b0f93SJoseph Myers 200*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 201*418b0f93SJoseph Myers f_res = f_max + f_max; 202*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 203*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 204*418b0f93SJoseph Myers printf("FAIL: float add overflow\n"); 205*418b0f93SJoseph Myers ret = 1; 206*418b0f93SJoseph Myers } 207*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 208*418b0f93SJoseph Myers f_res = f_max + f_min; 209*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 210*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 211*418b0f93SJoseph Myers printf("FAIL: float add inexact\n"); 212*418b0f93SJoseph Myers ret = 1; 213*418b0f93SJoseph Myers } 214*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 215*418b0f93SJoseph Myers f_res = f_inf + f_ninf; 216*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 217*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 218*418b0f93SJoseph Myers printf("FAIL: float add inf -inf\n"); 219*418b0f93SJoseph Myers ret = 1; 220*418b0f93SJoseph Myers } 221*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 222*418b0f93SJoseph Myers f_res = f_snan + f_third; 223*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 224*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 225*418b0f93SJoseph Myers printf("FAIL: float add snan\n"); 226*418b0f93SJoseph Myers ret = 1; 227*418b0f93SJoseph Myers } 228*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 229*418b0f93SJoseph Myers f_res = f_true_min + f_true_min; 230*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 231*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 232*418b0f93SJoseph Myers printf("FAIL: float add FTZ underflow\n"); 233*418b0f93SJoseph Myers ret = 1; 234*418b0f93SJoseph Myers } 235*418b0f93SJoseph Myers 236*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 237*418b0f93SJoseph Myers d_res = d_max + d_max; 238*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 239*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 240*418b0f93SJoseph Myers printf("FAIL: double add overflow\n"); 241*418b0f93SJoseph Myers ret = 1; 242*418b0f93SJoseph Myers } 243*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 244*418b0f93SJoseph Myers d_res = d_max + d_min; 245*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 246*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 247*418b0f93SJoseph Myers printf("FAIL: double add inexact\n"); 248*418b0f93SJoseph Myers ret = 1; 249*418b0f93SJoseph Myers } 250*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 251*418b0f93SJoseph Myers d_res = d_inf + d_ninf; 252*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 253*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 254*418b0f93SJoseph Myers printf("FAIL: double add inf -inf\n"); 255*418b0f93SJoseph Myers ret = 1; 256*418b0f93SJoseph Myers } 257*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 258*418b0f93SJoseph Myers d_res = d_snan + d_third; 259*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 260*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 261*418b0f93SJoseph Myers printf("FAIL: double add snan\n"); 262*418b0f93SJoseph Myers ret = 1; 263*418b0f93SJoseph Myers } 264*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 265*418b0f93SJoseph Myers d_res = d_true_min + d_true_min; 266*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 267*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 268*418b0f93SJoseph Myers printf("FAIL: double add FTZ underflow\n"); 269*418b0f93SJoseph Myers ret = 1; 270*418b0f93SJoseph Myers } 271*418b0f93SJoseph Myers 272*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 273*418b0f93SJoseph Myers f_res = f_max - f_nmax; 274*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 275*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 276*418b0f93SJoseph Myers printf("FAIL: float sub overflow\n"); 277*418b0f93SJoseph Myers ret = 1; 278*418b0f93SJoseph Myers } 279*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 280*418b0f93SJoseph Myers f_res = f_max - f_min; 281*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 282*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 283*418b0f93SJoseph Myers printf("FAIL: float sub inexact\n"); 284*418b0f93SJoseph Myers ret = 1; 285*418b0f93SJoseph Myers } 286*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 287*418b0f93SJoseph Myers f_res = f_inf - f_inf; 288*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 289*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 290*418b0f93SJoseph Myers printf("FAIL: float sub inf inf\n"); 291*418b0f93SJoseph Myers ret = 1; 292*418b0f93SJoseph Myers } 293*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 294*418b0f93SJoseph Myers f_res = f_snan - f_third; 295*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 296*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 297*418b0f93SJoseph Myers printf("FAIL: float sub snan\n"); 298*418b0f93SJoseph Myers ret = 1; 299*418b0f93SJoseph Myers } 300*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 301*418b0f93SJoseph Myers f_res = f_min - f_true_min; 302*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 303*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 304*418b0f93SJoseph Myers printf("FAIL: float sub FTZ underflow\n"); 305*418b0f93SJoseph Myers ret = 1; 306*418b0f93SJoseph Myers } 307*418b0f93SJoseph Myers 308*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 309*418b0f93SJoseph Myers d_res = d_max - d_nmax; 310*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 311*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 312*418b0f93SJoseph Myers printf("FAIL: double sub overflow\n"); 313*418b0f93SJoseph Myers ret = 1; 314*418b0f93SJoseph Myers } 315*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 316*418b0f93SJoseph Myers d_res = d_max - d_min; 317*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 318*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 319*418b0f93SJoseph Myers printf("FAIL: double sub inexact\n"); 320*418b0f93SJoseph Myers ret = 1; 321*418b0f93SJoseph Myers } 322*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 323*418b0f93SJoseph Myers d_res = d_inf - d_inf; 324*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 325*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 326*418b0f93SJoseph Myers printf("FAIL: double sub inf inf\n"); 327*418b0f93SJoseph Myers ret = 1; 328*418b0f93SJoseph Myers } 329*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 330*418b0f93SJoseph Myers d_res = d_snan - d_third; 331*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 332*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 333*418b0f93SJoseph Myers printf("FAIL: double sub snan\n"); 334*418b0f93SJoseph Myers ret = 1; 335*418b0f93SJoseph Myers } 336*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 337*418b0f93SJoseph Myers d_res = d_min - d_true_min; 338*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 339*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 340*418b0f93SJoseph Myers printf("FAIL: double sub FTZ underflow\n"); 341*418b0f93SJoseph Myers ret = 1; 342*418b0f93SJoseph Myers } 343*418b0f93SJoseph Myers 344*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 345*418b0f93SJoseph Myers f_res = f_max * f_max; 346*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 347*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 348*418b0f93SJoseph Myers printf("FAIL: float mul overflow\n"); 349*418b0f93SJoseph Myers ret = 1; 350*418b0f93SJoseph Myers } 351*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 352*418b0f93SJoseph Myers f_res = f_third * f_third; 353*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 354*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 355*418b0f93SJoseph Myers printf("FAIL: float mul inexact\n"); 356*418b0f93SJoseph Myers ret = 1; 357*418b0f93SJoseph Myers } 358*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 359*418b0f93SJoseph Myers f_res = f_min * f_min; 360*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 361*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 362*418b0f93SJoseph Myers printf("FAIL: float mul underflow\n"); 363*418b0f93SJoseph Myers ret = 1; 364*418b0f93SJoseph Myers } 365*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 366*418b0f93SJoseph Myers f_res = f_inf * f_zero; 367*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 368*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 369*418b0f93SJoseph Myers printf("FAIL: float mul inf 0\n"); 370*418b0f93SJoseph Myers ret = 1; 371*418b0f93SJoseph Myers } 372*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 373*418b0f93SJoseph Myers f_res = f_snan * f_third; 374*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 375*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 376*418b0f93SJoseph Myers printf("FAIL: float mul snan\n"); 377*418b0f93SJoseph Myers ret = 1; 378*418b0f93SJoseph Myers } 379*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 380*418b0f93SJoseph Myers f_res = f_min * f_half; 381*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 382*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 383*418b0f93SJoseph Myers printf("FAIL: float mul FTZ underflow\n"); 384*418b0f93SJoseph Myers ret = 1; 385*418b0f93SJoseph Myers } 386*418b0f93SJoseph Myers 387*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 388*418b0f93SJoseph Myers d_res = d_max * d_max; 389*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 390*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 391*418b0f93SJoseph Myers printf("FAIL: double mul overflow\n"); 392*418b0f93SJoseph Myers ret = 1; 393*418b0f93SJoseph Myers } 394*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 395*418b0f93SJoseph Myers d_res = d_third * d_third; 396*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 397*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 398*418b0f93SJoseph Myers printf("FAIL: double mul inexact\n"); 399*418b0f93SJoseph Myers ret = 1; 400*418b0f93SJoseph Myers } 401*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 402*418b0f93SJoseph Myers d_res = d_min * d_min; 403*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 404*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 405*418b0f93SJoseph Myers printf("FAIL: double mul underflow\n"); 406*418b0f93SJoseph Myers ret = 1; 407*418b0f93SJoseph Myers } 408*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 409*418b0f93SJoseph Myers d_res = d_inf * d_zero; 410*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 411*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 412*418b0f93SJoseph Myers printf("FAIL: double mul inf 0\n"); 413*418b0f93SJoseph Myers ret = 1; 414*418b0f93SJoseph Myers } 415*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 416*418b0f93SJoseph Myers d_res = d_snan * d_third; 417*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 418*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 419*418b0f93SJoseph Myers printf("FAIL: double mul snan\n"); 420*418b0f93SJoseph Myers ret = 1; 421*418b0f93SJoseph Myers } 422*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 423*418b0f93SJoseph Myers d_res = d_min * d_half; 424*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 425*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 426*418b0f93SJoseph Myers printf("FAIL: double mul FTZ underflow\n"); 427*418b0f93SJoseph Myers ret = 1; 428*418b0f93SJoseph Myers } 429*418b0f93SJoseph Myers 430*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 431*418b0f93SJoseph Myers f_res = f_max / f_min; 432*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 433*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 434*418b0f93SJoseph Myers printf("FAIL: float div overflow\n"); 435*418b0f93SJoseph Myers ret = 1; 436*418b0f93SJoseph Myers } 437*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 438*418b0f93SJoseph Myers f_res = f_one / f_third; 439*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 440*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 441*418b0f93SJoseph Myers printf("FAIL: float div inexact\n"); 442*418b0f93SJoseph Myers ret = 1; 443*418b0f93SJoseph Myers } 444*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 445*418b0f93SJoseph Myers f_res = f_min / f_max; 446*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 447*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 448*418b0f93SJoseph Myers printf("FAIL: float div underflow\n"); 449*418b0f93SJoseph Myers ret = 1; 450*418b0f93SJoseph Myers } 451*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 452*418b0f93SJoseph Myers f_res = f_one / f_zero; 453*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 454*418b0f93SJoseph Myers if ((mxcsr & EXC) != ZE) { 455*418b0f93SJoseph Myers printf("FAIL: float div 1 0\n"); 456*418b0f93SJoseph Myers ret = 1; 457*418b0f93SJoseph Myers } 458*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 459*418b0f93SJoseph Myers f_res = f_inf / f_zero; 460*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 461*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 462*418b0f93SJoseph Myers printf("FAIL: float div inf 0\n"); 463*418b0f93SJoseph Myers ret = 1; 464*418b0f93SJoseph Myers } 465*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 466*418b0f93SJoseph Myers f_res = f_nan / f_zero; 467*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 468*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 469*418b0f93SJoseph Myers printf("FAIL: float div nan 0\n"); 470*418b0f93SJoseph Myers ret = 1; 471*418b0f93SJoseph Myers } 472*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 473*418b0f93SJoseph Myers f_res = f_zero / f_zero; 474*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 475*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 476*418b0f93SJoseph Myers printf("FAIL: float div 0 0\n"); 477*418b0f93SJoseph Myers ret = 1; 478*418b0f93SJoseph Myers } 479*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 480*418b0f93SJoseph Myers f_res = f_inf / f_inf; 481*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 482*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 483*418b0f93SJoseph Myers printf("FAIL: float div inf inf\n"); 484*418b0f93SJoseph Myers ret = 1; 485*418b0f93SJoseph Myers } 486*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 487*418b0f93SJoseph Myers f_res = f_snan / f_third; 488*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 489*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 490*418b0f93SJoseph Myers printf("FAIL: float div snan\n"); 491*418b0f93SJoseph Myers ret = 1; 492*418b0f93SJoseph Myers } 493*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 494*418b0f93SJoseph Myers f_res = f_min / f_two; 495*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 496*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 497*418b0f93SJoseph Myers printf("FAIL: float div FTZ underflow\n"); 498*418b0f93SJoseph Myers ret = 1; 499*418b0f93SJoseph Myers } 500*418b0f93SJoseph Myers 501*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 502*418b0f93SJoseph Myers d_res = d_max / d_min; 503*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 504*418b0f93SJoseph Myers if ((mxcsr & EXC) != (OE | PE)) { 505*418b0f93SJoseph Myers printf("FAIL: double div overflow\n"); 506*418b0f93SJoseph Myers ret = 1; 507*418b0f93SJoseph Myers } 508*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 509*418b0f93SJoseph Myers d_res = d_one / d_third; 510*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 511*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 512*418b0f93SJoseph Myers printf("FAIL: double div inexact\n"); 513*418b0f93SJoseph Myers ret = 1; 514*418b0f93SJoseph Myers } 515*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 516*418b0f93SJoseph Myers d_res = d_min / d_max; 517*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 518*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 519*418b0f93SJoseph Myers printf("FAIL: double div underflow\n"); 520*418b0f93SJoseph Myers ret = 1; 521*418b0f93SJoseph Myers } 522*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 523*418b0f93SJoseph Myers d_res = d_one / d_zero; 524*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 525*418b0f93SJoseph Myers if ((mxcsr & EXC) != ZE) { 526*418b0f93SJoseph Myers printf("FAIL: double div 1 0\n"); 527*418b0f93SJoseph Myers ret = 1; 528*418b0f93SJoseph Myers } 529*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 530*418b0f93SJoseph Myers d_res = d_inf / d_zero; 531*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 532*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 533*418b0f93SJoseph Myers printf("FAIL: double div inf 0\n"); 534*418b0f93SJoseph Myers ret = 1; 535*418b0f93SJoseph Myers } 536*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 537*418b0f93SJoseph Myers d_res = d_nan / d_zero; 538*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 539*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 540*418b0f93SJoseph Myers printf("FAIL: double div nan 0\n"); 541*418b0f93SJoseph Myers ret = 1; 542*418b0f93SJoseph Myers } 543*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 544*418b0f93SJoseph Myers d_res = d_zero / d_zero; 545*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 546*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 547*418b0f93SJoseph Myers printf("FAIL: double div 0 0\n"); 548*418b0f93SJoseph Myers ret = 1; 549*418b0f93SJoseph Myers } 550*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 551*418b0f93SJoseph Myers d_res = d_inf / d_inf; 552*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 553*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 554*418b0f93SJoseph Myers printf("FAIL: double div inf inf\n"); 555*418b0f93SJoseph Myers ret = 1; 556*418b0f93SJoseph Myers } 557*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 558*418b0f93SJoseph Myers d_res = d_snan / d_third; 559*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 560*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 561*418b0f93SJoseph Myers printf("FAIL: double div snan\n"); 562*418b0f93SJoseph Myers ret = 1; 563*418b0f93SJoseph Myers } 564*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz)); 565*418b0f93SJoseph Myers d_res = d_min / d_two; 566*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 567*418b0f93SJoseph Myers if ((mxcsr & EXC) != (UE | PE)) { 568*418b0f93SJoseph Myers printf("FAIL: double div FTZ underflow\n"); 569*418b0f93SJoseph Myers ret = 1; 570*418b0f93SJoseph Myers } 571*418b0f93SJoseph Myers 572*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 573*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_max)); 574*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 575*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 576*418b0f93SJoseph Myers printf("FAIL: sqrtss inexact\n"); 577*418b0f93SJoseph Myers ret = 1; 578*418b0f93SJoseph Myers } 579*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 580*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_nmax)); 581*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 582*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 583*418b0f93SJoseph Myers printf("FAIL: sqrtss -max\n"); 584*418b0f93SJoseph Myers ret = 1; 585*418b0f93SJoseph Myers } 586*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 587*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_ninf)); 588*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 589*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 590*418b0f93SJoseph Myers printf("FAIL: sqrtss -inf\n"); 591*418b0f93SJoseph Myers ret = 1; 592*418b0f93SJoseph Myers } 593*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 594*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_snan)); 595*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 596*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 597*418b0f93SJoseph Myers printf("FAIL: sqrtss snan\n"); 598*418b0f93SJoseph Myers ret = 1; 599*418b0f93SJoseph Myers } 600*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 601*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_nzero)); 602*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 603*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 604*418b0f93SJoseph Myers printf("FAIL: sqrtss -0\n"); 605*418b0f93SJoseph Myers ret = 1; 606*418b0f93SJoseph Myers } 607*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 608*418b0f93SJoseph Myers __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : 609*418b0f93SJoseph Myers "0" (-__builtin_nanf(""))); 610*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 611*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 612*418b0f93SJoseph Myers printf("FAIL: sqrtss -nan\n"); 613*418b0f93SJoseph Myers ret = 1; 614*418b0f93SJoseph Myers } 615*418b0f93SJoseph Myers 616*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 617*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_max)); 618*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 619*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 620*418b0f93SJoseph Myers printf("FAIL: sqrtsd inexact\n"); 621*418b0f93SJoseph Myers ret = 1; 622*418b0f93SJoseph Myers } 623*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 624*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_nmax)); 625*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 626*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 627*418b0f93SJoseph Myers printf("FAIL: sqrtsd -max\n"); 628*418b0f93SJoseph Myers ret = 1; 629*418b0f93SJoseph Myers } 630*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 631*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_ninf)); 632*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 633*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 634*418b0f93SJoseph Myers printf("FAIL: sqrtsd -inf\n"); 635*418b0f93SJoseph Myers ret = 1; 636*418b0f93SJoseph Myers } 637*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 638*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_snan)); 639*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 640*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 641*418b0f93SJoseph Myers printf("FAIL: sqrtsd snan\n"); 642*418b0f93SJoseph Myers ret = 1; 643*418b0f93SJoseph Myers } 644*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 645*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_nzero)); 646*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 647*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 648*418b0f93SJoseph Myers printf("FAIL: sqrtsd -0\n"); 649*418b0f93SJoseph Myers ret = 1; 650*418b0f93SJoseph Myers } 651*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 652*418b0f93SJoseph Myers __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : 653*418b0f93SJoseph Myers "0" (-__builtin_nan(""))); 654*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 655*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 656*418b0f93SJoseph Myers printf("FAIL: sqrtsd -nan\n"); 657*418b0f93SJoseph Myers ret = 1; 658*418b0f93SJoseph Myers } 659*418b0f93SJoseph Myers 660*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 661*418b0f93SJoseph Myers __asm__ volatile ("maxss %1, %0" : : "x" (f_nan), "x" (f_zero)); 662*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 663*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 664*418b0f93SJoseph Myers printf("FAIL: maxss nan\n"); 665*418b0f93SJoseph Myers ret = 1; 666*418b0f93SJoseph Myers } 667*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 668*418b0f93SJoseph Myers __asm__ volatile ("minss %1, %0" : : "x" (f_nan), "x" (f_zero)); 669*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 670*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 671*418b0f93SJoseph Myers printf("FAIL: minss nan\n"); 672*418b0f93SJoseph Myers ret = 1; 673*418b0f93SJoseph Myers } 674*418b0f93SJoseph Myers 675*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 676*418b0f93SJoseph Myers __asm__ volatile ("maxsd %1, %0" : : "x" (d_nan), "x" (d_zero)); 677*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 678*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 679*418b0f93SJoseph Myers printf("FAIL: maxsd nan\n"); 680*418b0f93SJoseph Myers ret = 1; 681*418b0f93SJoseph Myers } 682*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 683*418b0f93SJoseph Myers __asm__ volatile ("minsd %1, %0" : : "x" (d_nan), "x" (d_zero)); 684*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 685*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 686*418b0f93SJoseph Myers printf("FAIL: minsd nan\n"); 687*418b0f93SJoseph Myers ret = 1; 688*418b0f93SJoseph Myers } 689*418b0f93SJoseph Myers 690*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 691*418b0f93SJoseph Myers __asm__ volatile ("cvtsi2ss %1, %0" : "=x" (f_res) : "m" (i32_max)); 692*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 693*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 694*418b0f93SJoseph Myers printf("FAIL: cvtsi2ss inexact\n"); 695*418b0f93SJoseph Myers ret = 1; 696*418b0f93SJoseph Myers } 697*418b0f93SJoseph Myers 698*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 699*418b0f93SJoseph Myers __asm__ volatile ("cvtsi2sd %1, %0" : "=x" (d_res) : "m" (i32_max)); 700*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 701*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 702*418b0f93SJoseph Myers printf("FAIL: cvtsi2sd exact\n"); 703*418b0f93SJoseph Myers ret = 1; 704*418b0f93SJoseph Myers } 705*418b0f93SJoseph Myers 706*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 707*418b0f93SJoseph Myers __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (1.5f)); 708*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 709*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 710*418b0f93SJoseph Myers printf("FAIL: cvtss2si inexact\n"); 711*418b0f93SJoseph Myers ret = 1; 712*418b0f93SJoseph Myers } 713*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 714*418b0f93SJoseph Myers __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (0x1p31f)); 715*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 716*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 717*418b0f93SJoseph Myers printf("FAIL: cvtss2si 0x1p31\n"); 718*418b0f93SJoseph Myers ret = 1; 719*418b0f93SJoseph Myers } 720*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 721*418b0f93SJoseph Myers __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (f_inf)); 722*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 723*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 724*418b0f93SJoseph Myers printf("FAIL: cvtss2si inf\n"); 725*418b0f93SJoseph Myers ret = 1; 726*418b0f93SJoseph Myers } 727*418b0f93SJoseph Myers 728*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 729*418b0f93SJoseph Myers __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (1.5)); 730*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 731*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 732*418b0f93SJoseph Myers printf("FAIL: cvtsd2si inexact\n"); 733*418b0f93SJoseph Myers ret = 1; 734*418b0f93SJoseph Myers } 735*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 736*418b0f93SJoseph Myers __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (0x1p31)); 737*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 738*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 739*418b0f93SJoseph Myers printf("FAIL: cvtsd2si 0x1p31\n"); 740*418b0f93SJoseph Myers ret = 1; 741*418b0f93SJoseph Myers } 742*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 743*418b0f93SJoseph Myers __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (d_inf)); 744*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 745*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 746*418b0f93SJoseph Myers printf("FAIL: cvtsd2si inf\n"); 747*418b0f93SJoseph Myers ret = 1; 748*418b0f93SJoseph Myers } 749*418b0f93SJoseph Myers 750*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 751*418b0f93SJoseph Myers __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (1.5f)); 752*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 753*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 754*418b0f93SJoseph Myers printf("FAIL: cvttss2si inexact\n"); 755*418b0f93SJoseph Myers ret = 1; 756*418b0f93SJoseph Myers } 757*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 758*418b0f93SJoseph Myers __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (0x1p31f)); 759*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 760*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 761*418b0f93SJoseph Myers printf("FAIL: cvttss2si 0x1p31\n"); 762*418b0f93SJoseph Myers ret = 1; 763*418b0f93SJoseph Myers } 764*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 765*418b0f93SJoseph Myers __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (f_inf)); 766*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 767*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 768*418b0f93SJoseph Myers printf("FAIL: cvttss2si inf\n"); 769*418b0f93SJoseph Myers ret = 1; 770*418b0f93SJoseph Myers } 771*418b0f93SJoseph Myers 772*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 773*418b0f93SJoseph Myers __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (1.5)); 774*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 775*418b0f93SJoseph Myers if ((mxcsr & EXC) != PE) { 776*418b0f93SJoseph Myers printf("FAIL: cvttsd2si inexact\n"); 777*418b0f93SJoseph Myers ret = 1; 778*418b0f93SJoseph Myers } 779*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 780*418b0f93SJoseph Myers __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (0x1p31)); 781*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 782*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 783*418b0f93SJoseph Myers printf("FAIL: cvttsd2si 0x1p31\n"); 784*418b0f93SJoseph Myers ret = 1; 785*418b0f93SJoseph Myers } 786*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 787*418b0f93SJoseph Myers __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (d_inf)); 788*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 789*418b0f93SJoseph Myers if ((mxcsr & EXC) != IE) { 790*418b0f93SJoseph Myers printf("FAIL: cvttsd2si inf\n"); 791*418b0f93SJoseph Myers ret = 1; 792*418b0f93SJoseph Myers } 793*418b0f93SJoseph Myers 794*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 795*418b0f93SJoseph Myers __asm__ volatile ("rcpss %0, %0" : "=x" (f_res) : "0" (f_snan)); 796*418b0f93SJoseph Myers f_res += f_one; 797*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 798*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 799*418b0f93SJoseph Myers printf("FAIL: rcpss snan\n"); 800*418b0f93SJoseph Myers ret = 1; 801*418b0f93SJoseph Myers } 802*418b0f93SJoseph Myers 803*418b0f93SJoseph Myers __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default)); 804*418b0f93SJoseph Myers __asm__ volatile ("rsqrtss %0, %0" : "=x" (f_res) : "0" (f_snan)); 805*418b0f93SJoseph Myers f_res += f_one; 806*418b0f93SJoseph Myers __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr)); 807*418b0f93SJoseph Myers if ((mxcsr & EXC) != 0) { 808*418b0f93SJoseph Myers printf("FAIL: rsqrtss snan\n"); 809*418b0f93SJoseph Myers ret = 1; 810*418b0f93SJoseph Myers } 811*418b0f93SJoseph Myers 812*418b0f93SJoseph Myers return ret; 813*418b0f93SJoseph Myers } 814