5
5
//@ [arm64ec] compile-flags: --target arm64ec-pc-windows-msvc
6
6
//@ [arm64ec] needs-llvm-components: aarch64
7
7
8
- #![ feature( no_core, lang_items, rustc_attrs, repr_simd, asm_experimental_arch, f16) ]
8
+ #![ feature( no_core, lang_items, rustc_attrs, repr_simd, asm_experimental_arch, f16, f128 ) ]
9
9
#![ crate_type = "rlib" ]
10
10
#![ no_core]
11
11
#![ allow( asm_sub_register, non_camel_case_types) ]
12
+ // FIXME(f16_f128): Only needed for FIXME in check! and check_reg!
13
+ #![ feature( auto_traits) ]
12
14
13
15
#[ rustc_builtin_macro]
14
16
macro_rules! asm {
@@ -41,8 +43,6 @@ pub struct i64x1(i64);
41
43
#[ repr( simd) ]
42
44
pub struct f16x4 ( f16 , f16 , f16 , f16 ) ;
43
45
#[ repr( simd) ]
44
- pub struct f16x8 ( f16 , f16 , f16 , f16 , f16 , f16 , f16 , f16 ) ;
45
- #[ repr( simd) ]
46
46
pub struct f32x2 ( f32 , f32 ) ;
47
47
#[ repr( simd) ]
48
48
pub struct f64x1 ( f64 ) ;
@@ -55,6 +55,8 @@ pub struct i32x4(i32, i32, i32, i32);
55
55
#[ repr( simd) ]
56
56
pub struct i64x2 ( i64 , i64 ) ;
57
57
#[ repr( simd) ]
58
+ pub struct f16x8 ( f16 , f16 , f16 , f16 , f16 , f16 , f16 , f16 ) ;
59
+ #[ repr( simd) ]
58
60
pub struct f32x4 ( f32 , f32 , f32 , f32 ) ;
59
61
#[ repr( simd) ]
60
62
pub struct f64x2 ( f64 , f64 ) ;
@@ -66,13 +68,14 @@ impl Copy for i32 {}
66
68
impl Copy for f32 { }
67
69
impl Copy for i64 { }
68
70
impl Copy for f64 { }
71
+ impl Copy for f128 { }
69
72
impl Copy for ptr { }
70
73
impl Copy for i8x8 { }
71
74
impl Copy for i16x4 { }
72
75
impl Copy for i32x2 { }
73
76
impl Copy for i64x1 { }
74
- impl Copy for f32x2 { }
75
77
impl Copy for f16x4 { }
78
+ impl Copy for f32x2 { }
76
79
impl Copy for f64x1 { }
77
80
impl Copy for i8x16 { }
78
81
impl Copy for i16x8 { }
@@ -82,6 +85,12 @@ impl Copy for f16x8 {}
82
85
impl Copy for f32x4 { }
83
86
impl Copy for f64x2 { }
84
87
88
+ // FIXME(f16_f128): Only needed for FIXME in check! and check_reg!
89
+ #[ lang = "freeze" ]
90
+ unsafe auto trait Freeze { }
91
+ #[ lang = "unpin" ]
92
+ auto trait Unpin { }
93
+
85
94
extern "C" {
86
95
fn extern_func ( ) ;
87
96
static extern_static: u8 ;
@@ -118,38 +127,44 @@ pub unsafe fn issue_75761() {
118
127
119
128
macro_rules! check {
120
129
( $func: ident $ty: ident $class: ident $mov: literal $modifier: literal) => {
130
+ // FIXME(f16_f128): Change back to `$func(x: $ty) -> $ty` once arm64ec can pass and return
131
+ // `f16` and `f128` without LLVM erroring.
132
+ // LLVM issue: <https://github.com/llvm/llvm-project/issues/94434>
121
133
#[ no_mangle]
122
- pub unsafe fn $func( x : $ty) -> $ty {
134
+ pub unsafe fn $func( inp : & $ty, out : & mut $ty) {
123
135
// Hack to avoid function merging
124
136
extern "Rust" {
125
137
fn dont_merge( s: & str ) ;
126
138
}
127
139
dont_merge( stringify!( $func) ) ;
128
140
141
+ let x = * inp;
129
142
let y;
130
143
asm!(
131
144
concat!( $mov, " {:" , $modifier, "}, {:" , $modifier, "}" ) ,
132
145
out( $class) y,
133
146
in( $class) x
134
147
) ;
135
- y
148
+ * out = y ;
136
149
}
137
150
} ;
138
151
}
139
152
140
153
macro_rules! check_reg {
141
154
( $func: ident $ty: ident $reg: tt $mov: literal) => {
155
+ // FIXME(f16_f128): See FIXME in `check!`
142
156
#[ no_mangle]
143
- pub unsafe fn $func( x : $ty) -> $ty {
157
+ pub unsafe fn $func( inp : & $ty, out : & mut $ty) {
144
158
// Hack to avoid function merging
145
159
extern "Rust" {
146
160
fn dont_merge( s: & str ) ;
147
161
}
148
162
dont_merge( stringify!( $func) ) ;
149
163
164
+ let x = * inp;
150
165
let y;
151
166
asm!( concat!( $mov, " " , $reg, ", " , $reg) , lateout( $reg) y, in( $reg) x) ;
152
- y
167
+ * out = y ;
153
168
}
154
169
} ;
155
170
}
@@ -166,18 +181,18 @@ check!(reg_i8 i8 reg "mov" "");
166
181
// CHECK: //NO_APP
167
182
check ! ( reg_i16 i16 reg "mov" "" ) ;
168
183
184
+ // CHECK-LABEL: {{("#)?}}reg_f16{{"?}}
185
+ // CHECK: //APP
186
+ // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
187
+ // CHECK: //NO_APP
188
+ check ! ( reg_f16 f16 reg "mov" "" ) ;
189
+
169
190
// CHECK-LABEL: {{("#)?}}reg_i32{{"?}}
170
191
// CHECK: //APP
171
192
// CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
172
193
// CHECK: //NO_APP
173
194
check ! ( reg_i32 i32 reg "mov" "" ) ;
174
195
175
- // CHECK-LABEL: reg_f16:
176
- // CHECK: @APP
177
- // CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
178
- // CHECK: @NO_APP
179
- check ! ( reg_f16 f16 reg "mov" ) ;
180
-
181
196
// CHECK-LABEL: {{("#)?}}reg_f32{{"?}}
182
197
// CHECK: //APP
183
198
// CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
@@ -214,6 +229,12 @@ check!(vreg_i8 i8 vreg "fmov" "s");
214
229
// CHECK: //NO_APP
215
230
check ! ( vreg_i16 i16 vreg "fmov" "s" ) ;
216
231
232
+ // CHECK-LABEL: {{("#)?}}vreg_f16{{"?}}
233
+ // CHECK: //APP
234
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
235
+ // CHECK: //NO_APP
236
+ check ! ( vreg_f16 f16 vreg "fmov" "s" ) ;
237
+
217
238
// CHECK-LABEL: {{("#)?}}vreg_i32{{"?}}
218
239
// CHECK: //APP
219
240
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -238,6 +259,12 @@ check!(vreg_i64 i64 vreg "fmov" "s");
238
259
// CHECK: //NO_APP
239
260
check ! ( vreg_f64 f64 vreg "fmov" "s" ) ;
240
261
262
+ // CHECK-LABEL: {{("#)?}}vreg_f128{{"?}}
263
+ // CHECK: //APP
264
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
265
+ // CHECK: //NO_APP
266
+ check ! ( vreg_f128 f128 vreg "fmov" "s" ) ;
267
+
241
268
// CHECK-LABEL: {{("#)?}}vreg_ptr{{"?}}
242
269
// CHECK: //APP
243
270
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -268,19 +295,11 @@ check!(vreg_i32x2 i32x2 vreg "fmov" "s");
268
295
// CHECK: //NO_APP
269
296
check ! ( vreg_i64x1 i64x1 vreg "fmov" "s" ) ;
270
297
271
- // neon-LABEL: vreg_f16x4:
272
- // neon: @APP
273
- // neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
274
- // neon: @NO_APP
275
- #[ cfg( neon) ]
276
- check ! ( vreg_f16x4 f16x4 vreg "vmov.f64" ) ;
277
-
278
- // neon-LABEL: vreg_f16x8:
279
- // neon: @APP
280
- // neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
281
- // neon: @NO_APP
282
- #[ cfg( neon) ]
283
- check ! ( vreg_f16x8 f16x8 vreg "vmov" ) ;
298
+ // CHECK-LABEL: {{("#)?}}vreg_f16x4{{"?}}
299
+ // CHECK: //APP
300
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
301
+ // CHECK: //NO_APP
302
+ check ! ( vreg_f16x4 f16x4 vreg "fmov" "s" ) ;
284
303
285
304
// CHECK-LABEL: {{("#)?}}vreg_f32x2{{"?}}
286
305
// CHECK: //APP
@@ -318,6 +337,12 @@ check!(vreg_i32x4 i32x4 vreg "fmov" "s");
318
337
// CHECK: //NO_APP
319
338
check ! ( vreg_i64x2 i64x2 vreg "fmov" "s" ) ;
320
339
340
+ // CHECK-LABEL: {{("#)?}}vreg_f16x8{{"?}}
341
+ // CHECK: //APP
342
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
343
+ // CHECK: //NO_APP
344
+ check ! ( vreg_f16x8 f16x8 vreg "fmov" "s" ) ;
345
+
321
346
// CHECK-LABEL: {{("#)?}}vreg_f32x4{{"?}}
322
347
// CHECK: //APP
323
348
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -342,6 +367,12 @@ check!(vreg_low16_i8 i8 vreg_low16 "fmov" "s");
342
367
// CHECK: //NO_APP
343
368
check ! ( vreg_low16_i16 i16 vreg_low16 "fmov" "s" ) ;
344
369
370
+ // CHECK-LABEL: {{("#)?}}vreg_low16_f16{{"?}}
371
+ // CHECK: //APP
372
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
373
+ // CHECK: //NO_APP
374
+ check ! ( vreg_low16_f16 f16 vreg_low16 "fmov" "s" ) ;
375
+
345
376
// CHECK-LABEL: {{("#)?}}vreg_low16_f32{{"?}}
346
377
// CHECK: //APP
347
378
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -360,6 +391,12 @@ check!(vreg_low16_i64 i64 vreg_low16 "fmov" "s");
360
391
// CHECK: //NO_APP
361
392
check ! ( vreg_low16_f64 f64 vreg_low16 "fmov" "s" ) ;
362
393
394
+ // CHECK-LABEL: {{("#)?}}vreg_low16_f128{{"?}}
395
+ // CHECK: //APP
396
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
397
+ // CHECK: //NO_APP
398
+ check ! ( vreg_low16_f128 f128 vreg_low16 "fmov" "s" ) ;
399
+
363
400
// CHECK-LABEL: {{("#)?}}vreg_low16_ptr{{"?}}
364
401
// CHECK: //APP
365
402
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -390,6 +427,12 @@ check!(vreg_low16_i32x2 i32x2 vreg_low16 "fmov" "s");
390
427
// CHECK: //NO_APP
391
428
check ! ( vreg_low16_i64x1 i64x1 vreg_low16 "fmov" "s" ) ;
392
429
430
+ // CHECK-LABEL: {{("#)?}}vreg_low16_f16x4{{"?}}
431
+ // CHECK: //APP
432
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
433
+ // CHECK: //NO_APP
434
+ check ! ( vreg_low16_f16x4 f16x4 vreg_low16 "fmov" "s" ) ;
435
+
393
436
// CHECK-LABEL: {{("#)?}}vreg_low16_f32x2{{"?}}
394
437
// CHECK: //APP
395
438
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -426,6 +469,12 @@ check!(vreg_low16_i32x4 i32x4 vreg_low16 "fmov" "s");
426
469
// CHECK: //NO_APP
427
470
check ! ( vreg_low16_i64x2 i64x2 vreg_low16 "fmov" "s" ) ;
428
471
472
+ // CHECK-LABEL: {{("#)?}}vreg_low16_f16x8{{"?}}
473
+ // CHECK: //APP
474
+ // CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
475
+ // CHECK: //NO_APP
476
+ check ! ( vreg_low16_f16x8 f16x8 vreg_low16 "fmov" "s" ) ;
477
+
429
478
// CHECK-LABEL: {{("#)?}}vreg_low16_f32x4{{"?}}
430
479
// CHECK: //APP
431
480
// CHECK: fmov s{{[0-9]+}}, s{{[0-9]+}}
@@ -450,6 +499,12 @@ check_reg!(x0_i8 i8 "x0" "mov");
450
499
// CHECK: //NO_APP
451
500
check_reg ! ( x0_i16 i16 "x0" "mov" ) ;
452
501
502
+ // CHECK-LABEL: {{("#)?}}x0_f16{{"?}}
503
+ // CHECK: //APP
504
+ // CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
505
+ // CHECK: //NO_APP
506
+ check_reg ! ( x0_f16 f16 "x0" "mov" ) ;
507
+
453
508
// CHECK-LABEL: {{("#)?}}x0_i32{{"?}}
454
509
// CHECK: //APP
455
510
// CHECK: mov x{{[0-9]+}}, x{{[0-9]+}}
@@ -492,6 +547,12 @@ check_reg!(v0_i8 i8 "s0" "fmov");
492
547
// CHECK: //NO_APP
493
548
check_reg ! ( v0_i16 i16 "s0" "fmov" ) ;
494
549
550
+ // CHECK-LABEL: {{("#)?}}v0_f16{{"?}}
551
+ // CHECK: //APP
552
+ // CHECK: fmov s0, s0
553
+ // CHECK: //NO_APP
554
+ check_reg ! ( v0_f16 f16 "s0" "fmov" ) ;
555
+
495
556
// CHECK-LABEL: {{("#)?}}v0_i32{{"?}}
496
557
// CHECK: //APP
497
558
// CHECK: fmov s0, s0
@@ -516,6 +577,12 @@ check_reg!(v0_i64 i64 "s0" "fmov");
516
577
// CHECK: //NO_APP
517
578
check_reg ! ( v0_f64 f64 "s0" "fmov" ) ;
518
579
580
+ // CHECK-LABEL: {{("#)?}}v0_f128{{"?}}
581
+ // CHECK: //APP
582
+ // CHECK: fmov s0, s0
583
+ // CHECK: //NO_APP
584
+ check_reg ! ( v0_f128 f128 "s0" "fmov" ) ;
585
+
519
586
// CHECK-LABEL: {{("#)?}}v0_ptr{{"?}}
520
587
// CHECK: //APP
521
588
// CHECK: fmov s0, s0
@@ -546,6 +613,12 @@ check_reg!(v0_i32x2 i32x2 "s0" "fmov");
546
613
// CHECK: //NO_APP
547
614
check_reg ! ( v0_i64x1 i64x1 "s0" "fmov" ) ;
548
615
616
+ // CHECK-LABEL: {{("#)?}}v0_f16x4{{"?}}
617
+ // CHECK: //APP
618
+ // CHECK: fmov s0, s0
619
+ // CHECK: //NO_APP
620
+ check_reg ! ( v0_f16x4 f16x4 "s0" "fmov" ) ;
621
+
549
622
// CHECK-LABEL: {{("#)?}}v0_f32x2{{"?}}
550
623
// CHECK: //APP
551
624
// CHECK: fmov s0, s0
@@ -582,6 +655,12 @@ check_reg!(v0_i32x4 i32x4 "s0" "fmov");
582
655
// CHECK: //NO_APP
583
656
check_reg ! ( v0_i64x2 i64x2 "s0" "fmov" ) ;
584
657
658
+ // CHECK-LABEL: {{("#)?}}v0_f16x8{{"?}}
659
+ // CHECK: //APP
660
+ // CHECK: fmov s0, s0
661
+ // CHECK: //NO_APP
662
+ check_reg ! ( v0_f16x8 f16x8 "s0" "fmov" ) ;
663
+
585
664
// CHECK-LABEL: {{("#)?}}v0_f32x4{{"?}}
586
665
// CHECK: //APP
587
666
// CHECK: fmov s0, s0
0 commit comments