141 lines · plain
1; Test incoming GPR, FPR and stack arguments when no extension type is given.2; This type of argument is used for passing structures, etc.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -verify-machineinstrs | FileCheck %s5 6; Do some arithmetic so that we can see the register being used.7define i8 @f1(i8 %r2) {8; CHECK-LABEL: f1:9; CHECK: ahi %r2, 110; CHECK: br %r1411 %y = add i8 %r2, 112 ret i8 %y13}14 15define i16 @f2(i8 %r2, i16 %r3) {16; CHECK-LABEL: f2:17; CHECK: {{lr|lgr}} %r2, %r318; CHECK: br %r1419 ret i16 %r320}21 22define i32 @f3(i8 %r2, i16 %r3, i32 %r4) {23; CHECK-LABEL: f3:24; CHECK: {{lr|lgr}} %r2, %r425; CHECK: br %r1426 ret i32 %r427}28 29define i64 @f4(i8 %r2, i16 %r3, i32 %r4, i64 %r5) {30; CHECK-LABEL: f4:31; CHECK: {{lr|lgr}} %r2, %r532; CHECK: br %r1433 ret i64 %r534}35 36; Do some arithmetic so that we can see the register being used.37define float @f5(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0) {38; CHECK-LABEL: f5:39; CHECK: aebr %f0, %f040; CHECK: br %r1441 %y = fadd float %f0, %f042 ret float %y43}44 45define double @f6(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2) {46; CHECK-LABEL: f6:47; CHECK: ldr %f0, %f248; CHECK: br %r1449 ret double %f250}51 52; fp128s are passed indirectly. Do some arithmetic so that the value53; must be interpreted as a float, rather than as a block of memory to54; be copied.55define void @f7(ptr %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,56 fp128 %r6) {57; CHECK-LABEL: f7:58; CHECK: ld %f0, 0(%r6)59; CHECK: ld %f2, 8(%r6)60; CHECK: axbr %f0, %f061; CHECK: std %f0, 0(%r2)62; CHECK: std %f2, 8(%r2)63; CHECK: br %r1464 %y = fadd fp128 %r6, %r665 store fp128 %y, ptr %r266 ret void67}68 69define i64 @f8(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,70 fp128 %r6, i64 %s1) {71; CHECK-LABEL: f8:72; CHECK: lg %r2, 160(%r15)73; CHECK: br %r1474 ret i64 %s175}76 77define float @f9(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,78 fp128 %r6, i64 %s1, float %f4) {79; CHECK-LABEL: f9:80; CHECK: ler %f0, %f481; CHECK: br %r1482 ret float %f483}84 85define double @f10(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,86 fp128 %r6, i64 %s1, float %f4, double %f6) {87; CHECK-LABEL: f10:88; CHECK: ldr %f0, %f689; CHECK: br %r1490 ret double %f691}92 93define i64 @f11(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,94 fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2) {95; CHECK-LABEL: f11:96; CHECK: lg %r2, 168(%r15)97; CHECK: br %r1498 ret i64 %s299}100 101; Floats are passed right-justified.102define float @f12(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,103 fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2,104 float %s3) {105; CHECK-LABEL: f12:106; CHECK: le %f0, 180(%r15)107; CHECK: br %r14108 ret float %s3109}110 111; Test a case where the fp128 address is passed on the stack.112define void @f13(ptr %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2,113 fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2,114 float %s3, fp128 %s4) {115; CHECK-LABEL: f13:116; CHECK: lg [[REGISTER:%r[1-5]+]], 184(%r15)117; CHECK: ld %f0, 0([[REGISTER]])118; CHECK: ld %f2, 8([[REGISTER]])119; CHECK: axbr %f0, %f0120; CHECK: std %f0, 0(%r2)121; CHECK: std %f2, 8(%r2)122; CHECK: br %r14123 %y = fadd fp128 %s4, %s4124 store fp128 %y, ptr %r2125 ret void126}127 128; Explicit fp128 return values are likewise passed indirectly.129define fp128 @f14(fp128 %r3) {130; CHECK-LABEL: f14:131; CHECK: ld %f0, 0(%r3)132; CHECK: ld %f2, 8(%r3)133; CHECK: axbr %f0, %f0134; CHECK: std %f0, 0(%r2)135; CHECK: std %f2, 8(%r2)136; CHECK: br %r14137 %y = fadd fp128 %r3, %r3138 ret fp128 %y139}140 141