c2854ed6471db9e080767f243268a42f2b8fb671
[oota-llvm.git] / test / CodeGen / AArch64 / neon-copy.ll
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
2
3
4 define <16 x i8> @ins16bw(<16 x i8> %tmp1, i8 %tmp2) {
5 ;CHECK: ins {{v[0-31]+}}.b[15], {{w[0-31]+}}
6   %tmp3 = insertelement <16 x i8> %tmp1, i8 %tmp2, i32 15
7   ret <16 x i8> %tmp3
8 }
9
10 define <8 x i16> @ins8hw(<8 x i16> %tmp1, i16 %tmp2) {
11 ;CHECK: ins {{v[0-31]+}}.h[6], {{w[0-31]+}}
12   %tmp3 = insertelement <8 x i16> %tmp1, i16 %tmp2, i32 6
13   ret <8 x i16> %tmp3
14 }
15
16 define <4 x i32> @ins4sw(<4 x i32> %tmp1, i32 %tmp2) {
17 ;CHECK: ins {{v[0-31]+}}.s[2], {{w[0-31]+}}
18   %tmp3 = insertelement <4 x i32> %tmp1, i32 %tmp2, i32 2
19   ret <4 x i32> %tmp3
20 }
21
22 define <2 x i64> @ins2dw(<2 x i64> %tmp1, i64 %tmp2) {
23 ;CHECK: ins {{v[0-31]+}}.d[1], {{x[0-31]+}}
24   %tmp3 = insertelement <2 x i64> %tmp1, i64 %tmp2, i32 1
25   ret <2 x i64> %tmp3
26 }
27
28 define <8 x i8> @ins8bw(<8 x i8> %tmp1, i8 %tmp2) {
29 ;CHECK: ins {{v[0-31]+}}.b[5], {{w[0-31]+}}
30   %tmp3 = insertelement <8 x i8> %tmp1, i8 %tmp2, i32 5
31   ret <8 x i8> %tmp3
32 }
33
34 define <4 x i16> @ins4hw(<4 x i16> %tmp1, i16 %tmp2) {
35 ;CHECK: ins {{v[0-31]+}}.h[3], {{w[0-31]+}}
36   %tmp3 = insertelement <4 x i16> %tmp1, i16 %tmp2, i32 3
37   ret <4 x i16> %tmp3
38 }
39
40 define <2 x i32> @ins2sw(<2 x i32> %tmp1, i32 %tmp2) {
41 ;CHECK: ins {{v[0-31]+}}.s[1], {{w[0-31]+}}
42   %tmp3 = insertelement <2 x i32> %tmp1, i32 %tmp2, i32 1
43   ret <2 x i32> %tmp3
44 }
45
46 define <16 x i8> @ins16b16(<16 x i8> %tmp1, <16 x i8> %tmp2) {
47 ;CHECK: ins {{v[0-31]+}}.b[15], {{v[0-31]+}}.b[2]
48   %tmp3 = extractelement <16 x i8> %tmp1, i32 2
49   %tmp4 = insertelement <16 x i8> %tmp2, i8 %tmp3, i32 15
50   ret <16 x i8> %tmp4
51 }
52
53 define <8 x i16> @ins8h8(<8 x i16> %tmp1, <8 x i16> %tmp2) {
54 ;CHECK: ins {{v[0-31]+}}.h[7], {{v[0-31]+}}.h[2]
55   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
56   %tmp4 = insertelement <8 x i16> %tmp2, i16 %tmp3, i32 7
57   ret <8 x i16> %tmp4
58 }
59
60 define <4 x i32> @ins4s4(<4 x i32> %tmp1, <4 x i32> %tmp2) {
61 ;CHECK: ins {{v[0-31]+}}.s[1], {{v[0-31]+}}.s[2]
62   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
63   %tmp4 = insertelement <4 x i32> %tmp2, i32 %tmp3, i32 1
64   ret <4 x i32> %tmp4
65 }
66
67 define <2 x i64> @ins2d2(<2 x i64> %tmp1, <2 x i64> %tmp2) {
68 ;CHECK: ins {{v[0-31]+}}.d[1], {{v[0-31]+}}.d[0]
69   %tmp3 = extractelement <2 x i64> %tmp1, i32 0
70   %tmp4 = insertelement <2 x i64> %tmp2, i64 %tmp3, i32 1
71   ret <2 x i64> %tmp4
72 }
73
74 define <8 x i8> @ins8b8(<8 x i8> %tmp1, <8 x i8> %tmp2) {
75 ;CHECK: ins {{v[0-31]+}}.b[4], {{v[0-31]+}}.b[2]
76   %tmp3 = extractelement <8 x i8> %tmp1, i32 2
77   %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 4
78   ret <8 x i8> %tmp4
79 }
80
81 define <4 x i16> @ins4h4(<4 x i16> %tmp1, <4 x i16> %tmp2) {
82 ;CHECK: ins {{v[0-31]+}}.h[3], {{v[0-31]+}}.h[2]
83   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
84   %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 3
85   ret <4 x i16> %tmp4
86 }
87
88 define <2 x i32> @ins2s2(<2 x i32> %tmp1, <2 x i32> %tmp2) {
89 ;CHECK: ins {{v[0-31]+}}.s[1], {{v[0-31]+}}.s[0]
90   %tmp3 = extractelement <2 x i32> %tmp1, i32 0
91   %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
92   ret <2 x i32> %tmp4
93 }
94
95 define <1 x i64> @ins1d1(<1 x i64> %tmp1, <1 x i64> %tmp2) {
96 ;CHECK: ins {{v[0-31]+}}.d[0], {{v[0-31]+}}.d[0]
97   %tmp3 = extractelement <1 x i64> %tmp1, i32 0
98   %tmp4 = insertelement <1 x i64> %tmp2, i64 %tmp3, i32 0
99   ret <1 x i64> %tmp4
100 }
101
102 define i32 @umovw16b(<16 x i8> %tmp1) {
103 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.b[8]
104   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
105   %tmp4 = zext i8 %tmp3 to i32
106   ret i32 %tmp4
107 }
108
109 define i32 @umovw8h(<8 x i16> %tmp1) {
110 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.h[2]
111   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
112   %tmp4 = zext i16 %tmp3 to i32
113   ret i32 %tmp4
114 }
115
116 define i32 @umovw4s(<4 x i32> %tmp1) {
117 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.s[2]
118   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
119   ret i32 %tmp3
120 }
121
122 define i64 @umovx2d(<2 x i64> %tmp1) {
123 ;CHECK: umov {{x[0-31]+}}, {{v[0-31]+}}.d[0]
124   %tmp3 = extractelement <2 x i64> %tmp1, i32 0
125   ret i64 %tmp3
126 }
127
128 define i32 @umovw8b(<8 x i8> %tmp1) {
129 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.b[7]
130   %tmp3 = extractelement <8 x i8> %tmp1, i32 7
131   %tmp4 = zext i8 %tmp3 to i32
132   ret i32 %tmp4
133 }
134
135 define i32 @umovw4h(<4 x i16> %tmp1) {
136 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.h[2]
137   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
138   %tmp4 = zext i16 %tmp3 to i32
139   ret i32 %tmp4
140 }
141
142 define i32 @umovw2s(<2 x i32> %tmp1) {
143 ;CHECK: umov {{w[0-31]+}}, {{v[0-31]+}}.s[1]
144   %tmp3 = extractelement <2 x i32> %tmp1, i32 1
145   ret i32 %tmp3
146 }
147
148 define i64 @umovx1d(<1 x i64> %tmp1) {
149 ;CHECK: umov {{x[0-31]+}}, {{v[0-31]+}}.d[0]
150   %tmp3 = extractelement <1 x i64> %tmp1, i32 0
151   ret i64 %tmp3
152 }
153
154 define i32 @smovw16b(<16 x i8> %tmp1) {
155 ;CHECK: smov {{w[0-31]+}}, {{v[0-31]+}}.b[8]
156   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
157   %tmp4 = sext i8 %tmp3 to i32
158   %tmp5 = add i32 5, %tmp4
159   ret i32 %tmp5
160 }
161
162 define i32 @smovw8h(<8 x i16> %tmp1) {
163 ;CHECK: smov {{w[0-31]+}}, {{v[0-31]+}}.h[2]
164   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
165   %tmp4 = sext i16 %tmp3 to i32
166   %tmp5 = add i32 5, %tmp4
167   ret i32 %tmp5
168 }
169
170 define i32 @smovx16b(<16 x i8> %tmp1) {
171 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.b[8]
172   %tmp3 = extractelement <16 x i8> %tmp1, i32 8
173   %tmp4 = sext i8 %tmp3 to i32
174   ret i32 %tmp4
175 }
176
177 define i32 @smovx8h(<8 x i16> %tmp1) {
178 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.h[2]
179   %tmp3 = extractelement <8 x i16> %tmp1, i32 2
180   %tmp4 = sext i16 %tmp3 to i32
181   ret i32 %tmp4
182 }
183
184 define i64 @smovx4s(<4 x i32> %tmp1) {
185 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.s[2]
186   %tmp3 = extractelement <4 x i32> %tmp1, i32 2
187   %tmp4 = sext i32 %tmp3 to i64
188   ret i64 %tmp4
189 }
190
191 define i32 @smovw8b(<8 x i8> %tmp1) {
192 ;CHECK: smov {{w[0-31]+}}, {{v[0-31]+}}.b[4]
193   %tmp3 = extractelement <8 x i8> %tmp1, i32 4
194   %tmp4 = sext i8 %tmp3 to i32
195   %tmp5 = add i32 5, %tmp4
196   ret i32 %tmp5
197 }
198
199 define i32 @smovw4h(<4 x i16> %tmp1) {
200 ;CHECK: smov {{w[0-31]+}}, {{v[0-31]+}}.h[2]
201   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
202   %tmp4 = sext i16 %tmp3 to i32
203   %tmp5 = add i32 5, %tmp4
204   ret i32 %tmp5
205 }
206
207 define i32 @smovx8b(<8 x i8> %tmp1) {
208 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.b[6]
209   %tmp3 = extractelement <8 x i8> %tmp1, i32 6
210   %tmp4 = sext i8 %tmp3 to i32
211   ret i32 %tmp4
212 }
213
214 define i32 @smovx4h(<4 x i16> %tmp1) {
215 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.h[2]
216   %tmp3 = extractelement <4 x i16> %tmp1, i32 2
217   %tmp4 = sext i16 %tmp3 to i32
218   ret i32 %tmp4
219 }
220
221 define i64 @smovx2s(<2 x i32> %tmp1) {
222 ;CHECK: smov {{x[0-31]+}}, {{v[0-31]+}}.s[1]
223   %tmp3 = extractelement <2 x i32> %tmp1, i32 1
224   %tmp4 = sext i32 %tmp3 to i64
225   ret i64 %tmp4
226 }
227
228
229
230
231
232