arch/risc-v: Refine riscv_fpu.S

Signed-off-by: Huang Qi <huangqi3@xiaomi.com>
This commit is contained in:
Huang Qi 2021-12-29 11:14:27 +08:00 committed by Xiang Xiao
parent 6ce335fa84
commit 22ae2e0121
2 changed files with 21 additions and 244 deletions

View File

@ -1,5 +1,5 @@
/************************************************************************************
* arch/risc-v/src/rv64gc/riscv_fpu.S
* arch/risc-v/src/common/riscv_fpu.S
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@ -23,7 +23,12 @@
************************************************************************************/
#include <nuttx/config.h>
#ifdef CONFIG_ARCH_RV32
#include <arch/rv32im/irq.h>
#else
#include <arch/rv64gc/irq.h>
#endif
#ifdef CONFIG_ARCH_FPU
@ -58,6 +63,14 @@
# define FSTORE fsw
#endif
#ifdef CONFIG_ARCH_RV32
# define REGLOAD lw
# define REGSTORE sw
#else
# define REGLOAD ld
# define REGSTORE sd
#endif
/************************************************************************************
* Public Functions
************************************************************************************/
@ -95,7 +108,7 @@ up_fpuconfig:
* floating point registers.
*
* C Function Prototype:
* void riscv_savefpu(uint64_t *regs);
* void riscv_savefpu(uintptr_t *regs);
*
* Input Parameters:
* regs - A pointer to the register save area in which to save the floating point
@ -109,7 +122,7 @@ up_fpuconfig:
.type riscv_savefpu, function
riscv_savefpu:
ld t0, REG_INT_CTX(a0)
REGLOAD t0, REG_INT_CTX(a0)
li t1, FS_MASK
and t2, t0, t1
li t1, FS_DIRTY
@ -118,7 +131,7 @@ riscv_savefpu:
and t0, t0, t1
li t1, FS_CLEAN
or t0, t0, t1
sd t0, REG_INT_CTX(a0)
REGSTORE t0, REG_INT_CTX(a0)
/* Store all floating point registers */
@ -156,7 +169,7 @@ riscv_savefpu:
FSTORE f31, REG_F31(a0)
frcsr t0
sd t0, REG_FCSR(a0)
REGSTORE t0, REG_FCSR(a0)
1:
ret
@ -169,7 +182,7 @@ riscv_savefpu:
* floating point registers.
*
* C Function Prototype:
* void riscv_restorefpu(const uint64_t *regs);
* void riscv_restorefpu(const uintptr_t *regs);
*
* Input Parameters:
* regs - A pointer to the register save area containing the floating point
@ -184,7 +197,7 @@ riscv_savefpu:
.type riscv_restorefpu, function
riscv_restorefpu:
ld t0, REG_INT_CTX(a0)
REGLOAD t0, REG_INT_CTX(a0)
li t1, FS_MASK
and t2, t0, t1
li t1, FS_INITIAL
@ -227,7 +240,7 @@ riscv_restorefpu:
/* Store the floating point control and status register */
ld t0, REG_FCSR(a0)
REGLOAD t0, REG_FCSR(a0)
fscsr t0
1:

View File

