brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · c951c79 Raw
158 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \2; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 \4; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s5 6declare half @llvm.experimental.constrained.fma.f16(half, half, half, metadata, metadata)7declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)8 9define half @f0(half %f1, half %f2, half %acc) #0 {10; CHECK-LABEL: f0:11; CHECK: brasl %r14, __extendhfsf2@PLT12; CHECK: brasl %r14, __extendhfsf2@PLT13; CHECK: brasl %r14, __extendhfsf2@PLT14; CHECK-SCALAR: maebr %f10, %f0, %f815; CHECK-SCALAR: ler %f0, %f1016; CHECK-VECTOR: wfmasb %f0, %f0, %f8, %f1017; CHECK: brasl %r14, __truncsfhf2@PLT18; CHECK: br %r1419  %res = call half @llvm.experimental.constrained.fma.f16 (20                        half %f1, half %f2, half %acc,21                        metadata !"round.dynamic",22                        metadata !"fpexcept.strict") #023  ret half %res24}25 26define float @f1(float %f1, float %f2, float %acc) #0 {27; CHECK-LABEL: f1:28; CHECK-SCALAR: maebr %f4, %f0, %f229; CHECK-SCALAR: ler %f0, %f430; CHECK-VECTOR: wfmasb %f0, %f0, %f2, %f431; CHECK: br %r1432  %res = call float @llvm.experimental.constrained.fma.f32 (33                        float %f1, float %f2, float %acc,34                        metadata !"round.dynamic",35                        metadata !"fpexcept.strict") #036  ret float %res37}38 39define float @f2(float %f1, ptr %ptr, float %acc) #0 {40; CHECK-LABEL: f2:41; CHECK: maeb %f2, %f0, 0(%r2)42; CHECK-SCALAR: ler %f0, %f243; CHECK-VECTOR: ldr %f0, %f244; CHECK: br %r1445  %f2 = load float, ptr %ptr46  %res = call float @llvm.experimental.constrained.fma.f32 (47                        float %f1, float %f2, float %acc,48                        metadata !"round.dynamic",49                        metadata !"fpexcept.strict") #050  ret float %res51}52 53define float @f3(float %f1, ptr %base, float %acc) #0 {54; CHECK-LABEL: f3:55; CHECK: maeb %f2, %f0, 4092(%r2)56; CHECK-SCALAR: ler %f0, %f257; CHECK-VECTOR: ldr %f0, %f258; CHECK: br %r1459  %ptr = getelementptr float, ptr %base, i64 102360  %f2 = load float, ptr %ptr61  %res = call float @llvm.experimental.constrained.fma.f32 (62                        float %f1, float %f2, float %acc,63                        metadata !"round.dynamic",64                        metadata !"fpexcept.strict") #065  ret float %res66}67 68define float @f4(float %f1, ptr %base, float %acc) #0 {69; The important thing here is that we don't generate an out-of-range70; displacement.  Other sequences besides this one would be OK.71;72; CHECK-LABEL: f4:73; CHECK: aghi %r2, 409674; CHECK: maeb %f2, %f0, 0(%r2)75; CHECK-SCALAR: ler %f0, %f276; CHECK-VECTOR: ldr %f0, %f277; CHECK: br %r1478  %ptr = getelementptr float, ptr %base, i64 102479  %f2 = load float, ptr %ptr80  %res = call float @llvm.experimental.constrained.fma.f32 (81                        float %f1, float %f2, float %acc,82                        metadata !"round.dynamic",83                        metadata !"fpexcept.strict") #084  ret float %res85}86 87define float @f5(float %f1, ptr %base, float %acc) #0 {88; Here too the important thing is that we don't generate an out-of-range89; displacement.  Other sequences besides this one would be OK.90;91; CHECK-LABEL: f5:92; CHECK: aghi %r2, -493; CHECK: maeb %f2, %f0, 0(%r2)94; CHECK-SCALAR: ler %f0, %f295; CHECK-VECTOR: ldr %f0, %f296; CHECK: br %r1497  %ptr = getelementptr float, ptr %base, i64 -198  %f2 = load float, ptr %ptr99  %res = call float @llvm.experimental.constrained.fma.f32 (100                        float %f1, float %f2, float %acc,101                        metadata !"round.dynamic",102                        metadata !"fpexcept.strict") #0103  ret float %res104}105 106define float @f6(float %f1, ptr %base, i64 %index, float %acc) #0 {107; CHECK-LABEL: f6:108; CHECK: sllg %r1, %r3, 2109; CHECK: maeb %f2, %f0, 0(%r1,%r2)110; CHECK-SCALAR: ler %f0, %f2111; CHECK-VECTOR: ldr %f0, %f2112; CHECK: br %r14113  %ptr = getelementptr float, ptr %base, i64 %index114  %f2 = load float, ptr %ptr115  %res = call float @llvm.experimental.constrained.fma.f32 (116                        float %f1, float %f2, float %acc,117                        metadata !"round.dynamic",118                        metadata !"fpexcept.strict") #0119  ret float %res120}121 122define float @f7(float %f1, ptr %base, i64 %index, float %acc) #0 {123; CHECK-LABEL: f7:124; CHECK: sllg %r1, %r3, 2125; CHECK: maeb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})126; CHECK-SCALAR: ler %f0, %f2127; CHECK-VECTOR: ldr %f0, %f2128; CHECK: br %r14129  %index2 = add i64 %index, 1023130  %ptr = getelementptr float, ptr %base, i64 %index2131  %f2 = load float, ptr %ptr132  %res = call float @llvm.experimental.constrained.fma.f32 (133                        float %f1, float %f2, float %acc,134                        metadata !"round.dynamic",135                        metadata !"fpexcept.strict") #0136  ret float %res137}138 139define float @f8(float %f1, ptr %base, i64 %index, float %acc) #0 {140; CHECK-LABEL: f8:141; CHECK: sllg %r1, %r3, 2142; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})143; CHECK: maeb %f2, %f0, 0(%r1)144; CHECK-SCALAR: ler %f0, %f2145; CHECK-VECTOR: ldr %f0, %f2146; CHECK: br %r14147  %index2 = add i64 %index, 1024148  %ptr = getelementptr float, ptr %base, i64 %index2149  %f2 = load float, ptr %ptr150  %res = call float @llvm.experimental.constrained.fma.f32 (151                        float %f1, float %f2, float %acc,152                        metadata !"round.dynamic",153                        metadata !"fpexcept.strict") #0154  ret float %res155}156 157attributes #0 = { strictfp }158