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