| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #include <stdlib.h>
- #include <stdio.h>
- #include "ctest.h"
- #include "nuclei_sdk_soc.h"
- #if defined(__FPU_PRESENT) && __FPU_PRESENT > 0
- CTEST(fpu, CSR)
- {
- CTEST_LOG("FCSR 0x%lx", __get_FCSR());
- CTEST_LOG("FRM 0x%lx", __get_FRM());
- CTEST_LOG("FFLAGS 0x%lx", __get_FFLAGS());
- ASSERT_EQUAL(__get_FCSR(), __get_FRM() << 5 | (__get_FFLAGS()));
- rv_csr_t old_fcsr = __get_FCSR();
- rv_csr_t newval = FFLAGS_AE_NX | (FRM_RNDMODE_DYN << 5);
- __set_FCSR(newval);
- ASSERT_EQUAL(__get_FCSR(), newval);
- ASSERT_EQUAL(__get_FRM(), FRM_RNDMODE_DYN);
- ASSERT_EQUAL(__get_FFLAGS(), FFLAGS_AE_NX);
- __set_FCSR(old_fcsr);
- __set_FRM(FRM_RNDMODE_RUP);
- ASSERT_EQUAL(__get_FRM(), FRM_RNDMODE_RUP);
- __set_FFLAGS(FFLAGS_AE_NV);
- ASSERT_EQUAL(__get_FFLAGS(), FFLAGS_AE_NV);
- ASSERT_EQUAL(__get_FCSR(), FFLAGS_AE_NV | (FRM_RNDMODE_RUP << 5));
- __set_FCSR(old_fcsr);
- CTEST_LOG("After operation");
- CTEST_LOG("FCSR 0x%lx", __get_FCSR());
- CTEST_LOG("FRM 0x%lx", __get_FRM());
- CTEST_LOG("FFLAGS 0x%lx", __get_FFLAGS());
- }
- CTEST(fpu, enable_disable)
- {
- __disable_FPU();
- ASSERT_EQUAL(__RV_CSR_READ(CSR_MSTATUS) & MSTATUS_FS, 0);
- __enable_FPU();
- ASSERT_EQUAL(__RV_CSR_READ(CSR_MSTATUS) & MSTATUS_FS, MSTATUS_FS_INITIAL);
- }
- CTEST(fpu, flwfsw)
- {
- uint32_t data[2] = {0xdeadbeef, 0x12345678};
- uint32_t regf0 = 0x87876767;
- uint32_t temp = 0;
- uint32_t memory[5] = {111, 2222, 33333, 44444, 555555};
- CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
- __RV_FLW(FREG(0), data, 0);
- CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
- __RV_FSW(FREG(0), ®f0, 0);
- CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
- ASSERT_EQUAL(regf0, data[0]);
- __RV_FLW(FREG(0), memory, 0);
- __RV_FSW(FREG(0), &temp, 0);
- ASSERT_EQUAL(memory[0], temp);
- __RV_FLW(FREG(1), memory, 4);
- __RV_FSW(FREG(1), &temp, 0);
- ASSERT_EQUAL(memory[1], temp);
- __RV_FLW(FREG(2), &memory[2], 0);
- __RV_FSW(FREG(2), &temp, 0);
- ASSERT_EQUAL(memory[2], temp);
- __RV_FLW(FREG(4), memory, 4 * 4);
- __RV_FSW(FREG(4), &temp, 0);
- ASSERT_EQUAL(memory[4], temp);
- }
- #if __FPU_PRESENT == 2
- CTEST(fpu, fldfsd)
- {
- double data[2] = {1.234, 2.456};
- double regf0[1] = {0.1};
- uint64_t temp = 0;
- uint64_t memory[5] = {111, 2222, 33333, 44444, 555555};
- //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
- __RV_FLD(FREG(0), data, 0);
- //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
- __RV_FSD(FREG(0), regf0, 0);
- //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
- ASSERT_EQUAL(regf0[0], data[0]);
- __RV_FLD(FREG(0), memory, 0);
- __RV_FSD(FREG(0), &temp, 0);
- ASSERT_EQUAL(memory[0], temp);
- __RV_FLD(FREG(1), memory, 8);
- __RV_FSD(FREG(1), &temp, 0);
- ASSERT_EQUAL(memory[1], temp);
- __RV_FLD(FREG(2), &memory[2], 0);
- __RV_FSD(FREG(2), &temp, 0);
- ASSERT_EQUAL(memory[2], temp);
- __RV_FLD(FREG(4), memory, 8 * 4);
- __RV_FSD(FREG(4), &temp, 0);
- ASSERT_EQUAL(memory[4], temp);
- }
- #endif
- CTEST(fpu, FSTOREFLOAD)
- {
- #if __FPU_PRESENT == 1
- uint32_t temp = 0;
- uint32_t memory[5] = {111, 2222, 33333, 44444, 555555};
- #elif __FPU_PRESENT == 2
- uint64_t temp = 0;
- uint64_t memory[5] = {111, 2222, 33333, 44444, 555555};
- #endif
- __RV_FLOAD(FREG(0), memory, 0);
- __RV_FSTORE(FREG(0), &temp, 0);
- ASSERT_EQUAL(memory[0], temp);
- __RV_FLOAD(FREG(1), memory, FPREGBYTES);
- __RV_FSTORE(FREG(1), &temp, 0);
- ASSERT_EQUAL(memory[1], temp);
- __RV_FLOAD(FREG(2), &memory[2], 0);
- __RV_FSTORE(FREG(2), &temp, 0);
- ASSERT_EQUAL(memory[2], temp);
- __RV_FLOAD(FREG(4), memory, FPREGBYTES * 4);
- __RV_FSTORE(FREG(4), &temp, 0);
- ASSERT_EQUAL(memory[4], temp);
- }
- CTEST(fpu, fpucontext)
- {
- SAVE_FPU_CONTEXT();
- RESTORE_FPU_CONTEXT();
- }
- #endif
|