📄 ppc_itod.s
字号:
/* fpopt/ppc_itod.S, pl_FPE_common, pl_linux 11/24/03 16:17:41 */
/*----------------------------------------------------------------------------- */
/* 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 double floating point value. */
/* Input: r3 */
/* Output: r3,r4 */
/* 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. */
/* */
/*----------------------------------------------------------------------------- */
#include <ppc4xx.inc>
#include "fpeLib.inc"
function_prolog(__floatsidf)
/* Save CR in r6 */
mfcr r6
/* Handle the 0 case */
or. r5,r3,r3
li r4,0 /* init lo-word to 0 in any case */
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,-11 /* leave room for exponent */
beq noshift
blt rightshift
slw r3,r3,r7 /* more than 11 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
noshift: /* now put result together */
subfic r7,r7,1043 /* adjust biased exponent by shift count */
rlwimi r3,r7,20,0x7ff00000 /* put exponent and fraction together */
or r3,r3,r5 /* add in sign */
mtcr r6
blr
function_epilog(__floatsidf)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -