[opaque pointer type] Add textual IR support for explicit type parameter to load...
[oota-llvm.git] / test / CodeGen / AArch64 / fp16-v8-instructions.ll
1 ; RUN: llc < %s -mtriple=aarch64-none-eabi | FileCheck %s
2
3 define <8 x half> @add_h(<8 x half> %a, <8 x half> %b) {
4 entry:
5 ; CHECK-LABEL: add_h:
6 ; CHECK: fcvt
7 ; CHECK: fcvt
8 ; CHECK-DAG: fadd
9 ; CHECK-DAG: fcvt
10 ; CHECK-DAG: fcvt
11 ; CHECK-DAG: fadd
12 ; CHECK-DAG: fcvt
13 ; CHECK-DAG: fcvt
14 ; CHECK-DAG: fadd
15 ; CHECK-DAG: fcvt
16 ; CHECK-DAG: fcvt
17 ; CHECK-DAG: fadd
18 ; CHECK-DAG: fcvt
19 ; CHECK-DAG: fcvt
20 ; CHECK-DAG: fadd
21 ; CHECK-DAG: fcvt
22 ; CHECK-DAG: fcvt
23 ; CHECK-DAG: fadd
24 ; CHECK-DAG: fcvt
25 ; CHECK-DAG: fcvt
26 ; CHECK-DAG: fadd
27 ; CHECK-DAG: fcvt
28 ; CHECK-DAG: fcvt
29 ; CHECK-DAG: fadd
30 ; CHECK-DAG: fcvt
31 ; CHECK-DAG: fcvt
32 ; CHECK-DAG: fcvt
33 ; CHECK-DAG: fcvt
34 ; CHECK-DAG: fcvt
35 ; CHECK-DAG: fcvt
36 ; CHECK-DAG: fcvt
37 ; CHECK: fcvt
38   %0 = fadd <8 x half> %a, %b
39   ret <8 x half> %0
40 }
41
42
43 define <8 x half> @sub_h(<8 x half> %a, <8 x half> %b) {
44 entry:
45 ; CHECK-LABEL: sub_h:
46 ; CHECK: fcvt
47 ; CHECK: fcvt
48 ; CHECK-DAG: fsub
49 ; CHECK-DAG: fcvt
50 ; CHECK-DAG: fcvt
51 ; CHECK-DAG: fsub
52 ; CHECK-DAG: fcvt
53 ; CHECK-DAG: fcvt
54 ; CHECK-DAG: fsub
55 ; CHECK-DAG: fcvt
56 ; CHECK-DAG: fcvt
57 ; CHECK-DAG: fsub
58 ; CHECK-DAG: fcvt
59 ; CHECK-DAG: fcvt
60 ; CHECK-DAG: fsub
61 ; CHECK-DAG: fcvt
62 ; CHECK-DAG: fcvt
63 ; CHECK-DAG: fsub
64 ; CHECK-DAG: fcvt
65 ; CHECK-DAG: fcvt
66 ; CHECK-DAG: fsub
67 ; CHECK-DAG: fcvt
68 ; CHECK-DAG: fcvt
69 ; CHECK-DAG: fsub
70 ; CHECK-DAG: fcvt
71 ; CHECK-DAG: fcvt
72 ; CHECK-DAG: fcvt
73 ; CHECK-DAG: fcvt
74 ; CHECK-DAG: fcvt
75 ; CHECK-DAG: fcvt
76 ; CHECK-DAG: fcvt
77 ; CHECK: fcvt
78   %0 = fsub <8 x half> %a, %b
79   ret <8 x half> %0
80 }
81
82
83 define <8 x half> @mul_h(<8 x half> %a, <8 x half> %b) {
84 entry:
85 ; CHECK-LABEL: mul_h:
86 ; CHECK: fcvt
87 ; CHECK: fcvt
88 ; CHECK-DAG: fmul
89 ; CHECK-DAG: fcvt
90 ; CHECK-DAG: fcvt
91 ; CHECK-DAG: fmul
92 ; CHECK-DAG: fcvt
93 ; CHECK-DAG: fcvt
94 ; CHECK-DAG: fmul
95 ; CHECK-DAG: fcvt
96 ; CHECK-DAG: fcvt
97 ; CHECK-DAG: fmul
98 ; CHECK-DAG: fcvt
99 ; CHECK-DAG: fcvt
100 ; CHECK-DAG: fmul
101 ; CHECK-DAG: fcvt
102 ; CHECK-DAG: fcvt
103 ; CHECK-DAG: fmul
104 ; CHECK-DAG: fcvt
105 ; CHECK-DAG: fcvt
106 ; CHECK-DAG: fmul
107 ; CHECK-DAG: fcvt
108 ; CHECK-DAG: fcvt
109 ; CHECK-DAG: fmul
110 ; CHECK-DAG: fcvt
111 ; CHECK-DAG: fcvt
112 ; CHECK-DAG: fcvt
113 ; CHECK-DAG: fcvt
114 ; CHECK-DAG: fcvt
115 ; CHECK-DAG: fcvt
116 ; CHECK-DAG: fcvt
117 ; CHECK: fcvt
118   %0 = fmul <8 x half> %a, %b
119   ret <8 x half> %0
120 }
121
122
123 define <8 x half> @div_h(<8 x half> %a, <8 x half> %b) {
124 entry:
125 ; CHECK-LABEL: div_h:
126 ; CHECK: fcvt
127 ; CHECK: fcvt
128 ; CHECK-DAG: fdiv
129 ; CHECK-DAG: fcvt
130 ; CHECK-DAG: fcvt
131 ; CHECK-DAG: fdiv
132 ; CHECK-DAG: fcvt
133 ; CHECK-DAG: fcvt
134 ; CHECK-DAG: fdiv
135 ; CHECK-DAG: fcvt
136 ; CHECK-DAG: fcvt
137 ; CHECK-DAG: fdiv
138 ; CHECK-DAG: fcvt
139 ; CHECK-DAG: fcvt
140 ; CHECK-DAG: fdiv
141 ; CHECK-DAG: fcvt
142 ; CHECK-DAG: fcvt
143 ; CHECK-DAG: fdiv
144 ; CHECK-DAG: fcvt
145 ; CHECK-DAG: fcvt
146 ; CHECK-DAG: fdiv
147 ; CHECK-DAG: fcvt
148 ; CHECK-DAG: fcvt
149 ; CHECK-DAG: fdiv
150 ; CHECK-DAG: fcvt
151 ; CHECK-DAG: fcvt
152 ; CHECK-DAG: fcvt
153 ; CHECK-DAG: fcvt
154 ; CHECK-DAG: fcvt
155 ; CHECK-DAG: fcvt
156 ; CHECK-DAG: fcvt
157 ; CHECK: fcvt
158   %0 = fdiv <8 x half> %a, %b
159   ret <8 x half> %0
160 }
161
162
163 define <8 x half> @load_h(<8 x half>* %a) {
164 entry:
165 ; CHECK-LABEL: load_h:
166 ; CHECK: ldr q0, [x0]
167   %0 = load <8 x half>, <8 x half>* %a, align 4
168   ret <8 x half> %0
169 }
170
171
172 define void @store_h(<8 x half>* %a, <8 x half> %b) {
173 entry:
174 ; CHECK-LABEL: store_h:
175 ; CHECK: str q0, [x0]
176   store <8 x half> %b, <8 x half>* %a, align 4
177   ret void
178 }
179
180 define <8 x half> @s_to_h(<8 x float> %a) {
181 ; CHECK-LABEL: s_to_h:
182 ; CHECK-DAG: fcvtn v0.4h, v0.4s
183 ; CHECK-DAG: fcvtn [[REG:v[0-9+]]].4h, v1.4s
184 ; CHECK: ins v0.d[1], [[REG]].d[0]
185   %1 = fptrunc <8 x float> %a to <8 x half>
186   ret <8 x half> %1
187 }
188
189 define <8 x half> @d_to_h(<8 x double> %a) {
190 ; CHECK-LABEL: d_to_h:
191 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
192 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
193 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
194 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1]
195 ; CHECK-DAG: fcvt h
196 ; CHECK-DAG: fcvt h
197 ; CHECK-DAG: fcvt h
198 ; CHECK-DAG: fcvt h
199 ; CHECK-DAG: fcvt h
200 ; CHECK-DAG: fcvt h
201 ; CHECK-DAG: fcvt h
202 ; CHECK-DAG: fcvt h
203 ; CHECK-DAG: ins v{{[0-9]+}}.h
204 ; CHECK-DAG: ins v{{[0-9]+}}.h
205 ; CHECK-DAG: ins v{{[0-9]+}}.h
206 ; CHECK-DAG: ins v{{[0-9]+}}.h
207 ; CHECK-DAG: ins v{{[0-9]+}}.h
208 ; CHECK-DAG: ins v{{[0-9]+}}.h
209 ; CHECK-DAG: ins v{{[0-9]+}}.h
210 ; CHECK-DAG: ins v{{[0-9]+}}.h
211   %1 = fptrunc <8 x double> %a to <8 x half>
212   ret <8 x half> %1
213 }
214
215 define <8 x float> @h_to_s(<8 x half> %a) {
216 ; CHECK-LABEL: h_to_s:
217 ; CHECK: fcvtl2 v1.4s, v0.8h
218 ; CHECK: fcvtl v0.4s, v0.4h
219   %1 = fpext <8 x half> %a to <8 x float>
220   ret <8 x float> %1
221 }
222
223 define <8 x double> @h_to_d(<8 x half> %a) {
224 ; CHECK-LABEL: h_to_d:
225 ; CHECK-DAG: fcvt d
226 ; CHECK-DAG: fcvt d
227 ; CHECK-DAG: fcvt d
228 ; CHECK-DAG: fcvt d
229 ; CHECK-DAG: fcvt d
230 ; CHECK-DAG: fcvt d
231 ; CHECK-DAG: fcvt d
232 ; CHECK-DAG: fcvt d
233 ; CHECK-DAG: ins
234 ; CHECK-DAG: ins
235 ; CHECK-DAG: ins
236 ; CHECK-DAG: ins
237   %1 = fpext <8 x half> %a to <8 x double>
238   ret <8 x double> %1
239 }
240
241
242 define <8 x half> @bitcast_i_to_h(float, <8 x i16> %a) {
243 ; CHECK-LABEL: bitcast_i_to_h:
244 ; CHECK: mov v0.16b, v1.16b
245   %2 = bitcast <8 x i16> %a to <8 x half>
246   ret <8 x half> %2
247 }
248
249 define <8 x i16> @bitcast_h_to_i(float, <8 x half> %a) {
250 ; CHECK-LABEL: bitcast_h_to_i:
251 ; CHECK: mov v0.16b, v1.16b
252   %2 = bitcast <8 x half> %a to <8 x i16>
253   ret <8 x i16> %2
254 }
255