1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s 4 5declare <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double>, <8 x double>, metadata, metadata) 6declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata) 7declare <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double>, <8 x double>, metadata, metadata) 8declare <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float>, <16 x float>, metadata, metadata) 9declare <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double>, <8 x double>, metadata, metadata) 10declare <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float>, <16 x float>, metadata, metadata) 11declare <8 x double> @llvm.experimental.constrained.fdiv.v8f64(<8 x double>, <8 x double>, metadata, metadata) 12declare <16 x float> @llvm.experimental.constrained.fdiv.v16f32(<16 x float>, <16 x float>, metadata, metadata) 13declare <8 x double> @llvm.experimental.constrained.sqrt.v8f64(<8 x double>, metadata, metadata) 14declare <16 x float> @llvm.experimental.constrained.sqrt.v16f32(<16 x float>, metadata, metadata) 15declare <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f32(<8 x float>, metadata) 16declare <8 x float> @llvm.experimental.constrained.fptrunc.v8f32.v8f64(<8 x double>, metadata, metadata) 17declare <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double>, <8 x double>, <8 x double>, metadata, metadata) 18declare <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float>, <16 x float>, <16 x float>, metadata, metadata) 19declare <16 x float> @llvm.experimental.constrained.ceil.v16f32(<16 x float>, metadata) 20declare <8 x double> @llvm.experimental.constrained.ceil.v8f64(<8 x double>, metadata) 21declare <16 x float> @llvm.experimental.constrained.floor.v16f32(<16 x float>, metadata) 22declare <8 x double> @llvm.experimental.constrained.floor.v8f64(<8 x double>, metadata) 23declare <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float>, metadata) 24declare <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double>, metadata) 25declare <16 x float> @llvm.experimental.constrained.rint.v16f32(<16 x float>, metadata, metadata) 26declare <8 x double> @llvm.experimental.constrained.rint.v8f64(<8 x double>, metadata, metadata) 27declare <16 x float> @llvm.experimental.constrained.nearbyint.v16f32(<16 x float>, metadata, metadata) 28declare <8 x double> @llvm.experimental.constrained.nearbyint.v8f64(<8 x double>, metadata, metadata) 29 30 31define <8 x double> @f1(<8 x double> %a, <8 x double> %b) #0 { 32; CHECK-LABEL: f1: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vaddpd %zmm1, %zmm0, %zmm0 35; CHECK-NEXT: ret{{[l|q]}} 36 %ret = call <8 x double> @llvm.experimental.constrained.fadd.v8f64(<8 x double> %a, <8 x double> %b, 37 metadata !"round.dynamic", 38 metadata !"fpexcept.strict") #0 39 ret <8 x double> %ret 40} 41 42define <16 x float> @f2(<16 x float> %a, <16 x float> %b) #0 { 43; CHECK-LABEL: f2: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vaddps %zmm1, %zmm0, %zmm0 46; CHECK-NEXT: ret{{[l|q]}} 47 %ret = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %a, <16 x float> %b, 48 metadata !"round.dynamic", 49 metadata !"fpexcept.strict") #0 50 ret <16 x float> %ret 51} 52 53define <8 x double> @f3(<8 x double> %a, <8 x double> %b) #0 { 54; CHECK-LABEL: f3: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsubpd %zmm1, %zmm0, %zmm0 57; CHECK-NEXT: ret{{[l|q]}} 58 %ret = call <8 x double> @llvm.experimental.constrained.fsub.v8f64(<8 x double> %a, <8 x double> %b, 59 metadata !"round.dynamic", 60 metadata !"fpexcept.strict") #0 61 ret <8 x double> %ret 62} 63 64define <16 x float> @f4(<16 x float> %a, <16 x float> %b) #0 { 65; CHECK-LABEL: f4: 66; CHECK: # %bb.0: 67; CHECK-NEXT: vsubps %zmm1, %zmm0, %zmm0 68; CHECK-NEXT: ret{{[l|q]}} 69 %ret = call <16 x float> @llvm.experimental.constrained.fsub.v16f32(<16 x float> %a, <16 x float> %b, 70 metadata !"round.dynamic", 71 metadata !"fpexcept.strict") #0 72 ret <16 x float> %ret 73} 74 75define <8 x double> @f5(<8 x double> %a, <8 x double> %b) #0 { 76; CHECK-LABEL: f5: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vmulpd %zmm1, %zmm0, %zmm0 79; CHECK-NEXT: ret{{[l|q]}} 80 %ret = call <8 x double> @llvm.experimental.constrained.fmul.v8f64(<8 x double> %a, <8 x double> %b, 81 metadata !"round.dynamic", 82 metadata !"fpexcept.strict") #0 83 ret <8 x double> %ret 84} 85 86define <16 x float> @f6(<16 x float> %a, <16 x float> %b) #0 { 87; CHECK-LABEL: f6: 88; CHECK: # %bb.0: 89; CHECK-NEXT: vmulps %zmm1, %zmm0, %zmm0 90; CHECK-NEXT: ret{{[l|q]}} 91 %ret = call <16 x float> @llvm.experimental.constrained.fmul.v16f32(<16 x float> %a, <16 x float> %b, 92 metadata !"round.dynamic", 93 metadata !"fpexcept.strict") #0 94 ret <16 x float> %ret 95} 96 97define <8 x double> @f7(<8 x double> %a, <8 x double> %b) #0 { 98; CHECK-LABEL: f7: 99; CHECK: # %bb.0: 100; CHECK-NEXT: vdivpd %zmm1, %zmm0, %zmm0 101; CHECK-NEXT: ret{{[l|q]}} 102 %ret = call <8 x double> @llvm.experimental.constrained.fdiv.v8f64(<8 x double> %a, <8 x double> %b, 103 metadata !"round.dynamic", 104 metadata !"fpexcept.strict") #0 105 ret <8 x double> %ret 106} 107 108define <16 x float> @f8(<16 x float> %a, <16 x float> %b) #0 { 109; CHECK-LABEL: f8: 110; CHECK: # %bb.0: 111; CHECK-NEXT: vdivps %zmm1, %zmm0, %zmm0 112; CHECK-NEXT: ret{{[l|q]}} 113 %ret = call <16 x float> @llvm.experimental.constrained.fdiv.v16f32(<16 x float> %a, <16 x float> %b, 114 metadata !"round.dynamic", 115 metadata !"fpexcept.strict") #0 116 ret <16 x float> %ret 117} 118 119define <8 x double> @f9(<8 x double> %a) #0 { 120; CHECK-LABEL: f9: 121; CHECK: # %bb.0: 122; CHECK-NEXT: vsqrtpd %zmm0, %zmm0 123; CHECK-NEXT: ret{{[l|q]}} 124 %ret = call <8 x double> @llvm.experimental.constrained.sqrt.v8f64( 125 <8 x double> %a, 126 metadata !"round.dynamic", 127 metadata !"fpexcept.strict") #0 128 ret <8 x double> %ret 129} 130 131 132define <16 x float> @f10(<16 x float> %a) #0 { 133; CHECK-LABEL: f10: 134; CHECK: # %bb.0: 135; CHECK-NEXT: vsqrtps %zmm0, %zmm0 136; CHECK-NEXT: ret{{[l|q]}} 137 %ret = call <16 x float> @llvm.experimental.constrained.sqrt.v16f32( 138 <16 x float> %a, 139 metadata !"round.dynamic", 140 metadata !"fpexcept.strict") #0 141 ret <16 x float > %ret 142} 143 144define <8 x double> @f11(<8 x float> %a) #0 { 145; CHECK-LABEL: f11: 146; CHECK: # %bb.0: 147; CHECK-NEXT: vcvtps2pd %ymm0, %zmm0 148; CHECK-NEXT: ret{{[l|q]}} 149 %ret = call <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f32( 150 <8 x float> %a, 151 metadata !"fpexcept.strict") #0 152 ret <8 x double> %ret 153} 154 155define <8 x float> @f12(<8 x double> %a) #0 { 156; CHECK-LABEL: f12: 157; CHECK: # %bb.0: 158; CHECK-NEXT: vcvtpd2ps %zmm0, %ymm0 159; CHECK-NEXT: ret{{[l|q]}} 160 %ret = call <8 x float> @llvm.experimental.constrained.fptrunc.v8f32.v8f64( 161 <8 x double> %a, 162 metadata !"round.dynamic", 163 metadata !"fpexcept.strict") #0 164 ret <8 x float> %ret 165} 166 167define <16 x float> @f13(<16 x float> %a, <16 x float> %b, <16 x float> %c) #0 { 168; CHECK-LABEL: f13: 169; CHECK: # %bb.0: 170; CHECK-NEXT: vfmadd213ps {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2 171; CHECK-NEXT: ret{{[l|q]}} 172 %res = call <16 x float> @llvm.experimental.constrained.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c, 173 metadata !"round.dynamic", 174 metadata !"fpexcept.strict") #0 175 ret <16 x float> %res 176} 177 178define <8 x double> @f14(<8 x double> %a, <8 x double> %b, <8 x double> %c) #0 { 179; CHECK-LABEL: f14: 180; CHECK: # %bb.0: 181; CHECK-NEXT: vfmadd213pd {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2 182; CHECK-NEXT: ret{{[l|q]}} 183 %res = call <8 x double> @llvm.experimental.constrained.fma.v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %c, 184 metadata !"round.dynamic", 185 metadata !"fpexcept.strict") #0 186 ret <8 x double> %res 187} 188 189define <16 x float> @strict_vector_fceil_v16f32(<16 x float> %f) #0 { 190; CHECK-LABEL: strict_vector_fceil_v16f32: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vrndscaleps $10, %zmm0, %zmm0 193; CHECK-NEXT: ret{{[l|q]}} 194 %res = call <16 x float> @llvm.experimental.constrained.ceil.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0 195 ret <16 x float> %res 196} 197 198define <8 x double> @strict_vector_fceil_v8f64(<8 x double> %f) #0 { 199; CHECK-LABEL: strict_vector_fceil_v8f64: 200; CHECK: # %bb.0: 201; CHECK-NEXT: vrndscalepd $10, %zmm0, %zmm0 202; CHECK-NEXT: ret{{[l|q]}} 203 %res = call <8 x double> @llvm.experimental.constrained.ceil.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0 204 ret <8 x double> %res 205} 206 207define <16 x float> @strict_vector_ffloor_v16f32(<16 x float> %f) #0 { 208; CHECK-LABEL: strict_vector_ffloor_v16f32: 209; CHECK: # %bb.0: 210; CHECK-NEXT: vrndscaleps $9, %zmm0, %zmm0 211; CHECK-NEXT: ret{{[l|q]}} 212 %res = call <16 x float> @llvm.experimental.constrained.floor.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0 213 ret <16 x float> %res 214} 215 216define <8 x double> @strict_vector_ffloor_v8f64(<8 x double> %f) #0 { 217; CHECK-LABEL: strict_vector_ffloor_v8f64: 218; CHECK: # %bb.0: 219; CHECK-NEXT: vrndscalepd $9, %zmm0, %zmm0 220; CHECK-NEXT: ret{{[l|q]}} 221 %res = call <8 x double> @llvm.experimental.constrained.floor.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0 222 ret <8 x double> %res 223} 224 225define <16 x float> @strict_vector_ftrunc_v16f32(<16 x float> %f) #0 { 226; CHECK-LABEL: strict_vector_ftrunc_v16f32: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vrndscaleps $11, %zmm0, %zmm0 229; CHECK-NEXT: ret{{[l|q]}} 230 %res = call <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0 231 ret <16 x float> %res 232} 233 234define <8 x double> @strict_vector_ftrunc_v8f64(<8 x double> %f) #0 { 235; CHECK-LABEL: strict_vector_ftrunc_v8f64: 236; CHECK: # %bb.0: 237; CHECK-NEXT: vrndscalepd $11, %zmm0, %zmm0 238; CHECK-NEXT: ret{{[l|q]}} 239 %res = call <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0 240 ret <8 x double> %res 241} 242 243define <16 x float> @strict_vector_frint_v16f32(<16 x float> %f) #0 { 244; CHECK-LABEL: strict_vector_frint_v16f32: 245; CHECK: # %bb.0: 246; CHECK-NEXT: vrndscaleps $4, %zmm0, %zmm0 247; CHECK-NEXT: ret{{[l|q]}} 248 %res = call <16 x float> @llvm.experimental.constrained.rint.v16f32(<16 x float> %f, 249 metadata !"round.dynamic", metadata !"fpexcept.strict") #0 250 ret <16 x float> %res 251} 252 253define <8 x double> @strict_vector_frint_v8f64(<8 x double> %f) #0 { 254; CHECK-LABEL: strict_vector_frint_v8f64: 255; CHECK: # %bb.0: 256; CHECK-NEXT: vrndscalepd $4, %zmm0, %zmm0 257; CHECK-NEXT: ret{{[l|q]}} 258 %res = call <8 x double> @llvm.experimental.constrained.rint.v8f64(<8 x double> %f, 259 metadata !"round.dynamic", metadata !"fpexcept.strict") #0 260 ret <8 x double> %res 261} 262 263define <16 x float> @strict_vector_fnearbyint_v16f32(<16 x float> %f) #0 { 264; CHECK-LABEL: strict_vector_fnearbyint_v16f32: 265; CHECK: # %bb.0: 266; CHECK-NEXT: vrndscaleps $12, %zmm0, %zmm0 267; CHECK-NEXT: ret{{[l|q]}} 268 %res = call <16 x float> @llvm.experimental.constrained.nearbyint.v16f32(<16 x float> %f, 269 metadata !"round.dynamic", metadata !"fpexcept.strict") #0 270 ret <16 x float> %res 271} 272 273define <8 x double> @strict_vector_fnearbyint_v8f64(<8 x double> %f) #0 { 274; CHECK-LABEL: strict_vector_fnearbyint_v8f64: 275; CHECK: # %bb.0: 276; CHECK-NEXT: vrndscalepd $12, %zmm0, %zmm0 277; CHECK-NEXT: ret{{[l|q]}} 278 %res = call <8 x double> @llvm.experimental.constrained.nearbyint.v8f64(<8 x double> %f, 279 metadata !"round.dynamic", metadata !"fpexcept.strict") #0 280 ret <8 x double> %res 281} 282 283attributes #0 = { strictfp } 284