[llvm-commits] [llvm] r54964 - /llvm/trunk/lib/Target/X86/README-SSE.txt
Chris Lattner
sabre at nondot.org
Mon Aug 18 17:41:02 PDT 2008
Author: lattner
Date: Mon Aug 18 19:41:02 2008
New Revision: 54964
URL: http://llvm.org/viewvc/llvm-project?rev=54964&view=rev
Log:
add a note
Modified:
llvm/trunk/lib/Target/X86/README-SSE.txt
Modified: llvm/trunk/lib/Target/X86/README-SSE.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/README-SSE.txt?rev=54964&r1=54963&r2=54964&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/README-SSE.txt (original)
+++ llvm/trunk/lib/Target/X86/README-SSE.txt Mon Aug 18 19:41:02 2008
@@ -839,3 +839,40 @@
shufps $2, %xmm1, %xmm2
shufps $132, %xmm2, %xmm0
movaps %xmm0, 0
+
+//===---------------------------------------------------------------------===//
+rdar://6037315
+
+llvm-gcc-4.2 does the following for uint32_t -> float conversions on i386:
+
+ uint32_t x;
+ float y = (float)x;
+
+becomes:
+
+movl %eax, -8(%ebp) // write x to the stack
+movl $0x3ff00000, -4(%ebp) // 2^52 + x as a double at -4(%ebp)
+movsd -8(%ebp), %xmm0
+subsd [2^52 double], %xmm0 // subtract 2^52 -- this is exact
+cvtsd2ss %xmm0, %xmm0 // convert to single -- rounding happens here
+
+On merom/yonah, this takes a substantial stall. The following is a much
+better option:
+
+movd %eax, %xmm0 // load x into low word of xmm0
+movsd [2^52 double], %xmm1 // load 2^52 into xmm1
+orpd %xmm1, %xmm0 // 2^52 + x in double precision
+subsd %xmm1, %xmm0 // x in double precision
+cvtsd2ss %xmm0, %xmm0 // x rounded to single precision
+
+IF we don't already need PIC, then the following is even faster still, at a
+small cost to code size:
+
+movl $0x3ff00000, %ecx // conjure high word of 2^52
+movd %ecx, %xmm1
+movss %eax, %xmm0 // load x into low word of xmm0
+psllq $32, %xmm1 // 2^52
+orpd %xmm1, %xmm0 // 2^52 + x in double precision
+subsd %xmm1, %xmm0 // x in double precision
+cvtsd2ss %xmm0, %xmm0 // x in single precision
+
More information about the llvm-commits
mailing list