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

📄 ppc_fadds.s

📁 powerpc 405 优化过的硬浮点库
💻 S
📖 第 1 页 / 共 2 页
字号:
        or      r10,r10,r6              /*   fpa.lo |= temp; */
        b       noshift                 /* } */
noshrght:                               /* else if (s > 8) */
        beq     noshift                 /* { */
        cmpwi   cr0,r5,32               /*   if (s < 32) */
        bge     gt32                    /*   { */
        addi    r5,r5,-8                /*     r5 = s-8 ; */
        subf    r8,r5,r8                /*     fpa.exp -= (s-8); */
        slw     r9,r9,r5                /*     fpa.hi <<= (s-8); */
        subfic  r11,r5,32               /*     r11 = 46-s; */
        srw     r6,r10,r11              /*     temp == fpa.low >> (46-s); */
        slw     r10,r10,r5              /*     fpa.lo <<= (s-8); */
        or      r9,r9,r6                /*     fpa.hi |= temp; */
        b       noshift                 /*   } */
gt32:                                   /*   else */
                                        /*   { */
        cntlzw  r5,r10                  /*     s = cntlz(fpa.lo); */
        cmpwi   cr0,r5,32               /*     if (s == 32) */
        blt+    not_zero                /*     { Return value of +0.0 */
        li      r3,0                    /*       r3 = 0; */
        mtcr    r0                      /*       restore cr */
        blr                             /*       return; */
not_zero:                               /*     } */
        addi    r6,r5,32-8              /*     temp = s+(32-8 ); */
        subf    r8,r6,r8                /*     fpa.exp -= (s+(32-8)); */
        addic.  r5,r5,-8                /*     r5 = s-8 ; */
        ble+    sh32le                  /*     if (shift > 8) { */
        slw     r9,r10,r5               /*       fpa.hi = fpa.lo << (s-8); */
        li      r10,0                   /*       fpa.lo = 0; */
        b       noshift                 /*     } else { */
sh32le: subfic  r5,r5,0                 /*       r5 = 8-s; */
        srw     r9,r10,r5               /*       fpa.hi = fpa.lo >> (8-s); */
        subfic  r11,r5,32               /*       r11 = 32-(8-s); */
        slw     r10,r10,r11             /*       fpa.lo << 32-(8-s); */
                                        /*     } */
                                        /*   } */
noshift:                                /* } */
/* Check for single overflow                                                    */
        cmpwi   cr0,r8,SEXPMAX          /* if (fpa.exp > SEXPMAX) */
        bge     res_INF                 /*   Set results to INF */
/* Check for number in denormalised range                                       */
        cmpwi   cr0,r8,1                /* else if (fpa.exp >= 1 */
        blt     denormexp               /* { */
/* round fpa to nearest                                                         */
        lis     r5,0x8000               /*   guard bit */
        cmplw   cr7,r10,r5              /*   if ((round >= 0x80000000) || */
        blt     cr7,noround             /* */
        andi.   r6,r9,0x00000001        /*     (((fpa.lobit == 0) && */
        crand   cr0_2,cr7_2,cr0_2       /*         (round == 0x80000000))) */
        bt      cr0_2,noround           /*   { */
        addi    r9,r9,1                 /*       fpa.hi++; */
        lis     r6,0x0100               /*                        */
        cmpw    cr0,r9,r6               /*       if (fpa.hi == 0x01000000) */
        bne+    noround                 /*       { */
        addi    r8,r8,1                 /*         fpa.exp++; */
                                        /*       } */
                                        /*   } */
        b       noround                 /* } */
denormexp:                              /* else */
                                        /* { */
        subfic  r12,r8,1                /*   shift=1-fpa.exp; */
        li      r8,0                    /*   fpa.exp = 0 */
        cmpwi   cr0,r12,25              /*   if ( shift < 25) */
        bge     rnd2zero                /*   { */
        subfic  r11,r12,32              /*     r11 = 32-shift; */
        mtctr   r0                      /*     (save r0) */
        slw.    r0,r10,r11              /*     round = fpa.lo << (32-shift); */
        srw     r5,r10,r12              /*     r5 = fpa.lo >> shift; */
        slw     r6,r9,r11               /*     temp = fpa.hi << (32-shift); */
        srw     r4,r9,r12               /*     r4 = fpa.hi >> shift; */
        or      r5,r5,r6                /*     r5 |= temp; */
        beq     nostk                   /*     if bits shifted out of fpa.lo */
        oris    r5,r5,0x2000            /*       set sticky bit; */
nostk:  
        lis     r6,0x8000              
        cmplw   cr1,r0,r6               /*     if (round >= 0x80000000) guard set */
        blt     cr1,nornd               /*     { */
        andi.   r0,r5,0x00000001        /*       if (((fpa.lobit==0) && */
        crand   cr0_2,cr0_2,cr1_2       /*            (round == 0x10000000)) */
        beq+    nornd                   /*          goto nornd; */
        addi    r4,r4,1                 /*         r4++; */
        lis     r6,0x0080             
        cmplw   cr0,r4,r6               /*       if (fpa.hi == 0x00800000) carry out */
        bne+    nornd                   /*       { */
        addi    r8,r8,1                 /*         fpa.exp++; */
                                        /*       } */
nornd:                                  /*     } */
        mfctr   r0                      /*     (restore r0) */
        mr      r9,r4
        b       noround                 /*   } */
rnd2zero:                               /*   else */
                                        /*   { */
        li      r8,0                    /*       fpa.exp = 0; */
        li      r9,0                    /*       fpa.hi = 0; */
        li      r10,0                   /*       fpa.lo = 0; */
                                        /*   } */
noround:                                /* } */
        cmpwi   cr0,r8,SEXPMAX          /*   if (fpa.exp > DEXPBIAS+SEXPMAX) */
        bgt     res_INF                 /*     Set results to INF */
/* fpt = fpa;                                                                   */
        rlwimi  r9,r8,23,0x7f800000     /* fpa.hi |= fpa.exp << 23; */
        bf      cr6_sign,nosign         /* if (fpa.sign) { */
        oris    r9,r9,0x8000            /*   fpa.hi |= 0x80000000; */
nosign:                                 /* } */
        mr      r3,r9                   /* *FRT = fpa.hi; */
        mtcr    r0                      /* restore cr */
        blr                              /* return; */

a_zero:                                 
        mr      r3,r4                   /* copy fpbb into return reg */
        bf      cr7_zero,a_zeroret      /* if (fpb.zero) fixup sign */
        rlwinm  r3,r3,0,0x7fffffff      /* assume no sign */
        crand   cr0_0,cr6_sign,cr7_sign /* if (fpa.sign AND fpb.sign  */
        bf      cr0,a_zeroret               
        oris    r3,r3,0x8000            /* set sign bit */ 
        
a_zeroret:
        mtcr    r0                      /* restore cr */
        blr                             /* return; */

b_zero:                                 /* return fpa (already in r3) */
        mtcr    r0                      /* restore cr */
        blr                             /* return; */

a_NaNorINF:
/* fpa is either INF or NaN                                                     */
        mr      r8,r3                   /* r8 = FRA; */
        rlwinm. r5,r8,0,0x007fffff      /* if (fpa.hi == 0  */
        beq     a_INF                   /*  goto a_INF; */
a_NaN:                                  /* return QNaN; */
        oris    r3,r8,0x0040            /* FRA->hi |= 0x400000; */
        mtcr    r0                      /* restore cr */
        blr                             /* return; */

b_NaNorINF:
/* fpb is either INF or NaN                                                     */
        mr      r8,r4                   /* r8 = FRB; */
/*  The following is necessary because fsubs will have already flipped the bit   */
        rlwinm  r8,r8,0,0x7fffffff      /* clear sign bit */
        bf      cr7_sign,no_set_sign    /* if (fpb.sign) */
        oris    r8,r8,0x8000            /*   set sign bit */
no_set_sign:
        rlwinm. r4,r8,0,0x007fffff      /* if (fpb.hi == 0  */
        beq     b_INF                   /*  goto b_INF; */
b_NaN:                                  /* return QNaN; */
        oris    r3,r8,0x0040            /* FRB->hi |= 0x400000; */
        mtcr    r0                      /* restore cr */
        blr                              /* return; */

a_INF:                                  /* fpa is infinity */
        mr      r8,r4                   /* r8 = FRB */
        rlwinm. r11,r8,0,0x007fffff     /* is FRB.fraction non-zero? */
        crandc  cr7_NaN,cr3_2,cr0_2     /* if max exponent & non-zero fraction */
        bt      cr7_NaN,b_NaN           /*   B is NAN */
        crxor   cr0_0,cr6_sign,cr7_sign /* if (fpa.sign ^ fpb.sign && */
        crand   cr0_0,cr0_0,cr3_2       /*     fpb.inf) */
        bf      cr0_0,rtn_INF           /* { */
        li      r3,0xffffffff           /*   return -QNAN;        */
        mtcr    r0                      /* } */
        blr
        
rtn_INF:                                
                                        /* r3 = infinity  */
        mtcr    r0                      /* restore cr */
        blr                              /* return; */

b_INF:                                  /* fpb is infinity */
        mr      r3,r8                   /* *FRT = r8; */
        mtcr    r0                      /* restore cr */
        blr                              /* return; */

res_INF:                                /* result is infinity */
        lis     r3,0x7f80                
        bf      cr6_sign,inf_pos        /* if (fpa.sign) { */
        oris    r3,r3,0x8000            /*   fpa.hi |= 0x80000000; */
inf_pos:                                /* } */
        mtcr    r0                      /* restore cr */
        blr                             /* return; */

function_epilog(__addsf3)


⌨️ 快捷键说明

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