README.txt revision 1.1 1 1.1 joerg Compiler-RT
2 1.1 joerg ================================
3 1.1 joerg
4 1.1 joerg This directory and its subdirectories contain source code for the compiler
5 1.1 joerg support routines.
6 1.1 joerg
7 1.1 joerg Compiler-RT is open source software. You may freely distribute it under the
8 1.1 joerg terms of the license agreement found in LICENSE.txt.
9 1.1 joerg
10 1.1 joerg ================================
11 1.1 joerg
12 1.1 joerg This is a replacement library for libgcc. Each function is contained
13 1.1 joerg in its own file. Each function has a corresponding unit test under
14 1.1 joerg test/Unit.
15 1.1 joerg
16 1.1 joerg A rudimentary script to test each file is in the file called
17 1.1 joerg test/Unit/test.
18 1.1 joerg
19 1.1 joerg Here is the specification for this library:
20 1.1 joerg
21 1.1 joerg http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc
22 1.1 joerg
23 1.1 joerg Here is a synopsis of the contents of this library:
24 1.1 joerg
25 1.1 joerg typedef int si_int;
26 1.1 joerg typedef unsigned su_int;
27 1.1 joerg
28 1.1 joerg typedef long long di_int;
29 1.1 joerg typedef unsigned long long du_int;
30 1.1 joerg
31 1.1 joerg // Integral bit manipulation
32 1.1 joerg
33 1.1 joerg di_int __ashldi3(di_int a, si_int b); // a << b
34 1.1 joerg ti_int __ashlti3(ti_int a, si_int b); // a << b
35 1.1 joerg
36 1.1 joerg di_int __ashrdi3(di_int a, si_int b); // a >> b arithmetic (sign fill)
37 1.1 joerg ti_int __ashrti3(ti_int a, si_int b); // a >> b arithmetic (sign fill)
38 1.1 joerg di_int __lshrdi3(di_int a, si_int b); // a >> b logical (zero fill)
39 1.1 joerg ti_int __lshrti3(ti_int a, si_int b); // a >> b logical (zero fill)
40 1.1 joerg
41 1.1 joerg si_int __clzsi2(si_int a); // count leading zeros
42 1.1 joerg si_int __clzdi2(di_int a); // count leading zeros
43 1.1 joerg si_int __clzti2(ti_int a); // count leading zeros
44 1.1 joerg si_int __ctzsi2(si_int a); // count trailing zeros
45 1.1 joerg si_int __ctzdi2(di_int a); // count trailing zeros
46 1.1 joerg si_int __ctzti2(ti_int a); // count trailing zeros
47 1.1 joerg
48 1.1 joerg si_int __ffsdi2(di_int a); // find least significant 1 bit
49 1.1 joerg si_int __ffsti2(ti_int a); // find least significant 1 bit
50 1.1 joerg
51 1.1 joerg si_int __paritysi2(si_int a); // bit parity
52 1.1 joerg si_int __paritydi2(di_int a); // bit parity
53 1.1 joerg si_int __parityti2(ti_int a); // bit parity
54 1.1 joerg
55 1.1 joerg si_int __popcountsi2(si_int a); // bit population
56 1.1 joerg si_int __popcountdi2(di_int a); // bit population
57 1.1 joerg si_int __popcountti2(ti_int a); // bit population
58 1.1 joerg
59 1.1 joerg uint32_t __bswapsi2(uint32_t a); // a byteswapped, arm only
60 1.1 joerg uint64_t __bswapdi2(uint64_t a); // a byteswapped, arm only
61 1.1 joerg
62 1.1 joerg // Integral arithmetic
63 1.1 joerg
64 1.1 joerg di_int __negdi2 (di_int a); // -a
65 1.1 joerg ti_int __negti2 (ti_int a); // -a
66 1.1 joerg di_int __muldi3 (di_int a, di_int b); // a * b
67 1.1 joerg ti_int __multi3 (ti_int a, ti_int b); // a * b
68 1.1 joerg si_int __divsi3 (si_int a, si_int b); // a / b signed
69 1.1 joerg di_int __divdi3 (di_int a, di_int b); // a / b signed
70 1.1 joerg ti_int __divti3 (ti_int a, ti_int b); // a / b signed
71 1.1 joerg su_int __udivsi3 (su_int n, su_int d); // a / b unsigned
72 1.1 joerg du_int __udivdi3 (du_int a, du_int b); // a / b unsigned
73 1.1 joerg tu_int __udivti3 (tu_int a, tu_int b); // a / b unsigned
74 1.1 joerg si_int __modsi3 (si_int a, si_int b); // a % b signed
75 1.1 joerg di_int __moddi3 (di_int a, di_int b); // a % b signed
76 1.1 joerg ti_int __modti3 (ti_int a, ti_int b); // a % b signed
77 1.1 joerg su_int __umodsi3 (su_int a, su_int b); // a % b unsigned
78 1.1 joerg du_int __umoddi3 (du_int a, du_int b); // a % b unsigned
79 1.1 joerg tu_int __umodti3 (tu_int a, tu_int b); // a % b unsigned
80 1.1 joerg du_int __udivmoddi4(du_int a, du_int b, du_int* rem); // a / b, *rem = a % b unsigned
81 1.1 joerg tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem); // a / b, *rem = a % b unsigned
82 1.1 joerg su_int __udivmodsi4(su_int a, su_int b, su_int* rem); // a / b, *rem = a % b unsigned
83 1.1 joerg si_int __divmodsi4(si_int a, si_int b, si_int* rem); // a / b, *rem = a % b signed
84 1.1 joerg
85 1.1 joerg
86 1.1 joerg
87 1.1 joerg // Integral arithmetic with trapping overflow
88 1.1 joerg
89 1.1 joerg si_int __absvsi2(si_int a); // abs(a)
90 1.1 joerg di_int __absvdi2(di_int a); // abs(a)
91 1.1 joerg ti_int __absvti2(ti_int a); // abs(a)
92 1.1 joerg
93 1.1 joerg si_int __negvsi2(si_int a); // -a
94 1.1 joerg di_int __negvdi2(di_int a); // -a
95 1.1 joerg ti_int __negvti2(ti_int a); // -a
96 1.1 joerg
97 1.1 joerg si_int __addvsi3(si_int a, si_int b); // a + b
98 1.1 joerg di_int __addvdi3(di_int a, di_int b); // a + b
99 1.1 joerg ti_int __addvti3(ti_int a, ti_int b); // a + b
100 1.1 joerg
101 1.1 joerg si_int __subvsi3(si_int a, si_int b); // a - b
102 1.1 joerg di_int __subvdi3(di_int a, di_int b); // a - b
103 1.1 joerg ti_int __subvti3(ti_int a, ti_int b); // a - b
104 1.1 joerg
105 1.1 joerg si_int __mulvsi3(si_int a, si_int b); // a * b
106 1.1 joerg di_int __mulvdi3(di_int a, di_int b); // a * b
107 1.1 joerg ti_int __mulvti3(ti_int a, ti_int b); // a * b
108 1.1 joerg
109 1.1 joerg
110 1.1 joerg // Integral arithmetic which returns if overflow
111 1.1 joerg
112 1.1 joerg si_int __mulosi4(si_int a, si_int b, int* overflow); // a * b, overflow set to one if result not in signed range
113 1.1 joerg di_int __mulodi4(di_int a, di_int b, int* overflow); // a * b, overflow set to one if result not in signed range
114 1.1 joerg ti_int __muloti4(ti_int a, ti_int b, int* overflow); // a * b, overflow set to
115 1.1 joerg one if result not in signed range
116 1.1 joerg
117 1.1 joerg
118 1.1 joerg // Integral comparison: a < b -> 0
119 1.1 joerg // a == b -> 1
120 1.1 joerg // a > b -> 2
121 1.1 joerg
122 1.1 joerg si_int __cmpdi2 (di_int a, di_int b);
123 1.1 joerg si_int __cmpti2 (ti_int a, ti_int b);
124 1.1 joerg si_int __ucmpdi2(du_int a, du_int b);
125 1.1 joerg si_int __ucmpti2(tu_int a, tu_int b);
126 1.1 joerg
127 1.1 joerg // Integral / floating point conversion
128 1.1 joerg
129 1.1 joerg di_int __fixsfdi( float a);
130 1.1 joerg di_int __fixdfdi( double a);
131 1.1 joerg di_int __fixxfdi(long double a);
132 1.1 joerg
133 1.1 joerg ti_int __fixsfti( float a);
134 1.1 joerg ti_int __fixdfti( double a);
135 1.1 joerg ti_int __fixxfti(long double a);
136 1.1 joerg uint64_t __fixtfdi(long double input); // ppc only, doesn't match documentation
137 1.1 joerg
138 1.1 joerg su_int __fixunssfsi( float a);
139 1.1 joerg su_int __fixunsdfsi( double a);
140 1.1 joerg su_int __fixunsxfsi(long double a);
141 1.1 joerg
142 1.1 joerg du_int __fixunssfdi( float a);
143 1.1 joerg du_int __fixunsdfdi( double a);
144 1.1 joerg du_int __fixunsxfdi(long double a);
145 1.1 joerg
146 1.1 joerg tu_int __fixunssfti( float a);
147 1.1 joerg tu_int __fixunsdfti( double a);
148 1.1 joerg tu_int __fixunsxfti(long double a);
149 1.1 joerg uint64_t __fixunstfdi(long double input); // ppc only
150 1.1 joerg
151 1.1 joerg float __floatdisf(di_int a);
152 1.1 joerg double __floatdidf(di_int a);
153 1.1 joerg long double __floatdixf(di_int a);
154 1.1 joerg long double __floatditf(int64_t a); // ppc only
155 1.1 joerg
156 1.1 joerg float __floattisf(ti_int a);
157 1.1 joerg double __floattidf(ti_int a);
158 1.1 joerg long double __floattixf(ti_int a);
159 1.1 joerg
160 1.1 joerg float __floatundisf(du_int a);
161 1.1 joerg double __floatundidf(du_int a);
162 1.1 joerg long double __floatundixf(du_int a);
163 1.1 joerg long double __floatunditf(uint64_t a); // ppc only
164 1.1 joerg
165 1.1 joerg float __floatuntisf(tu_int a);
166 1.1 joerg double __floatuntidf(tu_int a);
167 1.1 joerg long double __floatuntixf(tu_int a);
168 1.1 joerg
169 1.1 joerg // Floating point raised to integer power
170 1.1 joerg
171 1.1 joerg float __powisf2( float a, si_int b); // a ^ b
172 1.1 joerg double __powidf2( double a, si_int b); // a ^ b
173 1.1 joerg long double __powixf2(long double a, si_int b); // a ^ b
174 1.1 joerg long double __powitf2(long double a, si_int b); // ppc only, a ^ b
175 1.1 joerg
176 1.1 joerg // Complex arithmetic
177 1.1 joerg
178 1.1 joerg // (a + ib) * (c + id)
179 1.1 joerg
180 1.1 joerg float _Complex __mulsc3( float a, float b, float c, float d);
181 1.1 joerg double _Complex __muldc3(double a, double b, double c, double d);
182 1.1 joerg long double _Complex __mulxc3(long double a, long double b,
183 1.1 joerg long double c, long double d);
184 1.1 joerg long double _Complex __multc3(long double a, long double b,
185 1.1 joerg long double c, long double d); // ppc only
186 1.1 joerg
187 1.1 joerg // (a + ib) / (c + id)
188 1.1 joerg
189 1.1 joerg float _Complex __divsc3( float a, float b, float c, float d);
190 1.1 joerg double _Complex __divdc3(double a, double b, double c, double d);
191 1.1 joerg long double _Complex __divxc3(long double a, long double b,
192 1.1 joerg long double c, long double d);
193 1.1 joerg long double _Complex __divtc3(long double a, long double b,
194 1.1 joerg long double c, long double d); // ppc only
195 1.1 joerg
196 1.1 joerg
197 1.1 joerg // Runtime support
198 1.1 joerg
199 1.1 joerg // __clear_cache() is used to tell process that new instructions have been
200 1.1 joerg // written to an address range. Necessary on processors that do not have
201 1.1 joerg // a unified instuction and data cache.
202 1.1 joerg void __clear_cache(void* start, void* end);
203 1.1 joerg
204 1.1 joerg // __enable_execute_stack() is used with nested functions when a trampoline
205 1.1 joerg // function is written onto the stack and that page range needs to be made
206 1.1 joerg // executable.
207 1.1 joerg void __enable_execute_stack(void* addr);
208 1.1 joerg
209 1.1 joerg // __gcc_personality_v0() is normally only called by the system unwinder.
210 1.1 joerg // C code (as opposed to C++) normally does not need a personality function
211 1.1 joerg // because there are no catch clauses or destructors to be run. But there
212 1.1 joerg // is a C language extension __attribute__((cleanup(func))) which marks local
213 1.1 joerg // variables as needing the cleanup function "func" to be run when the
214 1.1 joerg // variable goes out of scope. That includes when an exception is thrown,
215 1.1 joerg // so a personality handler is needed.
216 1.1 joerg _Unwind_Reason_Code __gcc_personality_v0(int version, _Unwind_Action actions,
217 1.1 joerg uint64_t exceptionClass, struct _Unwind_Exception* exceptionObject,
218 1.1 joerg _Unwind_Context_t context);
219 1.1 joerg
220 1.1 joerg // for use with some implementations of assert() in <assert.h>
221 1.1 joerg void __eprintf(const char* format, const char* assertion_expression,
222 1.1 joerg const char* line, const char* file);
223 1.1 joerg
224 1.1 joerg
225 1.1 joerg
226 1.1 joerg // Power PC specific functions
227 1.1 joerg
228 1.1 joerg // There is no C interface to the saveFP/restFP functions. They are helper
229 1.1 joerg // functions called by the prolog and epilog of functions that need to save
230 1.1 joerg // a number of non-volatile float point registers.
231 1.1 joerg saveFP
232 1.1 joerg restFP
233 1.1 joerg
234 1.1 joerg // PowerPC has a standard template for trampoline functions. This function
235 1.1 joerg // generates a custom trampoline function with the specific realFunc
236 1.1 joerg // and localsPtr values.
237 1.1 joerg void __trampoline_setup(uint32_t* trampOnStack, int trampSizeAllocated,
238 1.1 joerg const void* realFunc, void* localsPtr);
239 1.1 joerg
240 1.1 joerg // adds two 128-bit double-double precision values ( x + y )
241 1.1 joerg long double __gcc_qadd(long double x, long double y);
242 1.1 joerg
243 1.1 joerg // subtracts two 128-bit double-double precision values ( x - y )
244 1.1 joerg long double __gcc_qsub(long double x, long double y);
245 1.1 joerg
246 1.1 joerg // multiples two 128-bit double-double precision values ( x * y )
247 1.1 joerg long double __gcc_qmul(long double x, long double y);
248 1.1 joerg
249 1.1 joerg // divides two 128-bit double-double precision values ( x / y )
250 1.1 joerg long double __gcc_qdiv(long double a, long double b);
251 1.1 joerg
252 1.1 joerg
253 1.1 joerg // ARM specific functions
254 1.1 joerg
255 1.1 joerg // There is no C interface to the switch* functions. These helper functions
256 1.1 joerg // are only needed by Thumb1 code for efficient switch table generation.
257 1.1 joerg switch16
258 1.1 joerg switch32
259 1.1 joerg switch8
260 1.1 joerg switchu8
261 1.1 joerg
262 1.1 joerg // There is no C interface to the *_vfp_d8_d15_regs functions. There are
263 1.1 joerg // called in the prolog and epilog of Thumb1 functions. When the C++ ABI use
264 1.1 joerg // SJLJ for exceptions, each function with a catch clause or destuctors needs
265 1.1 joerg // to save and restore all registers in it prolog and epliog. But there is
266 1.1 joerg // no way to access vector and high float registers from thumb1 code, so the
267 1.1 joerg // compiler must add call outs to these helper functions in the prolog and
268 1.1 joerg // epilog.
269 1.1 joerg restore_vfp_d8_d15_regs
270 1.1 joerg save_vfp_d8_d15_regs
271 1.1 joerg
272 1.1 joerg
273 1.1 joerg // Note: long ago ARM processors did not have floating point hardware support.
274 1.1 joerg // Floating point was done in software and floating point parameters were
275 1.1 joerg // passed in integer registers. When hardware support was added for floating
276 1.1 joerg // point, new *vfp functions were added to do the same operations but with
277 1.1 joerg // floating point parameters in floating point registers.
278 1.1 joerg
279 1.1 joerg // Undocumented functions
280 1.1 joerg
281 1.1 joerg float __addsf3vfp(float a, float b); // Appears to return a + b
282 1.1 joerg double __adddf3vfp(double a, double b); // Appears to return a + b
283 1.1 joerg float __divsf3vfp(float a, float b); // Appears to return a / b
284 1.1 joerg double __divdf3vfp(double a, double b); // Appears to return a / b
285 1.1 joerg int __eqsf2vfp(float a, float b); // Appears to return one
286 1.1 joerg // iff a == b and neither is NaN.
287 1.1 joerg int __eqdf2vfp(double a, double b); // Appears to return one
288 1.1 joerg // iff a == b and neither is NaN.
289 1.1 joerg double __extendsfdf2vfp(float a); // Appears to convert from
290 1.1 joerg // float to double.
291 1.1 joerg int __fixdfsivfp(double a); // Appears to convert from
292 1.1 joerg // double to int.
293 1.1 joerg int __fixsfsivfp(float a); // Appears to convert from
294 1.1 joerg // float to int.
295 1.1 joerg unsigned int __fixunssfsivfp(float a); // Appears to convert from
296 1.1 joerg // float to unsigned int.
297 1.1 joerg unsigned int __fixunsdfsivfp(double a); // Appears to convert from
298 1.1 joerg // double to unsigned int.
299 1.1 joerg double __floatsidfvfp(int a); // Appears to convert from
300 1.1 joerg // int to double.
301 1.1 joerg float __floatsisfvfp(int a); // Appears to convert from
302 1.1 joerg // int to float.
303 1.1 joerg double __floatunssidfvfp(unsigned int a); // Appears to convert from
304 1.1 joerg // unisgned int to double.
305 1.1 joerg float __floatunssisfvfp(unsigned int a); // Appears to convert from
306 1.1 joerg // unisgned int to float.
307 1.1 joerg int __gedf2vfp(double a, double b); // Appears to return __gedf2
308 1.1 joerg // (a >= b)
309 1.1 joerg int __gesf2vfp(float a, float b); // Appears to return __gesf2
310 1.1 joerg // (a >= b)
311 1.1 joerg int __gtdf2vfp(double a, double b); // Appears to return __gtdf2
312 1.1 joerg // (a > b)
313 1.1 joerg int __gtsf2vfp(float a, float b); // Appears to return __gtsf2
314 1.1 joerg // (a > b)
315 1.1 joerg int __ledf2vfp(double a, double b); // Appears to return __ledf2
316 1.1 joerg // (a <= b)
317 1.1 joerg int __lesf2vfp(float a, float b); // Appears to return __lesf2
318 1.1 joerg // (a <= b)
319 1.1 joerg int __ltdf2vfp(double a, double b); // Appears to return __ltdf2
320 1.1 joerg // (a < b)
321 1.1 joerg int __ltsf2vfp(float a, float b); // Appears to return __ltsf2
322 1.1 joerg // (a < b)
323 1.1 joerg double __muldf3vfp(double a, double b); // Appears to return a * b
324 1.1 joerg float __mulsf3vfp(float a, float b); // Appears to return a * b
325 1.1 joerg int __nedf2vfp(double a, double b); // Appears to return __nedf2
326 1.1 joerg // (a != b)
327 1.1 joerg double __negdf2vfp(double a); // Appears to return -a
328 1.1 joerg float __negsf2vfp(float a); // Appears to return -a
329 1.1 joerg float __negsf2vfp(float a); // Appears to return -a
330 1.1 joerg double __subdf3vfp(double a, double b); // Appears to return a - b
331 1.1 joerg float __subsf3vfp(float a, float b); // Appears to return a - b
332 1.1 joerg float __truncdfsf2vfp(double a); // Appears to convert from
333 1.1 joerg // double to float.
334 1.1 joerg int __unorddf2vfp(double a, double b); // Appears to return __unorddf2
335 1.1 joerg int __unordsf2vfp(float a, float b); // Appears to return __unordsf2
336 1.1 joerg
337 1.1 joerg
338 1.1 joerg Preconditions are listed for each function at the definition when there are any.
339 1.1 joerg Any preconditions reflect the specification at
340 1.1 joerg http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc.
341 1.1 joerg
342 1.1 joerg Assumptions are listed in "int_lib.h", and in individual files. Where possible
343 1.1 joerg assumptions are checked at compile time.
344