svn commit: r242657 - stable/9/contrib/llvm/lib/Target/X86

Dimitry Andric dim at FreeBSD.org
Tue Nov 6 07:46:07 UTC 2012


Author: dim
Date: Tue Nov  6 07:46:07 2012
New Revision: 242657
URL: http://svnweb.freebsd.org/changeset/base/242657

Log:
  MFC r242380:
  
  Pull in r165377 from upstream llvm trunk:
  
    X86: fcmov doesn't handle all possible EFLAGS, fall back to a branch
    for the others.
  
    Otherwise it will try to use SSE patterns and fail horribly if sse is
    disabled.
  
    Fixes PR14035.
  
  This should fix the following assertion failure:
  
    Assertion failed: (Reg >= X86::FP0 && Reg <= X86::FP6 && "Expected FP
    register!"), function getFPReg, file
    contrib/llvm/lib/Target/X86/X86FloatingPoint.cpp, line 330.
  
  which can show up when compiling contrib/compiler-rt, using -march=i686
  through -march=pentium3 (CPU's which do support fcmov, but don't support
  SSE2).

Modified:
  stable/9/contrib/llvm/lib/Target/X86/X86InstrCompiler.td
Directory Properties:
  stable/9/contrib/llvm/   (props changed)

Modified: stable/9/contrib/llvm/lib/Target/X86/X86InstrCompiler.td
==============================================================================
--- stable/9/contrib/llvm/lib/Target/X86/X86InstrCompiler.td	Tue Nov  6 06:19:11 2012	(r242656)
+++ stable/9/contrib/llvm/lib/Target/X86/X86InstrCompiler.td	Tue Nov  6 07:46:07 2012	(r242657)
@@ -443,6 +443,11 @@ def CMOV_GR16 : I<0, Pseudo,
                     "#CMOV_GR16* PSEUDO!",
                     [(set GR16:$dst,
                       (X86cmov GR16:$src1, GR16:$src2, imm:$cond, EFLAGS))]>;
+} // Predicates = [NoCMov]
+
+// fcmov doesn't handle all possible EFLAGS, provide a fallback if there is no
+// SSE1.
+let Predicates = [FPStackf32] in
 def CMOV_RFP32 : I<0, Pseudo,
                     (outs RFP32:$dst),
                     (ins RFP32:$src1, RFP32:$src2, i8imm:$cond),
@@ -450,6 +455,9 @@ def CMOV_RFP32 : I<0, Pseudo,
                     [(set RFP32:$dst,
                       (X86cmov RFP32:$src1, RFP32:$src2, imm:$cond,
                                                   EFLAGS))]>;
+// fcmov doesn't handle all possible EFLAGS, provide a fallback if there is no
+// SSE2.
+let Predicates = [FPStackf64] in
 def CMOV_RFP64 : I<0, Pseudo,
                     (outs RFP64:$dst),
                     (ins RFP64:$src1, RFP64:$src2, i8imm:$cond),
@@ -464,7 +472,6 @@ def CMOV_RFP80 : I<0, Pseudo,
                     [(set RFP80:$dst,
                       (X86cmov RFP80:$src1, RFP80:$src2, imm:$cond,
                                                   EFLAGS))]>;
-} // Predicates = [NoCMov]
 } // UsesCustomInserter = 1, Uses = [EFLAGS]
 
 


More information about the svn-src-all mailing list