Thead_common: refactor float-point save/store macro

This commit is contained in:
Paul Pan 2023-02-01 16:16:23 +08:00
parent c9bf3486c6
commit 98c7fbbf8d
2 changed files with 92 additions and 136 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/.idea
/cmake-*

View File

@ -53,152 +53,106 @@
#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ #ifndef __FREERTOS_RISC_V_EXTENSIONS_H__
#define __FREERTOS_RISC_V_EXTENSIONS_H__ #define __FREERTOS_RISC_V_EXTENSIONS_H__
#define portasmHANDLE_INTERRUPT Default_IRQHandler
#define portasmHAS_SIFIVE_CLINT 1 #define portasmHAS_SIFIVE_CLINT 1
#define portasmHAS_MTIME 1 #define portasmHAS_MTIME 1
#define portasmADDITIONAL_CONTEXT_SIZE 32 /* Must be even number on 32-bit cores. */
/* 32 fp, 1 fcsr, 1 padding */
#define portasmADDITIONAL_CONTEXT_SIZE 34 /* Must be even number on 32-bit cores. */
/* C906: lp64d, E907: ilp32f, so __riscv_flen matches with portWORD_SIZE */
#if __riscv_flen == 64
#define FS fsd
#define FL fld
#elif __riscv_flen == 32
#define FS fsw
#define FL flw
#endif
.macro portasmSAVE_ADDITIONAL_REGISTERS .macro portasmSAVE_ADDITIONAL_REGISTERS
/* save float registers */ /* save float registers */
/* alloc stack */
addi sp, sp, -(portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) addi sp, sp, -(portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE)
#if __riscv_flen == 64
fsd f31, 32 * portWORD_SIZE( sp ) /* save fcsr */
fsd f30, 31 * portWORD_SIZE( sp ) frcsr t0
fsd f29, 30 * portWORD_SIZE( sp ) sw t0, 33 * portWORD_SIZE( sp )
fsd f28, 29 * portWORD_SIZE( sp )
fsd f27, 28 * portWORD_SIZE( sp ) /* save fpr */
fsd f26, 27 * portWORD_SIZE( sp ) FS f31, 32 * portWORD_SIZE( sp )
fsd f25, 26 * portWORD_SIZE( sp ) FS f30, 31 * portWORD_SIZE( sp )
fsd f24, 25 * portWORD_SIZE( sp ) FS f29, 30 * portWORD_SIZE( sp )
fsd f23, 24 * portWORD_SIZE( sp ) FS f28, 29 * portWORD_SIZE( sp )
fsd f22, 23 * portWORD_SIZE( sp ) FS f27, 28 * portWORD_SIZE( sp )
fsd f21, 22 * portWORD_SIZE( sp ) FS f26, 27 * portWORD_SIZE( sp )
fsd f20, 21 * portWORD_SIZE( sp ) FS f25, 26 * portWORD_SIZE( sp )
fsd f19, 20 * portWORD_SIZE( sp ) FS f24, 25 * portWORD_SIZE( sp )
fsd f18, 19 * portWORD_SIZE( sp ) FS f23, 24 * portWORD_SIZE( sp )
fsd f17, 18 * portWORD_SIZE( sp ) FS f22, 23 * portWORD_SIZE( sp )
fsd f16, 17 * portWORD_SIZE( sp ) FS f21, 22 * portWORD_SIZE( sp )
fsd f15, 16 * portWORD_SIZE( sp ) FS f20, 21 * portWORD_SIZE( sp )
fsd f14, 15 * portWORD_SIZE( sp ) FS f19, 20 * portWORD_SIZE( sp )
fsd f13, 14 * portWORD_SIZE( sp ) FS f18, 19 * portWORD_SIZE( sp )
fsd f12, 13 * portWORD_SIZE( sp ) FS f17, 18 * portWORD_SIZE( sp )
fsd f11, 12 * portWORD_SIZE( sp ) FS f16, 17 * portWORD_SIZE( sp )
fsd f10, 11 * portWORD_SIZE( sp ) FS f15, 16 * portWORD_SIZE( sp )
fsd f9, 10 * portWORD_SIZE( sp ) FS f14, 15 * portWORD_SIZE( sp )
fsd f8, 9 * portWORD_SIZE( sp ) FS f13, 14 * portWORD_SIZE( sp )
fsd f7, 8 * portWORD_SIZE( sp ) FS f12, 13 * portWORD_SIZE( sp )
fsd f6, 7 * portWORD_SIZE( sp ) FS f11, 12 * portWORD_SIZE( sp )
fsd f5, 6 * portWORD_SIZE( sp ) FS f10, 11 * portWORD_SIZE( sp )
fsd f4, 5 * portWORD_SIZE( sp ) FS f9, 10 * portWORD_SIZE( sp )
fsd f3, 4 * portWORD_SIZE( sp ) FS f8, 9 * portWORD_SIZE( sp )
fsd f2, 3 * portWORD_SIZE( sp ) FS f7, 8 * portWORD_SIZE( sp )
fsd f1, 2 * portWORD_SIZE( sp ) FS f6, 7 * portWORD_SIZE( sp )
fsd f0, 1 * portWORD_SIZE( sp ) FS f5, 6 * portWORD_SIZE( sp )
#elif __riscv_flen == 32 FS f4, 5 * portWORD_SIZE( sp )
fsw f31, 32 * portWORD_SIZE( sp ) FS f3, 4 * portWORD_SIZE( sp )
fsw f30, 31 * portWORD_SIZE( sp ) FS f2, 3 * portWORD_SIZE( sp )
fsw f29, 30 * portWORD_SIZE( sp ) FS f1, 2 * portWORD_SIZE( sp )
fsw f28, 29 * portWORD_SIZE( sp ) FS f0, 1 * portWORD_SIZE( sp )
fsw f27, 28 * portWORD_SIZE( sp )
fsw f26, 27 * portWORD_SIZE( sp )
fsw f25, 26 * portWORD_SIZE( sp )
fsw f24, 25 * portWORD_SIZE( sp )
fsw f23, 24 * portWORD_SIZE( sp )
fsw f22, 23 * portWORD_SIZE( sp )
fsw f21, 22 * portWORD_SIZE( sp )
fsw f20, 21 * portWORD_SIZE( sp )
fsw f19, 20 * portWORD_SIZE( sp )
fsw f18, 19 * portWORD_SIZE( sp )
fsw f17, 18 * portWORD_SIZE( sp )
fsw f16, 17 * portWORD_SIZE( sp )
fsw f15, 16 * portWORD_SIZE( sp )
fsw f14, 15 * portWORD_SIZE( sp )
fsw f13, 14 * portWORD_SIZE( sp )
fsw f12, 13 * portWORD_SIZE( sp )
fsw f11, 12 * portWORD_SIZE( sp )
fsw f10, 11 * portWORD_SIZE( sp )
fsw f9, 10 * portWORD_SIZE( sp )
fsw f8, 9 * portWORD_SIZE( sp )
fsw f7, 8 * portWORD_SIZE( sp )
fsw f6, 7 * portWORD_SIZE( sp )
fsw f5, 6 * portWORD_SIZE( sp )
fsw f4, 5 * portWORD_SIZE( sp )
fsw f3, 4 * portWORD_SIZE( sp )
fsw f2, 3 * portWORD_SIZE( sp )
fsw f1, 2 * portWORD_SIZE( sp )
fsw f0, 1 * portWORD_SIZE( sp )
#endif
.endm .endm
.macro portasmRESTORE_ADDITIONAL_REGISTERS .macro portasmRESTORE_ADDITIONAL_REGISTERS
/* load float registers */ /* load float registers */
#if __riscv_flen == 64 /* load fcsr */
fld f31, 32 * portWORD_SIZE( sp ) lw t0, 33 * portWORD_SIZE( sp )
fld f30, 31 * portWORD_SIZE( sp ) fscsr t0
fld f29, 30 * portWORD_SIZE( sp )
fld f28, 29 * portWORD_SIZE( sp ) /* load fpr */
fld f27, 28 * portWORD_SIZE( sp ) FL f31, 32 * portWORD_SIZE( sp )
fld f26, 27 * portWORD_SIZE( sp ) FL f30, 31 * portWORD_SIZE( sp )
fld f25, 26 * portWORD_SIZE( sp ) FL f29, 30 * portWORD_SIZE( sp )
fld f24, 25 * portWORD_SIZE( sp ) FL f28, 29 * portWORD_SIZE( sp )
fld f23, 24 * portWORD_SIZE( sp ) FL f27, 28 * portWORD_SIZE( sp )
fld f22, 23 * portWORD_SIZE( sp ) FL f26, 27 * portWORD_SIZE( sp )
fld f21, 22 * portWORD_SIZE( sp ) FL f25, 26 * portWORD_SIZE( sp )
fld f20, 21 * portWORD_SIZE( sp ) FL f24, 25 * portWORD_SIZE( sp )
fld f19, 20 * portWORD_SIZE( sp ) FL f23, 24 * portWORD_SIZE( sp )
fld f18, 19 * portWORD_SIZE( sp ) FL f22, 23 * portWORD_SIZE( sp )
fld f17, 18 * portWORD_SIZE( sp ) FL f21, 22 * portWORD_SIZE( sp )
fld f16, 17 * portWORD_SIZE( sp ) FL f20, 21 * portWORD_SIZE( sp )
fld f15, 16 * portWORD_SIZE( sp ) FL f19, 20 * portWORD_SIZE( sp )
fld f14, 15 * portWORD_SIZE( sp ) FL f18, 19 * portWORD_SIZE( sp )
fld f13, 14 * portWORD_SIZE( sp ) FL f17, 18 * portWORD_SIZE( sp )
fld f12, 13 * portWORD_SIZE( sp ) FL f16, 17 * portWORD_SIZE( sp )
fld f11, 12 * portWORD_SIZE( sp ) FL f15, 16 * portWORD_SIZE( sp )
fld f10, 11 * portWORD_SIZE( sp ) FL f14, 15 * portWORD_SIZE( sp )
fld f9, 10 * portWORD_SIZE( sp ) FL f13, 14 * portWORD_SIZE( sp )
fld f8, 9 * portWORD_SIZE( sp ) FL f12, 13 * portWORD_SIZE( sp )
fld f7, 8 * portWORD_SIZE( sp ) FL f11, 12 * portWORD_SIZE( sp )
fld f6, 7 * portWORD_SIZE( sp ) FL f10, 11 * portWORD_SIZE( sp )
fld f5, 6 * portWORD_SIZE( sp ) FL f9, 10 * portWORD_SIZE( sp )
fld f4, 5 * portWORD_SIZE( sp ) FL f8, 9 * portWORD_SIZE( sp )
fld f3, 4 * portWORD_SIZE( sp ) FL f7, 8 * portWORD_SIZE( sp )
fld f2, 3 * portWORD_SIZE( sp ) FL f6, 7 * portWORD_SIZE( sp )
fld f1, 2 * portWORD_SIZE( sp ) FL f5, 6 * portWORD_SIZE( sp )
fld f0, 1 * portWORD_SIZE( sp ) FL f4, 5 * portWORD_SIZE( sp )
#elif __riscv_flen == 32 FL f3, 4 * portWORD_SIZE( sp )
flw f31, 32 * portWORD_SIZE( sp ) FL f2, 3 * portWORD_SIZE( sp )
flw f30, 31 * portWORD_SIZE( sp ) FL f1, 2 * portWORD_SIZE( sp )
flw f29, 30 * portWORD_SIZE( sp ) FL f0, 1 * portWORD_SIZE( sp )
flw f28, 29 * portWORD_SIZE( sp )
flw f27, 28 * portWORD_SIZE( sp ) /* free stack */
flw f26, 27 * portWORD_SIZE( sp )
flw f25, 26 * portWORD_SIZE( sp )
flw f24, 25 * portWORD_SIZE( sp )
flw f23, 24 * portWORD_SIZE( sp )
flw f22, 23 * portWORD_SIZE( sp )
flw f21, 22 * portWORD_SIZE( sp )
flw f20, 21 * portWORD_SIZE( sp )
flw f19, 20 * portWORD_SIZE( sp )
flw f18, 19 * portWORD_SIZE( sp )
flw f17, 18 * portWORD_SIZE( sp )
flw f16, 17 * portWORD_SIZE( sp )
flw f15, 16 * portWORD_SIZE( sp )
flw f14, 15 * portWORD_SIZE( sp )
flw f13, 14 * portWORD_SIZE( sp )
flw f12, 13 * portWORD_SIZE( sp )
flw f11, 12 * portWORD_SIZE( sp )
flw f10, 11 * portWORD_SIZE( sp )
flw f9, 10 * portWORD_SIZE( sp )
flw f8, 9 * portWORD_SIZE( sp )
flw f7, 8 * portWORD_SIZE( sp )
flw f6, 7 * portWORD_SIZE( sp )
flw f5, 6 * portWORD_SIZE( sp )
flw f4, 5 * portWORD_SIZE( sp )
flw f3, 4 * portWORD_SIZE( sp )
flw f2, 3 * portWORD_SIZE( sp )
flw f1, 2 * portWORD_SIZE( sp )
flw f0, 1 * portWORD_SIZE( sp )
#endif
addi sp, sp, (portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) addi sp, sp, (portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE)
.endm .endm