3
3
// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK
4
4
// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
5
5
// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
6
+ // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fnative-half-type %s \
7
+ // RUN: | FileCheck %s --check-prefix=NATIVE-HALF
8
+ // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fnative-half-type %s \
9
+ // RUN: | FileCheck %s --check-prefix=NATIVE-HALF
6
10
typedef unsigned cond_t ;
7
11
8
12
volatile cond_t test ;
@@ -18,297 +22,396 @@ void foo(void) {
18
22
// NOHALF: [[F16TOF32:call float @llvm.convert.from.fp16.f32]]
19
23
// HALF: [[F16TOF32:fpext half]]
20
24
// CHECK: fptoui float
25
+ // NATIVE-HALF: fptoui half
21
26
test = (h0 );
22
27
// CHECK: uitofp i32
23
28
// NOHALF: [[F32TOF16:call i16 @llvm.convert.to.fp16.f32]]
24
29
// HALF: [[F32TOF16:fptrunc float]]
30
+ // NATIVE-HALF: uitofp i32 {{.*}} to half
25
31
h0 = (test );
26
32
// CHECK: [[F16TOF32]]
27
33
// CHECK: fcmp une float
34
+ // NATIVE-HALF: fcmp une half
28
35
test = (!h1 );
29
36
// CHECK: [[F16TOF32]]
30
37
// CHECK: fsub float
31
38
// NOHALF: [[F32TOF16]]
32
39
// HALF: [[F32TOF16]]
40
+ // NATIVE-HALF: fsub half
33
41
h1 = - h1 ;
34
42
// CHECK: [[F16TOF32]]
35
43
// CHECK: [[F32TOF16]]
44
+ // NATIVE-HALF: load volatile half
45
+ // NATIVE-HALF-NEXT: store volatile half
36
46
h1 = + h1 ;
37
47
// CHECK: [[F16TOF32]]
38
48
// CHECK: fadd float
39
49
// CHECK: [[F32TOF16]]
50
+ // NATIVE-HALF: fadd half
40
51
h1 ++ ;
41
52
// CHECK: [[F16TOF32]]
42
53
// CHECK: fadd float
43
54
// CHECK: [[F32TOF16]]
55
+ // NATIVE-HALF: fadd half
44
56
++ h1 ;
45
57
// CHECK: [[F16TOF32]]
46
58
// CHECK: fadd float
47
59
// CHECK: [[F32TOF16]]
60
+ // NATIVE-HALF: fadd half
48
61
-- h1 ;
49
62
// CHECK: [[F16TOF32]]
50
63
// CHECK: fadd float
51
64
// CHECK: [[F32TOF16]]
65
+ // NATIVE-HALF: fadd half
52
66
h1 -- ;
53
67
54
68
// Check binary ops with various operands
55
69
// CHECK: [[F16TOF32]]
56
70
// CHECK: [[F16TOF32]]
57
71
// CHECK: fmul float
58
72
// CHECK: [[F32TOF16]]
73
+ // NATIVE-HALF: fmul half
59
74
h1 = h0 * h2 ;
60
75
// CHECK: [[F16TOF32]]
61
76
// NOHALF: [[F32TOF16]]
62
77
// NOHALF: [[F16TOF32]]
63
78
// CHECK: fmul float
64
79
// CHECK: [[F32TOF16]]
80
+ // NATIVE-HALF: fmul half
65
81
h1 = h0 * (__fp16 ) - 2.0f ;
66
82
// CHECK: [[F16TOF32]]
67
83
// CHECK: fmul float
68
84
// CHECK: [[F32TOF16]]
85
+ // NATIVE-HALF: fpext half
86
+ // NATIVE-HALF: fmul float
69
87
h1 = h0 * f2 ;
70
88
// CHECK: [[F16TOF32]]
71
89
// CHECK: fmul float
72
90
// CHECK: [[F32TOF16]]
91
+ // NATIVE-HALF: fpext half
92
+ // NATIVE-HALF: fmul float
73
93
h1 = f0 * h2 ;
74
94
75
95
// CHECK: [[F16TOF32]]
76
96
// CHECK: [[F16TOF32]]
77
97
// CHECK: fdiv float
78
98
// CHECK: [[F32TOF16]]
99
+ // NATIVE-HALF: fdiv half
79
100
h1 = (h0 / h2 );
80
101
// CHECK: [[F16TOF32]]
81
102
// NOHALF: [[F16TOF32]]
82
103
// CHECK: fdiv float
83
104
// CHECK: [[F32TOF16]]
105
+ // NATIVE-HALF: fdiv half
84
106
h1 = (h0 / (__fp16 ) - 2.0f );
85
107
// CHECK: [[F16TOF32]]
86
108
// CHECK: fdiv float
87
109
// CHECK: [[F32TOF16]]
110
+ // NATIVE-HALF: fpext half
111
+ // NATIVE-HALF: fdiv float
88
112
h1 = (h0 / f2 );
89
113
// CHECK: [[F16TOF32]]
90
114
// CHECK: fdiv float
91
115
// CHECK: [[F32TOF16]]
116
+ // NATIVE-HALF: fpext half
117
+ // NATIVE-HALF: fdiv float
92
118
h1 = (f0 / h2 );
93
119
94
120
// CHECK: [[F16TOF32]]
95
121
// CHECK: [[F16TOF32]]
96
122
// CHECK: fadd float
97
123
// CHECK: [[F32TOF16]]
124
+ // NATIVE-HALF: fadd half
98
125
h1 = (h2 + h0 );
99
126
// CHECK: [[F16TOF32]]
100
127
// NOHALF: [[F16TOF32]]
101
128
// CHECK: fadd float
102
129
// CHECK: [[F32TOF16]]
130
+ // NATIVE-HALF: fadd half
103
131
h1 = ((__fp16 )- 2.0 + h0 );
104
132
// CHECK: [[F16TOF32]]
105
133
// CHECK: fadd float
106
134
// CHECK: [[F32TOF16]]
135
+ // NATIVE-HALF: fpext half
136
+ // NATIVE-HALF: fadd float
107
137
h1 = (h2 + f0 );
108
138
// CHECK: [[F16TOF32]]
109
139
// CHECK: fadd float
110
140
// CHECK: [[F32TOF16]]
141
+ // NATIVE-HALF: fpext half
142
+ // NATIVE-HALF: fadd float
111
143
h1 = (f2 + h0 );
112
144
113
145
// CHECK: [[F16TOF32]]
114
146
// CHECK: [[F16TOF32]]
115
147
// CHECK: fsub float
116
148
// CHECK: [[F32TOF16]]
149
+ // NATIVE-HALF: fsub half
117
150
h1 = (h2 - h0 );
118
151
// CHECK: [[F16TOF32]]
119
152
// NOHALF: [[F16TOF32]]
120
153
// CHECK: fsub float
121
154
// CHECK: [[F32TOF16]]
155
+ // NATIVE-HALF: fsub half
122
156
h1 = ((__fp16 )- 2.0f - h0 );
123
157
// CHECK: [[F16TOF32]]
124
158
// CHECK: fsub float
125
159
// CHECK: [[F32TOF16]]
160
+ // NATIVE-HALF: fpext half
161
+ // NATIVE-HALF: fsub float
126
162
h1 = (h2 - f0 );
127
163
// CHECK: [[F16TOF32]]
128
164
// CHECK: fsub float
129
165
// CHECK: [[F32TOF16]]
166
+ // NATIVE-HALF: fpext half
167
+ // NATIVE-HALF: fsub float
130
168
h1 = (f2 - h0 );
131
169
132
170
// CHECK: [[F16TOF32]]
133
171
// CHECK: [[F16TOF32]]
134
- // CHECK: fcmp olt
172
+ // CHECK: fcmp olt float
173
+ // NATIVE-HALF: fcmp olt half
135
174
test = (h2 < h0 );
136
175
// CHECK: [[F16TOF32]]
137
176
// NOHALF: [[F16TOF32]]
138
- // CHECK: fcmp olt
177
+ // CHECK: fcmp olt float
178
+ // NATIVE-HALF: fcmp olt half
139
179
test = (h2 < (__fp16 )42.0 );
140
180
// CHECK: [[F16TOF32]]
141
- // CHECK: fcmp olt
181
+ // CHECK: fcmp olt float
182
+ // NATIVE-HALF: fpext half
183
+ // NATIVE-HALF: fcmp olt float
142
184
test = (h2 < f0 );
143
185
// CHECK: [[F16TOF32]]
144
- // CHECK: fcmp olt
186
+ // CHECK: fcmp olt float
187
+ // NATIVE-HALF: fpext half
188
+ // NATIVE-HALF: fcmp olt float
145
189
test = (f2 < h0 );
146
190
147
191
// CHECK: [[F16TOF32]]
148
192
// CHECK: [[F16TOF32]]
149
- // CHECK: fcmp ogt
193
+ // CHECK: fcmp ogt float
194
+ // NATIVE-HALF: fcmp ogt half
150
195
test = (h0 > h2 );
151
196
// CHECK: [[F16TOF32]]
152
197
// NOHALF: [[F16TOF32]]
153
- // CHECK: fcmp ogt
198
+ // CHECK: fcmp ogt float
199
+ // NATIVE-HALF: fcmp ogt half
154
200
test = ((__fp16 )42.0 > h2 );
155
201
// CHECK: [[F16TOF32]]
156
- // CHECK: fcmp ogt
202
+ // CHECK: fcmp ogt float
203
+ // NATIVE-HALF: fpext half
204
+ // NATIVE-HALF: fcmp ogt float
157
205
test = (h0 > f2 );
158
206
// CHECK: [[F16TOF32]]
159
- // CHECK: fcmp ogt
207
+ // CHECK: fcmp ogt float
208
+ // NATIVE-HALF: fpext half
209
+ // NATIVE-HALF: fcmp ogt float
160
210
test = (f0 > h2 );
161
211
162
212
// CHECK: [[F16TOF32]]
163
213
// CHECK: [[F16TOF32]]
164
- // CHECK: fcmp ole
214
+ // CHECK: fcmp ole float
215
+ // NATIVE-HALF: fcmp ole half
165
216
test = (h2 <= h0 );
166
217
// CHECK: [[F16TOF32]]
167
218
// NOHALF: [[F16TOF32]]
168
- // CHECK: fcmp ole
219
+ // CHECK: fcmp ole float
220
+ // NATIVE-HALF: fcmp ole half
169
221
test = (h2 <= (__fp16 )42.0 );
170
222
// CHECK: [[F16TOF32]]
171
- // CHECK: fcmp ole
223
+ // CHECK: fcmp ole float
224
+ // NATIVE-HALF: fpext half
225
+ // NATIVE-HALF: fcmp ole float
172
226
test = (h2 <= f0 );
173
227
// CHECK: [[F16TOF32]]
174
- // CHECK: fcmp ole
228
+ // CHECK: fcmp ole float
229
+ // NATIVE-HALF: fpext half
230
+ // NATIVE-HALF: fcmp ole float
175
231
test = (f2 <= h0 );
176
232
177
233
// CHECK: [[F16TOF32]]
178
234
// CHECK: [[F16TOF32]]
179
- // CHECK: fcmp oge
235
+ // CHECK: fcmp oge float
236
+ // NATIVE-HALF: fcmp oge half
180
237
test = (h0 >= h2 );
181
238
// CHECK: [[F16TOF32]]
182
239
// NOHALF: [[F16TOF32]]
183
- // CHECK: fcmp oge
240
+ // CHECK: fcmp oge float
241
+ // NATIVE-HALF: fcmp oge half
184
242
test = (h0 >= (__fp16 )- 2.0 );
185
243
// CHECK: [[F16TOF32]]
186
- // CHECK: fcmp oge
244
+ // CHECK: fcmp oge float
245
+ // NATIVE-HALF: fpext half
246
+ // NATIVE-HALF: fcmp oge float
187
247
test = (h0 >= f2 );
188
248
// CHECK: [[F16TOF32]]
189
- // CHECK: fcmp oge
249
+ // CHECK: fcmp oge float
250
+ // NATIVE-HALF: fpext half
251
+ // NATIVE-HALF: fcmp oge float
190
252
test = (f0 >= h2 );
191
253
192
254
// CHECK: [[F16TOF32]]
193
255
// CHECK: [[F16TOF32]]
194
- // CHECK: fcmp oeq
256
+ // CHECK: fcmp oeq float
257
+ // NATIVE-HALF: fcmp oeq half
195
258
test = (h1 == h2 );
196
259
// CHECK: [[F16TOF32]]
197
260
// NOHALF: [[F16TOF32]]
198
- // CHECK: fcmp oeq
261
+ // CHECK: fcmp oeq float
262
+ // NATIVE-HALF: fcmp oeq half
199
263
test = (h1 == (__fp16 )1.0 );
200
264
// CHECK: [[F16TOF32]]
201
- // CHECK: fcmp oeq
265
+ // CHECK: fcmp oeq float
266
+ // NATIVE-HALF: fpext half
267
+ // NATIVE-HALF: fcmp oeq float
202
268
test = (h1 == f1 );
203
269
// CHECK: [[F16TOF32]]
204
- // CHECK: fcmp oeq
270
+ // CHECK: fcmp oeq float
271
+ // NATIVE-HALF: fpext half
272
+ // NATIVE-HALF: fcmp oeq float
205
273
test = (f1 == h1 );
206
274
207
275
// CHECK: [[F16TOF32]]
208
276
// CHECK: [[F16TOF32]]
209
- // CHECK: fcmp une
277
+ // CHECK: fcmp une float
278
+ // NATIVE-HALF: fcmp une half
210
279
test = (h1 != h2 );
211
280
// CHECK: [[F16TOF32]]
212
281
// NOHALF: [[F16TOF32]]
213
- // CHECK: fcmp une
282
+ // CHECK: fcmp une float
283
+ // NATIVE-HALF: fcmp une half
214
284
test = (h1 != (__fp16 )1.0 );
215
285
// CHECK: [[F16TOF32]]
216
- // CHECK: fcmp une
286
+ // CHECK: fcmp une float
287
+ // NATIVE-HALF: fpext half
288
+ // NATIVE-HALF: fcmp une float
217
289
test = (h1 != f1 );
218
290
// CHECK: [[F16TOF32]]
219
- // CHECK: fcmp une
291
+ // CHECK: fcmp une float
292
+ // NATIVE-HALF: fpext half
293
+ // NATIVE-HALF: fcmp une float
220
294
test = (f1 != h1 );
221
295
222
296
// CHECK: [[F16TOF32]]
223
- // CHECK: fcmp une
297
+ // CHECK: fcmp une float
224
298
// CHECK: [[F16TOF32]]
225
299
// CHECK: [[F16TOF32]]
226
300
// CHECK: [[F32TOF16]]
301
+ // NATIVE-HALF: fcmp une half {{.*}}, 0xH0000
227
302
h1 = (h1 ? h2 : h0 );
228
303
// Check assignments (inc. compound)
229
304
h0 = h1 ;
230
305
// NOHALF: [[F32TOF16]]
231
306
// HALF: store {{.*}} half 0xHC000
307
+ // NATIVE-HALF: store {{.*}} half 0xHC000
232
308
h0 = (__fp16 )- 2.0f ;
233
309
// CHECK: [[F32TOF16]]
310
+ // NATIVE-HALF: fptrunc float
234
311
h0 = f0 ;
235
312
236
313
// CHECK: [[F16TOF32]]
237
314
// CHECK: [[F16TOF32]]
238
315
// CHECK: fadd float
239
316
// CHECK: [[F32TOF16]]
317
+ // NATIVE-HALF: fadd half
240
318
h0 += h1 ;
241
319
// CHECK: [[F16TOF32]]
242
320
// NOHALF: [[F16TOF32]]
243
- // CHECK: fadd
321
+ // CHECK: fadd float
244
322
// CHECK: [[F32TOF16]]
323
+ // NATIVE-HALF: fadd half
245
324
h0 += (__fp16 )1.0f ;
246
325
// CHECK: [[F16TOF32]]
247
- // CHECK: fadd
326
+ // CHECK: fadd float
248
327
// CHECK: [[F32TOF16]]
328
+ // NATIVE-HALF: fpext half
329
+ // NATIVE-HALF: fadd float
330
+ // NATIVE-HALF: fptrunc float
249
331
h0 += f2 ;
250
332
251
333
// CHECK: [[F16TOF32]]
252
334
// CHECK: [[F16TOF32]]
253
- // CHECK: fsub
335
+ // CHECK: fsub float
254
336
// CHECK: [[F32TOF16]]
337
+ // NATIVE-HALF: fsub half
255
338
h0 -= h1 ;
256
339
// CHECK: [[F16TOF32]]
257
340
// NOHALF: [[F16TOF32]]
258
- // CHECK: fsub
341
+ // CHECK: fsub float
259
342
// CHECK: [[F32TOF16]]
343
+ // NATIVE-HALF: fsub half
260
344
h0 -= (__fp16 )1.0 ;
261
345
// CHECK: [[F16TOF32]]
262
- // CHECK: fsub
346
+ // CHECK: fsub float
263
347
// CHECK: [[F32TOF16]]
348
+ // NATIVE-HALF: fpext half
349
+ // NATIVE-HALF: fsub float
350
+ // NATIVE-HALF: fptrunc float
264
351
h0 -= f2 ;
265
352
266
353
// CHECK: [[F16TOF32]]
267
354
// CHECK: [[F16TOF32]]
268
- // CHECK: fmul
355
+ // CHECK: fmul float
269
356
// CHECK: [[F32TOF16]]
357
+ // NATIVE-HALF: fmul half
270
358
h0 *= h1 ;
271
359
// CHECK: [[F16TOF32]]
272
360
// NOHALF: [[F16TOF32]]
273
- // CHECK: fmul
361
+ // CHECK: fmul float
274
362
// CHECK: [[F32TOF16]]
363
+ // NATIVE-HALF: fmul half
275
364
h0 *= (__fp16 )1.0 ;
276
365
// CHECK: [[F16TOF32]]
277
- // CHECK: fmul
366
+ // CHECK: fmul float
278
367
// CHECK: [[F32TOF16]]
368
+ // NATIVE-HALF: fpext half
369
+ // NATIVE-HALF: fmul float
370
+ // NATIVE-HALF: fptrunc float
279
371
h0 *= f2 ;
280
372
281
373
// CHECK: [[F16TOF32]]
282
374
// CHECK: [[F16TOF32]]
283
- // CHECK: fdiv
375
+ // CHECK: fdiv float
284
376
// CHECK: [[F32TOF16]]
377
+ // NATIVE-HALF: fdiv half
285
378
h0 /= h1 ;
286
379
// CHECK: [[F16TOF32]]
287
380
// NOHALF: [[F16TOF32]]
288
- // CHECK: fdiv
381
+ // CHECK: fdiv float
289
382
// CHECK: [[F32TOF16]]
383
+ // NATIVE-HALF: fdiv half
290
384
h0 /= (__fp16 )1.0 ;
291
385
// CHECK: [[F16TOF32]]
292
- // CHECK: fdiv
386
+ // CHECK: fdiv float
293
387
// CHECK: [[F32TOF16]]
388
+ // NATIVE-HALF: fpext half
389
+ // NATIVE-HALF: fdiv float
390
+ // NATIVE-HALF: fptrunc float
294
391
h0 /= f2 ;
295
392
296
393
// Check conversions to/from double
297
394
// NOHALF: call i16 @llvm.convert.to.fp16.f64(
298
395
// HALF: fptrunc double {{.*}} to half
396
+ // NATIVE-HALF: fptrunc double {{.*}} to half
299
397
h0 = d0 ;
300
398
301
399
// CHECK: [[MID:%.*]] = fptrunc double {{%.*}} to float
302
400
// NOHALF: call i16 @llvm.convert.to.fp16.f32(float [[MID]])
303
401
// HALF: fptrunc float [[MID]] to half
402
+ // NATIVE-HALF: [[MID:%.*]] = fptrunc double {{%.*}} to float
403
+ // NATIVE-HALF: fptrunc float {{.*}} to half
304
404
h0 = (float )d0 ;
305
405
306
406
// NOHALF: call double @llvm.convert.from.fp16.f64(
307
407
// HALF: fpext half {{.*}} to double
408
+ // NATIVE-HALF: fpext half {{.*}} to double
308
409
d0 = h0 ;
309
410
310
411
// NOHALF: [[MID:%.*]] = call float @llvm.convert.from.fp16.f32(
311
412
// HALF: [[MID:%.*]] = fpext half {{.*}} to float
312
413
// CHECK: fpext float [[MID]] to double
414
+ // NATIVE-HALF: [[MID:%.*]] = fpext half {{.*}} to float
415
+ // NATIVE-HALF: fpext float [[MID]] to double
313
416
d0 = (float )h0 ;
314
417
}
0 commit comments