| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #include <stdlib.h>
- #include "ctest.h"
- #include "nuclei_sdk_soc.h"
- #ifdef __riscv_atomic
- #define INIT_VALUE 0x12345678
- #define TEST_VALUE 0xDEADBEEF
- CTEST(atomic, cas_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- ASSERT_EQUAL(__CAS_W((uint32_t*)pdata, INIT_VALUE, TEST_VALUE), INIT_VALUE);
- }
- CTEST(atomic, amoswap_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- ASSERT_EQUAL(__AMOSWAP_W((uint32_t*)pdata, TEST_VALUE), INIT_VALUE);
- }
- CTEST(atomic, amoadd_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOADD_W((int32_t*)pdata, TEST_VALUE);
- uint32_t expected = INIT_VALUE + TEST_VALUE;
- CTEST_LOG("AMOADD: 0x%x vs 0x%x", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoand_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOAND_W((int32_t*)pdata, TEST_VALUE);
- uint32_t expected = INIT_VALUE & TEST_VALUE;
- CTEST_LOG("AMOAND: 0x%x vs 0x%x", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoor_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOOR_W((int32_t*)pdata, TEST_VALUE);
- uint32_t expected = INIT_VALUE | TEST_VALUE;
- CTEST_LOG("AMOXOR: 0x%x vs 0x%x", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoxor_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOXOR_W((int32_t*)pdata, TEST_VALUE);
- uint32_t expected = INIT_VALUE ^ TEST_VALUE;
- CTEST_LOG("AMOXOR: 0x%x vs 0x%x", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomaxu_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOMAXU_W((uint32_t*)pdata, TEST_VALUE);
- uint32_t expected = (uint32_t)(INIT_VALUE) > (uint32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMAXU: %u vs %u", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomax_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- int32_t result = __AMOMAX_W((int32_t*)pdata, TEST_VALUE);
- int32_t expected = (int32_t)(INIT_VALUE) > (int32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMAX: %d vs %d", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amominu_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint32_t result = __AMOMINU_W((uint32_t*)pdata, TEST_VALUE);
- uint32_t expected = (uint32_t)(INIT_VALUE) < (uint32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMINU: %u vs %u", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomin_w)
- {
- uint32_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- int32_t result = __AMOMIN_W((int32_t*)pdata, TEST_VALUE);
- int32_t expected = (int32_t)(INIT_VALUE) < (int32_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMIN: %d vs %d", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- #if __RISCV_XLEN == 64
- CTEST(atomic, cas_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- ASSERT_EQUAL(__CAS_D((uint64_t*)pdata, INIT_VALUE, TEST_VALUE), INIT_VALUE);
- }
- CTEST(atomic, amoswap_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- ASSERT_EQUAL(__AMOSWAP_D((uint64_t*)pdata, TEST_VALUE), INIT_VALUE);
- }
- CTEST(atomic, amoadd_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOADD_D((int64_t*)pdata, TEST_VALUE);
- uint64_t expected = INIT_VALUE + TEST_VALUE;
- CTEST_LOG("AMOADD: 0x%lx vs 0x%lx", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoand_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOAND_D((int64_t*)pdata, TEST_VALUE);
- uint64_t expected = INIT_VALUE & TEST_VALUE;
- CTEST_LOG("AMOAND: 0x%lx vs 0x%lx", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoor_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOOR_D((int64_t*)pdata, TEST_VALUE);
- uint64_t expected = INIT_VALUE | TEST_VALUE;
- CTEST_LOG("AMOXOR: 0x%lx vs 0x%lx", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amoxor_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOXOR_D((int64_t*)pdata, TEST_VALUE);
- uint64_t expected = INIT_VALUE ^ TEST_VALUE;
- CTEST_LOG("AMOXOR: 0x%lx vs 0x%lx", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomaxu_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOMAXU_D((uint64_t*)pdata, TEST_VALUE);
- uint64_t expected = (uint64_t)(INIT_VALUE) > (uint64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMAXU: %lu vs %lu", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomax_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- int64_t result = __AMOMAX_D((int64_t*)pdata, TEST_VALUE);
- int64_t expected = (int64_t)(INIT_VALUE) > (int64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMAX: %ld vs %ld", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amominu_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- uint64_t result = __AMOMINU_D((uint64_t*)pdata, TEST_VALUE);
- uint64_t expected = (uint64_t)(INIT_VALUE) < (uint64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMINU: %lu vs %lu", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- CTEST(atomic, amomin_d)
- {
- uint64_t data = INIT_VALUE;
- unsigned long pdata = (unsigned long)(&data);
- int64_t result = __AMOMIN_D((int64_t*)pdata, TEST_VALUE);
- int64_t expected = (int64_t)(INIT_VALUE) < (int64_t)(TEST_VALUE) ? INIT_VALUE : TEST_VALUE;
- CTEST_LOG("AMOMIN: %ld vs %ld", result, expected);
- ASSERT_EQUAL(result, expected);
- }
- #endif
- #endif
|