1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00
llvm-mirror/test/CodeGen/Thumb2/mve-vidup.ll
David Green 5f03ae3ed7 [ARM] Recognize VIDUP from BUILDVECTORs of additions
This adds a pattern to recognize VIDUP from BUILD_VECTOR of incrementing
adds. This can come up from either geps or adds, and came up recently in
D100550. We are just looking for a BUILD_VECTOR where each lane is an
add of the first lane with N*i, where i is the lane and N is one of 1,
2, 4, or 8, supported by the VIDUP instruction.

Differential Revision: https://reviews.llvm.org/D101263
2021-04-27 19:33:24 +01:00

286 lines
9.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_1(i32 %index) {
; CHECK-LABEL: vidup_v4i32_1:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u32 q0, r0, #1
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 1
%a2 = add i32 %index, 2
%a3 = add i32 %index, 3
%a4 = add i32 %index, 4
%v1 = insertelement <4 x i32> poison, i32 %index, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a1, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a2, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a3, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_2(i32 %index) {
; CHECK-LABEL: vidup_v4i32_2:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u32 q0, r0, #2
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 2
%a2 = add i32 %index, 4
%a3 = add i32 %index, 6
%a4 = add i32 %index, 8
%v1 = insertelement <4 x i32> poison, i32 %index, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a1, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a2, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a3, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_3(i32 %index) {
; CHECK-LABEL: vidup_v4i32_3:
; CHECK: @ %bb.0:
; CHECK-NEXT: adds r1, r0, #6
; CHECK-NEXT: vmov q0[2], q0[0], r0, r1
; CHECK-NEXT: add.w r1, r0, #9
; CHECK-NEXT: adds r0, #3
; CHECK-NEXT: vmov q0[3], q0[1], r0, r1
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 3
%a2 = add i32 %index, 6
%a3 = add i32 %index, 9
%a4 = add i32 %index, 12
%v1 = insertelement <4 x i32> poison, i32 %index, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a1, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a2, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a3, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_4(i32 %index) {
; CHECK-LABEL: vidup_v4i32_4:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u32 q0, r0, #4
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 4
%a2 = add i32 %index, 8
%a3 = add i32 %index, 12
%a4 = add i32 %index, 16
%v1 = insertelement <4 x i32> poison, i32 %index, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a1, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a2, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a3, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_8(i32 %index) {
; CHECK-LABEL: vidup_v4i32_8:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u32 q0, r0, #8
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 8
%a2 = add i32 %index, 16
%a3 = add i32 %index, 24
%a4 = add i32 %index, 32
%v1 = insertelement <4 x i32> poison, i32 %index, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a1, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a2, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a3, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <4 x i32> @vidup_v4i32_1_i(i32 %index) {
; CHECK-LABEL: vidup_v4i32_1_i:
; CHECK: @ %bb.0:
; CHECK-NEXT: adds r1, r0, #3
; CHECK-NEXT: adds r2, r0, #1
; CHECK-NEXT: vmov q0[2], q0[0], r2, r1
; CHECK-NEXT: adds r1, r0, #4
; CHECK-NEXT: adds r0, #2
; CHECK-NEXT: vmov q0[3], q0[1], r0, r1
; CHECK-NEXT: bx lr
%a1 = add i32 %index, 1
%a2 = add i32 %index, 2
%a3 = add i32 %index, 3
%a4 = add i32 %index, 4
%v1 = insertelement <4 x i32> poison, i32 %a1, i32 0
%v2 = insertelement <4 x i32> %v1, i32 %a2, i32 1
%v3 = insertelement <4 x i32> %v2, i32 %a3, i32 2
%v4 = insertelement <4 x i32> %v3, i32 %a4, i32 3
ret <4 x i32> %v4
}
define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_1(i16 %index) {
; CHECK-LABEL: vidup_v8i16_1:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u16 q0, r0, #1
; CHECK-NEXT: bx lr
%a1 = add i16 %index, 1
%a2 = add i16 %index, 2
%a3 = add i16 %index, 3
%a4 = add i16 %index, 4
%a5 = add i16 %index, 5
%a6 = add i16 %index, 6
%a7 = add i16 %index, 7
%a8 = add i16 %index, 8
%v1 = insertelement <8 x i16> poison, i16 %index, i32 0
%v2 = insertelement <8 x i16> %v1, i16 %a1, i32 1
%v3 = insertelement <8 x i16> %v2, i16 %a2, i32 2
%v4 = insertelement <8 x i16> %v3, i16 %a3, i32 3
%v5 = insertelement <8 x i16> %v4, i16 %a4, i32 4
%v6 = insertelement <8 x i16> %v5, i16 %a5, i32 5
%v7 = insertelement <8 x i16> %v6, i16 %a6, i32 6
%v8 = insertelement <8 x i16> %v7, i16 %a7, i32 7
ret <8 x i16> %v8
}
define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_2(i16 %index) {
; CHECK-LABEL: vidup_v8i16_2:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u16 q0, r0, #2
; CHECK-NEXT: bx lr
%a1 = add i16 %index, 2
%a2 = add i16 %index, 4
%a3 = add i16 %index, 6
%a4 = add i16 %index, 8
%a5 = add i16 %index, 10
%a6 = add i16 %index, 12
%a7 = add i16 %index, 14
%a8 = add i16 %index, 16
%v1 = insertelement <8 x i16> poison, i16 %index, i32 0
%v2 = insertelement <8 x i16> %v1, i16 %a1, i32 1
%v3 = insertelement <8 x i16> %v2, i16 %a2, i32 2
%v4 = insertelement <8 x i16> %v3, i16 %a3, i32 3
%v5 = insertelement <8 x i16> %v4, i16 %a4, i32 4
%v6 = insertelement <8 x i16> %v5, i16 %a5, i32 5
%v7 = insertelement <8 x i16> %v6, i16 %a6, i32 6
%v8 = insertelement <8 x i16> %v7, i16 %a7, i32 7
ret <8 x i16> %v8
}
define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_4(i16 %index) {
; CHECK-LABEL: vidup_v8i16_4:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u16 q0, r0, #4
; CHECK-NEXT: bx lr
%a1 = add i16 %index, 4
%a2 = add i16 %index, 8
%a3 = add i16 %index, 12
%a4 = add i16 %index, 16
%a5 = add i16 %index, 20
%a6 = add i16 %index, 24
%a7 = add i16 %index, 28
%a8 = add i16 %index, 32
%v1 = insertelement <8 x i16> poison, i16 %index, i32 0
%v2 = insertelement <8 x i16> %v1, i16 %a1, i32 1
%v3 = insertelement <8 x i16> %v2, i16 %a2, i32 2
%v4 = insertelement <8 x i16> %v3, i16 %a3, i32 3
%v5 = insertelement <8 x i16> %v4, i16 %a4, i32 4
%v6 = insertelement <8 x i16> %v5, i16 %a5, i32 5
%v7 = insertelement <8 x i16> %v6, i16 %a6, i32 6
%v8 = insertelement <8 x i16> %v7, i16 %a7, i32 7
ret <8 x i16> %v8
}
define arm_aapcs_vfpcc <8 x i16> @vidup_v8i16_8(i16 %index) {
; CHECK-LABEL: vidup_v8i16_8:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u16 q0, r0, #8
; CHECK-NEXT: bx lr
%a1 = add i16 %index, 8
%a2 = add i16 %index, 16
%a3 = add i16 %index, 24
%a4 = add i16 %index, 32
%a5 = add i16 %index, 40
%a6 = add i16 %index, 48
%a7 = add i16 %index, 56
%a8 = add i16 %index, 64
%v1 = insertelement <8 x i16> poison, i16 %index, i32 0
%v2 = insertelement <8 x i16> %v1, i16 %a1, i32 1
%v3 = insertelement <8 x i16> %v2, i16 %a2, i32 2
%v4 = insertelement <8 x i16> %v3, i16 %a3, i32 3
%v5 = insertelement <8 x i16> %v4, i16 %a4, i32 4
%v6 = insertelement <8 x i16> %v5, i16 %a5, i32 5
%v7 = insertelement <8 x i16> %v6, i16 %a6, i32 6
%v8 = insertelement <8 x i16> %v7, i16 %a7, i32 7
ret <8 x i16> %v8
}
define arm_aapcs_vfpcc <16 x i8> @vidup_v16i8_1(i8 %index) {
; CHECK-LABEL: vidup_v16i8_1:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u8 q0, r0, #1
; CHECK-NEXT: bx lr
%a1 = add i8 %index, 1
%a2 = add i8 %index, 2
%a3 = add i8 %index, 3
%a4 = add i8 %index, 4
%a5 = add i8 %index, 5
%a6 = add i8 %index, 6
%a7 = add i8 %index, 7
%a8 = add i8 %index, 8
%a9 = add i8 %index, 9
%a10 = add i8 %index, 10
%a11 = add i8 %index, 11
%a12 = add i8 %index, 12
%a13 = add i8 %index, 13
%a14 = add i8 %index, 14
%a15 = add i8 %index, 15
%a16 = add i8 %index, 16
%v1 = insertelement <16 x i8> poison, i8 %index, i32 0
%v2 = insertelement <16 x i8> %v1, i8 %a1, i32 1
%v3 = insertelement <16 x i8> %v2, i8 %a2, i32 2
%v4 = insertelement <16 x i8> %v3, i8 %a3, i32 3
%v5 = insertelement <16 x i8> %v4, i8 %a4, i32 4
%v6 = insertelement <16 x i8> %v5, i8 %a5, i32 5
%v7 = insertelement <16 x i8> %v6, i8 %a6, i32 6
%v8 = insertelement <16 x i8> %v7, i8 %a7, i32 7
%v9 = insertelement <16 x i8> %v8, i8 %a8, i32 8
%v10 = insertelement <16 x i8> %v9, i8 %a9, i32 9
%v11 = insertelement <16 x i8> %v10, i8 %a10, i32 10
%v12 = insertelement <16 x i8> %v11, i8 %a11, i32 11
%v13 = insertelement <16 x i8> %v12, i8 %a12, i32 12
%v14 = insertelement <16 x i8> %v13, i8 %a13, i32 13
%v15 = insertelement <16 x i8> %v14, i8 %a14, i32 14
%v16 = insertelement <16 x i8> %v15, i8 %a15, i32 15
ret <16 x i8> %v16
}
define arm_aapcs_vfpcc <16 x i8> @vidup_v16i8_4(i8 %index) {
; CHECK-LABEL: vidup_v16i8_4:
; CHECK: @ %bb.0:
; CHECK-NEXT: vidup.u8 q0, r0, #4
; CHECK-NEXT: bx lr
%a1 = add i8 %index, 4
%a2 = add i8 %index, 8
%a3 = add i8 %index, 12
%a4 = add i8 %index, 16
%a5 = add i8 %index, 20
%a6 = add i8 %index, 24
%a7 = add i8 %index, 28
%a8 = add i8 %index, 32
%a9 = add i8 %index, 36
%a10 = add i8 %index, 40
%a11 = add i8 %index, 44
%a12 = add i8 %index, 48
%a13 = add i8 %index, 52
%a14 = add i8 %index, 56
%a15 = add i8 %index, 60
%a16 = add i8 %index, 64
%v1 = insertelement <16 x i8> poison, i8 %index, i32 0
%v2 = insertelement <16 x i8> %v1, i8 %a1, i32 1
%v3 = insertelement <16 x i8> %v2, i8 %a2, i32 2
%v4 = insertelement <16 x i8> %v3, i8 %a3, i32 3
%v5 = insertelement <16 x i8> %v4, i8 %a4, i32 4
%v6 = insertelement <16 x i8> %v5, i8 %a5, i32 5
%v7 = insertelement <16 x i8> %v6, i8 %a6, i32 6
%v8 = insertelement <16 x i8> %v7, i8 %a7, i32 7
%v9 = insertelement <16 x i8> %v8, i8 %a8, i32 8
%v10 = insertelement <16 x i8> %v9, i8 %a9, i32 9
%v11 = insertelement <16 x i8> %v10, i8 %a10, i32 10
%v12 = insertelement <16 x i8> %v11, i8 %a11, i32 11
%v13 = insertelement <16 x i8> %v12, i8 %a12, i32 12
%v14 = insertelement <16 x i8> %v13, i8 %a13, i32 13
%v15 = insertelement <16 x i8> %v14, i8 %a14, i32 14
%v16 = insertelement <16 x i8> %v15, i8 %a15, i32 15
ret <16 x i8> %v16
}