467 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-qfloat < %s | FileCheck %s3; RUN: llc -mtriple=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-ieee-fp < %s | FileCheck %s4 5; --- Half6 7define <64 x half> @test_00(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {8; CHECK-LABEL: test_00:9; CHECK: // %bb.0:10; CHECK-NEXT: {11; CHECK-NEXT: q0 = vcmp.eq(v0.h,v1.h)12; CHECK-NEXT: }13; CHECK-NEXT: {14; CHECK-NEXT: v0 = vmux(q0,v1,v2)15; CHECK-NEXT: jumpr r3116; CHECK-NEXT: }17 %t0 = fcmp oeq <64 x half> %v0, %v118 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v219 ret <64 x half> %t120}21 22define <64 x half> @test_01(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {23; CHECK-LABEL: test_01:24; CHECK: // %bb.0:25; CHECK-NEXT: {26; CHECK-NEXT: q0 = vcmp.eq(v0.h,v1.h)27; CHECK-NEXT: }28; CHECK-NEXT: {29; CHECK-NEXT: v0 = vmux(q0,v2,v1)30; CHECK-NEXT: jumpr r3131; CHECK-NEXT: }32 %t0 = fcmp one <64 x half> %v0, %v133 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v234 ret <64 x half> %t135}36 37define <64 x half> @test_02(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {38; CHECK-LABEL: test_02:39; CHECK: // %bb.0:40; CHECK-NEXT: {41; CHECK-NEXT: q0 = vcmp.gt(v1.hf,v0.hf)42; CHECK-NEXT: }43; CHECK-NEXT: {44; CHECK-NEXT: v0 = vmux(q0,v1,v2)45; CHECK-NEXT: jumpr r3146; CHECK-NEXT: }47 %t0 = fcmp olt <64 x half> %v0, %v148 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v249 ret <64 x half> %t150}51 52define <64 x half> @test_03(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {53; CHECK-LABEL: test_03:54; CHECK: // %bb.0:55; CHECK-NEXT: {56; CHECK-NEXT: q0 = vcmp.gt(v0.hf,v1.hf)57; CHECK-NEXT: }58; CHECK-NEXT: {59; CHECK-NEXT: v0 = vmux(q0,v2,v1)60; CHECK-NEXT: jumpr r3161; CHECK-NEXT: }62 %t0 = fcmp ole <64 x half> %v0, %v163 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v264 ret <64 x half> %t165}66 67define <64 x half> @test_04(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {68; CHECK-LABEL: test_04:69; CHECK: // %bb.0:70; CHECK-NEXT: {71; CHECK-NEXT: q0 = vcmp.gt(v0.hf,v1.hf)72; CHECK-NEXT: }73; CHECK-NEXT: {74; CHECK-NEXT: v0 = vmux(q0,v1,v2)75; CHECK-NEXT: jumpr r3176; CHECK-NEXT: }77 %t0 = fcmp ogt <64 x half> %v0, %v178 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v279 ret <64 x half> %t180}81 82define <64 x half> @test_05(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {83; CHECK-LABEL: test_05:84; CHECK: // %bb.0:85; CHECK-NEXT: {86; CHECK-NEXT: q0 = vcmp.gt(v1.hf,v0.hf)87; CHECK-NEXT: }88; CHECK-NEXT: {89; CHECK-NEXT: v0 = vmux(q0,v2,v1)90; CHECK-NEXT: jumpr r3191; CHECK-NEXT: }92 %t0 = fcmp oge <64 x half> %v0, %v193 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v294 ret <64 x half> %t195}96 97define <64 x half> @test_0a(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {98; CHECK-LABEL: test_0a:99; CHECK: // %bb.0:100; CHECK-NEXT: {101; CHECK-NEXT: r0 = ##16843009102; CHECK-NEXT: }103; CHECK-NEXT: {104; CHECK-NEXT: q0 = vand(v2,r0)105; CHECK-NEXT: }106; CHECK-NEXT: {107; CHECK-NEXT: q0 &= vcmp.eq(v0.h,v1.h)108; CHECK-NEXT: }109; CHECK-NEXT: {110; CHECK-NEXT: v0 = vmux(q0,v0,v1)111; CHECK-NEXT: jumpr r31112; CHECK-NEXT: }113 %q0 = fcmp oeq <64 x half> %v0, %v1114 %q1 = trunc <64 x i16> %v2 to <64 x i1>115 %q2 = and <64 x i1> %q0, %q1116 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1117 ret <64 x half> %t1118}119 120define <64 x half> @test_0b(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {121; CHECK-LABEL: test_0b:122; CHECK: // %bb.0:123; CHECK-NEXT: {124; CHECK-NEXT: r0 = ##16843009125; CHECK-NEXT: }126; CHECK-NEXT: {127; CHECK-NEXT: q0 = vand(v2,r0)128; CHECK-NEXT: }129; CHECK-NEXT: {130; CHECK-NEXT: q0 |= vcmp.eq(v0.h,v1.h)131; CHECK-NEXT: }132; CHECK-NEXT: {133; CHECK-NEXT: v0 = vmux(q0,v0,v1)134; CHECK-NEXT: jumpr r31135; CHECK-NEXT: }136 %q0 = fcmp oeq <64 x half> %v0, %v1137 %q1 = trunc <64 x i16> %v2 to <64 x i1>138 %q2 = or <64 x i1> %q0, %q1139 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1140 ret <64 x half> %t1141}142 143define <64 x half> @test_0c(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {144; CHECK-LABEL: test_0c:145; CHECK: // %bb.0:146; CHECK-NEXT: {147; CHECK-NEXT: r0 = ##16843009148; CHECK-NEXT: }149; CHECK-NEXT: {150; CHECK-NEXT: q0 = vand(v2,r0)151; CHECK-NEXT: }152; CHECK-NEXT: {153; CHECK-NEXT: q0 ^= vcmp.eq(v0.h,v1.h)154; CHECK-NEXT: }155; CHECK-NEXT: {156; CHECK-NEXT: v0 = vmux(q0,v0,v1)157; CHECK-NEXT: jumpr r31158; CHECK-NEXT: }159 %q0 = fcmp oeq <64 x half> %v0, %v1160 %q1 = trunc <64 x i16> %v2 to <64 x i1>161 %q2 = xor <64 x i1> %q0, %q1162 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1163 ret <64 x half> %t1164}165 166define <64 x half> @test_0d(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {167; CHECK-LABEL: test_0d:168; CHECK: // %bb.0:169; CHECK-NEXT: {170; CHECK-NEXT: r0 = ##16843009171; CHECK-NEXT: }172; CHECK-NEXT: {173; CHECK-NEXT: q0 = vand(v2,r0)174; CHECK-NEXT: }175; CHECK-NEXT: {176; CHECK-NEXT: q0 &= vcmp.gt(v0.hf,v1.hf)177; CHECK-NEXT: }178; CHECK-NEXT: {179; CHECK-NEXT: v0 = vmux(q0,v0,v1)180; CHECK-NEXT: jumpr r31181; CHECK-NEXT: }182 %q0 = fcmp ogt <64 x half> %v0, %v1183 %q1 = trunc <64 x i16> %v2 to <64 x i1>184 %q2 = and <64 x i1> %q0, %q1185 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1186 ret <64 x half> %t1187}188 189define <64 x half> @test_0e(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {190; CHECK-LABEL: test_0e:191; CHECK: // %bb.0:192; CHECK-NEXT: {193; CHECK-NEXT: r0 = ##16843009194; CHECK-NEXT: }195; CHECK-NEXT: {196; CHECK-NEXT: q0 = vand(v2,r0)197; CHECK-NEXT: }198; CHECK-NEXT: {199; CHECK-NEXT: q0 |= vcmp.gt(v0.hf,v1.hf)200; CHECK-NEXT: }201; CHECK-NEXT: {202; CHECK-NEXT: v0 = vmux(q0,v0,v1)203; CHECK-NEXT: jumpr r31204; CHECK-NEXT: }205 %q0 = fcmp ogt <64 x half> %v0, %v1206 %q1 = trunc <64 x i16> %v2 to <64 x i1>207 %q2 = or <64 x i1> %q0, %q1208 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1209 ret <64 x half> %t1210}211 212define <64 x half> @test_0f(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {213; CHECK-LABEL: test_0f:214; CHECK: // %bb.0:215; CHECK-NEXT: {216; CHECK-NEXT: r0 = ##16843009217; CHECK-NEXT: }218; CHECK-NEXT: {219; CHECK-NEXT: q0 = vand(v2,r0)220; CHECK-NEXT: }221; CHECK-NEXT: {222; CHECK-NEXT: q0 ^= vcmp.gt(v0.hf,v1.hf)223; CHECK-NEXT: }224; CHECK-NEXT: {225; CHECK-NEXT: v0 = vmux(q0,v0,v1)226; CHECK-NEXT: jumpr r31227; CHECK-NEXT: }228 %q0 = fcmp ogt <64 x half> %v0, %v1229 %q1 = trunc <64 x i16> %v2 to <64 x i1>230 %q2 = xor <64 x i1> %q0, %q1231 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1232 ret <64 x half> %t1233}234 235 236; --- Single237 238define <32 x float> @test_10(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {239; CHECK-LABEL: test_10:240; CHECK: // %bb.0:241; CHECK-NEXT: {242; CHECK-NEXT: q0 = vcmp.eq(v0.w,v1.w)243; CHECK-NEXT: }244; CHECK-NEXT: {245; CHECK-NEXT: v0 = vmux(q0,v1,v2)246; CHECK-NEXT: jumpr r31247; CHECK-NEXT: }248 %t0 = fcmp oeq <32 x float> %v0, %v1249 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2250 ret <32 x float> %t1251}252 253define <32 x float> @test_11(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {254; CHECK-LABEL: test_11:255; CHECK: // %bb.0:256; CHECK-NEXT: {257; CHECK-NEXT: q0 = vcmp.eq(v0.w,v1.w)258; CHECK-NEXT: }259; CHECK-NEXT: {260; CHECK-NEXT: v0 = vmux(q0,v2,v1)261; CHECK-NEXT: jumpr r31262; CHECK-NEXT: }263 %t0 = fcmp one <32 x float> %v0, %v1264 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2265 ret <32 x float> %t1266}267 268define <32 x float> @test_12(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {269; CHECK-LABEL: test_12:270; CHECK: // %bb.0:271; CHECK-NEXT: {272; CHECK-NEXT: q0 = vcmp.gt(v1.sf,v0.sf)273; CHECK-NEXT: }274; CHECK-NEXT: {275; CHECK-NEXT: v0 = vmux(q0,v1,v2)276; CHECK-NEXT: jumpr r31277; CHECK-NEXT: }278 %t0 = fcmp olt <32 x float> %v0, %v1279 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2280 ret <32 x float> %t1281}282 283define <32 x float> @test_13(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {284; CHECK-LABEL: test_13:285; CHECK: // %bb.0:286; CHECK-NEXT: {287; CHECK-NEXT: q0 = vcmp.gt(v0.sf,v1.sf)288; CHECK-NEXT: }289; CHECK-NEXT: {290; CHECK-NEXT: v0 = vmux(q0,v2,v1)291; CHECK-NEXT: jumpr r31292; CHECK-NEXT: }293 %t0 = fcmp ole <32 x float> %v0, %v1294 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2295 ret <32 x float> %t1296}297 298define <32 x float> @test_14(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {299; CHECK-LABEL: test_14:300; CHECK: // %bb.0:301; CHECK-NEXT: {302; CHECK-NEXT: q0 = vcmp.gt(v0.sf,v1.sf)303; CHECK-NEXT: }304; CHECK-NEXT: {305; CHECK-NEXT: v0 = vmux(q0,v1,v2)306; CHECK-NEXT: jumpr r31307; CHECK-NEXT: }308 %t0 = fcmp ogt <32 x float> %v0, %v1309 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2310 ret <32 x float> %t1311}312 313define <32 x float> @test_15(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {314; CHECK-LABEL: test_15:315; CHECK: // %bb.0:316; CHECK-NEXT: {317; CHECK-NEXT: q0 = vcmp.gt(v1.sf,v0.sf)318; CHECK-NEXT: }319; CHECK-NEXT: {320; CHECK-NEXT: v0 = vmux(q0,v2,v1)321; CHECK-NEXT: jumpr r31322; CHECK-NEXT: }323 %t0 = fcmp oge <32 x float> %v0, %v1324 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2325 ret <32 x float> %t1326}327 328define <32 x float> @test_1a(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {329; CHECK-LABEL: test_1a:330; CHECK: // %bb.0:331; CHECK-NEXT: {332; CHECK-NEXT: r0 = ##16843009333; CHECK-NEXT: }334; CHECK-NEXT: {335; CHECK-NEXT: q0 = vand(v2,r0)336; CHECK-NEXT: }337; CHECK-NEXT: {338; CHECK-NEXT: q0 &= vcmp.eq(v0.w,v1.w)339; CHECK-NEXT: }340; CHECK-NEXT: {341; CHECK-NEXT: v0 = vmux(q0,v0,v1)342; CHECK-NEXT: jumpr r31343; CHECK-NEXT: }344 %q0 = fcmp oeq <32 x float> %v0, %v1345 %q1 = trunc <32 x i32> %v2 to <32 x i1>346 %q2 = and <32 x i1> %q0, %q1347 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1348 ret <32 x float> %t1349}350 351define <32 x float> @test_1b(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {352; CHECK-LABEL: test_1b:353; CHECK: // %bb.0:354; CHECK-NEXT: {355; CHECK-NEXT: r0 = ##16843009356; CHECK-NEXT: }357; CHECK-NEXT: {358; CHECK-NEXT: q0 = vand(v2,r0)359; CHECK-NEXT: }360; CHECK-NEXT: {361; CHECK-NEXT: q0 |= vcmp.eq(v0.w,v1.w)362; CHECK-NEXT: }363; CHECK-NEXT: {364; CHECK-NEXT: v0 = vmux(q0,v0,v1)365; CHECK-NEXT: jumpr r31366; CHECK-NEXT: }367 %q0 = fcmp oeq <32 x float> %v0, %v1368 %q1 = trunc <32 x i32> %v2 to <32 x i1>369 %q2 = or <32 x i1> %q0, %q1370 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1371 ret <32 x float> %t1372}373 374define <32 x float> @test_1c(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {375; CHECK-LABEL: test_1c:376; CHECK: // %bb.0:377; CHECK-NEXT: {378; CHECK-NEXT: r0 = ##16843009379; CHECK-NEXT: }380; CHECK-NEXT: {381; CHECK-NEXT: q0 = vand(v2,r0)382; CHECK-NEXT: }383; CHECK-NEXT: {384; CHECK-NEXT: q0 ^= vcmp.eq(v0.w,v1.w)385; CHECK-NEXT: }386; CHECK-NEXT: {387; CHECK-NEXT: v0 = vmux(q0,v0,v1)388; CHECK-NEXT: jumpr r31389; CHECK-NEXT: }390 %q0 = fcmp oeq <32 x float> %v0, %v1391 %q1 = trunc <32 x i32> %v2 to <32 x i1>392 %q2 = xor <32 x i1> %q0, %q1393 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1394 ret <32 x float> %t1395}396 397define <32 x float> @test_1d(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {398; CHECK-LABEL: test_1d:399; CHECK: // %bb.0:400; CHECK-NEXT: {401; CHECK-NEXT: r0 = ##16843009402; CHECK-NEXT: }403; CHECK-NEXT: {404; CHECK-NEXT: q0 = vand(v2,r0)405; CHECK-NEXT: }406; CHECK-NEXT: {407; CHECK-NEXT: q0 &= vcmp.gt(v0.sf,v1.sf)408; CHECK-NEXT: }409; CHECK-NEXT: {410; CHECK-NEXT: v0 = vmux(q0,v0,v1)411; CHECK-NEXT: jumpr r31412; CHECK-NEXT: }413 %q0 = fcmp ogt <32 x float> %v0, %v1414 %q1 = trunc <32 x i32> %v2 to <32 x i1>415 %q2 = and <32 x i1> %q0, %q1416 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1417 ret <32 x float> %t1418}419 420define <32 x float> @test_1e(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {421; CHECK-LABEL: test_1e:422; CHECK: // %bb.0:423; CHECK-NEXT: {424; CHECK-NEXT: r0 = ##16843009425; CHECK-NEXT: }426; CHECK-NEXT: {427; CHECK-NEXT: q0 = vand(v2,r0)428; CHECK-NEXT: }429; CHECK-NEXT: {430; CHECK-NEXT: q0 |= vcmp.gt(v0.sf,v1.sf)431; CHECK-NEXT: }432; CHECK-NEXT: {433; CHECK-NEXT: v0 = vmux(q0,v0,v1)434; CHECK-NEXT: jumpr r31435; CHECK-NEXT: }436 %q0 = fcmp ogt <32 x float> %v0, %v1437 %q1 = trunc <32 x i32> %v2 to <32 x i1>438 %q2 = or <32 x i1> %q0, %q1439 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1440 ret <32 x float> %t1441}442 443define <32 x float> @test_1f(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {444; CHECK-LABEL: test_1f:445; CHECK: // %bb.0:446; CHECK-NEXT: {447; CHECK-NEXT: r0 = ##16843009448; CHECK-NEXT: }449; CHECK-NEXT: {450; CHECK-NEXT: q0 = vand(v2,r0)451; CHECK-NEXT: }452; CHECK-NEXT: {453; CHECK-NEXT: q0 ^= vcmp.gt(v0.sf,v1.sf)454; CHECK-NEXT: }455; CHECK-NEXT: {456; CHECK-NEXT: v0 = vmux(q0,v0,v1)457; CHECK-NEXT: jumpr r31458; CHECK-NEXT: }459 %q0 = fcmp ogt <32 x float> %v0, %v1460 %q1 = trunc <32 x i32> %v2 to <32 x i1>461 %q2 = xor <32 x i1> %q0, %q1462 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1463 ret <32 x float> %t1464}465 466attributes #0 = { nounwind readnone "target-cpu"="hexagonv69" }467