mirror of
https://github.com/justinian/jsix.git
synced 2025-12-09 16:04:32 -08:00
[libc] Implement some math.h functions with builtins
This commit adds implementation of some of the basic math.h functions with compiler builtins.
This commit is contained in:
@@ -6,7 +6,6 @@ variables:
|
|||||||
|
|
||||||
ccflags: [
|
ccflags: [
|
||||||
"--target=x86_64-jsix-elf",
|
"--target=x86_64-jsix-elf",
|
||||||
"-mno-sse",
|
|
||||||
"-fno-omit-frame-pointer",
|
"-fno-omit-frame-pointer",
|
||||||
"-fno-stack-protector",
|
"-fno-stack-protector",
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,12 @@
|
|||||||
|
|
||||||
// NOTE: libc math.h is only stubbed out currently!
|
// NOTE: libc math.h is only stubbed out currently!
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NAN 0
|
#define NAN 0
|
||||||
#define INFINITY 0
|
#define INFINITY __builtin_inff()
|
||||||
|
|
||||||
#define FP_NAN (-1)
|
#define FP_NAN (-1)
|
||||||
#define FP_ZERO 0
|
#define FP_ZERO 0
|
||||||
@@ -25,7 +29,7 @@
|
|||||||
typedef float float_t;
|
typedef float float_t;
|
||||||
typedef double double_t;
|
typedef double double_t;
|
||||||
|
|
||||||
#define isinf(x) 0
|
#define isinf(x) (__builtin_isinf_sign((x)) != 0)
|
||||||
#define isnan(x) 0
|
#define isnan(x) 0
|
||||||
#define isnormal(x) 0
|
#define isnormal(x) 0
|
||||||
|
|
||||||
@@ -38,7 +42,7 @@ typedef double double_t;
|
|||||||
FP_SUBNORMAL)
|
FP_SUBNORMAL)
|
||||||
|
|
||||||
|
|
||||||
#define signbit(x) 0
|
#define signbit(x) (__builtin_signbit((x)))
|
||||||
|
|
||||||
|
|
||||||
double acos(double x);
|
double acos(double x);
|
||||||
@@ -265,3 +269,8 @@ long double fminl(long double x, long double y);
|
|||||||
double fma(double x, double y, double z);
|
double fma(double x, double y, double z);
|
||||||
float fmaf(float x, float y, float z);
|
float fmaf(float x, float y, float z);
|
||||||
long double fmal(long double x, long double y, long double z);
|
long double fmal(long double x, long double y, long double z);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern C
|
||||||
|
#endif
|
||||||
|
|||||||
42
src/libraries/libc/math/builtins.cpp.cog
Normal file
42
src/libraries/libc/math/builtins.cpp.cog
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// vim: ft=cpp
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/*[[[cog code generation
|
||||||
|
|
||||||
|
builtins_single = [
|
||||||
|
"acos", "asin", "atan", "ceil", "cos", "cosh", "exp", "fabs",
|
||||||
|
"floor", "log10", "log", "sin", "sinh", "sqrt", "tan", "tanh",
|
||||||
|
]
|
||||||
|
|
||||||
|
builtins_double = ["atan2", "fmod", "pow"]
|
||||||
|
|
||||||
|
builtins_intp = [
|
||||||
|
"frexp", "ldexp", "modf",
|
||||||
|
]
|
||||||
|
|
||||||
|
for fname in builtins_single:
|
||||||
|
cog.outl(f"double {fname} (double x) {{ return __builtin_{fname}(x); }}")
|
||||||
|
cog.outl(f"float {fname}f (float x) {{ return __builtin_{fname}f(x); }}")
|
||||||
|
cog.outl(f"long double {fname}l (long double x) {{ return __builtin_{fname}l(x); }}")
|
||||||
|
cog.outl()
|
||||||
|
|
||||||
|
for fname in builtins_double:
|
||||||
|
cog.outl(f"double {fname} (double x, double y) {{ return __builtin_{fname}(x, y); }}")
|
||||||
|
cog.outl(f"float {fname}f (float x, float y) {{ return __builtin_{fname}f(x, y); }}")
|
||||||
|
cog.outl(f"long double {fname}l (long double x, long double y) {{ return __builtin_{fname}l(x, y); }}")
|
||||||
|
cog.outl()
|
||||||
|
|
||||||
|
]]]*/
|
||||||
|
/// [[[end]]]
|
||||||
|
|
||||||
|
double frexp(double value, int *exp) { return __builtin_frexp(value, exp); }
|
||||||
|
float frexpf(float value, int *exp) { return __builtin_frexpf(value, exp); }
|
||||||
|
long double frexpl(long double value, int *exp) { return __builtin_frexpl(value, exp); }
|
||||||
|
|
||||||
|
double ldexp(double x, int exp) { return __builtin_ldexp(x, exp); }
|
||||||
|
float ldexpf(float x, int exp) { return __builtin_ldexpf(x, exp); }
|
||||||
|
long double ldexpl(long double x, int exp) { return __builtin_ldexpl(x, exp); }
|
||||||
|
|
||||||
|
double modf(double value, double *iptr) { return __builtin_modf(value, iptr); }
|
||||||
|
float modff(float value, float *iptr) { return __builtin_modff(value, iptr); }
|
||||||
|
long double modfl(long double value, long double *iptr) { return __builtin_modfl(value, iptr); }
|
||||||
Reference in New Issue
Block a user