⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppc_itod.s

📁 powerpc 405 优化过的硬浮点库
💻 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 + -