Subversion Repositories HelenOS-historic

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2005 Josef Cejka
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #include<sftypes.h>
  30. #include<arithmetic.h>
  31.  
  32. /** Add two Float32 numbers with same signs
  33.  */
  34. float32 addFloat32(float32 a, float32 b)
  35. {
  36.     int expdiff;
  37.     __u32 exp1,exp2,mant1,mant2;
  38.    
  39.     expdiff=a.parts.exp - b.parts.exp;
  40.     if (expdiff<0) {
  41.         if (isFloat32NaN(b)) {
  42.             //TODO: fix SigNaN
  43.             if (isFloat32SigNaN(b)) {
  44.             };
  45.             return b;
  46.         };
  47.        
  48.         if (b.parts.exp==0xFF) {
  49.             return b;
  50.         }
  51.        
  52.         mant1=b.parts.mantisa;
  53.         exp1=b.parts.exp;
  54.         mant2=a.parts.mantisa;
  55.         exp2=a.parts.exp;
  56.         expdiff*=-1;
  57.     } else {
  58.         if (isFloat32NaN(a)) {
  59.             //TODO: fix SigNaN
  60.             if ((isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {
  61.             };
  62.             return a;
  63.         };
  64.        
  65.         if (a.parts.exp==0xFF) {
  66.             return a;
  67.         }
  68.        
  69.         mant1=a.parts.mantisa;
  70.         exp1=a.parts.exp;
  71.         mant2=b.parts.mantisa;
  72.         exp2=b.parts.exp;
  73.     };
  74.    
  75.     if (exp1==0) {
  76.         //both are denormalized
  77.         mant1+=mant2;
  78.         if (mant1&0xF00000) {
  79.             a.parts.exp=1;
  80.         };
  81.         a.parts.mantisa=mant1;
  82.         return a;
  83.     };
  84.    
  85.     // create some space for rounding
  86.     mant1<<=6;
  87.     mant2<<=6;
  88.    
  89.     mant1|=0x20000000; //add hidden bit
  90.    
  91.    
  92.     if (exp2==0) {
  93.         --expdiff; 
  94.     } else {
  95.         mant2|=0x20000000; //hidden bit
  96.     };
  97.    
  98.     if (expdiff>24) {
  99.          goto done;
  100.          };
  101.    
  102.     mant2>>=expdiff;
  103.     mant1+=mant2;
  104. done:
  105.     if (mant1&0x40000000) {
  106.         ++exp1;
  107.         mant1>>=1;
  108.     };
  109.    
  110.     //rounding - if first bit after mantisa is set then round up
  111.     mant1+=0x20;
  112.    
  113.     a.parts.exp=exp1;
  114.     a.parts.mantisa=mant1>>6;
  115.     return a;
  116. };
  117.  
  118. /** Substract two float32 numbers with same signs
  119.  */
  120. float32 subFloat32(float32 a, float32 b)
  121. {
  122.    
  123.    
  124. };
  125.  
  126.