summaryrefslogtreecommitdiffstats
path: root/src/test/ui/asm/x86_64/type-check-3.rs
blob: 89c849c75234e78aa218991a1a2956abc40ac3fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// only-x86_64
// compile-flags: -C target-feature=+avx512f

#![feature(asm_const)]

use std::arch::{asm, global_asm};

use std::arch::x86_64::{_mm256_setzero_ps, _mm_setzero_ps};

fn main() {
    unsafe {
        // Types must be listed in the register class.

        asm!("{}", in(reg) 0i128);
        //~^ ERROR type `i128` cannot be used with this register class
        asm!("{}", in(reg) _mm_setzero_ps());
        //~^ ERROR type `__m128` cannot be used with this register class
        asm!("{}", in(reg) _mm256_setzero_ps());
        //~^ ERROR type `__m256` cannot be used with this register class
        asm!("{}", in(xmm_reg) 0u8);
        //~^ ERROR type `u8` cannot be used with this register class
        asm!("{:e}", in(reg) 0i32);
        asm!("{}", in(xmm_reg) 0i32);
        asm!("{:e}", in(reg) 0f32);
        asm!("{}", in(xmm_reg) 0f32);
        asm!("{}", in(xmm_reg) _mm_setzero_ps());
        asm!("{:x}", in(ymm_reg) _mm_setzero_ps());
        asm!("{}", in(kreg) 0u16);
        asm!("{}", in(kreg) 0u64);
        //~^ ERROR `avx512bw` target feature is not enabled

        // Template modifier suggestions for sub-registers

        asm!("{0} {0}", in(reg) 0i16);
        //~^ WARN formatting may not be suitable for sub-register argument
        asm!("{0} {0:x}", in(reg) 0i16);
        //~^ WARN formatting may not be suitable for sub-register argument
        asm!("{}", in(reg) 0i32);
        //~^ WARN formatting may not be suitable for sub-register argument
        asm!("{}", in(reg) 0i64);
        asm!("{}", in(ymm_reg) 0i64);
        //~^ WARN formatting may not be suitable for sub-register argument
        asm!("{}", in(ymm_reg) _mm256_setzero_ps());
        asm!("{:l}", in(reg) 0i16);
        asm!("{:l}", in(reg) 0i32);
        asm!("{:l}", in(reg) 0i64);
        asm!("{:x}", in(ymm_reg) 0i64);
        asm!("{:x}", in(ymm_reg) _mm256_setzero_ps());

        // Suggest different register class for type

        asm!("{}", in(reg) 0i8);
        //~^ ERROR type `i8` cannot be used with this register class
        asm!("{}", in(reg_byte) 0i8);

        // Split inout operands must have compatible types

        let mut val_i16: i16;
        let mut val_f32: f32;
        let mut val_u32: u32;
        let mut val_u64: u64;
        let mut val_ptr: *mut u8;
        asm!("{:r}", inout(reg) 0u16 => val_i16);
        asm!("{:r}", inout(reg) 0u32 => val_f32);
        //~^ ERROR incompatible types for asm inout argument
        asm!("{:r}", inout(reg) 0u32 => val_ptr);
        //~^ ERROR incompatible types for asm inout argument
        asm!("{:r}", inout(reg) main => val_u32);
        //~^ ERROR incompatible types for asm inout argument
        asm!("{:r}", inout(reg) 0u64 => val_ptr);
        asm!("{:r}", inout(reg) main => val_u64);
    }
}