diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrCompiler.td | 40 |
2 files changed, 34 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index b89b2b6e720..cb79484d26e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -27464,7 +27464,9 @@ static bool isCMOVPseudo(MachineInstr &MI) { case X86::CMOV_RFP64: case X86::CMOV_RFP80: case X86::CMOV_VR128: + case X86::CMOV_VR128X: case X86::CMOV_VR256: + case X86::CMOV_VR256X: case X86::CMOV_VR512: case X86::CMOV_VK8: case X86::CMOV_VK16: @@ -29060,7 +29062,9 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, case X86::CMOV_RFP64: case X86::CMOV_RFP80: case X86::CMOV_VR128: + case X86::CMOV_VR128X: case X86::CMOV_VR256: + case X86::CMOV_VR256X: case X86::CMOV_VR512: case X86::CMOV_VK8: case X86::CMOV_VK16: diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td index 5b55da781e0..8b6d31cba50 100644 --- a/llvm/lib/Target/X86/X86InstrCompiler.td +++ b/llvm/lib/Target/X86/X86InstrCompiler.td @@ -590,8 +590,14 @@ let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Uses = [EFLAGS] in { defm _FR32 : CMOVrr_PSEUDO<FR32, f32>; defm _FR64 : CMOVrr_PSEUDO<FR64, f64>; - defm _VR128 : CMOVrr_PSEUDO<VR128, v2i64>; - defm _VR256 : CMOVrr_PSEUDO<VR256, v4i64>; + let Predicates = [NoVLX] in { + defm _VR128 : CMOVrr_PSEUDO<VR128, v2i64>; + defm _VR256 : CMOVrr_PSEUDO<VR256, v4i64>; + } + let Predicates = [HasVLX] in { + defm _VR128X : CMOVrr_PSEUDO<VR128X, v2i64>; + defm _VR256X : CMOVrr_PSEUDO<VR256X, v4i64>; + } defm _VR512 : CMOVrr_PSEUDO<VR512, v8i64>; defm _VK8 : CMOVrr_PSEUDO<VK8, v8i1>; defm _VK16 : CMOVrr_PSEUDO<VK16, v16i1>; @@ -601,14 +607,28 @@ let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Uses = [EFLAGS] in { def : Pat<(f128 (X86cmov VR128:$t, VR128:$f, imm:$cond, EFLAGS)), (CMOV_VR128 VR128:$t, VR128:$f, imm:$cond)>; -def : Pat<(v4f32 (X86cmov VR128:$t, VR128:$f, imm:$cond, EFLAGS)), - (CMOV_VR128 VR128:$t, VR128:$f, imm:$cond)>; -def : Pat<(v2f64 (X86cmov VR128:$t, VR128:$f, imm:$cond, EFLAGS)), - (CMOV_VR128 VR128:$t, VR128:$f, imm:$cond)>; -def : Pat<(v8f32 (X86cmov VR256:$t, VR256:$f, imm:$cond, EFLAGS)), - (CMOV_VR256 VR256:$t, VR256:$f, imm:$cond)>; -def : Pat<(v4f64 (X86cmov VR256:$t, VR256:$f, imm:$cond, EFLAGS)), - (CMOV_VR256 VR256:$t, VR256:$f, imm:$cond)>; + +let Predicates = [NoVLX] in { + def : Pat<(v4f32 (X86cmov VR128:$t, VR128:$f, imm:$cond, EFLAGS)), + (CMOV_VR128 VR128:$t, VR128:$f, imm:$cond)>; + def : Pat<(v2f64 (X86cmov VR128:$t, VR128:$f, imm:$cond, EFLAGS)), + (CMOV_VR128 VR128:$t, VR128:$f, imm:$cond)>; + def : Pat<(v8f32 (X86cmov VR256:$t, VR256:$f, imm:$cond, EFLAGS)), + (CMOV_VR256 VR256:$t, VR256:$f, imm:$cond)>; + def : Pat<(v4f64 (X86cmov VR256:$t, VR256:$f, imm:$cond, EFLAGS)), + (CMOV_VR256 VR256:$t, VR256:$f, imm:$cond)>; +} +let Predicates = [HasVLX] in { + def : Pat<(v4f32 (X86cmov VR128X:$t, VR128X:$f, imm:$cond, EFLAGS)), + (CMOV_VR128X VR128X:$t, VR128X:$f, imm:$cond)>; + def : Pat<(v2f64 (X86cmov VR128X:$t, VR128X:$f, imm:$cond, EFLAGS)), + (CMOV_VR128X VR128X:$t, VR128X:$f, imm:$cond)>; + def : Pat<(v8f32 (X86cmov VR256X:$t, VR256X:$f, imm:$cond, EFLAGS)), + (CMOV_VR256X VR256X:$t, VR256X:$f, imm:$cond)>; + def : Pat<(v4f64 (X86cmov VR256X:$t, VR256X:$f, imm:$cond, EFLAGS)), + (CMOV_VR256X VR256X:$t, VR256X:$f, imm:$cond)>; +} + def : Pat<(v16f32 (X86cmov VR512:$t, VR512:$f, imm:$cond, EFLAGS)), (CMOV_VR512 VR512:$t, VR512:$f, imm:$cond)>; def : Pat<(v8f64 (X86cmov VR512:$t, VR512:$f, imm:$cond, EFLAGS)), |

