6e7fb08935aa8c3ab99e1d8ffa1cbe53e6f3804f
[tpg/acess2.git] / Usermode / Libraries / libgcc.so_src / libgcc.c
1 /* Acess GCC Helper Library
2  *
3  */
4 #include <acess/sys.h>
5 #include <stdint.h>
6
7 // === CODE ===
8 int SoMain()
9 {
10         return 0;
11 }
12
13 // --- Errors ---
14 void __stack_chk_fail()
15 {
16         write(2, 32, "FATAL ERROR: Stack Check Failed\n");
17         _exit(-1);
18         for(;;);
19 }
20
21 // --- 64-Bit Math ---
22 /**
23  * \fn uint64_t __udivdi3(uint64_t Num, uint64_t Den)
24  * \brief Divide two 64-bit integers
25  */
26 uint64_t __udivdi3(uint64_t Num, uint64_t Den)
27 {
28         #if 0
29         uint64_t        ret = 0;
30         if(Den == 0)    // Call Div by Zero Error
31                 __asm__ __volatile__ ("int $0");
32         
33         if(Den == 1)    return Num;
34         if(Den == 2)    return Num >> 1;
35         if(Den == 4)    return Num >> 2;
36         if(Den == 8)    return Num >> 3;
37         if(Den == 16)   return Num >> 4;
38         if(Den == 32)   return Num >> 5;
39         if(Den == 64)   return Num >> 6;
40         if(Den == 128)  return Num >> 7;
41         if(Den == 256)  return Num >> 8;
42         
43         while(Num > Den) {
44                 ret ++;
45                 Num -= Den;
46         }
47         return ret;
48         #else
49         uint64_t        P[64], q, n;
50          int    i;
51         
52         if(Den == 0)    __asm__ __volatile__ ("int $0x0");
53         // Common speedups
54         if(Den == 1)    return Num;
55         if(Den == 2)    return Num >> 1;
56         if(Den == 16)   return Num >> 4;
57         
58         
59         // Non-restoring division, from wikipedia
60         // http://en.wikipedia.org/wiki/Division_(digital)
61         P[0] = Num;
62         for( i = 0; i < 64; i ++ )
63         {
64                 if( P[i] >= 0 ) {
65                         q |= (uint64_t)1 << (63-i);
66                         P[i+1] = 2*P[i] - Den;
67                 }
68                 else {
69                         //q |= 0 << (63-i);
70                         P[i+1] = 2*P[i] + Den;
71                 }
72         }
73         
74         n = ~q;
75         n = -n;
76         q += n;
77         
78         return q;
79         #endif
80 }
81
82 /**
83  * \fn uint64_t __umoddi3(uint64_t Num, uint64_t Den)
84  * \brief Get the modulus of two 64-bit integers
85  */
86 uint64_t __umoddi3(uint64_t Num, uint64_t Den)
87 {
88         #if 0
89         if(Den == 0)    __asm__ __volatile__ ("int $0");        // Call Div by Zero Error
90         
91         if(Den == 1)    return 0;
92         if(Den == 2)    return Num & 0x01;
93         if(Den == 4)    return Num & 0x03;
94         if(Den == 8)    return Num & 0x07;
95         if(Den == 16)   return Num & 0x0F;
96         if(Den == 32)   return Num & 0x1F;
97         if(Den == 64)   return Num & 0x3F;
98         if(Den == 128)  return Num & 0x3F;
99         if(Den == 256)  return Num & 0x7F;
100         
101         while(Num >= Den)       Num -= Den;
102         
103         return Num;
104         #else
105         if(Den == 0)    __asm__ __volatile__ ("int $0");        // Call Div by Zero Error
106         // Speedups for common operations
107         if(Den == 1)    return 0;
108         if(Den == 2)    return Num & 0x01;
109         if(Den == 16)   return Num & 0x0F;
110         return Num - __udivdi3(Num, Den) * Den;
111         #endif
112 }

UCC git Repository :: git.ucc.asn.au