2 // compile-flags: -C target-feature=+neon
4 #![feature(repr_simd, stdsimd, asm_const)]
6 use std
::arch
::aarch64
::float64x2_t
;
7 use std
::arch
::{asm, global_asm}
;
10 #[derive(Copy, Clone)]
11 struct Simd256bit(f64, f64, f64, f64);
14 let f64x2
: float64x2_t
= unsafe { std::mem::transmute(0i128) }
;
15 let f64x4
= Simd256bit(0.0, 0.0, 0.0, 0.0);
18 // Types must be listed in the register class.
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);
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
);
37 // Should be the same as vreg
38 asm
!("{:q}", in(vreg_low16
) f64x2
);
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
);
46 // Template modifier suggestions for sub-registers
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
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
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
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
80 // Split inout operands must have compatible types
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
);