libm-test-driver.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  1. /* Support code for testing libm functions (driver).
  2. Copyright (C) 1997-2019 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. The GNU C Library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with the GNU C Library; if not, see
  14. <http://www.gnu.org/licenses/>. */
  15. #include "libm-test-support.h"
  16. #include <math-tests-arch.h>
  17. /* Flags set by the including file. */
  18. const int flag_test_errno = TEST_ERRNO;
  19. const int flag_test_exceptions = TEST_EXCEPTIONS;
  20. const int flag_test_finite = TEST_FINITE;
  21. const int flag_test_inline = TEST_INLINE;
  22. const int flag_test_mathvec = TEST_MATHVEC;
  23. #if TEST_NARROW
  24. const int snan_tests_arg = SNAN_TESTS (ARG_FLOAT);
  25. #else
  26. const int snan_tests_arg = SNAN_TESTS (FLOAT);
  27. #endif
  28. #define STRX(x) #x
  29. #define STR(x) STRX (x)
  30. #define STR_FLOAT STR (FLOAT)
  31. #define STR_ARG_FLOAT STR (ARG_FLOAT)
  32. #define STR_VEC_LEN STR (VEC_LEN)
  33. /* Informal description of the functions being tested. */
  34. #if TEST_MATHVEC
  35. # define TEST_MSG "testing " STR_FLOAT " (vector length " STR_VEC_LEN ")\n"
  36. #elif TEST_INLINE
  37. # define TEST_MSG "testing " STR_FLOAT " (inline functions)\n"
  38. #elif TEST_FINITE
  39. # define TEST_MSG "testing " STR_FLOAT " (finite-math-only)\n"
  40. #elif TEST_NARROW
  41. # define TEST_MSG "testing " STR_FLOAT " (argument " STR_ARG_FLOAT ")\n"
  42. #else
  43. # define TEST_MSG "testing " STR_FLOAT " (without inline functions)\n"
  44. #endif
  45. const char test_msg[] = TEST_MSG;
  46. /* Allow platforms without all rounding modes to test properly,
  47. assuming they provide an __FE_UNDEFINED in <bits/fenv.h> which
  48. causes fesetround() to return failure. */
  49. #ifndef FE_TONEAREST
  50. # define FE_TONEAREST __FE_UNDEFINED
  51. #endif
  52. #ifndef FE_TOWARDZERO
  53. # define FE_TOWARDZERO __FE_UNDEFINED
  54. #endif
  55. #ifndef FE_UPWARD
  56. # define FE_UPWARD __FE_UNDEFINED
  57. #endif
  58. #ifndef FE_DOWNWARD
  59. # define FE_DOWNWARD __FE_UNDEFINED
  60. #endif
  61. #define TEST_NAN_PAYLOAD_CANONICALIZE (SNAN_TESTS_PRESERVE_PAYLOAD \
  62. ? TEST_NAN_PAYLOAD \
  63. : 0)
  64. #if TEST_INLINE
  65. const char qtype_str[] = "i" TYPE_STR;
  66. #else
  67. const char qtype_str[] = TYPE_STR;
  68. #endif
  69. /* Various constants derived from pi. We must supply them precalculated for
  70. accuracy. They are written as a series of postfix operations to keep
  71. them concise yet somewhat readable. */
  72. /* (pi * 3) / 4 */
  73. #define lit_pi_3_m_4_d LIT (2.356194490192344928846982537459627163)
  74. /* pi * 3 / (4 * ln(10)) */
  75. #define lit_pi_3_m_4_ln10_m_d LIT (1.023282265381381010614337719073516828)
  76. /* pi / (2 * ln(10)) */
  77. #define lit_pi_2_ln10_m_d LIT (0.682188176920920673742891812715677885)
  78. /* pi / (4 * ln(10)) */
  79. #define lit_pi_4_ln10_m_d LIT (0.341094088460460336871445906357838943)
  80. /* pi / ln(10) */
  81. #define lit_pi_ln10_d LIT (1.364376353841841347485783625431355770)
  82. /* pi / 2 */
  83. #define lit_pi_2_d LITM (M_PI_2)
  84. /* pi / 4 */
  85. #define lit_pi_4_d LITM (M_PI_4)
  86. /* pi */
  87. #define lit_pi LITM (M_PI)
  88. /* Other useful constants. */
  89. /* e */
  90. #define lit_e LITM (M_E)
  91. #define plus_zero LIT (0.0)
  92. #define minus_zero LIT (-0.0)
  93. #define plus_infty FUNC (__builtin_inf) ()
  94. #define minus_infty -(FUNC (__builtin_inf) ())
  95. #define qnan_value_pl(S) FUNC (__builtin_nan) (S)
  96. #define qnan_value qnan_value_pl ("")
  97. #define snan_value_pl(S) FUNC (__builtin_nans) (S)
  98. #define snan_value snan_value_pl ("")
  99. #define max_value TYPE_MAX
  100. #define min_value TYPE_MIN
  101. #define min_subnorm_value TYPE_TRUE_MIN
  102. #define arg_plus_zero ARG_LIT (0.0)
  103. #define arg_minus_zero ARG_LIT (-0.0)
  104. #define arg_plus_infty ARG_FUNC (__builtin_inf) ()
  105. #define arg_minus_infty -(ARG_FUNC (__builtin_inf) ())
  106. #define arg_qnan_value_pl(S) ARG_FUNC (__builtin_nan) (S)
  107. #define arg_qnan_value arg_qnan_value_pl ("")
  108. #define arg_snan_value_pl(S) ARG_FUNC (__builtin_nans) (S)
  109. #define arg_snan_value arg_snan_value_pl ("")
  110. #define arg_max_value ARG_TYPE_MAX
  111. #define arg_min_value ARG_TYPE_MIN
  112. #define arg_min_subnorm_value ARG_TYPE_TRUE_MIN
  113. /* For nexttoward tests. */
  114. #define snan_value_ld __builtin_nansl ("")
  115. /* Structures for each kind of test. */
  116. /* Used for both RUN_TEST_LOOP_f_f and RUN_TEST_LOOP_fp_f. */
  117. struct test_f_f_data
  118. {
  119. const char *arg_str;
  120. FLOAT arg;
  121. struct
  122. {
  123. FLOAT expected;
  124. int exceptions;
  125. } rd, rn, rz, ru;
  126. };
  127. struct test_ff_f_data
  128. {
  129. const char *arg_str;
  130. FLOAT arg1, arg2;
  131. struct
  132. {
  133. FLOAT expected;
  134. int exceptions;
  135. } rd, rn, rz, ru;
  136. };
  137. /* Strictly speaking, a j type argument is one gen-libm-test.py will not
  138. attempt to muck with. For now, it is only used to prevent it from
  139. mucking up an explicitly long double argument. */
  140. struct test_fj_f_data
  141. {
  142. const char *arg_str;
  143. FLOAT arg1;
  144. long double arg2;
  145. struct
  146. {
  147. FLOAT expected;
  148. int exceptions;
  149. } rd, rn, rz, ru;
  150. };
  151. #ifdef ARG_FLOAT
  152. struct test_aa_f_data
  153. {
  154. const char *arg_str;
  155. ARG_FLOAT arg1, arg2;
  156. struct
  157. {
  158. FLOAT expected;
  159. int exceptions;
  160. } rd, rn, rz, ru;
  161. };
  162. #endif
  163. struct test_fi_f_data
  164. {
  165. const char *arg_str;
  166. FLOAT arg1;
  167. int arg2;
  168. struct
  169. {
  170. FLOAT expected;
  171. int exceptions;
  172. } rd, rn, rz, ru;
  173. };
  174. struct test_fl_f_data
  175. {
  176. const char *arg_str;
  177. FLOAT arg1;
  178. long int arg2;
  179. struct
  180. {
  181. FLOAT expected;
  182. int exceptions;
  183. } rd, rn, rz, ru;
  184. };
  185. struct test_if_f_data
  186. {
  187. const char *arg_str;
  188. int arg1;
  189. FLOAT arg2;
  190. struct
  191. {
  192. FLOAT expected;
  193. int exceptions;
  194. } rd, rn, rz, ru;
  195. };
  196. struct test_fff_f_data
  197. {
  198. const char *arg_str;
  199. FLOAT arg1, arg2, arg3;
  200. struct
  201. {
  202. FLOAT expected;
  203. int exceptions;
  204. } rd, rn, rz, ru;
  205. };
  206. struct test_fiu_M_data
  207. {
  208. const char *arg_str;
  209. FLOAT arg1;
  210. int arg2;
  211. unsigned int arg3;
  212. struct
  213. {
  214. intmax_t expected;
  215. int exceptions;
  216. } rd, rn, rz, ru;
  217. };
  218. struct test_fiu_U_data
  219. {
  220. const char *arg_str;
  221. FLOAT arg1;
  222. int arg2;
  223. unsigned int arg3;
  224. struct
  225. {
  226. uintmax_t expected;
  227. int exceptions;
  228. } rd, rn, rz, ru;
  229. };
  230. struct test_c_f_data
  231. {
  232. const char *arg_str;
  233. FLOAT argr, argc;
  234. struct
  235. {
  236. FLOAT expected;
  237. int exceptions;
  238. } rd, rn, rz, ru;
  239. };
  240. /* Used for both RUN_TEST_LOOP_f_f1 and RUN_TEST_LOOP_fI_f1. */
  241. struct test_f_f1_data
  242. {
  243. const char *arg_str;
  244. FLOAT arg;
  245. struct
  246. {
  247. FLOAT expected;
  248. int exceptions;
  249. int extra_test;
  250. int extra_expected;
  251. } rd, rn, rz, ru;
  252. };
  253. struct test_fF_f1_data
  254. {
  255. const char *arg_str;
  256. FLOAT arg;
  257. struct
  258. {
  259. FLOAT expected;
  260. int exceptions;
  261. int extra_test;
  262. FLOAT extra_expected;
  263. } rd, rn, rz, ru;
  264. };
  265. struct test_ffI_f1_data
  266. {
  267. const char *arg_str;
  268. FLOAT arg1, arg2;
  269. struct
  270. {
  271. FLOAT expected;
  272. int exceptions;
  273. int extra_test;
  274. int extra_expected;
  275. } rd, rn, rz, ru;
  276. };
  277. struct test_c_c_data
  278. {
  279. const char *arg_str;
  280. FLOAT argr, argc;
  281. struct
  282. {
  283. FLOAT expr, expc;
  284. int exceptions;
  285. } rd, rn, rz, ru;
  286. };
  287. struct test_cc_c_data
  288. {
  289. const char *arg_str;
  290. FLOAT arg1r, arg1c, arg2r, arg2c;
  291. struct
  292. {
  293. FLOAT expr, expc;
  294. int exceptions;
  295. } rd, rn, rz, ru;
  296. };
  297. /* Used for all of RUN_TEST_LOOP_f_i, RUN_TEST_LOOP_f_i_tg,
  298. RUN_TEST_LOOP_f_b and RUN_TEST_LOOP_f_b_tg. */
  299. struct test_f_i_data
  300. {
  301. const char *arg_str;
  302. FLOAT arg;
  303. struct
  304. {
  305. int expected;
  306. int exceptions;
  307. } rd, rn, rz, ru;
  308. };
  309. /* Used for both RUN_TEST_LOOP_ff_b and RUN_TEST_LOOP_ff_i_tg. */
  310. struct test_ff_i_data
  311. {
  312. const char *arg_str;
  313. FLOAT arg1, arg2;
  314. struct
  315. {
  316. int expected;
  317. int exceptions;
  318. } rd, rn, rz, ru;
  319. };
  320. struct test_f_l_data
  321. {
  322. const char *arg_str;
  323. FLOAT arg;
  324. struct
  325. {
  326. long int expected;
  327. int exceptions;
  328. } rd, rn, rz, ru;
  329. };
  330. struct test_f_L_data
  331. {
  332. const char *arg_str;
  333. FLOAT arg;
  334. struct
  335. {
  336. long long int expected;
  337. int exceptions;
  338. } rd, rn, rz, ru;
  339. };
  340. struct test_fFF_11_data
  341. {
  342. const char *arg_str;
  343. FLOAT arg;
  344. struct
  345. {
  346. int exceptions;
  347. int extra1_test;
  348. FLOAT extra1_expected;
  349. int extra2_test;
  350. FLOAT extra2_expected;
  351. } rd, rn, rz, ru;
  352. };
  353. /* Used for both RUN_TEST_LOOP_Ff_b1 and RUN_TEST_LOOP_Ffp_b1. */
  354. struct test_Ff_b1_data
  355. {
  356. const char *arg_str;
  357. FLOAT arg;
  358. struct
  359. {
  360. int expected;
  361. int exceptions;
  362. int extra_test;
  363. FLOAT extra_expected;
  364. } rd, rn, rz, ru;
  365. };
  366. /* Set the rounding mode, or restore the saved value. */
  367. #define IF_ROUND_INIT_ /* Empty. */
  368. #define IF_ROUND_INIT_FE_DOWNWARD \
  369. int save_round_mode = fegetround (); \
  370. if (ROUNDING_TESTS (FLOAT, FE_DOWNWARD) \
  371. && !TEST_MATHVEC \
  372. && fesetround (FE_DOWNWARD) == 0)
  373. #define IF_ROUND_INIT_FE_TONEAREST \
  374. int save_round_mode = fegetround (); \
  375. if (ROUNDING_TESTS (FLOAT, FE_TONEAREST) \
  376. && fesetround (FE_TONEAREST) == 0)
  377. #define IF_ROUND_INIT_FE_TOWARDZERO \
  378. int save_round_mode = fegetround (); \
  379. if (ROUNDING_TESTS (FLOAT, FE_TOWARDZERO) \
  380. && !TEST_MATHVEC \
  381. && fesetround (FE_TOWARDZERO) == 0)
  382. #define IF_ROUND_INIT_FE_UPWARD \
  383. int save_round_mode = fegetround (); \
  384. if (ROUNDING_TESTS (FLOAT, FE_UPWARD) \
  385. && !TEST_MATHVEC \
  386. && fesetround (FE_UPWARD) == 0)
  387. #define ROUND_RESTORE_ /* Empty. */
  388. #define ROUND_RESTORE_FE_DOWNWARD \
  389. fesetround (save_round_mode)
  390. #define ROUND_RESTORE_FE_TONEAREST \
  391. fesetround (save_round_mode)
  392. #define ROUND_RESTORE_FE_TOWARDZERO \
  393. fesetround (save_round_mode)
  394. #define ROUND_RESTORE_FE_UPWARD \
  395. fesetround (save_round_mode)
  396. /* Field name to use for a given rounding mode. */
  397. #define RM_ rn
  398. #define RM_FE_DOWNWARD rd
  399. #define RM_FE_TONEAREST rn
  400. #define RM_FE_TOWARDZERO rz
  401. #define RM_FE_UPWARD ru
  402. /* Common setup for an individual test. */
  403. #define COMMON_TEST_SETUP(ARG_STR) \
  404. char *test_name; \
  405. if (asprintf (&test_name, "%s (%s)", this_func, (ARG_STR)) == -1) \
  406. abort ()
  407. /* Setup for a test with an extra output. */
  408. #define EXTRA_OUTPUT_TEST_SETUP(ARG_STR, N) \
  409. char *extra##N##_name; \
  410. if (asprintf (&extra##N##_name, "%s (%s) extra output " #N, \
  411. this_func, (ARG_STR)) == -1) \
  412. abort ()
  413. /* Common cleanup after an individual test. */
  414. #define COMMON_TEST_CLEANUP \
  415. free (test_name)
  416. /* Cleanup for a test with an extra output. */
  417. #define EXTRA_OUTPUT_TEST_CLEANUP(N) \
  418. free (extra##N##_name)
  419. /* Run an individual test, including any required setup and checking
  420. of results, or loop over all tests in an array. */
  421. #define RUN_TEST_f_f(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  422. EXCEPTIONS) \
  423. do \
  424. if (enable_test (EXCEPTIONS)) \
  425. { \
  426. COMMON_TEST_SETUP (ARG_STR); \
  427. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG), \
  428. EXPECTED, EXCEPTIONS); \
  429. COMMON_TEST_CLEANUP; \
  430. } \
  431. while (0)
  432. #define RUN_TEST_LOOP_f_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  433. IF_ROUND_INIT_ ## ROUNDING_MODE \
  434. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  435. RUN_TEST_f_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  436. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  437. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  438. ROUND_RESTORE_ ## ROUNDING_MODE
  439. #define RUN_TEST_fp_f(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  440. EXCEPTIONS) \
  441. do \
  442. if (enable_test (EXCEPTIONS)) \
  443. { \
  444. COMMON_TEST_SETUP (ARG_STR); \
  445. check_float (test_name, FUNC_TEST (FUNC_NAME) (&(ARG)), \
  446. EXPECTED, EXCEPTIONS); \
  447. COMMON_TEST_CLEANUP; \
  448. } \
  449. while (0)
  450. #define RUN_TEST_LOOP_fp_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  451. IF_ROUND_INIT_ ## ROUNDING_MODE \
  452. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  453. RUN_TEST_fp_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  454. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  455. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  456. ROUND_RESTORE_ ## ROUNDING_MODE
  457. #define RUN_TEST_2_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
  458. EXCEPTIONS) \
  459. do \
  460. if (enable_test (EXCEPTIONS)) \
  461. { \
  462. COMMON_TEST_SETUP (ARG_STR); \
  463. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2), \
  464. EXPECTED, EXCEPTIONS); \
  465. COMMON_TEST_CLEANUP; \
  466. } \
  467. while (0)
  468. #define RUN_TEST_LOOP_2_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  469. IF_ROUND_INIT_ ## ROUNDING_MODE \
  470. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  471. RUN_TEST_2_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
  472. (ARRAY)[i].arg2, \
  473. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  474. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  475. ROUND_RESTORE_ ## ROUNDING_MODE
  476. #define RUN_TEST_ff_f RUN_TEST_2_f
  477. #define RUN_TEST_LOOP_ff_f RUN_TEST_LOOP_2_f
  478. #define RUN_TEST_LOOP_fj_f RUN_TEST_LOOP_2_f
  479. #define RUN_TEST_LOOP_aa_f RUN_TEST_LOOP_2_f
  480. #define RUN_TEST_fi_f RUN_TEST_2_f
  481. #define RUN_TEST_LOOP_fi_f RUN_TEST_LOOP_2_f
  482. #define RUN_TEST_fl_f RUN_TEST_2_f
  483. #define RUN_TEST_LOOP_fl_f RUN_TEST_LOOP_2_f
  484. #define RUN_TEST_if_f RUN_TEST_2_f
  485. #define RUN_TEST_LOOP_if_f RUN_TEST_LOOP_2_f
  486. #define RUN_TEST_fff_f(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
  487. EXPECTED, EXCEPTIONS) \
  488. do \
  489. if (enable_test (EXCEPTIONS)) \
  490. { \
  491. COMMON_TEST_SETUP (ARG_STR); \
  492. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
  493. EXPECTED, EXCEPTIONS); \
  494. COMMON_TEST_CLEANUP; \
  495. } \
  496. while (0)
  497. #define RUN_TEST_LOOP_fff_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  498. IF_ROUND_INIT_ ## ROUNDING_MODE \
  499. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  500. RUN_TEST_fff_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
  501. (ARRAY)[i].arg2, (ARRAY)[i].arg3, \
  502. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  503. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  504. ROUND_RESTORE_ ## ROUNDING_MODE
  505. #define RUN_TEST_fiu_M(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
  506. EXPECTED, EXCEPTIONS) \
  507. do \
  508. if (enable_test (EXCEPTIONS)) \
  509. { \
  510. COMMON_TEST_SETUP (ARG_STR); \
  511. check_intmax_t (test_name, \
  512. FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
  513. EXPECTED, EXCEPTIONS); \
  514. COMMON_TEST_CLEANUP; \
  515. } \
  516. while (0)
  517. #define RUN_TEST_LOOP_fiu_M(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  518. IF_ROUND_INIT_ ## ROUNDING_MODE \
  519. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  520. RUN_TEST_fiu_M ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
  521. (ARRAY)[i].arg2, (ARRAY)[i].arg3, \
  522. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  523. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  524. ROUND_RESTORE_ ## ROUNDING_MODE
  525. #define RUN_TEST_fiu_U(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
  526. EXPECTED, EXCEPTIONS) \
  527. do \
  528. if (enable_test (EXCEPTIONS)) \
  529. { \
  530. COMMON_TEST_SETUP (ARG_STR); \
  531. check_uintmax_t (test_name, \
  532. FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
  533. EXPECTED, EXCEPTIONS); \
  534. COMMON_TEST_CLEANUP; \
  535. } \
  536. while (0)
  537. #define RUN_TEST_LOOP_fiu_U(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  538. IF_ROUND_INIT_ ## ROUNDING_MODE \
  539. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  540. RUN_TEST_fiu_U ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
  541. (ARRAY)[i].arg2, (ARRAY)[i].arg3, \
  542. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  543. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  544. ROUND_RESTORE_ ## ROUNDING_MODE
  545. #define RUN_TEST_c_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
  546. EXCEPTIONS) \
  547. do \
  548. if (enable_test (EXCEPTIONS)) \
  549. { \
  550. COMMON_TEST_SETUP (ARG_STR); \
  551. check_float (test_name, \
  552. FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),\
  553. EXPECTED, EXCEPTIONS); \
  554. COMMON_TEST_CLEANUP; \
  555. } \
  556. while (0)
  557. #define RUN_TEST_LOOP_c_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  558. IF_ROUND_INIT_ ## ROUNDING_MODE \
  559. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  560. RUN_TEST_c_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr, \
  561. (ARRAY)[i].argc, \
  562. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  563. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  564. ROUND_RESTORE_ ## ROUNDING_MODE
  565. #define RUN_TEST_f_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  566. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  567. EXTRA_EXPECTED) \
  568. do \
  569. if (enable_test (EXCEPTIONS)) \
  570. { \
  571. COMMON_TEST_SETUP (ARG_STR); \
  572. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  573. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
  574. EXCEPTIONS); \
  575. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  576. if (EXTRA_TEST) \
  577. check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
  578. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  579. COMMON_TEST_CLEANUP; \
  580. } \
  581. while (0)
  582. #define RUN_TEST_LOOP_f_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
  583. IF_ROUND_INIT_ ## ROUNDING_MODE \
  584. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  585. RUN_TEST_f_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  586. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  587. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  588. EXTRA_VAR, \
  589. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  590. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  591. ROUND_RESTORE_ ## ROUNDING_MODE
  592. #define RUN_TEST_fF_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  593. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  594. EXTRA_EXPECTED) \
  595. do \
  596. if (enable_test (EXCEPTIONS)) \
  597. { \
  598. COMMON_TEST_SETUP (ARG_STR); \
  599. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  600. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA_VAR)), \
  601. EXPECTED, EXCEPTIONS); \
  602. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  603. if (EXTRA_TEST) \
  604. check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
  605. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  606. COMMON_TEST_CLEANUP; \
  607. } \
  608. while (0)
  609. #define RUN_TEST_LOOP_fF_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
  610. IF_ROUND_INIT_ ## ROUNDING_MODE \
  611. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  612. RUN_TEST_fF_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  613. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  614. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  615. EXTRA_VAR, \
  616. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  617. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  618. ROUND_RESTORE_ ## ROUNDING_MODE
  619. #define RUN_TEST_fI_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  620. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  621. EXTRA_EXPECTED) \
  622. do \
  623. if (enable_test (EXCEPTIONS)) \
  624. { \
  625. COMMON_TEST_SETUP (ARG_STR); \
  626. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  627. check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA_VAR)), \
  628. EXPECTED, EXCEPTIONS); \
  629. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  630. if (EXTRA_TEST) \
  631. check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
  632. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  633. COMMON_TEST_CLEANUP; \
  634. } \
  635. while (0)
  636. #define RUN_TEST_LOOP_fI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
  637. IF_ROUND_INIT_ ## ROUNDING_MODE \
  638. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  639. RUN_TEST_fI_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  640. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  641. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  642. EXTRA_VAR, \
  643. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  644. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  645. ROUND_RESTORE_ ## ROUNDING_MODE
  646. #define RUN_TEST_ffI_f1_mod8(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
  647. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  648. EXTRA_EXPECTED) \
  649. do \
  650. if (enable_test (EXCEPTIONS)) \
  651. { \
  652. COMMON_TEST_SETUP (ARG_STR); \
  653. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  654. check_float (test_name, \
  655. FUNC_TEST (FUNC_NAME) (ARG1, ARG2, &(EXTRA_VAR)), \
  656. EXPECTED, EXCEPTIONS); \
  657. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  658. if (EXTRA_TEST) \
  659. check_int (extra1_name, (EXTRA_VAR) % 8, EXTRA_EXPECTED, 0); \
  660. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  661. COMMON_TEST_CLEANUP; \
  662. } \
  663. while (0)
  664. #define RUN_TEST_LOOP_ffI_f1_mod8(FUNC_NAME, ARRAY, ROUNDING_MODE, \
  665. EXTRA_VAR) \
  666. IF_ROUND_INIT_ ## ROUNDING_MODE \
  667. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  668. RUN_TEST_ffI_f1_mod8 ((ARRAY)[i].arg_str, FUNC_NAME, \
  669. (ARRAY)[i].arg1, (ARRAY)[i].arg2, \
  670. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  671. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  672. EXTRA_VAR, \
  673. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  674. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  675. ROUND_RESTORE_ ## ROUNDING_MODE
  676. #define RUN_TEST_Ff_b1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  677. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  678. EXTRA_EXPECTED) \
  679. do \
  680. if (enable_test (EXCEPTIONS)) \
  681. { \
  682. COMMON_TEST_SETUP (ARG_STR); \
  683. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  684. /* Clear any exceptions from comparison involving sNaN \
  685. EXTRA_EXPECTED. */ \
  686. feclearexcept (FE_ALL_EXCEPT); \
  687. check_bool (test_name, FUNC_TEST (FUNC_NAME) (&(EXTRA_VAR), \
  688. (ARG)), \
  689. EXPECTED, EXCEPTIONS); \
  690. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  691. if (EXTRA_TEST) \
  692. check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, \
  693. (EXCEPTIONS) & TEST_NAN_PAYLOAD); \
  694. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  695. COMMON_TEST_CLEANUP; \
  696. } \
  697. while (0)
  698. #define RUN_TEST_LOOP_Ff_b1(FUNC_NAME, ARRAY, ROUNDING_MODE, \
  699. EXTRA_VAR) \
  700. IF_ROUND_INIT_ ## ROUNDING_MODE \
  701. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  702. RUN_TEST_Ff_b1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  703. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  704. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  705. EXTRA_VAR, \
  706. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  707. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  708. ROUND_RESTORE_ ## ROUNDING_MODE
  709. #define RUN_TEST_Ffp_b1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  710. EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
  711. EXTRA_EXPECTED) \
  712. do \
  713. if (enable_test (EXCEPTIONS)) \
  714. { \
  715. COMMON_TEST_SETUP (ARG_STR); \
  716. (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
  717. check_bool (test_name, FUNC_TEST (FUNC_NAME) (&(EXTRA_VAR), \
  718. &(ARG)), \
  719. EXPECTED, EXCEPTIONS); \
  720. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  721. if (EXTRA_TEST) \
  722. check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, \
  723. (EXCEPTIONS) & TEST_NAN_PAYLOAD); \
  724. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  725. COMMON_TEST_CLEANUP; \
  726. } \
  727. while (0)
  728. #define RUN_TEST_LOOP_Ffp_b1(FUNC_NAME, ARRAY, ROUNDING_MODE, \
  729. EXTRA_VAR) \
  730. IF_ROUND_INIT_ ## ROUNDING_MODE \
  731. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  732. RUN_TEST_Ffp_b1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  733. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  734. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  735. EXTRA_VAR, \
  736. (ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
  737. (ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
  738. ROUND_RESTORE_ ## ROUNDING_MODE
  739. #define RUN_TEST_c_c(ARG_STR, FUNC_NAME, ARGR, ARGC, EXPR, EXPC, \
  740. EXCEPTIONS) \
  741. do \
  742. if (enable_test (EXCEPTIONS)) \
  743. { \
  744. COMMON_TEST_SETUP (ARG_STR); \
  745. check_complex (test_name, \
  746. FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)), \
  747. BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS); \
  748. COMMON_TEST_CLEANUP; \
  749. } \
  750. while (0)
  751. #define RUN_TEST_LOOP_c_c(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  752. IF_ROUND_INIT_ ## ROUNDING_MODE \
  753. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  754. RUN_TEST_c_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr, \
  755. (ARRAY)[i].argc, \
  756. (ARRAY)[i].RM_##ROUNDING_MODE.expr, \
  757. (ARRAY)[i].RM_##ROUNDING_MODE.expc, \
  758. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  759. ROUND_RESTORE_ ## ROUNDING_MODE
  760. #define RUN_TEST_cc_c(ARG_STR, FUNC_NAME, ARG1R, ARG1C, ARG2R, ARG2C, \
  761. EXPR, EXPC, EXCEPTIONS) \
  762. do \
  763. if (enable_test (EXCEPTIONS)) \
  764. { \
  765. COMMON_TEST_SETUP (ARG_STR); \
  766. check_complex (test_name, \
  767. FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C), \
  768. BUILD_COMPLEX (ARG2R, ARG2C)), \
  769. BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS); \
  770. COMMON_TEST_CLEANUP; \
  771. } \
  772. while (0)
  773. #define RUN_TEST_LOOP_cc_c(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  774. IF_ROUND_INIT_ ## ROUNDING_MODE \
  775. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  776. RUN_TEST_cc_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1r, \
  777. (ARRAY)[i].arg1c, (ARRAY)[i].arg2r, \
  778. (ARRAY)[i].arg2c, \
  779. (ARRAY)[i].RM_##ROUNDING_MODE.expr, \
  780. (ARRAY)[i].RM_##ROUNDING_MODE.expc, \
  781. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  782. ROUND_RESTORE_ ## ROUNDING_MODE
  783. #define RUN_TEST_f_i(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
  784. do \
  785. if (enable_test (EXCEPTIONS)) \
  786. { \
  787. COMMON_TEST_SETUP (ARG_STR); \
  788. check_int (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
  789. EXCEPTIONS); \
  790. COMMON_TEST_CLEANUP; \
  791. } \
  792. while (0)
  793. #define RUN_TEST_LOOP_f_i(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  794. IF_ROUND_INIT_ ## ROUNDING_MODE \
  795. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  796. RUN_TEST_f_i ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  797. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  798. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  799. ROUND_RESTORE_ ## ROUNDING_MODE
  800. #define RUN_TEST_f_i_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  801. EXCEPTIONS) \
  802. do \
  803. if (enable_test (EXCEPTIONS)) \
  804. { \
  805. COMMON_TEST_SETUP (ARG_STR); \
  806. check_int (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS); \
  807. COMMON_TEST_CLEANUP; \
  808. } \
  809. while (0)
  810. #define RUN_TEST_LOOP_f_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  811. IF_ROUND_INIT_ ## ROUNDING_MODE \
  812. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  813. RUN_TEST_f_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  814. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  815. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  816. ROUND_RESTORE_ ## ROUNDING_MODE
  817. #define RUN_TEST_ff_b(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
  818. EXCEPTIONS) \
  819. do \
  820. if (enable_test (EXCEPTIONS)) \
  821. { \
  822. COMMON_TEST_SETUP (ARG_STR); \
  823. check_bool (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2), \
  824. EXPECTED, EXCEPTIONS); \
  825. COMMON_TEST_CLEANUP; \
  826. } \
  827. while (0)
  828. #define RUN_TEST_LOOP_ff_b(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  829. IF_ROUND_INIT_ ## ROUNDING_MODE \
  830. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  831. RUN_TEST_ff_b ((ARRAY)[i].arg_str, FUNC_NAME, \
  832. (ARRAY)[i].arg1, (ARRAY)[i].arg2, \
  833. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  834. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  835. ROUND_RESTORE_ ## ROUNDING_MODE
  836. #define RUN_TEST_ff_i_tg(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
  837. EXCEPTIONS) \
  838. do \
  839. if (enable_test (EXCEPTIONS)) \
  840. { \
  841. COMMON_TEST_SETUP (ARG_STR); \
  842. check_int (test_name, FUNC_NAME (ARG1, ARG2), EXPECTED, \
  843. EXCEPTIONS); \
  844. COMMON_TEST_CLEANUP; \
  845. } \
  846. while (0)
  847. #define RUN_TEST_LOOP_ff_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  848. IF_ROUND_INIT_ ## ROUNDING_MODE \
  849. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  850. RUN_TEST_ff_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, \
  851. (ARRAY)[i].arg1, (ARRAY)[i].arg2, \
  852. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  853. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  854. ROUND_RESTORE_ ## ROUNDING_MODE
  855. #define RUN_TEST_f_b(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
  856. do \
  857. if (enable_test (EXCEPTIONS)) \
  858. { \
  859. COMMON_TEST_SETUP (ARG_STR); \
  860. check_bool (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
  861. EXCEPTIONS); \
  862. COMMON_TEST_CLEANUP; \
  863. } \
  864. while (0)
  865. #define RUN_TEST_LOOP_f_b(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  866. IF_ROUND_INIT_ ## ROUNDING_MODE \
  867. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  868. RUN_TEST_f_b ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  869. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  870. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  871. ROUND_RESTORE_ ## ROUNDING_MODE
  872. #define RUN_TEST_f_b_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
  873. EXCEPTIONS) \
  874. do \
  875. if (enable_test (EXCEPTIONS)) \
  876. { \
  877. COMMON_TEST_SETUP (ARG_STR); \
  878. check_bool (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS); \
  879. COMMON_TEST_CLEANUP; \
  880. } \
  881. while (0)
  882. #define RUN_TEST_LOOP_f_b_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  883. IF_ROUND_INIT_ ## ROUNDING_MODE \
  884. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  885. RUN_TEST_f_b_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  886. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  887. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  888. ROUND_RESTORE_ ## ROUNDING_MODE
  889. #define RUN_TEST_f_l(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
  890. do \
  891. if (enable_test (EXCEPTIONS)) \
  892. { \
  893. COMMON_TEST_SETUP (ARG_STR); \
  894. check_long (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
  895. EXCEPTIONS); \
  896. COMMON_TEST_CLEANUP; \
  897. } \
  898. while (0)
  899. #define RUN_TEST_LOOP_f_l(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  900. IF_ROUND_INIT_ ## ROUNDING_MODE \
  901. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  902. RUN_TEST_f_l ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  903. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  904. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  905. ROUND_RESTORE_ ## ROUNDING_MODE
  906. #define RUN_TEST_f_L(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
  907. do \
  908. if (enable_test (EXCEPTIONS)) \
  909. { \
  910. COMMON_TEST_SETUP (ARG_STR); \
  911. check_longlong (test_name, FUNC_TEST (FUNC_NAME) (ARG), \
  912. EXPECTED, EXCEPTIONS); \
  913. COMMON_TEST_CLEANUP; \
  914. } \
  915. while (0)
  916. #define RUN_TEST_LOOP_f_L(FUNC_NAME, ARRAY, ROUNDING_MODE) \
  917. IF_ROUND_INIT_ ## ROUNDING_MODE \
  918. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  919. RUN_TEST_f_L ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  920. (ARRAY)[i].RM_##ROUNDING_MODE.expected, \
  921. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
  922. ROUND_RESTORE_ ## ROUNDING_MODE
  923. #define RUN_TEST_fFF_11(ARG_STR, FUNC_NAME, ARG, EXCEPTIONS, \
  924. EXTRA1_VAR, EXTRA1_TEST, \
  925. EXTRA1_EXPECTED, EXTRA2_VAR, \
  926. EXTRA2_TEST, EXTRA2_EXPECTED) \
  927. do \
  928. if (enable_test (EXCEPTIONS)) \
  929. { \
  930. COMMON_TEST_SETUP (ARG_STR); \
  931. FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR)); \
  932. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
  933. if (EXTRA1_TEST) \
  934. check_float (extra1_name, EXTRA1_VAR, EXTRA1_EXPECTED, \
  935. EXCEPTIONS); \
  936. EXTRA_OUTPUT_TEST_CLEANUP (1); \
  937. EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 2); \
  938. if (EXTRA2_TEST) \
  939. check_float (extra2_name, EXTRA2_VAR, EXTRA2_EXPECTED, 0); \
  940. EXTRA_OUTPUT_TEST_CLEANUP (2); \
  941. COMMON_TEST_CLEANUP; \
  942. } \
  943. while (0)
  944. #define RUN_TEST_LOOP_fFF_11(FUNC_NAME, ARRAY, ROUNDING_MODE, \
  945. EXTRA1_VAR, EXTRA2_VAR) \
  946. IF_ROUND_INIT_ ## ROUNDING_MODE \
  947. for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
  948. RUN_TEST_fFF_11 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
  949. (ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
  950. EXTRA1_VAR, \
  951. (ARRAY)[i].RM_##ROUNDING_MODE.extra1_test, \
  952. (ARRAY)[i].RM_##ROUNDING_MODE.extra1_expected, \
  953. EXTRA2_VAR, \
  954. (ARRAY)[i].RM_##ROUNDING_MODE.extra2_test, \
  955. (ARRAY)[i].RM_##ROUNDING_MODE.extra2_expected); \
  956. ROUND_RESTORE_ ## ROUNDING_MODE
  957. #if TEST_MATHVEC
  958. # define TEST_SUFF VEC_SUFF
  959. # define TEST_SUFF_STR
  960. #elif TEST_NARROW
  961. # define TEST_SUFF
  962. # define TEST_SUFF_STR "_" ARG_TYPE_STR
  963. #else
  964. # define TEST_SUFF
  965. # define TEST_SUFF_STR
  966. #endif
  967. #define STR_CONCAT(a, b, c) __STRING (a##b##c)
  968. #define STR_CON3(a, b, c) STR_CONCAT (a, b, c)
  969. #if TEST_NARROW
  970. # define TEST_COND_any_ibm128 (TEST_COND_ibm128 || TEST_COND_arg_ibm128)
  971. #else
  972. # define TEST_COND_any_ibm128 TEST_COND_ibm128
  973. #endif
  974. /* Start and end the tests for a given function. */
  975. #define START(FUN, SUFF, EXACT) \
  976. CHECK_ARCH_EXT; \
  977. const char *this_func \
  978. = STR_CON3 (FUN, SUFF, TEST_SUFF) TEST_SUFF_STR; \
  979. init_max_error (this_func, EXACT, TEST_COND_any_ibm128)
  980. #define END \
  981. print_max_error (this_func)
  982. #define END_COMPLEX \
  983. print_complex_max_error (this_func)
  984. /* Run tests for a given function in all rounding modes. */
  985. #define ALL_RM_TEST(FUNC, EXACT, ARRAY, LOOP_MACRO, END_MACRO, ...) \
  986. do \
  987. { \
  988. do \
  989. { \
  990. START (FUNC,, EXACT); \
  991. LOOP_MACRO (FUNC, ARRAY, , ## __VA_ARGS__); \
  992. END_MACRO; \
  993. } \
  994. while (0); \
  995. do \
  996. { \
  997. START (FUNC, _downward, EXACT); \
  998. LOOP_MACRO (FUNC, ARRAY, FE_DOWNWARD, ## __VA_ARGS__); \
  999. END_MACRO; \
  1000. } \
  1001. while (0); \
  1002. do \
  1003. { \
  1004. START (FUNC, _towardzero, EXACT); \
  1005. LOOP_MACRO (FUNC, ARRAY, FE_TOWARDZERO, ## __VA_ARGS__); \
  1006. END_MACRO; \
  1007. } \
  1008. while (0); \
  1009. do \
  1010. { \
  1011. START (FUNC, _upward, EXACT); \
  1012. LOOP_MACRO (FUNC, ARRAY, FE_UPWARD, ## __VA_ARGS__); \
  1013. END_MACRO; \
  1014. } \
  1015. while (0); \
  1016. } \
  1017. while (0);
  1018. /* Short description of program. */
  1019. const char doc[] = "Math test suite: " TEST_MSG ;
  1020. static void do_test (void);
  1021. int
  1022. main (int argc, char **argv)
  1023. {
  1024. libm_test_init (argc, argv);
  1025. INIT_ARCH_EXT;
  1026. do_test ();
  1027. return libm_test_finish ();
  1028. }