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