303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=hexagon -mattr=+hvxv60,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V60 %s3; RUN: llc -mtriple=hexagon -mattr=+hvxv65,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V65 %s4; RUN: llc -mtriple=hexagon -mattr=+hvxv69,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V69 %s5 6define <64 x i16> @mulhs16(<64 x i16> %a0, <64 x i16> %a1) #0 {7; V60-LABEL: mulhs16:8; V60: // %bb.0:9; V60-NEXT: {10; V60-NEXT: v1:0.w = vmpy(v1.h,v0.h)11; V60-NEXT: }12; V60-NEXT: {13; V60-NEXT: r7 = #-414; V60-NEXT: }15; V60-NEXT: {16; V60-NEXT: v1:0 = vshuff(v1,v0,r7)17; V60-NEXT: }18; V60-NEXT: {19; V60-NEXT: v0.h = vpacko(v1.w,v0.w)20; V60-NEXT: }21; V60-NEXT: {22; V60-NEXT: jumpr r3123; V60-NEXT: }24;25; V65-LABEL: mulhs16:26; V65: // %bb.0:27; V65-NEXT: {28; V65-NEXT: v1:0.w = vmpy(v1.h,v0.h)29; V65-NEXT: }30; V65-NEXT: {31; V65-NEXT: r7 = #-432; V65-NEXT: }33; V65-NEXT: {34; V65-NEXT: v1:0 = vshuff(v1,v0,r7)35; V65-NEXT: }36; V65-NEXT: {37; V65-NEXT: v0.h = vpacko(v1.w,v0.w)38; V65-NEXT: }39; V65-NEXT: {40; V65-NEXT: jumpr r3141; V65-NEXT: }42;43; V69-LABEL: mulhs16:44; V69: // %bb.0:45; V69-NEXT: {46; V69-NEXT: v1:0.w = vmpy(v1.h,v0.h)47; V69-NEXT: }48; V69-NEXT: {49; V69-NEXT: r7 = #-450; V69-NEXT: }51; V69-NEXT: {52; V69-NEXT: v1:0 = vshuff(v1,v0,r7)53; V69-NEXT: }54; V69-NEXT: {55; V69-NEXT: v0.h = vpacko(v1.w,v0.w)56; V69-NEXT: }57; V69-NEXT: {58; V69-NEXT: jumpr r3159; V69-NEXT: }60 %v0 = sext <64 x i16> %a0 to <64 x i32>61 %v1 = sext <64 x i16> %a1 to <64 x i32>62 %v2 = mul <64 x i32> %v0, %v163 %v3 = lshr <64 x i32> %v2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>64 %v4 = trunc <64 x i32> %v3 to <64 x i16>65 ret <64 x i16> %v466}67 68define <64 x i16> @mulhu16(<64 x i16> %a0, <64 x i16> %a1) #0 {69; V60-LABEL: mulhu16:70; V60: // %bb.0:71; V60-NEXT: {72; V60-NEXT: v1:0.uw = vmpy(v1.uh,v0.uh)73; V60-NEXT: }74; V60-NEXT: {75; V60-NEXT: r7 = #-476; V60-NEXT: }77; V60-NEXT: {78; V60-NEXT: v1:0 = vshuff(v1,v0,r7)79; V60-NEXT: }80; V60-NEXT: {81; V60-NEXT: v0.h = vpacko(v1.w,v0.w)82; V60-NEXT: }83; V60-NEXT: {84; V60-NEXT: jumpr r3185; V60-NEXT: }86;87; V65-LABEL: mulhu16:88; V65: // %bb.0:89; V65-NEXT: {90; V65-NEXT: v1:0.uw = vmpy(v1.uh,v0.uh)91; V65-NEXT: }92; V65-NEXT: {93; V65-NEXT: r7 = #-494; V65-NEXT: }95; V65-NEXT: {96; V65-NEXT: v1:0 = vshuff(v1,v0,r7)97; V65-NEXT: }98; V65-NEXT: {99; V65-NEXT: v0.h = vpacko(v1.w,v0.w)100; V65-NEXT: }101; V65-NEXT: {102; V65-NEXT: jumpr r31103; V65-NEXT: }104;105; V69-LABEL: mulhu16:106; V69: // %bb.0:107; V69-NEXT: {108; V69-NEXT: v0.uh = vmpy(v0.uh,v1.uh):>>16109; V69-NEXT: }110; V69-NEXT: {111; V69-NEXT: jumpr r31112; V69-NEXT: }113 %v0 = zext <64 x i16> %a0 to <64 x i32>114 %v1 = zext <64 x i16> %a1 to <64 x i32>115 %v2 = mul <64 x i32> %v0, %v1116 %v3 = lshr <64 x i32> %v2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>117 %v4 = trunc <64 x i32> %v3 to <64 x i16>118 ret <64 x i16> %v4119}120 121define <32 x i32> @mulhs32(<32 x i32> %a0, <32 x i32> %a1) #0 {122; V60-LABEL: mulhs32:123; V60: // %bb.0:124; V60-NEXT: {125; V60-NEXT: r0 = #16126; V60-NEXT: }127; V60-NEXT: {128; V60-NEXT: v2.w = vmpye(v1.w,v0.uh)129; V60-NEXT: }130; V60-NEXT: {131; V60-NEXT: v31.w = vasr(v0.w,r0)132; V60-NEXT: }133; V60-NEXT: {134; V60-NEXT: v3.w = vasr(v1.w,r0)135; V60-NEXT: }136; V60-NEXT: {137; V60-NEXT: v5:4.w = vmpy(v31.h,v1.uh)138; V60-NEXT: }139; V60-NEXT: {140; V60-NEXT: v31:30.w = vmpy(v31.h,v3.h)141; V60-NEXT: }142; V60-NEXT: {143; V60-NEXT: v7:6.w = vadd(v2.uh,v4.uh)144; V60-NEXT: }145; V60-NEXT: {146; V60-NEXT: v29:28.w = vadd(v2.h,v4.h)147; V60-NEXT: }148; V60-NEXT: {149; V60-NEXT: v29.w += vasr(v6.w,r0)150; V60-NEXT: }151; V60-NEXT: {152; V60-NEXT: v0.w = vadd(v29.w,v30.w)153; V60-NEXT: }154; V60-NEXT: {155; V60-NEXT: jumpr r31156; V60-NEXT: }157;158; V65-LABEL: mulhs32:159; V65: // %bb.0:160; V65-NEXT: {161; V65-NEXT: v3:2 = vmpye(v0.w,v1.uh)162; V65-NEXT: }163; V65-NEXT: {164; V65-NEXT: v3:2 += vmpyo(v0.w,v1.h)165; V65-NEXT: }166; V65-NEXT: {167; V65-NEXT: v0 = v3168; V65-NEXT: }169; V65-NEXT: {170; V65-NEXT: jumpr r31171; V65-NEXT: }172;173; V69-LABEL: mulhs32:174; V69: // %bb.0:175; V69-NEXT: {176; V69-NEXT: v3:2 = vmpye(v0.w,v1.uh)177; V69-NEXT: }178; V69-NEXT: {179; V69-NEXT: v3:2 += vmpyo(v0.w,v1.h)180; V69-NEXT: }181; V69-NEXT: {182; V69-NEXT: v0 = v3183; V69-NEXT: }184; V69-NEXT: {185; V69-NEXT: jumpr r31186; V69-NEXT: }187 %v0 = sext <32 x i32> %a0 to <32 x i64>188 %v1 = sext <32 x i32> %a1 to <32 x i64>189 %v2 = mul <32 x i64> %v0, %v1190 %v3 = lshr <32 x i64> %v2, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>191 %v4 = trunc <32 x i64> %v3 to <32 x i32>192 ret <32 x i32> %v4193}194 195define <32 x i32> @mulhu32(<32 x i32> %a0, <32 x i32> %a1) #0 {196; V60-LABEL: mulhu32:197; V60: // %bb.0:198; V60-NEXT: {199; V60-NEXT: r0 = ##33686018200; V60-NEXT: }201; V60-NEXT: {202; V60-NEXT: v3:2.uw = vmpy(v0.uh,v1.uh)203; V60-NEXT: }204; V60-NEXT: {205; V60-NEXT: r2 = #16206; V60-NEXT: }207; V60-NEXT: {208; V60-NEXT: v4 = vsplat(r0)209; V60-NEXT: }210; V60-NEXT: {211; V60-NEXT: v2.uw = vlsr(v2.uw,r2)212; V60-NEXT: }213; V60-NEXT: {214; V60-NEXT: v31 = vdelta(v1,v4)215; V60-NEXT: }216; V60-NEXT: {217; V60-NEXT: v1:0.uw = vmpy(v0.uh,v31.uh)218; V60-NEXT: }219; V60-NEXT: {220; V60-NEXT: v1:0.w = vadd(v1.uh,v0.uh)221; V60-NEXT: }222; V60-NEXT: {223; V60-NEXT: v0.w = vadd(v0.w,v2.w)224; V60-NEXT: }225; V60-NEXT: {226; V60-NEXT: v1.w += vasr(v0.w,r2)227; V60-NEXT: }228; V60-NEXT: {229; V60-NEXT: v0.w = vadd(v3.w,v1.w)230; V60-NEXT: }231; V60-NEXT: {232; V60-NEXT: jumpr r31233; V60-NEXT: }234;235; V65-LABEL: mulhu32:236; V65: // %bb.0:237; V65-NEXT: {238; V65-NEXT: v2 = vxor(v2,v2)239; V65-NEXT: }240; V65-NEXT: {241; V65-NEXT: v5:4 = vmpye(v0.w,v1.uh)242; V65-NEXT: }243; V65-NEXT: {244; V65-NEXT: q0 = vcmp.gt(v2.w,v0.w)245; V65-NEXT: }246; V65-NEXT: {247; V65-NEXT: q1 = vcmp.gt(v2.w,v1.w)248; V65-NEXT: }249; V65-NEXT: {250; V65-NEXT: v5:4 += vmpyo(v0.w,v1.h)251; V65-NEXT: }252; V65-NEXT: {253; V65-NEXT: v31 = vand(q0,v1)254; V65-NEXT: }255; V65-NEXT: {256; V65-NEXT: if (q1) v31.w += v0.w257; V65-NEXT: }258; V65-NEXT: {259; V65-NEXT: v0.w = vadd(v5.w,v31.w)260; V65-NEXT: }261; V65-NEXT: {262; V65-NEXT: jumpr r31263; V65-NEXT: }264;265; V69-LABEL: mulhu32:266; V69: // %bb.0:267; V69-NEXT: {268; V69-NEXT: v2 = vxor(v2,v2)269; V69-NEXT: }270; V69-NEXT: {271; V69-NEXT: v5:4 = vmpye(v0.w,v1.uh)272; V69-NEXT: }273; V69-NEXT: {274; V69-NEXT: q0 = vcmp.gt(v2.w,v0.w)275; V69-NEXT: }276; V69-NEXT: {277; V69-NEXT: q1 = vcmp.gt(v2.w,v1.w)278; V69-NEXT: }279; V69-NEXT: {280; V69-NEXT: v5:4 += vmpyo(v0.w,v1.h)281; V69-NEXT: }282; V69-NEXT: {283; V69-NEXT: v31 = vand(q0,v1)284; V69-NEXT: }285; V69-NEXT: {286; V69-NEXT: if (q1) v31.w += v0.w287; V69-NEXT: }288; V69-NEXT: {289; V69-NEXT: v0.w = vadd(v5.w,v31.w)290; V69-NEXT: }291; V69-NEXT: {292; V69-NEXT: jumpr r31293; V69-NEXT: }294 %v0 = zext <32 x i32> %a0 to <32 x i64>295 %v1 = zext <32 x i32> %a1 to <32 x i64>296 %v2 = mul <32 x i64> %v0, %v1297 %v3 = lshr <32 x i64> %v2, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>298 %v4 = trunc <32 x i64> %v3 to <32 x i32>299 ret <32 x i32> %v4300}301 302attributes #0 = { nounwind memory(none) }303