return N->hasOneUse();
}]>;
+def X86cmpm_imm_commute : SDNodeXForm<imm, [{
+ uint8_t Imm = X86::getSwappedVCMPImm(N->getZExtValue() & 0x1f);
+ return getI8Imm(Imm, SDLoc(N));
+}]>;
+
multiclass avx512_vcmp_common<X86FoldableSchedWrite sched, X86VectorVTInfo _,
string Name> {
defm rri : AVX512_maskable_cmp<0xC2, MRMSrcReg, _,
// Patterns for selecting with loads in other operand.
def : Pat<(X86cmpm (_.LdFrag addr:$src2), (_.VT _.RC:$src1),
- CommutableCMPCC:$cc),
+ imm:$cc),
(!cast<Instruction>(Name#_.ZSuffix#"rmi") _.RC:$src1, addr:$src2,
- imm:$cc)>;
+ (X86cmpm_imm_commute imm:$cc))>;
def : Pat<(and _.KRCWM:$mask, (X86cmpm_su (_.LdFrag addr:$src2),
(_.VT _.RC:$src1),
- CommutableCMPCC:$cc)),
+ imm:$cc)),
(!cast<Instruction>(Name#_.ZSuffix#"rmik") _.KRCWM:$mask,
_.RC:$src1, addr:$src2,
- imm:$cc)>;
+ (X86cmpm_imm_commute imm:$cc))>;
def : Pat<(X86cmpm (X86VBroadcast (_.ScalarLdFrag addr:$src2)),
- (_.VT _.RC:$src1), CommutableCMPCC:$cc),
+ (_.VT _.RC:$src1), imm:$cc),
(!cast<Instruction>(Name#_.ZSuffix#"rmbi") _.RC:$src1, addr:$src2,
- imm:$cc)>;
+ (X86cmpm_imm_commute imm:$cc))>;
def : Pat<(and _.KRCWM:$mask, (X86cmpm_su (X86VBroadcast
(_.ScalarLdFrag addr:$src2)),
(_.VT _.RC:$src1),
- CommutableCMPCC:$cc)),
+ imm:$cc)),
(!cast<Instruction>(Name#_.ZSuffix#"rmbik") _.KRCWM:$mask,
_.RC:$src1, addr:$src2,
- imm:$cc)>;
+ (X86cmpm_imm_commute imm:$cc))>;
}
multiclass avx512_vcmp_sae<X86FoldableSchedWrite sched, X86VectorVTInfo _> {
// 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)>;
+ imm:$cc)),
+ (VCMPSDZrm FR64X:$src1, addr:$src2, (X86cmpm_imm_commute imm:$cc))>;
def : Pat<(v1i1 (X86cmpms (loadf32 addr:$src2), FR32X:$src1,
- CommutableCMPCC:$cc)),
- (VCMPSSZrm FR32X:$src1, addr:$src2, imm:$cc)>;
+ imm:$cc)),
+ (VCMPSSZrm FR32X:$src1, addr:$src2, (X86cmpm_imm_commute imm:$cc))>;
}
// ----------------------------------------------------------------
define void @ktest_1(<8 x double> %in, double * %base) {
; KNL-LABEL: ktest_1:
; KNL: ## %bb.0:
-; KNL-NEXT: vmovupd (%rdi), %zmm1
-; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k1
+; KNL-NEXT: vcmpgtpd (%rdi), %zmm0, %k1
; KNL-NEXT: vmovupd 8(%rdi), %zmm1 {%k1} {z}
; KNL-NEXT: vcmpltpd %zmm1, %zmm0, %k0 {%k1}
; KNL-NEXT: kmovw %k0, %eax
;
; SKX-LABEL: ktest_1:
; SKX: ## %bb.0:
-; SKX-NEXT: vmovupd (%rdi), %zmm1
-; SKX-NEXT: vcmpltpd %zmm0, %zmm1, %k1
+; SKX-NEXT: vcmpgtpd (%rdi), %zmm0, %k1
; SKX-NEXT: vmovupd 8(%rdi), %zmm1 {%k1} {z}
; SKX-NEXT: vcmpltpd %zmm1, %zmm0, %k0 {%k1}
; SKX-NEXT: kortestb %k0, %k0
;
; AVX512BW-LABEL: ktest_1:
; AVX512BW: ## %bb.0:
-; AVX512BW-NEXT: vmovupd (%rdi), %zmm1
-; AVX512BW-NEXT: vcmpltpd %zmm0, %zmm1, %k1
+; AVX512BW-NEXT: vcmpgtpd (%rdi), %zmm0, %k1
; AVX512BW-NEXT: vmovupd 8(%rdi), %zmm1 {%k1} {z}
; AVX512BW-NEXT: vcmpltpd %zmm1, %zmm0, %k0 {%k1}
; AVX512BW-NEXT: kmovd %k0, %eax
;
; AVX512DQ-LABEL: ktest_1:
; AVX512DQ: ## %bb.0:
-; AVX512DQ-NEXT: vmovupd (%rdi), %zmm1
-; AVX512DQ-NEXT: vcmpltpd %zmm0, %zmm1, %k1
+; AVX512DQ-NEXT: vcmpgtpd (%rdi), %zmm0, %k1
; AVX512DQ-NEXT: vmovupd 8(%rdi), %zmm1 {%k1} {z}
; AVX512DQ-NEXT: vcmpltpd %zmm1, %zmm0, %k0 {%k1}
; AVX512DQ-NEXT: kortestb %k0, %k0
; X86-LABEL: ktest_1:
; X86: ## %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: vmovupd (%eax), %zmm1
-; X86-NEXT: vcmpltpd %zmm0, %zmm1, %k1
+; X86-NEXT: vcmpgtpd (%eax), %zmm0, %k1
; X86-NEXT: vmovupd 8(%eax), %zmm1 {%k1} {z}
; X86-NEXT: vcmpltpd %zmm1, %zmm0, %k0 {%k1}
; X86-NEXT: kortestb %k0, %k0
;
; KNL-LABEL: ktest_2:
; KNL: ## %bb.0:
-; KNL-NEXT: vmovups (%rdi), %zmm2
-; KNL-NEXT: vmovups 64(%rdi), %zmm3
-; KNL-NEXT: vcmpltps %zmm1, %zmm3, %k1
-; KNL-NEXT: vcmpltps %zmm0, %zmm2, %k2
+; KNL-NEXT: vcmpgtps 64(%rdi), %zmm1, %k1
+; KNL-NEXT: vcmpgtps (%rdi), %zmm0, %k2
; KNL-NEXT: vmovups 4(%rdi), %zmm2 {%k2} {z}
; KNL-NEXT: vmovups 68(%rdi), %zmm3 {%k1} {z}
; KNL-NEXT: vcmpltps %zmm3, %zmm1, %k0
;
; SKX-LABEL: ktest_2:
; SKX: ## %bb.0:
-; SKX-NEXT: vmovups (%rdi), %zmm2
-; SKX-NEXT: vmovups 64(%rdi), %zmm3
-; SKX-NEXT: vcmpltps %zmm0, %zmm2, %k1
-; SKX-NEXT: vcmpltps %zmm1, %zmm3, %k2
+; SKX-NEXT: vcmpgtps (%rdi), %zmm0, %k1
+; SKX-NEXT: vcmpgtps 64(%rdi), %zmm1, %k2
; SKX-NEXT: kunpckwd %k1, %k2, %k0
; SKX-NEXT: vmovups 68(%rdi), %zmm2 {%k2} {z}
; SKX-NEXT: vmovups 4(%rdi), %zmm3 {%k1} {z}
;
; AVX512BW-LABEL: ktest_2:
; AVX512BW: ## %bb.0:
-; AVX512BW-NEXT: vmovups (%rdi), %zmm2
-; AVX512BW-NEXT: vmovups 64(%rdi), %zmm3
-; AVX512BW-NEXT: vcmpltps %zmm0, %zmm2, %k1
-; AVX512BW-NEXT: vcmpltps %zmm1, %zmm3, %k2
+; AVX512BW-NEXT: vcmpgtps (%rdi), %zmm0, %k1
+; AVX512BW-NEXT: vcmpgtps 64(%rdi), %zmm1, %k2
; AVX512BW-NEXT: kunpckwd %k1, %k2, %k0
; AVX512BW-NEXT: vmovups 68(%rdi), %zmm2 {%k2} {z}
; AVX512BW-NEXT: vmovups 4(%rdi), %zmm3 {%k1} {z}
;
; AVX512DQ-LABEL: ktest_2:
; AVX512DQ: ## %bb.0:
-; AVX512DQ-NEXT: vmovups (%rdi), %zmm2
-; AVX512DQ-NEXT: vmovups 64(%rdi), %zmm3
-; AVX512DQ-NEXT: vcmpltps %zmm1, %zmm3, %k1
-; AVX512DQ-NEXT: vcmpltps %zmm0, %zmm2, %k2
+; AVX512DQ-NEXT: vcmpgtps 64(%rdi), %zmm1, %k1
+; AVX512DQ-NEXT: vcmpgtps (%rdi), %zmm0, %k2
; AVX512DQ-NEXT: vmovups 4(%rdi), %zmm2 {%k2} {z}
; AVX512DQ-NEXT: vmovups 68(%rdi), %zmm3 {%k1} {z}
; AVX512DQ-NEXT: vcmpltps %zmm3, %zmm1, %k0
; X86-LABEL: ktest_2:
; X86: ## %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: vmovups (%eax), %zmm2
-; X86-NEXT: vmovups 64(%eax), %zmm3
-; X86-NEXT: vcmpltps %zmm0, %zmm2, %k1
-; X86-NEXT: vcmpltps %zmm1, %zmm3, %k2
+; X86-NEXT: vcmpgtps (%eax), %zmm0, %k1
+; X86-NEXT: vcmpgtps 64(%eax), %zmm1, %k2
; X86-NEXT: kunpckwd %k1, %k2, %k0
; X86-NEXT: vmovups 68(%eax), %zmm2 {%k2} {z}
; X86-NEXT: vmovups 4(%eax), %zmm3 {%k1} {z}