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

📄 ppc_fdivs.s

📁 powerpc 405 优化过的硬浮点库
💻 S
📖 第 1 页 / 共 3 页
字号:
     subfic     r11,r5,32                 /*   r11     = 21+s; */
     srw        r10,r10,r5                /*   fpa.lo >>= (8-s); */
     slw        r6,r9,r11                 /*   temp = fpa.hi << (24+s); */
     or         r10,r10,r6                /*   fpa.lo |= temp; */
     srw        r9,r9,r5                  /*   fpa.hi >>= (8-s); */
     add        r8,r8,r5                  /*   fpa.exp += (8-s); */
     cmpwi      cr0,r8,0xff               /*   if (fpa.exp     == SEXPMAX) */
     bne        noshift                   /*   { */
     li         r9,0                      /*     fpa.hi = 0; */
     li         r10,0                     /*     fpa.lo = 0; */
                                          /*   } */
     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 = 43-s; */
     srw        r4,r10,r11                /*     temp == fpa.lo >>     (46-s); */
     or         r9,r9,r4                  /*     fpa.hi |=     temp; */
     slw        r10,r10,r5                /*     fpa.lo <<= (s-8); */
     b          noshift                   /*   } */
gt32:                                     /*   else */
                                          /*   { */
     cntlzw     r5,r10                    /*     s = cntlz(fpa.lo); */
     addi       r4,r5,32-8                /*     r4 = s+(32-8); */
     subf       r8,r4,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)); */
     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-(11-s)); */
                                          /*     } */
                                          /*   } */
noshift:                                  /* } */
/*   Check for single overflow                                                */
     cmpwi      cr0,r8,0xff               /* if (fpa.exp > (SEXPMAX)) */
     blt        over                      /* { result = infinity  */
     li         r8,0xff                   /*   fpa.exp = SEXPMAX; */
     li         r9,0                      /*   fpa.hi = 0; */
     li         r10,0                     /*   fpa.lo = 0; */
     RESTREG(26)                          /* restore r26 */
     RESTREG(27)                          /* restore r27 */
     b          noround                   /* } */
     
/* Fix up number in normalized range                                  */
over:     
     cmpwi     cr0,r8,1                   /* if (fpa.exp >= 1 */
     RESTREG(26)                          /* restore r26 */
     RESTREG(27)                          /* restore r27 */
     blt        denormexp                 /* { */
     lis        r12,0x8000                /*   r12 = guard bit; */
     cmplw      cr1,r10,r12               /*   if (fpa.lo >= 0x80000000) guard set */
     blt        cr1,noround               /*   { */
     andi.      r0,r9,0x00000001          /*     if ((fpa.hi.lobit==0) && */
     crand      cr0_2,cr0_2,cr1_2         /*      (guard == 0x80000000)) no sticky or round */
     beq        noround                   /*     goto noround; */
     addi       r9,r9,1                   /*     fpa.hi++; */
     lis        r6,0x0100                 /*     r6 = 0x01000000; */
     cmpw       cr0,r9,r6                 /*     if (fpa.hi == 0x01000000) carry out */
     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 for denormalized result */
     cmpwi      cr0,r12,25                /*   if ( shift < 25) */
     bge        rnd2zero                  /*   { */
     subfic     r11,r12,32                /*     r11 = 32-shift; */
     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); */
     or         r5,r5,r6                  /*     r5 |= temp; */
     srw        r4,r9,r12                 /*     r4 = fpa.hi >> shift; */
     beq        nostk                     /*     if (round) */
     ori        r5,r5,0x0001              /*     r5 |= 0x00000001; */
nostk:                                  
     lis        r6,0x8000                 /*     r6 = 0x80000000; */
     cmplw      cr1,r5,r6                 /*     if (guard bit set) */
     mr         r9,r4                     /*     move back into results register */                   
     blt        cr1,noround               /*     { */
     andi.      r0,r9,0x00000001          /*       if ((fpa.hi.lobit==0) && */
     crand      cr0_2,cr0_2,cr1_2         /*          (fpa.lo= 0x80000000)) no sticky or round */
     beq        noround                   /*         goto noround; */
     addi       r9,r9,1                   /*       fpa.hi++; (round up) */
                                          /*     } */
     lis        r6,0x0080                 /*     r6 = 0x00800000; */
     cmpw       cr0,r9,r6                 /*     if (fpa.hi == 0x00800000) carry out */
     bne        noround                   /*     { */
     addi       r8,r8,1                   /*     fpa.exp++; */
                                          /*     } */
     b          noround                   /*   } */
rnd2zero:                                 /*   else */
                                          /*   { */
     li         r8,0                      /*     fpa.exp     = 0; */
     li         r9,0                      /*     fpa.hi = 0; */
     li         r10,0                     /*     fpa.lo = 0; */
                                          /*   } */
noround:                                  /* } */
/* 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       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     
common_return:
     lwz        r1,0(r1)                  /* previous stack frame */
     lwz        r0,4(r1)                  /* saved link register */
     mtlr       r0                        /* restore link register */  
     blr
     
a_zero:                                   /* fpa == 0; */
     li         r3,0                      /* result= +-0 ; */
     bt         cr7_zero,ab_zero          /* if (fpb.zero) goto ab_zero; */
     crxor      cr0_0,cr6_sign,cr7_sign   /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr       r0                        /* r0 = cr; */
     rlwimi     r3,r0,0,0x80000000        /* insert sign into result */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
     
ab_zero:                                  /* need to return special QNaN */
     nand       r3,r3,r3                  /* flip all the bits */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
     
b_zero:                                   /* return INF; */
     lis        r3,0x7f80               
     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       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
                                       
a_NaN:                                    /* return QNaN; */
     oris       r3,r3,0x0040              /* FRA->hi |= 0x400000; */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
                                       
b_NaN:                                    /* return QNaN; */
     mr         r3,r4                                         
     oris       r3,r3,0x0040              /* FRB->hi |= 0x80000; */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
                                       
a_INF:                                    /* return INF; */
     lis        r3,0x7f80                 /* load INF into results register */
     crxor      cr0_0,cr6_sign,cr7_sign   /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr       r0                        /* r0 = cr; */
     bt         cr7_inf,rtn_NaN           /* if (fpb.inf) goto rtn_NaN; */
     rlwimi     r3,r0,0,0x80000000        /* insert sign into result */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
     
rtn_NaN:                                 
     lis        r3,0x7fc0                 /* fpa = QNaN; */
     rlwimi     r3,r0,0,0x80000000        /* insert sign into result */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */
                                        
b_INF:                                    /* return 0.0; */
     li         r3,0                      
     crxor      cr0_0,cr6_sign,cr7_sign   /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr       r0                        /* r0 = cr; */
     rlwimi     r3,r0,0,0x80000000        /* insert sign into result       */
     mtcr       r19                       /* restore cr */
     RESTREG(19)                          /* restore r19 */
     b          common_return             /* return; */

function_epilog(__divsf3)     

⌨️ 快捷键说明

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