1*80b4008cSJoseph Myers /* Test instructions loading floating-point constants. */ 2*80b4008cSJoseph Myers 3*80b4008cSJoseph Myers #include <stdint.h> 4*80b4008cSJoseph Myers #include <stdio.h> 5*80b4008cSJoseph Myers 6*80b4008cSJoseph Myers volatile long double ld_res; 7*80b4008cSJoseph Myers main(void)8*80b4008cSJoseph Myersint main(void) 9*80b4008cSJoseph Myers { 10*80b4008cSJoseph Myers short cw; 11*80b4008cSJoseph Myers int ret = 0; 12*80b4008cSJoseph Myers 13*80b4008cSJoseph Myers /* Round to nearest. */ 14*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 15*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x000; 16*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 17*80b4008cSJoseph Myers __asm__ volatile ("fldl2t" : "=t" (ld_res)); 18*80b4008cSJoseph Myers if (ld_res != 0x3.5269e12f346e2bf8p+0L) { 19*80b4008cSJoseph Myers printf("FAIL: fldl2t N\n"); 20*80b4008cSJoseph Myers ret = 1; 21*80b4008cSJoseph Myers } 22*80b4008cSJoseph Myers /* Round downward. */ 23*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 24*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x400; 25*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 26*80b4008cSJoseph Myers __asm__ volatile ("fldl2t" : "=t" (ld_res)); 27*80b4008cSJoseph Myers if (ld_res != 0x3.5269e12f346e2bf8p+0L) { 28*80b4008cSJoseph Myers printf("FAIL: fldl2t D\n"); 29*80b4008cSJoseph Myers ret = 1; 30*80b4008cSJoseph Myers } 31*80b4008cSJoseph Myers /* Round toward zero. */ 32*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 33*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0xc00; 34*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 35*80b4008cSJoseph Myers __asm__ volatile ("fldl2t" : "=t" (ld_res)); 36*80b4008cSJoseph Myers if (ld_res != 0x3.5269e12f346e2bf8p+0L) { 37*80b4008cSJoseph Myers printf("FAIL: fldl2t Z\n"); 38*80b4008cSJoseph Myers ret = 1; 39*80b4008cSJoseph Myers } 40*80b4008cSJoseph Myers /* Round upward. */ 41*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 42*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x800; 43*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 44*80b4008cSJoseph Myers __asm__ volatile ("fldl2t" : "=t" (ld_res)); 45*80b4008cSJoseph Myers if (ld_res != 0x3.5269e12f346e2bfcp+0L) { 46*80b4008cSJoseph Myers printf("FAIL: fldl2t U\n"); 47*80b4008cSJoseph Myers ret = 1; 48*80b4008cSJoseph Myers } 49*80b4008cSJoseph Myers 50*80b4008cSJoseph Myers /* Round to nearest. */ 51*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 52*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x000; 53*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 54*80b4008cSJoseph Myers __asm__ volatile ("fldl2e" : "=t" (ld_res)); 55*80b4008cSJoseph Myers if (ld_res != 0x1.71547652b82fe178p+0L) { 56*80b4008cSJoseph Myers printf("FAIL: fldl2e N\n"); 57*80b4008cSJoseph Myers ret = 1; 58*80b4008cSJoseph Myers } 59*80b4008cSJoseph Myers /* Round downward. */ 60*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 61*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x400; 62*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 63*80b4008cSJoseph Myers __asm__ volatile ("fldl2e" : "=t" (ld_res)); 64*80b4008cSJoseph Myers if (ld_res != 0x1.71547652b82fe176p+0L) { 65*80b4008cSJoseph Myers printf("FAIL: fldl2e D\n"); 66*80b4008cSJoseph Myers ret = 1; 67*80b4008cSJoseph Myers } 68*80b4008cSJoseph Myers /* Round toward zero. */ 69*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 70*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0xc00; 71*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 72*80b4008cSJoseph Myers __asm__ volatile ("fldl2e" : "=t" (ld_res)); 73*80b4008cSJoseph Myers if (ld_res != 0x1.71547652b82fe176p+0L) { 74*80b4008cSJoseph Myers printf("FAIL: fldl2e Z\n"); 75*80b4008cSJoseph Myers ret = 1; 76*80b4008cSJoseph Myers } 77*80b4008cSJoseph Myers /* Round upward. */ 78*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 79*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x800; 80*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 81*80b4008cSJoseph Myers __asm__ volatile ("fldl2e" : "=t" (ld_res)); 82*80b4008cSJoseph Myers if (ld_res != 0x1.71547652b82fe178p+0L) { 83*80b4008cSJoseph Myers printf("FAIL: fldl2e U\n"); 84*80b4008cSJoseph Myers ret = 1; 85*80b4008cSJoseph Myers } 86*80b4008cSJoseph Myers 87*80b4008cSJoseph Myers /* Round to nearest. */ 88*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 89*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x000; 90*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 91*80b4008cSJoseph Myers __asm__ volatile ("fldpi" : "=t" (ld_res)); 92*80b4008cSJoseph Myers if (ld_res != 0x3.243f6a8885a308d4p+0L) { 93*80b4008cSJoseph Myers printf("FAIL: fldpi N\n"); 94*80b4008cSJoseph Myers ret = 1; 95*80b4008cSJoseph Myers } 96*80b4008cSJoseph Myers /* Round downward. */ 97*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 98*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x400; 99*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 100*80b4008cSJoseph Myers __asm__ volatile ("fldpi" : "=t" (ld_res)); 101*80b4008cSJoseph Myers if (ld_res != 0x3.243f6a8885a308dp+0L) { 102*80b4008cSJoseph Myers printf("FAIL: fldpi D\n"); 103*80b4008cSJoseph Myers ret = 1; 104*80b4008cSJoseph Myers } 105*80b4008cSJoseph Myers /* Round toward zero. */ 106*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 107*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0xc00; 108*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 109*80b4008cSJoseph Myers __asm__ volatile ("fldpi" : "=t" (ld_res)); 110*80b4008cSJoseph Myers if (ld_res != 0x3.243f6a8885a308dp+0L) { 111*80b4008cSJoseph Myers printf("FAIL: fldpi Z\n"); 112*80b4008cSJoseph Myers ret = 1; 113*80b4008cSJoseph Myers } 114*80b4008cSJoseph Myers /* Round upward. */ 115*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 116*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x800; 117*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 118*80b4008cSJoseph Myers __asm__ volatile ("fldpi" : "=t" (ld_res)); 119*80b4008cSJoseph Myers if (ld_res != 0x3.243f6a8885a308d4p+0L) { 120*80b4008cSJoseph Myers printf("FAIL: fldpi U\n"); 121*80b4008cSJoseph Myers ret = 1; 122*80b4008cSJoseph Myers } 123*80b4008cSJoseph Myers 124*80b4008cSJoseph Myers /* Round to nearest. */ 125*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 126*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x000; 127*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 128*80b4008cSJoseph Myers __asm__ volatile ("fldlg2" : "=t" (ld_res)); 129*80b4008cSJoseph Myers if (ld_res != 0x4.d104d427de7fbcc8p-4L) { 130*80b4008cSJoseph Myers printf("FAIL: fldlg2 N\n"); 131*80b4008cSJoseph Myers ret = 1; 132*80b4008cSJoseph Myers } 133*80b4008cSJoseph Myers /* Round downward. */ 134*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 135*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x400; 136*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 137*80b4008cSJoseph Myers __asm__ volatile ("fldlg2" : "=t" (ld_res)); 138*80b4008cSJoseph Myers if (ld_res != 0x4.d104d427de7fbccp-4L) { 139*80b4008cSJoseph Myers printf("FAIL: fldlg2 D\n"); 140*80b4008cSJoseph Myers ret = 1; 141*80b4008cSJoseph Myers } 142*80b4008cSJoseph Myers /* Round toward zero. */ 143*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 144*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0xc00; 145*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 146*80b4008cSJoseph Myers __asm__ volatile ("fldlg2" : "=t" (ld_res)); 147*80b4008cSJoseph Myers if (ld_res != 0x4.d104d427de7fbccp-4L) { 148*80b4008cSJoseph Myers printf("FAIL: fldlg2 Z\n"); 149*80b4008cSJoseph Myers ret = 1; 150*80b4008cSJoseph Myers } 151*80b4008cSJoseph Myers /* Round upward. */ 152*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 153*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x800; 154*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 155*80b4008cSJoseph Myers __asm__ volatile ("fldlg2" : "=t" (ld_res)); 156*80b4008cSJoseph Myers if (ld_res != 0x4.d104d427de7fbcc8p-4L) { 157*80b4008cSJoseph Myers printf("FAIL: fldlg2 U\n"); 158*80b4008cSJoseph Myers ret = 1; 159*80b4008cSJoseph Myers } 160*80b4008cSJoseph Myers 161*80b4008cSJoseph Myers /* Round to nearest. */ 162*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 163*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x000; 164*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 165*80b4008cSJoseph Myers __asm__ volatile ("fldln2" : "=t" (ld_res)); 166*80b4008cSJoseph Myers if (ld_res != 0xb.17217f7d1cf79acp-4L) { 167*80b4008cSJoseph Myers printf("FAIL: fldln2 N\n"); 168*80b4008cSJoseph Myers ret = 1; 169*80b4008cSJoseph Myers } 170*80b4008cSJoseph Myers /* Round downward. */ 171*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 172*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x400; 173*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 174*80b4008cSJoseph Myers __asm__ volatile ("fldln2" : "=t" (ld_res)); 175*80b4008cSJoseph Myers if (ld_res != 0xb.17217f7d1cf79abp-4L) { 176*80b4008cSJoseph Myers printf("FAIL: fldln2 D\n"); 177*80b4008cSJoseph Myers ret = 1; 178*80b4008cSJoseph Myers } 179*80b4008cSJoseph Myers /* Round toward zero. */ 180*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 181*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0xc00; 182*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 183*80b4008cSJoseph Myers __asm__ volatile ("fldln2" : "=t" (ld_res)); 184*80b4008cSJoseph Myers if (ld_res != 0xb.17217f7d1cf79abp-4L) { 185*80b4008cSJoseph Myers printf("FAIL: fldln2 Z\n"); 186*80b4008cSJoseph Myers ret = 1; 187*80b4008cSJoseph Myers } 188*80b4008cSJoseph Myers /* Round upward. */ 189*80b4008cSJoseph Myers __asm__ volatile ("fnstcw %0" : "=m" (cw)); 190*80b4008cSJoseph Myers cw = (cw & ~0xc00) | 0x800; 191*80b4008cSJoseph Myers __asm__ volatile ("fldcw %0" : : "m" (cw)); 192*80b4008cSJoseph Myers __asm__ volatile ("fldln2" : "=t" (ld_res)); 193*80b4008cSJoseph Myers if (ld_res != 0xb.17217f7d1cf79acp-4L) { 194*80b4008cSJoseph Myers printf("FAIL: fldln2 U\n"); 195*80b4008cSJoseph Myers ret = 1; 196*80b4008cSJoseph Myers } 197*80b4008cSJoseph Myers 198*80b4008cSJoseph Myers return ret; 199*80b4008cSJoseph Myers } 200