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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// only-aarch64
// compile-flags: -C target-feature=+neon
#![feature(repr_simd, stdsimd, asm_const)]
use std::arch::aarch64::float64x2_t;
use std::arch::{asm, global_asm};
#[repr(simd)]
#[derive(Copy, Clone)]
struct Simd256bit(f64, f64, f64, f64);
fn main() {
let f64x2: float64x2_t = unsafe { std::mem::transmute(0i128) };
let f64x4 = Simd256bit(0.0, 0.0, 0.0, 0.0);
unsafe {
// Types must be listed in the register class.
// Success cases
asm!("{:w}", in(reg) 0u8);
asm!("{:w}", in(reg) 0u16);
asm!("{:w}", in(reg) 0u32);
asm!("{:w}", in(reg) 0f32);
asm!("{}", in(reg) 0i64);
asm!("{}", in(reg) 0f64);
asm!("{:b}", in(vreg) 0u8);
asm!("{:h}", in(vreg) 0u16);
asm!("{:s}", in(vreg) 0u32);
asm!("{:s}", in(vreg) 0f32);
asm!("{:d}", in(vreg) 0u64);
asm!("{:d}", in(vreg) 0f64);
asm!("{:q}", in(vreg) f64x2);
asm!("{:v}", in(vreg) f64x2);
// Should be the same as vreg
asm!("{:q}", in(vreg_low16) f64x2);
// Template modifiers of a different size to the argument are fine
asm!("{:w}", in(reg) 0u64);
asm!("{:x}", in(reg) 0u32);
asm!("{:b}", in(vreg) 0u64);
asm!("{:d}", in(vreg_low16) f64x2);
// Template modifier suggestions for sub-registers
asm!("{}", in(reg) 0u8);
//~^ WARN formatting may not be suitable for sub-register argument
asm!("{}", in(reg) 0u16);
//~^ 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) 0f32);
//~^ WARN formatting may not be suitable for sub-register argument
asm!("{}", in(vreg) 0i16);
//~^ WARN formatting may not be suitable for sub-register argument
asm!("{}", in(vreg) 0f32);
//~^ WARN formatting may not be suitable for sub-register argument
asm!("{}", in(vreg) 0f64);
//~^ WARN formatting may not be suitable for sub-register argument
asm!("{}", in(vreg_low16) 0f64);
//~^ WARN formatting may not be suitable for sub-register argument
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
// Invalid registers
asm!("{}", in(reg) 0i128);
//~^ ERROR type `i128` cannot be used with this register class
asm!("{}", in(reg) f64x2);
//~^ ERROR type `float64x2_t` cannot be used with this register class
asm!("{}", in(vreg) f64x4);
//~^ ERROR type `Simd256bit` cannot be used with this register class
// 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!("{:x}", inout(reg) 0u16 => val_i16);
asm!("{:x}", inout(reg) 0u32 => val_f32);
//~^ ERROR incompatible types for asm inout argument
asm!("{:x}", inout(reg) 0u32 => val_ptr);
//~^ ERROR incompatible types for asm inout argument
asm!("{:x}", inout(reg) main => val_u32);
//~^ ERROR incompatible types for asm inout argument
asm!("{:x}", inout(reg) 0u64 => val_ptr);
asm!("{:x}", inout(reg) main => val_u64);
}
}
|