⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppc_fdiv.s

📁 powerpc 405 优化过的硬浮点库
💻 S
📖 第 1 页 / 共 3 页
字号:
        bge     setstky                 /*       goto setstky; */
        srw     r28,r27,r20             /*     e.lo = e.hi >> shift; */
        slw     r0,r27,r21              /*     round = e.hi << (32-shift); */
        addi    r27,0,0                 /*     e.hi = 0; */
addit:                                  /*   } */
        addc    r23,r23,r0              /*   c.save += round; */
        adde    r19,r19,r28             /*   c.lo += e.lo; */
        adde    r18,r18,r27             /*   c.hi += e.hi; */
        b       adddone                 /* } */
first:                                  /* else */
                                        /* { */
        crclr   first_loop              /*   first_loop = false; */
        cntlzw  r23,r27                 /*   r23 = cntlz(e.hi); */
        addi    r19,r23,-11             /*   r19 = r23 - 11; */
        subf    r17,r19,r26             /*   c.exp = e.exp - r19; */
        slw     r18,r27,r19             /*   c.hi = e.hi << r19; */
        addi    r19,0,0                 /*   c.lo = 0; */
        addi    r23,0,0                 /*   c.save = 0; */
adddone:                                /* } */
        or      r0,r24,r25              /* if (r.hi == 0 && r.lo ==0 && */
        or.     r0,r0,r31               /*   r.save == 0) */
        mr      r9,r24                  /* a.hi = r.hi; */
        mr      r10,r25                 /* a.lo = r.lo; */
        beq     divdone                 /*   break; */
        bdnz    do_divide               /* } end for */
setstky:
        ori     r23,r23,0x0001          /* sticky bit if non-zero remainder */
divdone:

/* put results from r18,r19 into r9 and r10                                     */
        mr      r8,r17                  /* fpa.exp = c.exp; */
        mr      r9,r18                  /* fpa.hi = c.hi; */
        mr      r10,r19                 /* fpa.lo = c.lo; */
        mr      r0,r23                  /* round = c.save; */

        RESTREG(17)                     /* restore r17 */
        RESTREG(18)                     /* restore r18 */
        RESTREG(19)                     /* restore r19 */
        RESTREG(20)                     /* restore r20 */
        RESTREG(21)                     /* restore r21 */
        RESTREG(22)                     /* restore r22 */
        RESTREG(23)                     /* restore r23 */
        RESTREG(24)                     /* restore r24 */
        RESTREG(25)                     /* restore r25 */
        RESTREG(26)                     /* restore r26 */
        RESTREG(27)                     /* restore r27 */

/* Fix up number in denormalized range                                          */
        cmpwi   cr0,r8,1                /* if (fpa.exp < 1) */
        RESTREG(28)                     /* restore r28 */
        RESTREG(29)                     /* restore r29 */
        addis   r5,0,0x8000             /* r5 = 0x80000000 */
        bge+    normexp                 /* { */
        subfic  r12,r8,1                /*   shift = 1-fpa.exp; */
        li      r8,0                    /*   fpa.exp = 0; */
        cmpwi   cr0,r12,32              /*   if ( shift < 32) */
        cmpwi   cr1,r0,0                /*   sticky = (round!=0); */
        bge     lose32                  /*   { */
        srw     r0,r0,r12               /*     round >>= shift; */
        subfic  r11,r12,32              /*     r11 = 32-shift; */
        slw     r7,r10,r11              /*     temp = fpa.lo << (32-shift); */
        or      r0,r0,r7                /*     round |= temp; */
        srw     r10,r10,r12             /*     fpa.lo >>= shift; */
        slw     r7,r9,r11               /*     temp = fpa.hi << (32-shift); */
        or      r10,r10,r7              /*     fpa.lo |= temp; */
        srw     r9,r9,r12               /*     fpa.hi >>= shift; */
        beq     cr1,normexp                     /*     if (sticky) */
        ori     r0,r0,0x0001            /*       round |= 0x00000001; */
        b       normexp                 /*   } */
lose32:                                 /*   else */
                                        /*   { */
        addi    r12,r12,-32             /*     shift -= 32; */
        cmpwi   cr0,r12,32              /*     if (shift < 32) */
        bge     lose64                  /*     { */
        or.     r7,r0,r10               /*       sticky = (round!=0||fpa.lo!=0); */
        srw     r0,r10,r12              /*       round = fpa.lo >> shift; */
        subfic  r11,r12,32              /*       r11 = 32-shift; */
        slw     r7,r9,r11               /*       temp = fpa.hi << (shift-32); */
        or      r0,r0,r7                /*       round |= temp; */
        srw     r10,r9,r12              /*       fpa.lo = fpa.hi >> shift; */
        addi    r9,0,0                  /*       fpa.hi = 0; */
        beq     normexp                 /*       if (sticky) */
        ori     r0,r0,0x0001            /*         round |= 0x00000001; */
        b       normexp                 /*     } */
