1; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
2
3; Integer vector select
4
5define <vscale x 16 x i8> @sel_nxv16i8(<vscale x 16 x i1> %p,
6                                       <vscale x 16 x i8> %dst,
7                                       <vscale x 16 x i8> %a) {
8; CHECK-LABEL: sel_nxv16i8:
9; CHECK:         mov z0.b, p0/m, z1.b
10; CHECK-NEXT:    ret
11  %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> %a, <vscale x 16 x i8> %dst
12  ret <vscale x 16 x i8> %sel
13}
14
15define <vscale x 8 x i16> @sel_nxv8i16(<vscale x 8 x i1> %p,
16                                       <vscale x 8 x i16> %dst,
17                                       <vscale x 8 x i16> %a) {
18; CHECK-LABEL: sel_nxv8i16:
19; CHECK:         mov z0.h, p0/m, z1.h
20; CHECK-NEXT:    ret
21  %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %a, <vscale x 8 x i16> %dst
22  ret <vscale x 8 x i16> %sel
23}
24
25define <vscale x 4 x i32> @sel_nxv4i32(<vscale x 4 x i1> %p,
26                                       <vscale x 4 x i32> %dst,
27                                       <vscale x 4 x i32> %a) {
28; CHECK-LABEL: sel_nxv4i32:
29; CHECK:         mov z0.s, p0/m, z1.s
30; CHECK-NEXT:    ret
31  %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %a, <vscale x 4 x i32> %dst
32  ret <vscale x 4 x i32> %sel
33}
34
35define <vscale x 2 x i64> @sel_nxv2i64(<vscale x 2 x i1> %p,
36                                       <vscale x 2 x i64> %dst,
37                                       <vscale x 2 x i64> %a) {
38; CHECK-LABEL: sel_nxv2i64:
39; CHECK:         mov z0.d, p0/m, z1.d
40; CHECK-NEXT:    ret
41  %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %a, <vscale x 2 x i64> %dst
42  ret <vscale x 2 x i64> %sel
43}
44
45; Floating point vector select
46
47define <vscale x 8 x half> @sel_nxv8f16(<vscale x 8 x i1> %p,
48                                        <vscale x 8 x half> %dst,
49                                        <vscale x 8 x half> %a) {
50; CHECK-LABEL: sel_nxv8f16:
51; CHECK:         mov z0.h, p0/m, z1.h
52; CHECK-NEXT:    ret
53  %sel = select <vscale x 8 x i1> %p, <vscale x 8 x half> %a, <vscale x 8 x half> %dst
54  ret <vscale x 8 x half> %sel
55}
56
57define <vscale x 4 x float> @sel_nxv4f32(<vscale x 4 x i1> %p,
58                                         <vscale x 4 x float> %dst,
59                                         <vscale x 4 x float> %a) {
60; CHECK-LABEL: sel_nxv4f32:
61; CHECK:         mov z0.s, p0/m, z1.s
62; CHECK-NEXT:    ret
63  %sel = select <vscale x 4 x i1> %p, <vscale x 4 x float> %a, <vscale x 4 x float> %dst
64  ret <vscale x 4 x float> %sel
65}
66
67define <vscale x 2 x float> @sel_nxv2f32(<vscale x 2 x i1> %p,
68                                         <vscale x 2 x float> %dst,
69                                         <vscale x 2 x float> %a) {
70; CHECK-LABEL: sel_nxv2f32:
71; CHECK:         mov z0.d, p0/m, z1.d
72; CHECK-NEXT:    ret
73  %sel = select <vscale x 2 x i1> %p, <vscale x 2 x float> %a, <vscale x 2 x float> %dst
74  ret <vscale x 2 x float> %sel
75}
76
77define <vscale x 2 x double> @sel_nxv8f64(<vscale x 2 x i1> %p,
78                                          <vscale x 2 x double> %dst,
79                                          <vscale x 2 x double> %a) {
80; CHECK-LABEL: sel_nxv8f64:
81; CHECK:         mov z0.d, p0/m, z1.d
82; CHECK-NEXT:    ret
83  %sel = select <vscale x 2 x i1> %p, <vscale x 2 x double> %a, <vscale x 2 x double> %dst
84  ret <vscale x 2 x double> %sel
85}
86