/test/builtins/Unit/multc3_test.c

https://gitlab.com/drgroovestarr/external_compiler-rt · C · 375 lines · 331 code · 29 blank · 15 comment · 75 complexity · 7ecf72171e14b97dbe4ff1ac44e91427 MD5 · raw file

  1. //===-- multc3_test.c - Test __multc3 -------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file tests __multc3 for the compiler_rt library.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include <stdio.h>
  14. #if _ARCH_PPC || __aarch64__
  15. #include "int_lib.h"
  16. #include <math.h>
  17. #include <complex.h>
  18. // Returns: the product of a + ib and c + id
  19. COMPILER_RT_ABI long double _Complex
  20. __multc3(long double __a, long double __b, long double __c, long double __d);
  21. enum {zero, non_zero, inf, NaN, non_zero_nan};
  22. int
  23. classify(long double _Complex x)
  24. {
  25. if (x == 0)
  26. return zero;
  27. if (isinf(creall(x)) || isinf(cimagl(x)))
  28. return inf;
  29. if (isnan(creall(x)) && isnan(cimagl(x)))
  30. return NaN;
  31. if (isnan(creall(x)))
  32. {
  33. if (cimagl(x) == 0)
  34. return NaN;
  35. return non_zero_nan;
  36. }
  37. if (isnan(cimagl(x)))
  38. {
  39. if (creall(x) == 0)
  40. return NaN;
  41. return non_zero_nan;
  42. }
  43. return non_zero;
  44. }
  45. int test__multc3(long double a, long double b, long double c, long double d)
  46. {
  47. long double _Complex r = __multc3(a, b, c, d);
  48. // printf("test__multc3(%Lf, %Lf, %Lf, %Lf) = %Lf + I%Lf\n",
  49. // a, b, c, d, creall(r), cimagl(r));
  50. long double _Complex dividend;
  51. long double _Complex divisor;
  52. __real__ dividend = a;
  53. __imag__ dividend = b;
  54. __real__ divisor = c;
  55. __imag__ divisor = d;
  56. switch (classify(dividend))
  57. {
  58. case zero:
  59. switch (classify(divisor))
  60. {
  61. case zero:
  62. if (classify(r) != zero)
  63. return 1;
  64. break;
  65. case non_zero:
  66. if (classify(r) != zero)
  67. return 1;
  68. break;
  69. case inf:
  70. if (classify(r) != NaN)
  71. return 1;
  72. break;
  73. case NaN:
  74. if (classify(r) != NaN)
  75. return 1;
  76. break;
  77. case non_zero_nan:
  78. if (classify(r) != NaN)
  79. return 1;
  80. break;
  81. }
  82. break;
  83. case non_zero:
  84. switch (classify(divisor))
  85. {
  86. case zero:
  87. if (classify(r) != zero)
  88. return 1;
  89. break;
  90. case non_zero:
  91. if (classify(r) != non_zero)
  92. return 1;
  93. if (r != a * c - b * d + _Complex_I*(a * d + b * c))
  94. return 1;
  95. break;
  96. case inf:
  97. if (classify(r) != inf)
  98. return 1;
  99. break;
  100. case NaN:
  101. if (classify(r) != NaN)
  102. return 1;
  103. break;
  104. case non_zero_nan:
  105. if (classify(r) != NaN)
  106. return 1;
  107. break;
  108. }
  109. break;
  110. case inf:
  111. switch (classify(divisor))
  112. {
  113. case zero:
  114. if (classify(r) != NaN)
  115. return 1;
  116. break;
  117. case non_zero:
  118. if (classify(r) != inf)
  119. return 1;
  120. break;
  121. case inf:
  122. if (classify(r) != inf)
  123. return 1;
  124. break;
  125. case NaN:
  126. if (classify(r) != NaN)
  127. return 1;
  128. break;
  129. case non_zero_nan:
  130. if (classify(r) != inf)
  131. return 1;
  132. break;
  133. }
  134. break;
  135. case NaN:
  136. switch (classify(divisor))
  137. {
  138. case zero:
  139. if (classify(r) != NaN)
  140. return 1;
  141. break;
  142. case non_zero:
  143. if (classify(r) != NaN)
  144. return 1;
  145. break;
  146. case inf:
  147. if (classify(r) != NaN)
  148. return 1;
  149. break;
  150. case NaN:
  151. if (classify(r) != NaN)
  152. return 1;
  153. break;
  154. case non_zero_nan:
  155. if (classify(r) != NaN)
  156. return 1;
  157. break;
  158. }
  159. break;
  160. case non_zero_nan:
  161. switch (classify(divisor))
  162. {
  163. case zero:
  164. if (classify(r) != NaN)
  165. return 1;
  166. break;
  167. case non_zero:
  168. if (classify(r) != NaN)
  169. return 1;
  170. break;
  171. case inf:
  172. if (classify(r) != inf)
  173. return 1;
  174. break;
  175. case NaN:
  176. if (classify(r) != NaN)
  177. return 1;
  178. break;
  179. case non_zero_nan:
  180. if (classify(r) != NaN)
  181. return 1;
  182. break;
  183. }
  184. break;
  185. }
  186. return 0;
  187. }
  188. long double x[][2] =
  189. {
  190. { 1.e-6, 1.e-6},
  191. {-1.e-6, 1.e-6},
  192. {-1.e-6, -1.e-6},
  193. { 1.e-6, -1.e-6},
  194. { 1.e+6, 1.e-6},
  195. {-1.e+6, 1.e-6},
  196. {-1.e+6, -1.e-6},
  197. { 1.e+6, -1.e-6},
  198. { 1.e-6, 1.e+6},
  199. {-1.e-6, 1.e+6},
  200. {-1.e-6, -1.e+6},
  201. { 1.e-6, -1.e+6},
  202. { 1.e+6, 1.e+6},
  203. {-1.e+6, 1.e+6},
  204. {-1.e+6, -1.e+6},
  205. { 1.e+6, -1.e+6},
  206. {NAN, NAN},
  207. {-INFINITY, NAN},
  208. {-2, NAN},
  209. {-1, NAN},
  210. {-0.5, NAN},
  211. {-0., NAN},
  212. {+0., NAN},
  213. {0.5, NAN},
  214. {1, NAN},
  215. {2, NAN},
  216. {INFINITY, NAN},
  217. {NAN, -INFINITY},
  218. {-INFINITY, -INFINITY},
  219. {-2, -INFINITY},
  220. {-1, -INFINITY},
  221. {-0.5, -INFINITY},
  222. {-0., -INFINITY},
  223. {+0., -INFINITY},
  224. {0.5, -INFINITY},
  225. {1, -INFINITY},
  226. {2, -INFINITY},
  227. {INFINITY, -INFINITY},
  228. {NAN, -2},
  229. {-INFINITY, -2},
  230. {-2, -2},
  231. {-1, -2},
  232. {-0.5, -2},
  233. {-0., -2},
  234. {+0., -2},
  235. {0.5, -2},
  236. {1, -2},
  237. {2, -2},
  238. {INFINITY, -2},
  239. {NAN, -1},
  240. {-INFINITY, -1},
  241. {-2, -1},
  242. {-1, -1},
  243. {-0.5, -1},
  244. {-0., -1},
  245. {+0., -1},
  246. {0.5, -1},
  247. {1, -1},
  248. {2, -1},
  249. {INFINITY, -1},
  250. {NAN, -0.5},
  251. {-INFINITY, -0.5},
  252. {-2, -0.5},
  253. {-1, -0.5},
  254. {-0.5, -0.5},
  255. {-0., -0.5},
  256. {+0., -0.5},
  257. {0.5, -0.5},
  258. {1, -0.5},
  259. {2, -0.5},
  260. {INFINITY, -0.5},
  261. {NAN, -0.},
  262. {-INFINITY, -0.},
  263. {-2, -0.},
  264. {-1, -0.},
  265. {-0.5, -0.},
  266. {-0., -0.},
  267. {+0., -0.},
  268. {0.5, -0.},
  269. {1, -0.},
  270. {2, -0.},
  271. {INFINITY, -0.},
  272. {NAN, 0.},
  273. {-INFINITY, 0.},
  274. {-2, 0.},
  275. {-1, 0.},
  276. {-0.5, 0.},
  277. {-0., 0.},
  278. {+0., 0.},
  279. {0.5, 0.},
  280. {1, 0.},
  281. {2, 0.},
  282. {INFINITY, 0.},
  283. {NAN, 0.5},
  284. {-INFINITY, 0.5},
  285. {-2, 0.5},
  286. {-1, 0.5},
  287. {-0.5, 0.5},
  288. {-0., 0.5},
  289. {+0., 0.5},
  290. {0.5, 0.5},
  291. {1, 0.5},
  292. {2, 0.5},
  293. {INFINITY, 0.5},
  294. {NAN, 1},
  295. {-INFINITY, 1},
  296. {-2, 1},
  297. {-1, 1},
  298. {-0.5, 1},
  299. {-0., 1},
  300. {+0., 1},
  301. {0.5, 1},
  302. {1, 1},
  303. {2, 1},
  304. {INFINITY, 1},
  305. {NAN, 2},
  306. {-INFINITY, 2},
  307. {-2, 2},
  308. {-1, 2},
  309. {-0.5, 2},
  310. {-0., 2},
  311. {+0., 2},
  312. {0.5, 2},
  313. {1, 2},
  314. {2, 2},
  315. {INFINITY, 2},
  316. {NAN, INFINITY},
  317. {-INFINITY, INFINITY},
  318. {-2, INFINITY},
  319. {-1, INFINITY},
  320. {-0.5, INFINITY},
  321. {-0., INFINITY},
  322. {+0., INFINITY},
  323. {0.5, INFINITY},
  324. {1, INFINITY},
  325. {2, INFINITY},
  326. {INFINITY, INFINITY}
  327. };
  328. #endif
  329. int main()
  330. {
  331. #if _ARCH_PPC || __aarch64__
  332. const unsigned N = sizeof(x) / sizeof(x[0]);
  333. unsigned i, j;
  334. for (i = 0; i < N; ++i)
  335. {
  336. for (j = 0; j < N; ++j)
  337. {
  338. if (test__multc3(x[i][0], x[i][1], x[j][0], x[j][1]))
  339. return 1;
  340. }
  341. }
  342. #else
  343. printf("skipped\n");
  344. #endif
  345. return 0;
  346. }