284 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s4 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, %zmm035; 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") #039 ret <8 x double> %ret40}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, %zmm046; 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") #050 ret <16 x float> %ret51}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, %zmm057; 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") #061 ret <8 x double> %ret62}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, %zmm068; 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") #072 ret <16 x float> %ret73}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, %zmm079; 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") #083 ret <8 x double> %ret84}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, %zmm090; 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") #094 ret <16 x float> %ret95}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, %zmm0101; 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") #0105 ret <8 x double> %ret106}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, %zmm0112; 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") #0116 ret <16 x float> %ret117}118 119define <8 x double> @f9(<8 x double> %a) #0 {120; CHECK-LABEL: f9:121; CHECK: # %bb.0:122; CHECK-NEXT: vsqrtpd %zmm0, %zmm0123; 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") #0128 ret <8 x double> %ret129}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, %zmm0136; 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") #0141 ret <16 x float > %ret142}143 144define <8 x double> @f11(<8 x float> %a) #0 {145; CHECK-LABEL: f11:146; CHECK: # %bb.0:147; CHECK-NEXT: vcvtps2pd %ymm0, %zmm0148; 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") #0152 ret <8 x double> %ret153}154 155define <8 x float> @f12(<8 x double> %a) #0 {156; CHECK-LABEL: f12:157; CHECK: # %bb.0:158; CHECK-NEXT: vcvtpd2ps %zmm0, %ymm0159; 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") #0164 ret <8 x float> %ret165}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) + zmm2171; 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") #0175 ret <16 x float> %res176}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) + zmm2182; 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") #0186 ret <8 x double> %res187}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, %zmm0193; CHECK-NEXT: ret{{[l|q]}}194 %res = call <16 x float> @llvm.experimental.constrained.ceil.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0195 ret <16 x float> %res196}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, %zmm0202; CHECK-NEXT: ret{{[l|q]}}203 %res = call <8 x double> @llvm.experimental.constrained.ceil.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0204 ret <8 x double> %res205}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, %zmm0211; CHECK-NEXT: ret{{[l|q]}}212 %res = call <16 x float> @llvm.experimental.constrained.floor.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0213 ret <16 x float> %res214}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, %zmm0220; CHECK-NEXT: ret{{[l|q]}}221 %res = call <8 x double> @llvm.experimental.constrained.floor.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0222 ret <8 x double> %res223}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, %zmm0229; CHECK-NEXT: ret{{[l|q]}}230 %res = call <16 x float> @llvm.experimental.constrained.trunc.v16f32(<16 x float> %f, metadata !"fpexcept.strict") #0231 ret <16 x float> %res232}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, %zmm0238; CHECK-NEXT: ret{{[l|q]}}239 %res = call <8 x double> @llvm.experimental.constrained.trunc.v8f64(<8 x double> %f, metadata !"fpexcept.strict") #0240 ret <8 x double> %res241}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, %zmm0247; 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") #0250 ret <16 x float> %res251}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, %zmm0257; 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") #0260 ret <8 x double> %res261}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, %zmm0267; 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") #0270 ret <16 x float> %res271}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, %zmm0277; 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") #0280 ret <8 x double> %res281}282 283attributes #0 = { strictfp }284