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