@ -1,236 +0,0 @@
/************************************************************************************
* arch/risc-v/src/rv32im/riscv_fpu.S
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
************************************************************************************/
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include <arch/rv32im/irq.h>
#ifdef CONFIG_ARCH_FPU
/************************************************************************************
* Pre-processor Definitions
************************************************************************************/
/************************************************************************************
* Public Symbols
************************************************************************************/
.globl up_fpuconfig
.globl riscv_savefpu
.globl riscv_restorefpu
.file "up_fpu.S"
#define FS_MASK 0x6000
#define FS_OFF 0x0000
#define FS_INITIAL 0x2000
#define FS_CLEAN 0x4000
#define FS_DIRTY 0x6000
#if defined(CONFIG_ARCH_DPFPU)
# define FLOAD fld
# define FSTORE fsd
#elif defined(CONFIG_ARCH_QPFPU)
# define FLOAD flq
# define FSTORE fsq
#else
# define FLOAD flw
# define FSTORE fsw
#endif
/************************************************************************************
* Public Functions
************************************************************************************/
/************************************************************************************
* Name: up_fpuconfig
*
* Description:
* init fpu
*
* C Function Prototype:
* void up_fpuconfig(void);
*
* Input Parameters:
* None
*
* Returned Value:
* This function does not return anything explicitly.
*
************************************************************************************/
.type up_fpuconfig, function
up_fpuconfig:
li a0, FS_INITIAL
csrs mstatus, a0
csrwi fcsr, 0
ret
/************************************************************************************
* Name: riscv_savefpu
*
* Description:
* Given the pointer to a register save area (in A0), save the state of the
* floating point registers.
*
* C Function Prototype:
* void riscv_savefpu(uint32_t *regs);
*
* Input Parameters:
* regs - A pointer to the register save area in which to save the floating point
* registers
*
* Returned Value:
* None
*
************************************************************************************/
.type riscv_savefpu, function
riscv_savefpu:
lw t0, REG_INT_CTX(a0)
li t1, FS_MASK
and t2, t0, t1
li t1, FS_DIRTY
bne t2, t1, 1f
li t1, ~FS_MASK
and t0, t0, t1
li t1, FS_CLEAN
or t0, t0, t1
sw t0, REG_INT_CTX(a0)
/* Store all floating point registers */
FSTORE f0, REG_F0(a0)
FSTORE f1, REG_F1(a0)
FSTORE f2, REG_F2(a0)
FSTORE f3, REG_F3(a0)
FSTORE f4, REG_F4(a0)
FSTORE f5, REG_F5(a0)
FSTORE f6, REG_F6(a0)
FSTORE f7, REG_F7(a0)
FSTORE f8, REG_F8(a0)
FSTORE f9, REG_F9(a0)
FSTORE f10, REG_F10(a0)
FSTORE f11, REG_F11(a0)
FSTORE f12, REG_F12(a0)
FSTORE f13, REG_F13(a0)
FSTORE f14, REG_F14(a0)
FSTORE f15, REG_F15(a0)
FSTORE f16, REG_F16(a0)
FSTORE f17, REG_F17(a0)
FSTORE f18, REG_F18(a0)
FSTORE f19, REG_F19(a0)
FSTORE f20, REG_F20(a0)
FSTORE f21, REG_F21(a0)
FSTORE f22, REG_F22(a0)
FSTORE f23, REG_F23(a0)
FSTORE f24, REG_F24(a0)
FSTORE f25, REG_F25(a0)
FSTORE f26, REG_F26(a0)
FSTORE f27, REG_F27(a0)
FSTORE f28, REG_F28(a0)
FSTORE f29, REG_F29(a0)
FSTORE f30, REG_F30(a0)
FSTORE f31, REG_F31(a0)
frcsr t0
sw t0, REG_FCSR(a0)
1:
ret
/************************************************************************************
* Name: riscv_restorefpu
*
* Description:
* Given the pointer to a register save area (in A0), restore the state of the
* floating point registers.
*
* C Function Prototype:
* void riscv_restorefpu(const uint32_t *regs);
*
* Input Parameters:
* regs - A pointer to the register save area containing the floating point
* registers.
*
* Returned Value:
* This function does not return anything explicitly. However, it is called from
* interrupt level assembly logic that assumes that r0 is preserved.
*
************************************************************************************/
.type riscv_restorefpu, function
riscv_restorefpu:
lw t0, REG_INT_CTX(a0)
li t1, FS_MASK
and t2, t0, t1
li t1, FS_INITIAL
ble t2, t1, 1f
/* Load all floating point registers */
FLOAD f0, REG_F0(a0)
FLOAD f1, REG_F1(a0)
FLOAD f2, REG_F2(a0)
FLOAD f3, REG_F3(a0)
FLOAD f4, REG_F4(a0)
FLOAD f5, REG_F5(a0)
FLOAD f6, REG_F6(a0)
FLOAD f7, REG_F7(a0)
FLOAD f8, REG_F8(a0)
FLOAD f9, REG_F9(a0)
FLOAD f10, REG_F10(a0)
FLOAD f11, REG_F11(a0)
FLOAD f12, REG_F12(a0)
FLOAD f13, REG_F13(a0)
FLOAD f14, REG_F14(a0)
FLOAD f15, REG_F15(a0)
FLOAD f16, REG_F16(a0)
FLOAD f17, REG_F17(a0)
FLOAD f18, REG_F18(a0)
FLOAD f19, REG_F19(a0)
FLOAD f20, REG_F20(a0)
FLOAD f21, REG_F21(a0)
FLOAD f22, REG_F22(a0)
FLOAD f23, REG_F23(a0)
FLOAD f24, REG_F24(a0)
FLOAD f25, REG_F25(a0)
FLOAD f26, REG_F26(a0)
FLOAD f27, REG_F27(a0)
FLOAD f28, REG_F28(a0)
FLOAD f29, REG_F29(a0)
FLOAD f30, REG_F30(a0)
FLOAD f31, REG_F31(a0)
/* Store the floating point control and status register */
lw t0, REG_FCSR(a0)
fscsr t0
1:
ret
#endif /* CONFIG_ARCH_FPU */