2024-05-10 11:39:05 -05:00
|
|
|
//@ assembly-output: ptx-linker
|
|
|
|
//@ compile-flags: --crate-type cdylib -C target-cpu=sm_86 -Z unstable-options -Clinker-flavor=llbc
|
|
|
|
//@ only-nvptx64
|
|
|
|
|
|
|
|
// The PTX ABI stability is tied to major versions of the PTX ISA
|
|
|
|
// These tests assume major version 7
|
|
|
|
|
|
|
|
// CHECK: .version 7
|
|
|
|
|
|
|
|
#![feature(abi_ptx, lang_items, no_core)]
|
|
|
|
#![no_core]
|
|
|
|
|
|
|
|
#[lang = "sized"]
|
|
|
|
trait Sized {}
|
|
|
|
#[lang = "copy"]
|
|
|
|
trait Copy {}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct SingleU8 {
|
|
|
|
f: u8,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct DoubleU8 {
|
|
|
|
f: u8,
|
|
|
|
g: u8,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct TripleU8 {
|
|
|
|
f: u8,
|
|
|
|
g: u8,
|
|
|
|
h: u8,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct TripleU16 {
|
|
|
|
f: u16,
|
|
|
|
g: u16,
|
|
|
|
h: u16,
|
|
|
|
}
|
|
|
|
#[repr(C)]
|
2024-05-31 16:12:33 -05:00
|
|
|
pub struct DoubleI32 {
|
|
|
|
f: i32,
|
|
|
|
g: i32,
|
|
|
|
}
|
|
|
|
#[repr(C)]
|
2024-05-10 11:39:05 -05:00
|
|
|
pub struct TripleU32 {
|
|
|
|
f: u32,
|
|
|
|
g: u32,
|
|
|
|
h: u32,
|
|
|
|
}
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct TripleU64 {
|
|
|
|
f: u64,
|
|
|
|
g: u64,
|
|
|
|
h: u64,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct DoubleFloat {
|
|
|
|
f: f32,
|
|
|
|
g: f32,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct TripleFloat {
|
|
|
|
f: f32,
|
|
|
|
g: f32,
|
|
|
|
h: f32,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct TripleDouble {
|
|
|
|
f: f64,
|
|
|
|
g: f64,
|
|
|
|
h: f64,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct ManyIntegers {
|
|
|
|
f: u8,
|
|
|
|
g: u16,
|
|
|
|
h: u32,
|
|
|
|
i: u64,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct ManyNumerics {
|
|
|
|
f: u8,
|
|
|
|
g: u16,
|
|
|
|
h: u32,
|
|
|
|
i: u64,
|
|
|
|
j: f32,
|
|
|
|
k: f64,
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_u8_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_u8_ret() -> u8 {
|
|
|
|
0
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_u16_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_u16_ret() -> u16 {
|
|
|
|
1
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_u32_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_u32_ret() -> u32 {
|
|
|
|
2
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b64 func_retval0) f_u64_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_u64_ret() -> u64 {
|
|
|
|
3
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 16 .b8 func_retval0[16]) f_u128_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_u128_ret() -> u128 {
|
|
|
|
4
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_i8_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_i8_ret() -> i8 {
|
|
|
|
5
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_i16_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_i16_ret() -> i16 {
|
|
|
|
6
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_i32_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_i32_ret() -> i32 {
|
|
|
|
7
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b64 func_retval0) f_i64_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_i64_ret() -> i64 {
|
|
|
|
8
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 16 .b8 func_retval0[16]) f_i128_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_i128_ret() -> i128 {
|
|
|
|
9
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b32 func_retval0) f_f32_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_f32_ret() -> f32 {
|
|
|
|
10.0
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .b64 func_retval0) f_f64_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_f64_ret() -> f64 {
|
|
|
|
11.0
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 1 .b8 func_retval0[1]) f_single_u8_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_single_u8_ret() -> SingleU8 {
|
|
|
|
SingleU8 { f: 12 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 1 .b8 func_retval0[2]) f_double_u8_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_double_u8_ret() -> DoubleU8 {
|
|
|
|
DoubleU8 { f: 13, g: 14 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 1 .b8 func_retval0[3]) f_triple_u8_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_u8_ret() -> TripleU8 {
|
|
|
|
TripleU8 { f: 15, g: 16, h: 17 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 2 .b8 func_retval0[6]) f_triple_u16_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_u16_ret() -> TripleU16 {
|
|
|
|
TripleU16 { f: 18, g: 19, h: 20 }
|
|
|
|
}
|
|
|
|
|
2024-05-31 16:12:33 -05:00
|
|
|
// CHECK: .visible .func (.param .align 4 .b8 func_retval0[8]) f_double_i32_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_double_i32_ret() -> DoubleI32 {
|
|
|
|
DoubleI32 { f: 1, g: 2 }
|
|
|
|
}
|
|
|
|
|
2024-05-10 11:39:05 -05:00
|
|
|
// CHECK: .visible .func (.param .align 4 .b8 func_retval0[12]) f_triple_u32_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_u32_ret() -> TripleU32 {
|
|
|
|
TripleU32 { f: 20, g: 21, h: 22 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 8 .b8 func_retval0[24]) f_triple_u64_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_u64_ret() -> TripleU64 {
|
|
|
|
TripleU64 { f: 23, g: 24, h: 25 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 8 .b8 func_retval0[16]) f_many_integers_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_many_integers_ret() -> ManyIntegers {
|
|
|
|
ManyIntegers { f: 26, g: 27, h: 28, i: 29 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 4 .b8 func_retval0[8]) f_double_float_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_double_float_ret() -> DoubleFloat {
|
|
|
|
DoubleFloat { f: 29.0, g: 30.0 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 4 .b8 func_retval0[12]) f_triple_float_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_float_ret() -> TripleFloat {
|
|
|
|
TripleFloat { f: 31.0, g: 32.0, h: 33.0 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 8 .b8 func_retval0[24]) f_triple_double_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_triple_double_ret() -> TripleDouble {
|
|
|
|
TripleDouble { f: 34.0, g: 35.0, h: 36.0 }
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: .visible .func (.param .align 8 .b8 func_retval0[32]) f_many_numerics_ret(
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn f_many_numerics_ret() -> ManyNumerics {
|
|
|
|
ManyNumerics { f: 37, g: 38, h: 39, i: 40, j: 41.0, k: 43.0 }
|
|
|
|
}
|