brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · eac2d46 Raw
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