diff options
author | Anup Patel <anup.patel@wdc.com> | 2019-01-03 08:07:43 +0300 |
---|---|---|
committer | Atish Patra <atishp04@gmail.com> | 2019-01-04 01:21:08 +0300 |
commit | 4d1eccc41d96413fae25cea5f941f7860429340b (patch) | |
tree | ce8e984f098ba2447a36af4c78d13089eb7e3f7b /lib | |
parent | 9829a86e8dcd98b62eb3095eb86131cb2dbd5330 (diff) | |
download | opensbi-4d1eccc41d96413fae25cea5f941f7860429340b.tar.xz |
include: Add hard FP access macros and defines
This patch adds hardware floating-point (hard FP) access
macros and defines.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/objects.mk | 1 | ||||
-rw-r--r-- | lib/riscv_hardfp.S | 171 | ||||
-rw-r--r-- | lib/sbi_hart.c | 8 |
3 files changed, 173 insertions, 7 deletions
diff --git a/lib/objects.mk b/lib/objects.mk index b70557d..2ce6328 100644 --- a/lib/objects.mk +++ b/lib/objects.mk @@ -9,6 +9,7 @@ lib-objs-y += riscv_asm.o lib-objs-y += riscv_atomic.o +lib-objs-y += riscv_hardfp.o lib-objs-y += riscv_locks.o lib-objs-y += sbi_console.o diff --git a/lib/riscv_hardfp.S b/lib/riscv_hardfp.S new file mode 100644 index 0000000..11f3e41 --- /dev/null +++ b/lib/riscv_hardfp.S @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2019 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel <anup.patel@wdc.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#ifdef __riscv_flen + +#if __riscv_flen != 64 +# error single-float only is not supported +#endif + +#define get_f32(which) fmv.x.s a0, which; jr t0 +#define put_f32(which) fmv.s.x which, a0; jr t0 +#if __riscv_xlen == 64 +# define get_f64(which) fmv.x.d a0, which; jr t0 +# define put_f64(which) fmv.d.x which, a0; jr t0 +#else +# define get_f64(which) fsd which, 0(a0); jr t0 +# define put_f64(which) fld which, 0(a0); jr t0 +#endif + + .text + .option norvc + .globl get_f32_reg + get_f32_reg: + get_f32(f0) + get_f32(f1) + get_f32(f2) + get_f32(f3) + get_f32(f4) + get_f32(f5) + get_f32(f6) + get_f32(f7) + get_f32(f8) + get_f32(f9) + get_f32(f10) + get_f32(f11) + get_f32(f12) + get_f32(f13) + get_f32(f14) + get_f32(f15) + get_f32(f16) + get_f32(f17) + get_f32(f18) + get_f32(f19) + get_f32(f20) + get_f32(f21) + get_f32(f22) + get_f32(f23) + get_f32(f24) + get_f32(f25) + get_f32(f26) + get_f32(f27) + get_f32(f28) + get_f32(f29) + get_f32(f30) + get_f32(f31) + + .text + .globl put_f32_reg + put_f32_reg: + put_f32(f0) + put_f32(f1) + put_f32(f2) + put_f32(f3) + put_f32(f4) + put_f32(f5) + put_f32(f6) + put_f32(f7) + put_f32(f8) + put_f32(f9) + put_f32(f10) + put_f32(f11) + put_f32(f12) + put_f32(f13) + put_f32(f14) + put_f32(f15) + put_f32(f16) + put_f32(f17) + put_f32(f18) + put_f32(f19) + put_f32(f20) + put_f32(f21) + put_f32(f22) + put_f32(f23) + put_f32(f24) + put_f32(f25) + put_f32(f26) + put_f32(f27) + put_f32(f28) + put_f32(f29) + put_f32(f30) + put_f32(f31) + + .text + .globl get_f64_reg + get_f64_reg: + get_f64(f0) + get_f64(f1) + get_f64(f2) + get_f64(f3) + get_f64(f4) + get_f64(f5) + get_f64(f6) + get_f64(f7) + get_f64(f8) + get_f64(f9) + get_f64(f10) + get_f64(f11) + get_f64(f12) + get_f64(f13) + get_f64(f14) + get_f64(f15) + get_f64(f16) + get_f64(f17) + get_f64(f18) + get_f64(f19) + get_f64(f20) + get_f64(f21) + get_f64(f22) + get_f64(f23) + get_f64(f24) + get_f64(f25) + get_f64(f26) + get_f64(f27) + get_f64(f28) + get_f64(f29) + get_f64(f30) + get_f64(f31) + + .text + .globl put_f64_reg + put_f64_reg: + put_f64(f0) + put_f64(f1) + put_f64(f2) + put_f64(f3) + put_f64(f4) + put_f64(f5) + put_f64(f6) + put_f64(f7) + put_f64(f8) + put_f64(f9) + put_f64(f10) + put_f64(f11) + put_f64(f12) + put_f64(f13) + put_f64(f14) + put_f64(f15) + put_f64(f16) + put_f64(f17) + put_f64(f18) + put_f64(f19) + put_f64(f20) + put_f64(f21) + put_f64(f22) + put_f64(f23) + put_f64(f24) + put_f64(f25) + put_f64(f26) + put_f64(f27) + put_f64(f28) + put_f64(f29) + put_f64(f30) + put_f64(f31) + +#endif diff --git a/lib/sbi_hart.c b/lib/sbi_hart.c index 1e5465f..e8a689e 100644 --- a/lib/sbi_hart.c +++ b/lib/sbi_hart.c @@ -10,6 +10,7 @@ #include <sbi/riscv_asm.h> #include <sbi/riscv_barrier.h> #include <sbi/riscv_encoding.h> +#include <sbi/riscv_fp.h> #include <sbi/riscv_locks.h> #include <sbi/sbi_bits.h> #include <sbi/sbi_console.h> @@ -48,13 +49,6 @@ static void mstatus_init(struct sbi_scratch *scratch, u32 hartid) csr_write(sptbr, 0); } -#ifdef __riscv_flen -static void init_fp_reg(int i) -{ - /* TODO: */ -} -#endif - static int fp_init(u32 hartid) { #ifdef __riscv_flen |