Skip to content

Commit

Permalink
tests: Add tests for LoongArch64
Browse files Browse the repository at this point in the history
  • Loading branch information
heiher committed Apr 29, 2023
1 parent f229949 commit 4375d3b
Show file tree
Hide file tree
Showing 18 changed files with 364 additions and 23 deletions.
1 change: 1 addition & 0 deletions tests/codegen/abi-main-signature-16bit-c-int.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
// ignore-wasm32
// ignore-x86
// ignore-x86_64
// ignore-loongarch64

fn main() {
}
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/call-llvm-intrinsics.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// compile-flags: -C no-prepopulate-passes -Copt-level=0

// ignore-riscv64
// ignore-loongarch64

#![feature(link_llvm_intrinsics)]
#![crate_type = "lib"]
Expand Down
2 changes: 2 additions & 0 deletions tests/codegen/catch-unwind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
// ignore-riscv64 FIXME
// On s390x the closure is also in another function
// ignore-s390x FIXME
// On loongarch64 the closure is also in another function
// ignore-loongarch64 FIXME

#![crate_type = "lib"]
#![feature(c_unwind)]
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/global_asm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
// ignore-wasm32
// ignore-wasm64
// ignore-emscripten
// ignore-loongarch64
// compile-flags: -C no-prepopulate-passes

#![crate_type = "lib"]
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/global_asm_include.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
// ignore-wasm32
// ignore-wasm64
// ignore-emscripten
// ignore-loongarch64
// compile-flags: -C no-prepopulate-passes

#![crate_type = "lib"]
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/global_asm_x2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
// ignore-wasm32
// ignore-wasm64
// ignore-emscripten
// ignore-loongarch64
// compile-flags: -C no-prepopulate-passes

#![crate_type = "lib"]
Expand Down
31 changes: 31 additions & 0 deletions tests/codegen/loongarch-abi/call-llvm-intrinsics.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// compile-flags: -C no-prepopulate-passes

// only-loongarch64

#![feature(link_llvm_intrinsics)]
#![crate_type = "lib"]

struct A;

impl Drop for A {
fn drop(&mut self) {
println!("A");
}
}

extern "C" {
#[link_name = "llvm.sqrt.f32"]
fn sqrt(x: f32) -> f32;
}

pub fn do_call() {
let _a = A;

unsafe {
// Ensure that we `call` LLVM intrinsics instead of trying to `invoke` them
// CHECK: store float 4.000000e+00, ptr %{{.}}, align 4
// CHECK: load float, ptr %{{.}}, align 4
// CHECK: call float @llvm.sqrt.f32(float %{{.}}
sqrt(4.0);
}
}
293 changes: 293 additions & 0 deletions tests/codegen/loongarch-abi/loongarch64-lp64d-abi.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
// compile-flags: -C no-prepopulate-passes
// only-loongarch64
// only-linux

#![crate_type = "lib"]

// CHECK: define void @f_fpr_tracking(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, i8 noundef zeroext %i)
#[no_mangle]
pub extern "C" fn f_fpr_tracking(
a: f64,
b: f64,
c: f64,
d: f64,
e: f64,
f: f64,
g: f64,
h: f64,
i: u8,
) {
}

#[repr(C)]
pub struct Double {
f: f64,
}

#[repr(C)]
pub struct DoubleDouble {
f: f64,
g: f64,
}

#[repr(C)]
pub struct DoubleFloat {
f: f64,
g: f32,
}

// CHECK: define void @f_double_s_arg(double %0)
#[no_mangle]
pub extern "C" fn f_double_s_arg(a: Double) {}

// CHECK: define double @f_ret_double_s()
#[no_mangle]
pub extern "C" fn f_ret_double_s() -> Double {
Double { f: 1. }
}

// CHECK: define void @f_double_double_s_arg({ double, double } %0)
#[no_mangle]
pub extern "C" fn f_double_double_s_arg(a: DoubleDouble) {}

// CHECK: define { double, double } @f_ret_double_double_s()
#[no_mangle]
pub extern "C" fn f_ret_double_double_s() -> DoubleDouble {
DoubleDouble { f: 1., g: 2. }
}

// CHECK: define void @f_double_float_s_arg({ double, float } %0)
#[no_mangle]
pub extern "C" fn f_double_float_s_arg(a: DoubleFloat) {}

