]> git.proxmox.com Git - rustc.git/blob - src/test/ui/asm/x86_64/type-check-3.rs
New upstream version 1.58.1+dfsg1
[rustc.git] / src / test / ui / asm / x86_64 / type-check-3.rs
1 // only-x86_64
2 // compile-flags: -C target-feature=+avx512f
3
4 #![feature(asm, global_asm, asm_const)]
5
6 use std::arch::x86_64::{_mm256_setzero_ps, _mm_setzero_ps};
7
8 fn main() {
9 unsafe {
10 // Types must be listed in the register class.
11
12 asm!("{}", in(reg) 0i128);
13 //~^ ERROR type `i128` cannot be used with this register class
14 asm!("{}", in(reg) _mm_setzero_ps());
15 //~^ ERROR type `__m128` cannot be used with this register class
16 asm!("{}", in(reg) _mm256_setzero_ps());
17 //~^ ERROR type `__m256` cannot be used with this register class
18 asm!("{}", in(xmm_reg) 0u8);
19 //~^ ERROR type `u8` cannot be used with this register class
20 asm!("{:e}", in(reg) 0i32);
21 asm!("{}", in(xmm_reg) 0i32);
22 asm!("{:e}", in(reg) 0f32);
23 asm!("{}", in(xmm_reg) 0f32);
24 asm!("{}", in(xmm_reg) _mm_setzero_ps());
25 asm!("{:x}", in(ymm_reg) _mm_setzero_ps());
26 asm!("{}", in(kreg) 0u16);
27 asm!("{}", in(kreg) 0u64);
28 //~^ ERROR `avx512bw` target feature is not enabled
29
30 // Template modifier suggestions for sub-registers
31
32 asm!("{0} {0}", in(reg) 0i16);
33 //~^ WARN formatting may not be suitable for sub-register argument
34 asm!("{0} {0:x}", in(reg) 0i16);
35 //~^ WARN formatting may not be suitable for sub-register argument
36 asm!("{}", in(reg) 0i32);
37 //~^ WARN formatting may not be suitable for sub-register argument
38 asm!("{}", in(reg) 0i64);
39 asm!("{}", in(ymm_reg) 0i64);
40 //~^ WARN formatting may not be suitable for sub-register argument
41 asm!("{}", in(ymm_reg) _mm256_setzero_ps());
42 asm!("{:l}", in(reg) 0i16);
43 asm!("{:l}", in(reg) 0i32);
44 asm!("{:l}", in(reg) 0i64);
45 asm!("{:x}", in(ymm_reg) 0i64);
46 asm!("{:x}", in(ymm_reg) _mm256_setzero_ps());
47
48 // Suggest different register class for type
49
50 asm!("{}", in(reg) 0i8);
51 //~^ ERROR type `i8` cannot be used with this register class
52 asm!("{}", in(reg_byte) 0i8);
53
54 // Split inout operands must have compatible types
55
56 let mut val_i16: i16;
57 let mut val_f32: f32;
58 let mut val_u32: u32;
59 let mut val_u64: u64;
60 let mut val_ptr: *mut u8;
61 asm!("{:r}", inout(reg) 0u16 => val_i16);
62 asm!("{:r}", inout(reg) 0u32 => val_f32);
63 //~^ ERROR incompatible types for asm inout argument
64 asm!("{:r}", inout(reg) 0u32 => val_ptr);
65 //~^ ERROR incompatible types for asm inout argument
66 asm!("{:r}", inout(reg) main => val_u32);
67 //~^ ERROR incompatible types for asm inout argument
68 asm!("{:r}", inout(reg) 0u64 => val_ptr);
69 asm!("{:r}", inout(reg) main => val_u64);
70 }
71 }
72
73 // Constants must be... constant
74
75 static S: i32 = 1;
76 const fn const_foo(x: i32) -> i32 {
77 x
78 }
79 const fn const_bar<T>(x: T) -> T {
80 x
81 }
82 global_asm!("{}", const S);
83 //~^ ERROR constants cannot refer to statics
84 global_asm!("{}", const const_foo(0));
85 global_asm!("{}", const const_foo(S));
86 //~^ ERROR constants cannot refer to statics
87 global_asm!("{}", const const_bar(0));
88 global_asm!("{}", const const_bar(S));
89 //~^ ERROR constants cannot refer to statics