testit.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "soft-fp.h"
  5. #include "single.h"
  6. #include "double.h"
  7. #include <fpu_control.h>
  8. /*======================================================================*/
  9. /* declarations for the functions we are testing */
  10. double __adddf3(double, double);
  11. double __subdf3(double, double);
  12. double __muldf3(double, double);
  13. double __divdf3(double, double);
  14. double __negdf2(double);
  15. double __sqrtdf2(double);
  16. double __negdf3(double a, double dummy) { return __negdf2(a); }
  17. double __sqrtdf3(double a, double dummy) { return __sqrtdf2(a); }
  18. float __addsf3(float, float);
  19. float __subsf3(float, float);
  20. float __mulsf3(float, float);
  21. float __divsf3(float, float);
  22. float __negsf2(float);
  23. float __sqrtsf2(float);
  24. float __negsf3(float a, float dummy) { return __negsf2(a); }
  25. float __sqrtsf3(float a, float dummy) { return __sqrtsf2(a); }
  26. int __fixdfsi(double);
  27. int __fixsfsi(float);
  28. double __floatsidf(int);
  29. float __floatsisf(int);
  30. double __extendsfdf2(float);
  31. float __truncdfsf2(double);
  32. int __eqdf2(double, double);
  33. int __nedf2(double, double);
  34. int __gtdf2(double, double);
  35. int __gedf2(double, double);
  36. int __ltdf2(double, double);
  37. int __ledf2(double, double);
  38. int __eqsf2(float, float);
  39. int __nesf2(float, float);
  40. int __gtsf2(float, float);
  41. int __gesf2(float, float);
  42. int __ltsf2(float, float);
  43. int __lesf2(float, float);
  44. /*======================================================================*/
  45. /* definitions for functions we are checking against */
  46. double r_adddf3(double a, double b) { return a + b; }
  47. double r_subdf3(double a, double b) { return a - b; }
  48. double r_muldf3(double a, double b) { return a * b; }
  49. double r_divdf3(double a, double b) { return a / b; }
  50. double r_negdf3(double a, double b) { return -a; }
  51. double sqrt(double x);
  52. double r_sqrtdf3(double a, double b) { return sqrt(a); }
  53. float r_addsf3(float a, float b) { return a + b; }
  54. float r_subsf3(float a, float b) { return a - b; }
  55. float r_mulsf3(float a, float b) { return a * b; }
  56. float r_divsf3(float a, float b) { return a / b; }
  57. float r_negsf3(float a, float b) { return -a; }
  58. float sqrtf(float x);
  59. float r_sqrtsf3(float a, float b) { return sqrtf(a); }
  60. int r_fixdfsi(double a) { return (int)a; }
  61. int r_fixsfsi(float a) { return (int)a; }
  62. double r_floatsidf(int a) { return (double)a; }
  63. float r_floatsisf(int a) { return (float)a; }
  64. double r_extendsfdf2(float a) { return (double)a; }
  65. float r_truncdfsf2(double a) { return (float)a; }
  66. int r_eqdf2(double a, double b) { return !(a == b); }
  67. int r_nedf2(double a, double b) { return a != b; }
  68. int r_gtdf2(double a, double b) { return a > b; }
  69. int r_gedf2(double a, double b) { return (a >= b) - 1; }
  70. int r_ltdf2(double a, double b) { return -(a < b); }
  71. int r_ledf2(double a, double b) { return 1 - (a <= b); }
  72. int r_eqsf2(float a, float b) { return !(a == b); }
  73. int r_nesf2(float a, float b) { return a != b; }
  74. int r_gtsf2(float a, float b) { return a > b; }
  75. int r_gesf2(float a, float b) { return (a >= b) - 1; }
  76. int r_ltsf2(float a, float b) { return -(a < b); }
  77. int r_lesf2(float a, float b) { return 1 - (a <= b); }
  78. /*======================================================================*/
  79. void print_float(float x)
  80. {
  81. union _FP_UNION_S ux;
  82. ux.flt = x;
  83. printf("%-20.8e %X %02X %06lX",
  84. x, ux.bits.sign, ux.bits.exp, (unsigned long)ux.bits.frac);
  85. }
  86. void print_double(double x)
  87. {
  88. union _FP_UNION_D ux;
  89. ux.flt = x;
  90. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  91. printf("%-30.18e %X %04X %06lX%08lX",
  92. x, ux.bits.sign, ux.bits.exp,
  93. (unsigned long)ux.bits.frac1, (unsigned long)ux.bits.frac0);
  94. #else
  95. printf("%-30.18e %X %04X %014lX",
  96. x, ux.bits.sign, ux.bits.exp,
  97. (unsigned long)ux.bits.frac);
  98. #endif
  99. }
  100. float rand_float(void)
  101. {
  102. union {
  103. union _FP_UNION_S u;
  104. int i;
  105. } u;
  106. u.i = lrand48() << 1;
  107. if (u.u.bits.exp == _FP_EXPMAX_S)
  108. u.u.bits.exp--;
  109. else if (u.u.bits.exp == 0 && u.u.bits.frac != 0)
  110. u.u.bits.exp++;
  111. return u.u.flt;
  112. }
  113. double rand_double(void)
  114. {
  115. union {
  116. union _FP_UNION_D u;
  117. int i[2];
  118. } u;
  119. u.i[0] = lrand48() << 1;
  120. u.i[1] = lrand48() << 1;
  121. if (u.u.bits.exp == _FP_EXPMAX_D)
  122. u.u.bits.exp--;
  123. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  124. else if (u.u.bits.exp == 0 && !(u.u.bits.frac0 == 0 && u.u.bits.frac1 == 0))
  125. u.u.bits.exp++;
  126. #else
  127. else if (u.u.bits.exp == 0 && u.u.bits.frac != 0)
  128. u.u.bits.exp++;
  129. #endif
  130. return u.u.flt;
  131. }
  132. #define NSPECIALS 10
  133. float gen_special_float(int i)
  134. {
  135. FP_DECL_EX;
  136. FP_DECL_S(X);
  137. float x;
  138. switch (i & ~1)
  139. {
  140. case 0:
  141. X_c = FP_CLS_NAN; X_f = 0x1234;
  142. break;
  143. case 2:
  144. X_c = FP_CLS_NAN; X_f = 0x1;
  145. break;
  146. case 4:
  147. X_c = FP_CLS_INF;
  148. break;
  149. case 6:
  150. X_c = FP_CLS_ZERO;
  151. break;
  152. case 8:
  153. X_c = FP_CLS_NORMAL; X_e = 0;
  154. X_f = 0x4321;
  155. break;
  156. }
  157. X_s = (i & 1);
  158. FP_PACK_S(x, X);
  159. return x;
  160. }
  161. double gen_special_double(int i)
  162. {
  163. FP_DECL_EX;
  164. FP_DECL_D(X);
  165. double x;
  166. switch (i & ~1)
  167. {
  168. case 0:
  169. X_c = FP_CLS_NAN;
  170. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  171. __FP_FRAC_SET_2(X, _FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D, 0x1234);
  172. #else
  173. _FP_FRAC_SET_1(X, (_FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D) | 0x1234);
  174. #endif
  175. break;
  176. case 2:
  177. X_c = FP_CLS_NAN;
  178. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  179. __FP_FRAC_SET_2(X, _FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D, 0x1);
  180. #else
  181. _FP_FRAC_SET_1(X, (_FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D) | 0x1);
  182. #endif
  183. break;
  184. case 4:
  185. X_c = FP_CLS_INF;
  186. break;
  187. case 6:
  188. X_c = FP_CLS_ZERO;
  189. break;
  190. case 8:
  191. X_c = FP_CLS_NORMAL; X_e = 0;
  192. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  193. __FP_FRAC_SET_2(X, 0, 0x87654321);
  194. #else
  195. _FP_FRAC_SET_1(X, 0x87654321);
  196. #endif
  197. break;
  198. }
  199. X_s = (i & 1);
  200. FP_PACK_D(x, X);
  201. return x;
  202. }
  203. float build_float(const char *s, const char *e, const char *f)
  204. {
  205. union _FP_UNION_S u;
  206. u.bits.sign = strtoul(s, 0, 16);
  207. u.bits.exp = strtoul(e, 0, 16);
  208. u.bits.frac = strtoul(f, 0, 16);
  209. return u.flt;
  210. }
  211. double build_double(const char *s, const char *e, const char *f)
  212. {
  213. union _FP_UNION_D u;
  214. u.bits.sign = strtoul(s, 0, 16);
  215. u.bits.exp = strtoul(e, 0, 16);
  216. #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
  217. {
  218. size_t len = strlen(f)+1;
  219. char *dup = memcpy(alloca(len), f, len);
  220. char *low = dup + len - _FP_W_TYPE_SIZE/4 - 1;
  221. u.bits.frac0 = strtoul(low, 0, 16);
  222. *low = 0;
  223. u.bits.frac1 = strtoul(dup, 0, 16);
  224. }
  225. #else
  226. u.bits.frac = strtoul(f, 0, 16);
  227. #endif
  228. return u.flt;
  229. }
  230. /*======================================================================*/
  231. fpu_control_t fcw0, fcw1;
  232. void test_float_arith(float (*tf)(float, float),
  233. float (*rf)(float, float),
  234. float x, float y)
  235. {
  236. float tr, rr;
  237. rr = (*rf)(x, y);
  238. tr = (*tf)(x, y);
  239. if (memcmp(&tr, &rr, sizeof(float)) != 0)
  240. {
  241. fputs("error:\n\tx = ", stdout); print_float(x);
  242. fputs("\n\ty = ", stdout); print_float(y);
  243. fputs("\n\ttrue = ", stdout); print_float(rr);
  244. fputs("\n\tfalse = ", stdout); print_float(tr);
  245. putchar('\n');
  246. }
  247. }
  248. void test_double_arith(double (*tf)(double, double),
  249. double (*rf)(double, double),
  250. double x, double y)
  251. {
  252. double tr, rr;
  253. #ifdef __i386__
  254. /* Don't worry. Even this does not make it error free
  255. on ia32. If the result is denormal, it will not
  256. honour the double precision and generate bad results
  257. anyway. On the other side, who wants to use ia32
  258. for IEEE math? I don't. */
  259. _FPU_GETCW(fcw0);
  260. fcw1 = ((fcw0 & ~_FPU_EXTENDED) | _FPU_DOUBLE);
  261. _FPU_SETCW(fcw1);
  262. #endif
  263. rr = (*rf)(x, y);
  264. #ifdef __i386__
  265. _FPU_SETCW(fcw0);
  266. #endif
  267. tr = (*tf)(x, y);
  268. if (memcmp(&tr, &rr, sizeof(double)) != 0)
  269. {
  270. fputs("error:\n\tx = ", stdout); print_double(x);
  271. fputs("\n\ty = ", stdout); print_double(y);
  272. fputs("\n\ttrue = ", stdout); print_double(rr);
  273. fputs("\n\tfalse = ", stdout); print_double(tr);
  274. putchar('\n');
  275. }
  276. }
  277. void test_float_double_conv(float x)
  278. {
  279. double tr, rr;
  280. rr = r_extendsfdf2(x);
  281. tr = __extendsfdf2(x);
  282. if (memcmp(&tr, &rr, sizeof(double)) != 0)
  283. {
  284. fputs("error:\n\tx = ", stdout); print_float(x);
  285. fputs("\n\ttrue = ", stdout); print_double(rr);
  286. fputs("\n\tfalse = ", stdout); print_double(tr);
  287. putchar('\n');
  288. }
  289. }
  290. void test_double_float_conv(double x)
  291. {
  292. float tr, rr;
  293. rr = r_truncdfsf2(x);
  294. tr = __truncdfsf2(x);
  295. if (memcmp(&tr, &rr, sizeof(float)) != 0)
  296. {
  297. fputs("error:\n\tx = ", stdout); print_double(x);
  298. fputs("\n\ttrue = ", stdout); print_float(rr);
  299. fputs("\n\tfalse = ", stdout); print_float(tr);
  300. putchar('\n');
  301. }
  302. }
  303. void test_int_float_conv(int x)
  304. {
  305. float tr, rr;
  306. rr = r_floatsisf(x);
  307. tr = __floatsisf(x);
  308. if (memcmp(&tr, &rr, sizeof(float)) != 0)
  309. {
  310. printf("error\n\tx = %d", x);
  311. fputs("\n\ttrue = ", stdout); print_float(rr);
  312. fputs("\n\tfalse = ", stdout); print_float(tr);
  313. putchar('\n');
  314. }
  315. }
  316. void test_int_double_conv(int x)
  317. {
  318. double tr, rr;
  319. rr = r_floatsidf(x);
  320. tr = __floatsidf(x);
  321. if (memcmp(&tr, &rr, sizeof(double)) != 0)
  322. {
  323. printf("error\n\tx = %d", x);
  324. fputs("\n\ttrue = ", stdout); print_double(rr);
  325. fputs("\n\tfalse = ", stdout); print_double(tr);
  326. putchar('\n');
  327. }
  328. }
  329. void test_float_int_conv(float x)
  330. {
  331. int tr, rr;
  332. rr = r_fixsfsi(x);
  333. tr = __fixsfsi(x);
  334. if (rr != tr)
  335. {
  336. fputs("error:\n\tx = ", stdout); print_float(x);
  337. printf("\n\ttrue = %d\n\tfalse = %d\n", rr, tr);
  338. }
  339. }
  340. void test_double_int_conv(double x)
  341. {
  342. int tr, rr;
  343. rr = r_fixsfsi(x);
  344. tr = __fixsfsi(x);
  345. if (rr != tr)
  346. {
  347. fputs("error:\n\tx = ", stdout); print_double(x);
  348. printf("\n\ttrue = %d\n\tfalse = %d\n", rr, tr);
  349. }
  350. }
  351. int eq0(int x) { return x == 0; }
  352. int ne0(int x) { return x != 0; }
  353. int le0(int x) { return x <= 0; }
  354. int lt0(int x) { return x < 0; }
  355. int ge0(int x) { return x >= 0; }
  356. int gt0(int x) { return x > 0; }
  357. void test_float_cmp(int (*tf)(float, float),
  358. int (*rf)(float, float),
  359. int (*cmp0)(int),
  360. float x, float y)
  361. {
  362. int tr, rr;
  363. rr = (*rf)(x, y);
  364. tr = (*tf)(x, y);
  365. if (cmp0(rr) != cmp0(tr))
  366. {
  367. fputs("error:\n\tx = ", stdout); print_float(x);
  368. fputs("\n\ty = ", stdout); print_float(y);
  369. printf("\n\ttrue = %d\n\tfalse = %d\n", rr, tr);
  370. }
  371. }
  372. void test_double_cmp(int (*tf)(double, double),
  373. int (*rf)(double, double),
  374. int (*cmp0)(int),
  375. double x, double y)
  376. {
  377. int tr, rr;
  378. rr = (*rf)(x, y);
  379. tr = (*tf)(x, y);
  380. if (cmp0(rr) != cmp0(tr))
  381. {
  382. fputs("error:\n\tx = ", stdout); print_double(x);
  383. fputs("\n\ty = ", stdout); print_double(y);
  384. printf("\n\ttrue = %d\n\tfalse = %d\n", rr, tr);
  385. }
  386. }
  387. /*======================================================================*/
  388. int main(int ac, char **av)
  389. {
  390. #ifdef __alpha__
  391. __ieee_set_fp_control(0);
  392. #endif
  393. av++, ac--;
  394. switch (*(*av)++)
  395. {
  396. {
  397. float (*r)(float, float);
  398. float (*t)(float, float);
  399. do {
  400. case 'a': r = r_addsf3; t = __addsf3; break;
  401. case 's': r = r_subsf3; t = __subsf3; break;
  402. case 'm': r = r_mulsf3; t = __mulsf3; break;
  403. case 'd': r = r_divsf3; t = __divsf3; break;
  404. case 'r': r = r_sqrtsf3; t = __sqrtsf3; break;
  405. case 'j': r = r_negsf3; t = __negsf3; break;
  406. } while (0);
  407. switch (*(*av)++)
  408. {
  409. case 'n':
  410. {
  411. int count = (ac > 1 ? atoi(av[1]) : 100);
  412. while (count--)
  413. test_float_arith(t, r, rand_float(), rand_float());
  414. }
  415. break;
  416. case 's':
  417. {
  418. int i, j;
  419. for (i = 0; i < NSPECIALS; i++)
  420. for (j = 0; j < NSPECIALS; j++)
  421. test_float_arith(t, r, gen_special_float(i),
  422. gen_special_float(j));
  423. }
  424. break;
  425. case 0:
  426. if (ac < 7) abort();
  427. test_float_arith(t, r, build_float(av[1], av[2], av[3]),
  428. build_float(av[4], av[5], av[6]));
  429. break;
  430. }
  431. }
  432. break;
  433. {
  434. double (*r)(double, double);
  435. double (*t)(double, double);
  436. do {
  437. case 'A': r = r_adddf3; t = __adddf3; break;
  438. case 'S': r = r_subdf3; t = __subdf3; break;
  439. case 'M': r = r_muldf3; t = __muldf3; break;
  440. case 'D': r = r_divdf3; t = __divdf3; break;
  441. case 'R': r = r_sqrtdf3; t = __sqrtdf3; break;
  442. case 'J': r = r_negdf3; t = __negdf3; break;
  443. } while (0);
  444. switch (*(*av)++)
  445. {
  446. case 'n':
  447. {
  448. int count = (ac > 1 ? atoi(av[1]) : 100);
  449. while (count--)
  450. test_double_arith(t, r, rand_double(), rand_double());
  451. }
  452. break;
  453. case 's':
  454. {
  455. int i, j;
  456. for (i = 0; i < NSPECIALS; i++)
  457. for (j = 0; j < NSPECIALS; j++)
  458. test_double_arith(t, r, gen_special_double(i),
  459. gen_special_double(j));
  460. }
  461. break;
  462. case 0:
  463. if (ac < 7) abort();
  464. test_double_arith(t, r, build_double(av[1], av[2], av[3]),
  465. build_double(av[4], av[5], av[6]));
  466. break;
  467. }
  468. }
  469. break;
  470. case 'c':
  471. switch (*(*av)++)
  472. {
  473. case 'n':
  474. {
  475. int count = (ac > 1 ? atoi(av[1]) : 100);
  476. while (count--)
  477. test_float_double_conv(rand_float());
  478. }
  479. break;
  480. case 's':
  481. {
  482. int i;
  483. for (i = 0; i < NSPECIALS; i++)
  484. test_float_double_conv(gen_special_float(i));
  485. }
  486. break;
  487. case 0:
  488. if (ac < 4) abort();
  489. test_float_double_conv(build_float(av[1], av[2], av[3]));
  490. break;
  491. }
  492. break;
  493. case 'C':
  494. switch (*(*av)++)
  495. {
  496. case 'n':
  497. {
  498. int count = (ac > 1 ? atoi(av[1]) : 100);
  499. while (count--)
  500. test_double_float_conv(rand_double());
  501. }
  502. break;
  503. case 's':
  504. {
  505. int i;
  506. for (i = 0; i < NSPECIALS; i++)
  507. test_double_float_conv(gen_special_double(i));
  508. }
  509. break;
  510. case 0:
  511. if (ac < 4) abort();
  512. test_double_float_conv(build_double(av[1], av[2], av[3]));
  513. break;
  514. }
  515. break;
  516. case 'i':
  517. switch (*(*av)++)
  518. {
  519. case 'n':
  520. {
  521. int count = (ac > 1 ? atoi(av[1]) : 100);
  522. while (count--)
  523. test_int_float_conv(lrand48() << 1);
  524. }
  525. break;
  526. case 0:
  527. if (ac < 2) abort();
  528. test_int_float_conv(strtol(av[1], 0, 0));
  529. break;
  530. }
  531. break;
  532. case 'I':
  533. switch (*(*av)++)
  534. {
  535. case 'n':
  536. {
  537. int count = (ac > 1 ? atoi(av[1]) : 100);
  538. while (count--)
  539. test_int_double_conv(lrand48() << 1);
  540. }
  541. break;
  542. case 0:
  543. if (ac < 2) abort();
  544. test_int_double_conv(strtol(av[1], 0, 0));
  545. break;
  546. }
  547. break;
  548. case 'f':
  549. switch (*(*av)++)
  550. {
  551. case 'n':
  552. {
  553. int count = (ac > 1 ? atoi(av[1]) : 100);
  554. while (count--)
  555. test_float_int_conv(rand_float());
  556. }
  557. break;
  558. case 's':
  559. {
  560. int i;
  561. for (i = 0; i < NSPECIALS; i++)
  562. test_float_int_conv(gen_special_float(i));
  563. }
  564. break;
  565. case 0:
  566. if (ac < 4) abort();
  567. test_float_int_conv(build_float(av[1], av[2], av[3]));
  568. break;
  569. }
  570. break;
  571. case 'F':
  572. switch (*(*av)++)
  573. {
  574. case 'n':
  575. {
  576. int count = (ac > 1 ? atoi(av[1]) : 100);
  577. while (count--)
  578. test_double_int_conv(rand_double());
  579. }
  580. break;
  581. case 's':
  582. {
  583. int i;
  584. for (i = 0; i < NSPECIALS; i++)
  585. test_double_int_conv(gen_special_double(i));
  586. }
  587. break;
  588. case 0:
  589. if (ac < 4) abort();
  590. test_double_int_conv(build_double(av[1], av[2], av[3]));
  591. break;
  592. }
  593. break;
  594. {
  595. int (*r)(float, float);
  596. int (*t)(float, float);
  597. int (*c)(int);
  598. do {
  599. case 'e': r = r_eqsf2; t = __eqsf2; c = eq0; break;
  600. case 'n': r = r_nesf2; t = __nesf2; c = ne0; break;
  601. case 'l':
  602. switch (*(*av)++)
  603. {
  604. case 'e': r = r_lesf2; t = __lesf2; c = le0; break;
  605. case 't': r = r_ltsf2; t = __ltsf2; c = lt0; break;
  606. }
  607. break;
  608. case 'g':
  609. switch (*(*av)++)
  610. {
  611. case 'e': r = r_gesf2; t = __gesf2; c = ge0; break;
  612. case 't': r = r_gtsf2; t = __gtsf2; c = gt0; break;
  613. }
  614. break;
  615. } while (0);
  616. switch (*(*av)++)
  617. {
  618. case 'n':
  619. {
  620. int count = (ac > 1 ? atoi(av[1]) : 100);
  621. while (count--)
  622. test_float_cmp(t, r, c, rand_float(), rand_float());
  623. }
  624. break;
  625. case 's':
  626. {
  627. int i, j;
  628. for (i = 0; i < NSPECIALS; i++)
  629. for (j = 0; j < NSPECIALS; j++)
  630. test_float_cmp(t, r, c, gen_special_float(i),
  631. gen_special_float(j));
  632. }
  633. break;
  634. case 0:
  635. if (ac < 7) abort();
  636. test_float_cmp(t, r, c, build_float(av[1], av[2], av[3]),
  637. build_float(av[4], av[5], av[6]));
  638. break;
  639. }
  640. }
  641. break;
  642. {
  643. int (*r)(double, double);
  644. int (*t)(double, double);
  645. int (*c)(int);
  646. do {
  647. case 'E': r = r_eqdf2; t = __eqdf2; c = eq0; break;
  648. case 'N': r = r_nedf2; t = __nedf2; c = ne0; break;
  649. case 'L':
  650. switch (*(*av)++)
  651. {
  652. case 'E': r = r_ledf2; t = __ledf2; c = le0; break;
  653. case 'T': r = r_ltdf2; t = __ltdf2; c = lt0; break;
  654. }
  655. break;
  656. case 'G':
  657. switch (*(*av)++)
  658. {
  659. case 'E': r = r_gedf2; t = __gedf2; c = ge0; break;
  660. case 'T': r = r_gtdf2; t = __gtdf2; c = gt0; break;
  661. }
  662. break;
  663. } while (0);
  664. switch (*(*av)++)
  665. {
  666. case 'n':
  667. {
  668. int count = (ac > 1 ? atoi(av[1]) : 100);
  669. while (count--)
  670. test_double_cmp(t, r, c, rand_double(), rand_double());
  671. }
  672. break;
  673. case 's':
  674. {
  675. int i, j;
  676. for (i = 0; i < NSPECIALS; i++)
  677. for (j = 0; j < NSPECIALS; j++)
  678. test_double_cmp(t, r, c, gen_special_double(i),
  679. gen_special_double(j));
  680. }
  681. break;
  682. case 0:
  683. if (ac < 7) abort();
  684. test_double_cmp(t, r, c, build_double(av[1], av[2], av[3]),
  685. build_double(av[4], av[5], av[6]));
  686. break;
  687. }
  688. }
  689. break;
  690. default:
  691. abort();
  692. }
  693. return 0;
  694. }