/* mculib libgcc routines of Andes NDS32 cpu for GNU compiler Copyright (C) 2012-2014 Free Software Foundation, Inc. Contributed by Andes Technology Corporation. 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 . */ .section .mdebug.abi_nds32 .previous /* ------------------------------------------- */ /* FPBIT floating point operations for libgcc */ /* ------------------------------------------- */ #ifdef L_addsub_sf .text .align 2 .global __subsf3 .type __subsf3, @function __subsf3: push $lp pushm $r6, $r9 move $r2, #0x80000000 xor $r1, $r1, $r2 j .Lsfpadd .global __addsf3 .type __addsf3, @function __addsf3: push $lp pushm $r6, $r9 .Lsfpadd: srli $r5, $r0, #23 andi $r5, $r5, #0xff srli $r7, $r1, #23 andi $r7, $r7, #0xff move $r3, #0x80000000 slli $r4, $r0, #8 or $r4, $r4, $r3 slli $r6, $r1, #8 or $r6, $r6, $r3 addi $r9, $r5, #-1 slti $r15, $r9, #0xfe beqzs8 .LEspecA .LElab1: addi $r9, $r7, #-1 slti $r15, $r9, #0xfe beqzs8 .LEspecB .LElab2: sub $r8, $r5, $r7 sltsi $r15, $r8, #0 bnezs8 .Li1 sltsi $r15, $r8, #0x20 bnezs8 .Li2 move $r6, #2 j .Le1 .Li2: move $r2, $r6 srl $r6, $r6, $r8 sll $r9, $r6, $r8 beq $r9, $r2, .Le1 ori $r6, $r6, #2 j .Le1 .Li1: move $r5, $r7 subri $r8, $r8, #0 sltsi $r15, $r8, #0x20 bnezs8 .Li4 move $r4, #2 j .Le1 .Li4: move $r2, $r4 srl $r4, $r4, $r8 sll $r9, $r4, $r8 beq $r9, $r2, .Le1 ori $r4, $r4, #2 .Le1: and $r8, $r0, $r3 xor $r9, $r8, $r1 sltsi $r15, $r9, #0 bnezs8 .LEsub1 #ADD($r4, $r6) add $r4, $r4, $r6 slt $r15, $r4, $r6 beqzs8 .LEres andi $r9, $r4, #1 beqz $r9, .Li7 ori $r4, $r4, #2 .Li7: srli $r4, $r4, #1 addi $r5, $r5, #1 subri $r15, $r5, #0xff bnezs8 .LEres move $r4, #0 j .LEres .LEsub1: #SUB($r4, $r6) move $r15, $r4 sub $r4, $r4, $r6 slt $r15, $r15, $r4 beqzs8 .Li9 subri $r4, $r4, #0 xor $r8, $r8, $r3 j .Le9 .Li9: beqz $r4, .LEzer .Le9: #ifdef __NDS32_PERF_EXT__ clz $r2, $r4 #else pushm $r0, $r1 pushm $r3, $r5 move $r0, $r4 bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif sub $r5, $r5, $r2 sll $r4, $r4, $r2 .LEres: blez $r5, .LEund .LElab12: #ADD($r4, $0x80) move $r15, #0x80 add $r4, $r4, $r15 slt $r15, $r4, $r15 #ADDC($r5, $0x0) add $r5, $r5, $r15 srli $r9, $r4, #8 andi $r9, $r9, #1 sub $r4, $r4, $r9 slli $r4, $r4, #1 srli $r4, $r4, #9 slli $r9, $r5, #23 or $r4, $r4, $r9 or $r0, $r4, $r8 .LE999: popm $r6, $r9 pop $lp ret5 $lp .LEund: subri $r2, $r5, #1 slti $r15, $r2, #0x20 beqzs8 .LEzer move $r9, #0x80000000 or $r4, $r4, $r9 subri $r9, $r2, #0x20 sll $r5, $r4, $r9 srl $r4, $r4, $r2 beqz $r5, .Li10 ori $r4, $r4, #1 .Li10: move $r5, #0 addi $r9, $r4, #0x80 sltsi $r15, $r9, #0 beqzs8 .LElab12 move $r5, #1 j .LElab12 .LEspecA: bnez $r5, .Li12 add $r4, $r4, $r4 beqz $r4, .Li13 #ifdef __NDS32_PERF_EXT__ clz $r8, $r4 #else pushm $r0, $r5 move $r0, $r4 bal __clzsi2 move $r8, $r0 popm $r0, $r5 #endif sub $r5, $r5, $r8 sll $r4, $r4, $r8 j .LElab1 .Li13: subri $r15, $r7, #0xff beqzs8 .LEspecB move $r9, #0x80000000 bne $r1, $r9, .LEretB .Li12: add $r9, $r4, $r4 bnez $r9, .LEnan subri $r15, $r7, #0xff bnezs8 .LEretA xor $r9, $r0, $r1 sltsi $r15, $r9, #0 bnezs8 .LEnan j .LEretB .LEspecB: bnez $r7, .Li15 add $r6, $r6, $r6 beqz $r6, .LEretA #ifdef __NDS32_PERF_EXT__ clz $r8, $r6 #else pushm $r0, $r5 move $r0, $r6 bal __clzsi2 move $r8, $r0 popm $r0, $r5 #endif sub $r7, $r7, $r8 sll $r6, $r6, $r8 j .LElab2 .Li15: add $r9, $r6, $r6 bnez $r9, .LEnan .LEretB: move $r0, $r1 j .LE999 .LEretA: j .LE999 .LEzer: move $r0, #0 j .LE999 .LEnan: move $r0, #0xffc00000 j .LE999 .size __subsf3, .-__subsf3 .size __addsf3, .-__addsf3 #endif /* L_addsub_sf */ #ifdef L_sf_to_si .text .align 2 .global __fixsfsi .type __fixsfsi, @function __fixsfsi: push $lp slli $r1, $r0, #8 move $r3, #0x80000000 or $r1, $r1, $r3 srli $r3, $r0, #23 andi $r3, $r3, #0xff subri $r2, $r3, #0x9e blez $r2, .LJspec sltsi $r15, $r2, #0x20 bnezs8 .Li42 move $r0, #0 j .LJ999 .Li42: srl $r1, $r1, $r2 sltsi $r15, $r0, #0 beqzs8 .Li43 subri $r1, $r1, #0 .Li43: move $r0, $r1 .LJ999: pop $lp ret5 $lp .LJspec: move $r3, #0x7f800000 slt $r15, $r3, $r0 beqzs8 .Li44 move $r0, #0x80000000 j .LJ999 .Li44: move $r0, #0x7fffffff j .LJ999 .size __fixsfsi, .-__fixsfsi #endif /* L_sf_to_si */ #ifdef L_divsi3 .text .align 2 .globl __divsi3 .type __divsi3, @function __divsi3: ! --------------------------------------------------------------------- ! neg = 0; ! if (a < 0) ! { a = -a; ! neg = !neg; ! } ! --------------------------------------------------------------------- sltsi $r5, $r0, 0 ! $r5 <- neg = (a < 0) ? 1 : 0 subri $r4, $r0, 0 ! $r4 <- a = -a cmovn $r0, $r4, $r5 ! $r0 <- a = neg ? -a : a .L2: ! --------------------------------------------------------------------- ! if (b < 0) ! --------------------------------------------------------------------- bgez $r1, .L3 ! if b >= 0, skip ! --------------------------------------------------------------------- ! { b=-b; ! neg=!neg; ! } ! --------------------------------------------------------------------- subri $r1, $r1, 0 ! $r1 <- b = -b subri $r5, $r5, 1 ! $r5 <- neg = !neg .L3: ! --------------------------------------------------------------------- !!res = udivmodsi4 (a, b, 1); ! res = 0; ! if (den != 0) ! --------------------------------------------------------------------- movi $r2, 0 ! $r2 <- res = 0 beqz $r1, .L1 ! if den == 0, skip ! --------------------------------------------------------------------- ! bit = 1; ! --------------------------------------------------------------------- movi $r4, 1 ! $r4 <- bit = 1 #ifndef __OPTIMIZE_SIZE__ .L6: #endif ! --------------------------------------------------------------------- ! while (den < num && bit && !(den & (1L << 31))) ! --------------------------------------------------------------------- slt $ta, $r1, $r0 ! $ta <- den < num ? beqz $ta, .L5 ! if no, skip ! --------------------------------------------------------------------- ! { den << = 1; ! bit << = 1; ! } ! --------------------------------------------------------------------- #if defined (__OPTIMIZE_SIZE__) && !defined (__NDS32_ISA_V3M__) clz $r3, $r1 ! $r3 <- leading zero count for den clz $ta, $r0 ! $ta <- leading zero count for num sub $r3, $r3, $ta ! $r3 <- number of bits to shift sll $r1, $r1, $r3 ! $r1 <- den sll $r4, $r4, $r3 ! $r2 <- bit #else slli $r1, $r1, 1 ! $r1 <- den << = 1 slli $r4, $r4, 1 ! $r4 <- bit << = 1 b .L6 ! continue loop #endif .L5: ! --------------------------------------------------------------------- ! while (bit) ! { if (num >= den) ! --------------------------------------------------------------------- slt $ta, $r0, $r1 ! $ta <- num < den ? bnez $ta, .L9 ! if yes, skip ! --------------------------------------------------------------------- ! { num -= den; ! res |= bit; ! } ! --------------------------------------------------------------------- sub $r0, $r0, $r1 ! $r0 <- num -= den or $r2, $r2, $r4 ! $r2 <- res |= bit .L9: ! --------------------------------------------------------------------- ! bit >> = 1; ! den >> = 1; ! } !!if (modwanted) !! return num; !!return res; ! --------------------------------------------------------------------- srli $r4, $r4, 1 ! $r4 <- bit >> = 1 srli $r1, $r1, 1 ! $r1 <- den >> = 1 bnez $r4, .L5 ! if bit != 0, continue loop .L1: ! --------------------------------------------------------------------- ! if (neg) ! res = -res; ! return res; ! --------------------------------------------------------------------- subri $r0, $r2, 0 ! $r0 <- -res cmovz $r0, $r2, $r5 ! $r0 <- neg ? -res : res ! --------------------------------------------------------------------- ret .size __divsi3, .-__divsi3 #endif /* L_divsi3 */ #ifdef L_divdi3 !-------------------------------------- #ifdef __big_endian__ #define V1H $r0 #define V1L $r1 #define V2H $r2 #define V2L $r3 #else #define V1H $r1 #define V1L $r0 #define V2H $r3 #define V2L $r2 #endif !-------------------------------------- .text .align 2 .globl __divdi3 .type __divdi3, @function __divdi3: ! prologue #ifdef __NDS32_ISA_V3M__ push25 $r10, 0 #else smw.adm $r6, [$sp], $r10, 2 #endif ! end of prologue move $r8, V1L move $r9, V1H move $r6, V2L move $r7, V2H movi $r10, 0 bgez V1H, .L80 bal __negdi2 move $r8, V1L move $r9, V1H movi $r10, -1 .L80: bgez $r7, .L81 move V1L, $r6 move V1H, $r7 bal __negdi2 move $r6, V1L move $r7, V1H nor $r10, $r10, $r10 .L81: move V2L, $r6 move V2H, $r7 move V1L, $r8 move V1H, $r9 movi $r4, 0 bal __udivmoddi4 beqz $r10, .L82 bal __negdi2 .L82: ! epilogue #ifdef __NDS32_ISA_V3M__ pop25 $r10, 0 #else lmw.bim $r6, [$sp], $r10, 2 ret #endif .size __divdi3, .-__divdi3 #endif /* L_divdi3 */ #ifdef L_modsi3 .text .align 2 .globl __modsi3 .type __modsi3, @function __modsi3: ! --------------------------------------------------------------------- ! neg=0; ! if (a<0) ! { a=-a; ! neg=1; ! } ! --------------------------------------------------------------------- sltsi $r5, $r0, 0 ! $r5 <- neg < 0 ? 1 : 0 subri $r4, $r0, 0 ! $r4 <- -a cmovn $r0, $r4, $r5 ! $r0 <- |a| ! --------------------------------------------------------------------- ! if (b < 0) #ifndef __NDS32_PERF_EXT__ ! --------------------------------------------------------------------- bgez $r1, .L3 ! if b >= 0, skip ! --------------------------------------------------------------------- ! b = -b; ! --------------------------------------------------------------------- subri $r1, $r1, 0 ! $r1 <- |b| .L3: ! --------------------------------------------------------------------- !!res = udivmodsi4 (a, b, 1); ! if (den != 0) ! --------------------------------------------------------------------- #else /* __NDS32_PERF_EXT__ */ ! b = -b; !!res = udivmodsi4 (a, b, 1); ! if (den != 0) ! --------------------------------------------------------------------- abs $r1, $r1 ! $r1 <- |b| #endif /* __NDS32_PERF_EXT__ */ beqz $r1, .L1 ! if den == 0, skip ! --------------------------------------------------------------------- ! { bit = 1; ! res = 0; ! --------------------------------------------------------------------- movi $r4, 1 ! $r4 <- bit = 1 #ifndef __OPTIMIZE_SIZE__ .L6: #endif ! --------------------------------------------------------------------- ! while (den < num&&bit && !(den & (1L << 31))) ! --------------------------------------------------------------------- slt $ta, $r1, $r0 ! $ta <- den < num ? beqz $ta, .L5 ! if no, skip ! --------------------------------------------------------------------- ! { den << = 1; ! bit << = 1; ! } ! --------------------------------------------------------------------- #if defined (__OPTIMIZE_SIZE__) && ! defined (__NDS32_ISA_V3M__) clz $r3, $r1 ! $r3 <- leading zero count for den clz $ta, $r0 ! $ta <- leading zero count for num sub $r3, $r3, $ta ! $r3 <- number of bits to shift sll $r1, $r1, $r3 ! $r1 <- den sll $r4, $r4, $r3 ! $r2 <- bit #else slli $r1, $r1, 1 ! $r1 <- den << = 1 slli $r4, $r4, 1 ! $r4 <- bit << = 1 b .L6 ! continue loop #endif .L5: ! --------------------------------------------------------------------- ! while (bit) ! { if (num >= den) ! { num -= den; ! res |= bit; ! } ! bit >> = 1; ! den >> = 1; ! } ! } !!if (modwanted) !! return num; !!return res; ! --------------------------------------------------------------------- sub $r2, $r0, $r1 ! $r2 <- num - den slt $ta, $r0, $r1 ! $ta <- num < den ? srli $r4, $r4, 1 ! $r4 <- bit >> = 1 cmovz $r0, $r2, $ta ! $r0 <- num = (num < den) ? num : num - den srli $r1, $r1, 1 ! $r1 <- den >> = 1 bnez $r4, .L5 ! if bit != 0, continue loop .L1: ! --------------------------------------------------------------------- ! if (neg) ! res = -res; ! return res; ! --------------------------------------------------------------------- subri $r3, $r0, 0 ! $r3 <- -res cmovn $r0, $r3, $r5 ! $r0 <- neg ? -res : res ! --------------------------------------------------------------------- ret .size __modsi3, .-__modsi3 #endif /* L_modsi3 */ #ifdef L_moddi3 !-------------------------------------- #ifdef __big_endian__ #define V1H $r0 #define V1L $r1 #define V2H $r2 #define V2L $r3 #else #define V1H $r1 #define V1L $r0 #define V2H $r3 #define V2L $r2 #endif !-------------------------------------- .text .align 2 .globl __moddi3 .type __moddi3, @function __moddi3: ! ===================================================================== ! stack allocation: ! sp+32 +-----------------------+ ! | $lp | ! sp+28 +-----------------------+ ! | $r6 - $r10 | ! sp+8 +-----------------------+ ! | | ! sp+4 +-----------------------+ ! | | ! sp +-----------------------+ ! ===================================================================== ! prologue #ifdef __NDS32_ISA_V3M__ push25 $r10, 8 #else smw.adm $r6, [$sp], $r10, 2 addi $sp, $sp, -8 #endif ! end of prologue !------------------------------------------ ! __moddi3 (DWtype u, DWtype v) ! { ! word_type c = 0; ! DWunion uu = {.ll = u}; ! DWunion vv = {.ll = v}; ! DWtype w; ! if (uu.s.high < 0) ! c = ~c, ! uu.ll = -uu.ll; !--------------------------------------------- move $r8, V1L move $r9, V1H move $r6, V2L move $r7, V2H movi $r10, 0 ! r10 = c = 0 bgez V1H, .L80 ! if u > 0 , go L80 bal __negdi2 move $r8, V1L move $r9, V1H movi $r10, -1 ! r10 = c = ~c !------------------------------------------------ ! if (vv.s.high < 0) ! vv.ll = -vv.ll; !---------------------------------------------- .L80: bgez $r7, .L81 ! if v > 0 , go L81 move V1L, $r6 move V1H, $r7 bal __negdi2 move $r6, V1L move $r7, V1H !------------------------------------------ ! (void) __udivmoddi4 (uu.ll, vv.ll, &w); ! if (c) ! w = -w; ! return w; !----------------------------------------- .L81: move V2L, $r6 move V2H, $r7 move V1L, $r8 move V1H, $r9 addi $r4, $sp, 0 bal __udivmoddi4 lwi $r0, [$sp+(0)] ! le: sp + 0 is low, be: sp + 0 is high lwi $r1, [$sp+(4)] ! le: sp + 4 is low, be: sp + 4 is high beqz $r10, .L82 bal __negdi2 .L82: ! epilogue #ifdef __NDS32_ISA_V3M__ pop25 $r10, 8 #else addi $sp, $sp, 8 lmw.bim $r6, [$sp], $r10, 2 ret #endif .size __moddi3, .-__moddi3 #endif /* L_moddi3 */ #ifdef L_mulsi3 .text .align 2 .globl __mulsi3 .type __mulsi3, @function __mulsi3: ! --------------------------------------------------------------------- ! r = 0; ! while (a) ! $r0: r ! $r1: b ! $r2: a ! --------------------------------------------------------------------- beqz $r0, .L7 ! if a == 0, done move $r2, $r0 ! $r2 <- a movi $r0, 0 ! $r0 <- r <- 0 .L8: ! --------------------------------------------------------------------- ! { if (a & 1) ! r += b; ! a >> = 1; ! b << = 1; ! } ! $r0: r ! $r1: b ! $r2: a ! $r3: scratch ! $r4: scratch ! --------------------------------------------------------------------- andi $r3, $r2, 1 ! $r3 <- a & 1 add $r4, $r0, $r1 ! $r4 <- r += b cmovn $r0, $r4, $r3 ! $r0 <- r srli $r2, $r2, 1 ! $r2 <- a >> = 1 slli $r1, $r1, 1 ! $r1 <- b << = 1 bnez $r2, .L8 ! if a != 0, continue loop .L7: ! --------------------------------------------------------------------- ! $r0: return code ! --------------------------------------------------------------------- ret .size __mulsi3, .-__mulsi3 #endif /* L_mulsi3 */ #ifdef L_udivsi3 .text .align 2 .globl __udivsi3 .type __udivsi3, @function __udivsi3: ! --------------------------------------------------------------------- !!res=udivmodsi4(a,b,0); ! res=0; ! if (den!=0) ! --------------------------------------------------------------------- movi $r2, 0 ! $r2 <- res=0 beqz $r1, .L1 ! if den==0, skip ! --------------------------------------------------------------------- ! { bit=1; ! --------------------------------------------------------------------- movi $r4, 1 ! $r4 <- bit=1 #ifndef __OPTIMIZE_SIZE__ .L6: #endif ! --------------------------------------------------------------------- ! while (den=den) ! --------------------------------------------------------------------- slt $ta, $r0, $r1 ! $ta <- num>=1; ! den>>=1; ! } ! } !!if (modwanted) !! return num; !!return res; ! --------------------------------------------------------------------- srli $r4, $r4, 1 ! $r4 <- bit>>=1 srli $r1, $r1, 1 ! $r1 <- den>>=1 bnez $r4, .L5 ! if bit!=0, continue loop .L1: ! --------------------------------------------------------------------- ! return res; ! --------------------------------------------------------------------- move $r0, $r2 ! $r0 <- return value ! --------------------------------------------------------------------- ! --------------------------------------------------------------------- ret .size __udivsi3, .-__udivsi3 #endif /* L_udivsi3 */ #ifdef L_udivdi3 !-------------------------------------- #ifdef __big_endian__ #define V1H $r0 #define V1L $r1 #define V2H $r2 #define V2L $r3 #else #define V1H $r1 #define V1L $r0 #define V2H $r3 #define V2L $r2 #endif !-------------------------------------- .text .align 2 .globl __udivdi3 .type __udivdi3, @function __udivdi3: ! prologue #ifdef __NDS32_ISA_V3M__ push25 $r8, 0 #else smw.adm $r6, [$sp], $r8, 2 #endif ! end of prologue movi $r4, 0 bal __udivmoddi4 ! epilogue #ifdef __NDS32_ISA_V3M__ pop25 $r8, 0 #else lmw.bim $r6, [$sp], $r8, 2 ret #endif .size __udivdi3, .-__udivdi3 #endif /* L_udivdi3 */ #ifdef L_udivmoddi4 .text .align 2 .globl fudiv_qrnnd .type fudiv_qrnnd, @function #ifdef __big_endian__ #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define W6H $r4 #define W6L $r5 #define OFFSET_L 4 #define OFFSET_H 0 #else #define P1H $r1 #define P1L $r0 #define P2H $r3 #define P2L $r2 #define W6H $r5 #define W6L $r4 #define OFFSET_L 0 #define OFFSET_H 4 #endif fudiv_qrnnd: !------------------------------------------------------ ! function: fudiv_qrnnd(quotient, remainder, high_numerator, low_numerator, denominator) ! divides a UDWtype, composed by the UWtype integers,HIGH_NUMERATOR (from $r4) ! and LOW_NUMERATOR(from $r5) by DENOMINATOR(from $r6), and places the quotient ! in $r7 and the remainder in $r8. !------------------------------------------------------ ! in reg:$r4(n1), $r5(n0), $r6(d0) ! __d1 = ((USItype) (d) >> ((4 * 8) / 2)); ! __d0 = ((USItype) (d) & (((USItype) 1 << ((4 * 8) / 2)) - 1)); ! __r1 = (n1) % __d1; ! __q1 = (n1) / __d1; ! __m = (USItype) __q1 * __d0; ! __r1 = __r1 * ((USItype) 1 << ((4 * 8) / 2)) | ((USItype) (n0) >> ((4 * 8) / 2)); ! if (__r1 < __m) ! { !------------------------------------------------------ smw.adm $r0, [$sp], $r4, 2 ! store $lp, when use BASELINE_V1,and must store $r0-$r3 srli $r7, $r6, 16 ! $r7 = d1 =__ll_highpart (d) movi $ta, 65535 and $r8, $r6, $ta ! $r8 = d0 = __ll_lowpart (d) divr $r9, $r10, $r4, $r7 ! $r9 = q1, $r10 = r1 and $r4, $r5, $ta ! $r4 = __ll_lowpart (n0) slli $r10, $r10, 16 ! $r10 = r1 << 16 srli $ta, $r5, 16 ! $ta = __ll_highpart (n0) or $r10, $r10, $ta ! $r10 <- $r0|$r3=__r1 mul $r5, $r9, $r8 ! $r5 = m = __q1*__d0 slt $ta, $r10, $r5 ! $ta <- __r1<__m beqz $ta, .L2 !if yes,skip !------------------------------------------------------ ! __q1--, __r1 += (d); ! if (__r1 >= (d)) ! { !------------------------------------------------------ add $r10, $r10, $r6 !$r10 <- __r1+d=__r1 addi $r9, $r9, -1 !$r9 <- __q1--=__q1 slt $ta, $r10, $r6 !$ta <- __r1= (d)) ! { !------------------------------------------------------ add $r10, $r10, $r6 !$r10 <- __r0+d=__r0 addi $r7, $r7, -1 !$r7 <- __q0--=__q0 slt $ta, $r10, $r6 !$ta <- __r0 n1) ! { !------------------------------------------------------ slt $ta, P1H, P2L !$ta <- n1> ((4 * 8) - bm)); ! n0 = n0 << bm; ! } !------------------------------------------------------ subri $r5, $r7, 32 !$r5 <- 32-bm srl $r5, P1L, $r5 !$r5 <- n0>>$r5 sll $r6, P1H, $r7 !$r6 <- n1< n1) !------------------------------------------------------ move $r4,P1H ! give fudiv_qrnnd args move $r5,P1L ! move $r6,P2L ! bal fudiv_qrnnd !calcaulte q0 n0 movi $r6, 0 !P1L <- 0 swi $r7,[$sp+32] !q0 swi $r6,[$sp+36] !q1 move P1L,$r8 !n0 b .L19 .L10: !------------------------------------------------------ ! else #if (d0 > n1) ! { ! if(d0 == 0) !------------------------------------------------------ bnez P2L, .L20 !if yes,skip !------------------------------------------------------ ! d0 = 1 / d0; !------------------------------------------------------ movi $r4, 1 !P1L <- 1 divr P2L, $r4, $r4, P2L !$r9=1/d0,P1L=1%d0 .L20: #ifndef __NDS32_PERF_EXT__ smw.adm $r0, [$sp], $r5, 0 move $r0, P2L bal __clzsi2 move $r7, $r0 lmw.bim $r0, [$sp], $r5, 0 #else clz $r7, P2L #endif swi $r7,[$sp+(28)] ! store bm beqz $r7, .L28 ! if yes,skip !------------------------------------------------------ ! b = (4 * 8) - bm; ! d0 = d0 << bm; ! n2 = n1 >> b; ! n1 = (n1 << bm) | (n0 >> b); ! n0 = n0 << bm; ! fudiv_qrnnd (&q1, &n1, n2, n1, d0); ! } !------------------------------------------------------ subri $r10, $r7, 32 !$r10 <- 32-bm=b srl $r4, P1L, $r10 !$r4 <- n0>>b sll $r5, P1H, $r7 !$r5 <- n1<>b=n2 !for fun move $r6,P2L !for fun bal fudiv_qrnnd !caculate q1, n1 swi $r7,[$sp+(36)] ! q1 store move P1H,$r8 ! n1 store move $r4,$r8 ! prepare for next fudiv_qrnnd() move $r5,P1L move $r6,P2L b .L29 .L28: !------------------------------------------------------ ! else // bm != 0 ! { ! n1 -= d0; ! q1 = 1; ! !------------------------------------------------------ sub P1H, P1H, P2L !P1L <- n1-d0=n1 movi $ta, 1 ! swi $ta, [$sp+(36)] !1 -> [$sp+(36)] move $r4,P1H ! give fudiv_qrnnd args move $r5,P1L move $r6,P2L .L29: !------------------------------------------------------ ! fudiv_qrnnd (&q0, &n0, n1, n0, d0); !------------------------------------------------------ bal fudiv_qrnnd !calcuate q0, n0 swi $r7,[$sp+(32)] !q0 store move P1L,$r8 !n0 .L19: !------------------------------------------------------ ! if (rp != 0) ! { !------------------------------------------------------ beqz $fp, .L31 !if yes,skip !------------------------------------------------------ ! rr.s.low = n0 >> bm; ! rr.s.high = 0; ! *rp = rr.ll; ! } !------------------------------------------------------ movi $r5, 0 !$r5 <- 0 lwi $r7,[$sp+(28)] !load bm srl $r4, P1L, $r7 !$r4 <- n0>>bm swi $r4, [$fp+OFFSET_L] !r0 !$r4 -> [$sp+(48)] swi $r5, [$fp+OFFSET_H] !r1 !0 -> [$sp+(52)] b .L31 .L9: !------------------------------------------------------ ! else # d1 == 0 ! { ! if(d1 > n1) ! { !------------------------------------------------------ slt $ta, P1H, P2H !$ta <- n1 [$sp+(40)]=q1 swi $r5, [$sp+(36)] !q1 !0 -> [$sp+(32)]=q0 beqz $fp, .L31 !if yes,skip !------------------------------------------------------ ! rr.s.low = n0; ! rr.s.high = n1; ! *rp = rr.ll; ! } !------------------------------------------------------ swi P1L, [$fp+OFFSET_L] !P1L -> [rp] swi P1H, [$fp+OFFSET_H] !P1H -> [rp+4] b .L31 .L32: #ifndef __NDS32_PERF_EXT__ smw.adm $r0, [$sp], $r5, 0 move $r0, P2H bal __clzsi2 move $r7, $r0 lmw.bim $r0, [$sp], $r5, 0 #else clz $r7,P2H #endif swi $r7,[$sp+(28)] !$r7=bm store beqz $r7, .L42 !if yes,skip !------------------------------------------------------ ! USItype m1, m0; ! b = (4 * 8) - bm; ! d1 = (d0 >> b) | (d1 << bm); ! d0 = d0 << bm; ! n2 = n1 >> b; ! n1 = (n0 >> b) | (n1 << bm); ! n0 = n0 << bm; ! fudiv_qrnnd (&q0, &n1, n2, n1, d1); !------------------------------------------------------ subri $r10, $r7, 32 !$r10 <- 32-bm=b srl $r5, P2L, $r10 !$r5 <- d0>>b sll $r6, P2H, $r7 !$r6 <- d1<>b=n2 !!! func srl $r8, P1L, $r10 !$r8 <- n0>>b !!$r8 sll $r9, P1H, $r7 !$r9 <- n1<> ((4 * 8) / 2)); ! __vl = ((USItype) (d0) & (((USItype) 1 << ((4 * 8) / 2)) - 1)); ! __vh = ((USItype) (d0) >> ((4 * 8) / 2)); ! __x0 = (USItype) __ul * __vl; ! __x1 = (USItype) __ul * __vh; ! __x2 = (USItype) __uh * __vl; ! __x3 = (USItype) __uh * __vh; ! __x1 += ((USItype) (__x0) >> ((4 * 8) / 2)); ! __x1 += __x2; ! if (__x1 < __x2) ! __x3 += ((USItype) 1 << ((4 * 8) / 2)); ! (m1) = __x3 + ((USItype) (__x1) >> ((4 * 8) / 2)); ! (m0) = (USItype)(q0*d0); ! } ! if (m1 > n1) !--------------------------------------------------- #ifdef __NDS32_ISA_V3M__ !mulr64 $r4, P2L, $r6 smw.adm $r0, [$sp], $r3, 0 move P1L, P2L move P2L, $r6 movi P1H, 0 movi P2H, 0 bal __muldi3 movd44 $r4, $r0 lmw.bim $r0, [$sp], $r3, 0 move $r8, W6H move $r5, W6L #else mulr64 $r4, P2L, $r6 move $r8, W6H move $r5, W6L #endif slt $ta, P1H, $r8 !$ta <- n1 n0) !------------------------------------------------------ slt $ta, P1L, $r5 !$ta <- n0 (m0)); ! (m0) = __x; ! } ! } !------------------------------------------------------ sub $r4, $r5, P2L !$r4 <- m0-d0=__x addi $r6, $r6, -1 !$r6 <- q0--=q0 sub $r8, $r8, P2H !$r8 <- m1-d1 swi $r6, [$sp+(32)] ! q0 !$r6->[$sp+(32)] slt $ta, $r5, $r4 !$ta <- m0<__x sub $r8, $r8, $ta !$r8 <- P1H-P1L=m1 move $r5, $r4 !$r5 <- __x=m0 .L45: !------------------------------------------------------ ! q1 = 0; ! if (rp != 0) ! { !------------------------------------------------------ movi $r4, 0 !$r4 <- 0 swi $r4, [$sp+(36)] !0 -> [$sp+(40)]=q1 beqz $fp, .L31 !if yes,skip !------------------------------------------------------ ! # sub_ddmmss (n1, n0, n1, n0, m1, m0); ! do ! { USItype __x; ! __x = (n0) - (m0); ! (n1) = (n1) - (m1) - (__x > (n0)); ! (n0) = __x; ! } ! rr.s.low = (n1 << b) | (n0 >> bm); ! rr.s.high = n1 >> bm; ! *rp = rr.ll; !------------------------------------------------------ sub $r4, P1H, $r8 !$r4 <- n1-m1 sub $r6, P1L, $r5 !$r6 <- n0-m0=__x=n0 slt $ta, P1L, $r6 !$ta <- n0<__x sub P1H, $r4, $ta !P1H <- $r4-$ta=n1 move P1L, $r6 lwi $r7,[$sp+(28)] ! load bm subri $r10,$r7,32 sll $r4, P1H, $r10 !$r4 <- n1<>bm or $r6, $r5, $r4 !$r6 <- $r5|$r4=rr.s.low srl $r8, P1H, $r7 !$r8 <- n1>>bm =rr.s.high swi $r6, [$fp+OFFSET_L] ! swi $r8, [$fp+OFFSET_H] ! b .L31 .L42: !------------------------------------------------------ ! else ! { ! if(n1 > d1) !------------------------------------------------------ slt $ta, P2H, P1H !$ta <- P2H= d0) !------------------------------------------------------ slt $ta, P1L, P2L !$ta <- P1L (n0)); ! (n0) = __x; ! } !------------------------------------------------------ .L52: sub $r4, P1H, P2H !$r4 <- P1H-P2H sub $r6, P1L, P2L !$r6 <- no-d0=__x=n0 slt $ta, P1L, $r6 !$ta <- no<__x sub P1H, $r4, $ta !P1H <- $r4-$ta=n1 move P1L, $r6 !n0 movi $r5, 1 ! swi $r5, [$sp+(32)] !1 -> [$sp+(32)]=q0 b .L54 .L51: !------------------------------------------------------ ! q0 = 0; !------------------------------------------------------ movi $r5,0 swi $r5, [$sp+(32)] !$r5=0 -> [$sp+(32)] .L54: !------------------------------------------------------ ! q1 = 0; ! if (rp != 0) ! { !------------------------------------------------------ movi $r5, 0 ! swi $r5, [$sp+(36)] !0 -> [$sp+(36)] beqz $fp, .L31 !------------------------------------------------------ ! rr.s.low = n0; ! rr.s.high = n1; ! *rp = rr.ll; ! } !------------------------------------------------------ swi P1L, [$fp+OFFSET_L] !remainder swi P1H, [$fp+OFFSET_H] ! .L31: !------------------------------------------------------ ! const DWunion ww = {{.low = q0, .high = q1}}; ! return ww.ll; !} !------------------------------------------------------ lwi P1L, [$sp+(32)] !quotient lwi P1H, [$sp+(36)] lmw.bim $r6, [$sp], $r10, 10 addi $sp, $sp, 12 ret .size __udivmoddi4, .-__udivmoddi4 #endif /* L_udivmoddi4 */ #ifdef L_umodsi3 ! ===================================================================== .text .align 2 .globl __umodsi3 .type __umodsi3, @function __umodsi3: ! --------------------------------------------------------------------- !!res=udivmodsi4(a,b,1); ! if (den==0) ! return num; ! --------------------------------------------------------------------- beqz $r1, .L1 ! if den==0, skip ! --------------------------------------------------------------------- ! bit=1; ! res=0; ! --------------------------------------------------------------------- movi $r4, 1 ! $r4 <- bit=1 #ifndef __OPTIMIZE_SIZE__ .L6: #endif ! --------------------------------------------------------------------- ! while (den=den) ! { num-=den; ! res|=bit; ! } ! bit>>=1; ! den>>=1; ! } !!if (modwanted) !! return num; !!return res; ! --------------------------------------------------------------------- sub $r2, $r0, $r1 ! $r2 <- num-den slt $ta, $r0, $r1 ! $ta <- num>=1 cmovz $r0, $r2, $ta ! $r0 <- num=(num>=1 bnez $r4, .L5 ! if bit!=0, continue loop .L1: ! --------------------------------------------------------------------- ! return res; ! --------------------------------------------------------------------- ret .size __umodsi3, .-__umodsi3 #endif /* L_umodsi3 */ #ifdef L_umoddi3 !-------------------------------------- #ifdef __big_endian__ #define V1H $r0 #define V1L $r1 #define V2H $r2 #define V2L $r3 #else #define V1H $r1 #define V1L $r0 #define V2H $r3 #define V2L $r2 #endif !-------------------------------------- .text .align 2 .globl __umoddi3 .type __umoddi3, @function __umoddi3: ! prologue addi $sp, $sp, -12 swi $lp, [$sp+(0)] ! end of prologue addi $r4, $sp, 4 bal __udivmoddi4 lwi $r0, [$sp+(4)] ! __udivmoddi4 return low when LE mode or return high when BE mode lwi $r1, [$sp+(8)] ! .L82: ! epilogue lwi $lp, [$sp+(0)] addi $sp, $sp, 12 ret .size __umoddi3, .-__umoddi3 #endif /* L_umoddi3 */ #ifdef L_muldi3 #ifdef __big_endian__ #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define V2H $r4 #define V2L $r5 #else #define P1H $r1 #define P1L $r0 #define P2H $r3 #define P2L $r2 #define V2H $r5 #define V2L $r4 #endif ! ==================================================================== .text .align 2 .globl __muldi3 .type __muldi3, @function __muldi3: ! parameter passing for libgcc functions normally involves 2 doubles !--------------------------------------- #ifdef __NDS32_ISA_V3M__ ! There is no mulr64 instruction in Andes ISA V3M. ! So we must provide a sequence of calculations to complete the job. smw.adm $r6, [$sp], $r9, 0x0 zeh33 $r4, P1L srli $r7, P1L, 16 zeh33 $r5, P2L mul $r6, $r5, $r4 mul33 $r5, $r7 srli $r8, P2L, 16 mov55 $r9, $r5 maddr32 $r9, $r8, $r4 srli $r4, $r6, 16 add $r4, $r9, $r4 slt45 $r4, $r5 slli $r5, $r15, 16 maddr32 $r5, $r8, $r7 mul P2L, P1H, P2L srli $r7, $r4, 16 maddr32 P2L, P2H, P1L add333 P1H, $r5, $r7 slli $r4, $r4, 16 zeh33 $r6, $r6 add333 P1L, $r4, $r6 add333 P1H, P2L, P1H lmw.bim $r6, [$sp], $r9, 0x0 ret #else /* not __NDS32_ISA_V3M__ */ mul $ta, P1L, P2H mulr64 $r4, P1L, P2L maddr32 $ta, P1H, P2L move P1L, V2L add P1H, $ta, V2H ret #endif /* not __NDS32_ISA_V3M__ */ .size __muldi3, .-__muldi3 #endif /* L_muldi3 */ #ifdef L_addsub_df #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #define P3L $r4 #define P3H $r5 #define O1L $r7 #define O1H $r8 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define P3H $r4 #define P3L $r5 #define O1H $r7 #define O1L $r8 #endif .text .align 2 .global __subdf3 .type __subdf3, @function __subdf3: push $lp pushm $r6, $r10 move $r4, #0x80000000 xor P2H, P2H, $r4 j .Lsdpadd .global __adddf3 .type __adddf3, @function __adddf3: push $lp pushm $r6, $r10 .Lsdpadd: slli $r6, P1H, #1 srli $r6, $r6, #21 slli P3H, P1H, #11 srli $r10, P1L, #21 or P3H, P3H, $r10 slli P3L, P1L, #11 move O1L, #0x80000000 or P3H, P3H, O1L slli $r9, P2H, #1 srli $r9, $r9, #21 slli O1H, P2H, #11 srli $r10, P2L, #21 or O1H, O1H, $r10 or O1H, O1H, O1L slli O1L, P2L, #11 addi $r10, $r6, #-1 slti $r15, $r10, #0x7fe beqzs8 .LEspecA .LElab1: addi $r10, $r9, #-1 slti $r15, $r10, #0x7fe beqzs8 .LEspecB .LElab2: #NORMd($r4, P2L, P1L) bnez P3H, .LL1 bnez P3L, .LL2 move $r6, #0 j .LL3 .LL2: move P3H, P3L move P3L, #0 move P2L, #32 sub $r6, $r6, P2L .LL1: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r2, $r5 #else pushm $r0, $r1 pushm $r3, $r5 move $r0, $r5 bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r3, $r4 #else pushm $r0, $r2 pushm $r4, $r5 move $r0, $r4 bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif #endif /* __big_endian__ */ beqz P2L, .LL3 sub $r6, $r6, P2L subri P1L, P2L, #32 srl P1L, P3L, P1L sll P3L, P3L, P2L sll P3H, P3H, P2L or P3H, P3H, P1L .LL3: #NORMd End #NORMd($r7, P2L, P1L) bnez O1H, .LL4 bnez O1L, .LL5 move $r9, #0 j .LL6 .LL5: move O1H, O1L move O1L, #0 move P2L, #32 sub $r9, $r9, P2L .LL4: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r2, O1H #else pushm $r0, $r1 pushm $r3, $r5 move $r0, O1H bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r3, O1H #else pushm $r0, $r2 pushm $r4, $r5 move $r0, O1H bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif #endif /* __big_endian__ */ beqz P2L, .LL6 sub $r9, $r9, P2L subri P1L, P2L, #32 srl P1L, O1L, P1L sll O1L, O1L, P2L sll O1H, O1H, P2L or O1H, O1H, P1L .LL6: #NORMd End move $r10, #0x80000000 and P1H, P1H, $r10 beq $r6, $r9, .LEadd3 slts $r15, $r9, $r6 beqzs8 .Li1 sub $r9, $r6, $r9 move P2L, #0 .LL7: move $r10, #0x20 slt $r15, $r9, $r10 bnezs8 .LL8 or P2L, P2L, O1L move O1L, O1H move O1H, #0 addi $r9, $r9, #0xffffffe0 bnez O1L, .LL7 .LL8: beqz $r9, .LEadd3 move P1L, O1H move $r10, O1L srl O1L, O1L, $r9 srl O1H, O1H, $r9 subri $r9, $r9, #0x20 sll P1L, P1L, $r9 or O1L, O1L, P1L sll $r10, $r10, $r9 or P2L, P2L, $r10 beqz P2L, .LEadd3 ori O1L, O1L, #1 j .LEadd3 .Li1: move $r15, $r6 move $r6, $r9 sub $r9, $r9, $r15 move P2L, #0 .LL10: move $r10, #0x20 slt $r15, $r9, $r10 bnezs8 .LL11 or P2L, P2L, P3L move P3L, P3H move P3H, #0 addi $r9, $r9, #0xffffffe0 bnez P3L, .LL10 .LL11: beqz $r9, .LEadd3 move P1L, P3H move $r10, P3L srl P3L, P3L, $r9 srl P3H, P3H, $r9 subri $r9, $r9, #0x20 sll P1L, P1L, $r9 or P3L, P3L, P1L sll $r10, $r10, $r9 or P2L, P2L, $r10 beqz P2L, .LEadd3 ori P3L, P3L, #1 .LEadd3: xor $r10, P1H, P2H sltsi $r15, $r10, #0 bnezs8 .LEsub1 #ADD(P3L, O1L) add P3L, P3L, O1L slt $r15, P3L, O1L #ADDCC(P3H, O1H) beqzs8 .LL13 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .LL14 addi P3H, P3H, #0x1 j .LL15 .LL14: move $r15, #1 add P3H, P3H, $r15 slt $r15, P3H, $r15 j .LL15 .LL13: add P3H, P3H, O1H slt $r15, P3H, O1H .LL15: beqzs8 .LEres andi $r10, P3L, #1 beqz $r10, .Li3 ori P3L, P3L, #2 .Li3: srli P3L, P3L, #1 slli $r10, P3H, #31 or P3L, P3L, $r10 srli P3H, P3H, #1 move $r10, #0x80000000 or P3H, P3H, $r10 addi $r6, $r6, #1 subri $r15, $r6, #0x7ff bnezs8 .LEres move $r10, #0x7ff00000 or P1H, P1H, $r10 move P1L, #0 j .LEretA .LEsub1: #SUB(P3L, O1L) move $r15, P3L sub P3L, P3L, O1L slt $r15, $r15, P3L #SUBCC(P3H, O1H) beqzs8 .LL16 move $r15, P3H sub P3H, P3H, O1H slt $r15, $r15, P3H beqzs8 .LL17 subi333 P3H, P3H, #1 j .LL18 .LL17: move $r15, P3H subi333 P3H, P3H, #1 slt $r15, $r15, P3H j .LL18 .LL16: move $r15, P3H sub P3H, P3H, O1H slt $r15, $r15, P3H .LL18: beqzs8 .Li5 move $r10, #0x80000000 xor P1H, P1H, $r10 subri P3H, P3H, #0 beqz P3L, .LL19 subri P3L, P3L, #0 subi45 P3H, #1 .LL19: .Li5: #NORMd($r4, $r9, P1L) bnez P3H, .LL20 bnez P3L, .LL21 move $r6, #0 j .LL22 .LL21: move P3H, P3L move P3L, #0 move $r9, #32 sub $r6, $r6, $r9 .LL20: #ifdef __NDS32_PERF_EXT__ clz $r9, P3H #else pushm $r0, $r5 move $r0, P3H bal __clzsi2 move $r9, $r0 popm $r0, $r5 #endif beqz $r9, .LL22 sub $r6, $r6, $r9 subri P1L, $r9, #32 srl P1L, P3L, P1L sll P3L, P3L, $r9 sll P3H, P3H, $r9 or P3H, P3H, P1L .LL22: #NORMd End or $r10, P3H, P3L bnez $r10, .LEres move P1H, #0 .LEres: blez $r6, .LEund .LElab8: #ADD(P3L, $0x400) move $r15, #0x400 add P3L, P3L, $r15 slt $r15, P3L, $r15 #ADDCC(P3H, $0x0) beqzs8 .LL25 add P3H, P3H, $r15 slt $r15, P3H, $r15 .LL25: #ADDC($r6, $0x0) add $r6, $r6, $r15 srli $r10, P3L, #11 andi $r10, $r10, #1 sub P3L, P3L, $r10 srli P1L, P3L, #11 slli $r10, P3H, #21 or P1L, P1L, $r10 slli $r10, P3H, #1 srli $r10, $r10, #12 or P1H, P1H, $r10 slli $r10, $r6, #20 or P1H, P1H, $r10 .LEretA: .LE999: popm $r6, $r10 pop $lp ret5 $lp .LEspecA: #ADD(P3L, P3L) move $r15, P3L add P3L, P3L, P3L slt $r15, P3L, $r15 #ADDC(P3H, P3H) add P3H, P3H, P3H add P3H, P3H, $r15 bnez $r6, .Li7 or $r10, P3H, P3L beqz $r10, .Li8 j .LElab1 .Li8: subri $r15, $r9, #0x7ff beqzs8 .LEspecB add P3L, P2H, P2H or $r10, P3L, P2L bnez $r10, .LEretB sltsi $r15, P2H, #0 bnezs8 .LEretA .LEretB: move P1L, P2L move P1H, P2H j .LE999 .Li7: or $r10, P3H, P3L bnez $r10, .LEnan subri $r15, $r9, #0x7ff bnezs8 .LEretA xor $r10, P1H, P2H sltsi $r15, $r10, #0 bnezs8 .LEnan j .LEretB .LEspecB: #ADD(O1L, O1L) move $r15, O1L add O1L, O1L, O1L slt $r15, O1L, $r15 #ADDC(O1H, O1H) add O1H, O1H, O1H add O1H, O1H, $r15 bnez $r9, .Li11 or $r10, O1H, O1L beqz $r10, .LEretA j .LElab2 .Li11: or $r10, O1H, O1L beqz $r10, .LEretB .LEnan: move P1H, #0xfff80000 move P1L, #0 j .LEretA .LEund: subri $r9, $r6, #1 move P2L, #0 .LL26: move $r10, #0x20 slt $r15, $r9, $r10 bnezs8 .LL27 or P2L, P2L, P3L move P3L, P3H move P3H, #0 addi $r9, $r9, #0xffffffe0 bnez P3L, .LL26 .LL27: beqz $r9, .LL28 move P1L, P3H move $r10, P3L srl P3L, P3L, $r9 srl P3H, P3H, $r9 subri $r9, $r9, #0x20 sll P1L, P1L, $r9 or P3L, P3L, P1L sll $r10, $r10, $r9 or P2L, P2L, $r10 beqz P2L, .LL28 ori P3L, P3L, #1 .LL28: move $r6, #0 j .LElab8 .size __subdf3, .-__subdf3 .size __adddf3, .-__adddf3 #endif /* L_addsub_df */ #ifdef L_mul_sf #if !defined (__big_endian__) #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #endif .text .align 2 .global __mulsf3 .type __mulsf3, @function __mulsf3: push $lp pushm $r6, $r10 srli $r3, $r0, #23 andi $r3, $r3, #0xff srli $r5, $r1, #23 andi $r5, $r5, #0xff move $r6, #0x80000000 slli $r2, $r0, #8 or $r2, $r2, $r6 slli $r4, $r1, #8 or $r4, $r4, $r6 xor $r8, $r0, $r1 and $r6, $r6, $r8 addi $r8, $r3, #-1 slti $r15, $r8, #0xfe beqzs8 .LFspecA .LFlab1: addi $r8, $r5, #-1 slti $r15, $r8, #0xfe beqzs8 .LFspecB .LFlab2: move $r10, $r3 /* This is a 64-bit multiple. ($r2, $r7) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r2, $r2, $r4 #else pushm $r0, $r1 pushm $r4, $r5 move P1L, $r2 movi P1H, #0 move P2L, $r4 movi P2H, #0 bal __muldi3 movd44 $r2, $r0 popm $r4, $r5 popm $r0, $r1 #endif #ifndef __big_endian__ move $r7, $r2 move $r2, $r3 #else move $r7, $r3 #endif move $r3, $r10 beqz $r7, .Li17 ori $r2, $r2, #1 .Li17: sltsi $r15, $r2, #0 bnezs8 .Li18 slli $r2, $r2, #1 addi $r3, $r3, #-1 .Li18: addi $r8, $r5, #0xffffff82 add $r3, $r3, $r8 addi $r8, $r3, #-1 slti $r15, $r8, #0xfe beqzs8 .LFoveund .LFlab8: #ADD($r2, $0x80) move $r15, #0x80 add $r2, $r2, $r15 slt $r15, $r2, $r15 #ADDC($r3, $0x0) add $r3, $r3, $r15 srli $r8, $r2, #8 andi $r8, $r8, #1 sub $r2, $r2, $r8 slli $r2, $r2, #1 srli $r2, $r2, #9 slli $r8, $r3, #23 or $r2, $r2, $r8 or $r0, $r2, $r6 .LF999: popm $r6, $r10 pop $lp ret5 $lp .LFspecA: bnez $r3, .Li19 add $r2, $r2, $r2 beqz $r2, .Li20 #ifdef __NDS32_PERF_EXT__ clz $r7, $r2 #else pushm $r0, $r5 move $r0, $r2 bal __clzsi2 move $r7, $r0 popm $r0, $r5 #endif sub $r3, $r3, $r7 sll $r2, $r2, $r7 j .LFlab1 .Li20: subri $r15, $r5, #0xff beqzs8 .LFnan j .LFzer .Li19: add $r8, $r2, $r2 bnez $r8, .LFnan bnez $r5, .Li21 add $r8, $r4, $r4 beqz $r8, .LFnan .Li21: subri $r15, $r5, #0xff bnezs8 .LFinf .LFspecB: bnez $r5, .Li22 add $r4, $r4, $r4 beqz $r4, .LFzer #ifdef __NDS32_PERF_EXT__ clz $r7, $r4 #else pushm $r0, $r5 move $r0, $r4 bal __clzsi2 move $r7, $r0 popm $r0, $r5 #endif sub $r5, $r5, $r7 sll $r4, $r4, $r7 j .LFlab2 .LFzer: move $r0, $r6 j .LF999 .Li22: add $r8, $r4, $r4 bnez $r8, .LFnan .LFinf: move $r8, #0x7f800000 or $r0, $r6, $r8 j .LF999 .LFnan: move $r0, #0xffc00000 j .LF999 .LFoveund: bgtz $r3, .LFinf subri $r7, $r3, #1 slti $r15, $r7, #0x20 beqzs8 .LFzer subri $r8, $r7, #0x20 sll $r3, $r2, $r8 srl $r2, $r2, $r7 beqz $r3, .Li25 ori $r2, $r2, #2 .Li25: move $r3, #0 addi $r8, $r2, #0x80 sltsi $r15, $r8, #0 beqzs8 .LFlab8 move $r3, #1 j .LFlab8 .size __mulsf3, .-__mulsf3 #endif /* L_mul_sf */ #ifdef L_mul_df #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #define P3L $r4 #define P3H $r5 #define O1L $r7 #define O1H $r8 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define P3H $r4 #define P3L $r5 #define O1H $r7 #define O1L $r8 #endif .text .align 2 .global __muldf3 .type __muldf3, @function __muldf3: push $lp pushm $r6, $r10 slli $r6, P1H, #1 srli $r6, $r6, #21 slli P3H, P1H, #11 srli $r10, P1L, #21 or P3H, P3H, $r10 slli P3L, P1L, #11 move O1L, #0x80000000 or P3H, P3H, O1L slli $r9, P2H, #1 srli $r9, $r9, #21 slli O1H, P2H, #11 srli $r10, P2L, #21 or O1H, O1H, $r10 or O1H, O1H, O1L xor P1H, P1H, P2H and P1H, P1H, O1L slli O1L, P2L, #11 addi $r10, $r6, #-1 slti $r15, $r10, #0x7fe beqzs8 .LFspecA .LFlab1: addi $r10, $r9, #-1 slti $r15, $r10, #0x7fe beqzs8 .LFspecB .LFlab2: addi $r10, $r9, #0xfffffc02 add $r6, $r6, $r10 move $r10, $r8 /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r9, $r3) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r8, $r5, $r8 #else pushm $r0, $r5 move $r0, $r5 movi $r1, #0 move $r2, $r8 movi $r3, #0 bal __muldi3 movd44 $r8, $r0 popm $r0, $r5 #endif move $r3, $r8 #else /* __big_endian__ */ /* For big endain: ($r9, $r2) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r8, $r4, $r7 #else pushm $r0, $r5 move $r1, $r4 movi $r0, #0 move $r3, $r7 movi $r2, #0 bal __muldi3 movd44 $r8, $r0 popm $r0, $r5 #endif move $r2, $r9 move $r9, $r8 #endif /* __big_endian__ */ move $r8, $r10 move $r10, P1H /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r0, $r2) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r4, $r8 #else pushm $r2, $r5 move $r0, $r4 movi $r1, #0 move $r2, $r8 movi $r3, #0 bal __muldi3 popm $r2, $r5 #endif move $r2, $r0 move $r0, $r1 #else /* __big_endian__ */ /* For big endain: ($r1, $r3) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r5, $r7 #else pushm $r2, $r5 move $r1, $r5 movi $r0, #0 move $r3, $r7 movi $r2, #0 bal __muldi3 popm $r2, $r5 #endif move $r3, $r1 move $r1, $r0 #endif /* __big_endian__ */ move P1H, $r10 #ADD(P2H, P1L) add P2H, P2H, P1L slt $r15, P2H, P1L #ADDC($r9, $0x0) add $r9, $r9, $r15 move $r10, P1H /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r0, $r8) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r5, $r7 #else pushm $r2, $r5 move $r0, $r5 movi $r1, #0 move $r2, $r7 movi $r3, #0 bal __muldi3 popm $r2, $r5 #endif move $r8, $r0 move $r0, $r1 #else /* __big_endian__ */ /* For big endian: ($r1, $r7) is (high, low). */ #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r4, $r8 #else pushm $r2, $r5 move $r1, $r4 movi $r0, #0 move $r3, $r8 movi $r2, #0 bal __muldi3 popm $r2, $r5 #endif move $r7, $r1 move $r1, $r0 #endif /* __big_endian__ */ move P1H, $r10 #ADD(P2L, O1H) add P2L, P2L, O1H slt $r15, P2L, O1H #ADDCC(P2H, P1L) beqzs8 .LL29 add P2H, P2H, P1L slt $r15, P2H, P1L beqzs8 .LL30 addi P2H, P2H, #0x1 j .LL31 .LL30: move $r15, #1 add P2H, P2H, $r15 slt $r15, P2H, $r15 j .LL31 .LL29: add P2H, P2H, P1L slt $r15, P2H, P1L .LL31: #ADDC($r9, $0x0) add $r9, $r9, $r15 /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r8, $r0) is (high, low). */ move $r10, $r9 #ifndef __NDS32_ISA_V3M__ mulr64 $r8, $r4, $r7 #else pushm $r0, $r5 move $r0, $r4 movi $r1, #0 move $r2, $r7 movi $r3, #0 bal __muldi3 movd44 $r8, $r0 popm $r0, $r5 #endif move $r0, $r8 move $r8, $r9 move $r9, $r10 #else /* __big_endian__ */ /* For big endian: ($r7, $r1) is (high, low). */ move $r10, $r6 #ifndef __NDS32_ISA_V3M__ mulr64 $r6, $r5, $r8 #else pushm $r0, $r5 move $r1, $r5 movi $r0, #0 move $r3, $r8 movi $r2, #0 bal __muldi3 movd44 $r6, $r0 popm $r0, $r5 #endif move $r1, $r7 move $r7, $r6 move $r6, $r10 #endif /* __big_endian__ */ #ADD(P2L, O1H) add P2L, P2L, O1H slt $r15, P2L, O1H #ADDCC(P2H, $0x0) beqzs8 .LL34 add P2H, P2H, $r15 slt $r15, P2H, $r15 .LL34: #ADDC($r9, $0x0) add $r9, $r9, $r15 or $r10, P1L, P2L beqz $r10, .Li13 ori P2H, P2H, #1 .Li13: move P3H, $r9 move P3L, P2H sltsi $r15, P3H, #0 bnezs8 .Li14 move $r15, P3L add P3L, P3L, P3L slt $r15, P3L, $r15 add P3H, P3H, P3H add P3H, P3H, $r15 addi $r6, $r6, #-1 .Li14: addi $r10, $r6, #-1 slti $r15, $r10, #0x7fe beqzs8 .LFoveund #ADD(P3L, $0x400) move $r15, #0x400 add P3L, P3L, $r15 slt $r15, P3L, $r15 #ADDCC(P3H, $0x0) beqzs8 .LL37 add P3H, P3H, $r15 slt $r15, P3H, $r15 .LL37: #ADDC($r6, $0x0) add $r6, $r6, $r15 .LFlab8: srli $r10, P3L, #11 andi $r10, $r10, #1 sub P3L, P3L, $r10 srli P1L, P3L, #11 slli $r10, P3H, #21 or P1L, P1L, $r10 slli $r10, P3H, #1 srli $r10, $r10, #12 or P1H, P1H, $r10 slli $r10, $r6, #20 or P1H, P1H, $r10 .LFret: .LF999: popm $r6, $r10 pop $lp ret5 $lp .LFspecA: #ADD(P3L, P3L) move $r15, P3L add P3L, P3L, P3L slt $r15, P3L, $r15 #ADDC(P3H, P3H) add P3H, P3H, P3H add P3H, P3H, $r15 bnez $r6, .Li15 or $r10, P3H, P3L beqz $r10, .Li16 #NORMd($r4, P1L, P2H) bnez P3H, .LL38 bnez P3L, .LL39 move $r6, #0 j .LL40 .LL39: move P3H, P3L move P3L, #0 move P1L, #32 sub $r6, $r6, P1L .LL38: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r0, P3H #else pushm $r1, P3H move $r0, P3H bal __clzsi2 popm $r1, $r5 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r1, $r4 #else push $r0 pushm $r2, $r5 move $r0, $r4 bal __clzsi2 move $r1, $r0 popm $r2, $r5 pop $r0 #endif #endif /* __big_endian__ */ beqz P1L, .LL40 sub $r6, $r6, P1L subri P2H, P1L, #32 srl P2H, P3L, P2H sll P3L, P3L, P1L sll P3H, P3H, P1L or P3H, P3H, P2H .LL40: #NORMd End j .LFlab1 .Li16: subri $r15, $r9, #0x7ff beqzs8 .LFnan j .LFret .Li15: or $r10, P3H, P3L bnez $r10, .LFnan bnez $r9, .Li17 slli $r10, O1H, #1 or $r10, $r10, O1L beqz $r10, .LFnan .Li17: subri $r15, $r9, #0x7ff bnezs8 .LFinf .LFspecB: #ADD(O1L, O1L) move $r15, O1L add O1L, O1L, O1L slt $r15, O1L, $r15 #ADDC(O1H, O1H) add O1H, O1H, O1H add O1H, O1H, $r15 bnez $r9, .Li18 or $r10, O1H, O1L beqz $r10, .Li19 #NORMd($r7, P2L, P1L) bnez O1H, .LL41 bnez O1L, .LL42 move $r9, #0 j .LL43 .LL42: move O1H, O1L move O1L, #0 move P2L, #32 sub $r9, $r9, P2L .LL41: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r2, $r8 #else pushm $r0, $r1 pushm $r3, $r5 move $r0, $r8 bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r3, $r7 #else pushm $r0, $r2 pushm $r4, $r5 move $r0, $r7 bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif #endif /* __big_endian__ */ beqz P2L, .LL43 sub $r9, $r9, P2L subri P1L, P2L, #32 srl P1L, O1L, P1L sll O1L, O1L, P2L sll O1H, O1H, P2L or O1H, O1H, P1L .LL43: #NORMd End j .LFlab2 .Li19: move P1L, #0 j .LFret .Li18: or $r10, O1H, O1L bnez $r10, .LFnan .LFinf: move $r10, #0x7ff00000 or P1H, P1H, $r10 move P1L, #0 j .LFret .LFnan: move P1H, #0xfff80000 move P1L, #0 j .LFret .LFoveund: bgtz $r6, .LFinf subri P1L, $r6, #1 move P2L, #0 .LL44: move $r10, #0x20 slt $r15, P1L, $r10 bnezs8 .LL45 or P2L, P2L, P3L move P3L, P3H move P3H, #0 addi P1L, P1L, #0xffffffe0 bnez P3L, .LL44 .LL45: beqz P1L, .LL46 move P2H, P3H move $r10, P3L srl P3L, P3L, P1L srl P3H, P3H, P1L subri P1L, P1L, #0x20 sll P2H, P2H, P1L or P3L, P3L, P2H sll $r10, $r10, P1L or P2L, P2L, $r10 beqz P2L, .LL46 ori P3L, P3L, #1 .LL46: #ADD(P3L, $0x400) move $r15, #0x400 add P3L, P3L, $r15 slt $r15, P3L, $r15 #ADDC(P3H, $0x0) add P3H, P3H, $r15 srli $r6, P3H, #31 j .LFlab8 .size __muldf3, .-__muldf3 #endif /* L_mul_df */ #ifdef L_div_sf .text .align 2 .global __divsf3 .type __divsf3, @function __divsf3: push $lp pushm $r6, $r10 move $r7, #0x80000000 srli $r4, $r0, #23 andi $r4, $r4, #0xff srli $r6, $r1, #23 andi $r6, $r6, #0xff slli $r3, $r0, #8 or $r3, $r3, $r7 slli $r5, $r1, #8 or $r5, $r5, $r7 xor $r10, $r0, $r1 and $r7, $r7, $r10 addi $r10, $r4, #-1 slti $r15, $r10, #0xfe beqzs8 .LGspecA .LGlab1: addi $r10, $r6, #-1 slti $r15, $r10, #0xfe beqzs8 .LGspecB .LGlab2: slt $r15, $r3, $r5 bnezs8 .Li27 srli $r3, $r3, #1 addi $r4, $r4, #1 .Li27: srli $r8, $r5, #14 divr $r0, $r2, $r3, $r8 andi $r9, $r5, #0x3fff mul $r1, $r9, $r0 slli $r2, $r2, #14 #SUB($r2, $r1) move $r15, $r2 sub $r2, $r2, $r1 slt $r15, $r15, $r2 beqzs8 .Li28 addi $r0, $r0, #-1 #ADD($r2, $r5) add $r2, $r2, $r5 slt $r15, $r2, $r5 .Li28: divr $r3, $r2, $r2, $r8 mul $r1, $r9, $r3 slli $r2, $r2, #14 #SUB($r2, $r1) move $r15, $r2 sub $r2, $r2, $r1 slt $r15, $r15, $r2 beqzs8 .Li29 addi $r3, $r3, #-1 #ADD($r2, $r5) add $r2, $r2, $r5 slt $r15, $r2, $r5 .Li29: slli $r10, $r0, #14 add $r3, $r3, $r10 slli $r3, $r3, #4 beqz $r2, .Li30 ori $r3, $r3, #1 .Li30: subri $r10, $r6, #0x7e add $r4, $r4, $r10 addi $r10, $r4, #-1 slti $r15, $r10, #0xfe beqzs8 .LGoveund .LGlab8: #ADD($r3, $0x80) move $r15, #0x80 add $r3, $r3, $r15 slt $r15, $r3, $r15 #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r10, $r3, #8 andi $r10, $r10, #1 sub $r3, $r3, $r10 slli $r3, $r3, #1 srli $r3, $r3, #9 slli $r10, $r4, #23 or $r3, $r3, $r10 or $r0, $r3, $r7 .LG999: popm $r6, $r10 pop $lp ret5 $lp .LGspecA: bnez $r4, .Li31 add $r3, $r3, $r3 beqz $r3, .Li31 #ifdef __NDS32_PERF_EXT__ clz $r8, $r3 #else pushm $r0, $r5 move $r0, $r3 bal __clzsi2 move $r8, $r0 popm $r0, $r5 #endif sub $r4, $r4, $r8 sll $r3, $r3, $r8 j .LGlab1 .Li31: bne $r6, $r4, .Li33 add $r10, $r5, $r5 beqz $r10, .LGnan .Li33: subri $r15, $r6, #0xff beqzs8 .LGspecB beqz $r4, .LGzer add $r10, $r3, $r3 bnez $r10, .LGnan j .LGinf .LGspecB: bnez $r6, .Li34 add $r5, $r5, $r5 beqz $r5, .LGinf #ifdef __NDS32_PERF_EXT__ clz $r8, $r5 #else pushm $r0, $r5 move $r0, $r5 bal __clzsi2 move $r8, $r0 popm $r0, $r5 #endif sub $r6, $r6, $r8 sll $r5, $r5, $r8 j .LGlab2 .Li34: add $r10, $r5, $r5 bnez $r10, .LGnan .LGzer: move $r0, $r7 j .LG999 .LGoveund: bgtz $r4, .LGinf subri $r8, $r4, #1 slti $r15, $r8, #0x20 beqzs8 .LGzer subri $r10, $r8, #0x20 sll $r4, $r3, $r10 srl $r3, $r3, $r8 beqz $r4, .Li37 ori $r3, $r3, #2 .Li37: move $r4, #0 addi $r10, $r3, #0x80 sltsi $r15, $r10, #0 beqzs8 .LGlab8 move $r4, #1 j .LGlab8 .LGinf: move $r10, #0x7f800000 or $r0, $r7, $r10 j .LG999 .LGnan: move $r0, #0xffc00000 j .LG999 .size __divsf3, .-__divsf3 #endif /* L_div_sf */ #ifdef L_div_df #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #define P3L $r4 #define P3H $r5 #define O1L $r7 #define O1H $r8 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define P3H $r4 #define P3L $r5 #define O1H $r7 #define O1L $r8 #endif .text .align 2 .global __divdf3 .type __divdf3, @function __divdf3: push $lp pushm $r6, $r10 slli $r6, P1H, #1 srli $r6, $r6, #21 slli P3H, P1H, #11 srli $r10, P1L, #21 or P3H, P3H, $r10 slli P3L, P1L, #11 move O1L, #0x80000000 or P3H, P3H, O1L slli $r9, P2H, #1 srli $r9, $r9, #21 slli O1H, P2H, #11 srli $r10, P2L, #21 or O1H, O1H, $r10 or O1H, O1H, O1L xor P1H, P1H, P2H and P1H, P1H, O1L slli O1L, P2L, #11 addi $r10, $r6, #-1 slti $r15, $r10, #0x7fe beqzs8 .LGspecA .LGlab1: addi $r10, $r9, #-1 slti $r15, $r10, #0x7fe beqzs8 .LGspecB .LGlab2: sub $r6, $r6, $r9 addi $r6, $r6, #0x3ff srli P3L, P3L, #1 slli $r10, P3H, #31 or P3L, P3L, $r10 srli P3H, P3H, #1 srli $r9, O1H, #16 divr P2H, P3H, P3H, $r9 move $r10, #0xffff and P2L, O1H, $r10 mul P1L, P2L, P2H slli P3H, P3H, #16 srli $r10, P3L, #16 or P3H, P3H, $r10 #SUB(P3H, P1L) move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .Li20 .Lb21: addi P2H, P2H, #-1 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .Lb21 .Li20: divr $r9, P3H, P3H, $r9 mul P1L, P2L, $r9 slli P3H, P3H, #16 move $r15, #0xffff and $r10, P3L, $r15 or P3H, P3H, $r10 #SUB(P3H, P1L) move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .Li22 .Lb23: addi $r9, $r9, #-1 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .Lb23 .Li22: slli P2H, P2H, #16 add P2H, P2H, $r9 /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r0, $r9) is (high, low). */ move $r10, $r1 #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r3, $r7 #else pushm $r2, $r5 move $r0, $r3 movi $r1, #0 move $r2, $r7 movi $r3, #0 bal __muldi3 popm $r2, $r5 #endif move $r9, $r0 move $r0, $r1 move $r1, $r10 #else /* __big_endian__ */ /* For big endian: ($r1, $r9) is (high, low). */ move $r10, $r0 #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r2, $r8 #else pushm $r2, $r5 move $r1, $r2 movi $r0, #0 move $r3, $r8 movi $r2, #0 bal __muldi3 popm $r2, $r5 #endif move $r9, $r1 move $r1, $r0 move $r0, $r10 #endif /* __big_endian__ */ move P3L, #0 #SUB(P3L, $r9) move $r15, P3L sub P3L, P3L, $r9 slt $r15, $r15, P3L #SUBCC(P3H, P1L) beqzs8 .LL47 move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .LL48 subi333 P3H, P3H, #1 j .LL49 .LL48: move $r15, P3H subi333 P3H, P3H, #1 slt $r15, $r15, P3H j .LL49 .LL47: move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H .LL49: beqzs8 .Li24 .LGlab3: addi P2H, P2H, #-1 #ADD(P3L, O1L) add P3L, P3L, O1L slt $r15, P3L, O1L #ADDCC(P3H, O1H) beqzs8 .LL50 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .LL51 addi P3H, P3H, #0x1 j .LL52 .LL51: move $r15, #1 add P3H, P3H, $r15 slt $r15, P3H, $r15 j .LL52 .LL50: add P3H, P3H, O1H slt $r15, P3H, O1H .LL52: beqzs8 .LGlab3 .Li24: bne P3H, O1H, .Li25 move P1L, O1L move P3H, P3L move $r9, #0 move P2L, $r9 j .Le25 .Li25: srli P2L, O1H, #16 divr $r9, P3H, P3H, P2L move $r10, #0xffff and $r10, O1H, $r10 mul P1L, $r10, $r9 slli P3H, P3H, #16 srli $r15, P3L, #16 or P3H, P3H, $r15 #SUB(P3H, P1L) move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .Li26 .Lb27: addi $r9, $r9, #-1 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .Lb27 .Li26: divr P2L, P3H, P3H, P2L mul P1L, $r10, P2L slli P3H, P3H, #16 move $r10, #0xffff and $r10, P3L, $r10 or P3H, P3H, $r10 #SUB(P3H, P1L) move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .Li28 .Lb29: addi P2L, P2L, #-1 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .Lb29 .Li28: slli $r9, $r9, #16 add $r9, $r9, P2L /* This is a 64-bit multiple. */ #ifndef __big_endian__ /* For little endian: ($r0, $r2) is (high, low). */ move $r10, $r1 #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r9, $r7 #else pushm $r2, $r5 move $r0, $r9 movi $r1, #0 move $r2, $r7 movi $r3, #0 bal __muldi3 popm $r2, $r5 #endif move $r2, $r0 move $r0, $r1 move $r1, $r10 #else /* __big_endian__ */ /* For big endian: ($r1, $r3) is (high, low). */ move $r10, $r0 #ifndef __NDS32_ISA_V3M__ mulr64 $r0, $r9, $r8 #else pushm $r2, $r5 move $r0, $r9 movi $r1, #0 move $r2, $r7 movi $r3, #0 bal __muldi3 popm $r2, $r5 #endif move $r3, $r1 move $r1, $r0 move $r0, $r10 #endif /* __big_endian__ */ .Le25: move P3L, #0 #SUB(P3L, P2L) move $r15, P3L sub P3L, P3L, P2L slt $r15, $r15, P3L #SUBCC(P3H, P1L) beqzs8 .LL53 move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H beqzs8 .LL54 subi333 P3H, P3H, #1 j .LL55 .LL54: move $r15, P3H subi333 P3H, P3H, #1 slt $r15, $r15, P3H j .LL55 .LL53: move $r15, P3H sub P3H, P3H, P1L slt $r15, $r15, P3H .LL55: beqzs8 .Li30 .LGlab4: addi $r9, $r9, #-1 #ADD(P3L, O1L) add P3L, P3L, O1L slt $r15, P3L, O1L #ADDCC(P3H, O1H) beqzs8 .LL56 add P3H, P3H, O1H slt $r15, P3H, O1H beqzs8 .LL57 addi P3H, P3H, #0x1 j .LL58 .LL57: move $r15, #1 add P3H, P3H, $r15 slt $r15, P3H, $r15 j .LL58 .LL56: add P3H, P3H, O1H slt $r15, P3H, O1H .LL58: beqzs8 .LGlab4 .Li30: sltsi $r15, P2H, #0 bnezs8 .Li31 #ADD($r9, $r9) move $r15, $r9 add $r9, $r9, $r9 slt $r15, $r9, $r15 #ADDC(P2H, P2H) add P2H, P2H, P2H add P2H, P2H, $r15 addi $r6, $r6, #-1 .Li31: or $r10, P3H, P3L beqz $r10, .Li32 ori $r9, $r9, #1 .Li32: move P3H, P2H move P3L, $r9 addi $r10, $r6, #-1 slti $r15, $r10, #0x7fe beqzs8 .LGoveund #ADD(P3L, $0x400) move $r15, #0x400 add P3L, P3L, $r15 slt $r15, P3L, $r15 #ADDCC(P3H, $0x0) beqzs8 .LL61 add P3H, P3H, $r15 slt $r15, P3H, $r15 .LL61: #ADDC($r6, $0x0) add $r6, $r6, $r15 .LGlab8: srli $r10, P3L, #11 andi $r10, $r10, #1 sub P3L, P3L, $r10 srli P1L, P3L, #11 slli $r10, P3H, #21 or P1L, P1L, $r10 slli $r10, P3H, #1 srli $r10, $r10, #12 or P1H, P1H, $r10 slli $r10, $r6, #20 or P1H, P1H, $r10 .LGret: .LG999: popm $r6, $r10 pop $lp ret5 $lp .LGoveund: bgtz $r6, .LGinf subri P2H, $r6, #1 move P1L, #0 .LL62: move $r10, #0x20 slt $r15, P2H, $r10 bnezs8 .LL63 or P1L, P1L, P3L move P3L, P3H move P3H, #0 addi P2H, P2H, #0xffffffe0 bnez P3L, .LL62 .LL63: beqz P2H, .LL64 move P2L, P3H move $r10, P3L srl P3L, P3L, P2H srl P3H, P3H, P2H subri P2H, P2H, #0x20 sll P2L, P2L, P2H or P3L, P3L, P2L sll $r10, $r10, P2H or P1L, P1L, $r10 beqz P1L, .LL64 ori P3L, P3L, #1 .LL64: #ADD(P3L, $0x400) move $r15, #0x400 add P3L, P3L, $r15 slt $r15, P3L, $r15 #ADDC(P3H, $0x0) add P3H, P3H, $r15 srli $r6, P3H, #31 j .LGlab8 .LGspecA: #ADD(P3L, P3L) move $r15, P3L add P3L, P3L, P3L slt $r15, P3L, $r15 #ADDC(P3H, P3H) add P3H, P3H, P3H add P3H, P3H, $r15 bnez $r6, .Li33 or $r10, P3H, P3L beqz $r10, .Li33 #NORMd($r4, P2H, P2L) bnez P3H, .LL65 bnez P3L, .LL66 move $r6, #0 j .LL67 .LL66: move P3H, P3L move P3L, #0 move P2H, #32 sub $r6, $r6, P2H .LL65: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r3, $r5 #else pushm $r0, $r2 pushm $r4, $r5 move $r0, $r5 bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r2, $r4 #else pushm $r0, $r1 pushm $r3, $r5 move $r0, $r4 bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif #endif /* __big_endian_ */ beqz P2H, .LL67 sub $r6, $r6, P2H subri P2L, P2H, #32 srl P2L, P3L, P2L sll P3L, P3L, P2H sll P3H, P3H, P2H or P3H, P3H, P2L .LL67: #NORMd End j .LGlab1 .Li33: bne $r6, $r9, .Li35 slli $r10, O1H, #1 or $r10, $r10, O1L beqz $r10, .LGnan .Li35: subri $r15, $r9, #0x7ff beqzs8 .LGspecB beqz $r6, .LGret or $r10, P3H, P3L bnez $r10, .LGnan .LGinf: move $r10, #0x7ff00000 or P1H, P1H, $r10 move P1L, #0 j .LGret .LGspecB: #ADD(O1L, O1L) move $r15, O1L add O1L, O1L, O1L slt $r15, O1L, $r15 #ADDC(O1H, O1H) add O1H, O1H, O1H add O1H, O1H, $r15 bnez $r9, .Li36 or $r10, O1H, O1L beqz $r10, .LGinf #NORMd($r7, P2H, P2L) bnez O1H, .LL68 bnez O1L, .LL69 move $r9, #0 j .LL70 .LL69: move O1H, O1L move O1L, #0 move P2H, #32 sub $r9, $r9, P2H .LL68: #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r3, $r8 #else pushm $r0, $r2 pushm $r4, $r5 move $r0, $r8 bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r2, $r7 #else pushm $r0, $r1 pushm $r3, $r5 move $r0, $r7 bal __clzsi2 move $r2, $r0 popm $r3, $r5 popm $r0, $r1 #endif #endif /* __big_endian__ */ beqz P2H, .LL70 sub $r9, $r9, P2H subri P2L, P2H, #32 srl P2L, O1L, P2L sll O1L, O1L, P2H sll O1H, O1H, P2H or O1H, O1H, P2L .LL70: #NORMd End j .LGlab2 .Li36: or $r10, O1H, O1L beqz $r10, .Li38 .LGnan: move P1H, #0xfff80000 .Li38: move P1L, #0 j .LGret .size __divdf3, .-__divdf3 #endif /* L_div_df */ #ifdef L_negate_sf .text .align 2 .global __negsf2 .type __negsf2, @function __negsf2: push $lp move $r1, #0x80000000 xor $r0, $r0, $r1 .LN999: pop $lp ret5 $lp .size __negsf2, .-__negsf2 #endif /* L_negate_sf */ #ifdef L_negate_df #ifndef __big_endian__ #define P1H $r1 #else #define P1H $r0 #endif .text .align 2 .global __negdf2 .type __negdf2, @function __negdf2: push $lp move $r2, #0x80000000 xor P1H, P1H, $r2 .LP999: pop $lp ret5 $lp .size __negdf2, .-__negdf2 #endif /* L_negate_df */ #ifdef L_sf_to_df #ifndef __big_endian__ #define O1L $r1 #define O1H $r2 #else #define O1H $r1 #define O1L $r2 #endif .text .align 2 .global __extendsfdf2 .type __extendsfdf2, @function __extendsfdf2: push $lp srli $r3, $r0, #23 andi $r3, $r3, #0xff move $r5, #0x80000000 and O1H, $r0, $r5 addi $r5, $r3, #-1 slti $r15, $r5, #0xfe beqzs8 .LJspec .LJlab1: addi $r3, $r3, #0x380 slli $r5, $r0, #9 srli $r5, $r5, #12 or O1H, O1H, $r5 slli O1L, $r0, #29 .LJret: slli $r5, $r3, #20 or O1H, O1H, $r5 move $r0, $r1 move $r1, $r2 .LJ999: pop $lp ret5 $lp .LJspec: move O1L, #0 add $r0, $r0, $r0 beqz $r0, .LJret bnez $r3, .Li42 .Lb43: addi $r3, $r3, #-1 add $r0, $r0, $r0 move $r5, #0x800000 slt $r15, $r0, $r5 bnezs8 .Lb43 j .LJlab1 .Li42: move $r3, #0x7ff move $r5, #0xff000000 slt $r15, $r5, $r0 beqzs8 .LJret move O1H, #0xfff80000 j .LJret .size __extendsfdf2, .-__extendsfdf2 #endif /* L_sf_to_df */ #ifdef L_df_to_sf #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #endif .text .align 2 .global __truncdfsf2 .type __truncdfsf2, @function __truncdfsf2: push $lp pushm $r6, $r8 slli P2H, P1H, #11 srli $r7, P1L, #21 or P2H, P2H, $r7 slli P2L, P1L, #11 move $r7, #0x80000000 or P2H, P2H, $r7 and $r5, P1H, $r7 slli $r4, P1H, #1 srli $r4, $r4, #21 addi $r4, $r4, #0xfffffc80 addi $r7, $r4, #-1 slti $r15, $r7, #0xfe beqzs8 .LKspec .LKlab1: beqz P2L, .Li45 ori P2H, P2H, #1 .Li45: #ADD(P2H, $0x80) move $r15, #0x80 add P2H, P2H, $r15 slt $r15, P2H, $r15 #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r7, P2H, #8 andi $r7, $r7, #1 sub P2H, P2H, $r7 slli P2H, P2H, #1 srli P2H, P2H, #9 slli $r7, $r4, #23 or P2H, P2H, $r7 or $r0, P2H, $r5 .LK999: popm $r6, $r8 pop $lp ret5 $lp .LKspec: subri $r15, $r4, #0x47f bnezs8 .Li46 slli $r7, P2H, #1 or $r7, $r7, P2L beqz $r7, .Li46 move $r0, #0xffc00000 j .LK999 .Li46: sltsi $r15, $r4, #0xff bnezs8 .Li48 move $r7, #0x7f800000 or $r0, $r5, $r7 j .LK999 .Li48: subri $r6, $r4, #1 move $r7, #0x20 slt $r15, $r6, $r7 bnezs8 .Li49 move $r0, $r5 j .LK999 .Li49: subri $r8, $r6, #0x20 sll $r7, P2H, $r8 or P2L, P2L, $r7 srl P2H, P2H, $r6 move $r4, #0 move $r7, #0x80000000 or P2H, P2H, $r7 j .LKlab1 .size __truncdfsf2, .-__truncdfsf2 #endif /* L_df_to_sf */ #ifdef L_df_to_si #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #else #define P1H $r0 #define P1L $r1 #endif .global __fixdfsi .type __fixdfsi, @function __fixdfsi: push $lp pushm $r6, $r6 slli $r3, P1H, #11 srli $r6, P1L, #21 or $r3, $r3, $r6 move $r6, #0x80000000 or $r3, $r3, $r6 slli $r6, P1H, #1 srli $r6, $r6, #21 subri $r2, $r6, #0x41e blez $r2, .LLnaninf move $r6, #0x20 slt $r15, $r2, $r6 bnezs8 .LL72 move $r3, #0 .LL72: srl $r3, $r3, $r2 sltsi $r15, P1H, #0 beqzs8 .Li50 subri $r3, $r3, #0 .Li50: move $r0, $r3 .LL999: popm $r6, $r6 pop $lp ret5 $lp .LLnaninf: beqz P1L, .Li51 ori P1H, P1H, #1 .Li51: move $r6, #0x7ff00000 slt $r15, $r6, P1H beqzs8 .Li52 move $r0, #0x80000000 j .LL999 .Li52: move $r0, #0x7fffffff j .LL999 .size __fixdfsi, .-__fixdfsi #endif /* L_df_to_si */ #ifdef L_fixsfdi #ifndef __big_endian__ #define O1L $r1 #define O1H $r2 #else #define O1H $r1 #define O1L $r2 #endif .text .align 2 .global __fixsfdi .type __fixsfdi, @function __fixsfdi: push $lp srli $r3, $r0, #23 andi $r3, $r3, #0xff slli O1H, $r0, #8 move $r5, #0x80000000 or O1H, O1H, $r5 move O1L, #0 sltsi $r15, $r3, #0xbe beqzs8 .LCinfnan subri $r3, $r3, #0xbe .LL8: move $r5, #0x20 slt $r15, $r3, $r5 bnezs8 .LL9 move O1L, O1H move O1H, #0 addi $r3, $r3, #0xffffffe0 bnez O1L, .LL8 .LL9: beqz $r3, .LL10 move $r4, O1H srl O1L, O1L, $r3 srl O1H, O1H, $r3 subri $r3, $r3, #0x20 sll $r4, $r4, $r3 or O1L, O1L, $r4 .LL10: sltsi $r15, $r0, #0 beqzs8 .LCret subri O1H, O1H, #0 beqz O1L, .LL11 subri O1L, O1L, #0 subi45 O1H, #1 .LL11: .LCret: move $r0, $r1 move $r1, $r2 .LC999: pop $lp ret5 $lp .LCinfnan: sltsi $r15, $r0, #0 bnezs8 .LCret3 subri $r15, $r3, #0xff bnezs8 .Li7 slli $r5, O1H, #1 beqz $r5, .Li7 .LCret3: move O1H, #0x80000000 j .LCret .Li7: move O1H, #0x7fffffff move O1L, #-1 j .LCret .size __fixsfdi, .-__fixsfdi #endif /* L_fixsfdi */ #ifdef L_fixdfdi #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define O1L $r3 #define O1H $r4 #else #define P1H $r0 #define P1L $r1 #define O1H $r3 #define O1L $r4 #endif .text .align 2 .global __fixdfdi .type __fixdfdi, @function __fixdfdi: push $lp pushm $r6, $r6 slli $r5, P1H, #1 srli $r5, $r5, #21 slli O1H, P1H, #11 srli $r6, P1L, #21 or O1H, O1H, $r6 slli O1L, P1L, #11 move $r6, #0x80000000 or O1H, O1H, $r6 slti $r15, $r5, #0x43e beqzs8 .LCnaninf subri $r2, $r5, #0x43e .LL14: move $r6, #0x20 slt $r15, $r2, $r6 bnezs8 .LL15 move O1L, O1H move O1H, #0 addi $r2, $r2, #0xffffffe0 bnez O1L, .LL14 .LL15: beqz $r2, .LL16 move P1L, O1H srl O1L, O1L, $r2 srl O1H, O1H, $r2 subri $r2, $r2, #0x20 sll P1L, P1L, $r2 or O1L, O1L, P1L .LL16: sltsi $r15, P1H, #0 beqzs8 .LCret subri O1H, O1H, #0 beqz O1L, .LL17 subri O1L, O1L, #0 subi45 O1H, #1 .LL17: .LCret: move P1L, O1L move P1H, O1H .LC999: popm $r6, $r6 pop $lp ret5 $lp .LCnaninf: sltsi $r15, P1H, #0 bnezs8 .LCret3 subri $r15, $r5, #0x7ff bnezs8 .Li5 slli $r6, O1H, #1 or $r6, $r6, O1L beqz $r6, .Li5 .LCret3: move O1H, #0x80000000 move O1L, #0 j .LCret .Li5: move O1H, #0x7fffffff move O1L, #-1 j .LCret .size __fixdfdi, .-__fixdfdi #endif /* L_fixdfdi */ #ifdef L_fixunssfsi .global __fixunssfsi .type __fixunssfsi, @function __fixunssfsi: push $lp slli $r1, $r0, #8 move $r3, #0x80000000 or $r1, $r1, $r3 srli $r3, $r0, #23 andi $r3, $r3, #0xff subri $r2, $r3, #0x9e sltsi $r15, $r2, #0 bnezs8 .LLspec sltsi $r15, $r2, #0x20 bnezs8 .Li45 move $r0, #0 j .LL999 .Li45: srl $r1, $r1, $r2 sltsi $r15, $r0, #0 beqzs8 .Li46 subri $r1, $r1, #0 .Li46: move $r0, $r1 .LL999: pop $lp ret5 $lp .LLspec: move $r3, #0x7f800000 slt $r15, $r3, $r0 beqzs8 .Li47 move $r0, #0x80000000 j .LL999 .Li47: move $r0, #-1 j .LL999 .size __fixunssfsi, .-__fixunssfsi #endif /* L_fixunssfsi */ #ifdef L_fixunsdfsi #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #else #define P1H $r0 #define P1L $r1 #endif .text .align 2 .global __fixunsdfsi .type __fixunsdfsi, @function __fixunsdfsi: push $lp pushm $r6, $r6 slli $r3, P1H, #11 srli $r6, P1L, #21 or $r3, $r3, $r6 move $r6, #0x80000000 or $r3, $r3, $r6 slli $r6, P1H, #1 srli $r6, $r6, #21 subri $r2, $r6, #0x41e sltsi $r15, $r2, #0 bnezs8 .LNnaninf move $r6, #0x20 slt $r15, $r2, $r6 bnezs8 .LL73 move $r3, #0 .LL73: srl $r3, $r3, $r2 sltsi $r15, P1H, #0 beqzs8 .Li53 subri $r3, $r3, #0 .Li53: move $r0, $r3 .LN999: popm $r6, $r6 pop $lp ret5 $lp .LNnaninf: beqz P1L, .Li54 ori P1H, P1H, #1 .Li54: move $r6, #0x7ff00000 slt $r15, $r6, P1H beqzs8 .Li55 move $r0, #0x80000000 j .LN999 .Li55: move $r0, #-1 j .LN999 .size __fixunsdfsi, .-__fixunsdfsi #endif /* L_fixunsdfsi */ #ifdef L_fixunssfdi #ifndef __big_endian__ #define O1L $r1 #define O1H $r2 #else #define O1H $r1 #define O1L $r2 #endif .text .align 2 .global __fixunssfdi .type __fixunssfdi, @function __fixunssfdi: push $lp srli $r3, $r0, #23 andi $r3, $r3, #0xff slli O1H, $r0, #8 move $r5, #0x80000000 or O1H, O1H, $r5 move O1L, #0 sltsi $r15, $r3, #0xbe beqzs8 .LDinfnan subri $r3, $r3, #0xbe .LL12: move $r5, #0x20 slt $r15, $r3, $r5 bnezs8 .LL13 move O1L, O1H move O1H, #0 addi $r3, $r3, #0xffffffe0 bnez O1L, .LL12 .LL13: beqz $r3, .LL14 move $r4, O1H srl O1L, O1L, $r3 srl O1H, O1H, $r3 subri $r3, $r3, #0x20 sll $r4, $r4, $r3 or O1L, O1L, $r4 .LL14: sltsi $r15, $r0, #0 beqzs8 .LDret subri O1H, O1H, #0 beqz O1L, .LL15 subri O1L, O1L, #0 subi45 O1H, #1 .LL15: .LDret: move $r0, $r1 move $r1, $r2 .LD999: pop $lp ret5 $lp .LDinfnan: move O1H, #0x80000000 move O1L, #0 j .LDret .size __fixunssfdi, .-__fixunssfdi #endif /* L_fixunssfdi */ #ifdef L_fixunsdfdi #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define O1L $r3 #define O1H $r4 #else #define P1H $r0 #define P1L $r1 #define O1H $r3 #define O1L $r4 #endif .text .align 2 .global __fixunsdfdi .type __fixunsdfdi, @function __fixunsdfdi: push $lp pushm $r6, $r6 slli $r5, P1H, #1 srli $r5, $r5, #21 slli O1H, P1H, #11 srli $r6, P1L, #21 or O1H, O1H, $r6 slli O1L, P1L, #11 move $r6, #0x80000000 or O1H, O1H, $r6 slti $r15, $r5, #0x43e beqzs8 .LDnaninf subri $r2, $r5, #0x43e .LL18: move $r6, #0x20 slt $r15, $r2, $r6 bnezs8 .LL19 move O1L, O1H move O1H, #0 addi $r2, $r2, #0xffffffe0 bnez O1L, .LL18 .LL19: beqz $r2, .LL20 move P1L, O1H srl O1L, O1L, $r2 srl O1H, O1H, $r2 subri $r2, $r2, #0x20 sll P1L, P1L, $r2 or O1L, O1L, P1L .LL20: sltsi $r15, P1H, #0 beqzs8 .LDret subri O1H, O1H, #0 beqz O1L, .LL21 subri O1L, O1L, #0 subi45 O1H, #1 .LL21: .LDret: move P1L, O1L move P1H, O1H .LD999: popm $r6, $r6 pop $lp ret5 $lp .LDnaninf: move O1H, #0x80000000 move O1L, #0 j .LDret .size __fixunsdfdi, .-__fixunsdfdi #endif /* L_fixunsdfdi */ #ifdef L_si_to_sf .text .align 2 .global __floatsisf .type __floatsisf, @function __floatsisf: push $lp move $r4, #0x80000000 and $r2, $r0, $r4 beqz $r0, .Li39 sltsi $r15, $r0, #0 beqzs8 .Li40 subri $r0, $r0, #0 .Li40: move $r1, #0x9e #ifdef __NDS32_PERF_EXT__ clz $r3, $r0 #else pushm $r0, $r2 pushm $r4, $r5 bal __clzsi2 move $r3, $r0 popm $r4, $r5 popm $r0, $r2 #endif sub $r1, $r1, $r3 sll $r0, $r0, $r3 #ADD($r0, $0x80) move $r15, #0x80 add $r0, $r0, $r15 slt $r15, $r0, $r15 #ADDC($r1, $0x0) add $r1, $r1, $r15 srai $r4, $r0, #8 andi $r4, $r4, #1 sub $r0, $r0, $r4 slli $r0, $r0, #1 srli $r0, $r0, #9 slli $r4, $r1, #23 or $r0, $r0, $r4 .Li39: or $r0, $r0, $r2 .LH999: pop $lp ret5 $lp .size __floatsisf, .-__floatsisf #endif /* L_si_to_sf */ #ifdef L_si_to_df #ifndef __big_endian__ #define O1L $r1 #define O1H $r2 #define O2L $r4 #define O2H $r5 #else #define O1H $r1 #define O1L $r2 #define O2H $r4 #define O2L $r5 #endif .text .align 2 .global __floatsidf .type __floatsidf, @function __floatsidf: push $lp pushm $r6, $r6 move O1L, #0 move O2H, O1L move $r3, O1L move O1H, $r0 beqz O1H, .Li39 sltsi $r15, O1H, #0 beqzs8 .Li40 move O2H, #0x80000000 subri O1H, O1H, #0 beqz O1L, .LL71 subri O1L, O1L, #0 subi45 O1H, #1 .LL71: .Li40: move $r3, #0x41e #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r4, $r2 #else pushm $r0, $r3 push $r5 move $r0, $r2 bal __clzsi2 move $r4, $r0 pop $r5 popm $r0, $r3 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r5, $r1 #else pushm $r0, $r4 move $r0, $r1 bal __clzsi2 move $r5, $r0 popm $r0, $r4 #endif #endif /* __big_endian__ */ sub $r3, $r3, O2L sll O1H, O1H, O2L .Li39: srli O2L, O1L, #11 slli $r6, O1H, #21 or O2L, O2L, $r6 slli $r6, O1H, #1 srli $r6, $r6, #12 or O2H, O2H, $r6 slli $r6, $r3, #20 or O2H, O2H, $r6 move $r0, $r4 move $r1, $r5 .LH999: popm $r6, $r6 pop $lp ret5 $lp .size __floatsidf, .-__floatsidf #endif /* L_si_to_df */ #ifdef L_floatdisf #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #endif .text .align 2 .global __floatdisf .type __floatdisf, @function __floatdisf: push $lp pushm $r6, $r7 move $r7, #0x80000000 and $r5, P1H, $r7 move P2H, P1H move P2L, P1L or $r7, P1H, P1L beqz $r7, .Li1 sltsi $r15, P1H, #0 beqzs8 .Li2 subri P2H, P2H, #0 beqz P2L, .LL1 subri P2L, P2L, #0 subi45 P2H, #1 .LL1: .Li2: move $r4, #0xbe #NORMd($r2, $r6, P1L) bnez P2H, .LL2 bnez P2L, .LL3 move $r4, #0 j .LL4 .LL3: move P2H, P2L move P2L, #0 move $r6, #32 sub $r4, $r4, $r6 .LL2: #ifdef __NDS32_PERF_EXT__ clz $r6, P2H #else pushm $r0, $r5 move $r0, P2H bal __clzsi2 move $r6, $r0 popm $r0, $r5 #endif beqz $r6, .LL4 sub $r4, $r4, $r6 subri P1L, $r6, #32 srl P1L, P2L, P1L sll P2L, P2L, $r6 sll P2H, P2H, $r6 or P2H, P2H, P1L .LL4: #NORMd End beqz P2L, .Li3 ori P2H, P2H, #1 .Li3: #ADD(P2H, $0x80) move $r15, #0x80 add P2H, P2H, $r15 slt $r15, P2H, $r15 #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r7, P2H, #8 andi $r7, $r7, #1 sub P2H, P2H, $r7 slli P2H, P2H, #1 srli P2H, P2H, #9 slli $r7, $r4, #23 or P2H, P2H, $r7 .Li1: or $r0, P2H, $r5 .LA999: popm $r6, $r7 pop $lp ret5 $lp .size __floatdisf, .-__floatdisf #endif /* L_floatdisf */ #ifdef L_floatdidf #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #define O1L $r5 #define O1H $r6 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define O1H $r5 #define O1L $r6 #endif .text .align 2 .global __floatdidf .type __floatdidf, @function __floatdidf: push $lp pushm $r6, $r8 move $r4, #0 move $r7, $r4 move P2H, P1H move P2L, P1L or $r8, P1H, P1L beqz $r8, .Li1 move $r4, #0x43e sltsi $r15, P1H, #0 beqzs8 .Li2 move $r7, #0x80000000 subri P2H, P2H, #0 beqz P2L, .LL1 subri P2L, P2L, #0 subi45 P2H, #1 .LL1: .Li2: #NORMd($r2, O1H, O1L) bnez P2H, .LL2 bnez P2L, .LL3 move $r4, #0 j .LL4 .LL3: move P2H, P2L move P2L, #0 move O1H, #32 sub $r4, $r4, O1H .LL2: #ifdef __NDS32_PERF_EXT__ clz O1H, P2H #else /* not __NDS32_PERF_EXT__ */ /* Replace clz with function call. clz O1H, P2H EL: clz $r6, $r3 EB: clz $r5, $r2 */ #ifndef __big_endian__ pushm $r0, $r5 move $r0, $r3 bal __clzsi2 move $r6, $r0 popm $r0, $r5 #else pushm $r0, $r4 move $r0, $r2 bal __clzsi2 move $r5, $r0 popm $r0, $r4 #endif #endif /* not __NDS32_PERF_EXT__ */ beqz O1H, .LL4 sub $r4, $r4, O1H subri O1L, O1H, #32 srl O1L, P2L, O1L sll P2L, P2L, O1H sll P2H, P2H, O1H or P2H, P2H, O1L .LL4: #NORMd End #ADD(P2L, $0x400) move $r15, #0x400 add P2L, P2L, $r15 slt $r15, P2L, $r15 #ADDCC(P2H, $0x0) beqzs8 .LL7 add P2H, P2H, $r15 slt $r15, P2H, $r15 .LL7: #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r8, P2L, #11 andi $r8, $r8, #1 sub P2L, P2L, $r8 .Li1: srli O1L, P2L, #11 slli $r8, P2H, #21 or O1L, O1L, $r8 slli O1H, P2H, #1 srli O1H, O1H, #12 slli $r8, $r4, #20 or O1H, O1H, $r8 or O1H, O1H, $r7 move P1L, O1L move P1H, O1H .LA999: popm $r6, $r8 pop $lp ret5 $lp .size __floatdidf, .-__floatdidf #endif /* L_floatdidf */ #ifdef L_floatunsisf .text .align 2 .global __floatunsisf .type __floatunsisf, @function __floatunsisf: push $lp beqz $r0, .Li41 move $r2, #0x9e #ifdef __NDS32_PERF_EXT__ clz $r1, $r0 #else push $r0 pushm $r2, $r5 bal __clzsi2 move $r1, $r0 popm $r2, $r5 pop $r0 #endif sub $r2, $r2, $r1 sll $r0, $r0, $r1 #ADD($r0, $0x80) move $r15, #0x80 add $r0, $r0, $r15 slt $r15, $r0, $r15 #ADDC($r2, $0x0) add $r2, $r2, $r15 srli $r3, $r0, #8 andi $r3, $r3, #1 sub $r0, $r0, $r3 slli $r0, $r0, #1 srli $r0, $r0, #9 slli $r3, $r2, #23 or $r0, $r0, $r3 .Li41: .LI999: pop $lp ret5 $lp .size __floatunsisf, .-__floatunsisf #endif /* L_floatunsisf */ #ifdef L_floatunsidf #ifndef __big_endian__ #define O1L $r1 #define O1H $r2 #define O2L $r4 #define O2H $r5 #else #define O1H $r1 #define O1L $r2 #define O2H $r4 #define O2L $r5 #endif .text .align 2 .global __floatunsidf .type __floatunsidf, @function __floatunsidf: push $lp pushm $r6, $r6 move O1L, #0 move $r3, O1L move O1H, $r0 beqz O1H, .Li41 move $r3, #0x41e #ifndef __big_endian__ #ifdef __NDS32_PERF_EXT__ clz $r5, $r2 #else pushm $r0, $r4 move $r0, $r2 bal __clzsi2 move $r5, $r0 popm $r0, $r4 #endif #else /* __big_endian__ */ #ifdef __NDS32_PERF_EXT__ clz $r4, $r1 #else pushm $r0, $r3 push $r5 move $r0, $r1 bal __clzsi2 move $r4, $r0 pop $r5 popm $r0, $r3 #endif #endif /* __big_endian__ */ sub $r3, $r3, O2H sll O1H, O1H, O2H .Li41: srli O2L, O1L, #11 slli $r6, O1H, #21 or O2L, O2L, $r6 slli O2H, O1H, #1 srli O2H, O2H, #12 slli $r6, $r3, #20 or O2H, O2H, $r6 move $r0, $r4 move $r1, $r5 .LI999: popm $r6, $r6 pop $lp ret5 $lp .size __floatunsidf, .-__floatunsidf #endif /* L_floatunsidf */ #ifdef L_floatundisf #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #endif .text .align 2 .global __floatundisf .type __floatundisf, @function __floatundisf: push $lp pushm $r6, $r6 move P2H, P1H move P2L, P1L or $r6, P1H, P1L beqz $r6, .Li4 move $r4, #0xbe #NORMd($r2, $r5, P1L) bnez P2H, .LL5 bnez P2L, .LL6 move $r4, #0 j .LL7 .LL6: move P2H, P2L move P2L, #0 move $r5, #32 sub $r4, $r4, $r5 .LL5: #ifdef __NDS32_PERF_EXT__ clz $r5, P2H #else pushm $r0, $r4 move $r0, P2H bal __clzsi2 move $r5, $r0 popm $r0, $r4 #endif beqz $r5, .LL7 sub $r4, $r4, $r5 subri P1L, $r5, #32 srl P1L, P2L, P1L sll P2L, P2L, $r5 sll P2H, P2H, $r5 or P2H, P2H, P1L .LL7: #NORMd End beqz P2L, .Li5 ori P2H, P2H, #1 .Li5: #ADD(P2H, $0x80) move $r15, #0x80 add P2H, P2H, $r15 slt $r15, P2H, $r15 #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r6, P2H, #8 andi $r6, $r6, #1 sub P2H, P2H, $r6 slli P2H, P2H, #1 srli P2H, P2H, #9 slli $r6, $r4, #23 or P2H, P2H, $r6 .Li4: move $r0, P2H .LB999: popm $r6, $r6 pop $lp ret5 $lp .size __floatundisf, .-__floatundisf #endif /* L_floatundisf */ #ifdef L_floatundidf #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #define O1L $r5 #define O1H $r6 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #define O1H $r5 #define O1L $r6 #endif .text .align 2 .global __floatundidf .type __floatundidf, @function __floatundidf: push $lp pushm $r6, $r7 move $r4, #0 move P2H, P1H move P2L, P1L or $r7, P1H, P1L beqz $r7, .Li3 move $r4, #0x43e #NORMd($r2, O1H, O1L) bnez P2H, .LL8 bnez P2L, .LL9 move $r4, #0 j .LL10 .LL9: move P2H, P2L move P2L, #0 move O1H, #32 sub $r4, $r4, O1H .LL8: #ifdef __NDS32_PERF_EXT__ clz O1H, P2H #else /* not __NDS32_PERF_EXT__ */ /* Replace clz with function call. clz O1H, P2H EL: clz $r6, $r3 EB: clz $r5, $r2 */ #ifndef __big_endian__ pushm $r0, $r5 move $r0, $r3 bal __clzsi2 move $r6, $r0 popm $r0, $r5 #else pushm $r0, $r4 move $r0, $r2 bal __clzsi2 move $r5, $r0 popm $r0, $r4 #endif #endif /* not __NDS32_PERF_EXT__ */ beqz O1H, .LL10 sub $r4, $r4, O1H subri O1L, O1H, #32 srl O1L, P2L, O1L sll P2L, P2L, O1H sll P2H, P2H, O1H or P2H, P2H, O1L .LL10: #NORMd End #ADD(P2L, $0x400) move $r15, #0x400 add P2L, P2L, $r15 slt $r15, P2L, $r15 #ADDCC(P2H, $0x0) beqzs8 .LL13 add P2H, P2H, $r15 slt $r15, P2H, $r15 .LL13: #ADDC($r4, $0x0) add $r4, $r4, $r15 srli $r7, P2L, #11 andi $r7, $r7, #1 sub P2L, P2L, $r7 .Li3: srli O1L, P2L, #11 slli $r7, P2H, #21 or O1L, O1L, $r7 slli O1H, P2H, #1 srli O1H, O1H, #12 slli $r7, $r4, #20 or O1H, O1H, $r7 move P1L, O1L move P1H, O1H .LB999: popm $r6, $r7 pop $lp ret5 $lp .size __floatundidf, .-__floatundidf #endif /* L_floatundidf */ #ifdef L_compare_sf .text .align 2 .global __cmpsf2 .type __cmpsf2, @function __cmpsf2: .global __eqsf2 .type __eqsf2, @function __eqsf2: .global __ltsf2 .type __ltsf2, @function __ltsf2: .global __lesf2 .type __lesf2, @function __lesf2: .global __nesf2 .type __nesf2, @function __nesf2: move $r4, #1 j .LA .global __gesf2 .type __gesf2, @function __gesf2: .global __gtsf2 .type __gtsf2, @function __gtsf2: move $r4, #-1 .LA: push $lp slli $r2, $r0, #1 slli $r3, $r1, #1 or $r5, $r2, $r3 beqz $r5, .LMequ move $r5, #0xff000000 slt $r15, $r5, $r2 bnezs8 .LMnan slt $r15, $r5, $r3 bnezs8 .LMnan srli $r2, $r2, #1 sltsi $r15, $r0, #0 beqzs8 .Li48 subri $r2, $r2, #0 .Li48: srli $r3, $r3, #1 sltsi $r15, $r1, #0 beqzs8 .Li49 subri $r3, $r3, #0 .Li49: slts $r15, $r2, $r3 beqzs8 .Li50 move $r0, #-1 j .LM999 .Li50: slts $r15, $r3, $r2 beqzs8 .LMequ move $r0, #1 j .LM999 .LMequ: move $r0, #0 .LM999: pop $lp ret5 $lp .LMnan: move $r0, $r4 j .LM999 .size __cmpsf2, .-__cmpsf2 .size __eqsf2, .-__eqsf2 .size __ltsf2, .-__ltsf2 .size __lesf2, .-__lesf2 .size __nesf2, .-__nesf2 .size __gesf2, .-__gesf2 .size __gtsf2, .-__gtsf2 #endif /* L_compare_sf */ #ifdef L_compare_df #ifdef __big_endian__ #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #else #define P1H $r1 #define P1L $r0 #define P2H $r3 #define P2L $r2 #endif .align 2 .globl __gtdf2 .globl __gedf2 .globl __ltdf2 .globl __ledf2 .globl __eqdf2 .globl __nedf2 .globl __cmpdf2 .type __gtdf2, @function .type __gedf2, @function .type __ltdf2, @function .type __ledf2, @function .type __eqdf2, @function .type __nedf2, @function .type __cmpdf2, @function __gtdf2: __gedf2: movi $r4, -1 b .L1 __ltdf2: __ledf2: __cmpdf2: __nedf2: __eqdf2: movi $r4, 1 .L1: #if defined (__NDS32_ISA_V3M__) push25 $r10, 0 #else smw.adm $r6, [$sp], $r9, 0 #endif sethi $r5, 0x7ff00 and $r6, P1H, $r5 ! r6=aExp and $r7, P2H, $r5 ! r7=bExp slli $r8, P1H, 12 ! r8=aSig0 slli $r9, P2H, 12 ! r9=bSig0 beq $r6, $r5, .L11 ! aExp==0x7ff beq $r7, $r5, .L12 ! bExp==0x7ff .L2: slli $ta, P1H, 1 ! ta=ahigh<<1 or $ta, P1L, $ta ! xor $r5, P1H, P2H ! r5=ahigh^bhigh beqz $ta, .L3 ! if(ahigh<<1)==0,go .L3 !------------------------------- ! (ahigh<<1)!=0 || (bhigh<<1)!=0 !------------------------------- .L4: beqz $r5, .L5 ! ahigh==bhigh, go .L5 !-------------------- ! a != b !-------------------- .L6: bltz $r5, .L7 ! if(aSign!=bSign), go .L7 !-------------------- ! aSign==bSign !-------------------- slt $ta, $r6, $r7 ! ta=(aExp|b|), go .L10 nor $r0, P2H, P2H ! if(|a|<|b|),return (~yh) .L14: #if defined (__NDS32_ISA_V3M__) pop25 $r10, 0 #else lmw.bim $r6, [$sp], $r9, 0 ret #endif .L10: ori $r0, P2H, 1 ! return (yh|1) b .L14 !-------------------- ! (ahigh<<1)=0 !-------------------- .L3: slli $ta, P2H, 1 ! ta=bhigh<<1 or $ta, P2L, $ta ! bnez $ta, .L4 ! ta=(bhigh<<1)!=0,go .L4 .L5: xor $ta, P1L, P2L ! ta=alow^blow bnez $ta, .L6 ! alow!=blow,go .L6 movi $r0, 0 ! a==b, return 0 b .L14 !-------------------- ! aExp=0x7ff; !-------------------- .L11: or P1L, P1L, $r8 ! x1=(aSig0|aSig1) bnez P1L, .L13 ! if(a=nan), go.L13 xor $ta, $r7, $r5 ! ta=(bExp^0x7ff) bnez $ta, .L2 ! if(bExp!=0x7ff), go .L2 !-------------------- ! bExp=0x7ff; !-------------------- .L12: or $ta, P2L, $r9 ! ta=(bSig0|bSig1) beqz $ta, .L2 ! if(b!=nan), go .L2 .L13: move $r0, $r4 b .L14 !-------------------- ! aSign!=bSign !-------------------- .L7: ori $r0, P1H, 1 ! if(aSign!=bSign), return (ahigh|1) b .L14 .size __gtdf2, .-__gtdf2 .size __gedf2, .-__gedf2 .size __ltdf2, .-__ltdf2 .size __ledf2, .-__ledf2 .size __eqdf2, .-__eqdf2 .size __nedf2, .-__nedf2 .size __cmpdf2, .-__cmpdf2 #endif /* L_compare_df */ #ifdef L_unord_sf .text .align 2 .global __unordsf2 .type __unordsf2, @function __unordsf2: push $lp slli $r2, $r0, #1 move $r3, #0xff000000 slt $r15, $r3, $r2 beqzs8 .Li52 move $r0, #1 j .LP999 .Li52: slli $r2, $r1, #1 move $r3, #0xff000000 slt $r15, $r3, $r2 beqzs8 .Li53 move $r0, #1 j .LP999 .Li53: move $r0, #0 .LP999: pop $lp ret5 $lp .size __unordsf2, .-__unordsf2 #endif /* L_unord_sf */ #ifdef L_unord_df #ifndef __big_endian__ #define P1L $r0 #define P1H $r1 #define P2L $r2 #define P2H $r3 #else #define P1H $r0 #define P1L $r1 #define P2H $r2 #define P2L $r3 #endif .text .align 2 .global __unorddf2 .type __unorddf2, @function __unorddf2: push $lp slli $r4, P1H, #1 beqz P1L, .Li66 addi $r4, $r4, #1 .Li66: move $r5, #0xffe00000 slt $r15, $r5, $r4 beqzs8 .Li67 move $r0, #1 j .LR999 .Li67: slli $r4, P2H, #1 beqz P2L, .Li68 addi $r4, $r4, #1 .Li68: move $r5, #0xffe00000 slt $r15, $r5, $r4 beqzs8 .Li69 move $r0, #1 j .LR999 .Li69: move $r0, #0 .LR999: pop $lp ret5 $lp .size __unorddf2, .-__unorddf2 #endif /* L_unord_df */ /* ------------------------------------------- */ /* DPBIT floating point operations for libgcc */ /* ------------------------------------------- */