📄 ppc_itof.s
字号:
/* fpopt/ppc_itof.S, pl_FPE_common, pl_linux 11/24/03 16:17:42 */
/*----------------------------------------------------------------------------- */
/* Copyright (c) 2003, IBM Corporation */
/* All rights reserved. */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* * Redistributions of source code must retain the above */
/* copyright notice, this list of conditions and the following */
/* disclaimer. */
/* * Redistributions in binary form must reproduce the above */
/* copyright notice, this list of conditions and the following */
/* disclaimer in the documentation and/or other materials */
/* provided with the distribution. */
/* * Neither the name of IBM nor the names of its contributors */
/* may be used to endorse or promote products derived from this */
/* software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */
/* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, */
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */
/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, */
/* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */
/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR */
/* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE */
/* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------- */
/* */
/* Function: Convert 4-byte integer to single floating point value. */
/* Input: r3 */
/* Output: r3 */
/* Notes: 1. No stack frame is created for this function, so the following */
/* registers must be preserved, as required by ABI specification: */
/* LR, CR0, R1, R2, R13-R31 */
/* 2. operation performed according to IEEE754-1985 standard with */
/* rounding mode = nearest even. */
/* */
/*----------------------------------------------------------------------------- */
#include <ppc4xx.inc>
#include "fpeLib.inc"
function_prolog(__floatsisf)
/* Save CR in r6 */
mfcr r6
/* Handle the 0 case */
or. r5, r3, r3
bne nonzero /* r3 already 0, so just return */
mtcr r6
blr
nonzero:
rlwinm r5, r5, 0, 0x80000000 /* preserve only the sign bit */
bge posnumb
neg r3, r3 /* make negative number positive */
posnumb:
cntlzw r7, r3 /* how many leading zeros? */
addic. r7, r7, -8 /* leave room for exponent */
li r10, 150 /* initial exponent value */
beq noshift
blt rightshift
slw r3, r3, r7 /* more than 8 leading 0's, so left shift */
b noshift
rightshift:
neg r8, r7 /* r8 = - shift count */
addi r9, r7, 32 /* r9 = 32 - shift count */
slw r4, r3, r9
srw r3, r3, r8
/* round to nearest even */
lis r8,0x8000 /* r5 = 0x80000000 (guard bit) */
cmplw cr7,r4,r8 /* if ((round >= 0x80000000) || */
blt cr7,noshift /* */
andi. r6,r3,0x0001 /* (((fpa.lo & 0x00000001) && */
crand cr0_2,cr7_2,cr0_2 /* (round == 0x80000000))) */
beq noshift /* { */
addi r3,r3,1 /* fpa.lo++; */
lis r4,0x0100 /* r6 = 0x01000000; */
cmpw cr0,r3,r4 /* if (fpa.hi == 0x01000000), overflow */
bne noshift /* { */
addi r10,r10,1 /* fpa.exp++; */
/* } */
/* } */
noshift: /* now put result together */
subf r7, r7, r10 /* adjust biased exponent by shift count */
rlwimi r3, r7, 23, 0x7f800000 /* put exponent and fraction together */
or r3, r3, r5 /* add in sign */
mtcr r6
blr
function_epilog(__floatsisf)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -