1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc < %s -mtriple=aarch64--linux-gnu | FileCheck %s
4 define <8 x i8> @sel_v8i8(<8 x i8> %v0, <8 x i8> %v1) {
5 ; CHECK-LABEL: sel_v8i8:
7 ; CHECK-NEXT: movi d2, #0xff00ff00ff00ff
8 ; CHECK-NEXT: bif v0.8b, v1.8b, v2.8b
10 %tmp0 = shufflevector <8 x i8> %v0, <8 x i8> %v1, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
14 define <16 x i8> @sel_v16i8(<16 x i8> %v0, <16 x i8> %v1) {
15 ; CHECK-LABEL: sel_v16i8:
17 ; CHECK-NEXT: movi v2.2d, #0xff00ff00ff00ff
18 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
20 %tmp0 = shufflevector <16 x i8> %v0, <16 x i8> %v1, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
24 define <16 x i8> @sel_v16i8_poison(<16 x i8> %v0, <16 x i8> %v1) {
25 ; CHECK-LABEL: sel_v16i8_poison:
27 ; CHECK-NEXT: adrp x8, .LCPI2_0
28 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI2_0]
29 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
31 %tmp0 = shufflevector <16 x i8> %v0, <16 x i8> %v1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 22, i32 23, i32 24, i32 25, i32 26, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
35 define <16 x i8> @sel_v16i8_unregular(<16 x i8> %v0, <16 x i8> %v1) {
36 ; CHECK-LABEL: sel_v16i8_unregular:
38 ; CHECK-NEXT: adrp x8, .LCPI3_0
39 ; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI3_0]
40 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
42 %tmp0 = shufflevector <16 x i8> %v0, <16 x i8> %v1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 27, i32 28, i32 29, i32 30, i32 31>
46 define <4 x i16> @sel_v4i16(<4 x i16> %v0, <4 x i16> %v1) {
47 ; CHECK-LABEL: sel_v4i16:
49 ; CHECK-NEXT: rev32 v0.4h, v0.4h
50 ; CHECK-NEXT: trn2 v0.4h, v0.4h, v1.4h
52 %tmp0 = shufflevector <4 x i16> %v0, <4 x i16> %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
56 define <8 x i16> @sel_v8i16(<8 x i16> %v0, <8 x i16> %v1) {
57 ; CHECK-LABEL: sel_v8i16:
59 ; CHECK-NEXT: movi v2.2d, #0x00ffff0000ffff
60 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
62 %tmp0 = shufflevector <8 x i16> %v0, <8 x i16> %v1, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
66 define <2 x i32> @sel_v2i32(<2 x i32> %v0, <2 x i32> %v1) {
67 ; CHECK-LABEL: sel_v2i32:
69 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
70 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
71 ; CHECK-NEXT: mov v0.s[1], v1.s[1]
72 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
74 %tmp0 = shufflevector <2 x i32> %v0, <2 x i32> %v1, <2 x i32> <i32 0, i32 3>
78 define <4 x i32> @sel_v4i32(<4 x i32> %v0, <4 x i32> %v1) {
79 ; CHECK-LABEL: sel_v4i32:
81 ; CHECK-NEXT: rev64 v0.4s, v0.4s
82 ; CHECK-NEXT: trn2 v0.4s, v0.4s, v1.4s
84 %tmp0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
88 define <2 x i64> @sel_v2i64(<2 x i64> %v0, <2 x i64> %v1) {
89 ; CHECK-LABEL: sel_v2i64:
91 ; CHECK-NEXT: mov v0.d[1], v1.d[1]
93 %tmp0 = shufflevector <2 x i64> %v0, <2 x i64> %v1, <2 x i32> <i32 0, i32 3>
97 define <4 x half> @sel_v4f16(<4 x half> %v0, <4 x half> %v1) {
98 ; CHECK-LABEL: sel_v4f16:
100 ; CHECK-NEXT: rev32 v0.4h, v0.4h
101 ; CHECK-NEXT: trn2 v0.4h, v0.4h, v1.4h
103 %tmp0 = shufflevector <4 x half> %v0, <4 x half> %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
107 define <8 x half> @sel_v8f16(<8 x half> %v0, <8 x half> %v1) {
108 ; CHECK-LABEL: sel_v8f16:
110 ; CHECK-NEXT: movi v2.2d, #0x00ffff0000ffff
111 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
113 %tmp0 = shufflevector <8 x half> %v0, <8 x half> %v1, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
117 define <2 x float> @sel_v2f32(<2 x float> %v0, <2 x float> %v1) {
118 ; CHECK-LABEL: sel_v2f32:
120 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
121 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
122 ; CHECK-NEXT: mov v0.s[1], v1.s[1]
123 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
125 %tmp0 = shufflevector <2 x float> %v0, <2 x float> %v1, <2 x i32> <i32 0, i32 3>
126 ret <2 x float> %tmp0
129 define <4 x float> @sel_v4f32(<4 x float> %v0, <4 x float> %v1) {
130 ; CHECK-LABEL: sel_v4f32:
132 ; CHECK-NEXT: rev64 v0.4s, v0.4s
133 ; CHECK-NEXT: trn2 v0.4s, v0.4s, v1.4s
135 %tmp0 = shufflevector <4 x float> %v0, <4 x float> %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
136 ret <4 x float> %tmp0
139 define <2 x double> @sel_v2f64(<2 x double> %v0, <2 x double> %v1) {
140 ; CHECK-LABEL: sel_v2f64:
142 ; CHECK-NEXT: mov v0.d[1], v1.d[1]
144 %tmp0 = shufflevector <2 x double> %v0, <2 x double> %v1, <2 x i32> <i32 0, i32 3>
145 ret <2 x double> %tmp0