1; libgcc1 routines for Synopsys DesignWare ARC cpu.
2
3/* Copyright (C) 1995-2019 Free Software Foundation, Inc.
4   Contributor: Joern Rennecke <joern.rennecke@embecosm.com>
5		on behalf of Synopsys Inc.
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify it under
10the terms of the GNU General Public License as published by the Free
11Software Foundation; either version 3, or (at your option) any later
12version.
13
14GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17for more details.
18
19Under Section 7 of GPL version 3, you are granted additional
20permissions described in the GCC Runtime Library Exception, version
213.1, as published by the Free Software Foundation.
22
23You should have received a copy of the GNU General Public License and
24a copy of the GCC Runtime Library Exception along with this program;
25see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
26<http://www.gnu.org/licenses/>.  */
27
28/* As a special exception, if you link this library with other files,
29   some of which are compiled with GCC, to produce an executable,
30   this library does not by itself cause the resulting executable
31   to be covered by the GNU General Public License.
32   This exception does not however invalidate any other reasons why
33   the executable file might be covered by the GNU General Public License.  */
34
35
36 /* ANSI concatenation macros.  */
37
38 #define CONCAT1(a, b) CONCAT2(a, b)
39 #define CONCAT2(a, b) a ## b
40
41 /* Use the right prefix for global labels.  */
42
43 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
44
45#ifndef WORKING_ASSEMBLER
46#define abs_l abs
47#define asl_l asl
48#define mov_l mov
49#endif
50
51#define FUNC(X)         .type SYM(X),@function
52#define HIDDEN_FUNC(X)	FUNC(X)` .hidden X
53#define ENDFUNC0(X)     .Lfe_##X: .size X,.Lfe_##X-X
54#define ENDFUNC(X)      ENDFUNC0(X)
55
56
57
58#ifdef  L_mulsi3
59	.section .text
60	.align 4
61
62	.global SYM(__mulsi3)
63SYM(__mulsi3):
64
65/* This the simple version.
66
67  while (a)
68    {
69      if (a & 1)
70	r += b;
71      a >>= 1;
72      b <<= 1;
73    }
74*/
75
76#if defined (__ARC_MUL64__)
77	FUNC(__mulsi3)
78	mulu64 r0,r1
79	j_s.d [blink]
80	mov_s r0,mlo
81	ENDFUNC(__mulsi3)
82#elif defined (__ARC_MPY__)
83	HIDDEN_FUNC(__mulsi3)
84	mpyu	r0,r0,r1
85	nop_s
86	j_s	[blink]
87	ENDFUNC(__mulsi3)
88#elif defined (__ARC_NORM__)
89	FUNC(__mulsi3)
90	norm.f	r2,r0
91	rsub	lp_count,r2,31
92	mov.mi	lp_count,32
93	mov_s	r2,r0
94	mov_s	r0,0
95	lpnz	@.Lend		; loop is aligned
96	lsr.f	r2,r2
97	add.cs	r0,r0,r1
98	add_s	r1,r1,r1
99.Lend:	j_s [blink]
100	ENDFUNC(__mulsi3)
101#elif !defined (__OPTIMIZE_SIZE__) && defined (__ARC_BARREL_SHIFTER__)
102	/* Up to 3.5 times faster than the simpler code below, but larger.  */
103	FUNC(__mulsi3)
104	ror.f	r2,r0,4
105	mov_s	r0,0
106	add3.mi	r0,r0,r1
107	asl.f	r2,r2,2
108	add2.cs	r0,r0,r1
109	jeq_s	[blink]
110.Loop:
111	add1.mi	r0,r0,r1
112	asl.f	r2,r2,2
113	add.cs	r0,r0,r1
114	asl_s	r1,r1,4
115	ror.f	r2,r2,8
116	add3.mi	r0,r0,r1
117	asl.f	r2,r2,2
118	bne.d	.Loop
119	add2.cs	r0,r0,r1
120	j_s	[blink]
121	ENDFUNC(__mulsi3)
122#elif !defined (__OPTIMIZE_SIZE__) /* __ARC601__ */
123	FUNC(__mulsi3)
124	lsr.f r2,r0
125	mov_s r0,0
126	mov_s r3,0
127	add.cs r0,r0,r1
128.Loop:
129	lsr.f r2,r2
130	add1.cs r0,r0,r1
131	lsr.f r2,r2
132	add2.cs r0,r0,r1
133	lsr.f r2,r2
134	add3.cs r0,r0,r1
135	bne.d .Loop
136	add3 r1,r3,r1
137	j_s	[blink]
138	ENDFUNC(__mulsi3)
139#else
140/********************************************************/
141	FUNC(__mulsi3)
142	mov_s r2,0		; Accumulate result here.
143.Lloop:
144	bbit0 r0,0,@.Ly
145	add_s r2,r2,r1		; r += b
146.Ly:
147	lsr_s r0,r0		; a >>= 1
148	asl_s r1,r1		; b <<= 1
149	brne_s r0,0,@.Lloop
150.Ldone:
151	j_s.d [blink]
152	mov_s r0,r2
153	ENDFUNC(__mulsi3)
154/********************************************************/
155#endif
156
157#endif /* L_mulsi3 */
158
159#ifdef  L_umulsidi3
160	.section .text
161	.align 4
162
163	.global SYM(__umulsidi3)
164SYM(__umulsidi3):
165	HIDDEN_FUNC(__umulsidi3)
166/* We need ARC700 /ARC_MUL64 definitions of __umulsidi3 / __umulsi3_highpart
167   in case some code has been compiled without multiply support enabled,
168   but linked with the multiply-support enabled libraries.
169   For ARC601 (i.e. without a barrel shifter), we also use umuldisi3 as our
170   umulsi3_highpart implementation; the use of the latter label doesn't
171   actually benefit ARC601 platforms, but is useful when ARC601 code is linked
172   against other libraries.  */
173#if defined (__ARC_MPY__) || defined (__ARC_MUL64__) \
174	|| !defined (__ARC_BARREL_SHIFTER__)
175	.global SYM(__umulsi3_highpart)
176SYM(__umulsi3_highpart):
177	HIDDEN_FUNC(__umulsi3_highpart)
178#endif
179
180/* This the simple version.
181
182  while (a)
183    {
184      if (a & 1)
185	r += b;
186      a >>= 1;
187      b <<= 1;
188    }
189*/
190#include "ieee-754/arc-ieee-754.h"
191
192#ifdef __ARC_MPY__
193	mov_s	r12,DBL0L
194	mpyu	DBL0L,r12,DBL0H
195	j_s.d	[blink]
196	MPYHU	DBL0H,r12,DBL0H
197#elif defined (__ARC_MUL64__)
198/* Likewise for __ARC_MUL64__ */
199	mulu64 r0,r1
200	mov_s DBL0L,mlo
201	j_s.d [blink]
202	mov_s DBL0H,mhi
203#else /* !__ARC_MPY__ && !__ARC_MUL64__ */
204/* Although it might look tempting to extend this to handle muldi3,
205   using mulsi3 twice with 2.25 cycles per 32 bit add is faster
206   than one loop with 3 or four cycles per 32 bit add.  */
207	asl.f r12,0		; Top part of b.
208	mov_s r2,0		; Accumulate result here.
209	bbit1.d r0,0,@.Ladd
210	mov_s r3,0
211.Llooptst:
212	rlc r12,r12
213	breq r0,0,@.Ldone	; while (a)
214.Lloop:
215	asl.f r1,r1		; b <<= 1
216	bbit0.d r0,1,@.Llooptst
217	lsr r0,r0		; a >>= 1
218	rlc r12,r12
219.Ladd:
220	add.f r3,r3,r1	; r += b
221	brne.d r0,0,@.Lloop	; while (a);
222	adc   r2,r2,r12
223.Ldone:
224	mov_s DBL0L,r3
225	j_s.d [blink]
226	mov DBL0H,r2
227#endif /* !__ARC_MPY__*/
228	ENDFUNC(__umulsidi3)
229#if defined (__ARC_MPY__) || defined (__ARC_MUL64__) \
230	|| !defined (__ARC_BARREL_SHIFTER__)
231	ENDFUNC(__umulsi3_highpart)
232#endif
233#endif /* L_umulsidi3 */
234
235#ifdef L_muldi3
236	.section .text
237	.align 4
238	.global SYM(__muldi3)
239SYM(__muldi3):
240#ifdef __LITTLE_ENDIAN__
241        push_s blink
242        mov_s r4,r3     ;4
243        mov_s r5,r2     ;4
244        mov_s r9,r0     ;4
245        mov_s r8,r1     ;4
246        bl.d @__umulsidi3
247        mov_s r1,r2     ;4
248        mov_s r6,r0     ;4
249        mov_s r7,r1     ;4
250        mov_s r0,r9     ;4
251        bl.d @__mulsi3
252        mov_s r1,r4     ;4
253        mov_s r4,r0     ;4
254        mov_s r1,r8     ;4
255        bl.d @__mulsi3
256        mov_s r0,r5     ;4
257        pop_s blink
258        add_s r0,r0,r4 ;2
259        add r1,r0,r7
260        j_s.d [blink]
261        mov_s r0,r6     ;4
262#else
263	push_s  blink
264	mov_s   r5,r3
265	mov_s   r9,r2
266	mov_s   r4,r1
267	mov_s   r8,r0
268	mov_s   r0,r1
269	bl.d 	@__umulsidi3
270	mov_s   r1,r3
271	mov_s   r7,r0
272	mov_s   r6,r1
273	mov_s   r0,r4
274	bl.d    @__mulsi3
275	mov_s   r1,r9
276	mov_s   r4,r0
277	mov_s   r1,r8
278	bl.d    @__mulsi3
279	mov_s   r0,r5
280	pop_s   blink
281	add_s   r0,r0,r4
282	add_s   r0,r0,r7
283	j_s.d   [blink]
284	mov_s   r1,r6
285#endif /* __LITTLE_ENDIAN__ */
286ENDFUNC(__muldi3)
287#endif /* L_muldi3 */
288
289#ifdef  L_umulsi3_highpart
290#include "ieee-754/arc-ieee-754.h"
291/* For use without a barrel shifter, and for ARC700 / ARC_MUL64, the
292   mulsidi3 algorithms above look better, so for these, there is an
293   extra label up there.  */
294#if !defined (__ARC_MPY__) && !defined (__ARC_MUL64__) \
295	&& defined (__ARC_BARREL_SHIFTER__)
296	.global SYM(__umulsi3_highpart)
297SYM(__umulsi3_highpart):
298	HIDDEN_FUNC(__umulsi3_highpart)
299	mov_s r2,0
300	mov_s r3,32
301.Loop:
302	lsr.f r0,r0
303	add.cs.f r2,r2,r1
304	sub_s r3,r3,1
305	brne.d r0,0,.Loop
306	rrc r2,r2
307	j_s.d	[blink]
308/* Make the result register peephole-compatible with mulsidi3.  */
309	lsr DBL0H,r2,r3
310	ENDFUNC(__umulsi3_highpart)
311#endif /* !__ARC_MPY__  && __ARC_BARREL_SHIFTER__ */
312#endif /* L_umulsi3_highpart */
313
314#ifdef L_divmod_tools
315
316; Utilities used by all routines.
317
318	.section .text
319
320/*
321unsigned long
322udivmodsi4(int modwanted, unsigned long num, unsigned long den)
323{
324  unsigned long bit = 1;
325  unsigned long res = 0;
326
327  while (den < num && bit && !(den & (1L<<31)))
328    {
329      den <<=1;
330      bit <<=1;
331    }
332  while (bit)
333    {
334      if (num >= den)
335	{
336	  num -= den;
337	  res |= bit;
338	}
339      bit >>=1;
340      den >>=1;
341    }
342  if (modwanted) return num;
343  return res;
344}
345*/
346
347; inputs: r0 = numerator, r1 = denominator
348; outputs: r0 = quotient, r1 = remainder, r2/r3 trashed
349
350	.balign 4
351	.global SYM(__udivmodsi4)
352	FUNC(__udivmodsi4)
353SYM(__udivmodsi4):
354
355#if defined (__ARC_EA__)
356/* Normalize divisor and divident, and then use the appropriate number of
357   divaw (the number of result bits, or one more) to produce the result.
358   There are some special conditions that need to be tested:
359   - We can only directly normalize unsigned numbers that fit in 31 bit.  For
360     the divisor, we test early on that it is not 'negative'.
361   - divaw can't corrrectly process a divident that is larger than the divisor.
362     We handle this be checking that the divident prior to normalization is
363     not larger than the normalized divisor.  As we then already know then
364     that the divisor fits 31 bit, this check also makes sure that the
365     divident fits.
366   - ordinary normalization of the divident could make it larger than the
367     normalized divisor, which again would be unsuitable for divaw.
368     Thus, we want to shift left the divident by one less, except that we
369     want to leave it alone if it is already 31 bit.  To this end, we
370     double the input to norm with adds.
371   - If the divident has less bits than the divisor, that would leave us
372     with a negative number of divaw to execute.  Although we could use a
373     conditional loop to avoid excess divaw, and then the quotient could
374     be extracted correctly as there'd be more than enough zero bits, the
375     remainder would be shifted left too far, requiring a conditional shift
376     right.  The cost of that shift and the possible mispredict on the
377     conditional loop cost as much as putting in an early check for a zero
378     result.  */
379	bmsk	r3,r0,29
380	brne.d	r3,r0,.Large_dividend
381	norm.f	r2,r1
382	brlo	r0,r1,.Lret0
383	norm	r3,r0
384	asl_s	r1,r1,r2
385	sub_s	r3,r3,1
386	asl_l	r0,r0,r3	; not short to keep loop aligned
387	sub	lp_count,r2,r3
388	lp	.Ldiv_end
389	divaw	r0,r0,r1
390.Ldiv_end:sub_s	r3,r2,1
391	lsr	r1,r0,r2
392	j_s.d	[blink]
393	bmsk	r0,r0,r3
394
395	.balign 4
396.Large_dividend:
397	bmi	.Ltrivial
398	asl_s	r1,r1,r2
399	mov_s	r3,0
400	sub1.f	r4,r0,r1
401	mov.lo	r4,r0
402	mov.hs	r3,2
403	cmp	r4,r1
404	sub.hs	r4,r4,r1
405	add.hs	r3,r3,1
406	mov.f	lp_count,r2
407	lpne	.Ldiv_end2
408	divaw	r4,r4,r1
409.Ldiv_end2:asl	r0,r3,r2
410	lsr	r1,r4,r2
411	sub_s	r2,r2,1
412	bmsk	r4,r4,r2
413	j_s.d	[blink]
414	or.ne	r0,r0,r4
415
416.Lret0:
417	mov_s	r1,r0
418	j_s.d	[blink]
419	mov_l	r0,0
420	.balign	4
421.Ltrivial:
422	sub.f	r1,r0,r1
423	mov.c	r1,r0
424	mov_s	r0,1
425	j_s.d	[blink]
426	mov.c	r0,0
427#elif !defined (__OPTIMIZE_SIZE__) && !defined (__ARC_RF16__)
428#if defined (__ARC_NORM__) && defined (__ARC_BARREL_SHIFTER__)
429	lsr_s r2,r0
430	brhs.d r1,r2,.Lret0_3
431	norm r2,r2
432	norm r3,r1
433	sub_s r3,r3,r2
434	asl_s r1,r1,r3
435	sub1.f 0,r0,r1
436	lsr.cs r1,r1,1
437	sbc r2,r3,0
438	sub1 r0,r0,r1
439	cmp_s r0,r1
440	mov.f lp_count,r2
441#else /* ! __ARC_NORM__ */
442	lsr_s r2,r0
443	brhs.d r1,r2,.Lret0_3
444	mov lp_count,32
445.Lloop1:
446	asl_s r1,r1		; den <<= 1
447	brls.d r1,r2,@.Lloop1
448	sub lp_count,lp_count,1
449	sub_s r0,r0,r1
450	lsr_s r1,r1
451	cmp_s r0,r1
452	xor.f r2,lp_count,31
453#if !defined (__ARCEM__) && !defined (__ARCHS__)
454	mov_s lp_count,r2
455#else
456	mov lp_count,r2
457	nop_s
458#endif /* !__ARCEM__ && !__ARCHS__ */
459#endif /* !__ARC_NORM__ */
460	sub.cc r0,r0,r1
461	mov_s r3,3
462	sbc r3,r3,0
463#if defined (__ARC_BARREL_SHIFTER__)
464	asl_s r3,r3,r2
465	rsub r1,r1,1
466	lpne @.Lloop2_end
467	add1.f r0,r1,r0
468	sub.cc r0,r0,r1
469.Lloop2_end:
470	lsr r1,r0,r2
471#else
472	rsub r1,r1,1
473	lpne @.Lloop2_end
474	asl_s r3,r3
475	add1.f r0,r1,r0
476	sub.cc r0,r0,r1
477.Lloop2_end:
478	lsr_s r1,r0
479	lsr.f lp_count,r2
480	mov.cc r1,r0
481	lpnz 1f
482	lsr_s r1,r1
483	lsr_s r1,r1
4841:
485#endif
486	bmsk r0,r0,r2
487	bclr r0,r0,r2
488	j_s.d [blink]
489	or_s r0,r0,r3
490.Lret0_3:
491#if 0 /* Slightly shorter, but slower.  */
492	lp .Loop3_end
493	brhi.d r1,r0,.Loop3_end
494	sub_s r0,r0,r1
495.Loop3_end
496	add_s r1,r1,r0
497	j_s.d [blink]
498	rsub r0,lp_count,32-1
499#else
500	mov_s r4,r1
501	sub.f r1,r0,r1
502	sbc r0,r0,r0
503	sub.cc.f r1,r1,r4
504	sbc r0,r0,0
505	sub.cc.f r1,r1,r4
506	sbc r0,r0,-3
507	j_s.d [blink]
508	add.cs r1,r1,r4
509#endif
510#else /* Arctangent-A5 */
511	breq_s r1,0,@.Ldivmodend
512	mov_s r2,1		; bit = 1
513	mov_s r3,0		; res = 0
514.Lloop1:
515	brhs r1,r0,@.Lloop2
516	bbit1 r1,31,@.Lloop2
517	asl_s r1,r1		; den <<= 1
518	b.d @.Lloop1
519	asl_s r2,r2		; bit <<= 1
520.Lloop2:
521	brlo r0,r1,@.Lshiftdown
522	sub_s r0,r0,r1		; num -= den
523	or_s r3,r3,r2		; res |= bit
524.Lshiftdown:
525	lsr_s r2,r2		; bit >>= 1
526	lsr_s r1,r1		; den >>= 1
527	brne_s r2,0,@.Lloop2
528.Ldivmodend:
529	mov_s r1,r0		; r1 = mod
530	j.d [blink]
531	mov_s r0,r3		; r0 = res
532/******************************************************/
533#endif
534	ENDFUNC(__udivmodsi4)
535
536#endif
537
538#ifdef  L_udivsi3
539	.section .text
540	.align 4
541
542	.global SYM(__udivsi3)
543	FUNC(__udivsi3)
544SYM(__udivsi3):
545	b @SYM(__udivmodsi4)
546	ENDFUNC(__udivsi3)
547#if 0 /* interferes with linux loader */
548	.section .__arc_profile_forward, "a"
549	.long SYM(__udivsi3)
550	.long SYM(__udivmodsi4)
551	.long 65536
552#endif
553
554#endif /* L_udivsi3 */
555
556#ifdef  L_divsi3
557	.section .text
558	.align 4
559
560	.global SYM(__divsi3)
561	FUNC(__divsi3)
562
563#ifndef __ARC_EA__
564SYM(__divsi3):
565	/* A5 / ARC60? */
566	mov r12,blink
567	xor r11,r0,r1
568	abs_s r0,r0
569	bl.d @SYM(__udivmodsi4)
570	abs_s r1,r1
571	tst r11,r11
572	j.d [r12]
573	neg.mi r0,r0
574#else 	/* !ifndef __ARC_EA__ */
575	;; We can use the abs, norm, divaw and mpy instructions for ARC700
576#define MULDIV
577#ifdef MULDIV
578/* This table has been generated by divtab-arc700.c.  */
579/* 1/512 .. 1/256, normalized.  There is a leading 1 in bit 31.
580   For powers of two, we list unnormalized numbers instead.  The values
581   for powers of 2 are loaded, but not used.  The value for 1 is actually
582   the first instruction after .Lmuldiv.  */
583	.balign 4
584.Ldivtab:
585
586	.long	0x1000000
587	.long	0x80808081
588	.long	0x81020409
589	.long	0x81848DA9
590	.long	0x82082083
591	.long	0x828CBFBF
592	.long	0x83126E98
593	.long	0x83993053
594	.long	0x84210843
595	.long	0x84A9F9C9
596	.long	0x85340854
597	.long	0x85BF3762
598	.long	0x864B8A7E
599	.long	0x86D90545
600	.long	0x8767AB60
601	.long	0x87F78088
602	.long	0x88888889
603	.long	0x891AC73B
604	.long	0x89AE408A
605	.long	0x8A42F871
606	.long	0x8AD8F2FC
607	.long	0x8B70344B
608	.long	0x8C08C08D
609	.long	0x8CA29C05
610	.long	0x8D3DCB09
611	.long	0x8DDA5203
612	.long	0x8E78356E
613	.long	0x8F1779DA
614	.long	0x8FB823EF
615	.long	0x905A3864
616	.long	0x90FDBC0A
617	.long	0x91A2B3C5
618	.long	0x92492493
619	.long	0x92F11385
620	.long	0x939A85C5
621	.long	0x94458095
622	.long	0x94F20950
623	.long	0x95A02569
624	.long	0x964FDA6D
625	.long	0x97012E03
626	.long	0x97B425EE
627	.long	0x9868C80A
628	.long	0x991F1A52
629	.long	0x99D722DB
630	.long	0x9A90E7DA
631	.long	0x9B4C6F9F
632	.long	0x9C09C09D
633	.long	0x9CC8E161
634	.long	0x9D89D89E
635	.long	0x9E4CAD24
636	.long	0x9F1165E8
637	.long	0x9FD809FE
638	.long	0xA0A0A0A1
639	.long	0xA16B312F
640	.long	0xA237C32C
641	.long	0xA3065E40
642	.long	0xA3D70A3E
643	.long	0xA4A9CF1E
644	.long	0xA57EB503
645	.long	0xA655C43A
646	.long	0xA72F053A
647	.long	0xA80A80A9
648	.long	0xA8E83F58
649	.long	0xA9C84A48
650	.long	0xAAAAAAAB
651	.long	0xAB8F69E3
652	.long	0xAC769185
653	.long	0xAD602B59
654	.long	0xAE4C415D
655	.long	0xAF3ADDC7
656	.long	0xB02C0B03
657	.long	0xB11FD3B9
658	.long	0xB21642C9
659	.long	0xB30F6353
660	.long	0xB40B40B5
661	.long	0xB509E68B
662	.long	0xB60B60B7
663	.long	0xB70FBB5B
664	.long	0xB81702E1
665	.long	0xB92143FB
666	.long	0xBA2E8BA3
667	.long	0xBB3EE722
668	.long	0xBC52640C
669	.long	0xBD691048
670	.long	0xBE82FA0C
671	.long	0xBFA02FE9
672	.long	0xC0C0C0C1
673	.long	0xC1E4BBD6
674	.long	0xC30C30C4
675	.long	0xC4372F86
676	.long	0xC565C87C
677	.long	0xC6980C6A
678	.long	0xC7CE0C7D
679	.long	0xC907DA4F
680	.long	0xCA4587E7
681	.long	0xCB8727C1
682	.long	0xCCCCCCCD
683	.long	0xCE168A78
684	.long	0xCF6474A9
685	.long	0xD0B69FCC
686	.long	0xD20D20D3
687	.long	0xD3680D37
688	.long	0xD4C77B04
689	.long	0xD62B80D7
690	.long	0xD79435E6
691	.long	0xD901B204
692	.long	0xDA740DA8
693	.long	0xDBEB61EF
694	.long	0xDD67C8A7
695	.long	0xDEE95C4D
696	.long	0xE070381D
697	.long	0xE1FC780F
698	.long	0xE38E38E4
699	.long	0xE525982B
700	.long	0xE6C2B449
701	.long	0xE865AC7C
702	.long	0xEA0EA0EB
703	.long	0xEBBDB2A6
704	.long	0xED7303B6
705	.long	0xEF2EB720
706	.long	0xF0F0F0F1
707	.long	0xF2B9D649
708	.long	0xF4898D60
709	.long	0xF6603D99
710	.long	0xF83E0F84
711	.long	0xFA232CF3
712	.long	0xFC0FC0FD
713	.long	0xFE03F810
714	.long	0x2000000
715	.long	0x81020409
716	.long	0x82082083
717	.long	0x83126E98
718	.long	0x84210843
719	.long	0x85340854
720	.long	0x864B8A7E
721	.long	0x8767AB60
722	.long	0x88888889
723	.long	0x89AE408A
724	.long	0x8AD8F2FC
725	.long	0x8C08C08D
726	.long	0x8D3DCB09
727	.long	0x8E78356E
728	.long	0x8FB823EF
729	.long	0x90FDBC0A
730	.long	0x92492493
731	.long	0x939A85C5
732	.long	0x94F20950
733	.long	0x964FDA6D
734	.long	0x97B425EE
735	.long	0x991F1A52
736	.long	0x9A90E7DA
737	.long	0x9C09C09D
738	.long	0x9D89D89E
739	.long	0x9F1165E8
740	.long	0xA0A0A0A1
741	.long	0xA237C32C
742	.long	0xA3D70A3E
743	.long	0xA57EB503
744	.long	0xA72F053A
745	.long	0xA8E83F58
746	.long	0xAAAAAAAB
747	.long	0xAC769185
748	.long	0xAE4C415D
749	.long	0xB02C0B03
750	.long	0xB21642C9
751	.long	0xB40B40B5
752	.long	0xB60B60B7
753	.long	0xB81702E1
754	.long	0xBA2E8BA3
755	.long	0xBC52640C
756	.long	0xBE82FA0C
757	.long	0xC0C0C0C1
758	.long	0xC30C30C4
759	.long	0xC565C87C
760	.long	0xC7CE0C7D
761	.long	0xCA4587E7
762	.long	0xCCCCCCCD
763	.long	0xCF6474A9
764	.long	0xD20D20D3
765	.long	0xD4C77B04
766	.long	0xD79435E6
767	.long	0xDA740DA8
768	.long	0xDD67C8A7
769	.long	0xE070381D
770	.long	0xE38E38E4
771	.long	0xE6C2B449
772	.long	0xEA0EA0EB
773	.long	0xED7303B6
774	.long	0xF0F0F0F1
775	.long	0xF4898D60
776	.long	0xF83E0F84
777	.long	0xFC0FC0FD
778	.long	0x4000000
779	.long	0x82082083
780	.long	0x84210843
781	.long	0x864B8A7E
782	.long	0x88888889
783	.long	0x8AD8F2FC
784	.long	0x8D3DCB09
785	.long	0x8FB823EF
786	.long	0x92492493
787	.long	0x94F20950
788	.long	0x97B425EE
789	.long	0x9A90E7DA
790	.long	0x9D89D89E
791	.long	0xA0A0A0A1
792	.long	0xA3D70A3E
793	.long	0xA72F053A
794	.long	0xAAAAAAAB
795	.long	0xAE4C415D
796	.long	0xB21642C9
797	.long	0xB60B60B7
798	.long	0xBA2E8BA3
799	.long	0xBE82FA0C
800	.long	0xC30C30C4
801	.long	0xC7CE0C7D
802	.long	0xCCCCCCCD
803	.long	0xD20D20D3
804	.long	0xD79435E6
805	.long	0xDD67C8A7
806	.long	0xE38E38E4
807	.long	0xEA0EA0EB
808	.long	0xF0F0F0F1
809	.long	0xF83E0F84
810	.long	0x8000000
811	.long	0x84210843
812	.long	0x88888889
813	.long	0x8D3DCB09
814	.long	0x92492493
815	.long	0x97B425EE
816	.long	0x9D89D89E
817	.long	0xA3D70A3E
818	.long	0xAAAAAAAB
819	.long	0xB21642C9
820	.long	0xBA2E8BA3
821	.long	0xC30C30C4
822	.long	0xCCCCCCCD
823	.long	0xD79435E6
824	.long	0xE38E38E4
825	.long	0xF0F0F0F1
826	.long	0x10000000
827	.long	0x88888889
828	.long	0x92492493
829	.long	0x9D89D89E
830	.long	0xAAAAAAAB
831	.long	0xBA2E8BA3
832	.long	0xCCCCCCCD
833	.long	0xE38E38E4
834	.long	0x20000000
835	.long	0x92492493
836	.long	0xAAAAAAAB
837	.long	0xCCCCCCCD
838	.long	0x40000000
839	.long	0xAAAAAAAB
840	.long	0x80000000
841__muldiv:
842	neg	r4,r2
843	ld.as	r5,[pcl,r4]
844	abs_s	r12,r0
845	bic.f	0,r2,r4
846	mpyhu.ne r12,r12,r5
847	norm	r3,r2
848	xor.f	0,r0,r1
849	; write port allocation stall
850	rsub	r3,r3,30
851	lsr	r0,r12,r3
852	j_s.d	[blink]
853	neg.mi	r0,r0
854
855	.balign	4
856SYM(__divsi3):
857	norm	r3,r1
858	abs_s	r2,r1
859	brhs	r3,23,__muldiv
860	norm	r4,r0
861	abs_l	r12,r0
862	brhs	r4,r3,.Lonebit
863	asl_s	r2,r2,r3
864	asl	r12,r12,r4
865	sub	lp_count,r3,r4
866	sub.f	r12,r12,r2
867	brge.d	r12,r2,.Lsbit
868	sub	r4,r3,r4
869	add.lo	r12,r12,r2
870	lp	.Ldivend
871.Ldivstart:divaw r12,r12,r2
872.Ldivend:xor_s	r1,r1,r0
873	sub	r0,r4,1
874	bmsk	r0,r12,r0
875	bset.hs	r0,r0,r4
876	tst_s	r1,r1
877	j_s.d	[blink]
878	neg.mi	r0,r0
879.Lonebit:
880	xor_s	r1,r1,r0
881	asr_s	r1,r1,31
882	sub1.f	0,r12,r2	; special case:	-2**(n+1) / 2**n
883	or	r0,r1,1
884	add.eq	r0,r0,r0
885	cmp_s	r12,r2
886	j_s.d	[blink]
887	mov.lo	r0,0
888.Lsbit:
889	; Need to handle special cases involving negative powers of two:
890	; r12,r2 are normalized dividend / divisor;
891	; divide anything by 0x80000000, or divide 0x80000000 by 0x40000000
892	add_s	r12,r12,r2
893	xor_s	r1,r1,r0
894	rsub	r4,r4,-1
895	ror	r0,r12,r4
896	tst_s	r2,r2
897	bmsk	r0,r0,r3
898	add.pl	r0,r0,r0
899	tst_s	r1,r1
900	j_s.d	[blink]
901	neg.mi	r0,r0
902#else /* !MULDIV */
903/* This version requires that divaw works with a divisor of 0x80000000U  */
904	abs_s	r2,r1
905	norm	r4,r0
906	neg_s	r3,r2
907	norm	r3,r3
908	abs_s	r12,r0
909	brhs	r4,r3,.Lonebit
910	asl_s	r2,r2,r3
911	asl	r12,r12,r4
912	sub	lp_count,r3,r4
913	cmp_s	r12,r2
914	sub.hs	r12,r12,r2
915	lp	.Ldivend
916.Ldivstart:divaw r12,r12,r2
917.Ldivend:xor_s	r1,r1,r0
918	sub_s	r0,r3,1
919	bmsk	r0,r12,r0
920	bset.hs	r0,r0,r3
921	tst_s	r1,r1
922	j_s.d	[blink]
923	negmi	r0,r0
924.Lonebit:
925	xor_s	r1,r1,r0
926	asr_s	r1,r1,31
927	cmp_s	r12,r2
928	mov_s	r0,0
929	j_s.d	[blink]
930	orhs	r0,r1,1
931#endif /* MULDIV */
932
933#endif	/* ifndef __ARC700__ */
934	ENDFUNC(__divsi3)
935
936
937#endif /* L_divsi3 */
938
939#ifdef  L_umodsi3
940	.section .text
941	.align 4
942
943	.global SYM(__umodsi3)
944	FUNC(__umodsi3)
945SYM(__umodsi3):
946	mov r7,blink
947	bl.nd @SYM(__udivmodsi4)
948	j.d [r7]
949	mov r0,r1
950	ENDFUNC(__umodsi3)
951#if 0 /* interferes with linux loader */
952	.section .__arc_profile_forward, "a"
953	.long SYM(__umodsi3)
954	.long SYM(__udivmodsi4)
955	.long 65536
956#endif
957
958#endif /* L_umodsi3 */
959
960#ifdef  L_modsi3
961	.section .text
962	.align 4
963
964	.global SYM (__modsi3)
965	FUNC(__modsi3)
966SYM(__modsi3):
967#ifndef __ARC_EA__
968	/* A5 / ARC60? */
969	mov_s r12,blink
970	mov_s r11,r0
971	abs_s r0,r0
972	bl.d @SYM(__udivmodsi4)
973	abs_s r1,r1
974	tst r11,r11
975	neg_s r0,r1
976	j_s.d [r12]
977	mov.pl r0,r1
978#else /* __ARC_EA__ */
979	abs_s	r2,r1
980	norm.f	r4,r0
981	neg	r5,r2
982	norm	r3,r5
983	abs_l	r12,r0
984	brhs	r4,r3,.Lonebit
985	asl_s	r2,r2,r3
986	asl	r12,r12,r4
987	sub	lp_count,r3,r4
988	cmp_s	r12,r2
989	sub.hs	r12,r12,r2
990	tst_s	r0,r0
991	lp	.Ldivend
992.Ldivstart:divaw r12,r12,r2
993.Ldivend:
994	lsr	r0,r12,r3
995	j_s.d	[blink]
996	neg.mi	r0,r0
997	.balign	4
998.Lonebit:neg.pl	r5,r5
999	cmp_s	r12,r2
1000	j_s.d	[blink]
1001	sub.hs	r0,r0,r5
1002#endif /* !__ARC_EA__ */
1003	ENDFUNC(__modsi3)
1004
1005#endif /* L_modsi3 */
1006
1007#ifdef L_clzsi2
1008       .section .text
1009       .align 4
1010       .global SYM (__clzsi2)
1011SYM(__clzsi2):
1012#ifdef __ARC_NORM__
1013	HIDDEN_FUNC(__clzsi2)
1014	norm.f	r0,r0
1015	mov.n	r0,0
1016	j_s.d	[blink]
1017	add.pl	r0,r0,1
1018	ENDFUNC(__clzsi2)
1019#elif !defined (__ARC_BARREL_SHIFTER__)
1020	FUNC(__clzsi2)
1021	mov lp_count,10
1022	mov_l r1,0
1023	bset r2,r1,29
1024	lp .Loop_end
1025	brhs r0,r2,.Loop_end
1026	add3 r0,r1,r0
1027.Loop_end:
1028	asl.f 0,r0
1029	sub2 r0,lp_count,lp_count
1030	sub.cs.f r0,r0,1
1031	add r0,r0,31
1032	j_s.d [blink]
1033	add.pl r0,r0,1
1034	ENDFUNC(__clzsi2)
1035#else
1036	FUNC(__clzsi2)
1037	asl.f 0,r0,2
1038	mov r1,-1
1039.Lcheck:
1040	bbit1.d r0,31,.Ldone
1041	asl.pl r0,r0,3
1042	bcs.d .Ldone_1
1043	add_s r1,r1,3
1044	bpnz.d .Lcheck
1045	asl.f 0,r0,2
1046	mov_s r0,32
1047	j_s.d [blink]
1048	mov.ne r0,r1
1049.Ldone:
1050	j_s.d [blink]
1051	add_s r0,r1,1
1052.Ldone_1:
1053	j_s.d [blink]
1054	sub_s r0,r1,1
1055	ENDFUNC(__clzsi2)
1056#endif
1057#endif /* L_clzsi2 */
1058       .section .text
1059
1060
1061;;; MILLICODE THUNK LIB ;***************
1062
1063;;; 	.macro push_regs from, to, offset
1064;;; 		st_s "\from", [sp, \offset]
1065;;; 		.if \to-\from
1066;;; 			push_regs "(\from+1)", \to, "(\offset+4)"
1067;;; 		.endif
1068;;; 	.endm
1069;;; 	push_regs 13, 18, 0
1070;;;
1071
1072;;;;   	.macro sum from, to, three
1073;;;;   		.long \from
1074;;;;   		.long \three
1075;;;;   		.local regno
1076;;;;   		.set regno, \from+1
1077;;;;   		.set shift, 32
1078;;;;   		.set shift, shift - 1
1079;;;;   #		st_s %shift @3 lsl #shift
1080;;;;   		.if \to-\from
1081;;;;   		sum "(\from+1)", \to, "(\three)"
1082;;;;   		.endif
1083;;;;   	.endm
1084;;;;
1085;;;;   	SUM 0,5, 9
1086;;;;
1087;	.altmacro
1088;;  	.macro push_regs from=0, to=3, offset
1089;;  		st_s r\from, [sp, \offset]
1090;;  		.if \to-\from
1091;;  			push_regs "\from+1 ",\to,"(\offset+4)"
1092;;  		.endif
1093;;  	.endm
1094;;
1095;;  	.macro expand_to_push from=13, to
1096;;  ;		.section .text
1097;;  ;		.align 4
1098;;  ;		.global st_
1099;;  ;		.type foo,
1100;;  	st_13_to_25:
1101;;  ;		push_regs \from, \to, 0
1102;;  	push_regs 0,3		;
1103;;  	.endm
1104;;
1105;;  	expand_to_push 13,18
1106;;
1107;#endif
1108
1109#ifdef L_millicodethunk_st
1110	.section .text
1111	.align 4
1112	.global SYM(__st_r13_to_r15)
1113	.global SYM(__st_r13_to_r16)
1114	.global SYM(__st_r13_to_r17)
1115	.global SYM(__st_r13_to_r18)
1116	.global SYM(__st_r13_to_r19)
1117	.global SYM(__st_r13_to_r20)
1118	.global SYM(__st_r13_to_r21)
1119	.global SYM(__st_r13_to_r22)
1120	.global SYM(__st_r13_to_r23)
1121	.global SYM(__st_r13_to_r24)
1122	.global SYM(__st_r13_to_r25)
1123	HIDDEN_FUNC(__st_r13_to_r15)
1124	HIDDEN_FUNC(__st_r13_to_r16)
1125	HIDDEN_FUNC(__st_r13_to_r17)
1126	HIDDEN_FUNC(__st_r13_to_r18)
1127	HIDDEN_FUNC(__st_r13_to_r19)
1128	HIDDEN_FUNC(__st_r13_to_r20)
1129	HIDDEN_FUNC(__st_r13_to_r21)
1130	HIDDEN_FUNC(__st_r13_to_r22)
1131	HIDDEN_FUNC(__st_r13_to_r23)
1132	HIDDEN_FUNC(__st_r13_to_r24)
1133	HIDDEN_FUNC(__st_r13_to_r25)
1134	.align 4
1135SYM(__st_r13_to_r25):
1136	st r25, [sp,48]
1137SYM(__st_r13_to_r24):
1138	st r24, [sp,44]
1139SYM(__st_r13_to_r23):
1140	st r23, [sp,40]
1141SYM(__st_r13_to_r22):
1142	st r22, [sp,36]
1143SYM(__st_r13_to_r21):
1144	st r21, [sp,32]
1145SYM(__st_r13_to_r20):
1146	st r20, [sp,28]
1147SYM(__st_r13_to_r19):
1148	st r19, [sp,24]
1149SYM(__st_r13_to_r18):
1150	st r18, [sp,20]
1151SYM(__st_r13_to_r17):
1152	st r17, [sp,16]
1153SYM(__st_r13_to_r16):
1154	st r16, [sp,12]
1155SYM(__st_r13_to_r15):
1156#ifdef __ARC700__
1157	st r15, [sp,8] ; minimum function size to avoid stall: 6 bytes.
1158#else
1159	st_s r15, [sp,8]
1160#endif
1161	st_s r14, [sp,4]
1162	j_s.d [%blink]
1163	st_s r13, [sp,0]
1164	ENDFUNC(__st_r13_to_r15)
1165	ENDFUNC(__st_r13_to_r16)
1166	ENDFUNC(__st_r13_to_r17)
1167	ENDFUNC(__st_r13_to_r18)
1168	ENDFUNC(__st_r13_to_r19)
1169	ENDFUNC(__st_r13_to_r20)
1170	ENDFUNC(__st_r13_to_r21)
1171	ENDFUNC(__st_r13_to_r22)
1172	ENDFUNC(__st_r13_to_r23)
1173	ENDFUNC(__st_r13_to_r24)
1174	ENDFUNC(__st_r13_to_r25)
1175#endif  /* L_millicodethunk_st */
1176
1177
1178#ifdef L_millicodethunk_ld
1179	.section .text
1180	.align 4
1181;	==================================
1182;	the loads
1183
1184	.global SYM(__ld_r13_to_r15)
1185	.global SYM(__ld_r13_to_r16)
1186	.global SYM(__ld_r13_to_r17)
1187	.global SYM(__ld_r13_to_r18)
1188	.global SYM(__ld_r13_to_r19)
1189	.global SYM(__ld_r13_to_r20)
1190	.global SYM(__ld_r13_to_r21)
1191	.global SYM(__ld_r13_to_r22)
1192	.global SYM(__ld_r13_to_r23)
1193	.global SYM(__ld_r13_to_r24)
1194	.global SYM(__ld_r13_to_r25)
1195	HIDDEN_FUNC(__ld_r13_to_r15)
1196	HIDDEN_FUNC(__ld_r13_to_r16)
1197	HIDDEN_FUNC(__ld_r13_to_r17)
1198	HIDDEN_FUNC(__ld_r13_to_r18)
1199	HIDDEN_FUNC(__ld_r13_to_r19)
1200	HIDDEN_FUNC(__ld_r13_to_r20)
1201	HIDDEN_FUNC(__ld_r13_to_r21)
1202	HIDDEN_FUNC(__ld_r13_to_r22)
1203	HIDDEN_FUNC(__ld_r13_to_r23)
1204	HIDDEN_FUNC(__ld_r13_to_r24)
1205	HIDDEN_FUNC(__ld_r13_to_r25)
1206SYM(__ld_r13_to_r25):
1207	ld r25, [sp,48]
1208SYM(__ld_r13_to_r24):
1209	ld r24, [sp,44]
1210SYM(__ld_r13_to_r23):
1211	ld r23, [sp,40]
1212SYM(__ld_r13_to_r22):
1213	ld r22, [sp,36]
1214SYM(__ld_r13_to_r21):
1215	ld r21, [sp,32]
1216SYM(__ld_r13_to_r20):
1217	ld r20, [sp,28]
1218SYM(__ld_r13_to_r19):
1219	ld r19, [sp,24]
1220SYM(__ld_r13_to_r18):
1221	ld r18, [sp,20]
1222SYM(__ld_r13_to_r17):
1223	ld r17, [sp,16]
1224SYM(__ld_r13_to_r16):
1225	ld r16, [sp,12]
1226SYM(__ld_r13_to_r15):
1227#ifdef __ARC700__
1228	ld r15, [sp,8] ; minimum function size to avoid stall: 6 bytes.
1229#else
1230	ld_s r15, [sp,8]
1231#endif
1232	ld_s r14, [sp,4]
1233	j_s.d [%blink]
1234	ld_s r13, [sp,0]
1235	ENDFUNC(__ld_r13_to_r15)
1236	ENDFUNC(__ld_r13_to_r16)
1237	ENDFUNC(__ld_r13_to_r17)
1238	ENDFUNC(__ld_r13_to_r18)
1239	ENDFUNC(__ld_r13_to_r19)
1240	ENDFUNC(__ld_r13_to_r20)
1241	ENDFUNC(__ld_r13_to_r21)
1242	ENDFUNC(__ld_r13_to_r22)
1243	ENDFUNC(__ld_r13_to_r23)
1244	ENDFUNC(__ld_r13_to_r24)
1245	ENDFUNC(__ld_r13_to_r25)
1246
1247#endif /* L_millicodethunk_ld */
1248#ifdef L_millicodethunk_ret
1249	.global SYM(__ld_r13_to_r14_ret)
1250	.global SYM(__ld_r13_to_r15_ret)
1251	.global SYM(__ld_r13_to_r16_ret)
1252	.global SYM(__ld_r13_to_r17_ret)
1253	.global SYM(__ld_r13_to_r18_ret)
1254	.global SYM(__ld_r13_to_r19_ret)
1255	.global SYM(__ld_r13_to_r20_ret)
1256	.global SYM(__ld_r13_to_r21_ret)
1257	.global SYM(__ld_r13_to_r22_ret)
1258	.global SYM(__ld_r13_to_r23_ret)
1259	.global SYM(__ld_r13_to_r24_ret)
1260	.global SYM(__ld_r13_to_r25_ret)
1261	HIDDEN_FUNC(__ld_r13_to_r14_ret)
1262	HIDDEN_FUNC(__ld_r13_to_r15_ret)
1263	HIDDEN_FUNC(__ld_r13_to_r16_ret)
1264	HIDDEN_FUNC(__ld_r13_to_r17_ret)
1265	HIDDEN_FUNC(__ld_r13_to_r18_ret)
1266	HIDDEN_FUNC(__ld_r13_to_r19_ret)
1267	HIDDEN_FUNC(__ld_r13_to_r20_ret)
1268	HIDDEN_FUNC(__ld_r13_to_r21_ret)
1269	HIDDEN_FUNC(__ld_r13_to_r22_ret)
1270	HIDDEN_FUNC(__ld_r13_to_r23_ret)
1271	HIDDEN_FUNC(__ld_r13_to_r24_ret)
1272	HIDDEN_FUNC(__ld_r13_to_r25_ret)
1273	.section .text
1274	.align 4
1275SYM(__ld_r13_to_r25_ret):
1276	ld r25, [sp,48]
1277SYM(__ld_r13_to_r24_ret):
1278	ld r24, [sp,44]
1279SYM(__ld_r13_to_r23_ret):
1280	ld r23, [sp,40]
1281SYM(__ld_r13_to_r22_ret):
1282	ld r22, [sp,36]
1283SYM(__ld_r13_to_r21_ret):
1284	ld r21, [sp,32]
1285SYM(__ld_r13_to_r20_ret):
1286	ld r20, [sp,28]
1287SYM(__ld_r13_to_r19_ret):
1288	ld r19, [sp,24]
1289SYM(__ld_r13_to_r18_ret):
1290	ld r18, [sp,20]
1291SYM(__ld_r13_to_r17_ret):
1292	ld r17, [sp,16]
1293SYM(__ld_r13_to_r16_ret):
1294	ld r16, [sp,12]
1295SYM(__ld_r13_to_r15_ret):
1296	ld r15, [sp,8]
1297SYM(__ld_r13_to_r14_ret):
1298	ld blink,[sp,r12]
1299	ld_s r14, [sp,4]
1300	ld.ab r13, [sp,r12]
1301	j_s.d [%blink]
1302	add_s sp,sp,4
1303	ENDFUNC(__ld_r13_to_r14_ret)
1304	ENDFUNC(__ld_r13_to_r15_ret)
1305	ENDFUNC(__ld_r13_to_r16_ret)
1306	ENDFUNC(__ld_r13_to_r17_ret)
1307	ENDFUNC(__ld_r13_to_r18_ret)
1308	ENDFUNC(__ld_r13_to_r19_ret)
1309	ENDFUNC(__ld_r13_to_r20_ret)
1310	ENDFUNC(__ld_r13_to_r21_ret)
1311	ENDFUNC(__ld_r13_to_r22_ret)
1312	ENDFUNC(__ld_r13_to_r23_ret)
1313	ENDFUNC(__ld_r13_to_r24_ret)
1314	ENDFUNC(__ld_r13_to_r25_ret)
1315
1316#endif /* L_millicodethunk_ret */
1317
1318#define ARC_OPTFPE (defined (__ARC700__) || defined (__ARC_FPX_QUARK__))
1319
1320#if ARC_OPTFPE
1321#ifdef  L_adddf3
1322#ifdef __ARC_NORM__
1323#include "ieee-754/adddf3.S"
1324#endif
1325#endif
1326
1327#ifdef  L_muldf3
1328#ifdef __ARC_MPY__
1329#include "ieee-754/muldf3.S"
1330#elif defined (__ARC_NORM__) && defined(__ARC_MUL64__)
1331#include "ieee-754/arc600-mul64/muldf3.S"
1332#elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__)
1333#include "ieee-754/arc600-dsp/muldf3.S"
1334#endif
1335#endif
1336
1337#ifdef  L_addsf3
1338#ifdef __ARC_NORM__
1339#include "ieee-754/addsf3.S"
1340#endif
1341#endif
1342
1343#ifdef  L_mulsf3
1344#ifdef  __ARC_MPY__
1345#include "ieee-754/mulsf3.S"
1346#elif defined (__ARC_NORM__) && defined(__ARC_MUL64__)
1347#include "ieee-754/arc600-mul64/mulsf3.S"
1348#elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__)
1349#include "ieee-754/arc600-dsp/mulsf3.S"
1350#elif defined (__ARC_NORM__)
1351#include "ieee-754/arc600/mulsf3.S"
1352#endif
1353#endif
1354
1355#ifdef  L_divdf3
1356#ifdef  __ARC_MPY__
1357#include "ieee-754/divdf3.S"
1358#elif defined (__ARC_NORM__) && defined(__ARC_MUL64__)
1359#include "ieee-754/arc600-mul64/divdf3.S"
1360#elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__)
1361#include "ieee-754/arc600-dsp/divdf3.S"
1362#endif
1363#endif
1364
1365#ifdef  L_divsf3
1366#ifdef  __ARC_MPY__
1367#include "ieee-754/divsf3-stdmul.S"
1368#elif defined (__ARC_NORM__) && defined(__ARC_MUL64__)
1369#include "ieee-754/arc600-mul64/divsf3.S"
1370#elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__)
1371#include "ieee-754/arc600-dsp/divsf3.S"
1372#elif defined (__ARC_NORM__)
1373#include "ieee-754/arc600/divsf3.S"
1374#endif
1375#endif
1376
1377#ifdef L_extendsfdf2
1378#ifdef __ARC_NORM__
1379#include "ieee-754/extendsfdf2.S"
1380#endif
1381#endif
1382
1383#ifdef L_truncdfsf2
1384#ifdef __ARC_NORM__
1385#include "ieee-754/truncdfsf2.S"
1386#endif
1387#endif
1388
1389#ifdef L_floatsidf
1390#ifdef __ARC_NORM__
1391#include "ieee-754/floatsidf.S"
1392#endif
1393#endif
1394
1395#ifdef L_floatsisf
1396#ifdef __ARC_NORM__
1397#include "ieee-754/floatsisf.S"
1398#endif
1399#endif
1400
1401#ifdef L_floatunsidf
1402#ifdef __ARC_NORM__
1403#include "ieee-754/floatunsidf.S"
1404#endif
1405#endif
1406
1407#ifdef L_fixdfsi
1408#ifdef __ARC_NORM__
1409#include "ieee-754/fixdfsi.S"
1410#endif
1411#endif
1412
1413#ifdef L_fixsfsi
1414#ifdef __ARC_NORM__
1415#include "ieee-754/fixsfsi.S"
1416#endif
1417#endif
1418
1419#ifdef L_fixunsdfsi
1420#ifdef __ARC_NORM__
1421#include "ieee-754/fixunsdfsi.S"
1422#endif
1423#endif
1424
1425#ifdef L_eqdf2
1426#ifdef __ARC_NORM__
1427#include "ieee-754/eqdf2.S"
1428#endif
1429#endif
1430
1431#ifdef L_eqsf2
1432#ifdef __ARC_NORM__
1433#include "ieee-754/eqsf2.S"
1434#endif
1435#endif
1436
1437#ifdef L_gtdf2
1438#ifdef __ARC_NORM__
1439#include "ieee-754/gtdf2.S"
1440#endif
1441#endif
1442
1443#ifdef L_gtsf2
1444#ifdef __ARC_NORM__
1445#include "ieee-754/gtsf2.S"
1446#endif
1447#endif
1448
1449#ifdef L_gedf2
1450#ifdef __ARC_NORM__
1451#include "ieee-754/gedf2.S"
1452#endif
1453#endif
1454
1455#ifdef L_gesf2
1456#ifdef __ARC_NORM__
1457#include "ieee-754/gesf2.S"
1458#endif
1459#endif
1460
1461#ifdef L_uneqdf2
1462#ifdef __ARC_NORM__
1463#include "ieee-754/uneqdf2.S"
1464#endif
1465#endif
1466
1467#ifdef L_uneqsf2
1468#ifdef __ARC_NORM__
1469#include "ieee-754/uneqsf2.S"
1470#endif
1471#endif
1472
1473#ifdef L_orddf2
1474#ifdef __ARC_NORM__
1475#include "ieee-754/orddf2.S"
1476#endif
1477#endif
1478
1479#ifdef L_ordsf2
1480#ifdef __ARC_NORM__
1481#include "ieee-754/ordsf2.S"
1482#endif
1483#endif
1484#endif /* ARC_OPTFPE */
1485