]>
Commit | Line | Data |
---|---|---|
f9f354fc XL |
1 | // assembly-output: emit-asm |
2 | // compile-flags: --target nvptx64-nvidia-cuda | |
3 | // compile-flags: --crate-type cdylib | |
3dfed10e | 4 | // needs-llvm-components: nvptx |
f9f354fc | 5 | |
2b03887a | 6 | #![feature(no_core, lang_items, rustc_attrs, asm_experimental_arch)] |
f9f354fc XL |
7 | #![no_core] |
8 | ||
9 | #[rustc_builtin_macro] | |
10 | macro_rules! asm { | |
11 | () => {}; | |
12 | } | |
13 | #[rustc_builtin_macro] | |
14 | macro_rules! concat { | |
15 | () => {}; | |
16 | } | |
17 | ||
18 | #[lang = "sized"] | |
19 | trait Sized {} | |
20 | #[lang = "copy"] | |
21 | trait Copy {} | |
22 | ||
23 | type ptr = *mut u8; | |
24 | ||
25 | impl Copy for i8 {} | |
26 | impl Copy for i16 {} | |
27 | impl Copy for i32 {} | |
28 | impl Copy for f32 {} | |
29 | impl Copy for i64 {} | |
30 | impl Copy for f64 {} | |
31 | impl Copy for ptr {} | |
32 | ||
33 | // NVPTX does not support static variables | |
34 | #[no_mangle] | |
35 | fn extern_func() {} | |
36 | ||
37 | // CHECK-LABEL: .visible .func sym_fn() | |
38 | // CHECK: // begin inline asm | |
39 | // CHECK: call extern_func; | |
40 | // CHECK: // end inline asm | |
41 | #[no_mangle] | |
42 | pub unsafe fn sym_fn() { | |
43 | asm!("call {};", sym extern_func); | |
44 | } | |
45 | ||
46 | macro_rules! check { | |
47 | ($func:ident $ty:ident $class:ident $mov:literal) => { | |
48 | #[no_mangle] | |
49 | pub unsafe fn $func(x: $ty) -> $ty { | |
50 | let y; | |
51 | asm!(concat!($mov, " {}, {};"), out($class) y, in($class) x); | |
52 | y | |
53 | } | |
54 | }; | |
55 | } | |
56 | ||
57 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg16_i8 | |
58 | // CHECK: // begin inline asm | |
59 | // CHECK: mov.i16 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
60 | // CHECK: // end inline asm | |
61 | check!(reg16_i8 i8 reg16 "mov.i16"); | |
62 | ||
63 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg16_i16 | |
64 | // CHECK: // begin inline asm | |
65 | // CHECK: mov.i16 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
66 | // CHECK: // end inline asm | |
67 | check!(reg16_i16 i16 reg16 "mov.i16"); | |
68 | ||
69 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg32_i8 | |
70 | // CHECK: // begin inline asm | |
71 | // CHECK: mov.i32 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
72 | // CHECK: // end inline asm | |
73 | check!(reg32_i8 i8 reg32 "mov.i32"); | |
74 | ||
75 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg32_i16 | |
76 | // CHECK: // begin inline asm | |
77 | // CHECK: mov.i32 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
78 | // CHECK: // end inline asm | |
79 | check!(reg32_i16 i16 reg32 "mov.i32"); | |
80 | ||
81 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg32_i32 | |
82 | // CHECK: // begin inline asm | |
83 | // CHECK: mov.i32 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
84 | // CHECK: // end inline asm | |
85 | check!(reg32_i32 i32 reg32 "mov.i32"); | |
86 | ||
87 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg32_f32 | |
88 | // CHECK: // begin inline asm | |
89 | // CHECK: mov.i32 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
90 | // CHECK: // end inline asm | |
91 | check!(reg32_f32 f32 reg32 "mov.i32"); | |
92 | ||
93 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg64_i8 | |
94 | // CHECK: // begin inline asm | |
95 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
96 | // CHECK: // end inline asm | |
97 | check!(reg64_i8 i8 reg64 "mov.i64"); | |
98 | ||
99 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg64_i16 | |
100 | // CHECK: // begin inline asm | |
101 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
102 | // CHECK: // end inline asm | |
103 | check!(reg64_i16 i16 reg64 "mov.i64"); | |
104 | ||
105 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg64_i32 | |
106 | // CHECK: // begin inline asm | |
107 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
108 | // CHECK: // end inline asm | |
109 | check!(reg64_i32 i32 reg64 "mov.i64"); | |
110 | ||
111 | // CHECK-LABEL: .visible .func (.param .b32 func_retval0) reg64_f32 | |
112 | // CHECK: // begin inline asm | |
113 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
114 | // CHECK: // end inline asm | |
115 | check!(reg64_f32 f32 reg64 "mov.i64"); | |
116 | ||
117 | // CHECK-LABEL: .visible .func (.param .b64 func_retval0) reg64_i64 | |
118 | // CHECK: // begin inline asm | |
119 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
120 | // CHECK: // end inline asm | |
121 | check!(reg64_i64 i64 reg64 "mov.i64"); | |
122 | ||
123 | // CHECK-LABEL: .visible .func (.param .b64 func_retval0) reg64_f64 | |
124 | // CHECK: // begin inline asm | |
125 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
126 | // CHECK: // end inline asm | |
127 | check!(reg64_f64 f64 reg64 "mov.i64"); | |
128 | ||
129 | // CHECK-LABEL: .visible .func (.param .b64 func_retval0) reg64_ptr | |
130 | // CHECK: // begin inline asm | |
131 | // CHECK: mov.i64 %{{[a-z0-9]+}}, %{{[a-z0-9]+}}; | |
132 | // CHECK: // end inline asm | |
133 | check!(reg64_ptr ptr reg64 "mov.i64"); |