1; Test strict v4f32 rounding on z14. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s 4 5declare float @llvm.experimental.constrained.rint.f32(float, metadata, metadata) 6declare float @llvm.experimental.constrained.nearbyint.f32(float, metadata, metadata) 7declare float @llvm.experimental.constrained.floor.f32(float, metadata) 8declare float @llvm.experimental.constrained.ceil.f32(float, metadata) 9declare float @llvm.experimental.constrained.trunc.f32(float, metadata) 10declare float @llvm.experimental.constrained.round.f32(float, metadata) 11declare <4 x float> @llvm.experimental.constrained.rint.v4f32(<4 x float>, metadata, metadata) 12declare <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float>, metadata, metadata) 13declare <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float>, metadata) 14declare <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float>, metadata) 15declare <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float>, metadata) 16declare <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float>, metadata) 17 18define <4 x float> @f1(<4 x float> %val) #0 { 19; CHECK-LABEL: f1: 20; CHECK: vfisb %v24, %v24, 0, 0 21; CHECK: br %r14 22 %res = call <4 x float> @llvm.experimental.constrained.rint.v4f32( 23 <4 x float> %val, 24 metadata !"round.dynamic", 25 metadata !"fpexcept.strict") #0 26 ret <4 x float> %res 27} 28 29define <4 x float> @f2(<4 x float> %val) #0 { 30; CHECK-LABEL: f2: 31; CHECK: vfisb %v24, %v24, 4, 0 32; CHECK: br %r14 33 %res = call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32( 34 <4 x float> %val, 35 metadata !"round.dynamic", 36 metadata !"fpexcept.strict") #0 37 ret <4 x float> %res 38} 39 40define <4 x float> @f3(<4 x float> %val) #0 { 41; CHECK-LABEL: f3: 42; CHECK: vfisb %v24, %v24, 4, 7 43; CHECK: br %r14 44 %res = call <4 x float> @llvm.experimental.constrained.floor.v4f32( 45 <4 x float> %val, 46 metadata !"fpexcept.strict") #0 47 ret <4 x float> %res 48} 49 50define <4 x float> @f4(<4 x float> %val) #0 { 51; CHECK-LABEL: f4: 52; CHECK: vfisb %v24, %v24, 4, 6 53; CHECK: br %r14 54 %res = call <4 x float> @llvm.experimental.constrained.ceil.v4f32( 55 <4 x float> %val, 56 metadata !"fpexcept.strict") #0 57 ret <4 x float> %res 58} 59 60define <4 x float> @f5(<4 x float> %val) #0 { 61; CHECK-LABEL: f5: 62; CHECK: vfisb %v24, %v24, 4, 5 63; CHECK: br %r14 64 %res = call <4 x float> @llvm.experimental.constrained.trunc.v4f32( 65 <4 x float> %val, 66 metadata !"fpexcept.strict") #0 67 ret <4 x float> %res 68} 69 70define <4 x float> @f6(<4 x float> %val) #0 { 71; CHECK-LABEL: f6: 72; CHECK: vfisb %v24, %v24, 4, 1 73; CHECK: br %r14 74 %res = call <4 x float> @llvm.experimental.constrained.round.v4f32( 75 <4 x float> %val, 76 metadata !"fpexcept.strict") #0 77 ret <4 x float> %res 78} 79 80define float @f7(<4 x float> %val) #0 { 81; CHECK-LABEL: f7: 82; CHECK: wfisb %f0, %v24, 0, 0 83; CHECK: br %r14 84 %scalar = extractelement <4 x float> %val, i32 0 85 %res = call float @llvm.experimental.constrained.rint.f32( 86 float %scalar, 87 metadata !"round.dynamic", 88 metadata !"fpexcept.strict") #0 89 ret float %res 90} 91 92define float @f8(<4 x float> %val) #0 { 93; CHECK-LABEL: f8: 94; CHECK: wfisb %f0, %v24, 4, 0 95; CHECK: br %r14 96 %scalar = extractelement <4 x float> %val, i32 0 97 %res = call float @llvm.experimental.constrained.nearbyint.f32( 98 float %scalar, 99 metadata !"round.dynamic", 100 metadata !"fpexcept.strict") #0 101 ret float %res 102} 103 104define float @f9(<4 x float> %val) #0 { 105; CHECK-LABEL: f9: 106; CHECK: wfisb %f0, %v24, 4, 7 107; CHECK: br %r14 108 %scalar = extractelement <4 x float> %val, i32 0 109 %res = call float @llvm.experimental.constrained.floor.f32( 110 float %scalar, 111 metadata !"fpexcept.strict") #0 112 ret float %res 113} 114 115define float @f10(<4 x float> %val) #0 { 116; CHECK-LABEL: f10: 117; CHECK: wfisb %f0, %v24, 4, 6 118; CHECK: br %r14 119 %scalar = extractelement <4 x float> %val, i32 0 120 %res = call float @llvm.experimental.constrained.ceil.f32( 121 float %scalar, 122 metadata !"fpexcept.strict") #0 123 ret float %res 124} 125 126define float @f11(<4 x float> %val) #0 { 127; CHECK-LABEL: f11: 128; CHECK: wfisb %f0, %v24, 4, 5 129; CHECK: br %r14 130 %scalar = extractelement <4 x float> %val, i32 0 131 %res = call float @llvm.experimental.constrained.trunc.f32( 132 float %scalar, 133 metadata !"fpexcept.strict") #0 134 ret float %res 135} 136 137define float @f12(<4 x float> %val) #0 { 138; CHECK-LABEL: f12: 139; CHECK: wfisb %f0, %v24, 4, 1 140; CHECK: br %r14 141 %scalar = extractelement <4 x float> %val, i32 0 142 %res = call float @llvm.experimental.constrained.round.f32( 143 float %scalar, 144 metadata !"fpexcept.strict") #0 145 ret float %res 146} 147 148attributes #0 = { strictfp } 149