58 lines · plain
1; Test calling functions with multiple return values (LLVM ABI extension)2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Up to four integer return values fit into GPRs.6declare { i64, i64, i64, i64 } @bar1()7 8define i64 @f1() {9; CHECK-LABEL: f1:10; CHECK: brasl %r14, bar111; CHECK: lgr %r2, %r512; CHECK: br %r1413 %mret = call { i64, i64, i64, i64 } @bar1()14 %ret = extractvalue { i64, i64, i64, i64 } %mret, 315 ret i64 %ret16}17 18; More than four integer return values use sret.19declare { i64, i64, i64, i64, i64 } @bar2()20 21define i64 @f2() {22; CHECK-LABEL: f2:23; CHECK: la %r2, 160(%r15)24; CHECK: brasl %r14, bar225; CHECK: lg %r2, 192(%r15)26; CHECK: br %r1427 %mret = call { i64, i64, i64, i64, i64 } @bar2()28 %ret = extractvalue { i64, i64, i64, i64, i64 } %mret, 429 ret i64 %ret30}31 32; Up to four floating-point return values fit into GPRs.33declare { double, double, double, double } @bar3()34 35define double @f3() {36; CHECK-LABEL: f3:37; CHECK: brasl %r14, bar338; CHECK: ldr %f0, %f639; CHECK: br %r1440 %mret = call { double, double, double, double } @bar3()41 %ret = extractvalue { double, double, double, double } %mret, 342 ret double %ret43}44 45; More than four integer return values use sret.46declare { double, double, double, double, double } @bar4()47 48define double @f4() {49; CHECK-LABEL: f4:50; CHECK: la %r2, 160(%r15)51; CHECK: brasl %r14, bar452; CHECK: ld %f0, 192(%r15)53; CHECK: br %r1454 %mret = call { double, double, double, double, double } @bar4()55 %ret = extractvalue { double, double, double, double, double } %mret, 456 ret double %ret57}58