test_libgcc.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <complex.h>
  7. #include "unity.h"
  8. TEST_CASE("libgcc math functions", "[rom][libgcc]")
  9. {
  10. extern int64_t __absvdi2(int64_t x);
  11. TEST_ASSERT(__absvdi2(-1L) == 1);
  12. extern int __absvsi2(int x);
  13. TEST_ASSERT(__absvsi2(-1) == 1);
  14. extern double __adddf3(double x, double y);
  15. TEST_ASSERT(__adddf3(1.0, 4.0) == 5.0);
  16. extern float __addsf3(float x, float y);
  17. TEST_ASSERT(__addsf3(1.0f, 4.0f) == 5.0f);
  18. extern int64_t __addvdi3(int64_t x, int64_t y);
  19. TEST_ASSERT(__addvdi3(1L, 4L) == 5L);
  20. extern int __addvsi3(int x, int y);
  21. TEST_ASSERT(__addvsi3(1, 4) == 5);
  22. extern int64_t __ashldi3(int64_t x, int y);
  23. TEST_ASSERT(__ashldi3(1, 4) == 16);
  24. extern int64_t __ashrdi3(int64_t x, int y);
  25. TEST_ASSERT(__ashrdi3(4, 1) == 2);
  26. extern int64_t __bswapdi2(int64_t x);
  27. TEST_ASSERT(__bswapdi2(0xaabbccddeeff0011ULL) == 0x1100ffeeddccbbaaULL);
  28. extern int32_t __bswapsi2(int32_t x);
  29. TEST_ASSERT(__bswapsi2(0xaabbccdd) == 0xddccbbaa);
  30. extern int __clrsbdi2(int64_t x);
  31. TEST_ASSERT(__clrsbdi2(-1) == 63);
  32. extern int __clrsbsi2(int x);
  33. TEST_ASSERT(__clrsbsi2(-1) == 31);
  34. extern int __clzdi2(int64_t x);
  35. TEST_ASSERT(__clzdi2(1) == 63);
  36. extern int __clzsi2(int x);
  37. TEST_ASSERT(__clzsi2(1) == 31);
  38. extern int __cmpdi2(int64_t x, int64_t y);
  39. TEST_ASSERT(__cmpdi2(10, 10) == 1);
  40. extern int __ctzdi2(uint64_t x);
  41. TEST_ASSERT(__ctzdi2(0x8000000000000000ULL) == 63);
  42. extern int __ctzsi2(unsigned x);
  43. TEST_ASSERT(__ctzsi2(0x80000000U) == 31);
  44. extern complex double __divdc3(double a, double b, double c, double d);
  45. TEST_ASSERT(__divdc3(0, 1, 1, 0) == I);
  46. extern double __divdf3(double x, double y);
  47. TEST_ASSERT(__divdf3(16.0, 2.0) == 8.0);
  48. extern int64_t __divdi3(int64_t x, int64_t y);
  49. TEST_ASSERT(__divdi3(16, 2) == 8);
  50. extern complex float __divsc3(float a, float b, float c, float d);
  51. TEST_ASSERT(__divsc3(0, 1, 1, 0) == I);
  52. extern float __divsf3(float x, float y);
  53. TEST_ASSERT(__divsf3(16.0f, 2.0f) == 8.0f);
  54. extern int __divsi3(int x, int y);
  55. TEST_ASSERT(__divsi3(16, 2) == 8);
  56. extern int __eqdf2(double x, double y);
  57. TEST_ASSERT(__eqdf2(4.0, 4.0) == 0);
  58. extern int __eqsf2(float x, float y);
  59. TEST_ASSERT(__eqsf2(4.0f, 4.0f) == 0);
  60. extern double __extendsfdf2(float x);
  61. TEST_ASSERT(__extendsfdf2(4.0f) == 4.0);
  62. extern int __ffsdi2(uint64_t x);
  63. TEST_ASSERT(__ffsdi2(0x8000000000000000ULL) == 64);
  64. extern int __ffssi2(unsigned x);
  65. TEST_ASSERT(__ffssi2(0x80000000) == 32);
  66. extern int64_t __fixdfdi(double x);
  67. TEST_ASSERT(__fixdfdi(4.0) == 4LL);
  68. extern int __fixdfsi(double x);
  69. TEST_ASSERT(__fixdfsi(4.0) == 4);
  70. extern int64_t __fixsfdi(float x);
  71. TEST_ASSERT(__fixsfdi(4.0f) == 4LL);
  72. extern int __fixsfsi(float x);
  73. TEST_ASSERT(__fixsfsi(4.0f) == 4);
  74. extern unsigned __fixunsdfsi(double x);
  75. TEST_ASSERT(__fixunsdfsi(16.0) == 16);
  76. extern uint64_t __fixunssfdi(float x);
  77. TEST_ASSERT(__fixunssfdi(16.0f) == 16);
  78. extern unsigned __fixunssfsi(float x);
  79. TEST_ASSERT(__fixunssfsi(16.0f) == 16);
  80. extern double __floatdidf(int64_t);
  81. TEST_ASSERT(__floatdidf(-1LL) == -1.0f);
  82. extern float __floatdisf(int64_t);
  83. TEST_ASSERT(__floatdisf(-1LL) == -1.0f);
  84. extern double __floatsidf(int x);
  85. TEST_ASSERT(__floatsidf(-1) == -1.0);
  86. extern float __floatsisf(int x);
  87. TEST_ASSERT(__floatsisf(-1) == -1.0f);
  88. extern double __floatundidf(uint64_t x);
  89. TEST_ASSERT(__floatundidf(16) == 16.0);
  90. extern float __floatundisf(uint64_t x);
  91. TEST_ASSERT(__floatundisf(16) == 16.0f);
  92. extern double __floatunsidf(unsigned x);
  93. TEST_ASSERT(__floatunsidf(16) == 16.0);
  94. extern float __floatunsisf(unsigned x);
  95. TEST_ASSERT(__floatunsisf(16) == 16.0f);
  96. extern int __gedf2(double x, double y);
  97. TEST_ASSERT(__gedf2(2.0, 0.0) >= 0);
  98. extern int __gesf2(float x, float y);
  99. TEST_ASSERT(__gesf2(2.0f, 0.0f) >= 0);
  100. extern int __gtdf2(double x, double y);
  101. TEST_ASSERT(__gtdf2(2.0, 0.0) >= 0);
  102. extern int __gtsf2(float x, float y);
  103. TEST_ASSERT(__gtsf2(2.0f, 0.0f) >= 0);
  104. extern int __ledf2(double x, double y);
  105. TEST_ASSERT(__ledf2(0.0, 2.0) <= 0);
  106. extern int __lesf2(float x, float y);
  107. TEST_ASSERT(__lesf2(0.0f, 2.0f) <= 0);
  108. extern int64_t __lshrdi3(int64_t x, int y);
  109. TEST_ASSERT(__lshrdi3(0x8000000000000000LL, 1) == 0x4000000000000000LL);
  110. extern int __ltdf2(double x, double y);
  111. TEST_ASSERT(__ltdf2(0.0, 2.0) < 0);
  112. extern int __ltsf2(float x, float y);
  113. TEST_ASSERT(__ltsf2(0.0f, 2.0f) < 0);
  114. extern int64_t __moddi3(int64_t x, int64_t y);
  115. TEST_ASSERT(__moddi3(15, 2) == 1);
  116. extern int __modsi3(int x, int y);
  117. TEST_ASSERT(__modsi3(15, 2) == 1);
  118. extern complex double __muldc3(double a, double b, double c, double d);
  119. TEST_ASSERT(__muldc3(1.0, 0.0, 0.0, 1.0) == I);
  120. extern double __muldf3(double x, double y);
  121. TEST_ASSERT(__muldf3(2.0, 8.0) == 16.0);
  122. extern int64_t __muldi3(int64_t x, int64_t y);
  123. TEST_ASSERT(__muldi3(2, 8) == 16);
  124. extern complex float __mulsc3(float a, float b, float c, float d);
  125. TEST_ASSERT(__mulsc3(1.0f, 0.0f, 0.0f, -1.0f) == -I);
  126. extern float __mulsf3(float a, float b);
  127. TEST_ASSERT(__mulsf3(2.0f, 8.0f) == 16.0f);
  128. extern int __mulsi3(int x, int y);
  129. TEST_ASSERT(__mulsi3(2, 8) == 16);
  130. extern int __mulvdi3(int64_t x, int64_t y);
  131. TEST_ASSERT(__mulvdi3(2, 8) == 16);
  132. extern int __mulvsi3(int x, int y);
  133. TEST_ASSERT(__mulvsi3(2, 8) == 16);
  134. extern int __nedf2(double x, double y);
  135. TEST_ASSERT(__nedf2(2.0, 2.0) == 0);
  136. extern double __negdf2(double x);
  137. TEST_ASSERT(__negdf2(1.0) == -1.0);
  138. extern int64_t __negdi2(int64_t x);
  139. TEST_ASSERT(__negdi2(-1LL) == 1);
  140. extern float __negsf2(float x);
  141. TEST_ASSERT(__negsf2(-1.0f) == 1.0f);
  142. extern int64_t __negvdi2(int64_t x);
  143. TEST_ASSERT(__negvdi2(-1LL) == 1);
  144. extern int __negvsi2(int x);
  145. TEST_ASSERT(__negvsi2(-1) == 1);
  146. extern int __nesf2(float x, float y);
  147. TEST_ASSERT(__nesf2(2.0, 0.0) != 0);
  148. extern int __paritysi2(unsigned x);
  149. TEST_ASSERT(__paritysi2(0x10101010) == 0);
  150. extern int __popcountdi2(uint64_t);
  151. TEST_ASSERT(__popcountdi2(0xaaaaaaaa11111111ULL) == 24);
  152. extern int __popcountsi2(unsigned x);
  153. TEST_ASSERT(__popcountsi2(0x11111111) == 8);
  154. extern double __powidf2(double x, int y);
  155. TEST_ASSERT(__powidf2(2.0, -1) == 0.5);
  156. extern float __powisf2(float x, int y);
  157. TEST_ASSERT(__powisf2(2.0f, 2) == 4.0f);
  158. extern double __subdf3(double x, double y);
  159. TEST_ASSERT(__subdf3(2.0, 1.0) == 1.0);
  160. extern float __subsf3(float x, float y);
  161. TEST_ASSERT(__subsf3(5.0f, 4.0f) == 1.0f);
  162. extern int64_t __subvdi3(int64_t x, int64_t y);
  163. TEST_ASSERT(__subvdi3(-1LL, -1LL) == 0);
  164. extern int __subvsi3(int x, int y);
  165. TEST_ASSERT(__subvsi3(-1, -1) == 0);
  166. extern float __truncdfsf2(double x);
  167. TEST_ASSERT(__truncdfsf2(4.0) == 4.0f);
  168. extern int __ucmpdi2(uint64_t x, uint64_t y);
  169. TEST_ASSERT(__ucmpdi2(0x100000000ULL, 0x100000000ULL) == 1);
  170. extern uint64_t __udivdi3(uint64_t x, uint64_t y);
  171. TEST_ASSERT(__udivdi3(15, 2) == 7);
  172. extern uint64_t __udivmoddi4(uint64_t x, uint64_t y, uint64_t *z);
  173. uint64_t z;
  174. TEST_ASSERT(__udivmoddi4(15, 2, &z) == 7);
  175. TEST_ASSERT(z == 1);
  176. extern unsigned __udivsi3(unsigned x, unsigned y);
  177. TEST_ASSERT(__udivsi3(15, 2) == 7);
  178. extern uint64_t __umoddi3(uint64_t x, uint64_t y);
  179. TEST_ASSERT(__umoddi3(15, 2) == 1);
  180. extern unsigned __umodsi3(unsigned x, unsigned y);
  181. TEST_ASSERT(__umodsi3(15, 2) == 1);
  182. #ifndef __riscv
  183. extern uint64_t __umulsidi3(unsigned x, unsigned y);
  184. TEST_ASSERT(__umulsidi3(0x10000000, 0x10000000) == 0x100000000000000ULL);
  185. #endif
  186. extern int __unorddf2(double x, double y);
  187. TEST_ASSERT(__unorddf2(1.0, 2.0) == 0);
  188. extern int __unordsf2(float x, float y);
  189. TEST_ASSERT(__unordsf2(2.0f, 1.0f) == 0);
  190. }