| //@ add-minicore |
| //@ revisions: enable-packedstack default-packedstack |
| //@ assembly-output: emit-asm |
| //@ compile-flags: -Copt-level=3 --crate-type=lib --target=s390x-unknown-linux-gnu -Cforce-unwind-tables=no |
| //@ needs-llvm-components: systemz |
| //@[enable-packedstack] compile-flags: -Zpacked-stack |
| #![feature(no_core, lang_items)] |
| #![no_std] |
| #![no_core] |
| |
| extern crate minicore; |
| use minicore::*; |
| |
| extern "C" { |
| fn extern_func() -> i32; |
| } |
| |
| // CHECK-LABEL: test_packedstack |
| #[no_mangle] |
| extern "C" fn test_packedstack() -> i32 { |
| // test the creation of call stack with and without packed-stack |
| |
| // without packed-stack we always reserve a least the maximal space of 160 bytes |
| // default-packedstack: stmg %r14, %r15, 112(%r15) |
| // default-packedstack-NEXT: aghi %r15, -160 |
| // default-packedstack-NEXT: brasl %r14, extern_func |
| |
| // with packed-stack only the actually needed registers are reserved on the stack |
| // enable-packedstack: stmg %r14, %r15, 144(%r15) |
| // enable-packedstack-NEXT: aghi %r15, -16 |
| // enable-packedstack-NEXT: brasl %r14, extern_func |
| unsafe { |
| extern_func(); |
| } |
| 1 |
| // CHECK: br %r{{.*}} |
| } |