]> git.lizzy.rs Git - rust.git/blob - src/test/ui/asm/x86_64/type-check-3.rs
Rollup merge of #97325 - tmiasko:capture-enum-field, r=arora-aman
[rust.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_const)]
5
6 use std::arch::{asm, global_asm};
7
8 use std::arch::x86_64::{_mm256_setzero_ps, _mm_setzero_ps};
9
10 fn main() {
11     unsafe {
12         // Types must be listed in the register class.
13
14         asm!("{}", in(reg) 0i128);
15         //~^ ERROR type `i128` cannot be used with this register class
16         asm!("{}", in(reg) _mm_setzero_ps());
17         //~^ ERROR type `__m128` cannot be used with this register class
18         asm!("{}", in(reg) _mm256_setzero_ps());
19         //~^ ERROR type `__m256` cannot be used with this register class
20         asm!("{}", in(xmm_reg) 0u8);
21         //~^ ERROR type `u8` cannot be used with this register class
22         asm!("{:e}", in(reg) 0i32);
23         asm!("{}", in(xmm_reg) 0i32);
24         asm!("{:e}", in(reg) 0f32);
25         asm!("{}", in(xmm_reg) 0f32);
26         asm!("{}", in(xmm_reg) _mm_setzero_ps());
27         asm!("{:x}", in(ymm_reg) _mm_setzero_ps());
28         asm!("{}", in(kreg) 0u16);
29         asm!("{}", in(kreg) 0u64);
30         //~^ ERROR `avx512bw` target feature is not enabled
31
32         // Template modifier suggestions for sub-registers
33
34         asm!("{0} {0}", in(reg) 0i16);
35         //~^ WARN formatting may not be suitable for sub-register argument
36         asm!("{0} {0:x}", in(reg) 0i16);
37         //~^ WARN formatting may not be suitable for sub-register argument
38         asm!("{}", in(reg) 0i32);
39         //~^ WARN formatting may not be suitable for sub-register argument
40         asm!("{}", in(reg) 0i64);
41         asm!("{}", in(ymm_reg) 0i64);
42         //~^ WARN formatting may not be suitable for sub-register argument
43         asm!("{}", in(ymm_reg) _mm256_setzero_ps());
44         asm!("{:l}", in(reg) 0i16);
45         asm!("{:l}", in(reg) 0i32);
46         asm!("{:l}", in(reg) 0i64);
47         asm!("{:x}", in(ymm_reg) 0i64);
48         asm!("{:x}", in(ymm_reg) _mm256_setzero_ps());
49
50         // Suggest different register class for type
51
52         asm!("{}", in(reg) 0i8);
53         //~^ ERROR type `i8` cannot be used with this register class
54         asm!("{}", in(reg_byte) 0i8);
55
56         // Split inout operands must have compatible types
57
58         let mut val_i16: i16;
59         let mut val_f32: f32;
60         let mut val_u32: u32;
61         let mut val_u64: u64;
62         let mut val_ptr: *mut u8;
63         asm!("{:r}", inout(reg) 0u16 => val_i16);
64         asm!("{:r}", inout(reg) 0u32 => val_f32);
65         //~^ ERROR incompatible types for asm inout argument
66         asm!("{:r}", inout(reg) 0u32 => val_ptr);
67         //~^ ERROR incompatible types for asm inout argument
68         asm!("{:r}", inout(reg) main => val_u32);
69         //~^ ERROR incompatible types for asm inout argument
70         asm!("{:r}", inout(reg) 0u64 => val_ptr);
71         asm!("{:r}", inout(reg) main => val_u64);
72     }
73 }