mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
[AVX512] Enabling MIN/MAX lowering.
Added lowering tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224127 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
de48903a20
commit
a4f5a5525d
@ -22606,6 +22606,21 @@ matchIntegerMINMAX(SDValue Cond, EVT VT, SDValue LHS, SDValue RHS,
|
||||
bool NeedSplit = false;
|
||||
switch (VT.getSimpleVT().SimpleTy) {
|
||||
default: return std::make_pair(0, false);
|
||||
case MVT::v4i64:
|
||||
case MVT::v2i64:
|
||||
if (!Subtarget->hasVLX())
|
||||
return std::make_pair(0, false);
|
||||
break;
|
||||
case MVT::v64i8:
|
||||
case MVT::v32i16:
|
||||
if (!Subtarget->hasBWI())
|
||||
return std::make_pair(0, false);
|
||||
break;
|
||||
case MVT::v16i32:
|
||||
case MVT::v8i64:
|
||||
if (!Subtarget->hasAVX512())
|
||||
return std::make_pair(0, false);
|
||||
break;
|
||||
case MVT::v32i8:
|
||||
case MVT::v16i16:
|
||||
case MVT::v8i32:
|
||||
|
@ -2852,7 +2852,7 @@ multiclass PDI_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
|
||||
multiclass PDI_binop_all<bits<8> opc, string OpcodeStr, SDNode Opcode,
|
||||
ValueType OpVT128, ValueType OpVT256,
|
||||
OpndItins itins, bit IsCommutable = 0> {
|
||||
let Predicates = [HasAVX] in
|
||||
let Predicates = [HasAVX, NoVLX] in
|
||||
defm V#NAME : PDI_binop_rm<opc, !strconcat("v", OpcodeStr), Opcode, OpVT128,
|
||||
VR128, loadv2i64, i128mem, itins, IsCommutable, 0>, VEX_4V;
|
||||
|
||||
@ -2860,7 +2860,7 @@ let Constraints = "$src1 = $dst" in
|
||||
defm NAME : PDI_binop_rm<opc, OpcodeStr, Opcode, OpVT128, VR128,
|
||||
memopv2i64, i128mem, itins, IsCommutable, 1>;
|
||||
|
||||
let Predicates = [HasAVX2] in
|
||||
let Predicates = [HasAVX2, NoVLX] in
|
||||
defm V#NAME#Y : PDI_binop_rm<opc, !strconcat("v", OpcodeStr), Opcode,
|
||||
OpVT256, VR256, loadv4i64, i256mem, itins,
|
||||
IsCommutable, 0>, VEX_4V, VEX_L;
|
||||
@ -7100,7 +7100,7 @@ multiclass SS48I_binop_rm2<bits<8> opc, string OpcodeStr, SDNode OpNode,
|
||||
Sched<[itins.Sched.Folded, ReadAfterLd]>;
|
||||
}
|
||||
|
||||
let Predicates = [HasAVX] in {
|
||||
let Predicates = [HasAVX, NoVLX] in {
|
||||
let isCommutable = 0 in
|
||||
defm VPMINSB : SS48I_binop_rm<0x38, "vpminsb", X86smin, v16i8, VR128,
|
||||
loadv2i64, i128mem, 0, SSE_INTALU_ITINS_P>,
|
||||
@ -7131,7 +7131,7 @@ let Predicates = [HasAVX] in {
|
||||
SSE_INTMUL_ITINS_P, 1, 0>, VEX_4V;
|
||||
}
|
||||
|
||||
let Predicates = [HasAVX2] in {
|
||||
let Predicates = [HasAVX2, NoVLX] in {
|
||||
let isCommutable = 0 in
|
||||
defm VPMINSBY : SS48I_binop_rm<0x38, "vpminsb", X86smin, v32i8, VR256,
|
||||
loadv4i64, i256mem, 0, SSE_INTALU_ITINS_P>,
|
||||
|
@ -37,15 +37,15 @@ define <16 x i32> @test3(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %yp) nounwin
|
||||
ret <16 x i32> %max
|
||||
}
|
||||
|
||||
define <16 x i32> @test4_unsigned(<16 x i32> %x, <16 x i32> %y) nounwind {
|
||||
define <16 x i32> @test4_unsigned(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
|
||||
; CHECK-LABEL: test4_unsigned:
|
||||
; CHECK: ## BB#0:
|
||||
; CHECK-NEXT: vpcmpnltud %zmm1, %zmm0, %k1
|
||||
; CHECK-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovdqa32 %zmm2, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovaps %zmm1, %zmm0
|
||||
; CHECK-NEXT: retq
|
||||
%mask = icmp uge <16 x i32> %x, %y
|
||||
%max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %y
|
||||
%max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
|
||||
ret <16 x i32> %max
|
||||
}
|
||||
|
||||
@ -61,15 +61,15 @@ define <8 x i64> @test5(<8 x i64> %x, <8 x i64> %y) nounwind {
|
||||
ret <8 x i64> %max
|
||||
}
|
||||
|
||||
define <8 x i64> @test6_unsigned(<8 x i64> %x, <8 x i64> %y) nounwind {
|
||||
define <8 x i64> @test6_unsigned(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1) nounwind {
|
||||
; CHECK-LABEL: test6_unsigned:
|
||||
; CHECK: ## BB#0:
|
||||
; CHECK-NEXT: vpcmpnleuq %zmm1, %zmm0, %k1
|
||||
; CHECK-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovdqa64 %zmm2, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovaps %zmm1, %zmm0
|
||||
; CHECK-NEXT: retq
|
||||
%mask = icmp ugt <8 x i64> %x, %y
|
||||
%max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %y
|
||||
%max = select <8 x i1> %mask, <8 x i64> %x1, <8 x i64> %y
|
||||
ret <8 x i64> %max
|
||||
}
|
||||
|
||||
@ -196,15 +196,15 @@ define <8 x i64> @test15(<8 x i64>%a, <8 x i64>%b) {
|
||||
ret <8 x i64>%res
|
||||
}
|
||||
|
||||
define <16 x i32> @test16(<16 x i32> %x, <16 x i32> %y) nounwind {
|
||||
define <16 x i32> @test16(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
|
||||
; CHECK-LABEL: test16:
|
||||
; CHECK: ## BB#0:
|
||||
; CHECK-NEXT: vpcmpled %zmm0, %zmm1, %k1
|
||||
; CHECK-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovdqa32 %zmm2, %zmm1 {%k1}
|
||||
; CHECK-NEXT: vmovaps %zmm1, %zmm0
|
||||
; CHECK-NEXT: retq
|
||||
%mask = icmp sge <16 x i32> %x, %y
|
||||
%max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %y
|
||||
%max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
|
||||
ret <16 x i32> %max
|
||||
}
|
||||
|
||||
|
@ -14,9 +14,9 @@ define <64 x i8> @test1(<64 x i8> %x, <64 x i8> %y) nounwind {
|
||||
; CHECK: vpcmpgtb {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqu8 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <64 x i8> @test2(<64 x i8> %x, <64 x i8> %y) nounwind {
|
||||
define <64 x i8> @test2(<64 x i8> %x, <64 x i8> %y, <64 x i8> %x1) nounwind {
|
||||
%mask = icmp sgt <64 x i8> %x, %y
|
||||
%max = select <64 x i1> %mask, <64 x i8> %x, <64 x i8> %y
|
||||
%max = select <64 x i1> %mask, <64 x i8> %x1, <64 x i8> %y
|
||||
ret <64 x i8> %max
|
||||
}
|
||||
|
||||
@ -34,9 +34,9 @@ define <32 x i16> @test3(<32 x i16> %x, <32 x i16> %y, <32 x i16> %x1) nounwind
|
||||
; CHECK: vpcmpnleub {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqu8 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <64 x i8> @test4(<64 x i8> %x, <64 x i8> %y) nounwind {
|
||||
define <64 x i8> @test4(<64 x i8> %x, <64 x i8> %y, <64 x i8> %x1) nounwind {
|
||||
%mask = icmp ugt <64 x i8> %x, %y
|
||||
%max = select <64 x i1> %mask, <64 x i8> %x, <64 x i8> %y
|
||||
%max = select <64 x i1> %mask, <64 x i8> %x1, <64 x i8> %y
|
||||
ret <64 x i8> %max
|
||||
}
|
||||
|
||||
|
@ -14,9 +14,9 @@ define <4 x i64> @test256_1(<4 x i64> %x, <4 x i64> %y) nounwind {
|
||||
; CHECK: vpcmpgtq {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqa64 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <4 x i64> @test256_2(<4 x i64> %x, <4 x i64> %y) nounwind {
|
||||
define <4 x i64> @test256_2(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
|
||||
%mask = icmp sgt <4 x i64> %x, %y
|
||||
%max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %y
|
||||
%max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
|
||||
ret <4 x i64> %max
|
||||
}
|
||||
|
||||
@ -34,9 +34,9 @@ define <8 x i32> @test256_3(<8 x i32> %x, <8 x i32> %y, <8 x i32> %x1) nounwind
|
||||
; CHECK: vpcmpnleuq {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqa64 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <4 x i64> @test256_4(<4 x i64> %x, <4 x i64> %y) nounwind {
|
||||
define <4 x i64> @test256_4(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1) nounwind {
|
||||
%mask = icmp ugt <4 x i64> %x, %y
|
||||
%max = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> %y
|
||||
%max = select <4 x i1> %mask, <4 x i64> %x1, <4 x i64> %y
|
||||
ret <4 x i64> %max
|
||||
}
|
||||
|
||||
@ -204,9 +204,9 @@ define <2 x i64> @test128_1(<2 x i64> %x, <2 x i64> %y) nounwind {
|
||||
; CHECK: vpcmpgtq {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqa64 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <2 x i64> @test128_2(<2 x i64> %x, <2 x i64> %y) nounwind {
|
||||
define <2 x i64> @test128_2(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
|
||||
%mask = icmp sgt <2 x i64> %x, %y
|
||||
%max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %y
|
||||
%max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
|
||||
ret <2 x i64> %max
|
||||
}
|
||||
|
||||
@ -224,9 +224,9 @@ define <4 x i32> @test128_3(<4 x i32> %x, <4 x i32> %y, <4 x i32> %x1) nounwind
|
||||
; CHECK: vpcmpnleuq {{.*%k[0-7]}}
|
||||
; CHECK: vmovdqa64 {{.*}}%k1
|
||||
; CHECK: ret
|
||||
define <2 x i64> @test128_4(<2 x i64> %x, <2 x i64> %y) nounwind {
|
||||
define <2 x i64> @test128_4(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1) nounwind {
|
||||
%mask = icmp ugt <2 x i64> %x, %y
|
||||
%max = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> %y
|
||||
%max = select <2 x i1> %mask, <2 x i64> %x1, <2 x i64> %y
|
||||
ret <2 x i64> %max
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user