test_fpu.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "ctest.h"
  4. #include "nuclei_sdk_soc.h"
  5. #if defined(__FPU_PRESENT) && __FPU_PRESENT > 0
  6. CTEST(fpu, CSR)
  7. {
  8. CTEST_LOG("FCSR 0x%lx", __get_FCSR());
  9. CTEST_LOG("FRM 0x%lx", __get_FRM());
  10. CTEST_LOG("FFLAGS 0x%lx", __get_FFLAGS());
  11. ASSERT_EQUAL(__get_FCSR(), __get_FRM() << 5 | (__get_FFLAGS()));
  12. rv_csr_t old_fcsr = __get_FCSR();
  13. rv_csr_t newval = FFLAGS_AE_NX | (FRM_RNDMODE_DYN << 5);
  14. __set_FCSR(newval);
  15. ASSERT_EQUAL(__get_FCSR(), newval);
  16. ASSERT_EQUAL(__get_FRM(), FRM_RNDMODE_DYN);
  17. ASSERT_EQUAL(__get_FFLAGS(), FFLAGS_AE_NX);
  18. __set_FCSR(old_fcsr);
  19. __set_FRM(FRM_RNDMODE_RUP);
  20. ASSERT_EQUAL(__get_FRM(), FRM_RNDMODE_RUP);
  21. __set_FFLAGS(FFLAGS_AE_NV);
  22. ASSERT_EQUAL(__get_FFLAGS(), FFLAGS_AE_NV);
  23. ASSERT_EQUAL(__get_FCSR(), FFLAGS_AE_NV | (FRM_RNDMODE_RUP << 5));
  24. __set_FCSR(old_fcsr);
  25. CTEST_LOG("After operation");
  26. CTEST_LOG("FCSR 0x%lx", __get_FCSR());
  27. CTEST_LOG("FRM 0x%lx", __get_FRM());
  28. CTEST_LOG("FFLAGS 0x%lx", __get_FFLAGS());
  29. }
  30. CTEST(fpu, enable_disable)
  31. {
  32. __disable_FPU();
  33. ASSERT_EQUAL(__RV_CSR_READ(CSR_MSTATUS) & MSTATUS_FS, 0);
  34. __enable_FPU();
  35. ASSERT_EQUAL(__RV_CSR_READ(CSR_MSTATUS) & MSTATUS_FS, MSTATUS_FS_INITIAL);
  36. }
  37. CTEST(fpu, flwfsw)
  38. {
  39. uint32_t data[2] = {0xdeadbeef, 0x12345678};
  40. uint32_t regf0 = 0x87876767;
  41. uint32_t temp = 0;
  42. uint32_t memory[5] = {111, 2222, 33333, 44444, 555555};
  43. CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
  44. __RV_FLW(FREG(0), data, 0);
  45. CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
  46. __RV_FSW(FREG(0), &regf0, 0);
  47. CTEST_LOG("Current f0, data0 is 0x%x, 0x%x", regf0, data[0]);
  48. ASSERT_EQUAL(regf0, data[0]);
  49. __RV_FLW(FREG(0), memory, 0);
  50. __RV_FSW(FREG(0), &temp, 0);
  51. ASSERT_EQUAL(memory[0], temp);
  52. __RV_FLW(FREG(1), memory, 4);
  53. __RV_FSW(FREG(1), &temp, 0);
  54. ASSERT_EQUAL(memory[1], temp);
  55. __RV_FLW(FREG(2), &memory[2], 0);
  56. __RV_FSW(FREG(2), &temp, 0);
  57. ASSERT_EQUAL(memory[2], temp);
  58. __RV_FLW(FREG(4), memory, 4 * 4);
  59. __RV_FSW(FREG(4), &temp, 0);
  60. ASSERT_EQUAL(memory[4], temp);
  61. }
  62. #if __FPU_PRESENT == 2
  63. CTEST(fpu, fldfsd)
  64. {
  65. double data[2] = {1.234, 2.456};
  66. double regf0[1] = {0.1};
  67. uint64_t temp = 0;
  68. uint64_t memory[5] = {111, 2222, 33333, 44444, 555555};
  69. //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
  70. __RV_FLD(FREG(0), data, 0);
  71. //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
  72. __RV_FSD(FREG(0), regf0, 0);
  73. //CTEST_LOG("Current f0, data0 is %f, %f", (float)regf0[0], (float)data[0]);
  74. ASSERT_EQUAL(regf0[0], data[0]);
  75. __RV_FLD(FREG(0), memory, 0);
  76. __RV_FSD(FREG(0), &temp, 0);
  77. ASSERT_EQUAL(memory[0], temp);
  78. __RV_FLD(FREG(1), memory, 8);
  79. __RV_FSD(FREG(1), &temp, 0);
  80. ASSERT_EQUAL(memory[1], temp);
  81. __RV_FLD(FREG(2), &memory[2], 0);
  82. __RV_FSD(FREG(2), &temp, 0);
  83. ASSERT_EQUAL(memory[2], temp);
  84. __RV_FLD(FREG(4), memory, 8 * 4);
  85. __RV_FSD(FREG(4), &temp, 0);
  86. ASSERT_EQUAL(memory[4], temp);
  87. }
  88. #endif
  89. CTEST(fpu, FSTOREFLOAD)
  90. {
  91. #if __FPU_PRESENT == 1
  92. uint32_t temp = 0;
  93. uint32_t memory[5] = {111, 2222, 33333, 44444, 555555};
  94. #elif __FPU_PRESENT == 2
  95. uint64_t temp = 0;
  96. uint64_t memory[5] = {111, 2222, 33333, 44444, 555555};
  97. #endif
  98. __RV_FLOAD(FREG(0), memory, 0);
  99. __RV_FSTORE(FREG(0), &temp, 0);
  100. ASSERT_EQUAL(memory[0], temp);
  101. __RV_FLOAD(FREG(1), memory, FPREGBYTES);
  102. __RV_FSTORE(FREG(1), &temp, 0);
  103. ASSERT_EQUAL(memory[1], temp);
  104. __RV_FLOAD(FREG(2), &memory[2], 0);
  105. __RV_FSTORE(FREG(2), &temp, 0);
  106. ASSERT_EQUAL(memory[2], temp);
  107. __RV_FLOAD(FREG(4), memory, FPREGBYTES * 4);
  108. __RV_FSTORE(FREG(4), &temp, 0);
  109. ASSERT_EQUAL(memory[4], temp);
  110. }
  111. CTEST(fpu, fpucontext)
  112. {
  113. SAVE_FPU_CONTEXT();
  114. RESTORE_FPU_CONTEXT();
  115. }
  116. #endif