| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| ; Test floating-point absolute on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test f32. | ||
| declare float @llvm.fabs.f32(float %f) | ||
| define float @f1(float %f) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: lpdfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.fabs.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test f64. | ||
| declare double @llvm.fabs.f64(double %f) | ||
| define double @f2(double %f) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: lpdfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.fabs.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test f128. With the loads and stores, a pure absolute would probably | ||
| ; be better implemented using an NI on the upper byte. Do some extra | ||
| ; processing so that using FPRs is unequivocally better. | ||
| declare fp128 @llvm.fabs.f128(fp128 %f) | ||
| define void @f3(fp128 *%ptr, fp128 *%ptr2) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: lpxbr | ||
| ; CHECK: dxbr | ||
| ; CHECK: br %r14 | ||
| %orig = load fp128 , fp128 *%ptr | ||
| %abs = call fp128 @llvm.fabs.f128(fp128 %orig) | ||
| %op2 = load fp128 , fp128 *%ptr2 | ||
| %res = fdiv fp128 %abs, %op2 | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| ; Test negated floating-point absolute on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test f32. | ||
| declare float @llvm.fabs.f32(float %f) | ||
| define float @f1(float %f) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: lndfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %abs = call float @llvm.fabs.f32(float %f) | ||
| %res = fsub float -0.0, %abs | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test f64. | ||
| declare double @llvm.fabs.f64(double %f) | ||
| define double @f2(double %f) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: lndfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %abs = call double @llvm.fabs.f64(double %f) | ||
| %res = fsub double -0.0, %abs | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test f128. With the loads and stores, a pure negative-absolute would | ||
| ; probably be better implemented using an OI on the upper byte. Do some | ||
| ; extra processing so that using FPRs is unequivocally better. | ||
| declare fp128 @llvm.fabs.f128(fp128 %f) | ||
| define void @f3(fp128 *%ptr, fp128 *%ptr2) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: lnxbr | ||
| ; CHECK: dxbr | ||
| ; CHECK: br %r14 | ||
| %orig = load fp128 , fp128 *%ptr | ||
| %abs = call fp128 @llvm.fabs.f128(fp128 %orig) | ||
| %negabs = fsub fp128 0xL00000000000000008000000000000000, %abs | ||
| %op2 = load fp128 , fp128 *%ptr2 | ||
| %res = fdiv fp128 %negabs, %op2 | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| ; Test floating-point negation on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test f32. | ||
| define float @f1(float %f) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: lcdfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %res = fsub float -0.0, %f | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test f64. | ||
| define double @f2(double %f) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: lcdfr %f0, %f0 | ||
| ; CHECK: br %r14 | ||
| %res = fsub double -0.0, %f | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test f128. With the loads and stores, a pure negation would probably | ||
| ; be better implemented using an XI on the upper byte. Do some extra | ||
| ; processing so that using FPRs is unequivocally better. | ||
| define void @f3(fp128 *%ptr, fp128 *%ptr2) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: lcxbr | ||
| ; CHECK: dxbr | ||
| ; CHECK: br %r14 | ||
| %orig = load fp128 , fp128 *%ptr | ||
| %negzero = fpext float -0.0 to fp128 | ||
| %neg = fsub fp128 0xL00000000000000008000000000000000, %orig | ||
| %op2 = load fp128 , fp128 *%ptr2 | ||
| %res = fdiv fp128 %neg, %op2 | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,195 @@ | ||
| ; Test rounding functions for z14 and above. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test rint for f32. | ||
| declare float @llvm.rint.f32(float %f) | ||
| define float @f1(float %f) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: fiebra %f0, 0, %f0, 0 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.rint.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test rint for f64. | ||
| declare double @llvm.rint.f64(double %f) | ||
| define double @f2(double %f) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: fidbra %f0, 0, %f0, 0 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.rint.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test rint for f128. | ||
| declare fp128 @llvm.rint.f128(fp128 %f) | ||
| define void @f3(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: fixbr %f0, 0, %f0 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.rint.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } | ||
|
|
||
| ; Test nearbyint for f32. | ||
| declare float @llvm.nearbyint.f32(float %f) | ||
| define float @f4(float %f) { | ||
| ; CHECK-LABEL: f4: | ||
| ; CHECK: fiebra %f0, 0, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.nearbyint.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test nearbyint for f64. | ||
| declare double @llvm.nearbyint.f64(double %f) | ||
| define double @f5(double %f) { | ||
| ; CHECK-LABEL: f5: | ||
| ; CHECK: fidbra %f0, 0, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.nearbyint.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test nearbyint for f128. | ||
| declare fp128 @llvm.nearbyint.f128(fp128 %f) | ||
| define void @f6(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f6: | ||
| ; CHECK: fixbra %f0, 0, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.nearbyint.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } | ||
|
|
||
| ; Test floor for f32. | ||
| declare float @llvm.floor.f32(float %f) | ||
| define float @f7(float %f) { | ||
| ; CHECK-LABEL: f7: | ||
| ; CHECK: fiebra %f0, 7, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.floor.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test floor for f64. | ||
| declare double @llvm.floor.f64(double %f) | ||
| define double @f8(double %f) { | ||
| ; CHECK-LABEL: f8: | ||
| ; CHECK: fidbra %f0, 7, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.floor.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test floor for f128. | ||
| declare fp128 @llvm.floor.f128(fp128 %f) | ||
| define void @f9(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f9: | ||
| ; CHECK: fixbra %f0, 7, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.floor.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } | ||
|
|
||
| ; Test ceil for f32. | ||
| declare float @llvm.ceil.f32(float %f) | ||
| define float @f10(float %f) { | ||
| ; CHECK-LABEL: f10: | ||
| ; CHECK: fiebra %f0, 6, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.ceil.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test ceil for f64. | ||
| declare double @llvm.ceil.f64(double %f) | ||
| define double @f11(double %f) { | ||
| ; CHECK-LABEL: f11: | ||
| ; CHECK: fidbra %f0, 6, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.ceil.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test ceil for f128. | ||
| declare fp128 @llvm.ceil.f128(fp128 %f) | ||
| define void @f12(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f12: | ||
| ; CHECK: fixbra %f0, 6, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.ceil.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } | ||
|
|
||
| ; Test trunc for f32. | ||
| declare float @llvm.trunc.f32(float %f) | ||
| define float @f13(float %f) { | ||
| ; CHECK-LABEL: f13: | ||
| ; CHECK: fiebra %f0, 5, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.trunc.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test trunc for f64. | ||
| declare double @llvm.trunc.f64(double %f) | ||
| define double @f14(double %f) { | ||
| ; CHECK-LABEL: f14: | ||
| ; CHECK: fidbra %f0, 5, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.trunc.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test trunc for f128. | ||
| declare fp128 @llvm.trunc.f128(fp128 %f) | ||
| define void @f15(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f15: | ||
| ; CHECK: fixbra %f0, 5, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.trunc.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } | ||
|
|
||
| ; Test round for f32. | ||
| declare float @llvm.round.f32(float %f) | ||
| define float @f16(float %f) { | ||
| ; CHECK-LABEL: f16: | ||
| ; CHECK: fiebra %f0, 1, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call float @llvm.round.f32(float %f) | ||
| ret float %res | ||
| } | ||
|
|
||
| ; Test round for f64. | ||
| declare double @llvm.round.f64(double %f) | ||
| define double @f17(double %f) { | ||
| ; CHECK-LABEL: f17: | ||
| ; CHECK: fidbra %f0, 1, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %res = call double @llvm.round.f64(double %f) | ||
| ret double %res | ||
| } | ||
|
|
||
| ; Test round for f128. | ||
| declare fp128 @llvm.round.f128(fp128 %f) | ||
| define void @f18(fp128 *%ptr) { | ||
| ; CHECK-LABEL: f18: | ||
| ; CHECK: fixbra %f0, 1, %f0, 4 | ||
| ; CHECK: br %r14 | ||
| %src = load fp128 , fp128 *%ptr | ||
| %res = call fp128 @llvm.round.f128(fp128 %src) | ||
| store fp128 %res, fp128 *%ptr | ||
| ret void | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| ; Test f32 and v4f32 absolute on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| declare float @llvm.fabs.f32(float) | ||
| declare <4 x float> @llvm.fabs.v4f32(<4 x float>) | ||
|
|
||
| ; Test a plain absolute. | ||
| define <4 x float> @f1(<4 x float> %val) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vflpsb %v24, %v24 | ||
| ; CHECK: br %r14 | ||
| %ret = call <4 x float> @llvm.fabs.v4f32(<4 x float> %val) | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test a negative absolute. | ||
| define <4 x float> @f2(<4 x float> %val) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: vflnsb %v24, %v24 | ||
| ; CHECK: br %r14 | ||
| %abs = call <4 x float> @llvm.fabs.v4f32(<4 x float> %val) | ||
| %ret = fsub <4 x float> <float -0.0, float -0.0, | ||
| float -0.0, float -0.0>, %abs | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 absolute that uses vector registers. | ||
| define float @f3(<4 x float> %val) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: wflpsb %f0, %v24 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %ret = call float @llvm.fabs.f32(float %scalar) | ||
| ret float %ret | ||
| } | ||
|
|
||
| ; Test an f32 negative absolute that uses vector registers. | ||
| define float @f4(<4 x float> %val) { | ||
| ; CHECK-LABEL: f4: | ||
| ; CHECK: wflnsb %f0, %v24 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %abs = call float @llvm.fabs.f32(float %scalar) | ||
| %ret = fsub float -0.0, %abs | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| ; Test vector addition on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test a v4f32 addition. | ||
| define <4 x float> @f1(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfasb %v24, %v26, %v28 | ||
| ; CHECK: br %r14 | ||
| %ret = fadd <4 x float> %val1, %val2 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 addition that uses vector registers. | ||
| define float @f2(<4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: wfasb %f0, %v24, %v26 | ||
| ; CHECK: br %r14 | ||
| %scalar1 = extractelement <4 x float> %val1, i32 0 | ||
| %scalar2 = extractelement <4 x float> %val2, i32 0 | ||
| %ret = fadd float %scalar1, %scalar2 | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,349 @@ | ||
| ; Test f32 and v4f32 comparisons on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test oeq. | ||
| define <4 x i32> @f1(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfcesb %v24, %v26, %v28 | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp oeq <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test one. | ||
| define <4 x i32> @f2(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-DAG: vfchsb [[REG2:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK: vo %v24, [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp one <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ogt. | ||
| define <4 x i32> @f3(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: vfchsb %v24, %v26, %v28 | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ogt <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test oge. | ||
| define <4 x i32> @f4(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f4: | ||
| ; CHECK: vfchesb %v24, %v26, %v28 | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp oge <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ole. | ||
| define <4 x i32> @f5(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f5: | ||
| ; CHECK: vfchesb %v24, %v28, %v26 | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ole <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test olt. | ||
| define <4 x i32> @f6(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f6: | ||
| ; CHECK: vfchsb %v24, %v28, %v26 | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp olt <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ueq. | ||
| define <4 x i32> @f7(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f7: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-DAG: vfchsb [[REG2:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK: vno %v24, [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ueq <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test une. | ||
| define <4 x i32> @f8(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f8: | ||
| ; CHECK: vfcesb [[REG:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK-NEXT: vno %v24, [[REG]], [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp une <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ugt. | ||
| define <4 x i32> @f9(<4 x i32> %dummy, <4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f9: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-NEXT: vno %v24, [[REG]], [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ugt <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test uge. | ||
| define <4 x i32> @f10(<4 x i32> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f10: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-NEXT: vno %v24, [[REG]], [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp uge <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ule. | ||
| define <4 x i32> @f11(<4 x i32> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f11: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK-NEXT: vno %v24, [[REG]], [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ule <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ult. | ||
| define <4 x i32> @f12(<4 x i32> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f12: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK-NEXT: vno %v24, [[REG]], [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ult <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test ord. | ||
| define <4 x i32> @f13(<4 x i32> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f13: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-DAG: vfchesb [[REG2:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK: vo %v24, [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ord <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test uno. | ||
| define <4 x i32> @f14(<4 x i32> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f14: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v28, %v26 | ||
| ; CHECK-DAG: vfchesb [[REG2:%v[0-9]+]], %v26, %v28 | ||
| ; CHECK: vno %v24, [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp uno <4 x float> %val1, %val2 | ||
| %ret = sext <4 x i1> %cmp to <4 x i32> | ||
| ret <4 x i32> %ret | ||
| } | ||
|
|
||
| ; Test oeq selects. | ||
| define <4 x float> @f15(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f15: | ||
| ; CHECK: vfcesb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp oeq <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test one selects. | ||
| define <4 x float> @f16(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f16: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-DAG: vfchsb [[REG2:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp one <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ogt selects. | ||
| define <4 x float> @f17(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f17: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ogt <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test oge selects. | ||
| define <4 x float> @f18(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f18: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp oge <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ole selects. | ||
| define <4 x float> @f19(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f19: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ole <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test olt selects. | ||
| define <4 x float> @f20(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f20: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp olt <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ueq selects. | ||
| define <4 x float> @f21(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f21: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-DAG: vfchsb [[REG2:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ueq <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test une selects. | ||
| define <4 x float> @f22(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f22: | ||
| ; CHECK: vfcesb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp une <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ugt selects. | ||
| define <4 x float> @f23(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f23: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ugt <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test uge selects. | ||
| define <4 x float> @f24(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f24: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp uge <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ule selects. | ||
| define <4 x float> @f25(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f25: | ||
| ; CHECK: vfchsb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ule <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ult selects. | ||
| define <4 x float> @f26(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f26: | ||
| ; CHECK: vfchesb [[REG:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ult <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test ord selects. | ||
| define <4 x float> @f27(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f27: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-DAG: vfchesb [[REG2:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp ord <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test uno selects. | ||
| define <4 x float> @f28(<4 x float> %val1, <4 x float> %val2, | ||
| <4 x float> %val3, <4 x float> %val4) { | ||
| ; CHECK-LABEL: f28: | ||
| ; CHECK-DAG: vfchsb [[REG1:%v[0-9]+]], %v26, %v24 | ||
| ; CHECK-DAG: vfchesb [[REG2:%v[0-9]+]], %v24, %v26 | ||
| ; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]] | ||
| ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]] | ||
| ; CHECK-NEXT: br %r14 | ||
| %cmp = fcmp uno <4 x float> %val1, %val2 | ||
| %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 comparison that uses vector registers. | ||
| define i64 @f29(i64 %a, i64 %b, float %f1, <4 x float> %vec) { | ||
| ; CHECK-LABEL: f29: | ||
| ; CHECK: wfcsb %f0, %v24 | ||
| ; CHECK-NEXT: locgrne %r2, %r3 | ||
| ; CHECK: br %r14 | ||
| %f2 = extractelement <4 x float> %vec, i32 0 | ||
| %cond = fcmp oeq float %f1, %f2 | ||
| %res = select i1 %cond, i64 %a, i64 %b | ||
| ret i64 %res | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| ; Test vector division on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test a v4f32 division. | ||
| define <4 x float> @f1(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfdsb %v24, %v26, %v28 | ||
| ; CHECK: br %r14 | ||
| %ret = fdiv <4 x float> %val1, %val2 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 division that uses vector registers. | ||
| define float @f2(<4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: wfdsb %f0, %v24, %v26 | ||
| ; CHECK: br %r14 | ||
| %scalar1 = extractelement <4 x float> %val1, i32 0 | ||
| %scalar2 = extractelement <4 x float> %val2, i32 0 | ||
| %ret = fdiv float %scalar1, %scalar2 | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| ; Test vector multiplication on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test a v4f32 multiplication. | ||
| define <4 x float> @f1(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfmsb %v24, %v26, %v28 | ||
| ; CHECK: br %r14 | ||
| %ret = fmul <4 x float> %val1, %val2 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 multiplication that uses vector registers. | ||
| define float @f2(<4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: wfmsb %f0, %v24, %v26 | ||
| ; CHECK: br %r14 | ||
| %scalar1 = extractelement <4 x float> %val1, i32 0 | ||
| %scalar2 = extractelement <4 x float> %val2, i32 0 | ||
| %ret = fmul float %scalar1, %scalar2 | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| ; Test vector multiply-and-add on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) | ||
|
|
||
| ; Test a v4f32 multiply-and-add. | ||
| define <4 x float> @f1(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2, <4 x float> %val3) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfmasb %v24, %v26, %v28, %v30 | ||
| ; CHECK: br %r14 | ||
| %ret = call <4 x float> @llvm.fma.v4f32 (<4 x float> %val1, | ||
| <4 x float> %val2, | ||
| <4 x float> %val3) | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test a v4f32 multiply-and-subtract. | ||
| define <4 x float> @f2(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2, <4 x float> %val3) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: vfmssb %v24, %v26, %v28, %v30 | ||
| ; CHECK: br %r14 | ||
| %negval3 = fsub <4 x float> <float -0.0, float -0.0, | ||
| float -0.0, float -0.0>, %val3 | ||
| %ret = call <4 x float> @llvm.fma.v4f32 (<4 x float> %val1, | ||
| <4 x float> %val2, | ||
| <4 x float> %negval3) | ||
| ret <4 x float> %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| ; Test vector negation on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test a v4f32 negation. | ||
| define <4 x float> @f1(<4 x float> %dummy, <4 x float> %val) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vflcsb %v24, %v26 | ||
| ; CHECK: br %r14 | ||
| %ret = fsub <4 x float> <float -0.0, float -0.0, | ||
| float -0.0, float -0.0>, %val | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 negation that uses vector registers. | ||
| define float @f2(<4 x float> %val) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: wflcsb %f0, %v24 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %ret = fsub float -0.0, %scalar | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,118 @@ | ||
| ; Test v4f32 rounding on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| declare float @llvm.rint.f32(float) | ||
| declare float @llvm.nearbyint.f32(float) | ||
| declare float @llvm.floor.f32(float) | ||
| declare float @llvm.ceil.f32(float) | ||
| declare float @llvm.trunc.f32(float) | ||
| declare float @llvm.round.f32(float) | ||
| declare <4 x float> @llvm.rint.v4f32(<4 x float>) | ||
| declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) | ||
| declare <4 x float> @llvm.floor.v4f32(<4 x float>) | ||
| declare <4 x float> @llvm.ceil.v4f32(<4 x float>) | ||
| declare <4 x float> @llvm.trunc.v4f32(<4 x float>) | ||
| declare <4 x float> @llvm.round.v4f32(<4 x float>) | ||
|
|
||
| define <4 x float> @f1(<4 x float> %val) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfisb %v24, %v24, 0, 0 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.rint.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define <4 x float> @f2(<4 x float> %val) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: vfisb %v24, %v24, 4, 0 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define <4 x float> @f3(<4 x float> %val) { | ||
| ; CHECK-LABEL: f3: | ||
| ; CHECK: vfisb %v24, %v24, 4, 7 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.floor.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define <4 x float> @f4(<4 x float> %val) { | ||
| ; CHECK-LABEL: f4: | ||
| ; CHECK: vfisb %v24, %v24, 4, 6 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.ceil.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define <4 x float> @f5(<4 x float> %val) { | ||
| ; CHECK-LABEL: f5: | ||
| ; CHECK: vfisb %v24, %v24, 4, 5 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.trunc.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define <4 x float> @f6(<4 x float> %val) { | ||
| ; CHECK-LABEL: f6: | ||
| ; CHECK: vfisb %v24, %v24, 4, 1 | ||
| ; CHECK: br %r14 | ||
| %res = call <4 x float> @llvm.round.v4f32(<4 x float> %val) | ||
| ret <4 x float> %res | ||
| } | ||
|
|
||
| define float @f7(<4 x float> %val) { | ||
| ; CHECK-LABEL: f7: | ||
| ; CHECK: wfisb %f0, %v24, 0, 0 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.rint.f32(float %scalar) | ||
| ret float %res | ||
| } | ||
|
|
||
| define float @f8(<4 x float> %val) { | ||
| ; CHECK-LABEL: f8: | ||
| ; CHECK: wfisb %f0, %v24, 4, 0 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.nearbyint.f32(float %scalar) | ||
| ret float %res | ||
| } | ||
|
|
||
| define float @f9(<4 x float> %val) { | ||
| ; CHECK-LABEL: f9: | ||
| ; CHECK: wfisb %f0, %v24, 4, 7 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.floor.f32(float %scalar) | ||
| ret float %res | ||
| } | ||
|
|
||
| define float @f10(<4 x float> %val) { | ||
| ; CHECK-LABEL: f10: | ||
| ; CHECK: wfisb %f0, %v24, 4, 6 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.ceil.f32(float %scalar) | ||
| ret float %res | ||
| } | ||
|
|
||
| define float @f11(<4 x float> %val) { | ||
| ; CHECK-LABEL: f11: | ||
| ; CHECK: wfisb %f0, %v24, 4, 5 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.trunc.f32(float %scalar) | ||
| ret float %res | ||
| } | ||
|
|
||
| define float @f12(<4 x float> %val) { | ||
| ; CHECK-LABEL: f12: | ||
| ; CHECK: wfisb %f0, %v24, 4, 1 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %res = call float @llvm.round.f32(float %scalar) | ||
| ret float %res | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| ; Test f32 and v4f32 square root on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| declare float @llvm.sqrt.f32(float) | ||
| declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) | ||
|
|
||
| define <4 x float> @f1(<4 x float> %val) { | ||
| ; CHECK-LABEL: f1: | ||
| ; CHECK: vfsqsb %v24, %v24 | ||
| ; CHECK: br %r14 | ||
| %ret = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %val) | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| define float @f2(<4 x float> %val) { | ||
| ; CHECK-LABEL: f2: | ||
| ; CHECK: wfsqsb %f0, %v24 | ||
| ; CHECK: br %r14 | ||
| %scalar = extractelement <4 x float> %val, i32 0 | ||
| %ret = call float @llvm.sqrt.f32(float %scalar) | ||
| ret float %ret | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| ; Test vector subtraction on z14. | ||
| ; | ||
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s | ||
|
|
||
| ; Test a v4f32 subtraction. | ||
| define <4 x float> @f6(<4 x float> %dummy, <4 x float> %val1, | ||
| <4 x float> %val2) { | ||
| ; CHECK-LABEL: f6: | ||
| ; CHECK: vfssb %v24, %v26, %v28 | ||
| ; CHECK: br %r14 | ||
| %ret = fsub <4 x float> %val1, %val2 | ||
| ret <4 x float> %ret | ||
| } | ||
|
|
||
| ; Test an f32 subtraction that uses vector registers. | ||
| define float @f7(<4 x float> %val1, <4 x float> %val2) { | ||
| ; CHECK-LABEL: f7: | ||
| ; CHECK: wfssb %f0, %v24, %v26 | ||
| ; CHECK: br %r14 | ||
| %scalar1 = extractelement <4 x float> %val1, i32 0 | ||
| %scalar2 = extractelement <4 x float> %val2, i32 0 | ||
| %ret = fsub float %scalar1, %scalar2 | ||
| ret float %ret | ||
| } | ||
|
|
||
| ; Test a v2f32 subtraction, which gets promoted to v4f32. | ||
| define <2 x float> @f14(<2 x float> %val1, <2 x float> %val2) { | ||
| ; No particular output expected, but must compile. | ||
| %ret = fsub <2 x float> %val1, %val2 | ||
| ret <2 x float> %ret | ||
| } |