398 lines · plain
1; RUN: llc -verify-machineinstrs -O0 %s -mtriple=spirv32-unknown-unknown -o - | FileCheck %s2 3declare float @llvm.fabs.f32(float)4declare float @llvm.rint.f32(float)5declare float @llvm.nearbyint.f32(float)6declare float @llvm.floor.f32(float)7declare float @llvm.ceil.f32(float)8declare float @llvm.round.f32(float)9declare float @llvm.trunc.f32(float)10declare float @llvm.sqrt.f32(float)11declare float @llvm.sin.f32(float)12declare float @llvm.cos.f32(float)13declare float @llvm.exp2.f32(float)14declare float @llvm.log.f32(float)15declare float @llvm.log10.f32(float)16declare float @llvm.log2.f32(float)17declare float @llvm.minnum.f32(float, float)18declare float @llvm.maxnum.f32(float, float)19declare <2 x half> @llvm.fabs.v2f16(<2 x half>)20declare <2 x half> @llvm.rint.v2f16(<2 x half>)21declare <2 x half> @llvm.nearbyint.v2f16(<2 x half>)22declare <2 x half> @llvm.floor.v2f16(<2 x half>)23declare <2 x half> @llvm.ceil.v2f16(<2 x half>)24declare <2 x half> @llvm.round.v2f16(<2 x half>)25declare <2 x half> @llvm.trunc.v2f16(<2 x half>)26declare <2 x half> @llvm.sqrt.v2f16(<2 x half>)27declare <2 x half> @llvm.sin.v2f16(<2 x half>)28declare <2 x half> @llvm.cos.v2f16(<2 x half>)29declare <2 x half> @llvm.exp2.v2f16(<2 x half>)30declare <2 x half> @llvm.log.v2f16(<2 x half>)31declare <2 x half> @llvm.log10.v2f16(<2 x half>)32declare <2 x half> @llvm.log2.v2f16(<2 x half>)33 34; CHECK-DAG: OpName %[[#SCALAR_FABS:]] "scalar_fabs"35; CHECK-DAG: OpName %[[#SCALAR_RINT:]] "scalar_rint"36; CHECK-DAG: OpName %[[#SCALAR_NEARBYINT:]] "scalar_nearbyint"37; CHECK-DAG: OpName %[[#SCALAR_FLOOR:]] "scalar_floor"38; CHECK-DAG: OpName %[[#SCALAR_CEIL:]] "scalar_ceil"39; CHECK-DAG: OpName %[[#SCALAR_ROUND:]] "scalar_round"40; CHECK-DAG: OpName %[[#SCALAR_TRUNC:]] "scalar_trunc"41; CHECK-DAG: OpName %[[#SCALAR_SQRT:]] "scalar_sqrt"42; CHECK-DAG: OpName %[[#SCALAR_SIN:]] "scalar_sin"43; CHECK-DAG: OpName %[[#SCALAR_COS:]] "scalar_cos"44; CHECK-DAG: OpName %[[#SCALAR_EXP2:]] "scalar_exp2"45; CHECK-DAG: OpName %[[#SCALAR_LOG:]] "scalar_log"46; CHECK-DAG: OpName %[[#SCALAR_LOG10:]] "scalar_log10"47; CHECK-DAG: OpName %[[#SCALAR_LOG2:]] "scalar_log2"48; CHECK-DAG: OpName %[[#SCALAR_MINNUM:]] "scalar_minnum"49; CHECK-DAG: OpName %[[#SCALAR_MAXNUM:]] "scalar_maxnum"50; CHECK-DAG: OpName %[[#VECTOR_FABS:]] "vector_fabs"51; CHECK-DAG: OpName %[[#VECTOR_RINT:]] "vector_rint"52; CHECK-DAG: OpName %[[#VECTOR_NEARBYINT:]] "vector_nearbyint"53; CHECK-DAG: OpName %[[#VECTOR_FLOOR:]] "vector_floor"54; CHECK-DAG: OpName %[[#VECTOR_CEIL:]] "vector_ceil"55; CHECK-DAG: OpName %[[#VECTOR_ROUND:]] "vector_round"56; CHECK-DAG: OpName %[[#VECTOR_TRUNC:]] "vector_trunc"57; CHECK-DAG: OpName %[[#VECTOR_SQRT:]] "vector_sqrt"58; CHECK-DAG: OpName %[[#VECTOR_SIN:]] "vector_sin"59; CHECK-DAG: OpName %[[#VECTOR_COS:]] "vector_cos"60; CHECK-DAG: OpName %[[#VECTOR_EXP2:]] "vector_exp2"61; CHECK-DAG: OpName %[[#VECTOR_LOG:]] "vector_log"62; CHECK-DAG: OpName %[[#VECTOR_LOG10:]] "vector_log10"63; CHECK-DAG: OpName %[[#VECTOR_LOG2:]] "vector_log2"64 65; CHECK-DAG: %[[#CLEXT:]] = OpExtInstImport "OpenCL.std"66 67; CHECK: %[[#SCALAR_FABS]] = OpFunction68; CHECK-NEXT: %[[#A:]] = OpFunctionParameter69; CHECK: OpLabel70; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] fabs %[[#A]]71; CHECK: OpReturnValue %[[#R]]72; CHECK-NEXT: OpFunctionEnd73define float @scalar_fabs(float %a) {74 %r = call float @llvm.fabs.f32(float %a)75 ret float %r76}77 78; CHECK: %[[#SCALAR_RINT]] = OpFunction79; CHECK-NEXT: %[[#A:]] = OpFunctionParameter80; CHECK: OpLabel81; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] rint %[[#A]]82; CHECK: OpReturnValue %[[#R]]83; CHECK-NEXT: OpFunctionEnd84define float @scalar_rint(float %a) {85 %r = call float @llvm.rint.f32(float %a)86 ret float %r87}88 89; CHECK: %[[#SCALAR_NEARBYINT]] = OpFunction90; CHECK-NEXT: %[[#A:]] = OpFunctionParameter91; CHECK: OpLabel92; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] rint %[[#A]]93; CHECK: OpReturnValue %[[#R]]94; CHECK-NEXT: OpFunctionEnd95define float @scalar_nearbyint(float %a) {96 %r = call float @llvm.nearbyint.f32(float %a)97 ret float %r98}99 100; CHECK: %[[#SCALAR_FLOOR]] = OpFunction101; CHECK-NEXT: %[[#A:]] = OpFunctionParameter102; CHECK: OpLabel103; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] floor %[[#A]]104; CHECK: OpReturnValue %[[#R]]105; CHECK-NEXT: OpFunctionEnd106define float @scalar_floor(float %a) {107 %r = call float @llvm.floor.f32(float %a)108 ret float %r109}110 111; CHECK: %[[#SCALAR_CEIL]] = OpFunction112; CHECK-NEXT: %[[#A:]] = OpFunctionParameter113; CHECK: OpLabel114; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] ceil %[[#A]]115; CHECK: OpReturnValue %[[#R]]116; CHECK-NEXT: OpFunctionEnd117define float @scalar_ceil(float %a) {118 %r = call float @llvm.ceil.f32(float %a)119 ret float %r120}121 122; CHECK: %[[#SCALAR_ROUND]] = OpFunction123; CHECK-NEXT: %[[#A:]] = OpFunctionParameter124; CHECK: OpLabel125; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] round %[[#A]]126; CHECK: OpReturnValue %[[#R]]127; CHECK-NEXT: OpFunctionEnd128define float @scalar_round(float %a) {129 %r = call float @llvm.round.f32(float %a)130 ret float %r131}132 133; CHECK: %[[#SCALAR_TRUNC]] = OpFunction134; CHECK-NEXT: %[[#A:]] = OpFunctionParameter135; CHECK: OpLabel136; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] trunc %[[#A]]137; CHECK: OpReturnValue %[[#R]]138; CHECK-NEXT: OpFunctionEnd139define float @scalar_trunc(float %a) {140 %r = call float @llvm.trunc.f32(float %a)141 ret float %r142}143 144; CHECK: %[[#SCALAR_SQRT]] = OpFunction145; CHECK-NEXT: %[[#A:]] = OpFunctionParameter146; CHECK: OpLabel147; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] sqrt %[[#A]]148; CHECK: OpReturnValue %[[#R]]149; CHECK-NEXT: OpFunctionEnd150define float @scalar_sqrt(float %a) {151 %r = call float @llvm.sqrt.f32(float %a)152 ret float %r153}154 155; CHECK: %[[#SCALAR_SIN]] = OpFunction156; CHECK-NEXT: %[[#A:]] = OpFunctionParameter157; CHECK: OpLabel158; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] sin %[[#A]]159; CHECK: OpReturnValue %[[#R]]160; CHECK-NEXT: OpFunctionEnd161define float @scalar_sin(float %a) {162 %r = call float @llvm.sin.f32(float %a)163 ret float %r164}165 166; CHECK: %[[#SCALAR_COS]] = OpFunction167; CHECK-NEXT: %[[#A:]] = OpFunctionParameter168; CHECK: OpLabel169; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] cos %[[#A]]170; CHECK: OpReturnValue %[[#R]]171; CHECK-NEXT: OpFunctionEnd172define float @scalar_cos(float %a) {173 %r = call float @llvm.cos.f32(float %a)174 ret float %r175}176 177; CHECK: %[[#SCALAR_EXP2]] = OpFunction178; CHECK-NEXT: %[[#A:]] = OpFunctionParameter179; CHECK: OpLabel180; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] exp2 %[[#A]]181; CHECK: OpReturnValue %[[#R]]182; CHECK-NEXT: OpFunctionEnd183define float @scalar_exp2(float %a) {184 %r = call float @llvm.exp2.f32(float %a)185 ret float %r186}187 188; CHECK: %[[#SCALAR_LOG]] = OpFunction189; CHECK-NEXT: %[[#A:]] = OpFunctionParameter190; CHECK: OpLabel191; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log %[[#A]]192; CHECK: OpReturnValue %[[#R]]193; CHECK-NEXT: OpFunctionEnd194define float @scalar_log(float %a) {195 %r = call float @llvm.log.f32(float %a)196 ret float %r197}198 199; CHECK: %[[#SCALAR_LOG10]] = OpFunction200; CHECK-NEXT: %[[#A:]] = OpFunctionParameter201; CHECK: OpLabel202; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log10 %[[#A]]203; CHECK: OpReturnValue %[[#R]]204; CHECK-NEXT: OpFunctionEnd205define float @scalar_log10(float %a) {206 %r = call float @llvm.log10.f32(float %a)207 ret float %r208}209 210; CHECK: %[[#SCALAR_LOG2]] = OpFunction211; CHECK-NEXT: %[[#A:]] = OpFunctionParameter212; CHECK: OpLabel213; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log2 %[[#A]]214; CHECK: OpReturnValue %[[#R]]215; CHECK-NEXT: OpFunctionEnd216define float @scalar_log2(float %a) {217 %r = call float @llvm.log2.f32(float %a)218 ret float %r219}220 221; CHECK: %[[#VECTOR_FABS]] = OpFunction222; CHECK-NEXT: %[[#A:]] = OpFunctionParameter223; CHECK: OpLabel224; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] fabs %[[#A]]225; CHECK: OpReturnValue %[[#R]]226; CHECK-NEXT: OpFunctionEnd227define <2 x half> @vector_fabs(<2 x half> %a) {228 %r = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a)229 ret <2 x half> %r230}231 232; CHECK: %[[#VECTOR_RINT]] = OpFunction233; CHECK-NEXT: %[[#A:]] = OpFunctionParameter234; CHECK: OpLabel235; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] rint %[[#A]]236; CHECK: OpReturnValue %[[#R]]237; CHECK-NEXT: OpFunctionEnd238define <2 x half> @vector_rint(<2 x half> %a) {239 %r = call <2 x half> @llvm.rint.v2f16(<2 x half> %a)240 ret <2 x half> %r241}242 243; CHECK: %[[#VECTOR_NEARBYINT]] = OpFunction244; CHECK-NEXT: %[[#A:]] = OpFunctionParameter245; CHECK: OpLabel246; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] rint %[[#A]]247; CHECK: OpReturnValue %[[#R]]248; CHECK-NEXT: OpFunctionEnd249define <2 x half> @vector_nearbyint(<2 x half> %a) {250 %r = call <2 x half> @llvm.nearbyint.v2f16(<2 x half> %a)251 ret <2 x half> %r252}253 254; CHECK: %[[#VECTOR_FLOOR]] = OpFunction255; CHECK-NEXT: %[[#A:]] = OpFunctionParameter256; CHECK: OpLabel257; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] floor %[[#A]]258; CHECK: OpReturnValue %[[#R]]259; CHECK-NEXT: OpFunctionEnd260define <2 x half> @vector_floor(<2 x half> %a) {261 %r = call <2 x half> @llvm.floor.v2f16(<2 x half> %a)262 ret <2 x half> %r263}264 265; CHECK: %[[#VECTOR_CEIL]] = OpFunction266; CHECK-NEXT: %[[#A:]] = OpFunctionParameter267; CHECK: OpLabel268; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] ceil %[[#A]]269; CHECK: OpReturnValue %[[#R]]270; CHECK-NEXT: OpFunctionEnd271define <2 x half> @vector_ceil(<2 x half> %a) {272 %r = call <2 x half> @llvm.ceil.v2f16(<2 x half> %a)273 ret <2 x half> %r274}275 276; CHECK: %[[#VECTOR_ROUND]] = OpFunction277; CHECK-NEXT: %[[#A:]] = OpFunctionParameter278; CHECK: OpLabel279; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] round %[[#A]]280; CHECK: OpReturnValue %[[#R]]281; CHECK-NEXT: OpFunctionEnd282define <2 x half> @vector_round(<2 x half> %a) {283 %r = call <2 x half> @llvm.round.v2f16(<2 x half> %a)284 ret <2 x half> %r285}286 287; CHECK: %[[#VECTOR_TRUNC]] = OpFunction288; CHECK-NEXT: %[[#A:]] = OpFunctionParameter289; CHECK: OpLabel290; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] trunc %[[#A]]291; CHECK: OpReturnValue %[[#R]]292; CHECK-NEXT: OpFunctionEnd293define <2 x half> @vector_trunc(<2 x half> %a) {294 %r = call <2 x half> @llvm.trunc.v2f16(<2 x half> %a)295 ret <2 x half> %r296}297 298; CHECK: %[[#VECTOR_SQRT]] = OpFunction299; CHECK-NEXT: %[[#A:]] = OpFunctionParameter300; CHECK: OpLabel301; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] sqrt %[[#A]]302; CHECK: OpReturnValue %[[#R]]303; CHECK-NEXT: OpFunctionEnd304define <2 x half> @vector_sqrt(<2 x half> %a) {305 %r = call <2 x half> @llvm.sqrt.v2f16(<2 x half> %a)306 ret <2 x half> %r307}308 309; CHECK: %[[#VECTOR_SIN]] = OpFunction310; CHECK-NEXT: %[[#A:]] = OpFunctionParameter311; CHECK: OpLabel312; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] sin %[[#A]]313; CHECK: OpReturnValue %[[#R]]314; CHECK-NEXT: OpFunctionEnd315define <2 x half> @vector_sin(<2 x half> %a) {316 %r = call <2 x half> @llvm.sin.v2f16(<2 x half> %a)317 ret <2 x half> %r318}319 320; CHECK: %[[#VECTOR_COS]] = OpFunction321; CHECK-NEXT: %[[#A:]] = OpFunctionParameter322; CHECK: OpLabel323; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] cos %[[#A]]324; CHECK: OpReturnValue %[[#R]]325; CHECK-NEXT: OpFunctionEnd326define <2 x half> @vector_cos(<2 x half> %a) {327 %r = call <2 x half> @llvm.cos.v2f16(<2 x half> %a)328 ret <2 x half> %r329}330 331; CHECK: %[[#VECTOR_EXP2]] = OpFunction332; CHECK-NEXT: %[[#A:]] = OpFunctionParameter333; CHECK: OpLabel334; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] exp2 %[[#A]]335; CHECK: OpReturnValue %[[#R]]336; CHECK-NEXT: OpFunctionEnd337define <2 x half> @vector_exp2(<2 x half> %a) {338 %r = call <2 x half> @llvm.exp2.v2f16(<2 x half> %a)339 ret <2 x half> %r340}341 342; CHECK: %[[#VECTOR_LOG]] = OpFunction343; CHECK-NEXT: %[[#A:]] = OpFunctionParameter344; CHECK: OpLabel345; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log %[[#A]]346; CHECK: OpReturnValue %[[#R]]347; CHECK-NEXT: OpFunctionEnd348define <2 x half> @vector_log(<2 x half> %a) {349 %r = call <2 x half> @llvm.log.v2f16(<2 x half> %a)350 ret <2 x half> %r351}352 353; CHECK: %[[#VECTOR_LOG10]] = OpFunction354; CHECK-NEXT: %[[#A:]] = OpFunctionParameter355; CHECK: OpLabel356; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log10 %[[#A]]357; CHECK: OpReturnValue %[[#R]]358; CHECK-NEXT: OpFunctionEnd359define <2 x half> @vector_log10(<2 x half> %a) {360 %r = call <2 x half> @llvm.log10.v2f16(<2 x half> %a)361 ret <2 x half> %r362}363 364; CHECK: %[[#VECTOR_LOG2]] = OpFunction365; CHECK-NEXT: %[[#A:]] = OpFunctionParameter366; CHECK: OpLabel367; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] log2 %[[#A]]368; CHECK: OpReturnValue %[[#R]]369; CHECK-NEXT: OpFunctionEnd370define <2 x half> @vector_log2(<2 x half> %a) {371 %r = call <2 x half> @llvm.log2.v2f16(<2 x half> %a)372 ret <2 x half> %r373}374 375; CHECK: %[[#SCALAR_MINNUM]] = OpFunction376; CHECK-NEXT: %[[#A:]] = OpFunctionParameter377; CHECK-NEXT: %[[#B:]] = OpFunctionParameter378; CHECK: OpLabel379; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] fmin %[[#A]] %[[#B]]380; CHECK: OpReturnValue %[[#R]]381; CHECK-NEXT: OpFunctionEnd382define float @scalar_minnum(float %A, float %B) {383 %r = call float @llvm.minnum.f32(float %A, float %B)384 ret float %r385}386 387; CHECK: %[[#SCALAR_MAXNUM]] = OpFunction388; CHECK-NEXT: %[[#A:]] = OpFunctionParameter389; CHECK-NEXT: %[[#B:]] = OpFunctionParameter390; CHECK: OpLabel391; CHECK: %[[#R:]] = OpExtInst %[[#]] %[[#CLEXT]] fmax %[[#A]] %[[#B]]392; CHECK: OpReturnValue %[[#R]]393; CHECK-NEXT: OpFunctionEnd394define float @scalar_maxnum(float %A, float %B) {395 %r = call float @llvm.maxnum.f32(float %A, float %B)396 ret float %r397}398