Changes in uspace/app/tester/float/softfloat1.c [c0c38c7c:3e6a98c5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/tester/float/softfloat1.c
rc0c38c7c r3e6a98c5 29 29 #include <stdio.h> 30 30 #include <stdlib.h> 31 #include < mathtypes.h>31 #include <sftypes.h> 32 32 #include <add.h> 33 33 #include <sub.h> … … 39 39 #include "../tester.h" 40 40 41 #define add_float __addsf3 42 #define sub_float __subsf3 43 #define mul_float __mulsf3 44 #define div_float __divsf3 45 46 #define is_float_lt __ltsf2 47 #define is_float_gt __gtsf2 48 #define is_float_eq __eqsf2 49 50 #define add_double __adddf3 51 #define sub_double __subdf3 52 #define mul_double __muldf3 53 #define div_double __divdf3 54 55 #define is_double_lt __ltdf2 56 #define is_double_gt __gtdf2 57 #define is_double_eq __eqdf2 58 59 #define uint_to_double __floatsidf 60 #define double_to_uint __fixunsdfsi 61 #define double_to_int __fixdfsi 62 63 #define OPERANDS 10 64 #define PRECISION 1000 41 #define OPERANDS 10 42 #define PRECISION 10000 65 43 66 44 #define PRIdCMPTYPE PRId32 … … 68 46 typedef int32_t cmptype_t; 69 47 70 typedef void (* uint_to_double_op_t)(unsigned int, double *, double *);48 typedef void (* uint_to_double_op_t)(unsigned int, double *, double_t *); 71 49 typedef void (* double_to_uint_op_t)(double, unsigned int *, unsigned int *); 72 typedef void (* float_binary_op_t)(float, float, float *, float *); 73 typedef void (* float_cmp_op_t)(float, float, cmptype_t *, cmptype_t *); 74 typedef void (* double_binary_op_t)(double, double, double *, double *); 50 typedef void (* float_binary_op_t)(float, float, float *, float_t *); 51 typedef void (* double_binary_op_t)(double, double, double *, double_t *); 75 52 typedef void (* double_cmp_op_t)(double, double, cmptype_t *, cmptype_t *); 76 53 … … 79 56 cmptype_t *); 80 57 81 #define NUMBERS 58 #define NUMBERS \ 82 59 3.5, -2.1, 100.0, 50.0, -1024.0, 0.0, 768.3156, 1080.499999, -600.0, 1.0 83 60 … … 86 63 }; 87 64 88 static double dop_a[OPERANDS] = 65 static double dop_a[OPERANDS] = { 89 66 NUMBERS 90 67 }; 91 68 92 69 static unsigned int uop_a[OPERANDS] = { 93 4, 2, 100, 50, 1024, 0, 1000000, 1, 0x8000000, 50070 4, -100, 100, 50, 1024, 0, 1000000, -1U, 0x80000000U, 500 94 71 }; 95 72 96 static int fcmp(float a, float b) 73 static cmptype_t cmpabs(cmptype_t a) 74 { 75 if (a >= 0) 76 return a; 77 78 return -a; 79 } 80 81 static int dcmp(double a, double b) 97 82 { 98 83 if (a < b) 99 84 return -1; 100 101 if (a > b) 85 else if (a > b) 102 86 return 1; 103 87 104 88 return 0; 105 89 } 106 90 107 static int dcmp(double a, double b) 108 { 109 if (a < b) 110 return -1; 111 112 if (a > b) 113 return 1; 114 115 return 0; 116 } 117 118 static void uint_to_double_template(void *f, unsigned i, cmptype_t *pic, 119 cmptype_t *pisc) 120 { 91 static void 92 uint_to_double_template(void *f, unsigned i, cmptype_t *pic, cmptype_t *pisc) 93 { 94 double c; 95 double_t sc; 96 121 97 uint_to_double_op_t op = (uint_to_double_op_t) f; 122 98 123 double c;124 double sc;125 99 op(uop_a[i], &c, &sc); 126 100 127 101 *pic = (cmptype_t) (c * PRECISION); 128 *pisc = (cmptype_t) (sc * PRECISION); 129 } 130 131 static void double_to_uint_template(void *f, unsigned i, cmptype_t *pic, 132 cmptype_t *pisc) 133 { 134 double_to_uint_op_t op = (double_to_uint_op_t) f; 135 102 *pisc = (cmptype_t) (sc.val * PRECISION); 103 } 104 105 static void 106 double_to_uint_template(void *f, unsigned i, cmptype_t *pic, cmptype_t *pisc) 107 { 136 108 unsigned int c; 137 109 unsigned int sc; 110 111 double_to_uint_op_t op = (double_to_uint_op_t) f; 112 138 113 op(dop_a[i], &c, &sc); 139 114 140 115 *pic = (cmptype_t) c; 141 116 *pisc = (cmptype_t) sc; 142 117 } 143 118 144 static void float_template_binary(void *f, unsigned i, unsigned j, 145 cmptype_t *pic, cmptype_t *pisc) 146 { 119 120 static void 121 float_template_binary(void *f, unsigned i, unsigned j, cmptype_t *pic, 122 cmptype_t *pisc) 123 { 124 float c; 125 float_t sc; 126 147 127 float_binary_op_t op = (float_binary_op_t) f; 148 128 149 float c;150 float sc;151 129 op(fop_a[i], fop_a[j], &c, &sc); 152 130 153 131 *pic = (cmptype_t) (c * PRECISION); 154 *pisc = (cmptype_t) (sc * PRECISION); 155 } 156 157 static void float_compare_template(void *f, unsigned i, unsigned j, 158 cmptype_t *pis, cmptype_t *piss) 159 { 160 float_cmp_op_t op = (float_cmp_op_t) f; 161 162 op(dop_a[i], dop_a[j], pis, piss); 163 } 164 165 static void double_template_binary(void *f, unsigned i, unsigned j, 166 cmptype_t *pic, cmptype_t *pisc) 167 { 132 *pisc = (cmptype_t) (sc.val * PRECISION); 133 } 134 135 static void 136 double_template_binary(void *f, unsigned i, unsigned j, cmptype_t *pic, 137 cmptype_t *pisc) 138 { 139 double c; 140 double_t sc; 141 168 142 double_binary_op_t op = (double_binary_op_t) f; 169 143 170 double c;171 double sc;172 144 op(dop_a[i], dop_a[j], &c, &sc); 173 145 174 146 *pic = (cmptype_t) (c * PRECISION); 175 *pisc = (cmptype_t) (sc * PRECISION); 176 } 177 178 static void double_compare_template(void *f, unsigned i, unsigned j, 179 cmptype_t *pis, cmptype_t *piss) 147 *pisc = (cmptype_t) (sc.val * PRECISION); 148 } 149 150 static void 151 double_compare_template(void *f, unsigned i, unsigned j, cmptype_t *pis, 152 cmptype_t *piss) 180 153 { 181 154 double_cmp_op_t op = (double_cmp_op_t) f; … … 191 164 cmptype_t ic; 192 165 cmptype_t isc; 193 194 template(f, i, &ic, &isc); 195 cmptype_t diff = ic - isc;196 166 167 template(f, i, &ic, &isc); 168 cmptype_t diff = cmpabs(ic - isc); 169 197 170 if (diff != 0) { 198 TPRINTF("i=%u ic=%" PRIdCMPTYPE " isc=%" PRIdCMPTYPE "\n", 199 i, ic, isc); 171 TPRINTF("i=%u diff=%" PRIdCMPTYPE "\n", i, diff); 200 172 correct = false; 201 173 } … … 210 182 211 183 for (unsigned int i = 0; i < OPERANDS; i++) { 212 for (unsigned int j = 0; j < OPERANDS; j++) { 184 for (unsigned int j = 0; j < OPERANDS; j++) { 213 185 cmptype_t ic; 214 186 cmptype_t isc; 215 216 template(f, i, j, &ic, &isc); 217 cmptype_t diff = ic - isc;187 188 template(f, i, j, &ic, &isc); 189 cmptype_t diff = cmpabs(ic - isc); 218 190 219 191 if (diff != 0) { 220 TPRINTF("i=%u, j=%u ic=%" PRIdCMPTYPE221 " isc=%" PRIdCMPTYPE "\n", i, j, ic, isc);192 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", 193 i, j, diff); 222 194 correct = false; 223 195 } … … 228 200 } 229 201 230 static void uint_to_double_operator(unsigned int a, double *pc, double *psc)202 static void uint_to_double_operator(unsigned int a, double *pc, double_t *psc) 231 203 { 232 204 *pc = (double) a; 233 *psc = uint_to_double(a); 234 } 235 236 static void double_to_uint_operator(double a, unsigned int *pc, 237 unsigned int *psc) 238 { 205 psc->data = uint_to_double(a); 206 } 207 208 static void 209 double_to_uint_operator(double a, unsigned int *pc, unsigned int *psc) 210 { 211 double_t sa; 212 213 sa.val = a; 214 239 215 *pc = (unsigned int) a; 240 *psc = double_to_uint(a); 241 } 242 243 static void double_to_int_operator(double a, unsigned int *pc, 244 unsigned int *psc) 245 { 216 *psc = double_to_uint(sa.data); 217 } 218 219 static void 220 double_to_int_operator(double a, unsigned int *pc, unsigned int *psc) 221 { 222 double_t sa; 223 224 sa.val = a; 225 246 226 *pc = (int) a; 247 *psc = double_to_int( a);248 } 249 250 static void float_add_operator(float a, float b, float *pc, float *psc)227 *psc = double_to_int(sa.data); 228 } 229 230 static void float_add_operator(float a, float b, float *pc, float_t *psc) 251 231 { 252 232 *pc = a + b; 253 *psc = add_float(a, b); 254 } 255 256 static void float_sub_operator(float a, float b, float *pc, float *psc) 257 { 258 *pc = a - b; 259 *psc = sub_float(a, b); 260 } 261 262 static void float_mul_operator(float a, float b, float *pc, float *psc) 233 234 float_t sa; 235 float_t sb; 236 237 sa.val = a; 238 sb.val = b; 239 if (sa.data.parts.sign == sb.data.parts.sign) 240 psc->data = add_float(sa.data, sb.data); 241 else if (sa.data.parts.sign) { 242 sa.data.parts.sign = 0; 243 psc->data = sub_float(sb.data, sa.data); 244 } else { 245 sb.data.parts.sign = 0; 246 psc->data = sub_float(sa.data, sb.data); 247 } 248 } 249 250 static void float_mul_operator(float a, float b, float *pc, float_t *psc) 263 251 { 264 252 *pc = a * b; 265 *psc = mul_float(a, b); 266 } 267 268 static void float_div_operator(float a, float b, float *pc, float *psc) 253 254 float_t sa; 255 float_t sb; 256 257 sa.val = a; 258 sb.val = b; 259 psc->data = mul_float(sa.data, sb.data); 260 } 261 262 static void float_div_operator(float a, float b, float *pc, float_t *psc) 269 263 { 270 264 if ((cmptype_t) b == 0) { 271 265 *pc = 0.0; 272 *psc= 0.0;266 psc->val = 0.0; 273 267 return; 274 268 } 275 269 276 270 *pc = a / b; 277 *psc = div_float(a, b); 278 } 279 280 static void float_cmp_operator(float a, float b, cmptype_t *pis, 281 cmptype_t *piss) 282 { 283 *pis = fcmp(a, b); 284 285 if (is_float_lt(a, b) == -1) 271 272 float_t sa; 273 float_t sb; 274 275 sa.val = a; 276 sb.val = b; 277 psc->data = div_float(sa.data, sb.data); 278 } 279 280 static void double_add_operator(double a, double b, double *pc, double_t *psc) 281 { 282 *pc = a + b; 283 284 double_t sa; 285 double_t sb; 286 287 sa.val = a; 288 sb.val = b; 289 if (sa.data.parts.sign == sb.data.parts.sign) 290 psc->data = add_double(sa.data, sb.data); 291 else if (sa.data.parts.sign) { 292 sa.data.parts.sign = 0; 293 psc->data = sub_double(sb.data, sa.data); 294 } else { 295 sb.data.parts.sign = 0; 296 psc->data = sub_double(sa.data, sb.data); 297 } 298 } 299 300 static void double_mul_operator(double a, double b, double *pc, double_t *psc) 301 { 302 *pc = a * b; 303 304 double_t sa; 305 double_t sb; 306 307 sa.val = a; 308 sb.val = b; 309 psc->data = mul_double(sa.data, sb.data); 310 } 311 312 static void double_div_operator(double a, double b, double *pc, double_t *psc) 313 { 314 if ((cmptype_t) b == 0) { 315 *pc = 0.0; 316 psc->val = 0.0; 317 return; 318 } 319 320 *pc = a / b; 321 322 double_t sa; 323 double_t sb; 324 325 sa.val = a; 326 sb.val = b; 327 psc->data = div_double(sa.data, sb.data); 328 } 329 330 static void 331 double_cmp_operator(double a, double b, cmptype_t *pis, cmptype_t *piss) 332 { 333 *pis = dcmp(a, b); 334 335 double_t sa; 336 double_t sb; 337 338 sa.val = a; 339 sb.val = b; 340 341 if (is_double_lt(sa.data, sb.data)) 286 342 *piss = -1; 287 else if (is_ float_gt(a, b) == 1)343 else if (is_double_gt(sa.data, sb.data)) 288 344 *piss = 1; 289 else if (is_ float_eq(a, b) == 0)345 else if (is_double_eq(sa.data, sb.data)) 290 346 *piss = 0; 291 347 else … … 293 349 } 294 350 295 static void double_add_operator(double a, double b, double *pc, double *psc)296 {297 *pc = a + b;298 *psc = add_double(a, b);299 }300 301 static void double_sub_operator(double a, double b, double *pc, double *psc)302 {303 *pc = a - b;304 *psc = sub_double(a, b);305 }306 307 static void double_mul_operator(double a, double b, double *pc, double *psc)308 {309 *pc = a * b;310 *psc = mul_double(a, b);311 }312 313 static void double_div_operator(double a, double b, double *pc, double *psc)314 {315 if ((cmptype_t) b == 0) {316 *pc = 0.0;317 *psc = 0.0;318 return;319 }320 321 *pc = a / b;322 *psc = div_double(a, b);323 }324 325 static void double_cmp_operator(double a, double b, cmptype_t *pis,326 cmptype_t *piss)327 {328 *pis = dcmp(a, b);329 330 if (is_double_lt(a, b) == -1)331 *piss = -1;332 else if (is_double_gt(a, b) == 1)333 *piss = 1;334 else if (is_double_eq(a, b) == 0)335 *piss = 0;336 else337 *piss = 42;338 }339 340 351 const char *test_softfloat1(void) 341 352 { 342 bool err = false;343 353 const char *err = NULL; 354 344 355 if (!test_template_binary(float_template_binary, float_add_operator)) { 345 err = true; 346 TPRINTF("%s\n", "Float addition failed"); 347 } 348 349 if (!test_template_binary(float_template_binary, float_sub_operator)) { 350 err = true; 351 TPRINTF("%s\n", "Float addition failed"); 352 } 353 356 err = "Float addition failed"; 357 TPRINTF("%s\n", err); 358 } 354 359 if (!test_template_binary(float_template_binary, float_mul_operator)) { 355 err = true; 356 TPRINTF("%s\n", "Float multiplication failed"); 357 } 358 360 err = "Float multiplication failed"; 361 TPRINTF("%s\n", err); 362 } 359 363 if (!test_template_binary(float_template_binary, float_div_operator)) { 360 err = true; 361 TPRINTF("%s\n", "Float division failed"); 362 } 363 364 if (!test_template_binary(float_compare_template, float_cmp_operator)) { 365 err = true; 366 TPRINTF("%s\n", "Float comparison failed"); 367 } 368 364 err = "Float division failed"; 365 TPRINTF("%s\n", err); 366 } 369 367 if (!test_template_binary(double_template_binary, double_add_operator)) { 370 err = true; 371 TPRINTF("%s\n", "Double addition failed"); 372 } 373 374 if (!test_template_binary(double_template_binary, double_sub_operator)) { 375 err = true; 376 TPRINTF("%s\n", "Double addition failed"); 377 } 378 368 err = "Double addition failed"; 369 TPRINTF("%s\n", err); 370 } 379 371 if (!test_template_binary(double_template_binary, double_mul_operator)) { 380 err = true; 381 TPRINTF("%s\n", "Double multiplication failed"); 382 } 383 372 err = "Double multiplication failed"; 373 TPRINTF("%s\n", err); 374 } 384 375 if (!test_template_binary(double_template_binary, double_div_operator)) { 385 err = true; 386 TPRINTF("%s\n", "Double division failed"); 387 } 388 376 err = "Double division failed"; 377 TPRINTF("%s\n", err); 378 } 389 379 if (!test_template_binary(double_compare_template, double_cmp_operator)) { 390 err = true; 391 TPRINTF("%s\n", "Double comparison failed"); 392 } 393 380 err = "Double comparison failed"; 381 TPRINTF("%s\n", err); 382 } 394 383 if (!test_template_unary(uint_to_double_template, 395 384 uint_to_double_operator)) { 396 err = true; 397 TPRINTF("%s\n", "Conversion from unsigned int to double failed"); 398 } 399 385 err = "Conversion from unsigned int to double failed"; 386 TPRINTF("%s\n", err); 387 } 400 388 if (!test_template_unary(double_to_uint_template, 401 389 double_to_uint_operator)) { 402 err = true; 403 TPRINTF("%s\n", "Conversion from double to unsigned int failed"); 404 } 405 390 err = "Conversion from double to unsigned int failed"; 391 TPRINTF("%s\n", err); 392 } 406 393 if (!test_template_unary(double_to_uint_template, 407 394 double_to_int_operator)) { 408 err = true; 409 TPRINTF("%s\n", "Conversion from double to signed int failed"); 410 } 411 412 if (err) 413 return "Software floating point imprecision"; 414 415 return NULL; 416 } 395 err = "Conversion from double to signed int failed"; 396 TPRINTF("%s\n", err); 397 } 398 399 return err; 400 } 401
Note:
See TracChangeset
for help on using the changeset viewer.