📄 ppc_fadds.s
字号:
or r10,r10,r6 /* fpa.lo |= temp; */
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 = 46-s; */
srw r6,r10,r11 /* temp == fpa.low >> (46-s); */
slw r10,r10,r5 /* fpa.lo <<= (s-8); */
or r9,r9,r6 /* fpa.hi |= temp; */
b noshift /* } */
gt32: /* else */
/* { */
cntlzw r5,r10 /* s = cntlz(fpa.lo); */
cmpwi cr0,r5,32 /* if (s == 32) */
blt+ not_zero /* { Return value of +0.0 */
li r3,0 /* r3 = 0; */
mtcr r0 /* restore cr */
blr /* return; */
not_zero: /* } */
addi r6,r5,32-8 /* temp = s+(32-8 ); */
subf r8,r6,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); */
li r10,0 /* fpa.lo = 0; */
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-(8-s); */
/* } */
/* } */
noshift: /* } */
/* Check for single overflow */
cmpwi cr0,r8,SEXPMAX /* if (fpa.exp > SEXPMAX) */
bge res_INF /* Set results to INF */
/* Check for number in denormalised range */
cmpwi cr0,r8,1 /* else if (fpa.exp >= 1 */
blt denormexp /* { */
/* round fpa to nearest */
lis r5,0x8000 /* guard bit */
cmplw cr7,r10,r5 /* if ((round >= 0x80000000) || */
blt cr7,noround /* */
andi. r6,r9,0x00000001 /* (((fpa.lobit == 0) && */
crand cr0_2,cr7_2,cr0_2 /* (round == 0x80000000))) */
bt cr0_2,noround /* { */
addi r9,r9,1 /* fpa.hi++; */
lis r6,0x0100 /* */
cmpw cr0,r9,r6 /* if (fpa.hi == 0x01000000) */
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 */
cmpwi cr0,r12,25 /* if ( shift < 25) */
bge rnd2zero /* { */
subfic r11,r12,32 /* r11 = 32-shift; */
mtctr r0 /* (save r0) */
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); */
srw r4,r9,r12 /* r4 = fpa.hi >> shift; */
or r5,r5,r6 /* r5 |= temp; */
beq nostk /* if bits shifted out of fpa.lo */
oris r5,r5,0x2000 /* set sticky bit; */
nostk:
lis r6,0x8000
cmplw cr1,r0,r6 /* if (round >= 0x80000000) guard set */
blt cr1,nornd /* { */
andi. r0,r5,0x00000001 /* if (((fpa.lobit==0) && */
crand cr0_2,cr0_2,cr1_2 /* (round == 0x10000000)) */
beq+ nornd /* goto nornd; */
addi r4,r4,1 /* r4++; */
lis r6,0x0080
cmplw cr0,r4,r6 /* if (fpa.hi == 0x00800000) carry out */
bne+ nornd /* { */
addi r8,r8,1 /* fpa.exp++; */
/* } */
nornd: /* } */
mfctr r0 /* (restore r0) */
mr r9,r4
b noround /* } */
rnd2zero: /* else */
/* { */
li r8,0 /* fpa.exp = 0; */
li r9,0 /* fpa.hi = 0; */
li r10,0 /* fpa.lo = 0; */
/* } */
noround: /* } */
cmpwi cr0,r8,SEXPMAX /* if (fpa.exp > DEXPBIAS+SEXPMAX) */
bgt res_INF /* Set results to INF */
/* 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 r0 /* restore cr */
blr /* return; */
a_zero:
mr r3,r4 /* copy fpbb into return reg */
bf cr7_zero,a_zeroret /* if (fpb.zero) fixup sign */
rlwinm r3,r3,0,0x7fffffff /* assume no sign */
crand cr0_0,cr6_sign,cr7_sign /* if (fpa.sign AND fpb.sign */
bf cr0,a_zeroret
oris r3,r3,0x8000 /* set sign bit */
a_zeroret:
mtcr r0 /* restore cr */
blr /* return; */
b_zero: /* return fpa (already in r3) */
mtcr r0 /* restore cr */
blr /* return; */
a_NaNorINF:
/* fpa is either INF or NaN */
mr r8,r3 /* r8 = FRA; */
rlwinm. r5,r8,0,0x007fffff /* if (fpa.hi == 0 */
beq a_INF /* goto a_INF; */
a_NaN: /* return QNaN; */
oris r3,r8,0x0040 /* FRA->hi |= 0x400000; */
mtcr r0 /* restore cr */
blr /* return; */
b_NaNorINF:
/* fpb is either INF or NaN */
mr r8,r4 /* r8 = FRB; */
/* The following is necessary because fsubs will have already flipped the bit */
rlwinm r8,r8,0,0x7fffffff /* clear sign bit */
bf cr7_sign,no_set_sign /* if (fpb.sign) */
oris r8,r8,0x8000 /* set sign bit */
no_set_sign:
rlwinm. r4,r8,0,0x007fffff /* if (fpb.hi == 0 */
beq b_INF /* goto b_INF; */
b_NaN: /* return QNaN; */
oris r3,r8,0x0040 /* FRB->hi |= 0x400000; */
mtcr r0 /* restore cr */
blr /* return; */
a_INF: /* fpa is infinity */
mr r8,r4 /* r8 = FRB */
rlwinm. r11,r8,0,0x007fffff /* is FRB.fraction non-zero? */
crandc cr7_NaN,cr3_2,cr0_2 /* if max exponent & non-zero fraction */
bt cr7_NaN,b_NaN /* B is NAN */
crxor cr0_0,cr6_sign,cr7_sign /* if (fpa.sign ^ fpb.sign && */
crand cr0_0,cr0_0,cr3_2 /* fpb.inf) */
bf cr0_0,rtn_INF /* { */
li r3,0xffffffff /* return -QNAN; */
mtcr r0 /* } */
blr
rtn_INF:
/* r3 = infinity */
mtcr r0 /* restore cr */
blr /* return; */
b_INF: /* fpb is infinity */
mr r3,r8 /* *FRT = r8; */
mtcr r0 /* restore cr */
blr /* return; */
res_INF: /* result is infinity */
lis r3,0x7f80
bf cr6_sign,inf_pos /* if (fpa.sign) { */
oris r3,r3,0x8000 /* fpa.hi |= 0x80000000; */
inf_pos: /* } */
mtcr r0 /* restore cr */
blr /* return; */
function_epilog(__addsf3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -