fpcnv.ssa (2479B)
1 # floating point casts and conversions 2 3 export 4 function s $fneg(s %f) { 5 @fneg 6 %b0 =w cast %f 7 %b1 =w xor 2147483648, %b0 8 %rs =s cast %b1 9 ret %rs 10 } 11 12 export 13 function d $ftrunc(d %f) { 14 @ftrunc 15 %l0 =w dtosi %f 16 %rt =d swtof %l0 17 ret %rt 18 } 19 20 export 21 function s $wtos(w %w) { 22 @start 23 %rt =s uwtof %w 24 ret %rt 25 } 26 export 27 function d $wtod(w %w) { 28 @start 29 %rt =d uwtof %w 30 ret %rt 31 } 32 33 export 34 function s $ltos(l %l) { 35 @start 36 %rt =s ultof %l 37 ret %rt 38 } 39 export 40 function d $ltod(l %l) { 41 @start 42 %rt =d ultof %l 43 ret %rt 44 } 45 46 export 47 function w $stow(s %f) { 48 @start 49 %rt =w stoui %f 50 ret %rt 51 } 52 export 53 function w $dtow(d %f) { 54 @start 55 %rt =w dtoui %f 56 ret %rt 57 } 58 59 export 60 function l $stol(s %f) { 61 @start 62 %rt =l stoui %f 63 ret %rt 64 } 65 export 66 function l $dtol(d %f) { 67 @start 68 %rt =l dtoui %f 69 ret %rt 70 } 71 72 73 74 # >>> driver 75 # #include <limits.h> 76 # 77 # extern float fneg(float); 78 # extern double ftrunc(double); 79 # 80 # extern float wtos(unsigned int); 81 # extern double wtod(unsigned int); 82 # extern float ltos(long long unsigned int); 83 # extern double ltod(long long unsigned int); 84 # 85 # extern unsigned int stow(float); 86 # extern unsigned int dtow(double); 87 # extern unsigned long long stol(float); 88 # extern unsigned long long dtol(double); 89 # 90 # unsigned long long iin[] = { 0, 1, 16, 234987, 427386245, 0x7fff0000, 91 # 0xffff0000, 23602938196141, 72259248152500195, 9589010795705032704ull, 92 # 0xdcf5fbe299d0148aull, 0xffffffff00000000ull, -1 }; 93 # 94 # double fin[] = { 0.17346516197824458, 442.0760005466251, 4342856.879893436, 95 # 4294967295.0, 98547543006.49626, 236003043787688.3, 9.499222733527032e+18, 96 # 1.1936266170755652e+19 }; 97 # 98 # int main() { 99 # int i; 100 # 101 # if (fneg(1.23f) != -1.23f) return 1; 102 # if (ftrunc(3.1415) != 3.0) return 2; 103 # if (ftrunc(-1.234) != -1.0) return 3; 104 # 105 # for (i=0; i<sizeof(iin)/sizeof(iin[0]); i++) { 106 # if (wtos(iin[i]) != (float) (unsigned int)iin[i]) 107 # return 4; 108 # if (wtod(iin[i]) != (double)(unsigned int)iin[i]) 109 # return 5; 110 # if (ltos(iin[i]) != (float) iin[i]) 111 # return 6; 112 # if (ltod(iin[i]) != (double)iin[i]) 113 # return 7; 114 # } 115 # for (i=0; i<sizeof(fin)/sizeof(fin[0]); i++) { 116 # if (stol((float)fin[i]) != (unsigned long long)(float)fin[i]) 117 # return 8; 118 # if (dtol(fin[i]) != (unsigned long long)fin[i]) 119 # return 9; 120 # if((unsigned long long)fin[i] > UINT_MAX) 121 # continue; 122 # if (stow((float)fin[i]) != (unsigned int)(float)fin[i]) 123 # return 10; 124 # if (dtow(fin[i]) != (unsigned int)fin[i]) 125 # return 11; 126 # } 127 # return 0; 128 # } 129 # <<<