1 // assembly-output: ptx-linker
2 // compile-flags: --crate-type cdylib -C target-cpu=sm_86
6 // The following ABI tests are made with nvcc 11.6 does.
8 // The PTX ABI stability is tied to major versions of the PTX ISA
9 // These tests assume major version 7
12 // The following correspondence between types are assumed:
15 // [T, N] - std::array<T, N>
21 #![feature(abi_ptx, lang_items, no_core)]
48 pub struct TripleU16 {
54 pub struct TripleU32 {
60 pub struct TripleU64 {
67 pub struct DoubleFloat {
73 pub struct TripleFloat {
80 pub struct TripleDouble {
87 pub struct ManyIntegers {
95 pub struct ManyNumerics {
104 // CHECK: .visible .entry f_u8_arg(
105 // CHECK: .param .u8 f_u8_arg_param_0
107 pub unsafe extern "ptx-kernel" fn f_u8_arg(_a: u8) {}
109 // CHECK: .visible .entry f_u16_arg(
110 // CHECK: .param .u16 f_u16_arg_param_0
112 pub unsafe extern "ptx-kernel" fn f_u16_arg(_a: u16) {}
114 // CHECK: .visible .entry f_u32_arg(
115 // CHECK: .param .u32 f_u32_arg_param_0
117 pub unsafe extern "ptx-kernel" fn f_u32_arg(_a: u32) {}
119 // CHECK: .visible .entry f_u64_arg(
120 // CHECK: .param .u64 f_u64_arg_param_0
122 pub unsafe extern "ptx-kernel" fn f_u64_arg(_a: u64) {}
124 // CHECK: .visible .entry f_u128_arg(
125 // CHECK: .param .align 16 .b8 f_u128_arg_param_0[16]
127 pub unsafe extern "ptx-kernel" fn f_u128_arg(_a: u128) {}
129 // CHECK: .visible .entry f_i8_arg(
130 // CHECK: .param .u8 f_i8_arg_param_0
132 pub unsafe extern "ptx-kernel" fn f_i8_arg(_a: i8) {}
134 // CHECK: .visible .entry f_i16_arg(
135 // CHECK: .param .u16 f_i16_arg_param_0
137 pub unsafe extern "ptx-kernel" fn f_i16_arg(_a: i16) {}
139 // CHECK: .visible .entry f_i32_arg(
140 // CHECK: .param .u32 f_i32_arg_param_0
142 pub unsafe extern "ptx-kernel" fn f_i32_arg(_a: i32) {}
144 // CHECK: .visible .entry f_i64_arg(
145 // CHECK: .param .u64 f_i64_arg_param_0
147 pub unsafe extern "ptx-kernel" fn f_i64_arg(_a: i64) {}
149 // CHECK: .visible .entry f_i128_arg(
150 // CHECK: .param .align 16 .b8 f_i128_arg_param_0[16]
152 pub unsafe extern "ptx-kernel" fn f_i128_arg(_a: i128) {}
154 // CHECK: .visible .entry f_f32_arg(
155 // CHECK: .param .f32 f_f32_arg_param_0
157 pub unsafe extern "ptx-kernel" fn f_f32_arg(_a: f32) {}
159 // CHECK: .visible .entry f_f64_arg(
160 // CHECK: .param .f64 f_f64_arg_param_0
162 pub unsafe extern "ptx-kernel" fn f_f64_arg(_a: f64) {}
164 // CHECK: .visible .entry f_single_u8_arg(
165 // CHECK: .param .align 1 .b8 f_single_u8_arg_param_0[1]
167 pub unsafe extern "ptx-kernel" fn f_single_u8_arg(_a: SingleU8) {}
169 // CHECK: .visible .entry f_double_u8_arg(
170 // CHECK: .param .align 1 .b8 f_double_u8_arg_param_0[2]
172 pub unsafe extern "ptx-kernel" fn f_double_u8_arg(_a: DoubleU8) {}
174 // CHECK: .visible .entry f_triple_u8_arg(
175 // CHECK: .param .align 1 .b8 f_triple_u8_arg_param_0[3]
177 pub unsafe extern "ptx-kernel" fn f_triple_u8_arg(_a: TripleU8) {}
179 // CHECK: .visible .entry f_triple_u16_arg(
180 // CHECK: .param .align 2 .b8 f_triple_u16_arg_param_0[6]
182 pub unsafe extern "ptx-kernel" fn f_triple_u16_arg(_a: TripleU16) {}
184 // CHECK: .visible .entry f_triple_u32_arg(
185 // CHECK: .param .align 4 .b8 f_triple_u32_arg_param_0[12]
187 pub unsafe extern "ptx-kernel" fn f_triple_u32_arg(_a: TripleU32) {}
189 // CHECK: .visible .entry f_triple_u64_arg(
190 // CHECK: .param .align 8 .b8 f_triple_u64_arg_param_0[24]
192 pub unsafe extern "ptx-kernel" fn f_triple_u64_arg(_a: TripleU64) {}
194 // CHECK: .visible .entry f_many_integers_arg(
195 // CHECK: .param .align 8 .b8 f_many_integers_arg_param_0[16]
197 pub unsafe extern "ptx-kernel" fn f_many_integers_arg(_a: ManyIntegers) {}
199 // CHECK: .visible .entry f_double_float_arg(
200 // CHECK: .param .align 4 .b8 f_double_float_arg_param_0[8]
202 pub unsafe extern "ptx-kernel" fn f_double_float_arg(_a: DoubleFloat) {}
204 // CHECK: .visible .entry f_triple_float_arg(
205 // CHECK: .param .align 4 .b8 f_triple_float_arg_param_0[12]
207 pub unsafe extern "ptx-kernel" fn f_triple_float_arg(_a: TripleFloat) {}
209 // CHECK: .visible .entry f_triple_double_arg(
210 // CHECK: .param .align 8 .b8 f_triple_double_arg_param_0[24]
212 pub unsafe extern "ptx-kernel" fn f_triple_double_arg(_a: TripleDouble) {}
214 // CHECK: .visible .entry f_many_numerics_arg(
215 // CHECK: .param .align 8 .b8 f_many_numerics_arg_param_0[32]
217 pub unsafe extern "ptx-kernel" fn f_many_numerics_arg(_a: ManyNumerics) {}
219 // CHECK: .visible .entry f_byte_array_arg(
220 // CHECK: .param .align 1 .b8 f_byte_array_arg_param_0[5]
222 pub unsafe extern "ptx-kernel" fn f_byte_array_arg(_a: [u8; 5]) {}
224 // CHECK: .visible .entry f_float_array_arg(
225 // CHECK: .param .align 4 .b8 f_float_array_arg_param_0[20]
227 pub unsafe extern "ptx-kernel" fn f_float_array_arg(_a: [f32; 5]) {}
229 // CHECK: .visible .entry f_u128_array_arg(
230 // CHECK: .param .align 16 .b8 f_u128_array_arg_param_0[80]
232 pub unsafe extern "ptx-kernel" fn f_u128_array_arg(_a: [u128; 5]) {}
234 // CHECK: .visible .entry f_u32_slice_arg(
235 // CHECK: .param .u64 f_u32_slice_arg_param_0
236 // CHECK: .param .u64 f_u32_slice_arg_param_1
238 pub unsafe extern "ptx-kernel" fn f_u32_slice_arg(_a: &[u32]) {}
240 // CHECK: .visible .entry f_tuple_u8_u8_arg(
241 // CHECK: .param .align 1 .b8 f_tuple_u8_u8_arg_param_0[2]
243 pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_arg(_a: (u8, u8)) {}
245 // CHECK: .visible .entry f_tuple_u32_u32_arg(
246 // CHECK: .param .align 4 .b8 f_tuple_u32_u32_arg_param_0[8]
248 pub unsafe extern "ptx-kernel" fn f_tuple_u32_u32_arg(_a: (u32, u32)) {}
251 // CHECK: .visible .entry f_tuple_u8_u8_u32_arg(
252 // CHECK: .param .align 4 .b8 f_tuple_u8_u8_u32_arg_param_0[8]
254 pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_u32_arg(_a: (u8, u8, u32)) {}