From 186f3d2dcb93feecec87db66d5cefb768804df19 Mon Sep 17 00:00:00 2001 From: Dino Li Date: Tue, 7 Jan 2020 10:24:54 +0800 Subject: [PATCH] riscv-rv32i: Add sqrtf function The int_sqrtf() requires this function if we enable FPU. BRANCH=none BUG=none TEST=manual testing on console command: sqrtf(1.23) = 1.10 sqrtf(0.45) = 0.67 sqrtf(0) = 0 Change-Id: I354453674559ff2e1b956c9dba47baa493332871 Signed-off-by: Dino Li Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1982298 Reviewed-by: Jett Rink Commit-Queue: Dino Li Tested-by: Dino Li --- core/riscv-rv32i/build.mk | 2 +- core/riscv-rv32i/include/math.h | 13 +++++++++++++ core/riscv-rv32i/math.c | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 core/riscv-rv32i/include/math.h create mode 100644 core/riscv-rv32i/math.c diff --git a/core/riscv-rv32i/build.mk b/core/riscv-rv32i/build.mk index 5515eb79b0..c315148dcb 100644 --- a/core/riscv-rv32i/build.mk +++ b/core/riscv-rv32i/build.mk @@ -14,4 +14,4 @@ $(call set-option,CROSS_COMPILE,$(CROSS_COMPILE_riscv),\ CFLAGS_CPU+=-march=rv32imafc -mabi=ilp32f -Os LDFLAGS_EXTRA+=-mrelax -core-y=cpu.o init.o panic.o task.o switch.o __builtin.o +core-y=cpu.o init.o panic.o task.o switch.o __builtin.o math.o diff --git a/core/riscv-rv32i/include/math.h b/core/riscv-rv32i/include/math.h new file mode 100644 index 0000000000..f17144762a --- /dev/null +++ b/core/riscv-rv32i/include/math.h @@ -0,0 +1,13 @@ +/* Copyright 2020 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Math utility functions for RISC-V */ + +#ifndef __CROS_EC_MATH_H +#define __CROS_EC_MATH_H + +float sqrtf(float x); + +#endif /* __CROS_EC_MATH_H */ diff --git a/core/riscv-rv32i/math.c b/core/riscv-rv32i/math.c new file mode 100644 index 0000000000..591a67eb8f --- /dev/null +++ b/core/riscv-rv32i/math.c @@ -0,0 +1,19 @@ +/* Copyright 2020 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" + +#ifdef CONFIG_FPU +/* Single precision floating point square root. */ +float sqrtf(float x) +{ + asm volatile ( + "fsqrt.s %0, %1" + : "=f" (x) + : "f" (x)); + + return x; +} +#endif