// CHECK: define { double, float } @f_ret_double_float_s()
#[no_mangle]
pub extern "C" fn f_ret_double_float_s() -> DoubleFloat {
DoubleFloat { f: 1., g: 2. }
}

// CHECK: define void @f_double_double_s_arg_insufficient_fprs(double %0, double %1, double %2, double %3, double %4, double %5, double %6, [2 x i64] %7)
#[no_mangle]
pub extern "C" fn f_double_double_s_arg_insufficient_fprs(
a: f64,
b: f64,
c: f64,
d: f64,
e: f64,
f: f64,
g: f64,
h: DoubleDouble,
) {
}

#[repr(C)]
pub struct DoubleInt8 {
f: f64,
i: i8,
}

#[repr(C)]
pub struct DoubleUInt8 {
f: f64,
i: u8,
}

#[repr(C)]
pub struct DoubleInt32 {
f: f64,
i: i32,
}

#[repr(C)]
pub struct DoubleInt64 {
f: f64,
i: i64,
}

// CHECK: define void @f_double_int8_s_arg({ double, i8 } %0)
#[no_mangle]
pub extern "C" fn f_double_int8_s_arg(a: DoubleInt8) {}

// CHECK: define { double, i8 } @f_ret_double_int8_s()
#[no_mangle]
pub extern "C" fn f_ret_double_int8_s() -> DoubleInt8 {
DoubleInt8 { f: 1., i: 2 }
}

// CHECK: define void @f_double_int32_s_arg({ double, i32 } %0)
#[no_mangle]
pub extern "C" fn f_double_int32_s_arg(a: DoubleInt32) {}

// CHECK: define { double, i32 } @f_ret_double_int32_s()
#[no_mangle]
pub extern "C" fn f_ret_double_int32_s() -> DoubleInt32 {
DoubleInt32 { f: 1., i: 2 }
}

// CHECK: define void @f_double_uint8_s_arg({ double, i8 } %0)
#[no_mangle]
pub extern "C" fn f_double_uint8_s_arg(a: DoubleUInt8) {}

// CHECK: define { double, i8 } @f_ret_double_uint8_s()
#[no_mangle]
pub extern "C" fn f_ret_double_uint8_s() -> DoubleUInt8 {
DoubleUInt8 { f: 1., i: 2 }
}

// CHECK: define void @f_double_int64_s_arg({ double, i64 } %0)
#[no_mangle]
pub extern "C" fn f_double_int64_s_arg(a: DoubleInt64) {}

// CHECK: define { double, i64 } @f_ret_double_int64_s()
#[no_mangle]
pub extern "C" fn f_ret_double_int64_s() -> DoubleInt64 {
DoubleInt64 { f: 1., i: 2 }
}

// CHECK: define void @f_double_int8_s_arg_insufficient_gprs(i32 noundef signext %a, i32 noundef signext %b, i32 noundef signext %c, i32 noundef signext %d, i32 noundef signext %e, i32 noundef signext %f, i32 noundef signext %g, i32 noundef signext %h, [2 x i64] %0)
#[no_mangle]
pub extern "C" fn f_double_int8_s_arg_insufficient_gprs(
a: i32,
b: i32,
c: i32,
d: i32,
e: i32,
f: i32,
g: i32,
h: i32,
i: DoubleInt8,
) {
}

// CHECK: define void @f_struct_double_int8_insufficient_fprs(float %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, [2 x i64] %8)
#[no_mangle]
pub extern "C" fn f_struct_double_int8_insufficient_fprs(
a: f32,
b: f64,
c: f64,
d: f64,
e: f64,
f: f64,
g: f64,
h: f64,
i: DoubleInt8,
) {
}

#[repr(C)]
pub struct DoubleArr1 {
a: [f64; 1],
}

// CHECK: define void @f_doublearr1_s_arg(double %0)
#[no_mangle]
pub extern "C" fn f_doublearr1_s_arg(a: DoubleArr1) {}

// CHECK: define double @f_ret_doublearr1_s()
#[no_mangle]
pub extern "C" fn f_ret_doublearr1_s() -> DoubleArr1 {
DoubleArr1 { a: [1.] }
}

#[repr(C)]
pub struct DoubleArr2 {
a: [f64; 2],
}

// CHECK: define void @f_doublearr2_s_arg({ double, double } %0)
#[no_mangle]
pub extern "C" fn f_doublearr2_s_arg(a: DoubleArr2) {}

