[llvm-commits] [llvm] r57932 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Dale Johannesen dalej at apple.com
Tue Oct 21 16:07:50 PDT 2008


Author: johannes
Date: Tue Oct 21 18:07:49 2008
New Revision: 57932

URL: http://llvm.org/viewvc/llvm-project?rev=57932&view=rev
Log:
Add comments to explain uint64->f64 algorithm,
well, sort of.  (Algorithm by Ian Ollmann.)


Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=57932&r1=57931&r2=57932&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Oct 21 18:07:49 2008
@@ -4696,6 +4696,41 @@
   if (Op.getValueType() != MVT::f64 || !X86ScalarSSEf64)
     return SDValue();
   
+  // This algorithm is not obvious.  Here it is in C code, more or less:
+/*
+ double uint64_to_double( uint32_t hi, uint32_t lo )
+  {
+    static const __m128i exp = { 0x4330000045300000ULL, 0 };
+    static const __m128d bias = { 0x1.0p84, 0x1.0p52 };
+
+    //copy ints to xmm registers
+    __m128i xh = _mm_cvtsi32_si128( hi );
+    __m128i xl = _mm_cvtsi32_si128( lo );
+
+    //combine into low half of a single xmm register
+    __m128i x = _mm_unpacklo_epi32( xh, xl );
+    __m128d d;
+    double sd;
+
+    //merge in appropriate exponents to give the integer bits the 
+    // right magnitude
+    x = _mm_unpacklo_epi32( x, exp );
+
+    //subtract away the biases to deal with the IEEE-754 double precision
+    //implicit 1
+    d = _mm_sub_pd( (__m128d) x, bias );
+
+    //All conversions up to here are exact. The correctly rounded result is 
+    // calculated using the
+    //current rounding mode using the following horizontal add.
+    d = _mm_add_sd( d, _mm_unpackhi_pd( d, d ) );
+    _mm_store_sd( &sd, d );   //since we are returning doubles in XMM, this
+    //store doesn't really need to be here (except maybe to zero the other
+    //double)
+    return sd;
+  }
+*/
+
   // Get a XMM-vector-sized stack slot.
   unsigned Size = 128/8;
   MachineFunction &MF = DAG.getMachineFunction();





More information about the llvm-commits mailing list