]> git.proxmox.com Git - rustc.git/blame - src/test/ui/asm/aarch64/type-check-3.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / src / test / ui / asm / aarch64 / type-check-3.rs
CommitLineData
c295e0f8
XL
1// only-aarch64
2// compile-flags: -C target-feature=+neon
3
a2a8927a 4#![feature(repr_simd, stdsimd, asm_const)]
c295e0f8
XL
5
6use std::arch::aarch64::float64x2_t;
a2a8927a 7use std::arch::{asm, global_asm};
c295e0f8
XL
8
9#[repr(simd)]
10#[derive(Copy, Clone)]
3c0e092e 11struct Simd256bit(f64, f64, f64, f64);
c295e0f8
XL
12
13fn 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}