@@ -4,6 +4,14 @@ unsigned long long __ull_div(unsigned long long left, unsigned long long right);
44long long __ll_rem (long long left , unsigned long long right );
55long long __ll_div (long long left , long long right );
66long 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.
917unsigned long long __umoddi3 (unsigned long long a , unsigned long long b ) {
@@ -21,3 +29,31 @@ long long __moddi3(long long a, long long b) {
2129long 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