1
1
// 32-bit x86 returns `f32` and `f64` differently to avoid the x87 stack.
2
- //@ revisions: x86 other
2
+ // 32-bit systems will return 128bit values using a return area pointer.
3
+ //@ revisions: x86 bit32 bit64
3
4
//@[x86] only-x86
4
- //@[other] ignore-x86
5
+ //@[bit32] ignore-x86
6
+ //@[bit32] only-32bit
7
+ //@[bit64] ignore-x86
8
+ //@[bit64] only-64bit
5
9
6
10
// Verify that our intrinsics generate the correct LLVM calls for f128
7
11
@@ -52,42 +56,54 @@ pub fn f128_le(a: f128, b: f128) -> bool {
52
56
a <= b
53
57
}
54
58
55
- // CHECK-LABEL: fp128 @f128_neg(
59
+ // x86-LABEL: void @f128_neg({{.*}}sret([16 x i8])
60
+ // bit32-LABEL: void @f128_neg({{.*}}sret([16 x i8])
61
+ // bit64-LABEL: fp128 @f128_neg(
56
62
#[ no_mangle]
57
63
pub fn f128_neg ( a : f128 ) -> f128 {
58
64
// CHECK: fneg fp128
59
65
-a
60
66
}
61
67
62
- // CHECK-LABEL: fp128 @f128_add(
68
+ // x86-LABEL: void @f128_add({{.*}}sret([16 x i8])
69
+ // bit32-LABEL: void @f128_add({{.*}}sret([16 x i8])
70
+ // bit64-LABEL: fp128 @f128_add(
63
71
#[ no_mangle]
64
72
pub fn f128_add ( a : f128 , b : f128 ) -> f128 {
65
73
// CHECK: fadd fp128 %{{.+}}, %{{.+}}
66
74
a + b
67
75
}
68
76
69
- // CHECK-LABEL: fp128 @f128_sub(
77
+ // x86-LABEL: void @f128_sub({{.*}}sret([16 x i8])
78
+ // bit32-LABEL: void @f128_sub({{.*}}sret([16 x i8])
79
+ // bit64-LABEL: fp128 @f128_sub(
70
80
#[ no_mangle]
71
81
pub fn f128_sub ( a : f128 , b : f128 ) -> f128 {
72
82
// CHECK: fsub fp128 %{{.+}}, %{{.+}}
73
83
a - b
74
84
}
75
85
76
- // CHECK-LABEL: fp128 @f128_mul(
86
+ // x86-LABEL: void @f128_mul({{.*}}sret([16 x i8])
87
+ // bit32-LABEL: void @f128_mul({{.*}}sret([16 x i8])
88
+ // bit64-LABEL: fp128 @f128_mul(
77
89
#[ no_mangle]
78
90
pub fn f128_mul ( a : f128 , b : f128 ) -> f128 {
79
91
// CHECK: fmul fp128 %{{.+}}, %{{.+}}
80
92
a * b
81
93
}
82
94
83
- // CHECK-LABEL: fp128 @f128_div(
95
+ // x86-LABEL: void @f128_div({{.*}}sret([16 x i8])
96
+ // bit32-LABEL: void @f128_div({{.*}}sret([16 x i8])
97
+ // bit64-LABEL: fp128 @f128_div(
84
98
#[ no_mangle]
85
99
pub fn f128_div ( a : f128 , b : f128 ) -> f128 {
86
100
// CHECK: fdiv fp128 %{{.+}}, %{{.+}}
87
101
a / b
88
102
}
89
103
90
- // CHECK-LABEL: fp128 @f128_rem(
104
+ // x86-LABEL: void @f128_rem({{.*}}sret([16 x i8])
105
+ // bit32-LABEL: void @f128_rem({{.*}}sret([16 x i8])
106
+ // bit64-LABEL: fp128 @f128_rem(
91
107
#[ no_mangle]
92
108
pub fn f128_rem ( a : f128 , b : f128 ) -> f128 {
93
109
// CHECK: frem fp128 %{{.+}}, %{{.+}}
@@ -143,44 +159,56 @@ pub fn f128_as_f16(a: f128) -> f16 {
143
159
a as f16
144
160
}
145
161
146
- // other-LABEL: float @f128_as_f32(
147
162
// x86-LABEL: i32 @f128_as_f32(
163
+ // bit32-LABEL: float @f128_as_f32(
164
+ // bit64-LABEL: float @f128_as_f32(
148
165
#[ no_mangle]
149
166
pub fn f128_as_f32 ( a : f128 ) -> f32 {
150
167
// CHECK: fptrunc fp128 %{{.+}} to float
151
168
a as f32
152
169
}
153
170
154
- // other-LABEL: double @f128_as_f64(
155
171
// x86-LABEL: void @f128_as_f64(
172
+ // bit32-LABEL: double @f128_as_f64(
173
+ // bit64-LABEL: double @f128_as_f64(
156
174
#[ no_mangle]
157
175
pub fn f128_as_f64 ( a : f128 ) -> f64 {
158
176
// CHECK: fptrunc fp128 %{{.+}} to double
159
177
a as f64
160
178
}
161
179
162
- // CHECK-LABEL: fp128 @f128_as_self(
180
+ // x86-LABEL: void @f128_as_self({{.*}}sret([16 x i8])
181
+ // bit32-LABEL: void @f128_as_self({{.*}}sret([16 x i8])
182
+ // bit64-LABEL: fp128 @f128_as_self(
163
183
#[ no_mangle]
164
184
pub fn f128_as_self ( a : f128 ) -> f128 {
165
- // CHECK: ret fp128 %{{.+}}
185
+ // x86: store fp128 %a, ptr %_0, align 16
186
+ // bit32: store fp128 %a, ptr %_0, align 16
187
+ // bit64: ret fp128 %{{.+}}
166
188
a as f128
167
189
}
168
190
169
- // CHECK-LABEL: fp128 @f16_as_f128(
191
+ // x86-LABEL: void @f16_as_f128({{.*}}sret([16 x i8])
192
+ // bit32-LABEL: void @f16_as_f128({{.*}}sret([16 x i8])
193
+ // bit64-LABEL: fp128 @f16_as_f128(
170
194
#[ no_mangle]
171
195
pub fn f16_as_f128 ( a : f16 ) -> f128 {
172
196
// CHECK: fpext half %{{.+}} to fp128
173
197
a as f128
174
198
}
175
199
176
- // CHECK-LABEL: fp128 @f32_as_f128(
200
+ // x86-LABEL: void @f32_as_f128({{.*}}sret([16 x i8])
201
+ // bit32-LABEL: void @f32_as_f128({{.*}}sret([16 x i8])
202
+ // bit64-LABEL: fp128 @f32_as_f128(
177
203
#[ no_mangle]
178
204
pub fn f32_as_f128 ( a : f32 ) -> f128 {
179
205
// CHECK: fpext float %{{.+}} to fp128
180
206
a as f128
181
207
}
182
208
183
- // CHECK-LABEL: fp128 @f64_as_f128(
209
+ // x86-LABEL: void @f64_as_f128({{.*}}sret([16 x i8])
210
+ // bit32-LABEL: void @f64_as_f128({{.*}}sret([16 x i8])
211
+ // bit64-LABEL: fp128 @f64_as_f128(
184
212
#[ no_mangle]
185
213
pub fn f64_as_f128 ( a : f64 ) -> f128 {
186
214
// CHECK: fpext double %{{.+}} to fp128
@@ -216,7 +244,9 @@ pub fn f128_as_u64(a: f128) -> u64 {
216
244
a as u64
217
245
}
218
246
219
- // CHECK-LABEL: i128 @f128_as_u128(
247
+ // x86-LABEL: void @f128_as_u128({{.*}}sret([16 x i8])
248
+ // bit32-LABEL: void @f128_as_u128({{.*}}sret([16 x i8])
249
+ // bit64-LABEL: i128 @f128_as_u128(
220
250
#[ no_mangle]
221
251
pub fn f128_as_u128 ( a : f128 ) -> u128 {
222
252
// CHECK: call i128 @llvm.fptoui.sat.i128.f128(fp128 %{{.+}})
@@ -250,7 +280,9 @@ pub fn f128_as_i64(a: f128) -> i64 {
250
280
a as i64
251
281
}
252
282
253
- // CHECK-LABEL: i128 @f128_as_i128(
283
+ // x86-LABEL: void @f128_as_i128({{.*}}sret([16 x i8])
284
+ // bit32-LABEL: void @f128_as_i128({{.*}}sret([16 x i8])
285
+ // bit64-LABEL: i128 @f128_as_i128(
254
286
#[ no_mangle]
255
287
pub fn f128_as_i128 ( a : f128 ) -> i128 {
256
288
// CHECK: call i128 @llvm.fptosi.sat.i128.f128(fp128 %{{.+}})
@@ -259,70 +291,90 @@ pub fn f128_as_i128(a: f128) -> i128 {
259
291
260
292
/* int to float conversions */
261
293
262
- // CHECK-LABEL: fp128 @u8_as_f128(
294
+ // x86-LABEL: void @u8_as_f128({{.*}}sret([16 x i8])
295
+ // bit32-LABEL: void @u8_as_f128({{.*}}sret([16 x i8])
296
+ // bit64-LABEL: fp128 @u8_as_f128(
263
297
#[ no_mangle]
264
298
pub fn u8_as_f128 ( a : u8 ) -> f128 {
265
299
// CHECK: uitofp i8 %{{.+}} to fp128
266
300
a as f128
267
301
}
268
302
269
- // CHECK-LABEL: fp128 @u16_as_f128(
303
+ // x86-LABEL: void @u16_as_f128({{.*}}sret([16 x i8])
304
+ // bit32-LABEL: void @u16_as_f128({{.*}}sret([16 x i8])
305
+ // bit64-LABEL: fp128 @u16_as_f128(
270
306
#[ no_mangle]
271
307
pub fn u16_as_f128 ( a : u16 ) -> f128 {
272
308
// CHECK: uitofp i16 %{{.+}} to fp128
273
309
a as f128
274
310
}
275
311
276
- // CHECK-LABEL: fp128 @u32_as_f128(
312
+ // x86-LABEL: void @u32_as_f128({{.*}}sret([16 x i8])
313
+ // bit32-LABEL: void @u32_as_f128({{.*}}sret([16 x i8])
314
+ // bit64-LABEL: fp128 @u32_as_f128(
277
315
#[ no_mangle]
278
316
pub fn u32_as_f128 ( a : u32 ) -> f128 {
279
317
// CHECK: uitofp i32 %{{.+}} to fp128
280
318
a as f128
281
319
}
282
320
283
- // CHECK-LABEL: fp128 @u64_as_f128(
321
+ // x86-LABEL: void @u64_as_f128({{.*}}sret([16 x i8])
322
+ // bit32-LABEL: void @u64_as_f128({{.*}}sret([16 x i8])
323
+ // bit64-LABEL: fp128 @u64_as_f128(
284
324
#[ no_mangle]
285
325
pub fn u64_as_f128 ( a : u64 ) -> f128 {
286
326
// CHECK: uitofp i64 %{{.+}} to fp128
287
327
a as f128
288
328
}
289
329
290
- // CHECK-LABEL: fp128 @u128_as_f128(
330
+ // x86-LABEL: void @u128_as_f128({{.*}}sret([16 x i8])
331
+ // bit32-LABEL: void @u128_as_f128({{.*}}sret([16 x i8])
332
+ // bit64-LABEL: fp128 @u128_as_f128(
291
333
#[ no_mangle]
292
334
pub fn u128_as_f128 ( a : u128 ) -> f128 {
293
335
// CHECK: uitofp i128 %{{.+}} to fp128
294
336
a as f128
295
337
}
296
338
297
- // CHECK-LABEL: fp128 @i8_as_f128(
339
+ // x86-LABEL: void @i8_as_f128({{.*}}sret([16 x i8])
340
+ // bit32-LABEL: void @i8_as_f128({{.*}}sret([16 x i8])
341
+ // bit64-LABEL: fp128 @i8_as_f128(
298
342
#[ no_mangle]
299
343
pub fn i8_as_f128 ( a : i8 ) -> f128 {
300
344
// CHECK: sitofp i8 %{{.+}} to fp128
301
345
a as f128
302
346
}
303
347
304
- // CHECK-LABEL: fp128 @i16_as_f128(
348
+ // x86-LABEL: void @i16_as_f128({{.*}}sret([16 x i8])
349
+ // bit32-LABEL: void @i16_as_f128({{.*}}sret([16 x i8])
350
+ // bit64-LABEL: fp128 @i16_as_f128(
305
351
#[ no_mangle]
306
352
pub fn i16_as_f128 ( a : i16 ) -> f128 {
307
353
// CHECK: sitofp i16 %{{.+}} to fp128
308
354
a as f128
309
355
}
310
356
311
- // CHECK-LABEL: fp128 @i32_as_f128(
357
+ // x86-LABEL: void @i32_as_f128({{.*}}sret([16 x i8])
358
+ // bit32-LABEL: void @i32_as_f128({{.*}}sret([16 x i8])
359
+ // bit64-LABEL: fp128 @i32_as_f128(
312
360
#[ no_mangle]
313
361
pub fn i32_as_f128 ( a : i32 ) -> f128 {
314
362
// CHECK: sitofp i32 %{{.+}} to fp128
315
363
a as f128
316
364
}
317
365
318
- // CHECK-LABEL: fp128 @i64_as_f128(
366
+ // x86-LABEL: void @i64_as_f128({{.*}}sret([16 x i8])
367
+ // bit32-LABEL: void @i64_as_f128({{.*}}sret([16 x i8])
368
+ // bit64-LABEL: fp128 @i64_as_f128(
319
369
#[ no_mangle]
320
370
pub fn i64_as_f128 ( a : i64 ) -> f128 {
321
371
// CHECK: sitofp i64 %{{.+}} to fp128
322
372
a as f128
323
373
}
324
374
325
- // CHECK-LABEL: fp128 @i128_as_f128(
375
+ // x86-LABEL: void @i128_as_f128({{.*}}sret([16 x i8])
376
+ // bit32-LABEL: void @i128_as_f128({{.*}}sret([16 x i8])
377
+ // bit64-LABEL: fp128 @i128_as_f128(
326
378
#[ no_mangle]
327
379
pub fn i128_as_f128 ( a : i128 ) -> f128 {
328
380
// CHECK: sitofp i128 %{{.+}} to fp128
0 commit comments