lose64:                                 /*     else */
                                        /*     { */
        addi    r9,0,0                  /*       fpa.hi = 0; */
        addi    r10,0,0                 /*       fpa.lo = 0; */
        addi    r0,0,0                  /*       round = 0; */
                                        /*     } */
                                        /*   } */
normexp:                                /* } */
        cmpwi   cr0,r8,2047             /* if (fpa.exp >= DEXPMAX) */
        RESTREG(30)                     /* restore r30 */
        RESTREG(31)                     /* restore r31 */
        blt+    roundit                 /* { Set fpa = INF */
        addi    r8,0,2047               /*   fpa.exp = DEXPMAX; */
        addi    r9,0,0                  /*   fpa.hi = 0; */
        addi    r10,0,0                 /*   fpa.lo = 0; */
        b       noround                 /*   goto noround; */
roundit:                                /* } */
/* round fpa to nearest                                                         */
        cmplw   cr7,r0,r5               /* if ((round >= 0x80000000) || */
        blt     cr7,noround             /* */
        andi.   r7,r10,0x0001           /*   (((fpa.lo & 0x00000001) && */
        crand   cr0_2,cr7_2,cr0_2       /*       (round == 0x80000000))) */
        beq     noround                 /* { */
        addic.  r10,r10,1               /*   fpa.lo++; */
        bne     noround                 /*   if (fpa.lo == 0) { */
        addi    r9,r9,1                 /*     fpa.hi++; */
        lis     r7,0x10                 /*     r7 = 0x00200000; */
        cmpw    cr0,r9,r7               /*     if (fpa.hi == 0x00200000) */
        bne     noround                 /*     { */
        addi    r8,r8,1                 /*       fpa.exp++; */
                                        /*     } */
                                        /*   } */
noround:                                /* } */
/* fpt = fpa;                                                                   */
        rlwimi  r9,r8,20,0x7ff00000     /* fpa.hi |= fpa.exp << 20; */
        bf      cr6_sign,nosign         /* if (fpa.sign) { */
        oris    r9,r9,0x8000            /*   fpa.hi |= 0x80000000; */
nosign:                                 /* } */
        mr      r3,r9                   /* FRT = fpa.hi; */
        mr      r4,r10                  /* FRT = fpa.lo; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */     
        
a_zero:                                 /* fpa == 0; */
        bt      cr7_zero,rtn_NaN        /* if (fpb.zero) goto rtn_NaN; */
        crxor   cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
        mfcr    r0                      /* r0 = cr; */
        rlwimi  r3,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
                                        /* FRT = r3,r4; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */
rtn_NaN:
        oris    r3,r3,0x7ff8            /* fpa = QNaN; */
        rlwinm  r3,r3,0,0x7fffffff      /* r3 &= 0x7fffffff; */
                                        /* FRT = r3,r4; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common            /* return; */

b_zero:                                 /* return INF; */
        lis     r3,0x7ff0               /* r3 = 0x7ff00000; */
        li      r4,0                    /* r4 = 0; */
        crxor   cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
        mfcr    r0                      /* r0 = cr; */
        rlwimi  r3,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */


a_INForNaN:
/* fpa is either INF or NaN                                                     */
        rlwinm  r0,r3,0,0x000fffff
        or.     r0,r0,r4                /* if (fpa.hi == 0 && fpa.lo == 0) */
        beq     a_INF                   /*  goto a_INF; */
a_NaN:                                  /* return QNaN; */
        oris    r3,r3,0x0008            /* FRA->hi |= 0x80000; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */


b_INForNaN:
/* fpb is either INF or NaN                                                     */
        rlwinm  r0,r5,0,0x000fffff
        or.     r0,r0,r6                /* if (fpb.hi == 0 && fpb.lo == 0) */
        beq     b_INF                   /*  goto b_INF; */
b_NaN:                                  /* return QNaN; */
        oris    r3,r5,0x0008            /* FRB->hi |= 0x80000; */
        mr      r4,r6                   /* FRT = r3,r4; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */

a_INF:                                  /* return INF; */
        lis     r3,0x7ff0               /* r3 = 0x7ff00000; */
        li      r4,0                    /* r4 = 0; */
        crxor   cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
        bf      cr3_2,nNaN              /* if (fpb.inf) goto rtn_NaN; */
        rlwinm  r0,r5,0,0x000fffff
        or.     r0,r6,r0
        bne     b_NaN
        b       rtn_NaN                 /* if (fpb.inf) goto rtn_NaN; */
nNaN:   mfcr    r0                      /* r0 = cr; */
        rlwimi  r3,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
                                        /* FRT = r3,r4; */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */

b_INF:                                  /* return 0.0; */
        li      r3,0                    /* r3 = 0; */
        li      r4,0                    /* r4 = 0; */
        crxor   cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
        mfcr    r0                      /* r0 = cr; */
        rlwimi  r3,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
        mtcr    r16                     /* restore cr */
        RESTREG(16)                     /* restore r16 */
        b       return_common           /* return; */

function_epilog(__divdf3)


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -