You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/12/29 07:19:38 UTC
[incubator-nuttx] 01/02: arch/risc-v: Refine riscv_fpu.S
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 22ae2e01216c76df04951fbc96c01a2deb096f0c
Author: Huang Qi <hu...@xiaomi.com>
AuthorDate: Wed Dec 29 11:14:27 2021 +0800
arch/risc-v: Refine riscv_fpu.S
Signed-off-by: Huang Qi <hu...@xiaomi.com>
---
arch/risc-v/src/{rv64gc => common}/riscv_fpu.S | 29 ++-
arch/risc-v/src/rv32im/riscv_fpu.S | 236 -------------------------
2 files changed, 21 insertions(+), 244 deletions(-)
diff --git a/arch/risc-v/src/rv64gc/riscv_fpu.S b/arch/risc-v/src/common/riscv_fpu.S
similarity index 93%
rename from arch/risc-v/src/rv64gc/riscv_fpu.S
rename to arch/risc-v/src/common/riscv_fpu.S
index afa9666..9cb03f6 100644
--- a/arch/risc-v/src/rv64gc/riscv_fpu.S
+++ b/arch/risc-v/src/common/riscv_fpu.S
@@ -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:
diff --git a/arch/risc-v/src/rv32im/riscv_fpu.S b/arch/risc-v/src/rv32im/riscv_fpu.S
deleted file mode 100644
index 7320589..0000000
--- a/arch/risc-v/src/rv32im/riscv_fpu.S
+++ /dev/null
@@ -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 */