📄 ppc_fmul.s
字号:
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 + -