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

📄 ppc_fmul.s

📁 powerpc 405 优化过的硬浮点库
💻 S
📖 第 1 页 / 共 3 页
字号:
     cmpwi    cr0,r8,0x7ff            /*   if (fpa.exp == DEXPMAX) */
     bne      noshift                 /*   { */
     li       r9,0                    /*     fpa.hi = 0; */
     li       r10,0                   /*     fpa.lo = 0; */
     li       r0,0                    /*     round = 0; */
                                      /*   } */
     b        noshift                 /* } */
noshrght:                             /* else if (s > 11) */
     beq      noshift                 /* { */
     cmpwi    cr0,r13,32              /*   if (s < 32) */
     bge      gt32                    /*   { */
     addi     r13,r13,-11             /*     r13 = s-11; */
     subf     r8,r13,r8               /*     fpa.exp -= (s-11); */
     slw      r9,r4,r13               /*     fpa.hi = n[0] << (s-11); */
     subfic   r11,r13,32              /*     r11 = 43-s; */
     srw      r4,r5,r11               /*     temp == n[1] >> (43-s); */
     or       r9,r9,r4                /*     fpa.hi |= temp; */
     slw      r10,r5,r13              /*     fpa.lo = n[1] << (s-11); */
     srw      r5,r6,r11               /*     temp = n[2] >> (43-s); */
     or       r10,r10,r5              /*     fpa.lo |= temp; */
     slw      r4,r6,r13               /*     r4 = n[2] << (s-11); */
     srw      r5,r0,r11               /*     r5 = n[3] >> (43-s); */
     slw      r0,r0,r13               /*     n[3] <<= (s-11); */
     cmpwi    cr0,r0,0                /*     sticky bit? */
     or       r0,r4,r5                /*     round = r4 | r5; */
     beq      nostk2                  /*     if (sticky) */
     ori      r0,r0,0x0001            /*     round |= 0x00000001; */
nostk2:       b     noshift           /*   } */
gt32:                                 /*   else */
                                      /*   { */
     cntlzw   r13,r5                  /*     s     = cntlz(n[1]); */
     addi     r4,r13,32-11            /*     temp = s+(32-11); */
     subf     r8,r4,r8                /*     fpa.exp -= (s+(32-11)); */
     addic.   r13,r13,-11             /*     r13 = s-11; */
     ble      sh32le                  /*     if (shift     > 11) { */
     slw      r9,r5,r13               /*     fpa.hi = n[1] << (s-11); */
     subfic   r11,r13,32              /*     r11 = 43-s; */
     srw      r4,r6,r11               /*     temp = n[2] >> (43-s); */
     or       r9,r9,r4                /*     fpa.hi |= temp; */
     slw      r10,r6,r13              /*     fpa.lo = n[2] << (s-11); */
     srw      r4,r0,r11               /*     temp = n[3] >> (43-s); */
     or       r10,r10,r4              /*     fpa.lo |= temp; */
     slw      r0,r0,r13               /*     round <<= (s-11); */
     b        noshift                 /*     }     else { */
sh32le:       subfic     r13,r13,0    /*     r13 = 11-s; */
     srw      r9,r5,r13               /*     fpa.hi = n[1] >> (11-s); */
     subfic   r11,r13,32              /*     r11 = 32-(11-s); */
     srw      r4,r6,r13               /*     temp = n[2] >> (11-s); */
     slw      r10,r5,r11              /*     fpa.lo = n[1] << 32-(11-s); */
     or       r10,r10,r4              /*     fpa.lo |= temp; */
     srw      r0,r0,r13               /*     round >>= (11-s); */
     slw      r4,r6,r11               /*     temp = n[2] >> 32-(11-s); */
     or       r0,r0,r4                /*     round |= temp; */
                                      /*     } */
                                      /*   } */
noshift:                              /* } */
/* Fix up number in denormalized range                                  */
     cmpwi    cr0,r8,1                /* if (fpa.exp <     1) */
     RESTREG(31)                      /* restore r31 */
     addis    r5,0,0x8000             /* r5 = 0x80000000 */
     bge+     normexp                 /* { */
     subfic   r13,r8,1                /*   shift = 1-fpa.exp; */
     li       r8,0                    /*   fpa.exp = 0; */
     cmpwi    cr0,r13,32              /*   if ( shift < 32) */
     cmpwi    cr1,r0,0                /*   sticky = (round==0); */
     bge      lose32                  /*   { */
     srw      r0,r0,r13               /*     round >>=     shift; */
     subfic   r11,r13,32              /*     r11 = 32-shift; */
     slw      r6,r10,r11              /*     temp = fpa.lo << (32-shift); */
     or       r0,r0,r6                /*     round |= temp; */
     srw      r10,r10,r13             /*     fpa.lo >>= shift; */
     slw      r6,r9,r11               /*     temp = fpa.hi << (32-shift); */
     or       r10,r10,r6              /*     fpa.lo |= temp; */
     srw      r9,r9,r13               /*     fpa.hi >>= shift; */