// CHECK: define { double, double } @f_ret_doublearr2_s()
#[no_mangle]
pub extern "C" fn f_ret_doublearr2_s() -> DoubleArr2 {
DoubleArr2 { a: [1., 2.] }
}

#[repr(C)]
pub struct Tricky1 {
f: [f64; 1],
}

#[repr(C)]
pub struct DoubleArr2Tricky1 {
g: [Tricky1; 2],
}

// CHECK: define void @f_doublearr2_tricky1_s_arg({ double, double } %0)
#[no_mangle]
pub extern "C" fn f_doublearr2_tricky1_s_arg(a: DoubleArr2Tricky1) {}

// CHECK: define { double, double } @f_ret_doublearr2_tricky1_s()
#[no_mangle]
pub extern "C" fn f_ret_doublearr2_tricky1_s() -> DoubleArr2Tricky1 {
DoubleArr2Tricky1 { g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] }
}

#[repr(C)]
pub struct EmptyStruct {}

#[repr(C)]
pub struct DoubleArr2Tricky2 {
s: EmptyStruct,
g: [Tricky1; 2],
}

// CHECK: define void @f_doublearr2_tricky2_s_arg({ double, double } %0)
#[no_mangle]
pub extern "C" fn f_doublearr2_tricky2_s_arg(a: DoubleArr2Tricky2) {}

// CHECK: define { double, double } @f_ret_doublearr2_tricky2_s()
#[no_mangle]
pub extern "C" fn f_ret_doublearr2_tricky2_s() -> DoubleArr2Tricky2 {
DoubleArr2Tricky2 { s: EmptyStruct {}, g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] }
}

#[repr(C)]
pub struct IntDoubleInt {
a: i32,
b: f64,
c: i32,
}

// CHECK: define void @f_int_double_int_s_arg(ptr noalias nocapture noundef dereferenceable(24) %a)
#[no_mangle]
pub extern "C" fn f_int_double_int_s_arg(a: IntDoubleInt) {}

// CHECK: define void @f_ret_int_double_int_s(ptr noalias nocapture noundef sret(%IntDoubleInt) dereferenceable(24) %0)
#[no_mangle]
pub extern "C" fn f_ret_int_double_int_s() -> IntDoubleInt {
IntDoubleInt { a: 1, b: 2., c: 3 }
}

#[repr(C)]
pub struct CharCharDouble {
a: u8,
b: u8,
c: f64,
}

// CHECK: define void @f_char_char_double_s_arg([2 x i64] %0)
#[no_mangle]
pub extern "C" fn f_char_char_double_s_arg(a: CharCharDouble) {}

// CHECK: define [2 x i64] @f_ret_char_char_double_s()
#[no_mangle]
pub extern "C" fn f_ret_char_char_double_s() -> CharCharDouble {
CharCharDouble { a: 1, b: 2, c: 3. }
}

#[repr(C)]
pub union DoubleU {
a: f64,
}

// CHECK: define void @f_double_u_arg(i64 %0)
#[no_mangle]
pub extern "C" fn f_double_u_arg(a: DoubleU) {}

// CHECK: define i64 @f_ret_double_u()
#[no_mangle]
pub extern "C" fn f_ret_double_u() -> DoubleU {
unsafe { DoubleU { a: 1. } }
}
1 change: 1 addition & 0 deletions tests/codegen/repr-transparent-aggregates-1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// ignore-riscv64 see codegen/riscv-abi
// ignore-s390x
// ignore-windows
// ignore-loongarch64
// See repr-transparent.rs

#![feature(transparent_unions)]
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/repr-transparent-aggregates-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
// ignore-sparc64
// ignore-x86
// ignore-x86_64
// ignore-loongarch64
// See repr-transparent.rs

#![feature(transparent_unions)]
Expand Down
1 change: 1 addition & 0 deletions tests/codegen/repr-transparent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// ignore-riscv64 riscv64 has an i128 type used with test_Vector
// see codegen/riscv-abi for riscv functiona call tests
// ignore-s390x s390x with default march passes vector types per reference
// ignore-loongarch64 see codegen/loongarch-abi for loongarch function call tests

#![crate_type="lib"]
#![feature(repr_simd, transparent_unions)]
Expand Down
Loading

0 comments on commit 4375d3b

Please sign in to comment.