Skip to content

Commit 7e8bce3

Browse files
committed
Provide math.h from hermit-builtins
1 parent 03ae227 commit 7e8bce3

File tree

5 files changed

+293
-0
lines changed

5 files changed

+293
-0
lines changed

hermit-builtins/Cargo.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hermit-builtins/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ name = "hermit-builtins"
33
version = "0.1.0"
44
edition = "2021"
55

6+
[dependencies]
7+
libm = "0.2"
8+
69
[lib]
710
crate-type = ["staticlib"]

hermit-builtins/exports

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,117 @@ memcpy
33
memmove
44
memset
55
strlen
6+
acos
7+
acosf
8+
acosh
9+
acoshf
10+
asin
11+
asinf
12+
asinh
13+
asinhf
14+
atan
15+
atan2
16+
atan2f
17+
atanf
18+
atanh
19+
atanhf
20+
cbrt
21+
cbrtf
22+
ceil
23+
ceilf
24+
copysign
25+
copysignf
26+
cos
27+
cosf
28+
cosh
29+
coshf
30+
erf
31+
erfc
32+
erfcf
33+
erff
34+
exp
35+
exp10
36+
exp10f
37+
exp2
38+
exp2f
39+
expf
40+
expm1
41+
expm1f
42+
fabs
43+
fabsf
44+
fdim
45+
fdimf
46+
floor
47+
floorf
48+
fma
49+
fmaf
50+
fmax
51+
fmaxf
52+
fmin
53+
fminf
54+
fmod
55+
fmodf
56+
frexp
57+
frexpf
58+
hypot
59+
hypotf
60+
ilogb
61+
ilogbf
62+
j0
63+
j0f
64+
j1
65+
j1f
66+
jn
67+
jnf
68+
ldexp
69+
ldexpf
70+
lgamma
71+
lgamma_r
72+
lgammaf
73+
lgammaf_r
74+
log
75+
log10
76+
log10f
77+
log1p
78+
log1pf
79+
log2
80+
log2f
81+
logf
82+
modf
83+
modff
84+
nextafter
85+
nextafterf
86+
pow
87+
powf
88+
remainder
89+
remainderf
90+
remquo
91+
remquof
92+
rint
93+
rintf
94+
round
95+
roundf
96+
scalbn
97+
scalbnf
98+
sin
99+
sincos
100+
sincosf
101+
sinf
102+
sinh
103+
sinhf
104+
sqrt
105+
sqrtf
106+
tan
107+
tanf
108+
tanh
109+
tanhf
110+
tgamma
111+
tgammaf
112+
trunc
113+
truncf
114+
y0
115+
y0f
116+
y1
117+
y1f
118+
yn
119+
ynf

hermit-builtins/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#![no_std]
22

