?? ppc_fdiv.s
字號:
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 + -