summaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/AArch64/arm64-vshift.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/AArch64/arm64-vshift.ll')
-rw-r--r--llvm/test/CodeGen/AArch64/arm64-vshift.ll103
1 files changed, 93 insertions, 10 deletions
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index a7f9ca8d73c1..8ec5434085d6 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -101,8 +101,6 @@
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli4s
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sli2d
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqshlu_zero_shift_amount
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for lshr_trunc_v2i64_v2i8
-; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ashr_trunc_v2i64_v2i8
define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {
; CHECK-LABEL: sqshl8b:
@@ -4378,25 +4376,87 @@ define <8 x i16> @signbits_vashr(<8 x i16> %a) {
}
define <2 x i8> @lshr_trunc_v2i64_v2i8(<2 x i64> %a) {
-; CHECK-LABEL: lshr_trunc_v2i64_v2i8:
-; CHECK: // %bb.0:
-; CHECK-NEXT: shrn v0.2s, v0.2d, #16
-; CHECK-NEXT: ret
+; CHECK-SD-LABEL: lshr_trunc_v2i64_v2i8:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: shrn v0.2s, v0.2d, #16
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: lshr_trunc_v2i64_v2i8:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: xtn v0.2s, v0.2d
+; CHECK-GI-NEXT: ushr v0.2s, v0.2s, #16
+; CHECK-GI-NEXT: ret
%b = lshr <2 x i64> %a, <i64 16, i64 16>
%c = trunc <2 x i64> %b to <2 x i8>
ret <2 x i8> %c
}
+define <4 x i16> @lshr_trunc_v4i64_v4i16(<4 x i64> %a) {
+; CHECK-SD-LABEL: lshr_trunc_v4i64_v4i16:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: xtn v1.2s, v1.2d
+; CHECK-SD-NEXT: xtn v0.2s, v0.2d
+; CHECK-SD-NEXT: ushr v1.2s, v1.2s, #8
+; CHECK-SD-NEXT: ushr v0.2s, v0.2s, #8
+; CHECK-SD-NEXT: uzp1 v0.4h, v0.4h, v1.4h
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: lshr_trunc_v4i64_v4i16:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: adrp x8, .LCPI270_0
+; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s
+; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI270_0]
+; CHECK-GI-NEXT: uzp1 v2.4s, v2.4s, v2.4s
+; CHECK-GI-NEXT: neg v1.4s, v2.4s
+; CHECK-GI-NEXT: ushl v0.4s, v0.4s, v1.4s
+; CHECK-GI-NEXT: xtn v0.4h, v0.4s
+; CHECK-GI-NEXT: ret
+ %b = lshr <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>
+ %c = trunc <4 x i64> %b to <4 x i16>
+ ret <4 x i16> %c
+}
+
define <2 x i8> @ashr_trunc_v2i64_v2i8(<2 x i64> %a) {
-; CHECK-LABEL: ashr_trunc_v2i64_v2i8:
-; CHECK: // %bb.0:
-; CHECK-NEXT: shrn v0.2s, v0.2d, #16
-; CHECK-NEXT: ret
+; CHECK-SD-LABEL: ashr_trunc_v2i64_v2i8:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: shrn v0.2s, v0.2d, #16
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: ashr_trunc_v2i64_v2i8:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: xtn v0.2s, v0.2d
+; CHECK-GI-NEXT: sshr v0.2s, v0.2s, #16
+; CHECK-GI-NEXT: ret
%b = ashr <2 x i64> %a, <i64 16, i64 16>
%c = trunc <2 x i64> %b to <2 x i8>
ret <2 x i8> %c
}
+define <4 x i16> @ashr_trunc_v4i64_v4i16(<4 x i64> %a) {
+; CHECK-SD-LABEL: ashr_trunc_v4i64_v4i16:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: xtn v1.2s, v1.2d
+; CHECK-SD-NEXT: xtn v0.2s, v0.2d
+; CHECK-SD-NEXT: ushr v1.2s, v1.2s, #8
+; CHECK-SD-NEXT: ushr v0.2s, v0.2s, #8
+; CHECK-SD-NEXT: uzp1 v0.4h, v0.4h, v1.4h
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: ashr_trunc_v4i64_v4i16:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: adrp x8, .LCPI272_0
+; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s
+; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI272_0]
+; CHECK-GI-NEXT: uzp1 v2.4s, v2.4s, v2.4s
+; CHECK-GI-NEXT: neg v1.4s, v2.4s
+; CHECK-GI-NEXT: sshl v0.4s, v0.4s, v1.4s
+; CHECK-GI-NEXT: xtn v0.4h, v0.4s
+; CHECK-GI-NEXT: ret
+ %b = ashr <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>
+ %c = trunc <4 x i64> %b to <4 x i16>
+ ret <4 x i16> %c
+}
+
define <2 x i8> @shl_trunc_v2i64_v2i8(<2 x i64> %a) {
; CHECK-SD-LABEL: shl_trunc_v2i64_v2i8:
; CHECK-SD: // %bb.0:
@@ -4414,4 +4474,27 @@ define <2 x i8> @shl_trunc_v2i64_v2i8(<2 x i64> %a) {
ret <2 x i8> %c
}
+define <4 x i16> @shl_trunc_v4i64_v4i16(<4 x i64> %a) {
+; CHECK-SD-LABEL: shl_trunc_v4i64_v4i16:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s
+; CHECK-SD-NEXT: xtn v0.4h, v0.4s
+; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: shl_trunc_v4i64_v4i16:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: adrp x8, .LCPI274_0
+; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s
+; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI274_0]
+; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v2.4s
+; CHECK-GI-NEXT: xtn v0.4h, v0.4s
+; CHECK-GI-NEXT: xtn v1.4h, v1.4s
+; CHECK-GI-NEXT: ushl v0.4h, v0.4h, v1.4h
+; CHECK-GI-NEXT: ret
+ %b = shl <4 x i64> %a, <i64 8, i64 8, i64 8, i64 8>
+ %c = trunc <4 x i64> %b to <4 x i16>
+ ret <4 x i16> %c
+}
+
declare <2 x i64> @llvm.aarch64.neon.addp.v2i64(<2 x i64>, <2 x i64>)