riscv32: add fenv and math

These are identical to riscv64.
This commit is contained in:
Stefan O'Rear 2020-09-03 05:45:44 -04:00 committed by Rich Felker
parent 01d9fe4d9f
commit b4f7b2ca35
14 changed files with 239 additions and 0 deletions

View File

@ -0,0 +1,3 @@
#ifndef __riscv_flen
#include "../fenv.c"
#endif

56
src/fenv/riscv32/fenv.S Normal file
View File

@ -0,0 +1,56 @@
#ifdef __riscv_flen
.global feclearexcept
.type feclearexcept, %function
feclearexcept:
csrc fflags, a0
li a0, 0
ret
.global feraiseexcept
.type feraiseexcept, %function
feraiseexcept:
csrs fflags, a0
li a0, 0
ret
.global fetestexcept
.type fetestexcept, %function
fetestexcept:
frflags t0
and a0, t0, a0
ret
.global fegetround
.type fegetround, %function
fegetround:
frrm a0
ret
.global __fesetround
.type __fesetround, %function
__fesetround:
fsrm t0, a0
li a0, 0
ret
.global fegetenv
.type fegetenv, %function
fegetenv:
frcsr t0
sw t0, 0(a0)
li a0, 0
ret
.global fesetenv
.type fesetenv, %function
fesetenv:
li t2, -1
li t1, 0
beq a0, t2, 1f
lw t1, 0(a0)
1: fscsr t1
li a0, 0
ret
#endif

View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double copysign(double x, double y)
{
__asm__ ("fsgnj.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../copysign.c"
#endif

View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float copysignf(float x, float y)
{
__asm__ ("fsgnj.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../copysignf.c"
#endif

15
src/math/riscv32/fabs.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double fabs(double x)
{
__asm__ ("fabs.d %0, %1" : "=f"(x) : "f"(x));
return x;
}
#else
#include "../fabs.c"
#endif

15
src/math/riscv32/fabsf.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float fabsf(float x)
{
__asm__ ("fabs.s %0, %1" : "=f"(x) : "f"(x));
return x;
}
#else
#include "../fabsf.c"
#endif

15
src/math/riscv32/fma.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double fma(double x, double y, double z)
{
__asm__ ("fmadd.d %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
return x;
}
#else
#include "../fma.c"
#endif

15
src/math/riscv32/fmaf.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float fmaf(float x, float y, float z)
{
__asm__ ("fmadd.s %0, %1, %2, %3" : "=f"(x) : "f"(x), "f"(y), "f"(z));
return x;
}
#else
#include "../fmaf.c"
#endif

15
src/math/riscv32/fmax.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double fmax(double x, double y)
{
__asm__ ("fmax.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../fmax.c"
#endif

15
src/math/riscv32/fmaxf.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float fmaxf(float x, float y)
{
__asm__ ("fmax.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../fmaxf.c"
#endif

15
src/math/riscv32/fmin.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double fmin(double x, double y)
{
__asm__ ("fmin.d %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../fmin.c"
#endif

15
src/math/riscv32/fminf.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float fminf(float x, float y)
{
__asm__ ("fmin.s %0, %1, %2" : "=f"(x) : "f"(x), "f"(y));
return x;
}
#else
#include "../fminf.c"
#endif

15
src/math/riscv32/sqrt.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 64
double sqrt(double x)
{
__asm__ ("fsqrt.d %0, %1" : "=f"(x) : "f"(x));
return x;
}
#else
#include "../sqrt.c"
#endif

15
src/math/riscv32/sqrtf.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#if __riscv_flen >= 32
float sqrtf(float x)
{
__asm__ ("fsqrt.s %0, %1" : "=f"(x) : "f"(x));
return x;
}
#else
#include "../sqrtf.c"
#endif