[444] | 1 | |
---|
| 2 | #include "test.h" |
---|
| 3 | #include <ieeefp.h> |
---|
| 4 | |
---|
| 5 | |
---|
| 6 | /* Test fp getround and fp setround */ |
---|
| 7 | |
---|
| 8 | void |
---|
| 9 | test_getround (void) |
---|
| 10 | { |
---|
| 11 | |
---|
| 12 | newfunc("fpgetround/fpsetround"); |
---|
| 13 | line(1); |
---|
| 14 | fpsetround(FP_RN); |
---|
| 15 | test_iok(fpgetround(), FP_RN); |
---|
| 16 | line(2); |
---|
| 17 | fpsetround(FP_RM); |
---|
| 18 | test_iok(fpgetround(), FP_RM); |
---|
| 19 | line(3); |
---|
| 20 | fpsetround(FP_RP); |
---|
| 21 | test_iok(fpgetround(), FP_RP); |
---|
| 22 | line(4); |
---|
| 23 | fpsetround(FP_RZ); |
---|
| 24 | test_iok(fpgetround(), FP_RZ); |
---|
| 25 | } |
---|
| 26 | |
---|
| 27 | /* And fpset/fpgetmask */ |
---|
| 28 | void |
---|
| 29 | test_getmask (void) |
---|
| 30 | { |
---|
| 31 | newfunc("fpsetmask/fpgetmask"); |
---|
| 32 | line(1); |
---|
| 33 | fpsetmask(FP_X_INV); |
---|
| 34 | test_iok(fpgetmask(),FP_X_INV); |
---|
| 35 | line(2); |
---|
| 36 | fpsetmask(FP_X_DX); |
---|
| 37 | test_iok(fpgetmask(),FP_X_DX); |
---|
| 38 | line(3); |
---|
| 39 | fpsetmask(FP_X_OFL ); |
---|
| 40 | test_iok(fpgetmask(),FP_X_OFL); |
---|
| 41 | line(4); |
---|
| 42 | fpsetmask(FP_X_UFL); |
---|
| 43 | test_iok(fpgetmask(),FP_X_UFL); |
---|
| 44 | line(5); |
---|
| 45 | fpsetmask(FP_X_IMP); |
---|
| 46 | test_iok(fpgetmask(),FP_X_IMP); |
---|
| 47 | } |
---|
| 48 | |
---|
| 49 | void |
---|
| 50 | test_getsticky (void) |
---|
| 51 | { |
---|
| 52 | newfunc("fpsetsticky/fpgetsticky"); |
---|
| 53 | line(1); |
---|
| 54 | fpsetsticky(FP_X_INV); |
---|
| 55 | test_iok(fpgetsticky(),FP_X_INV); |
---|
| 56 | line(2); |
---|
| 57 | fpsetsticky(FP_X_DX); |
---|
| 58 | test_iok(fpgetsticky(),FP_X_DX); |
---|
| 59 | line(3); |
---|
| 60 | fpsetsticky(FP_X_OFL ); |
---|
| 61 | test_iok(fpgetsticky(),FP_X_OFL); |
---|
| 62 | line(4); |
---|
| 63 | fpsetsticky(FP_X_UFL); |
---|
| 64 | test_iok(fpgetsticky(),FP_X_UFL); |
---|
| 65 | line(5); |
---|
| 66 | fpsetsticky(FP_X_IMP); |
---|
| 67 | test_iok(fpgetsticky(),FP_X_IMP); |
---|
| 68 | } |
---|
| 69 | |
---|
| 70 | void |
---|
| 71 | test_getroundtoi (void) |
---|
| 72 | { |
---|
| 73 | newfunc("fpsetroundtoi/fpgetroundtoi"); |
---|
| 74 | line(1); |
---|
| 75 | fpsetroundtoi(FP_RDI_TOZ); |
---|
| 76 | test_iok(fpgetroundtoi(),FP_RDI_TOZ); |
---|
| 77 | |
---|
| 78 | line(2); |
---|
| 79 | fpsetroundtoi(FP_RDI_RD); |
---|
| 80 | test_iok(fpgetroundtoi(),FP_RDI_RD); |
---|
| 81 | |
---|
| 82 | } |
---|
| 83 | |
---|
| 84 | double |
---|
| 85 | dnumber (int msw, |
---|
| 86 | int lsw) |
---|
| 87 | { |
---|
| 88 | |
---|
| 89 | __ieee_double_shape_type v; |
---|
| 90 | v.parts.lsw = lsw; |
---|
| 91 | v.parts.msw = msw; |
---|
| 92 | return v.value; |
---|
| 93 | } |
---|
| 94 | |
---|
| 95 | /* Lets see if changing the rounding alters the arithmetic. |
---|
| 96 | Test by creating numbers which will have to be rounded when |
---|
| 97 | added, and seeing what happens to them */ |
---|
| 98 | /* Keep them out here to stop the compiler from folding the results */ |
---|
| 99 | double n; |
---|
| 100 | double m; |
---|
| 101 | double add_rounded_up; |
---|
| 102 | double add_rounded_down; |
---|
| 103 | double sub_rounded_down ; |
---|
| 104 | double sub_rounded_up ; |
---|
| 105 | double r1,r2,r3,r4; |
---|
| 106 | void |
---|
| 107 | test_round (void) |
---|
| 108 | { |
---|
| 109 | n = dnumber(0x40000000, 0x00000008); /* near 2 */ |
---|
| 110 | m = dnumber(0x40400000, 0x00000003); /* near 3.4 */ |
---|
| 111 | |
---|
| 112 | add_rounded_up = dnumber(0x40410000, 0x00000004); /* For RN, RP */ |
---|
| 113 | add_rounded_down = dnumber(0x40410000, 0x00000003); /* For RM, RZ */ |
---|
| 114 | sub_rounded_down = dnumber(0xc0410000, 0x00000004); /* for RN, RM */ |
---|
| 115 | sub_rounded_up = dnumber(0xc0410000, 0x00000003); /* for RP, RZ */ |
---|
| 116 | |
---|
| 117 | newfunc("fpsetround"); |
---|
| 118 | |
---|
| 119 | line(1); |
---|
| 120 | |
---|
| 121 | fpsetround(FP_RN); |
---|
| 122 | r1 = n + m; |
---|
| 123 | test_mok(r1, add_rounded_up, 64); |
---|
| 124 | |
---|
| 125 | line(2); |
---|
| 126 | fpsetround(FP_RM); |
---|
| 127 | r2 = n + m; |
---|
| 128 | test_mok(r2, add_rounded_down, 64); |
---|
| 129 | |
---|
| 130 | fpsetround(FP_RP); |
---|
| 131 | line(3); |
---|
| 132 | r3 = n + m; |
---|
| 133 | test_mok(r3,add_rounded_up, 64); |
---|
| 134 | |
---|
| 135 | fpsetround(FP_RZ); |
---|
| 136 | line(4); |
---|
| 137 | r4 = n + m; |
---|
| 138 | test_mok(r4,add_rounded_down,64); |
---|
| 139 | |
---|
| 140 | |
---|
| 141 | fpsetround(FP_RN); |
---|
| 142 | r1 = - n - m; |
---|
| 143 | line(5); |
---|
| 144 | test_mok(r1,sub_rounded_down,64); |
---|
| 145 | |
---|
| 146 | fpsetround(FP_RM); |
---|
| 147 | r2 = - n - m; |
---|
| 148 | line(6); |
---|
| 149 | test_mok(r2,sub_rounded_down,64); |
---|
| 150 | |
---|
| 151 | |
---|
| 152 | fpsetround(FP_RP); |
---|
| 153 | r3 = - n - m; |
---|
| 154 | line(7); |
---|
| 155 | test_mok(r3,sub_rounded_up,64); |
---|
| 156 | |
---|
| 157 | fpsetround(FP_RZ); |
---|
| 158 | r4 = - n - m; |
---|
| 159 | line(8); |
---|
| 160 | test_mok(r4,sub_rounded_up,64); |
---|
| 161 | } |
---|
| 162 | |
---|
| 163 | |
---|
| 164 | void |
---|
| 165 | test_ieee (void) |
---|
| 166 | { |
---|
| 167 | fp_rnd old = fpgetround(); |
---|
| 168 | test_getround(); |
---|
| 169 | test_getmask(); |
---|
| 170 | test_getsticky(); |
---|
| 171 | test_getroundtoi(); |
---|
| 172 | |
---|
| 173 | test_round(); |
---|
| 174 | fpsetround(old); |
---|
| 175 | |
---|
| 176 | |
---|
| 177 | } |
---|
| 178 | |
---|
| 179 | |
---|