compare-fp-1.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * Copyright (C) 2007
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /*
  8. * Test for correctness of composite floating-point comparisons.
  9. * Written by Paolo Bonzini, 26th May 2004.
  10. * This file is originally a part of the GCC testsuite.
  11. */
  12. #include <common.h>
  13. #include <post.h>
  14. GNU_FPOST_ATTR
  15. #if CONFIG_POST & CONFIG_SYS_POST_FPU
  16. static int failed;
  17. #define TEST(c) if ((c) != ok) failed++
  18. #define ORD(a, b) (!__builtin_isunordered ((a), (b)))
  19. #define UNORD(a, b) (__builtin_isunordered ((a), (b)))
  20. #define UNEQ(a, b) (__builtin_isunordered ((a), (b)) || ((a) == (b)))
  21. #define UNLT(a, b) (__builtin_isunordered ((a), (b)) || ((a) < (b)))
  22. #define UNLE(a, b) (__builtin_isunordered ((a), (b)) || ((a) <= (b)))
  23. #define UNGT(a, b) (__builtin_isunordered ((a), (b)) || ((a) > (b)))
  24. #define UNGE(a, b) (__builtin_isunordered ((a), (b)) || ((a) >= (b)))
  25. #define LTGT(a, b) (__builtin_islessgreater ((a), (b)))
  26. static float pinf;
  27. static float ninf;
  28. static float NaN;
  29. static void iuneq (float x, float y, int ok)
  30. {
  31. TEST (UNEQ (x, y));
  32. TEST (!LTGT (x, y));
  33. TEST (UNLE (x, y) && UNGE (x,y));
  34. }
  35. static void ieq (float x, float y, int ok)
  36. {
  37. TEST (ORD (x, y) && UNEQ (x, y));
  38. }
  39. static void iltgt (float x, float y, int ok)
  40. {
  41. TEST (!UNEQ (x, y)); /* Not optimizable. */
  42. TEST (LTGT (x, y)); /* Same, __builtin_islessgreater does not trap. */
  43. TEST (ORD (x, y) && (UNLT (x, y) || UNGT (x,y)));
  44. }
  45. static void ine (float x, float y, int ok)
  46. {
  47. TEST (UNLT (x, y) || UNGT (x, y));
  48. }
  49. static void iunlt (float x, float y, int ok)
  50. {
  51. TEST (UNLT (x, y));
  52. TEST (UNORD (x, y) || (x < y));
  53. }
  54. static void ilt (float x, float y, int ok)
  55. {
  56. TEST (ORD (x, y) && UNLT (x, y)); /* Not optimized */
  57. TEST ((x <= y) && (x != y));
  58. TEST ((x <= y) && (y != x));
  59. TEST ((x != y) && (x <= y)); /* Not optimized */
  60. TEST ((y != x) && (x <= y)); /* Not optimized */
  61. }
  62. static void iunle (float x, float y, int ok)
  63. {
  64. TEST (UNLE (x, y));
  65. TEST (UNORD (x, y) || (x <= y));
  66. }
  67. static void ile (float x, float y, int ok)
  68. {
  69. TEST (ORD (x, y) && UNLE (x, y)); /* Not optimized */
  70. TEST ((x < y) || (x == y));
  71. TEST ((y > x) || (x == y));
  72. TEST ((x == y) || (x < y)); /* Not optimized */
  73. TEST ((y == x) || (x < y)); /* Not optimized */
  74. }
  75. static void iungt (float x, float y, int ok)
  76. {
  77. TEST (UNGT (x, y));
  78. TEST (UNORD (x, y) || (x > y));
  79. }
  80. static void igt (float x, float y, int ok)
  81. {
  82. TEST (ORD (x, y) && UNGT (x, y)); /* Not optimized */
  83. TEST ((x >= y) && (x != y));
  84. TEST ((x >= y) && (y != x));
  85. TEST ((x != y) && (x >= y)); /* Not optimized */
  86. TEST ((y != x) && (x >= y)); /* Not optimized */
  87. }
  88. static void iunge (float x, float y, int ok)
  89. {
  90. TEST (UNGE (x, y));
  91. TEST (UNORD (x, y) || (x >= y));
  92. }
  93. static void ige (float x, float y, int ok)
  94. {
  95. TEST (ORD (x, y) && UNGE (x, y)); /* Not optimized */
  96. TEST ((x > y) || (x == y));
  97. TEST ((y < x) || (x == y));
  98. TEST ((x == y) || (x > y)); /* Not optimized */
  99. TEST ((y == x) || (x > y)); /* Not optimized */
  100. }
  101. int fpu_post_test_math6 (void)
  102. {
  103. pinf = __builtin_inf ();
  104. ninf = -__builtin_inf ();
  105. NaN = __builtin_nan ("");
  106. iuneq (ninf, pinf, 0);
  107. iuneq (NaN, NaN, 1);
  108. iuneq (pinf, ninf, 0);
  109. iuneq (1, 4, 0);
  110. iuneq (3, 3, 1);
  111. iuneq (5, 2, 0);
  112. ieq (1, 4, 0);
  113. ieq (3, 3, 1);
  114. ieq (5, 2, 0);
  115. iltgt (ninf, pinf, 1);
  116. iltgt (NaN, NaN, 0);
  117. iltgt (pinf, ninf, 1);
  118. iltgt (1, 4, 1);
  119. iltgt (3, 3, 0);
  120. iltgt (5, 2, 1);
  121. ine (1, 4, 1);
  122. ine (3, 3, 0);
  123. ine (5, 2, 1);
  124. iunlt (NaN, ninf, 1);
  125. iunlt (pinf, NaN, 1);
  126. iunlt (pinf, ninf, 0);
  127. iunlt (pinf, pinf, 0);
  128. iunlt (ninf, ninf, 0);
  129. iunlt (1, 4, 1);
  130. iunlt (3, 3, 0);
  131. iunlt (5, 2, 0);
  132. ilt (1, 4, 1);
  133. ilt (3, 3, 0);
  134. ilt (5, 2, 0);
  135. iunle (NaN, ninf, 1);
  136. iunle (pinf, NaN, 1);
  137. iunle (pinf, ninf, 0);
  138. iunle (pinf, pinf, 1);
  139. iunle (ninf, ninf, 1);
  140. iunle (1, 4, 1);
  141. iunle (3, 3, 1);
  142. iunle (5, 2, 0);
  143. ile (1, 4, 1);
  144. ile (3, 3, 1);
  145. ile (5, 2, 0);
  146. iungt (NaN, ninf, 1);
  147. iungt (pinf, NaN, 1);
  148. iungt (pinf, ninf, 1);
  149. iungt (pinf, pinf, 0);
  150. iungt (ninf, ninf, 0);
  151. iungt (1, 4, 0);
  152. iungt (3, 3, 0);
  153. iungt (5, 2, 1);
  154. igt (1, 4, 0);
  155. igt (3, 3, 0);
  156. igt (5, 2, 1);
  157. iunge (NaN, ninf, 1);
  158. iunge (pinf, NaN, 1);
  159. iunge (ninf, pinf, 0);
  160. iunge (pinf, pinf, 1);
  161. iunge (ninf, ninf, 1);
  162. iunge (1, 4, 0);
  163. iunge (3, 3, 1);
  164. iunge (5, 2, 1);
  165. ige (1, 4, 0);
  166. ige (3, 3, 1);
  167. ige (5, 2, 1);
  168. if (failed) {
  169. post_log ("Error in FPU math6 test\n");
  170. return -1;
  171. }
  172. return 0;
  173. }
  174. #endif /* CONFIG_POST & CONFIG_SYS_POST_FPU */