2 // compile-flags: -C target-feature=+avx512f
4 #![feature(asm, global_asm, asm_const)]
6 use std
::arch
::x86_64
::{_mm256_setzero_ps, _mm_setzero_ps}
;
10 // Types must be listed in the register class.
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
30 // Template modifier suggestions for sub-registers
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());
48 // Suggest different register class for type
50 asm
!("{}", in(reg
) 0i8);
51 //~^ ERROR type `i8` cannot be used with this register class
52 asm
!("{}", in(reg_byte
) 0i8);
54 // Split inout operands must have compatible types
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
);
73 // Constants must be... constant
76 const fn const_foo(x
: i32) -> i32 {
79 const fn const_bar
<T
>(x
: T
) -> T
{
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