]>
Commit | Line | Data |
---|---|---|
c295e0f8 XL |
1 | // only-aarch64 |
2 | // compile-flags: -C target-feature=+neon | |
3 | ||
a2a8927a | 4 | #![feature(repr_simd, stdsimd, asm_const)] |
c295e0f8 XL |
5 | |
6 | use std::arch::aarch64::float64x2_t; | |
a2a8927a | 7 | use std::arch::{asm, global_asm}; |
c295e0f8 XL |
8 | |
9 | #[repr(simd)] | |
10 | #[derive(Copy, Clone)] | |
3c0e092e | 11 | struct Simd256bit(f64, f64, f64, f64); |
c295e0f8 XL |
12 | |
13 | fn main() { | |
14 | let f64x2: float64x2_t = unsafe { std::mem::transmute(0i128) }; | |
15 | let f64x4 = Simd256bit(0.0, 0.0, 0.0, 0.0); | |
16 | ||
17 | unsafe { | |
18 | // Types must be listed in the register class. | |
19 | ||
20 | // Success cases | |
21 | asm!("{:w}", in(reg) 0u8); | |
22 | asm!("{:w}", in(reg) 0u16); | |
23 | asm!("{:w}", in(reg) 0u32); | |
24 | asm!("{:w}", in(reg) 0f32); | |
25 | asm!("{}", in(reg) 0i64); | |
26 | asm!("{}", in(reg) 0f64); | |
27 | ||
28 | asm!("{:b}", in(vreg) 0u8); | |
29 | asm!("{:h}", in(vreg) 0u16); | |
30 | asm!("{:s}", in(vreg) 0u32); | |
31 | asm!("{:s}", in(vreg) 0f32); | |
32 | asm!("{:d}", in(vreg) 0u64); | |
33 | asm!("{:d}", in(vreg) 0f64); | |
34 | asm!("{:q}", in(vreg) f64x2); | |
35 | asm!("{:v}", in(vreg) f64x2); | |
36 | ||
37 | // Should be the same as vreg | |
38 | asm!("{:q}", in(vreg_low16) f64x2); | |
39 | ||
40 | // Template modifiers of a different size to the argument are fine | |
41 | asm!("{:w}", in(reg) 0u64); | |
42 | asm!("{:x}", in(reg) 0u32); | |
43 | asm!("{:b}", in(vreg) 0u64); | |
44 | asm!("{:d}", in(vreg_low16) f64x2); | |
45 | ||
c295e0f8 XL |
46 | // Template modifier suggestions for sub-registers |
47 | ||
48 | asm!("{}", in(reg) 0u8); | |
49 | //~^ WARN formatting may not be suitable for sub-register argument | |
50 | asm!("{}", in(reg) 0u16); | |
51 | //~^ WARN formatting may not be suitable for sub-register argument | |
52 | asm!("{}", in(reg) 0i32); | |
53 | //~^ WARN formatting may not be suitable for sub-register argument | |
54 | asm!("{}", in(reg) 0f32); | |
55 | //~^ WARN formatting may not be suitable for sub-register argument | |
56 | ||
57 | asm!("{}", in(vreg) 0i16); | |
58 | //~^ WARN formatting may not be suitable for sub-register argument | |
59 | asm!("{}", in(vreg) 0f32); | |
60 | //~^ WARN formatting may not be suitable for sub-register argument | |
61 | asm!("{}", in(vreg) 0f64); | |
62 | //~^ WARN formatting may not be suitable for sub-register argument | |
63 | asm!("{}", in(vreg_low16) 0f64); | |
64 | //~^ WARN formatting may not be suitable for sub-register argument | |
65 | ||
66 | asm!("{0} {0}", in(reg) 0i16); | |
67 | //~^ WARN formatting may not be suitable for sub-register argument | |
68 | asm!("{0} {0:x}", in(reg) 0i16); | |
69 | //~^ WARN formatting may not be suitable for sub-register argument | |
70 | ||
71 | // Invalid registers | |
72 | ||
73 | asm!("{}", in(reg) 0i128); | |
74 | //~^ ERROR type `i128` cannot be used with this register class | |
75 | asm!("{}", in(reg) f64x2); | |
76 | //~^ ERROR type `float64x2_t` cannot be used with this register class | |
77 | asm!("{}", in(vreg) f64x4); | |
78 | //~^ ERROR type `Simd256bit` cannot be used with this register class | |
79 | ||
80 | // Split inout operands must have compatible types | |
81 | ||
82 | let mut val_i16: i16; | |
83 | let mut val_f32: f32; | |
84 | let mut val_u32: u32; | |
85 | let mut val_u64: u64; | |
86 | let mut val_ptr: *mut u8; | |
87 | asm!("{:x}", inout(reg) 0u16 => val_i16); | |
88 | asm!("{:x}", inout(reg) 0u32 => val_f32); | |
89 | //~^ ERROR incompatible types for asm inout argument | |
90 | asm!("{:x}", inout(reg) 0u32 => val_ptr); | |
91 | //~^ ERROR incompatible types for asm inout argument | |
92 | asm!("{:x}", inout(reg) main => val_u32); | |
93 | //~^ ERROR incompatible types for asm inout argument | |
94 | asm!("{:x}", inout(reg) 0u64 => val_ptr); | |
95 | asm!("{:x}", inout(reg) main => val_u64); | |
96 | } | |
97 | } |