compare-fp-1.c 4.4 KB

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