/*  Or in bit 11 to detect carry when rounding                          */
     oris     r9,r9,0x0010            /*     fpa.hi |= 0x00100000; */
     beq      cr1,normexp             /*     if (sticky) */
     ori      r0,r0,0x0001            /*     round |= 0x00000001; */
     b        normexp                 /*   } */
lose32:                               /*   else */
                                      /*   { */
     addi     r13,r13,-32             /*     shift -= 32; */
     cmpwi    cr0,r13,32              /*     if (shift     < 32) */
     bge      lose64                  /*     { */
     or.      r6,r0,r10               /*     sticky = (round!=0&&fpa.lo!=0); */
     srw      r0,r10,r13              /*     round = fpa.lo >> shift; */
     subfic   r11,r13,32              /*     r11 = 32-shift; */
     slw      r6,r9,r11               /*     temp = fpa.hi << (shift-32); */
     or       r0,r0,r6                /*     round |= temp; */
     srw      r10,r9,r13              /*     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) */
     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.    r6,r10,0x0001           /*   (((fpa.lo & 0x00000001) && */
     crand    cr0_2,cr7_2,cr0_2       /*     (round == 0x80000000))) */
     beq      noround                 /* { */
     addic.   r10,r10,1               /*   fpa.lo++; */
                                      /*   if (fpa.lo == 0) { */
     addze    r9,r9                   /*     fpa.hi++; */
     addis    r6,0,0x20               /*     r6 = 0x00200000; */
     cmpw     cr0,r9,r6               /*     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:                               /* } */
                                      /* return; */
return_common:
     mr       r3,r9                   /* *FRT = fpa.hi; */
     mr       r4,r10                  /* *FRT = fpa.lo; */
     
     mfctr    r13                     /* restore r13 */
     mtcr     r28                     /* restore cr */
     RESTREG(28)                      /* restore r28 */
     lwz      r1,0(r1)                /* previous stack frame */
     lwz      r0,4(r1)                /* saved link register */
     mtlr     r0                      /* restore link register */

     blr
                                     
a_zero:                               /* fpa == 0; */
     mr       r9,r3                   /* r9,r10 = *FRA; */
     mr       r10,r4        
     bt       cr7_inf,rtn_NaN         /* if (!fpb.inf) goto rtn_NaN; */
     crxor    cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr     r0                      /* r0 = cr; */
     rlwimi   r9,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
     b        return_common           /* return; */
     
rtn_NaN:
     oris     r9,r9,0x7ff8            /* fpa = QNaN; */
     rlwinm   r9,r9,0,0x7fffffff      /* r9 &= 0x7fffffff; */
     b        return_common           /* return; */
                                      
b_zero:                               /* return fpb; */
     mr       r9,r5                   /* r9,r10 = *FRB; */
     mr       r10,r6                  
     bt       cr6_inf,rtn_NaN         /* if (!fpa.inf) goto rtn_NaN; */
     crxor    cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr     r0                      /* r0 = cr; */
     rlwimi   r9,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
     b        return_common           /* return; */
                                     
a_NaN:                                /* return QNaN; */
     mr       r9,r3                   /* r9,r10    = *FRA; */
     mr       r10,r4                 
     oris     r9,r9,0x0008            /* FRA->hi |= 0x80000; */
     b        return_common           /* return; */

b_NaN:                                /* return QNaN; */
     mr       r9,r5                   /* r9,r10    = *FRB; */
     mr       r10,r6          
     oris     r9,r9,0x0008            /* FRB->hi |= 0x80000; */
     b        return_common           /* return; */

a_INF:                                /* return INF; */
b_INF:                                /* return INF; */
     lis      r9,0x7ff0               /* r9 = 0x7ff00000; */
     li       r10,0                   /* r10 = 0; */
     crxor    cr0_0,cr6_sign,cr7_sign /* crbit0 = fpa.sign ^ fpb.sign; */
     mfcr     r0                      /* r0 = cr; */
     rlwimi   r9,r0,0,0x80000000      /* insert r0 bit 0 into r8 bit 0 */
     b        return_common           /* return; */

function_epilog(__muldf3)

⌨️ 快捷键说明

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