summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-09-30 17:02:39 +0000
committerCraig Topper <craig.topper@intel.com>2017-09-30 17:02:39 +0000
commit619569841ad69800ee55ef53e13bf07c4c459776 (patch)
tree5342d46fd9bf47d15f88f6a1d9d498ecfd71d14e /llvm/lib/Target
parent5bd43bce07d229ef9cf5fcf55f2c06ce87c94f01 (diff)
downloadbcm5719-llvm-619569841ad69800ee55ef53e13bf07c4c459776.tar.gz
bcm5719-llvm-619569841ad69800ee55ef53e13bf07c4c459776.zip
[AVX-512] Add patterns to make fp compare instructions commutable during isel.
llvm-svn: 314598
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86InstrAVX512.td39
-rw-r--r--llvm/lib/Target/X86/X86InstrSSE.td52
2 files changed, 90 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td
index 59064b3ccaf..6eb9607bb9d 100644
--- a/llvm/lib/Target/X86/X86InstrAVX512.td
+++ b/llvm/lib/Target/X86/X86InstrAVX512.td
@@ -2077,7 +2077,33 @@ multiclass avx512_vcmp_common<X86VectorVTInfo _> {
"$cc, ${src2}"##_.BroadcastStr##", $src1",
"$src1, ${src2}"##_.BroadcastStr##", $cc">,EVEX_B;
}
- }
+ }
+
+ // Patterns for selecting with loads in other operand.
+ def : Pat<(X86cmpm (_.LdFrag addr:$src2), (_.VT _.RC:$src1),
+ CommutableCMPCC:$cc),
+ (!cast<Instruction>(NAME#_.ZSuffix#"rmi") _.RC:$src1, addr:$src2,
+ imm:$cc)>;
+
+ def : Pat<(and _.KRCWM:$mask, (X86cmpm (_.LdFrag addr:$src2),
+ (_.VT _.RC:$src1),
+ CommutableCMPCC:$cc)),
+ (!cast<Instruction>(NAME#_.ZSuffix#"rmik") _.KRCWM:$mask,
+ _.RC:$src1, addr:$src2,
+ imm:$cc)>;
+
+ def : Pat<(X86cmpm (X86VBroadcast (_.ScalarLdFrag addr:$src2)),
+ (_.VT _.RC:$src1), CommutableCMPCC:$cc),
+ (!cast<Instruction>(NAME#_.ZSuffix#"rmbi") _.RC:$src1, addr:$src2,
+ imm:$cc)>;
+
+ def : Pat<(and _.KRCWM:$mask, (X86cmpm (X86VBroadcast
+ (_.ScalarLdFrag addr:$src2)),
+ (_.VT _.RC:$src1),
+ CommutableCMPCC:$cc)),
+ (!cast<Instruction>(NAME#_.ZSuffix#"rmbik") _.KRCWM:$mask,
+ _.RC:$src1, addr:$src2,
+ imm:$cc)>;
}
multiclass avx512_vcmp_sae<X86VectorVTInfo _> {
@@ -2119,6 +2145,17 @@ defm VCMPPS : avx512_vcmp<avx512vl_f32_info>,
AVX512PSIi8Base, EVEX_4V, EVEX_CD8<32, CD8VF>;
+// Patterns to select fp compares with load as first operand.
+let Predicates = [HasAVX512] in {
+ def : Pat<(v1i1 (X86cmpms (loadf64 addr:$src2), FR64X:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPSDZrm FR64X:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(v1i1 (X86cmpms (loadf32 addr:$src2), FR32X:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPSSZrm FR32X:$src1, addr:$src2, imm:$cc)>;
+}
+
// ----------------------------------------------------------------
// FPClass
//handle fpclass instruction mask = op(reg_scalar,imm)
diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td
index 77eb33d32b4..e328c2fa6a4 100644
--- a/llvm/lib/Target/X86/X86InstrSSE.td
+++ b/llvm/lib/Target/X86/X86InstrSSE.td
@@ -2308,6 +2308,58 @@ let Constraints = "$src1 = $dst" in {
SSEPackedDouble, memopv2f64, SSE_ALU_F64P>, PD;
}
+def CommutableCMPCC : PatLeaf<(imm), [{
+ return (N->getZExtValue() == 0x00 || N->getZExtValue() == 0x03 ||
+ N->getZExtValue() == 0x04 || N->getZExtValue() == 0x07);
+}]>;
+
+// Patterns to select compares with loads in first operand.
+let Predicates = [HasAVX] in {
+ def : Pat<(v4f64 (X86cmpp (loadv4f64 addr:$src2), VR256:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPPDYrmi VR256:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(v8f32 (X86cmpp (loadv8f32 addr:$src2), VR256:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPPSYrmi VR256:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(v2f64 (X86cmpp (loadv2f64 addr:$src2), VR128:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPPDrmi VR128:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(v4f32 (X86cmpp (loadv4f32 addr:$src2), VR128:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPPSrmi VR128:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(f64 (X86cmps (loadf64 addr:$src2), FR64:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPSDrm FR64:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(f32 (X86cmps (loadf32 addr:$src2), FR32:$src1,
+ CommutableCMPCC:$cc)),
+ (VCMPSSrm FR32:$src1, addr:$src2, imm:$cc)>;
+}
+
+let Predicates = [UseSSE2] in {
+ def : Pat<(v2f64 (X86cmpp (memopv2f64 addr:$src2), VR128:$src1,
+ CommutableCMPCC:$cc)),
+ (CMPPDrmi VR128:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(f64 (X86cmps (loadf64 addr:$src2), FR64:$src1,
+ CommutableCMPCC:$cc)),
+ (CMPSDrm FR64:$src1, addr:$src2, imm:$cc)>;
+}
+
+let Predicates = [UseSSE1] in {
+ def : Pat<(v4f32 (X86cmpp (memopv4f32 addr:$src2), VR128:$src1,
+ CommutableCMPCC:$cc)),
+ (CMPPSrmi VR128:$src1, addr:$src2, imm:$cc)>;
+
+ def : Pat<(f32 (X86cmps (loadf32 addr:$src2), FR32:$src1,
+ CommutableCMPCC:$cc)),
+ (CMPSSrm FR32:$src1, addr:$src2, imm:$cc)>;
+}
+
//===----------------------------------------------------------------------===//
// SSE 1 & 2 - Shuffle Instructions
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud