brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 0bad5a8 Raw
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