Changes in uspace/app/tester/float/softfloat1.c [c0c38c7c:7218fe6] in mainline
- File:
-
- 1 edited
-
uspace/app/tester/float/softfloat1.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/tester/float/softfloat1.c
rc0c38c7c r7218fe6 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 __addsf342 #define sub_float __subsf343 #define mul_float __mulsf344 #define div_float __divsf345 46 #define is_float_lt __ltsf247 #define is_float_gt __gtsf248 #define is_float_eq __eqsf249 50 #define add_double __adddf351 #define sub_double __subdf352 #define mul_double __muldf353 #define div_double __divdf354 55 #define is_double_lt __ltdf256 #define is_double_gt __gtdf257 #define is_double_eq __eqdf258 59 #define uint_to_double __floatsidf60 #define double_to_uint __fixunsdfsi61 #define double_to_int __fixdfsi62 63 41 #define OPERANDS 10 64 #define PRECISION 1000 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 … … 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) … … 105 90 } 106 91 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 92 static void uint_to_double_template(void *f, unsigned i, cmptype_t *pic, 119 93 cmptype_t *pisc) … … 122 96 123 97 double c; 124 double sc;98 double_t sc; 125 99 op(uop_a[i], &c, &sc); 126 100 127 101 *pic = (cmptype_t) (c * PRECISION); 128 *pisc = (cmptype_t) (sc * PRECISION);102 *pisc = (cmptype_t) (sc.val * PRECISION); 129 103 } 130 104 … … 142 116 } 143 117 118 144 119 static void float_template_binary(void *f, unsigned i, unsigned j, 145 120 cmptype_t *pic, cmptype_t *pisc) … … 148 123 149 124 float c; 150 float sc;125 float_t sc; 151 126 op(fop_a[i], fop_a[j], &c, &sc); 152 127 153 128 *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); 129 *pisc = (cmptype_t) (sc.val * PRECISION); 163 130 } 164 131 … … 169 136 170 137 double c; 171 double sc;138 double_t sc; 172 139 op(dop_a[i], dop_a[j], &c, &sc); 173 140 174 141 *pic = (cmptype_t) (c * PRECISION); 175 *pisc = (cmptype_t) (sc * PRECISION);142 *pisc = (cmptype_t) (sc.val * PRECISION); 176 143 } 177 144 … … 193 160 194 161 template(f, i, &ic, &isc); 195 cmptype_t diff = ic - isc;162 cmptype_t diff = cmpabs(ic - isc); 196 163 197 164 if (diff != 0) { 198 TPRINTF("i=%u ic=%" PRIdCMPTYPE " isc=%" PRIdCMPTYPE "\n", 199 i, ic, isc); 165 TPRINTF("i=%u diff=%" PRIdCMPTYPE "\n", i, diff); 200 166 correct = false; 201 167 } … … 215 181 216 182 template(f, i, j, &ic, &isc); 217 cmptype_t diff = ic - isc;183 cmptype_t diff = cmpabs(ic - isc); 218 184 219 185 if (diff != 0) { 220 TPRINTF("i=%u, j=%u ic=%" PRIdCMPTYPE221 " isc=%" PRIdCMPTYPE "\n", i, j, ic, isc);186 TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n", 187 i, j, diff); 222 188 correct = false; 223 189 } … … 228 194 } 229 195 230 static void uint_to_double_operator(unsigned int a, double *pc, double *psc)196 static void uint_to_double_operator(unsigned int a, double *pc, double_t *psc) 231 197 { 232 198 *pc = (double) a; 233 *psc= uint_to_double(a);199 psc->data = uint_to_double(a); 234 200 } 235 201 … … 237 203 unsigned int *psc) 238 204 { 205 double_t sa; 206 207 sa.val = a; 208 239 209 *pc = (unsigned int) a; 240 *psc = double_to_uint( a);210 *psc = double_to_uint(sa.data); 241 211 } 242 212 … … 244 214 unsigned int *psc) 245 215 { 216 double_t sa; 217 218 sa.val = a; 219 246 220 *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)221 *psc = double_to_int(sa.data); 222 } 223 224 static void float_add_operator(float a, float b, float *pc, float_t *psc) 251 225 { 252 226 *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) 227 228 float_t sa; 229 float_t sb; 230 231 sa.val = a; 232 sb.val = b; 233 234 if (sa.data.parts.sign == sb.data.parts.sign) { 235 psc->data = add_float(sa.data, sb.data); 236 } else if (sa.data.parts.sign) { 237 sa.data.parts.sign = 0; 238 psc->data = sub_float(sb.data, sa.data); 239 } else { 240 sb.data.parts.sign = 0; 241 psc->data = sub_float(sa.data, sb.data); 242 } 243 } 244 245 static void float_mul_operator(float a, float b, float *pc, float_t *psc) 263 246 { 264 247 *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) 248 249 float_t sa; 250 float_t sb; 251 252 sa.val = a; 253 sb.val = b; 254 psc->data = mul_float(sa.data, sb.data); 255 } 256 257 static void float_div_operator(float a, float b, float *pc, float_t *psc) 269 258 { 270 259 if ((cmptype_t) b == 0) { 271 260 *pc = 0.0; 272 *psc= 0.0;261 psc->val = 0.0; 273 262 return; 274 263 } 275 264 276 265 *pc = a / b; 277 *psc = div_float(a, b); 278 } 279 280 static void float_cmp_operator(float a, float b, cmptype_t *pis, 266 267 float_t sa; 268 float_t sb; 269 270 sa.val = a; 271 sb.val = b; 272 psc->data = div_float(sa.data, sb.data); 273 } 274 275 static void double_add_operator(double a, double b, double *pc, double_t *psc) 276 { 277 *pc = a + b; 278 279 double_t sa; 280 double_t sb; 281 282 sa.val = a; 283 sb.val = b; 284 285 if (sa.data.parts.sign == sb.data.parts.sign) { 286 psc->data = add_double(sa.data, sb.data); 287 } else if (sa.data.parts.sign) { 288 sa.data.parts.sign = 0; 289 psc->data = sub_double(sb.data, sa.data); 290 } else { 291 sb.data.parts.sign = 0; 292 psc->data = sub_double(sa.data, sb.data); 293 } 294 } 295 296 static void double_mul_operator(double a, double b, double *pc, double_t *psc) 297 { 298 *pc = a * b; 299 300 double_t sa; 301 double_t sb; 302 303 sa.val = a; 304 sb.val = b; 305 psc->data = mul_double(sa.data, sb.data); 306 } 307 308 static void double_div_operator(double a, double b, double *pc, double_t *psc) 309 { 310 if ((cmptype_t) b == 0) { 311 *pc = 0.0; 312 psc->val = 0.0; 313 return; 314 } 315 316 *pc = a / b; 317 318 double_t sa; 319 double_t sb; 320 321 sa.val = a; 322 sb.val = b; 323 psc->data = div_double(sa.data, sb.data); 324 } 325 326 static void double_cmp_operator(double a, double b, cmptype_t *pis, 281 327 cmptype_t *piss) 282 328 { 283 *pis = fcmp(a, b); 284 285 if (is_float_lt(a, b) == -1) 329 *pis = dcmp(a, b); 330 331 double_t sa; 332 double_t sb; 333 334 sa.val = a; 335 sb.val = b; 336 337 if (is_double_lt(sa.data, sb.data)) 286 338 *piss = -1; 287 else if (is_ float_gt(a, b) == 1)339 else if (is_double_gt(sa.data, sb.data)) 288 340 *piss = 1; 289 else if (is_ float_eq(a, b) == 0)341 else if (is_double_eq(sa.data, sb.data)) 290 342 *piss = 0; 291 343 else … … 293 345 } 294 346 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 347 const char *test_softfloat1(void) 341 348 { 342 bool err = false;349 const char *err = NULL; 343 350 344 351 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 err = "Float addition failed"; 353 TPRINTF("%s\n", err); 352 354 } 353 355 354 356 if (!test_template_binary(float_template_binary, float_mul_operator)) { 355 err = true;356 TPRINTF("%s\n", "Float multiplication failed");357 err = "Float multiplication failed"; 358 TPRINTF("%s\n", err); 357 359 } 358 360 359 361 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"); 362 err = "Float division failed"; 363 TPRINTF("%s\n", err); 367 364 } 368 365 369 366 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"); 367 err = "Double addition failed"; 368 TPRINTF("%s\n", err); 377 369 } 378 370 379 371 if (!test_template_binary(double_template_binary, double_mul_operator)) { 380 err = true;381 TPRINTF("%s\n", "Double multiplication failed");372 err = "Double multiplication failed"; 373 TPRINTF("%s\n", err); 382 374 } 383 375 384 376 if (!test_template_binary(double_template_binary, double_div_operator)) { 385 err = true;386 TPRINTF("%s\n", "Double division failed");377 err = "Double division failed"; 378 TPRINTF("%s\n", err); 387 379 } 388 380 389 381 if (!test_template_binary(double_compare_template, double_cmp_operator)) { 390 err = true;391 TPRINTF("%s\n", "Double comparison failed");382 err = "Double comparison failed"; 383 TPRINTF("%s\n", err); 392 384 } 393 385 394 386 if (!test_template_unary(uint_to_double_template, 395 387 uint_to_double_operator)) { 396 err = true;397 TPRINTF("%s\n", "Conversion from unsigned int to double failed");388 err = "Conversion from unsigned int to double failed"; 389 TPRINTF("%s\n", err); 398 390 } 399 391 400 392 if (!test_template_unary(double_to_uint_template, 401 393 double_to_uint_operator)) { 402 err = true;403 TPRINTF("%s\n", "Conversion from double to unsigned int failed");394 err = "Conversion from double to unsigned int failed"; 395 TPRINTF("%s\n", err); 404 396 } 405 397 406 398 if (!test_template_unary(double_to_uint_template, 407 399 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 } 400 err = "Conversion from double to signed int failed"; 401 TPRINTF("%s\n", err); 402 } 403 404 return err; 405 }
Note:
See TracChangeset
for help on using the changeset viewer.
