Skip to content

Commit cd32571

Browse files
committed
Add inttypes.h and some more math wrappers
1 parent b1c327c commit cd32571

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

include/libc/inttypes.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef LIBC_INTTYPES_H
2+
#define LIBC_INTTYPES_H
3+
4+
#include "./stdint.h"
5+
6+
#endif

src/math/math_wrappers.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ unsigned long long __ull_div(unsigned long long left, unsigned long long right);
44
long long __ll_rem(long long left, unsigned long long right);
55
long long __ll_div(long long left, long long right);
66
long long __ll_mod(long long left, long long right);
7+
long long __d_to_ll(double d);
8+
long long __f_to_ll(float f);
9+
unsigned long long __d_to_ull(double d);
10+
unsigned long long __f_to_ull(float f);
11+
double __ll_to_d(long long s);
12+
float __ll_to_f(long long s);
13+
double __ull_to_d(unsigned long long u);
14+
float __ull_to_f(unsigned long long u);
715

816
// Translations from libgcc math routines to ido ones.
917
unsigned long long __umoddi3(unsigned long long a, unsigned long long b) {
@@ -21,3 +29,31 @@ long long __moddi3(long long a, long long b) {
2129
long long __divdi3 (long long a, long long b) {
2230
return __ll_div(a, b);
2331
}
32+
33+
float __floatundisf(unsigned long long i) {
34+
return __ull_to_f(i);
35+
}
36+
37+
double __floatundidf(unsigned long long i) {
38+
return __ull_to_d(i);
39+
}
40+
41+
// clang doesn't allow inline asm for mips3 instructions in mips2 mode,
42+
// so use naked functions with raw bytes containing the instructions.
43+
__attribute__((naked)) double __floatdidf(long long i) {
44+
__asm__ __volatile__(
45+
" .word 0x44850000\n" // mtc1 $a1, $fv0
46+
" .word 0x44840800\n" // mtc1 $a0, $fv0f
47+
" .word 0x03E00008\n" // jr $ra
48+
" .word 0x46A00021\n" // cvt.d.l $fv0, $fv0
49+
);
50+
}
51+
52+
__attribute__((naked)) float __floatdisf(long long i) {
53+
__asm__ __volatile__(
54+
" .word 0x44850000\n" // mtc1 $a1, $fv0
55+
" .word 0x44840800\n" // mtc1 $a0, $fv0f
56+
" .word 0x03E00008\n" // jr $ra
57+
" .word 0x46A00020\n" // cvt.s.l $fv0, $fv0
58+
);
59+
}

0 commit comments

Comments
 (0)