diff options
| author | Craig Topper <craig.topper@intel.com> | 2019-05-11 16:00:28 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2019-05-11 16:00:28 +0000 | 
| commit | c9d7484aa36e974a265b88dfbaa75cf8ea7cd5bc (patch) | |
| tree | 46d07f0ed9fef99682f4f1d9c36800a316a08976 /llvm/lib/Target | |
| parent | 74a436596d7381eed99bccca6037e0d698647eda (diff) | |
| download | bcm5719-llvm-c9d7484aa36e974a265b88dfbaa75cf8ea7cd5bc.tar.gz bcm5719-llvm-c9d7484aa36e974a265b88dfbaa75cf8ea7cd5bc.zip  | |
[X86] Add CMOV_FR32X/CMOV_FR64X pseudo instructions. Use them in fast isel to fix a machine verifier error after adding test cases.
Fast isel picks the FR32X/FR64X register classes when lowering pseudo select, but it didn't have the right opcode to go with it.
llvm-svn: 360524
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrCompiler.td | 10 | 
3 files changed, 14 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index e9202a654ff..c397d7046c3 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -2281,8 +2281,10 @@ bool X86FastISel::X86FastEmitPseudoSelect(MVT RetVT, const Instruction *I) {    case MVT::i8:  Opc = X86::CMOV_GR8;  break;    case MVT::i16: Opc = X86::CMOV_GR16; break;    case MVT::i32: Opc = X86::CMOV_GR32; break; -  case MVT::f32: Opc = X86::CMOV_FR32; break; -  case MVT::f64: Opc = X86::CMOV_FR64; break; +  case MVT::f32: Opc = Subtarget->hasAVX512() ? X86::CMOV_FR32X +                                              : X86::CMOV_FR32; break; +  case MVT::f64: Opc = Subtarget->hasAVX512() ? X86::CMOV_FR64X +                                              : X86::CMOV_FR64; break;    }    const Value *Cond = I->getOperand(0); diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index f7f3d38f68e..22f05a5f05a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -30477,7 +30477,9 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,    case X86::TLSCall_64:      return EmitLoweredTLSCall(MI, BB);    case X86::CMOV_FR32: +  case X86::CMOV_FR32X:    case X86::CMOV_FR64: +  case X86::CMOV_FR64X:    case X86::CMOV_GR8:    case X86::CMOV_GR16:    case X86::CMOV_GR32: diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td index e14a871000e..228979253ea 100644 --- a/llvm/lib/Target/X86/X86InstrCompiler.td +++ b/llvm/lib/Target/X86/X86InstrCompiler.td @@ -568,8 +568,14 @@ let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Uses = [EFLAGS] in {    defm _RFP80 : CMOVrr_PSEUDO<RFP80, f80>; -  defm _FR32   : CMOVrr_PSEUDO<FR32, f32>; -  defm _FR64   : CMOVrr_PSEUDO<FR64, f64>; +  let Predicates = [NoAVX512] in { +    defm _FR32   : CMOVrr_PSEUDO<FR32, f32>; +    defm _FR64   : CMOVrr_PSEUDO<FR64, f64>; +  } +  let Predicates = [HasAVX512] in { +    defm _FR32X  : CMOVrr_PSEUDO<FR32X, f32>; +    defm _FR64X  : CMOVrr_PSEUDO<FR64X, f64>; +  }    let Predicates = [NoVLX] in {      defm _VR128  : CMOVrr_PSEUDO<VR128, v2i64>;      defm _VR256  : CMOVrr_PSEUDO<VR256, v4i64>;  | 

