Changeset 000494d in mainline for uspace/app/tester/float/softfloat1.c
- Timestamp:
- 2012-10-07T16:12:37Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 87e9392
- Parents:
- e9d0ed4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/tester/float/softfloat1.c
re9d0ed4 r000494d 43 43 44 44 typedef int32_t cmptype_t; 45 46 static float float_op_a[OPERANDS] = 45 typedef void (* float_op_t)(float, float, float *, float_t *); 46 typedef void (* double_op_t)(double, double, double *, double_t *); 47 typedef void (* template_t)(void *, unsigned, unsigned, cmptype_t *, 48 cmptype_t *); 49 50 static float fop_a[OPERANDS] = 47 51 {3.5, -2.1, 100.0, 50.0, -1024.0, 0.0}; 48 52 49 static float float_op_b[OPERANDS] = 53 static float fop_b[OPERANDS] = 54 {-2.1, 100.0, 50.0, -1024.0, 3.5, 0.0}; 55 56 static double dop_a[OPERANDS] = 57 {3.5, -2.1, 100.0, 50.0, -1024.0, 0.0}; 58 59 static double dop_b[OPERANDS] = 50 60 {-2.1, 100.0, 50.0, -1024.0, 3.5, 0.0}; 51 61 … … 58 68 } 59 69 60 static bool test_float_add(void) 70 static void 71 float_template(void *f, unsigned i, unsigned j, cmptype_t *pic, 72 cmptype_t *pisc) 73 { 74 float c; 75 float_t sc; 76 77 float_op_t op = (float_op_t) f; 78 79 op(fop_a[i], fop_b[j], &c, &sc); 80 81 *pic = (cmptype_t) (c * PRECISION); 82 *pisc = (cmptype_t) (sc.val * PRECISION); 83 } 84 85 static void 86 double_template(void *f, unsigned i, unsigned j, cmptype_t *pic, 87 cmptype_t *pisc) 88 { 89 double c; 90 double_t sc; 91 92 double_op_t op = (double_op_t) f; 93 94 op(dop_a[i], dop_b[j], &c, &sc); 95 96 *pic = (cmptype_t) (c * PRECISION); 97 *pisc = (cmptype_t) (sc.val * PRECISION); 98 } 99 100 static bool test_template(template_t template, void *f) 61 101 { 62 102 bool correct = true; 63 103 64 104 for (unsigned int i = 0; i < OPERANDS; i++) { 65 for (unsigned int j = 0; j < OPERANDS; j++) { 66 float a = float_op_a[i]; 67 float b = float_op_b[j]; 68 float c = a + b; 69 70 float_t sa; 71 float_t sb; 72 float_t sc; 73 74 sa.val = float_op_a[i]; 75 sb.val = float_op_b[j]; 76 if (sa.data.parts.sign == sb.data.parts.sign) 77 sc.data = add_float(sa.data, sb.data); 78 else if (sa.data.parts.sign) { 79 sa.data.parts.sign = 0; 80 sc.data = sub_float(sb.data, sa.data); 81 } else { 82 sb.data.parts.sign = 0; 83 sc.data = sub_float(sa.data, sb.data); 84 } 85 86 cmptype_t ic = (cmptype_t) (c * PRECISION); 87 cmptype_t isc = (cmptype_t) (sc.val * PRECISION); 105 for (unsigned int j = 0; j < OPERANDS; j++) { 106 cmptype_t ic; 107 cmptype_t isc; 108 109 template(f, i, j, &ic, &isc); 88 110 cmptype_t diff = cmpabs(ic - isc); 89 111 90 112 if (diff != 0) { 91 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", i, j, diff); 113 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", 114 i, j, diff); 92 115 correct = false; 93 116 } … … 98 121 } 99 122 100 static bool test_float_mul(void) 101 { 102 bool correct = true; 103 104 for (unsigned int i = 0; i < OPERANDS; i++) { 105 for (unsigned int j = 0; j < OPERANDS; j++) { 106 float a = float_op_a[i]; 107 float b = float_op_b[j]; 108 float c = a * b; 109 110 float_t sa; 111 float_t sb; 112 float_t sc; 113 114 sa.val = float_op_a[i]; 115 sb.val = float_op_b[j]; 116 sc.data = mul_float(sa.data, sb.data); 117 118 cmptype_t ic = (cmptype_t) (c * PRECISION); 119 cmptype_t isc = (cmptype_t) (sc.val * PRECISION); 120 cmptype_t diff = cmpabs(ic - isc); 121 122 if (diff != 0) { 123 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", i, j, diff); 124 correct = false; 125 } 126 } 127 } 128 129 return correct; 130 } 131 132 static bool test_float_div(void) 133 { 134 bool correct = true; 135 136 for (unsigned int i = 0; i < OPERANDS; i++) { 137 for (unsigned int j = 0; j < OPERANDS; j++) { 138 float a = float_op_a[i]; 139 float b = float_op_b[j]; 140 141 if (b == 0.0) 142 continue; 143 144 float c = a / b; 145 146 float_t sa; 147 float_t sb; 148 float_t sc; 149 150 sa.val = float_op_a[i]; 151 sb.val = float_op_b[j]; 152 sc.data = div_float(sa.data, sb.data); 153 154 cmptype_t ic = (cmptype_t) (c * PRECISION); 155 cmptype_t isc = (cmptype_t) (sc.val * PRECISION); 156 cmptype_t diff = cmpabs(ic - isc); 157 158 if (diff != 0) { 159 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", i, j, diff); 160 correct = false; 161 } 162 } 163 } 164 165 return correct; 123 static void float_add_operator(float a, float b, float *pc, float_t *psc) 124 { 125 *pc = a + b; 126 127 float_t sa; 128 float_t sb; 129 130 sa.val = a; 131 sb.val = b; 132 if (sa.data.parts.sign == sb.data.parts.sign) 133 psc->data = add_float(sa.data, sb.data); 134 else if (sa.data.parts.sign) { 135 sa.data.parts.sign = 0; 136 psc->data = sub_float(sb.data, sa.data); 137 } else { 138 sb.data.parts.sign = 0; 139 psc->data = sub_float(sa.data, sb.data); 140 } 141 } 142 143 static void float_mul_operator(float a, float b, float *pc, float_t *psc) 144 { 145 *pc = a * b; 146 147 float_t sa; 148 float_t sb; 149 150 sa.val = a; 151 sb.val = b; 152 psc->data = mul_float(sa.data, sb.data); 153 } 154 155 static void float_div_operator(float a, float b, float *pc, float_t *psc) 156 { 157 if ((cmptype_t) b == 0) { 158 *pc = 0.0; 159 psc->val = 0.0; 160 return; 161 } 162 163 *pc = a / b; 164 165 float_t sa; 166 float_t sb; 167 168 sa.val = a; 169 sb.val = b; 170 psc->data = div_float(sa.data, sb.data); 171 } 172 173 static void double_add_operator(double a, double b, double *pc, double_t *psc) 174 { 175 *pc = a + b; 176 177 double_t sa; 178 double_t sb; 179 180 sa.val = a; 181 sb.val = b; 182 if (sa.data.parts.sign == sb.data.parts.sign) 183 psc->data = add_double(sa.data, sb.data); 184 else if (sa.data.parts.sign) { 185 sa.data.parts.sign = 0; 186 psc->data = sub_double(sb.data, sa.data); 187 } else { 188 sb.data.parts.sign = 0; 189 psc->data = sub_double(sa.data, sb.data); 190 } 191 } 192 193 static void double_mul_operator(double a, double b, double *pc, double_t *psc) 194 { 195 *pc = a * b; 196 197 double_t sa; 198 double_t sb; 199 200 sa.val = a; 201 sb.val = b; 202 psc->data = mul_double(sa.data, sb.data); 203 } 204 205 static void double_div_operator(double a, double b, double *pc, double_t *psc) 206 { 207 if ((cmptype_t) b == 0) { 208 *pc = 0.0; 209 psc->val = 0.0; 210 return; 211 } 212 213 *pc = a / b; 214 215 double_t sa; 216 double_t sb; 217 218 sa.val = a; 219 sb.val = b; 220 psc->data = div_double(sa.data, sb.data); 166 221 } 167 222 168 223 const char *test_softfloat1(void) 169 224 { 170 if (!test_float_add()) 171 return "Float addition failed"; 172 if (!test_float_mul()) 173 return "Float multiplication failed"; 174 if (!test_float_div()) 175 return "Float division failed"; 176 177 return NULL; 178 } 225 const char *err = NULL; 226 227 if (!test_template(float_template, float_add_operator)) { 228 err = "Float addition failed"; 229 TPRINTF("%s\n", err); 230 } 231 if (!test_template(float_template, float_mul_operator)) { 232 err = "Float multiplication failed"; 233 TPRINTF("%s\n", err); 234 } 235 if (!test_template(float_template, float_div_operator)) { 236 err = "Float division failed"; 237 TPRINTF("%s\n", err); 238 } 239 if (!test_template(double_template, double_add_operator)) { 240 err = "Double addition failed"; 241 TPRINTF("%s\n", err); 242 } 243 if (!test_template(double_template, double_mul_operator)) { 244 err = "Double multiplication failed"; 245 TPRINTF("%s\n", err); 246 } 247 if (!test_template(double_template, double_div_operator)) { 248 err = "Double division failed"; 249 TPRINTF("%s\n", err); 250 } 251 252 return err; 253 } 254
Note:
See TracChangeset
for help on using the changeset viewer.