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

📄 ppc_itof.s

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