3+
pub mod math;
4+
35
#[panic_handler]
46
fn panic(_info: &core::panic::PanicInfo) -> ! {
57
loop {}

hermit-builtins/src/math.rs

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
//! C-compatible math functions ([`math.h`]).
2+
//!
3+
//! [`math.h`]: https://en.cppreference.com/w/c/numeric/math
4+
5+
macro_rules! export {
6+
($(fn $fn:ident($($arg:ident: $argty:ty),+) -> $retty:ty;)+) => {
7+
$(
8+
#[no_mangle]
9+
pub extern "C" fn $fn($($arg: $argty),+) -> $retty {
10+
::libm::$fn($($arg),+)
11+
}
12+
)+
13+
};
14+
}
15+
16+
export! {
17+
fn acos(x: f64) -> f64;
18+
fn acosf(x: f32) -> f32;
19+
fn acosh(x: f64) -> f64;
20+
fn acoshf(x: f32) -> f32;
21+
fn asin(x: f64) -> f64;
22+
fn asinf(x: f32) -> f32;
23+
fn asinh(x: f64) -> f64;
24+
fn asinhf(x: f32) -> f32;
25+
fn atan(x: f64) -> f64;
26+
fn atan2(y: f64, x: f64) -> f64;
27+
fn atan2f(y: f32, x: f32) -> f32;
28+
fn atanf(x: f32) -> f32;
29+
fn atanh(x: f64) -> f64;
30+
fn atanhf(x: f32) -> f32;
31+
fn cbrt(x: f64) -> f64;
32+
fn cbrtf(x: f32) -> f32;
33+
fn ceil(x: f64) -> f64;
34+
fn ceilf(x: f32) -> f32;
35+
fn copysign(x: f64, y: f64) -> f64;
36+
fn copysignf(x: f32, y: f32) -> f32;
37+
fn cos(x: f64) -> f64;
38+
fn cosf(x: f32) -> f32;
39+
fn cosh(x: f64) -> f64;
40+
fn coshf(x: f32) -> f32;
41+
fn erf(x: f64) -> f64;
42+
fn erfc(x: f64) -> f64;
43+
fn erfcf(x: f32) -> f32;
44+
fn erff(x: f32) -> f32;
45+
fn exp(x: f64) -> f64;
46+
fn exp10(x: f64) -> f64;
47+
fn exp10f(x: f32) -> f32;
48+
fn exp2(x: f64) -> f64;
49+
fn exp2f(x: f32) -> f32;
50+
fn expf(x: f32) -> f32;
51+
fn expm1(x: f64) -> f64;
52+
fn expm1f(x: f32) -> f32;
53+
fn fabs(n: f64) -> f64;
54+
fn fabsf(n: f32) -> f32;
55+
fn fdim(x: f64, y: f64) -> f64;
56+
fn fdimf(x: f32, y: f32) -> f32;
57+
fn floor(x: f64) -> f64;
58+
fn floorf(x: f32) -> f32;
59+
fn fma(x: f64, y: f64, z: f64) -> f64;
60+
fn fmaf(x: f32, y: f32, z: f32) -> f32;
61+
fn fmax(x: f64, y: f64) -> f64;
62+
fn fmaxf(x: f32, y: f32) -> f32;
63+
fn fmin(x: f64, y: f64) -> f64;
64+
fn fminf(x: f32, y: f32) -> f32;
65+
fn fmod(x: f64, y: f64) -> f64;
66+
fn fmodf(x: f32, y: f32) -> f32;
67+
// fn frexp(x: f64, n: &mut i32) -> f64;
68+
// fn frexpf(x: f32, n: &mut i32) -> f32;
69+
fn hypot(x: f64, y: f64) -> f64;
70+
fn hypotf(x: f32, y: f32) -> f32;
71+
fn ilogb(x: f64) -> i32;
72+
fn ilogbf(x: f32) -> i32;
73+
fn j0(x: f64) -> f64;
74+
fn j0f(x: f32) -> f32;
75+
fn j1(x: f64) -> f64;
76+
fn j1f(x: f32) -> f32;
77+
fn jn(n: i32, x: f64) -> f64;
78+
fn jnf(n: i32, x: f32) -> f32;
79+
fn ldexp(x: f64, n: i32) -> f64;
80+
fn ldexpf(x: f32, n: i32) -> f32;
81+
fn lgamma(x: f64) -> f64;
82+
// fn lgamma_r(x: f64, n: &mut i32) -> f64;
83+
fn lgammaf(x: f32) -> f32;
84+
// fn lgammaf_r(x: f32, n: &mut i32) -> f32;
85+
fn log(x: f64) -> f64;
86+
fn log10(x: f64) -> f64;
87+
fn log10f(x: f32) -> f32;
88+
fn log1p(x: f64) -> f64;
89+
fn log1pf(x: f32) -> f32;
90+
fn log2(x: f64) -> f64;
91+
fn log2f(x: f32) -> f32;
92+
fn logf(x: f32) -> f32;
93+
// fn modf(x: f64, y: &mut f64) -> f64;
94+
// fn modff(x: f32, y: &mut f32) -> f32;
95+
fn nextafter(x: f64, y: f64) -> f64;
96+
fn nextafterf(x: f32, y: f32) -> f32;
97+
fn pow(x: f64, y: f64) -> f64;
98+
fn powf(x: f32, y: f32) -> f32;
99+
fn remainder(x: f64, y: f64) -> f64;
100+
fn remainderf(x: f32, y: f32) -> f32;
101+
// fn remquo(x: f64, y: f64, n: &mut i32) -> f64;
102+
// fn remquof(x: f32, y: f32, n: &mut i32) -> f32;
103+
fn rint(x: f64) -> f64;
104+
fn rintf(x: f32) -> f32;
105+
fn round(x: f64) -> f64;
106+
fn roundf(x: f32) -> f32;
107+
fn scalbn(x: f64, n: i32) -> f64;
108+
fn scalbnf(x: f32, n: i32) -> f32;
109+
fn sin(x: f64) -> f64;
110+
// fn sincos(x: f64, s: &mut f64, c: &mut f64);
111+
// fn sincosf(x: f32, s: &mut f32, c: &mut f32);
112+
fn sinf(x: f32) -> f32;
113+
fn sinh(x: f64) -> f64;
114+
fn sinhf(x: f32) -> f32;
115+
fn sqrt(x: f64) -> f64;
116+
fn sqrtf(x: f32) -> f32;
117+
fn tan(x: f64) -> f64;
118+
fn tanf(x: f32) -> f32;
119+
fn tanh(x: f64) -> f64;
120+
fn tanhf(x: f32) -> f32;
121+
fn tgamma(x: f64) -> f64;
122+
fn tgammaf(x: f32) -> f32;
123+
fn trunc(n: f64) -> f64;
124+
fn truncf(n: f32) -> f32;
125+
fn y0(x: f64) -> f64;
126+
fn y0f(n: f32) -> f32;
127+
fn y1(n: f64) -> f64;
128+
fn y1f(n: f32) -> f32;
129+
fn yn(n: i32, x: f64) -> f64;
130+
fn ynf(n: i32, x: f32) -> f32;
131+
}
132+
133+
macro_rules! export_out_param {
134+
($(fn $fn:ident($($arg:ident: $argty:ty),+; $out:ident: $outty:ty) -> $retty:ty;)+) => {
135+
$(
136+
#[no_mangle]
137+
pub extern "C" fn $fn($($arg: $argty),+, $out: $outty) -> $retty {
138+
let (ret, out) = ::libm::$fn($($arg),+);
139+
*$out = out;
140+
ret
141+
}
142+
)+
143+
};
144+
}
145+
146+
export_out_param! {
147+
fn frexp(x: f64; n: &mut i32) -> f64;
148+
fn frexpf(x: f32; n: &mut i32) -> f32;
149+
fn lgamma_r(x: f64; n: &mut i32) -> f64;
150+
fn lgammaf_r(x: f32; n: &mut i32) -> f32;
151+
fn modf(x: f64; y: &mut f64) -> f64;
152+
fn modff(x: f32; y: &mut f32) -> f32;
153+
fn remquo(x: f64, y: f64; n: &mut i32) -> f64;
154+
fn remquof(x: f32, y: f32; n: &mut i32) -> f32;
155+
}
156+
157+
#[no_mangle]
158+
pub extern "C" fn sincos(x: f64, s: &mut f64, c: &mut f64) {
159+
(*s, *c) = libm::sincos(x);
160+
}
161+
162+
#[no_mangle]
163+
pub extern "C" fn sincosf(x: f32, s: &mut f32, c: &mut f32) {
164+
(*s, *c) = libm::sincosf(x);
165+
}

0 commit comments

Comments
 (0)