Skip to content

Commit 6e4c5c1

Browse files
committed
tests: add an assembly scanning test for s390x backchain switch
1 parent e98e88b commit 6e4c5c1

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed
+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//@ revisions: enable-backchain disable-backchain
2+
//@ assembly-output: emit-asm
3+
//@ compile-flags: -O --crate-type=lib --target=s390x-unknown-linux-gnu
4+
//@ needs-llvm-components: systemz
5+
//@[enable-backchain] compile-flags: -Ctarget-feature=+backchain
6+
//@[disable-backchain] compile-flags: -Ctarget-feature=-backchain
7+
#![feature(no_core, lang_items)]
8+
#![no_std]
9+
#![no_core]
10+
11+
#[lang = "sized"]
12+
trait Sized {}
13+
14+
extern "C" {
15+
fn extern_func();
16+
}
17+
18+
// CHECK-LABEL: test_backchain
19+
#[no_mangle]
20+
extern "C" fn test_backchain() -> i32 {
21+
// Here we try to match if backchain register is saved to the parameter area (stored in r15/sp)
22+
// And also if a new parameter area (160 bytes) is allocated for the upcoming function call
23+
// enable-backchain: lgr [[REG1:.*]], %r15
24+
// enable-backchain-NEXT: aghi %r15, -160
25+
// enable-backchain: stg [[REG1]], 0(%r15)
26+
// disable-backchain: aghi %r15, -160
27+
// disable-backchain-NOT: stg %r{{.*}}, 0(%r15)
28+
unsafe {
29+
extern_func();
30+
}
31+
// enable-backchain-NEXT: brasl %r{{.*}}, extern_func@PLT
32+
// disable-backchain: brasl %r{{.*}}, extern_func@PLT
33+
34+
// Make sure that the expected return value is written into %r2 (return register):
35+
// enable-backchain-NEXT: lghi %r2, 1
36+
// disable-backchain: lghi %r2, 0
37+
#[cfg(target_feature = "backchain")]
38+
{
39+
1
40+
}
41+
#[cfg(not(target_feature = "backchain"))]
42+
{
43+
0
44+
}
45+
// CHECK: br %r{{.*}}
46+
}

0 commit comments

Comments
 (0)