|
@@ -1,17 +1,13 @@
|
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s
|
|
|
|
|
|
-declare <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float>, i8*, <16 x i32>, i16, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.dps.512 (i8*, i16, <16 x i32>, <16 x float>, i32)
|
|
declare void @llvm.x86.avx512.scatter.dps.512 (i8*, i16, <16 x i32>, <16 x float>, i32)
|
|
-declare <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double>, i8*, <8 x i32>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.dpd.512 (i8*, i8, <8 x i32>, <8 x double>, i32)
|
|
declare void @llvm.x86.avx512.scatter.dpd.512 (i8*, i8, <8 x i32>, <8 x double>, i32)
|
|
|
|
|
|
-declare <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float>, i8*, <8 x i64>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.qps.512 (i8*, i8, <8 x i64>, <8 x float>, i32)
|
|
declare void @llvm.x86.avx512.scatter.qps.512 (i8*, i8, <8 x i64>, <8 x float>, i32)
|
|
-declare <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double>, i8*, <8 x i64>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.qpd.512 (i8*, i8, <8 x i64>, <8 x double>, i32)
|
|
declare void @llvm.x86.avx512.scatter.qpd.512 (i8*, i8, <8 x i64>, <8 x double>, i32)
|
|
|
|
|
|
-define void @gather_mask_dps(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_dps(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_dps:
|
|
; CHECK-LABEL: gather_mask_dps:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -21,13 +17,14 @@ define void @gather_mask_dps(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8*
|
|
; CHECK-NEXT: vscatterdps %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vscatterdps %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i16 %mask to <16 x i1>
|
|
|
|
+ %x = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
|
|
%ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
%ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
call void @llvm.x86.avx512.scatter.dps.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x float> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.dps.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x float> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_dpd(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_dpd(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_dpd:
|
|
; CHECK-LABEL: gather_mask_dpd:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -37,13 +34,14 @@ define void @gather_mask_dpd(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %b
|
|
; CHECK-NEXT: vscatterdpd %zmm1, (%rdx,%ymm0,4) {%k1}
|
|
; CHECK-NEXT: vscatterdpd %zmm1, (%rdx,%ymm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double> %src, i8* %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
%ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
call void @llvm.x86.avx512.scatter.dpd.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x double> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.dpd.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x double> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_qps(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_qps(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_qps:
|
|
; CHECK-LABEL: gather_mask_qps:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -53,13 +51,14 @@ define void @gather_mask_qps(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %ba
|
|
; CHECK-NEXT: vscatterqps %ymm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vscatterqps %ymm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x float> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x float> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_qpd:
|
|
; CHECK-LABEL: gather_mask_qpd:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -69,7 +68,8 @@ define void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %b
|
|
; CHECK-NEXT: vscatterqpd %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vscatterqpd %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
call void @llvm.x86.avx512.scatter.qpd.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x double> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.qpd.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x double> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
@@ -77,17 +77,13 @@ define void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %b
|
|
;;
|
|
;;
|
|
;; Integer Gather/Scatter
|
|
;; Integer Gather/Scatter
|
|
;;
|
|
;;
|
|
-declare <16 x i32> @llvm.x86.avx512.gather.dpi.512 (<16 x i32>, i8*, <16 x i32>, i16, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.dpi.512 (i8*, i16, <16 x i32>, <16 x i32>, i32)
|
|
declare void @llvm.x86.avx512.scatter.dpi.512 (i8*, i16, <16 x i32>, <16 x i32>, i32)
|
|
-declare <8 x i64> @llvm.x86.avx512.gather.dpq.512 (<8 x i64>, i8*, <8 x i32>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.dpq.512 (i8*, i8, <8 x i32>, <8 x i64>, i32)
|
|
declare void @llvm.x86.avx512.scatter.dpq.512 (i8*, i8, <8 x i32>, <8 x i64>, i32)
|
|
|
|
|
|
-declare <8 x i32> @llvm.x86.avx512.gather.qpi.512 (<8 x i32>, i8*, <8 x i64>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.qpi.512 (i8*, i8, <8 x i64>, <8 x i32>, i32)
|
|
declare void @llvm.x86.avx512.scatter.qpi.512 (i8*, i8, <8 x i64>, <8 x i32>, i32)
|
|
-declare <8 x i64> @llvm.x86.avx512.gather.qpq.512 (<8 x i64>, i8*, <8 x i64>, i8, i32)
|
|
|
|
declare void @llvm.x86.avx512.scatter.qpq.512 (i8*, i8, <8 x i64>, <8 x i64>, i32)
|
|
declare void @llvm.x86.avx512.scatter.qpq.512 (i8*, i8, <8 x i64>, <8 x i64>, i32)
|
|
|
|
|
|
-define void @gather_mask_dd(<16 x i32> %ind, <16 x i32> %src, i16 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_dd(<16 x i32> %ind, <16 x i32> %src, i16 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_dd:
|
|
; CHECK-LABEL: gather_mask_dd:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -97,13 +93,14 @@ define void @gather_mask_dd(<16 x i32> %ind, <16 x i32> %src, i16 %mask, i8* %ba
|
|
; CHECK-NEXT: vpscatterdd %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vpscatterdd %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <16 x i32> @llvm.x86.avx512.gather.dpi.512 (<16 x i32> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i16 %mask to <16 x i1>
|
|
|
|
+ %x = call <16 x i32> @llvm.x86.avx512.mask.gather.dpi.512(<16 x i32> %src, i8* %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
|
|
%ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
%ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
call void @llvm.x86.avx512.scatter.dpi.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x i32> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.dpi.512 (i8* %stbuf, i16 %mask, <16 x i32>%ind2, <16 x i32> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_qd(<8 x i64> %ind, <8 x i32> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_qd(<8 x i64> %ind, <8 x i32> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_qd:
|
|
; CHECK-LABEL: gather_mask_qd:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -113,13 +110,14 @@ define void @gather_mask_qd(<8 x i64> %ind, <8 x i32> %src, i8 %mask, i8* %base,
|
|
; CHECK-NEXT: vpscatterqd %ymm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vpscatterqd %ymm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x i32> @llvm.x86.avx512.gather.qpi.512 (<8 x i32> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x i32> @llvm.x86.avx512.mask.gather.qpi.512(<8 x i32> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
call void @llvm.x86.avx512.scatter.qpi.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i32> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.qpi.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i32> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_qq(<8 x i64> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_qq(<8 x i64> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_qq:
|
|
; CHECK-LABEL: gather_mask_qq:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -129,13 +127,14 @@ define void @gather_mask_qq(<8 x i64> %ind, <8 x i64> %src, i8 %mask, i8* %base,
|
|
; CHECK-NEXT: vpscatterqq %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vpscatterqq %zmm1, (%rdx,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x i64> @llvm.x86.avx512.gather.qpq.512 (<8 x i64> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x i64> @llvm.x86.avx512.mask.gather.qpq.512(<8 x i64> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
call void @llvm.x86.avx512.scatter.qpq.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i64> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.qpq.512 (i8* %stbuf, i8 %mask, <8 x i64>%ind2, <8 x i64> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_dq(<8 x i32> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_dq(<8 x i32> %ind, <8 x i64> %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_dq:
|
|
; CHECK-LABEL: gather_mask_dq:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -145,13 +144,14 @@ define void @gather_mask_dq(<8 x i32> %ind, <8 x i64> %src, i8 %mask, i8* %base,
|
|
; CHECK-NEXT: vpscatterdq %zmm1, (%rdx,%ymm0,4) {%k1}
|
|
; CHECK-NEXT: vpscatterdq %zmm1, (%rdx,%ymm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x i64> @llvm.x86.avx512.gather.dpq.512 (<8 x i64> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512(<8 x i64> %src, i8* %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
|
|
%ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
%ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
|
|
call void @llvm.x86.avx512.scatter.dpq.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x i64> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.dpq.512 (i8* %stbuf, i8 %mask, <8 x i32>%ind2, <8 x i64> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_dpd_execdomain(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_dpd_execdomain(<8 x i32> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_dpd_execdomain:
|
|
; CHECK-LABEL: gather_mask_dpd_execdomain:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -159,12 +159,13 @@ define void @gather_mask_dpd_execdomain(<8 x i32> %ind, <8 x double> %src, i8 %m
|
|
; CHECK-NEXT: vmovapd %zmm1, (%rdx)
|
|
; CHECK-NEXT: vmovapd %zmm1, (%rdx)
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x double> @llvm.x86.avx512.gather.dpd.512 (<8 x double> %src, i8* %base, <8 x i32>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double> %src, i8* %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
|
|
store <8 x double> %x, <8 x double>* %stbuf
|
|
store <8 x double> %x, <8 x double>* %stbuf
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_mask_qpd_execdomain(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf) {
|
|
|
|
|
|
+define void @gather_mask_qpd_execdomain(<8 x i64> %ind, <8 x double> %src, i8 %mask, i8* %base, <8 x double>* %stbuf) {
|
|
; CHECK-LABEL: gather_mask_qpd_execdomain:
|
|
; CHECK-LABEL: gather_mask_qpd_execdomain:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
@@ -172,34 +173,37 @@ define void @gather_mask_qpd_execdomain(<8 x i64> %ind, <8 x double> %src, i8 %m
|
|
; CHECK-NEXT: vmovapd %zmm1, (%rdx)
|
|
; CHECK-NEXT: vmovapd %zmm1, (%rdx)
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x double> @llvm.x86.avx512.gather.qpd.512 (<8 x double> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %x = call <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
store <8 x double> %x, <8 x double>* %stbuf
|
|
store <8 x double> %x, <8 x double>* %stbuf
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define <16 x float> @gather_mask_dps_execdomain(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base) {
|
|
|
|
|
|
+define <16 x float> @gather_mask_dps_execdomain(<16 x i32> %ind, <16 x float> %src, i16 %mask, i8* %base) {
|
|
; CHECK-LABEL: gather_mask_dps_execdomain:
|
|
; CHECK-LABEL: gather_mask_dps_execdomain:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: vgatherdps (%rsi,%zmm0,4), %zmm1 {%k1}
|
|
; CHECK-NEXT: vgatherdps (%rsi,%zmm0,4), %zmm1 {%k1}
|
|
; CHECK-NEXT: vmovaps %zmm1, %zmm0
|
|
; CHECK-NEXT: vmovaps %zmm1, %zmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 %mask, i32 4)
|
|
|
|
- ret <16 x float> %res;
|
|
|
|
|
|
+ %1 = bitcast i16 %mask to <16 x i1>
|
|
|
|
+ %res = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
|
|
|
|
+ ret <16 x float> %res
|
|
}
|
|
}
|
|
|
|
|
|
-define <8 x float> @gather_mask_qps_execdomain(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base) {
|
|
|
|
|
|
+define <8 x float> @gather_mask_qps_execdomain(<8 x i64> %ind, <8 x float> %src, i8 %mask, i8* %base) {
|
|
; CHECK-LABEL: gather_mask_qps_execdomain:
|
|
; CHECK-LABEL: gather_mask_qps_execdomain:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: kmovd %edi, %k1
|
|
; CHECK-NEXT: vgatherqps (%rsi,%zmm0,4), %ymm1 {%k1}
|
|
; CHECK-NEXT: vgatherqps (%rsi,%zmm0,4), %ymm1 {%k1}
|
|
; CHECK-NEXT: vmovaps %ymm1, %ymm0
|
|
; CHECK-NEXT: vmovaps %ymm1, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 %mask, i32 4)
|
|
|
|
- ret <8 x float> %res;
|
|
|
|
|
|
+ %1 = bitcast i8 %mask to <8 x i1>
|
|
|
|
+ %res = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, i8* %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
|
|
|
|
+ ret <8 x float> %res
|
|
}
|
|
}
|
|
|
|
|
|
-define void @scatter_mask_dpd_execdomain(<8 x i32> %ind, <8 x double>* %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @scatter_mask_dpd_execdomain(<8 x i32> %ind, <8 x double>* %src, i8 %mask, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: scatter_mask_dpd_execdomain:
|
|
; CHECK-LABEL: scatter_mask_dpd_execdomain:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
@@ -251,18 +255,18 @@ define void @scatter_mask_qps_execdomain(<8 x i64> %ind, <8 x float>* %src, i8 %
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define void @gather_qps(<8 x i64> %ind, <8 x float> %src, i8* %base, i8* %stbuf) {
|
|
|
|
|
|
+define void @gather_qps(<8 x i64> %ind, <8 x float> %src, i8* %base, i8* %stbuf) {
|
|
; CHECK-LABEL: gather_qps:
|
|
; CHECK-LABEL: gather_qps:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
-; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1
|
|
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
|
|
+; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k2
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k2
|
|
; CHECK-NEXT: vgatherqps (%rdi,%zmm0,4), %ymm1 {%k2}
|
|
; CHECK-NEXT: vgatherqps (%rdi,%zmm0,4), %ymm1 {%k2}
|
|
; CHECK-NEXT: vpaddq {{.*}}(%rip), %zmm0, %zmm0
|
|
; CHECK-NEXT: vpaddq {{.*}}(%rip), %zmm0, %zmm0
|
|
; CHECK-NEXT: vscatterqps %ymm1, (%rsi,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vscatterqps %ymm1, (%rsi,%zmm0,4) {%k1}
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %x = call <8 x float> @llvm.x86.avx512.gather.qps.512 (<8 x float> %src, i8* %base, <8 x i64>%ind, i8 -1, i32 4)
|
|
|
|
|
|
+ %x = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, i8* %base, <8 x i64> %ind, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 4)
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
%ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
|
|
call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 -1, <8 x i64>%ind2, <8 x float> %x, i32 4)
|
|
call void @llvm.x86.avx512.scatter.qps.512 (i8* %stbuf, i8 -1, <8 x i64>%ind2, <8 x float> %x, i32 4)
|
|
ret void
|
|
ret void
|
|
@@ -292,10 +296,8 @@ define void @prefetch(<8 x i64> %ind, i8* %base) {
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-declare <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double>, i8*, <2 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <2 x double>@test_int_x86_avx512_gather3div2_df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div2_df:
|
|
|
|
|
|
+define <2 x double> @test_int_x86_avx512_mask_gather3div2_df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div2_df:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
@@ -304,31 +306,33 @@ define <2 x double>@test_int_x86_avx512_gather3div2_df(<2 x double> %x0, i8* %x1
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vaddpd %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vaddpd %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <2 x double> @llvm.x86.avx512.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res = call <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <2 x double> %res, %res1
|
|
%res2 = fadd <2 x double> %res, %res1
|
|
ret <2 x double> %res2
|
|
ret <2 x double> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <2 x i64> @llvm.x86.avx512.gather3div2.di(<2 x i64>, i8*, <2 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <2 x i64>@test_int_x86_avx512_gather3div2_di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div2_di:
|
|
|
|
|
|
+define <2 x i64> @test_int_x86_avx512_mask_gather3div2_di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div2_di:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%xmm1,8), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%xmm1,8), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpaddq %xmm0, %xmm0, %xmm0
|
|
; CHECK-NEXT: vpaddq %xmm0, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <2 x i64> @llvm.x86.avx512.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 8)
|
|
|
|
- %res1 = call <2 x i64> @llvm.x86.avx512.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 8)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res = call <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> %extract1, i32 8)
|
|
|
|
+ %2 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res1 = call <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> %extract, i32 8)
|
|
%res2 = add <2 x i64> %res, %res1
|
|
%res2 = add <2 x i64> %res, %res1
|
|
ret <2 x i64> %res2
|
|
ret <2 x i64> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double>, i8*, <4 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x double>@test_int_x86_avx512_gather3div4_df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div4_df:
|
|
|
|
|
|
+define <4 x double> @test_int_x86_avx512_mask_gather3div4_df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_df:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1,4), %ymm0 {%k1}
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1,4), %ymm0 {%k1}
|
|
@@ -337,16 +341,16 @@ define <4 x double>@test_int_x86_avx512_gather3div4_df(<4 x double> %x0, i8* %x1
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vgatherqpd (%rdi,%ymm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vaddpd %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: vaddpd %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x double> @llvm.x86.avx512.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <4 x double> %res, %res1
|
|
%res2 = fadd <4 x double> %res, %res1
|
|
ret <4 x double> %res2
|
|
ret <4 x double> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x i64> @llvm.x86.avx512.gather3div4.di(<4 x i64>, i8*, <4 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x i64>@test_int_x86_avx512_gather3div4_di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div4_di:
|
|
|
|
|
|
+define <4 x i64> @test_int_x86_avx512_mask_gather3div4_di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_di:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%ymm1,8), %ymm0 {%k1}
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%ymm1,8), %ymm0 {%k1}
|
|
@@ -355,16 +359,16 @@ define <4 x i64>@test_int_x86_avx512_gather3div4_di(<4 x i64> %x0, i8* %x1, <4 x
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%ymm1,8), %ymm2 {%k1}
|
|
; CHECK-NEXT: vpgatherqq (%rdi,%ymm1,8), %ymm2 {%k1}
|
|
; CHECK-NEXT: vpaddq %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: vpaddq %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x i64> @llvm.x86.avx512.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 8)
|
|
|
|
- %res1 = call <4 x i64> @llvm.x86.avx512.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 8)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> %extract, i32 8)
|
|
|
|
+ %res1 = call <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 8)
|
|
%res2 = add <4 x i64> %res, %res1
|
|
%res2 = add <4 x i64> %res, %res1
|
|
ret <4 x i64> %res2
|
|
ret <4 x i64> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float>, i8*, <2 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x float>@test_int_x86_avx512_gather3div4_sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div4_sf:
|
|
|
|
|
|
+define <4 x float> @test_int_x86_avx512_mask_gather3div4_sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_sf:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherqps (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vgatherqps (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
@@ -373,34 +377,34 @@ define <4 x float>@test_int_x86_avx512_gather3div4_sf(<4 x float> %x0, i8* %x1,
|
|
; CHECK-NEXT: vgatherqps (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vgatherqps (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x float> @llvm.x86.avx512.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res = call <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
ret <4 x float> %res2
|
|
ret <4 x float> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32>, i8*, <2 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x i32>@test_int_x86_avx512_gather3div4_si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div4_si:
|
|
|
|
|
|
+define <4 x i32> @test_int_x86_avx512_mask_gather3div4_si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_si:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
-; CHECK-NEXT: kmovd %esi, %k1
|
|
|
|
-; CHECK-NEXT: kxnorw %k0, %k0, %k2
|
|
|
|
|
|
+; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
-; CHECK-NEXT: vpgatherqd (%rdi,%xmm1,4), %xmm2 {%k2}
|
|
|
|
|
|
+; CHECK-NEXT: vpgatherqd (%rdi,%xmm1,4), %xmm2 {%k1}
|
|
|
|
+; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherqd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpgatherqd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 -1, i32 4)
|
|
|
|
- %res1 = call <4 x i32> @llvm.x86.avx512.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
|
|
+ %res = call <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 4)
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32> %x0, i8* %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
|
|
%res2 = add <4 x i32> %res, %res1
|
|
%res2 = add <4 x i32> %res, %res1
|
|
ret <4 x i32> %res2
|
|
ret <4 x i32> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float>, i8*, <4 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x float>@test_int_x86_avx512_gather3div8_sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div8_sf:
|
|
|
|
|
|
+define <4 x float> @test_int_x86_avx512_mask_gather3div8_sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div8_sf:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherqps (%rdi,%ymm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vgatherqps (%rdi,%ymm1,4), %xmm0 {%k1}
|
|
@@ -410,16 +414,16 @@ define <4 x float>@test_int_x86_avx512_gather3div8_sf(<4 x float> %x0, i8* %x1,
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x float> @llvm.x86.avx512.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
ret <4 x float> %res2
|
|
ret <4 x float> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32>, i8*, <4 x i64>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x i32>@test_int_x86_avx512_gather3div8_si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3div8_si:
|
|
|
|
|
|
+define <4 x i32> @test_int_x86_avx512_mask_gather3div8_si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3div8_si:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vmovdqa %xmm0, %xmm2
|
|
; CHECK-NEXT: vmovdqa %xmm0, %xmm2
|
|
@@ -429,16 +433,18 @@ define <4 x i32>@test_int_x86_avx512_gather3div8_si(<4 x i32> %x0, i8* %x1, <4 x
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: vzeroupper
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x i32> @llvm.x86.avx512.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, i8 %x3, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> %extract1, i32 4)
|
|
|
|
+ %2 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32> %x0, i8* %x1, <4 x i64> %x2, <4 x i1> %extract, i32 2)
|
|
%res2 = add <4 x i32> %res, %res1
|
|
%res2 = add <4 x i32> %res, %res1
|
|
ret <4 x i32> %res2
|
|
ret <4 x i32> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <2 x double>@test_int_x86_avx512_gather3siv2_df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv2_df:
|
|
|
|
|
|
+define <2 x double> @test_int_x86_avx512_mask_gather3siv2_df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv2_df:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
@@ -447,31 +453,33 @@ define <2 x double>@test_int_x86_avx512_gather3siv2_df(<2 x double> %x0, i8* %x1
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vaddpd %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vaddpd %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <2 x double> @llvm.x86.avx512.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res = call <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, <2 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double> %x0, i8* %x1, <4 x i32> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <2 x double> %res, %res1
|
|
%res2 = fadd <2 x double> %res, %res1
|
|
ret <2 x double> %res2
|
|
ret <2 x double> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <2 x i64> @llvm.x86.avx512.gather3siv2.di(<2 x i64>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <2 x i64>@test_int_x86_avx512_gather3siv2_di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv2_di:
|
|
|
|
|
|
+define <2 x i64> @test_int_x86_avx512_mask_gather3siv2_di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv2_di:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherdq (%rdi,%xmm1,8), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpgatherdq (%rdi,%xmm1,8), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpaddq %xmm0, %xmm0, %xmm0
|
|
; CHECK-NEXT: vpaddq %xmm0, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <2 x i64> @llvm.x86.avx512.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
|
|
|
|
- %res1 = call <2 x i64> @llvm.x86.avx512.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res = call <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, <2 x i1> %extract1, i32 8)
|
|
|
|
+ %2 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <2 x i32> <i32 0, i32 1>
|
|
|
|
+ %res1 = call <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64> %x0, i8* %x1, <4 x i32> %x2, <2 x i1> %extract, i32 8)
|
|
%res2 = add <2 x i64> %res, %res1
|
|
%res2 = add <2 x i64> %res, %res1
|
|
ret <2 x i64> %res2
|
|
ret <2 x i64> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x double>@test_int_x86_avx512_gather3siv4_df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv4_df:
|
|
|
|
|
|
+define <4 x double> @test_int_x86_avx512_mask_gather3siv4_df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_df:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,4), %ymm0 {%k1}
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,4), %ymm0 {%k1}
|
|
@@ -480,31 +488,33 @@ define <4 x double>@test_int_x86_avx512_gather3siv4_df(<4 x double> %x0, i8* %x1
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vgatherdpd (%rdi,%xmm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vaddpd %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: vaddpd %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x double> @llvm.x86.avx512.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <4 x double> %res, %res1
|
|
%res2 = fadd <4 x double> %res, %res1
|
|
ret <4 x double> %res2
|
|
ret <4 x double> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x i64> @llvm.x86.avx512.gather3siv4.di(<4 x i64>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x i64>@test_int_x86_avx512_gather3siv4_di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv4_di:
|
|
|
|
|
|
+define <4 x i64> @test_int_x86_avx512_mask_gather3siv4_di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_di:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherdq (%rdi,%xmm1,8), %ymm0 {%k1}
|
|
; CHECK-NEXT: vpgatherdq (%rdi,%xmm1,8), %ymm0 {%k1}
|
|
; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm0
|
|
; CHECK-NEXT: vpaddq %ymm0, %ymm0, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x i64> @llvm.x86.avx512.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
|
|
|
|
- %res1 = call <4 x i64> @llvm.x86.avx512.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 8)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> %extract1, i32 8)
|
|
|
|
+ %2 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res1 = call <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> %extract, i32 8)
|
|
%res2 = add <4 x i64> %res, %res1
|
|
%res2 = add <4 x i64> %res, %res1
|
|
ret <4 x i64> %res2
|
|
ret <4 x i64> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x float>@test_int_x86_avx512_gather3siv4_sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv4_sf:
|
|
|
|
|
|
+define <4 x float> @test_int_x86_avx512_mask_gather3siv4_sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_sf:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherdps (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
; CHECK-NEXT: vgatherdps (%rdi,%xmm1,4), %xmm0 {%k1}
|
|
@@ -513,34 +523,34 @@ define <4 x float>@test_int_x86_avx512_gather3siv4_sf(<4 x float> %x0, i8* %x1,
|
|
; CHECK-NEXT: vgatherdps (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vgatherdps (%rdi,%xmm1,2), %xmm2 {%k1}
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: vaddps %xmm2, %xmm0, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <4 x float> @llvm.x86.avx512.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res = call <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> %extract, i32 4)
|
|
|
|
+ %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
%res2 = fadd <4 x float> %res, %res1
|
|
ret <4 x float> %res2
|
|
ret <4 x float> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32>, i8*, <4 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <4 x i32>@test_int_x86_avx512_gather3siv4_si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv4_si:
|
|
|
|
|
|
+define <4 x i32> @test_int_x86_avx512_mask_gather3siv4_si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_si:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
-; CHECK-NEXT: kmovd %esi, %k1
|
|
|
|
-; CHECK-NEXT: kxnorw %k0, %k0, %k2
|
|
|
|
|
|
+; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
-; CHECK-NEXT: vpgatherdd (%rdi,%xmm1,4), %xmm2 {%k2}
|
|
|
|
|
|
+; CHECK-NEXT: vpgatherdd (%rdi,%xmm1,4), %xmm2 {%k1}
|
|
|
|
+; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vpgatherdd (%rdi,%xmm1,2), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpgatherdd (%rdi,%xmm1,2), %xmm0 {%k1}
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: vpaddd %xmm0, %xmm2, %xmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 -1, i32 4)
|
|
|
|
- %res1 = call <4 x i32> @llvm.x86.avx512.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, i8 %x3, i32 2)
|
|
|
|
|
|
+ %res = call <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 4)
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
|
|
|
|
+ %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32> %x0, i8* %x1, <4 x i32> %x2, <4 x i1> %extract, i32 2)
|
|
%res2 = add <4 x i32> %res, %res1
|
|
%res2 = add <4 x i32> %res, %res1
|
|
ret <4 x i32> %res2
|
|
ret <4 x i32> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float>, i8*, <8 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <8 x float>@test_int_x86_avx512_gather3siv8_sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv8_sf:
|
|
|
|
|
|
+define <8 x float> @test_int_x86_avx512_mask_gather3siv8_sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv8_sf:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vgatherdps (%rdi,%ymm1,4), %ymm0 {%k1}
|
|
; CHECK-NEXT: vgatherdps (%rdi,%ymm1,4), %ymm0 {%k1}
|
|
@@ -549,16 +559,15 @@ define <8 x float>@test_int_x86_avx512_gather3siv8_sf(<8 x float> %x0, i8* %x1,
|
|
; CHECK-NEXT: vgatherdps (%rdi,%ymm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vgatherdps (%rdi,%ymm1,2), %ymm2 {%k1}
|
|
; CHECK-NEXT: vaddps %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: vaddps %ymm2, %ymm0, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <8 x float> @llvm.x86.avx512.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, i8 -1, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %res = call <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, <8 x i1> %1, i32 4)
|
|
|
|
+ %res1 = call <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float> %x0, i8* %x1, <8 x i32> %x2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 2)
|
|
%res2 = fadd <8 x float> %res, %res1
|
|
%res2 = fadd <8 x float> %res, %res1
|
|
ret <8 x float> %res2
|
|
ret <8 x float> %res2
|
|
}
|
|
}
|
|
|
|
|
|
-declare <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32>, i8*, <8 x i32>, i8, i32)
|
|
|
|
-
|
|
|
|
-define <8 x i32>@test_int_x86_avx512_gather3siv8_si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
|
|
|
|
-; CHECK-LABEL: test_int_x86_avx512_gather3siv8_si:
|
|
|
|
|
|
+define <8 x i32> @test_int_x86_avx512_mask_gather3siv8_si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3) {
|
|
|
|
+; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv8_si:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: kmovd %esi, %k1
|
|
; CHECK-NEXT: vmovdqa %ymm0, %ymm2
|
|
; CHECK-NEXT: vmovdqa %ymm0, %ymm2
|
|
@@ -567,8 +576,10 @@ define <8 x i32>@test_int_x86_avx512_gather3siv8_si(<8 x i32> %x0, i8* %x1, <8 x
|
|
; CHECK-NEXT: vpgatherdd (%rdi,%ymm1,2), %ymm0 {%k1}
|
|
; CHECK-NEXT: vpgatherdd (%rdi,%ymm1,2), %ymm0 {%k1}
|
|
; CHECK-NEXT: vpaddd %ymm0, %ymm2, %ymm0
|
|
; CHECK-NEXT: vpaddd %ymm0, %ymm2, %ymm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 4)
|
|
|
|
- %res1 = call <8 x i32> @llvm.x86.avx512.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, i8 %x3, i32 2)
|
|
|
|
|
|
+ %1 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %res = call <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, <8 x i1> %1, i32 4)
|
|
|
|
+ %2 = bitcast i8 %x3 to <8 x i1>
|
|
|
|
+ %res1 = call <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32> %x0, i8* %x1, <8 x i32> %x2, <8 x i1> %2, i32 2)
|
|
%res2 = add <8 x i32> %res, %res1
|
|
%res2 = add <8 x i32> %res, %res1
|
|
ret <8 x i32> %res2
|
|
ret <8 x i32> %res2
|
|
}
|
|
}
|
|
@@ -843,7 +854,7 @@ define void @scatter_mask_test(i8* %x0, <8 x i32> %x2, <8 x i32> %x3) {
|
|
ret void
|
|
ret void
|
|
}
|
|
}
|
|
|
|
|
|
-define <16 x float> @gather_mask_test(<16 x i32> %ind, <16 x float> %src, i8* %base) {
|
|
|
|
|
|
+define <16 x float> @gather_mask_test(<16 x i32> %ind, <16 x float> %src, i8* %base) {
|
|
; CHECK-LABEL: gather_mask_test:
|
|
; CHECK-LABEL: gather_mask_test:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK: ## %bb.0:
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
; CHECK-NEXT: kxnorw %k0, %k0, %k1
|
|
@@ -863,13 +874,37 @@ define <16 x float> @gather_mask_test(<16 x i32> %ind, <16 x float> %src, i8* %b
|
|
; CHECK-NEXT: vaddps %zmm3, %zmm1, %zmm0
|
|
; CHECK-NEXT: vaddps %zmm3, %zmm1, %zmm0
|
|
; CHECK-NEXT: vaddps %zmm2, %zmm0, %zmm0
|
|
; CHECK-NEXT: vaddps %zmm2, %zmm0, %zmm0
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: retq
|
|
- %res = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 -1, i32 4)
|
|
|
|
- %res1 = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 0, i32 4)
|
|
|
|
- %res2 = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 1, i32 4)
|
|
|
|
- %res3 = call <16 x float> @llvm.x86.avx512.gather.dps.512 (<16 x float> %src, i8* %base, <16 x i32>%ind, i16 220, i32 4)
|
|
|
|
-
|
|
|
|
|
|
+ %res = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 4)
|
|
|
|
+ %res1 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> zeroinitializer, i32 4)
|
|
|
|
+ %res2 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> bitcast (<1 x i16> <i16 1> to <16 x i1>), i32 4)
|
|
|
|
+ %res3 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, i8* %base, <16 x i32> %ind, <16 x i1> bitcast (<1 x i16> <i16 220> to <16 x i1>), i32 4)
|
|
%res4 = fadd <16 x float> %res, %res1
|
|
%res4 = fadd <16 x float> %res, %res1
|
|
%res5 = fadd <16 x float> %res3, %res2
|
|
%res5 = fadd <16 x float> %res3, %res2
|
|
%res6 = fadd <16 x float> %res5, %res4
|
|
%res6 = fadd <16 x float> %res5, %res4
|
|
ret <16 x float> %res6
|
|
ret <16 x float> %res6
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+declare <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float>, i8*, <16 x i32>, <16 x i1>, i32)
|
|
|
|
+declare <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double>, i8*, <8 x i32>, <8 x i1>, i32)
|
|
|
|
+declare <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float>, i8*, <8 x i64>, <8 x i1>, i32)
|
|
|
|
+declare <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double>, i8*, <8 x i64>, <8 x i1>, i32)
|
|
|
|
+declare <16 x i32> @llvm.x86.avx512.mask.gather.dpi.512(<16 x i32>, i8*, <16 x i32>, <16 x i1>, i32)
|
|
|
|
+declare <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512(<8 x i64>, i8*, <8 x i32>, <8 x i1>, i32)
|
|
|
|
+declare <8 x i32> @llvm.x86.avx512.mask.gather.qpi.512(<8 x i32>, i8*, <8 x i64>, <8 x i1>, i32)
|
|
|
|
+declare <8 x i64> @llvm.x86.avx512.mask.gather.qpq.512(<8 x i64>, i8*, <8 x i64>, <8 x i1>, i32)
|
|
|
|
+declare <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double>, i8*, <2 x i64>, <2 x i1>, i32)
|
|
|
|
+declare <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64>, i8*, <2 x i64>, <2 x i1>, i32)
|
|
|
|
+declare <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double>, i8*, <4 x i64>, <4 x i1>, i32)
|
|
|
|
+declare <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64>, i8*, <4 x i64>, <4 x i1>, i32)
|
|
|
|
+declare <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float>, i8*, <2 x i64>, <2 x i1>, i32)
|
|
|
|
+declare <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32>, i8*, <2 x i64>, <2 x i1>, i32)
|
|
|
|
+declare <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float>, i8*, <4 x i64>, <4 x i1>, i32)
|
|
|
|
+declare <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32>, i8*, <4 x i64>, <4 x i1>, i32)
|
|
|
|
+declare <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double>, i8*, <4 x i32>, <2 x i1>, i32)
|
|
|
|
+declare <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64>, i8*, <4 x i32>, <2 x i1>, i32)
|
|
|
|
+declare <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double>, i8*, <4 x i32>, <4 x i1>, i32)
|
|
|
|
+declare <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64>, i8*, <4 x i32>, <4 x i1>, i32)
|
|
|
|
+declare <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float>, i8*, <4 x i32>, <4 x i1>, i32)
|
|
|
|
+declare <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32>, i8*, <4 x i32>, <4 x i1>, i32)
|
|
|
|
+declare <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float>, i8*, <8 x i32>, <8 x i1>, i32)
|
|
|
|
+declare <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32>, i8*, <8 x i32>, <8 x i1>, i32)
|