| ; libgcc1 routines for Synopsys DesignWare ARC cpu. |
| |
| /* Copyright (C) 1995-2023 Free Software Foundation, Inc. |
| Contributor: Joern Rennecke <joern.rennecke@embecosm.com> |
| on behalf of Synopsys Inc. |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify it under |
| the terms of the GNU General Public License as published by the Free |
| Software Foundation; either version 3, or (at your option) any later |
| version. |
| |
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| |
| Under Section 7 of GPL version 3, you are granted additional |
| permissions described in the GCC Runtime Library Exception, version |
| 3.1, as published by the Free Software Foundation. |
| |
| You should have received a copy of the GNU General Public License and |
| a copy of the GCC Runtime Library Exception along with this program; |
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| /* As a special exception, if you link this library with other files, |
| some of which are compiled with GCC, to produce an executable, |
| this library does not by itself cause the resulting executable |
| to be covered by the GNU General Public License. |
| This exception does not however invalidate any other reasons why |
| the executable file might be covered by the GNU General Public License. */ |
| |
| |
| /* ANSI concatenation macros. */ |
| |
| #define CONCAT1(a, b) CONCAT2(a, b) |
| #define CONCAT2(a, b) a ## b |
| |
| /* Use the right prefix for global labels. */ |
| |
| #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) |
| |
| #ifndef WORKING_ASSEMBLER |
| #define abs_l abs |
| #define asl_l asl |
| #define mov_l mov |
| #endif |
| |
| #define FUNC(X) .type SYM(X),@function |
| #define HIDDEN_FUNC(X) FUNC(X)` .hidden X |
| #define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X |
| #define ENDFUNC(X) ENDFUNC0(X) |
| |
| #ifdef __ARC_RF16__ |
| /* Use object attributes to inform other tools this file is |
| safe for RF16 configuration. */ |
| .arc_attribute Tag_ARC_ABI_rf16, 1 |
| #endif |
| |
| #ifdef L_mulsi3 |
| .section .text |
| .align 4 |
| |
| .global SYM(__mulsi3) |
| SYM(__mulsi3): |
| |
| /* This the simple version. |
| |
| while (a) |
| { |
| if (a & 1) |
| r += b; |
| a >>= 1; |
| b <<= 1; |
| } |
| */ |
| |
| #if defined (__ARC_MUL64__) |
| FUNC(__mulsi3) |
| mulu64 r0,r1 |
| j_s.d [blink] |
| mov_s r0,mlo |
| ENDFUNC(__mulsi3) |
| #elif defined (__ARC_MPY__) |
| HIDDEN_FUNC(__mulsi3) |
| mpyu r0,r0,r1 |
| nop_s |
| j_s [blink] |
| ENDFUNC(__mulsi3) |
| #elif defined (__ARC_NORM__) |
| FUNC(__mulsi3) |
| norm.f r2,r0 |
| rsub lp_count,r2,31 |
| mov.mi lp_count,32 |
| mov_s r2,r0 |
| mov_s r0,0 |
| lpnz @.Lend ; loop is aligned |
| lsr.f r2,r2 |
| add.cs r0,r0,r1 |
| add_s r1,r1,r1 |
| .Lend: j_s [blink] |
| ENDFUNC(__mulsi3) |
| #elif !defined (__OPTIMIZE_SIZE__) && defined (__ARC_BARREL_SHIFTER__) |
| /* Up to 3.5 times faster than the simpler code below, but larger. */ |
| FUNC(__mulsi3) |
| ror.f r2,r0,4 |
| mov_s r0,0 |
| add3.mi r0,r0,r1 |
| asl.f r2,r2,2 |
| add2.cs r0,r0,r1 |
| jeq_s [blink] |
| .Loop: |
| add1.mi r0,r0,r1 |
| asl.f r2,r2,2 |
| add.cs r0,r0,r1 |
| asl_s r1,r1,4 |
| ror.f r2,r2,8 |
| add3.mi r0,r0,r1 |
| asl.f r2,r2,2 |
| bne.d .Loop |
| add2.cs r0,r0,r1 |
| j_s [blink] |
| ENDFUNC(__mulsi3) |
| #elif !defined (__OPTIMIZE_SIZE__) /* __ARC601__ */ |
| FUNC(__mulsi3) |
| lsr.f r2,r0 |
| mov_s r0,0 |
| mov_s r3,0 |
| add.cs r0,r0,r1 |
| .Loop: |
| lsr.f r2,r2 |
| add1.cs r0,r0,r1 |
| lsr.f r2,r2 |
| add2.cs r0,r0,r1 |
| lsr.f r2,r2 |
| add3.cs r0,r0,r1 |
| bne.d .Loop |
| add3 r1,r3,r1 |
| j_s [blink] |
| ENDFUNC(__mulsi3) |
| #else |
| /********************************************************/ |
| FUNC(__mulsi3) |
| mov_s r2,0 ; Accumulate result here. |
| .Lloop: |
| bbit0 r0,0,@.Ly |
| add_s r2,r2,r1 ; r += b |
| .Ly: |
| lsr_s r0,r0 ; a >>= 1 |
| asl_s r1,r1 ; b <<= 1 |
| brne_s r0,0,@.Lloop |
| .Ldone: |
| j_s.d [blink] |
| mov_s r0,r2 |
| ENDFUNC(__mulsi3) |
| /********************************************************/ |
| #endif |
| |
| #endif /* L_mulsi3 */ |
| |
| #ifdef L_umulsidi3 |
| .section .text |
| .align 4 |
| |
| .global SYM(__umulsidi3) |
| SYM(__umulsidi3): |
| HIDDEN_FUNC(__umulsidi3) |
| /* We need ARC700 /ARC_MUL64 definitions of __umulsidi3 / __umulsi3_highpart |
| in case some code has been compiled without multiply support enabled, |
| but linked with the multiply-support enabled libraries. |
| For ARC601 (i.e. without a barrel shifter), we also use umuldisi3 as our |
| umulsi3_highpart implementation; the use of the latter label doesn't |
| actually benefit ARC601 platforms, but is useful when ARC601 code is linked |
| against other libraries. */ |
| #if defined (__ARC_MPY__) || defined (__ARC_MUL64__) \ |
| || !defined (__ARC_BARREL_SHIFTER__) |
| .global SYM(__umulsi3_highpart) |
| SYM(__umulsi3_highpart): |
| HIDDEN_FUNC(__umulsi3_highpart) |
| #endif |
| |
| /* This the simple version. |
| |
| while (a) |
| { |
| if (a & 1) |
| r += b; |
| a >>= 1; |
| b <<= 1; |
| } |
| */ |
| #include "ieee-754/arc-ieee-754.h" |
| |
| #ifdef __ARC_MPY__ |
| mov_s r12,DBL0L |
| mpyu DBL0L,r12,DBL0H |
| j_s.d [blink] |
| MPYHU DBL0H,r12,DBL0H |
| #elif defined (__ARC_MUL64__) |
| /* Likewise for __ARC_MUL64__ */ |
| mulu64 r0,r1 |
| mov_s DBL0L,mlo |
| j_s.d [blink] |
| mov_s DBL0H,mhi |
| #else /* !__ARC_MPY__ && !__ARC_MUL64__ */ |
| /* Although it might look tempting to extend this to handle muldi3, |
| using mulsi3 twice with 2.25 cycles per 32 bit add is faster |
| than one loop with 3 or four cycles per 32 bit add. */ |
| asl.f r12,0 ; Top part of b. |
| mov_s r2,0 ; Accumulate result here. |
| bbit1.d r0,0,@.Ladd |
| mov_s r3,0 |
| .Llooptst: |
| rlc r12,r12 |
| breq r0,0,@.Ldone ; while (a) |
| .Lloop: |
| asl.f r1,r1 ; b <<= 1 |
| bbit0.d r0,1,@.Llooptst |
| lsr r0,r0 ; a >>= 1 |
| rlc r12,r12 |
| .Ladd: |
| add.f r3,r3,r1 ; r += b |
| brne.d r0,0,@.Lloop ; while (a); |
| adc r2,r2,r12 |
| .Ldone: |
| mov_s DBL0L,r3 |
| j_s.d [blink] |
| mov DBL0H,r2 |
| #endif /* !__ARC_MPY__*/ |
| ENDFUNC(__umulsidi3) |
| #if defined (__ARC_MPY__) || defined (__ARC_MUL64__) \ |
| || !defined (__ARC_BARREL_SHIFTER__) |
| ENDFUNC(__umulsi3_highpart) |
| #endif |
| #endif /* L_umulsidi3 */ |
| |
| #ifndef __ARC_RF16__ |
| #ifdef L_muldi3 |
| .section .text |
| .align 4 |
| .global SYM(__muldi3) |
| SYM(__muldi3): |
| #ifdef __LITTLE_ENDIAN__ |
| push_s blink |
| mov_s r4,r3 ;4 |
| mov_s r5,r2 ;4 |
| mov_s r9,r0 ;4 |
| mov_s r8,r1 ;4 |
| bl.d @__umulsidi3 |
| mov_s r1,r2 ;4 |
| mov_s r6,r0 ;4 |
| mov_s r7,r1 ;4 |
| mov_s r0,r9 ;4 |
| bl.d @__mulsi3 |
| mov_s r1,r4 ;4 |
| mov_s r4,r0 ;4 |
| mov_s r1,r8 ;4 |
| bl.d @__mulsi3 |
| mov_s r0,r5 ;4 |
| pop_s blink |
| add_s r0,r0,r4 ;2 |
| add r1,r0,r7 |
| j_s.d [blink] |
| mov_s r0,r6 ;4 |
| #else |
| push_s blink |
| mov_s r5,r3 |
| mov_s r9,r2 |
| mov_s r4,r1 |
| mov_s r8,r0 |
| mov_s r0,r1 |
| bl.d @__umulsidi3 |
| mov_s r1,r3 |
| mov_s r7,r0 |
| mov_s r6,r1 |
| mov_s r0,r4 |
| bl.d @__mulsi3 |
| mov_s r1,r9 |
| mov_s r4,r0 |
| mov_s r1,r8 |
| bl.d @__mulsi3 |
| mov_s r0,r5 |
| pop_s blink |
| add_s r0,r0,r4 |
| add_s r0,r0,r7 |
| j_s.d [blink] |
| mov_s r1,r6 |
| #endif /* __LITTLE_ENDIAN__ */ |
| ENDFUNC(__muldi3) |
| #endif /* L_muldi3 */ |
| #endif /* !__ARC_RF16__ */ |
| |
| #ifdef L_umulsi3_highpart |
| #include "ieee-754/arc-ieee-754.h" |
| /* For use without a barrel shifter, and for ARC700 / ARC_MUL64, the |
| mulsidi3 algorithms above look better, so for these, there is an |
| extra label up there. */ |
| #if !defined (__ARC_MPY__) && !defined (__ARC_MUL64__) \ |
| && defined (__ARC_BARREL_SHIFTER__) |
| .global SYM(__umulsi3_highpart) |
| SYM(__umulsi3_highpart): |
| HIDDEN_FUNC(__umulsi3_highpart) |
| mov_s r2,0 |
| mov_s r3,32 |
| .Loop: |
| lsr.f r0,r0 |
| add.cs.f r2,r2,r1 |
| sub_s r3,r3,1 |
| brne.d r0,0,.Loop |
| rrc r2,r2 |
| j_s.d [blink] |
| /* Make the result register peephole-compatible with mulsidi3. */ |
| lsr DBL0H,r2,r3 |
| ENDFUNC(__umulsi3_highpart) |
| #endif /* !__ARC_MPY__ && __ARC_BARREL_SHIFTER__ */ |
| #endif /* L_umulsi3_highpart */ |
| |
| #ifdef L_divmod_tools |
| |
| ; Utilities used by all routines. |
| |
| .section .text |
| |
| /* |
| unsigned long |
| udivmodsi4(int modwanted, unsigned long num, unsigned long den) |
| { |
| unsigned long bit = 1; |
| unsigned long res = 0; |
| |
| while (den < num && bit && !(den & (1L<<31))) |
| { |
| den <<=1; |
| bit <<=1; |
| } |
| while (bit) |
| { |
| if (num >= den) |
| { |
| num -= den; |
| res |= bit; |
| } |
| bit >>=1; |
| den >>=1; |
| } |
| if (modwanted) return num; |
| return res; |
| } |
| */ |
| |
| ; inputs: r0 = numerator, r1 = denominator |
| ; outputs: r0 = quotient, r1 = remainder, r2/r3 trashed |
| |
| .balign 4 |
| .global SYM(__udivmodsi4) |
| FUNC(__udivmodsi4) |
| SYM(__udivmodsi4): |
| |
| #if defined (__ARC_EA__) |
| /* Normalize divisor and divident, and then use the appropriate number of |
| divaw (the number of result bits, or one more) to produce the result. |
| There are some special conditions that need to be tested: |
| - We can only directly normalize unsigned numbers that fit in 31 bit. For |
| the divisor, we test early on that it is not 'negative'. |
| - divaw can't corrrectly process a divident that is larger than the divisor. |
| We handle this be checking that the divident prior to normalization is |
| not larger than the normalized divisor. As we then already know then |
| that the divisor fits 31 bit, this check also makes sure that the |
| divident fits. |
| - ordinary normalization of the divident could make it larger than the |
| normalized divisor, which again would be unsuitable for divaw. |
| Thus, we want to shift left the divident by one less, except that we |
| want to leave it alone if it is already 31 bit. To this end, we |
| double the input to norm with adds. |
| - If the divident has less bits than the divisor, that would leave us |
| with a negative number of divaw to execute. Although we could use a |
| conditional loop to avoid excess divaw, and then the quotient could |
| be extracted correctly as there'd be more than enough zero bits, the |
| remainder would be shifted left too far, requiring a conditional shift |
| right. The cost of that shift and the possible mispredict on the |
| conditional loop cost as much as putting in an early check for a zero |
| result. */ |
| bmsk r3,r0,29 |
| brne.d r3,r0,.Large_dividend |
| norm.f r2,r1 |
| brlo r0,r1,.Lret0 |
| norm r3,r0 |
| asl_s r1,r1,r2 |
| sub_s r3,r3,1 |
| asl_l r0,r0,r3 ; not short to keep loop aligned |
| sub lp_count,r2,r3 |
| lp .Ldiv_end |
| divaw r0,r0,r1 |
| .Ldiv_end:sub_s r3,r2,1 |
| lsr r1,r0,r2 |
| j_s.d [blink] |
| bmsk r0,r0,r3 |
| |
| .balign 4 |
| .Large_dividend: |
| bmi .Ltrivial |
| asl_s r1,r1,r2 |
| mov_s r3,0 |
| sub1.f r4,r0,r1 |
| mov.lo r4,r0 |
| mov.hs r3,2 |
| cmp r4,r1 |
| sub.hs r4,r4,r1 |
| add.hs r3,r3,1 |
| mov.f lp_count,r2 |
| lpne .Ldiv_end2 |
| divaw r4,r4,r1 |
| .Ldiv_end2:asl r0,r3,r2 |
| lsr r1,r4,r2 |
| sub_s r2,r2,1 |
| bmsk r4,r4,r2 |
| j_s.d [blink] |
| or.ne r0,r0,r4 |
| |
| .Lret0: |
| mov_s r1,r0 |
| j_s.d [blink] |
| mov_l r0,0 |
| .balign 4 |
| .Ltrivial: |
| sub.f r1,r0,r1 |
| mov.c r1,r0 |
| mov_s r0,1 |
| j_s.d [blink] |
| mov.c r0,0 |
| #elif !defined (__OPTIMIZE_SIZE__) && !defined (__ARC_RF16__) |
| #if defined (__ARC_NORM__) && defined (__ARC_BARREL_SHIFTER__) |
| lsr_s r2,r0 |
| brhs.d r1,r2,.Lret0_3 |
| norm r2,r2 |
| norm r3,r1 |
| sub_s r3,r3,r2 |
| asl_s r1,r1,r3 |
| sub1.f 0,r0,r1 |
| lsr.cs r1,r1,1 |
| sbc r2,r3,0 |
| sub1 r0,r0,r1 |
| cmp_s r0,r1 |
| mov.f lp_count,r2 |
| #else /* ! __ARC_NORM__ */ |
| lsr_s r2,r0 |
| brhs.d r1,r2,.Lret0_3 |
| mov lp_count,32 |
| .Lloop1: |
| asl_s r1,r1 ; den <<= 1 |
| brls.d r1,r2,@.Lloop1 |
| sub lp_count,lp_count,1 |
| sub_s r0,r0,r1 |
| lsr_s r1,r1 |
| cmp_s r0,r1 |
| xor.f r2,lp_count,31 |
| #if !defined (__ARCEM__) && !defined (__ARCHS__) |
| mov_s lp_count,r2 |
| #else |
| mov lp_count,r2 |
| nop_s |
| #endif /* !__ARCEM__ && !__ARCHS__ */ |
| #endif /* !__ARC_NORM__ */ |
| sub.cc r0,r0,r1 |
| mov_s r3,3 |
| sbc r3,r3,0 |
| #if defined (__ARC_BARREL_SHIFTER__) |
| asl_s r3,r3,r2 |
| rsub r1,r1,1 |
| lpne @.Lloop2_end |
| add1.f r0,r1,r0 |
| sub.cc r0,r0,r1 |
| .Lloop2_end: |
| lsr r1,r0,r2 |
| #else |
| rsub r1,r1,1 |
| lpne @.Lloop2_end |
| asl_s r3,r3 |
| add1.f r0,r1,r0 |
| sub.cc r0,r0,r1 |
| .Lloop2_end: |
| lsr_s r1,r0 |
| lsr.f lp_count,r2 |
| mov.cc r1,r0 |
| lpnz 1f |
| lsr_s r1,r1 |
| lsr_s r1,r1 |
| 1: |
| #endif |
| bmsk r0,r0,r2 |
| bclr r0,r0,r2 |
| j_s.d [blink] |
| or_s r0,r0,r3 |
| .Lret0_3: |
| #if 0 /* Slightly shorter, but slower. */ |
| lp .Loop3_end |
| brhi.d r1,r0,.Loop3_end |
| sub_s r0,r0,r1 |
| .Loop3_end |
| add_s r1,r1,r0 |
| j_s.d [blink] |
| rsub r0,lp_count,32-1 |
| #else |
| mov_s r4,r1 |
| sub.f r1,r0,r1 |
| sbc r0,r0,r0 |
| sub.cc.f r1,r1,r4 |
| sbc r0,r0,0 |
| sub.cc.f r1,r1,r4 |
| sbc r0,r0,-3 |
| j_s.d [blink] |
| add.cs r1,r1,r4 |
| #endif |
| #else /* Arctangent-A5 */ |
| breq_s r1,0,@.Ldivmodend |
| mov_s r2,1 ; bit = 1 |
| mov_s r3,0 ; res = 0 |
| .Lloop1: |
| brhs r1,r0,@.Lloop2 |
| bbit1 r1,31,@.Lloop2 |
| asl_s r1,r1 ; den <<= 1 |
| b.d @.Lloop1 |
| asl_s r2,r2 ; bit <<= 1 |
| .Lloop2: |
| brlo r0,r1,@.Lshiftdown |
| sub_s r0,r0,r1 ; num -= den |
| or_s r3,r3,r2 ; res |= bit |
| .Lshiftdown: |
| lsr_s r2,r2 ; bit >>= 1 |
| lsr_s r1,r1 ; den >>= 1 |
| brne_s r2,0,@.Lloop2 |
| .Ldivmodend: |
| mov_s r1,r0 ; r1 = mod |
| j.d [blink] |
| mov_s r0,r3 ; r0 = res |
| /******************************************************/ |
| #endif |
| ENDFUNC(__udivmodsi4) |
| |
| #endif |
| |
| #ifdef L_udivsi3 |
| .section .text |
| .align 4 |
| |
| .global SYM(__udivsi3) |
| FUNC(__udivsi3) |
| SYM(__udivsi3): |
| b @SYM(__udivmodsi4) |
| ENDFUNC(__udivsi3) |
| |
| #endif /* L_udivsi3 */ |
| |
| #ifdef L_divsi3 |
| .section .text |
| .align 4 |
| |
| .global SYM(__divsi3) |
| FUNC(__divsi3) |
| |
| #ifndef __ARC_EA__ |
| SYM(__divsi3): |
| /* A5 / ARC60? */ |
| mov r12,blink |
| xor r11,r0,r1 |
| abs_s r0,r0 |
| bl.d @SYM(__udivmodsi4) |
| abs_s r1,r1 |
| tst r11,r11 |
| j.d [r12] |
| neg.mi r0,r0 |
| #else /* !ifndef __ARC_EA__ */ |
| ;; We can use the abs, norm, divaw and mpy instructions for ARC700 |
| #define MULDIV |
| #ifdef MULDIV |
| /* This table has been generated by divtab-arc700.c. */ |
| /* 1/512 .. 1/256, normalized. There is a leading 1 in bit 31. |
| For powers of two, we list unnormalized numbers instead. The values |
| for powers of 2 are loaded, but not used. The value for 1 is actually |
| the first instruction after .Lmuldiv. */ |
| .balign 4 |
| .Ldivtab: |
| |
| .long 0x1000000 |
| .long 0x80808081 |
| .long 0x81020409 |
| .long 0x81848DA9 |
| .long 0x82082083 |
| .long 0x828CBFBF |
| .long 0x83126E98 |
| .long 0x83993053 |
| .long 0x84210843 |
| .long 0x84A9F9C9 |
| .long 0x85340854 |
| .long 0x85BF3762 |
| .long 0x864B8A7E |
| .long 0x86D90545 |
| .long 0x8767AB60 |
| .long 0x87F78088 |
| .long 0x88888889 |
| .long 0x891AC73B |
| .long 0x89AE408A |
| .long 0x8A42F871 |
| .long 0x8AD8F2FC |
| .long 0x8B70344B |
| .long 0x8C08C08D |
| .long 0x8CA29C05 |
| .long 0x8D3DCB09 |
| .long 0x8DDA5203 |
| .long 0x8E78356E |
| .long 0x8F1779DA |
| .long 0x8FB823EF |
| .long 0x905A3864 |
| .long 0x90FDBC0A |
| .long 0x91A2B3C5 |
| .long 0x92492493 |
| .long 0x92F11385 |
| .long 0x939A85C5 |
| .long 0x94458095 |
| .long 0x94F20950 |
| .long 0x95A02569 |
| .long 0x964FDA6D |
| .long 0x97012E03 |
| .long 0x97B425EE |
| .long 0x9868C80A |
| .long 0x991F1A52 |
| .long 0x99D722DB |
| .long 0x9A90E7DA |
| .long 0x9B4C6F9F |
| .long 0x9C09C09D |
| .long 0x9CC8E161 |
| .long 0x9D89D89E |
| .long 0x9E4CAD24 |
| .long 0x9F1165E8 |
| .long 0x9FD809FE |
| .long 0xA0A0A0A1 |
| .long 0xA16B312F |
| .long 0xA237C32C |
| .long 0xA3065E40 |
| .long 0xA3D70A3E |
| .long 0xA4A9CF1E |
| .long 0xA57EB503 |
| .long 0xA655C43A |
| .long 0xA72F053A |
| .long 0xA80A80A9 |
| .long 0xA8E83F58 |
| .long 0xA9C84A48 |
| .long 0xAAAAAAAB |
| .long 0xAB8F69E3 |
| .long 0xAC769185 |
| .long 0xAD602B59 |
| .long 0xAE4C415D |
| .long 0xAF3ADDC7 |
| .long 0xB02C0B03 |
| .long 0xB11FD3B9 |
| .long 0xB21642C9 |
| .long 0xB30F6353 |
| .long 0xB40B40B5 |
| .long 0xB509E68B |
| .long 0xB60B60B7 |
| .long 0xB70FBB5B |
| .long 0xB81702E1 |
| .long 0xB92143FB |
| .long 0xBA2E8BA3 |
| .long 0xBB3EE722 |
| .long 0xBC52640C |
| .long 0xBD691048 |
| .long 0xBE82FA0C |
| .long 0xBFA02FE9 |
| .long 0xC0C0C0C1 |
| .long 0xC1E4BBD6 |
| .long 0xC30C30C4 |
| .long 0xC4372F86 |
| .long 0xC565C87C |
| .long 0xC6980C6A |
| .long 0xC7CE0C7D |
| .long 0xC907DA4F |
| .long 0xCA4587E7 |
| .long 0xCB8727C1 |
| .long 0xCCCCCCCD |
| .long 0xCE168A78 |
| .long 0xCF6474A9 |
| .long 0xD0B69FCC |
| .long 0xD20D20D3 |
| .long 0xD3680D37 |
| .long 0xD4C77B04 |
| .long 0xD62B80D7 |
| .long 0xD79435E6 |
| .long 0xD901B204 |
| .long 0xDA740DA8 |
| .long 0xDBEB61EF |
| .long 0xDD67C8A7 |
| .long 0xDEE95C4D |
| .long 0xE070381D |
| .long 0xE1FC780F |
| .long 0xE38E38E4 |
| .long 0xE525982B |
| .long 0xE6C2B449 |
| .long 0xE865AC7C |
| .long 0xEA0EA0EB |
| .long 0xEBBDB2A6 |
| .long 0xED7303B6 |
| .long 0xEF2EB720 |
| .long 0xF0F0F0F1 |
| .long 0xF2B9D649 |
| .long 0xF4898D60 |
| .long 0xF6603D99 |
| .long 0xF83E0F84 |
| .long 0xFA232CF3 |
| .long 0xFC0FC0FD |
| .long 0xFE03F810 |
| .long 0x2000000 |
| .long 0x81020409 |
| .long 0x82082083 |
| .long 0x83126E98 |
| .long 0x84210843 |
| .long 0x85340854 |
| .long 0x864B8A7E |
| .long 0x8767AB60 |
| .long 0x88888889 |
| .long 0x89AE408A |
| .long 0x8AD8F2FC |
| .long 0x8C08C08D |
| .long 0x8D3DCB09 |
| .long 0x8E78356E |
| .long 0x8FB823EF |
| .long 0x90FDBC0A |
| .long 0x92492493 |
| .long 0x939A85C5 |
| .long 0x94F20950 |
| .long 0x964FDA6D |
| .long 0x97B425EE |
| .long 0x991F1A52 |
| .long 0x9A90E7DA |
| .long 0x9C09C09D |
| .long 0x9D89D89E |
| .long 0x9F1165E8 |
| .long 0xA0A0A0A1 |
| .long 0xA237C32C |
| .long 0xA3D70A3E |
| .long 0xA57EB503 |
| .long 0xA72F053A |
| .long 0xA8E83F58 |
| .long 0xAAAAAAAB |
| .long 0xAC769185 |
| .long 0xAE4C415D |
| .long 0xB02C0B03 |
| .long 0xB21642C9 |
| .long 0xB40B40B5 |
| .long 0xB60B60B7 |
| .long 0xB81702E1 |
| .long 0xBA2E8BA3 |
| .long 0xBC52640C |
| .long 0xBE82FA0C |
| .long 0xC0C0C0C1 |
| .long 0xC30C30C4 |
| .long 0xC565C87C |
| .long 0xC7CE0C7D |
| .long 0xCA4587E7 |
| .long 0xCCCCCCCD |
| .long 0xCF6474A9 |
| .long 0xD20D20D3 |
| .long 0xD4C77B04 |
| .long 0xD79435E6 |
| .long 0xDA740DA8 |
| .long 0xDD67C8A7 |
| .long 0xE070381D |
| .long 0xE38E38E4 |
| .long 0xE6C2B449 |
| .long 0xEA0EA0EB |
| .long 0xED7303B6 |
| .long 0xF0F0F0F1 |
| .long 0xF4898D60 |
| .long 0xF83E0F84 |
| .long 0xFC0FC0FD |
| .long 0x4000000 |
| .long 0x82082083 |
| .long 0x84210843 |
| .long 0x864B8A7E |
| .long 0x88888889 |
| .long 0x8AD8F2FC |
| .long 0x8D3DCB09 |
| .long 0x8FB823EF |
| .long 0x92492493 |
| .long 0x94F20950 |
| .long 0x97B425EE |
| .long 0x9A90E7DA |
| .long 0x9D89D89E |
| .long 0xA0A0A0A1 |
| .long 0xA3D70A3E |
| .long 0xA72F053A |
| .long 0xAAAAAAAB |
| .long 0xAE4C415D |
| .long 0xB21642C9 |
| .long 0xB60B60B7 |
| .long 0xBA2E8BA3 |
| .long 0xBE82FA0C |
| .long 0xC30C30C4 |
| .long 0xC7CE0C7D |
| .long 0xCCCCCCCD |
| .long 0xD20D20D3 |
| .long 0xD79435E6 |
| .long 0xDD67C8A7 |
| .long 0xE38E38E4 |
| .long 0xEA0EA0EB |
| .long 0xF0F0F0F1 |
| .long 0xF83E0F84 |
| .long 0x8000000 |
| .long 0x84210843 |
| .long 0x88888889 |
| .long 0x8D3DCB09 |
| .long 0x92492493 |
| .long 0x97B425EE |
| .long 0x9D89D89E |
| .long 0xA3D70A3E |
| .long 0xAAAAAAAB |
| .long 0xB21642C9 |
| .long 0xBA2E8BA3 |
| .long 0xC30C30C4 |
| .long 0xCCCCCCCD |
| .long 0xD79435E6 |
| .long 0xE38E38E4 |
| .long 0xF0F0F0F1 |
| .long 0x10000000 |
| .long 0x88888889 |
| .long 0x92492493 |
| .long 0x9D89D89E |
| .long 0xAAAAAAAB |
| .long 0xBA2E8BA3 |
| .long 0xCCCCCCCD |
| .long 0xE38E38E4 |
| .long 0x20000000 |
| .long 0x92492493 |
| .long 0xAAAAAAAB |
| .long 0xCCCCCCCD |
| .long 0x40000000 |
| .long 0xAAAAAAAB |
| .long 0x80000000 |
| __muldiv: |
| neg r4,r2 |
| ld.as r5,[pcl,r4] |
| abs_s r12,r0 |
| bic.f 0,r2,r4 |
| mpyhu.ne r12,r12,r5 |
| norm r3,r2 |
| xor.f 0,r0,r1 |
| ; write port allocation stall |
| rsub r3,r3,30 |
| lsr r0,r12,r3 |
| j_s.d [blink] |
| neg.mi r0,r0 |
| |
| .balign 4 |
| SYM(__divsi3): |
| norm r3,r1 |
| abs_s r2,r1 |
| brhs r3,23,__muldiv |
| norm r4,r0 |
| abs_l r12,r0 |
| brhs r4,r3,.Lonebit |
| asl_s r2,r2,r3 |
| asl r12,r12,r4 |
| sub lp_count,r3,r4 |
| sub.f r12,r12,r2 |
| brge.d r12,r2,.Lsbit |
| sub r4,r3,r4 |
| add.lo r12,r12,r2 |
| lp .Ldivend |
| .Ldivstart:divaw r12,r12,r2 |
| .Ldivend:xor_s r1,r1,r0 |
| sub r0,r4,1 |
| bmsk r0,r12,r0 |
| bset.hs r0,r0,r4 |
| tst_s r1,r1 |
| j_s.d [blink] |
| neg.mi r0,r0 |
| .Lonebit: |
| xor_s r1,r1,r0 |
| asr_s r1,r1,31 |
| sub1.f 0,r12,r2 ; special case: -2**(n+1) / 2**n |
| or r0,r1,1 |
| add.eq r0,r0,r0 |
| cmp_s r12,r2 |
| j_s.d [blink] |
| mov.lo r0,0 |
| .Lsbit: |
| ; Need to handle special cases involving negative powers of two: |
| ; r12,r2 are normalized dividend / divisor; |
| ; divide anything by 0x80000000, or divide 0x80000000 by 0x40000000 |
| add_s r12,r12,r2 |
| xor_s r1,r1,r0 |
| rsub r4,r4,-1 |
| ror r0,r12,r4 |
| tst_s r2,r2 |
| bmsk r0,r0,r3 |
| add.pl r0,r0,r0 |
| tst_s r1,r1 |
| j_s.d [blink] |
| neg.mi r0,r0 |
| #else /* !MULDIV */ |
| /* This version requires that divaw works with a divisor of 0x80000000U */ |
| abs_s r2,r1 |
| norm r4,r0 |
| neg_s r3,r2 |
| norm r3,r3 |
| abs_s r12,r0 |
| brhs r4,r3,.Lonebit |
| asl_s r2,r2,r3 |
| asl r12,r12,r4 |
| sub lp_count,r3,r4 |
| cmp_s r12,r2 |
| sub.hs r12,r12,r2 |
| lp .Ldivend |
| .Ldivstart:divaw r12,r12,r2 |
| .Ldivend:xor_s r1,r1,r0 |
| sub_s r0,r3,1 |
| bmsk r0,r12,r0 |
| bset.hs r0,r0,r3 |
| tst_s r1,r1 |
| j_s.d [blink] |
| negmi r0,r0 |
| .Lonebit: |
| xor_s r1,r1,r0 |
| asr_s r1,r1,31 |
| cmp_s r12,r2 |
| mov_s r0,0 |
| j_s.d [blink] |
| orhs r0,r1,1 |
| #endif /* MULDIV */ |
| |
| #endif /* ifndef __ARC700__ */ |
| ENDFUNC(__divsi3) |
| |
| |
| #endif /* L_divsi3 */ |
| |
| #ifndef __ARC_RF16__ |
| #ifdef L_umodsi3 |
| .section .text |
| .align 4 |
| |
| .global SYM(__umodsi3) |
| FUNC(__umodsi3) |
| SYM(__umodsi3): |
| mov r7,blink |
| bl.nd @SYM(__udivmodsi4) |
| j.d [r7] |
| mov r0,r1 |
| ENDFUNC(__umodsi3) |
| |
| #endif /* L_umodsi3 */ |
| #endif /* !__ARC_RF16__ */ |
| |
| #ifdef L_modsi3 |
| .section .text |
| .align 4 |
| |
| .global SYM (__modsi3) |
| FUNC(__modsi3) |
| SYM(__modsi3): |
| #ifndef __ARC_EA__ |
| /* A5 / ARC60? */ |
| mov_s r12,blink |
| mov_s r11,r0 |
| abs_s r0,r0 |
| bl.d @SYM(__udivmodsi4) |
| abs_s r1,r1 |
| tst r11,r11 |
| neg_s r0,r1 |
| j_s.d [r12] |
| mov.pl r0,r1 |
| #else /* __ARC_EA__ */ |
| abs_s r2,r1 |
| norm.f r4,r0 |
| neg r5,r2 |
| norm r3,r5 |
| abs_l r12,r0 |
| brhs r4,r3,.Lonebit |
| asl_s r2,r2,r3 |
| asl r12,r12,r4 |
| sub lp_count,r3,r4 |
| cmp_s r12,r2 |
| sub.hs r12,r12,r2 |
| tst_s r0,r0 |
| lp .Ldivend |
| .Ldivstart:divaw r12,r12,r2 |
| .Ldivend: |
| lsr r0,r12,r3 |
| j_s.d [blink] |
| neg.mi r0,r0 |
| .balign 4 |
| .Lonebit:neg.pl r5,r5 |
| cmp_s r12,r2 |
| j_s.d [blink] |
| sub.hs r0,r0,r5 |
| #endif /* !__ARC_EA__ */ |
| ENDFUNC(__modsi3) |
| |
| #endif /* L_modsi3 */ |
| |
| #ifdef L_clzsi2 |
| .section .text |
| .align 4 |
| .global SYM (__clzsi2) |
| SYM(__clzsi2): |
| #ifdef __ARC_NORM__ |
| HIDDEN_FUNC(__clzsi2) |
| norm.f r0,r0 |
| mov.n r0,0 |
| j_s.d [blink] |
| add.pl r0,r0,1 |
| ENDFUNC(__clzsi2) |
| #elif !defined (__ARC_BARREL_SHIFTER__) |
| FUNC(__clzsi2) |
| mov lp_count,10 |
| mov_l r1,0 |
| bset r2,r1,29 |
| lp .Loop_end |
| brhs r0,r2,.Loop_end |
| add3 r0,r1,r0 |
| .Loop_end: |
| asl.f 0,r0 |
| sub2 r0,lp_count,lp_count |
| sub.cs.f r0,r0,1 |
| add r0,r0,31 |
| j_s.d [blink] |
| add.pl r0,r0,1 |
| ENDFUNC(__clzsi2) |
| #else |
| FUNC(__clzsi2) |
| asl.f 0,r0,2 |
| mov r1,-1 |
| .Lcheck: |
| bbit1.d r0,31,.Ldone |
| asl.pl r0,r0,3 |
| bcs.d .Ldone_1 |
| add_s r1,r1,3 |
| bpnz.d .Lcheck |
| asl.f 0,r0,2 |
| mov_s r0,32 |
| j_s.d [blink] |
| mov.ne r0,r1 |
| .Ldone: |
| j_s.d [blink] |
| add_s r0,r1,1 |
| .Ldone_1: |
| j_s.d [blink] |
| sub_s r0,r1,1 |
| ENDFUNC(__clzsi2) |
| #endif |
| #endif /* L_clzsi2 */ |
| .section .text |
| |
| |
| ;;; MILLICODE THUNK LIB ;*************** |
| |
| ;;; .macro push_regs from, to, offset |
| ;;; st_s "\from", [sp, \offset] |
| ;;; .if \to-\from |
| ;;; push_regs "(\from+1)", \to, "(\offset+4)" |
| ;;; .endif |
| ;;; .endm |
| ;;; push_regs 13, 18, 0 |
| ;;; |
| |
| ;;;; .macro sum from, to, three |
| ;;;; .long \from |
| ;;;; .long \three |
| ;;;; .local regno |
| ;;;; .set regno, \from+1 |
| ;;;; .set shift, 32 |
| ;;;; .set shift, shift - 1 |
| ;;;; # st_s %shift @3 lsl #shift |
| ;;;; .if \to-\from |
| ;;;; sum "(\from+1)", \to, "(\three)" |
| ;;;; .endif |
| ;;;; .endm |
| ;;;; |
| ;;;; SUM 0,5, 9 |
| ;;;; |
| ; .altmacro |
| ;; .macro push_regs from=0, to=3, offset |
| ;; st_s r\from, [sp, \offset] |
| ;; .if \to-\from |
| ;; push_regs "\from+1 ",\to,"(\offset+4)" |
| ;; .endif |
| ;; .endm |
| ;; |
| ;; .macro expand_to_push from=13, to |
| ;; ; .section .text |
| ;; ; .align 4 |
| ;; ; .global st_ |
| ;; ; .type foo, |
| ;; st_13_to_25: |
| ;; ; push_regs \from, \to, 0 |
| ;; push_regs 0,3 ; |
| ;; .endm |
| ;; |
| ;; expand_to_push 13,18 |
| ;; |
| ;#endif |
| |
| #ifndef __ARC_RF16__ |
| #ifdef L_millicodethunk_st |
| .section .text |
| .align 4 |
| .global SYM(__st_r13_to_r15) |
| .global SYM(__st_r13_to_r16) |
| .global SYM(__st_r13_to_r17) |
| .global SYM(__st_r13_to_r18) |
| .global SYM(__st_r13_to_r19) |
| .global SYM(__st_r13_to_r20) |
| .global SYM(__st_r13_to_r21) |
| .global SYM(__st_r13_to_r22) |
| .global SYM(__st_r13_to_r23) |
| .global SYM(__st_r13_to_r24) |
| .global SYM(__st_r13_to_r25) |
| HIDDEN_FUNC(__st_r13_to_r15) |
| HIDDEN_FUNC(__st_r13_to_r16) |
| HIDDEN_FUNC(__st_r13_to_r17) |
| HIDDEN_FUNC(__st_r13_to_r18) |
| HIDDEN_FUNC(__st_r13_to_r19) |
| HIDDEN_FUNC(__st_r13_to_r20) |
| HIDDEN_FUNC(__st_r13_to_r21) |
| HIDDEN_FUNC(__st_r13_to_r22) |
| HIDDEN_FUNC(__st_r13_to_r23) |
| HIDDEN_FUNC(__st_r13_to_r24) |
| HIDDEN_FUNC(__st_r13_to_r25) |
| .align 4 |
| SYM(__st_r13_to_r25): |
| st r25, [sp,48] |
| SYM(__st_r13_to_r24): |
| st r24, [sp,44] |
| SYM(__st_r13_to_r23): |
| st r23, [sp,40] |
| SYM(__st_r13_to_r22): |
| st r22, [sp,36] |
| SYM(__st_r13_to_r21): |
| st r21, [sp,32] |
| SYM(__st_r13_to_r20): |
| st r20, [sp,28] |
| SYM(__st_r13_to_r19): |
| st r19, [sp,24] |
| SYM(__st_r13_to_r18): |
| st r18, [sp,20] |
| SYM(__st_r13_to_r17): |
| st r17, [sp,16] |
| SYM(__st_r13_to_r16): |
| st r16, [sp,12] |
| SYM(__st_r13_to_r15): |
| #ifdef __ARC700__ |
| st r15, [sp,8] ; minimum function size to avoid stall: 6 bytes. |
| #else |
| st_s r15, [sp,8] |
| #endif |
| st_s r14, [sp,4] |
| j_s.d [%blink] |
| st_s r13, [sp,0] |
| ENDFUNC(__st_r13_to_r15) |
| ENDFUNC(__st_r13_to_r16) |
| ENDFUNC(__st_r13_to_r17) |
| ENDFUNC(__st_r13_to_r18) |
| ENDFUNC(__st_r13_to_r19) |
| ENDFUNC(__st_r13_to_r20) |
| ENDFUNC(__st_r13_to_r21) |
| ENDFUNC(__st_r13_to_r22) |
| ENDFUNC(__st_r13_to_r23) |
| ENDFUNC(__st_r13_to_r24) |
| ENDFUNC(__st_r13_to_r25) |
| #endif /* L_millicodethunk_st */ |
| |
| |
| #ifdef L_millicodethunk_ld |
| .section .text |
| .align 4 |
| ; ================================== |
| ; the loads |
| |
| .global SYM(__ld_r13_to_r15) |
| .global SYM(__ld_r13_to_r16) |
| .global SYM(__ld_r13_to_r17) |
| .global SYM(__ld_r13_to_r18) |
| .global SYM(__ld_r13_to_r19) |
| .global SYM(__ld_r13_to_r20) |
| .global SYM(__ld_r13_to_r21) |
| .global SYM(__ld_r13_to_r22) |
| .global SYM(__ld_r13_to_r23) |
| .global SYM(__ld_r13_to_r24) |
| .global SYM(__ld_r13_to_r25) |
| HIDDEN_FUNC(__ld_r13_to_r15) |
| HIDDEN_FUNC(__ld_r13_to_r16) |
| HIDDEN_FUNC(__ld_r13_to_r17) |
| HIDDEN_FUNC(__ld_r13_to_r18) |
| HIDDEN_FUNC(__ld_r13_to_r19) |
| HIDDEN_FUNC(__ld_r13_to_r20) |
| HIDDEN_FUNC(__ld_r13_to_r21) |
| HIDDEN_FUNC(__ld_r13_to_r22) |
| HIDDEN_FUNC(__ld_r13_to_r23) |
| HIDDEN_FUNC(__ld_r13_to_r24) |
| HIDDEN_FUNC(__ld_r13_to_r25) |
| SYM(__ld_r13_to_r25): |
| ld r25, [sp,48] |
| SYM(__ld_r13_to_r24): |
| ld r24, [sp,44] |
| SYM(__ld_r13_to_r23): |
| ld r23, [sp,40] |
| SYM(__ld_r13_to_r22): |
| ld r22, [sp,36] |
| SYM(__ld_r13_to_r21): |
| ld r21, [sp,32] |
| SYM(__ld_r13_to_r20): |
| ld r20, [sp,28] |
| SYM(__ld_r13_to_r19): |
| ld r19, [sp,24] |
| SYM(__ld_r13_to_r18): |
| ld r18, [sp,20] |
| SYM(__ld_r13_to_r17): |
| ld r17, [sp,16] |
| SYM(__ld_r13_to_r16): |
| ld r16, [sp,12] |
| SYM(__ld_r13_to_r15): |
| #ifdef __ARC700__ |
| ld r15, [sp,8] ; minimum function size to avoid stall: 6 bytes. |
| #else |
| ld_s r15, [sp,8] |
| #endif |
| ld_s r14, [sp,4] |
| j_s.d [%blink] |
| ld_s r13, [sp,0] |
| ENDFUNC(__ld_r13_to_r15) |
| ENDFUNC(__ld_r13_to_r16) |
| ENDFUNC(__ld_r13_to_r17) |
| ENDFUNC(__ld_r13_to_r18) |
| ENDFUNC(__ld_r13_to_r19) |
| ENDFUNC(__ld_r13_to_r20) |
| ENDFUNC(__ld_r13_to_r21) |
| ENDFUNC(__ld_r13_to_r22) |
| ENDFUNC(__ld_r13_to_r23) |
| ENDFUNC(__ld_r13_to_r24) |
| ENDFUNC(__ld_r13_to_r25) |
| |
| #endif /* L_millicodethunk_ld */ |
| #ifdef L_millicodethunk_ret |
| .global SYM(__ld_r13_to_r14_ret) |
| .global SYM(__ld_r13_to_r15_ret) |
| .global SYM(__ld_r13_to_r16_ret) |
| .global SYM(__ld_r13_to_r17_ret) |
| .global SYM(__ld_r13_to_r18_ret) |
| .global SYM(__ld_r13_to_r19_ret) |
| .global SYM(__ld_r13_to_r20_ret) |
| .global SYM(__ld_r13_to_r21_ret) |
| .global SYM(__ld_r13_to_r22_ret) |
| .global SYM(__ld_r13_to_r23_ret) |
| .global SYM(__ld_r13_to_r24_ret) |
| .global SYM(__ld_r13_to_r25_ret) |
| HIDDEN_FUNC(__ld_r13_to_r14_ret) |
| HIDDEN_FUNC(__ld_r13_to_r15_ret) |
| HIDDEN_FUNC(__ld_r13_to_r16_ret) |
| HIDDEN_FUNC(__ld_r13_to_r17_ret) |
| HIDDEN_FUNC(__ld_r13_to_r18_ret) |
| HIDDEN_FUNC(__ld_r13_to_r19_ret) |
| HIDDEN_FUNC(__ld_r13_to_r20_ret) |
| HIDDEN_FUNC(__ld_r13_to_r21_ret) |
| HIDDEN_FUNC(__ld_r13_to_r22_ret) |
| HIDDEN_FUNC(__ld_r13_to_r23_ret) |
| HIDDEN_FUNC(__ld_r13_to_r24_ret) |
| HIDDEN_FUNC(__ld_r13_to_r25_ret) |
| .section .text |
| .align 4 |
| SYM(__ld_r13_to_r25_ret): |
| ld r25, [sp,48] |
| SYM(__ld_r13_to_r24_ret): |
| ld r24, [sp,44] |
| SYM(__ld_r13_to_r23_ret): |
| ld r23, [sp,40] |
| SYM(__ld_r13_to_r22_ret): |
| ld r22, [sp,36] |
| SYM(__ld_r13_to_r21_ret): |
| ld r21, [sp,32] |
| SYM(__ld_r13_to_r20_ret): |
| ld r20, [sp,28] |
| SYM(__ld_r13_to_r19_ret): |
| ld r19, [sp,24] |
| SYM(__ld_r13_to_r18_ret): |
| ld r18, [sp,20] |
| SYM(__ld_r13_to_r17_ret): |
| ld r17, [sp,16] |
| SYM(__ld_r13_to_r16_ret): |
| ld r16, [sp,12] |
| SYM(__ld_r13_to_r15_ret): |
| ld r15, [sp,8] |
| SYM(__ld_r13_to_r14_ret): |
| ld blink,[sp,r12] |
| ld_s r14, [sp,4] |
| ld.ab r13, [sp,r12] |
| j_s.d [%blink] |
| add_s sp,sp,4 |
| ENDFUNC(__ld_r13_to_r14_ret) |
| ENDFUNC(__ld_r13_to_r15_ret) |
| ENDFUNC(__ld_r13_to_r16_ret) |
| ENDFUNC(__ld_r13_to_r17_ret) |
| ENDFUNC(__ld_r13_to_r18_ret) |
| ENDFUNC(__ld_r13_to_r19_ret) |
| ENDFUNC(__ld_r13_to_r20_ret) |
| ENDFUNC(__ld_r13_to_r21_ret) |
| ENDFUNC(__ld_r13_to_r22_ret) |
| ENDFUNC(__ld_r13_to_r23_ret) |
| ENDFUNC(__ld_r13_to_r24_ret) |
| ENDFUNC(__ld_r13_to_r25_ret) |
| |
| #endif /* L_millicodethunk_ret */ |
| |
| #if defined (__ARC700__) || defined (__ARC_FPX_QUARK__) |
| #ifdef L_adddf3 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/adddf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_muldf3 |
| #ifdef __ARC_MPY__ |
| #include "ieee-754/muldf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL64__) |
| #include "ieee-754/arc600-mul64/muldf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__) |
| #include "ieee-754/arc600-dsp/muldf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_addsf3 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/addsf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_mulsf3 |
| #ifdef __ARC_MPY__ |
| #include "ieee-754/mulsf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL64__) |
| #include "ieee-754/arc600-mul64/mulsf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__) |
| #include "ieee-754/arc600-dsp/mulsf3.S" |
| #elif defined (__ARC_NORM__) |
| #include "ieee-754/arc600/mulsf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_divdf3 |
| #ifdef __ARC_MPY__ |
| #include "ieee-754/divdf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL64__) |
| #include "ieee-754/arc600-mul64/divdf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__) |
| #include "ieee-754/arc600-dsp/divdf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_divsf3 |
| #ifdef __ARC_MPY__ |
| #include "ieee-754/divsf3-stdmul.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL64__) |
| #include "ieee-754/arc600-mul64/divsf3.S" |
| #elif defined (__ARC_NORM__) && defined(__ARC_MUL32BY16__) |
| #include "ieee-754/arc600-dsp/divsf3.S" |
| #elif defined (__ARC_NORM__) |
| #include "ieee-754/arc600/divsf3.S" |
| #endif |
| #endif |
| |
| #ifdef L_extendsfdf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/extendsfdf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_truncdfsf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/truncdfsf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_floatsidf |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/floatsidf.S" |
| #endif |
| #endif |
| |
| #ifdef L_floatsisf |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/floatsisf.S" |
| #endif |
| #endif |
| |
| #ifdef L_floatunsidf |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/floatunsidf.S" |
| #endif |
| #endif |
| |
| #ifdef L_fixdfsi |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/fixdfsi.S" |
| #endif |
| #endif |
| |
| #ifdef L_fixsfsi |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/fixsfsi.S" |
| #endif |
| #endif |
| |
| #ifdef L_fixunsdfsi |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/fixunsdfsi.S" |
| #endif |
| #endif |
| |
| #ifdef L_eqdf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/eqdf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_eqsf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/eqsf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_gtdf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/gtdf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_gtsf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/gtsf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_gedf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/gedf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_gesf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/gesf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_uneqdf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/uneqdf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_uneqsf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/uneqsf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_orddf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/orddf2.S" |
| #endif |
| #endif |
| |
| #ifdef L_ordsf2 |
| #ifdef __ARC_NORM__ |
| #include "ieee-754/ordsf2.S" |
| #endif |
| #endif |
| #endif /* ARC_OPTFPE */ |
| |
| #endif /* !__ARC_RF16__ */ |