test_atomic.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include <stdlib.h>
  2. #include "ctest.h"
  3. #include "nuclei_sdk_soc.h"
  4. #ifdef __riscv_atomic
  5. #define INIT_VALUE 0x12345678
  6. #define TEST_VALUE 0xDEADBEEF
  7. CTEST(atomic, cas_w)
  8. {
  9. uint32_t data = INIT_VALUE;
  10. unsigned long pdata = (unsigned long)(&data);
  11. ASSERT_EQUAL(__CAS_W((uint32_t*)pdata, INIT_VALUE, TEST_VALUE), INIT_VALUE);
  12. }
  13. CTEST(atomic, amoswap_w)
  14. {
  15. uint32_t data = INIT_VALUE;
  16. unsigned long pdata = (unsigned long)(&data);
  17. ASSERT_EQUAL(__AMOSWAP_W((uint32_t*)pdata, TEST_VALUE), INIT_VALUE);
  18. }
  19. CTEST(atomic, amoadd_w)
  20. {
  21. uint32_t data = INIT_VALUE;
  22. unsigned long pdata = (unsigned long)(&data);
  23. uint32_t result = __AMOADD_W((int32_t*)pdata, TEST_VALUE);
  24. uint32_t expected = INIT_VALUE + TEST_VALUE;
  25. CTEST_LOG("AMOADD: 0x%x vs 0x%x", result, expected);
  26. ASSERT_EQUAL(result, expected);
  27. }
  28. CTEST(atomic, amoand_w)
  29. {
  30. uint32_t data = INIT_VALUE;
  31. unsigned long pdata = (unsigned long)(&data);
  32. uint32_t result = __AMOAND_W((int32_t*)pdata, TEST_VALUE);
  33. uint32_t expected = INIT_VALUE & TEST_VALUE;
  34. CTEST_LOG("AMOAND: 0x%x vs 0x%x", result, expected);
  35. ASSERT_EQUAL(result, expected);
  36. }
  37. CTEST(atomic, amoor_w)
  38. {
  39. uint32_t data = INIT_VALUE;
  40. unsigned long pdata = (unsigned long)(&data);
  41. uint32_t result = __AMOOR_W((int32_t*)pdata, TEST_VALUE);
  42. uint32_t expected = INIT_VALUE | TEST_VALUE;
  43. CTEST_LOG("AMOXOR: 0x%x vs 0x%x", result, expected);
  44. ASSERT_EQUAL(result, expected);
  45. }
  46. CTEST(atomic, amoxor_w)
  47. {
  48. uint32_t data = INIT_VALUE;
  49. unsigned long pdata = (unsigned long)(&data);
  50. uint32_t result = __AMOXOR_W((int32_t*)pdata, TEST_VALUE);
  51. uint32_t expected = INIT_VALUE ^ TEST_VALUE;
  52. CTEST_LOG("AMOXOR: 0x%x vs 0x%x", result, expected);
  53. ASSERT_EQUAL(result, expected);
  54. }
  55. CTEST(atomic, amomaxu_w)
  56. {
  57. uint32_t data = INIT_VALUE;
  58. unsigned long pdata = (unsigned long)(&data);
  59. uint32_t result = __AMOMAXU_W((uint32_t*)pdata, TEST_VALUE);
  60. uint32_t expected = (uint32_t)(INIT_VALUE) > (uint32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  61. CTEST_LOG("AMOMAXU: %u vs %u", result, expected);
  62. ASSERT_EQUAL(result, expected);
  63. }
  64. CTEST(atomic, amomax_w)
  65. {
  66. uint32_t data = INIT_VALUE;
  67. unsigned long pdata = (unsigned long)(&data);
  68. int32_t result = __AMOMAX_W((int32_t*)pdata, TEST_VALUE);
  69. int32_t expected = (int32_t)(INIT_VALUE) > (int32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  70. CTEST_LOG("AMOMAX: %d vs %d", result, expected);
  71. ASSERT_EQUAL(result, expected);
  72. }
  73. CTEST(atomic, amominu_w)
  74. {
  75. uint32_t data = INIT_VALUE;
  76. unsigned long pdata = (unsigned long)(&data);
  77. uint32_t result = __AMOMINU_W((uint32_t*)pdata, TEST_VALUE);
  78. uint32_t expected = (uint32_t)(INIT_VALUE) < (uint32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  79. CTEST_LOG("AMOMINU: %u vs %u", result, expected);
  80. ASSERT_EQUAL(result, expected);
  81. }
  82. CTEST(atomic, amomin_w)
  83. {
  84. uint32_t data = INIT_VALUE;
  85. unsigned long pdata = (unsigned long)(&data);
  86. int32_t result = __AMOMIN_W((int32_t*)pdata, TEST_VALUE);
  87. int32_t expected = (int32_t)(INIT_VALUE) < (int32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  88. CTEST_LOG("AMOMIN: %d vs %d", result, expected);
  89. ASSERT_EQUAL(result, expected);
  90. }
  91. #if __RISCV_XLEN == 64
  92. CTEST(atomic, cas_d)
  93. {
  94. uint64_t data = INIT_VALUE;
  95. unsigned long pdata = (unsigned long)(&data);
  96. ASSERT_EQUAL(__CAS_D((uint64_t*)pdata, INIT_VALUE, TEST_VALUE), INIT_VALUE);
  97. }
  98. CTEST(atomic, amoswap_d)
  99. {
  100. uint64_t data = INIT_VALUE;
  101. unsigned long pdata = (unsigned long)(&data);
  102. ASSERT_EQUAL(__AMOSWAP_D((uint64_t*)pdata, TEST_VALUE), INIT_VALUE);
  103. }
  104. CTEST(atomic, amoadd_d)
  105. {
  106. uint64_t data = INIT_VALUE;
  107. unsigned long pdata = (unsigned long)(&data);
  108. uint64_t result = __AMOADD_D((int64_t*)pdata, TEST_VALUE);
  109. uint64_t expected = INIT_VALUE + TEST_VALUE;
  110. CTEST_LOG("AMOADD: 0x%lx vs 0x%lx", result, expected);
  111. ASSERT_EQUAL(result, expected);
  112. }
  113. CTEST(atomic, amoand_d)
  114. {
  115. uint64_t data = INIT_VALUE;
  116. unsigned long pdata = (unsigned long)(&data);
  117. uint64_t result = __AMOAND_D((int64_t*)pdata, TEST_VALUE);
  118. uint64_t expected = INIT_VALUE & TEST_VALUE;
  119. CTEST_LOG("AMOAND: 0x%lx vs 0x%lx", result, expected);
  120. ASSERT_EQUAL(result, expected);
  121. }
  122. CTEST(atomic, amoor_d)
  123. {
  124. uint64_t data = INIT_VALUE;
  125. unsigned long pdata = (unsigned long)(&data);
  126. uint64_t result = __AMOOR_D((int64_t*)pdata, TEST_VALUE);
  127. uint64_t expected = INIT_VALUE | TEST_VALUE;
  128. CTEST_LOG("AMOXOR: 0x%lx vs 0x%lx", result, expected);
  129. ASSERT_EQUAL(result, expected);
  130. }
  131. CTEST(atomic, amoxor_d)
  132. {
  133. uint64_t data = INIT_VALUE;
  134. unsigned long pdata = (unsigned long)(&data);
  135. uint64_t result = __AMOXOR_D((int64_t*)pdata, TEST_VALUE);
  136. uint64_t expected = INIT_VALUE ^ TEST_VALUE;
  137. CTEST_LOG("AMOXOR: 0x%lx vs 0x%lx", result, expected);
  138. ASSERT_EQUAL(result, expected);
  139. }
  140. CTEST(atomic, amomaxu_d)
  141. {
  142. uint64_t data = INIT_VALUE;
  143. unsigned long pdata = (unsigned long)(&data);
  144. uint64_t result = __AMOMAXU_D((uint64_t*)pdata, TEST_VALUE);
  145. uint64_t expected = (uint64_t)(INIT_VALUE) > (uint64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  146. CTEST_LOG("AMOMAXU: %lu vs %lu", result, expected);
  147. ASSERT_EQUAL(result, expected);
  148. }
  149. CTEST(atomic, amomax_d)
  150. {
  151. uint64_t data = INIT_VALUE;
  152. unsigned long pdata = (unsigned long)(&data);
  153. int64_t result = __AMOMAX_D((int64_t*)pdata, TEST_VALUE);
  154. int64_t expected = (int64_t)(INIT_VALUE) > (int64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  155. CTEST_LOG("AMOMAX: %ld vs %ld", result, expected);
  156. ASSERT_EQUAL(result, expected);
  157. }
  158. CTEST(atomic, amominu_d)
  159. {
  160. uint64_t data = INIT_VALUE;
  161. unsigned long pdata = (unsigned long)(&data);
  162. uint64_t result = __AMOMINU_D((uint64_t*)pdata, TEST_VALUE);
  163. uint64_t expected = (uint64_t)(INIT_VALUE) < (uint64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  164. CTEST_LOG("AMOMINU: %lu vs %lu", result, expected);
  165. ASSERT_EQUAL(result, expected);
  166. }
  167. CTEST(atomic, amomin_d)
  168. {
  169. uint64_t data = INIT_VALUE;
  170. unsigned long pdata = (unsigned long)(&data);
  171. int64_t result = __AMOMIN_D((int64_t*)pdata, TEST_VALUE);
  172. int64_t expected = (int64_t)(INIT_VALUE) < (int64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
  173. CTEST_LOG("AMOMIN: %ld vs %ld", result, expected);
  174. ASSERT_EQUAL(result, expected);
  175. }
  176. #endif
  177. #endif