347 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE44; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512f | FileCheck %s --check-prefixes=CHECK,AVX,AVX5127; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefixes=CHECK,AVX,AVX5128 9; trunc(concat(x,y)) -> pack10 11define <8 x i16> @trunc_concat_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) nounwind {12; SSE-LABEL: trunc_concat_packssdw_128:13; SSE: # %bb.0:14; SSE-NEXT: psrad $17, %xmm015; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm116; SSE-NEXT: packssdw %xmm1, %xmm017; SSE-NEXT: retq18;19; AVX1-LABEL: trunc_concat_packssdw_128:20; AVX1: # %bb.0:21; AVX1-NEXT: vpsrad $17, %xmm0, %xmm022; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm123; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm024; AVX1-NEXT: retq25;26; AVX2-LABEL: trunc_concat_packssdw_128:27; AVX2: # %bb.0:28; AVX2-NEXT: vpsrad $17, %xmm0, %xmm029; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [15,15,15,15]30; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm131; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm032; AVX2-NEXT: retq33;34; AVX512-LABEL: trunc_concat_packssdw_128:35; AVX512: # %bb.0:36; AVX512-NEXT: vpsrad $17, %xmm0, %xmm037; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm138; AVX512-NEXT: vpackssdw %xmm1, %xmm0, %xmm039; AVX512-NEXT: retq40 %1 = ashr <4 x i32> %a0, <i32 17, i32 17, i32 17, i32 17>41 %2 = and <4 x i32> %a1, <i32 15, i32 15, i32 15, i32 15>42 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>43 %4 = trunc <8 x i32> %3 to <8 x i16>44 ret <8 x i16> %445}46 47define <8 x i16> @trunc_concat_packusdw_128(<4 x i32> %a0, <4 x i32> %a1) nounwind {48; SSE2-LABEL: trunc_concat_packusdw_128:49; SSE2: # %bb.0:50; SSE2-NEXT: psrld $17, %xmm051; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm152; SSE2-NEXT: packssdw %xmm1, %xmm053; SSE2-NEXT: retq54;55; SSE4-LABEL: trunc_concat_packusdw_128:56; SSE4: # %bb.0:57; SSE4-NEXT: psrld $17, %xmm058; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm159; SSE4-NEXT: packusdw %xmm1, %xmm060; SSE4-NEXT: retq61;62; AVX1-LABEL: trunc_concat_packusdw_128:63; AVX1: # %bb.0:64; AVX1-NEXT: vpsrld $17, %xmm0, %xmm065; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm166; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm067; AVX1-NEXT: retq68;69; AVX2-LABEL: trunc_concat_packusdw_128:70; AVX2: # %bb.0:71; AVX2-NEXT: vpsrld $17, %xmm0, %xmm072; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [15,15,15,15]73; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm174; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm075; AVX2-NEXT: retq76;77; AVX512-LABEL: trunc_concat_packusdw_128:78; AVX512: # %bb.0:79; AVX512-NEXT: vpsrld $17, %xmm0, %xmm080; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm181; AVX512-NEXT: vpackusdw %xmm1, %xmm0, %xmm082; AVX512-NEXT: retq83 %1 = lshr <4 x i32> %a0, <i32 17, i32 17, i32 17, i32 17>84 %2 = and <4 x i32> %a1, <i32 15, i32 15, i32 15, i32 15>85 %3 = shufflevector <4 x i32> %1, <4 x i32> %2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>86 %4 = trunc <8 x i32> %3 to <8 x i16>87 ret <8 x i16> %488}89 90define <16 x i8> @trunc_concat_packsswb_128(<8 x i16> %a0, <8 x i16> %a1) nounwind {91; SSE-LABEL: trunc_concat_packsswb_128:92; SSE: # %bb.0:93; SSE-NEXT: psraw $15, %xmm094; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm195; SSE-NEXT: packsswb %xmm1, %xmm096; SSE-NEXT: retq97;98; AVX1-LABEL: trunc_concat_packsswb_128:99; AVX1: # %bb.0:100; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0101; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1102; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0103; AVX1-NEXT: retq104;105; AVX2-LABEL: trunc_concat_packsswb_128:106; AVX2: # %bb.0:107; AVX2-NEXT: vpsraw $15, %xmm0, %xmm0108; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1109; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0110; AVX2-NEXT: retq111;112; AVX512-LABEL: trunc_concat_packsswb_128:113; AVX512: # %bb.0:114; AVX512-NEXT: vpsraw $15, %xmm0, %xmm0115; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1116; AVX512-NEXT: vpacksswb %xmm1, %xmm0, %xmm0117; AVX512-NEXT: retq118 %1 = ashr <8 x i16> %a0, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>119 %2 = and <8 x i16> %a1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>120 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>121 %4 = trunc <16 x i16> %3 to <16 x i8>122 ret <16 x i8> %4123}124 125define <16 x i8> @trunc_concat_packuswb_128(<8 x i16> %a0, <8 x i16> %a1) nounwind {126; SSE-LABEL: trunc_concat_packuswb_128:127; SSE: # %bb.0:128; SSE-NEXT: psrlw $15, %xmm0129; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1130; SSE-NEXT: packuswb %xmm1, %xmm0131; SSE-NEXT: retq132;133; AVX1-LABEL: trunc_concat_packuswb_128:134; AVX1: # %bb.0:135; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0136; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1137; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0138; AVX1-NEXT: retq139;140; AVX2-LABEL: trunc_concat_packuswb_128:141; AVX2: # %bb.0:142; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0143; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1144; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0145; AVX2-NEXT: retq146;147; AVX512-LABEL: trunc_concat_packuswb_128:148; AVX512: # %bb.0:149; AVX512-NEXT: vpsrlw $15, %xmm0, %xmm0150; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1151; AVX512-NEXT: vpackuswb %xmm1, %xmm0, %xmm0152; AVX512-NEXT: retq153 %1 = lshr <8 x i16> %a0, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>154 %2 = and <8 x i16> %a1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>155 %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>156 %4 = trunc <16 x i16> %3 to <16 x i8>157 ret <16 x i8> %4158}159 160; concat(trunc(x),trunc(y)) -> pack161 162define <8 x i16> @concat_trunc_packssdw_128(<4 x i32> %a0, <4 x i32> %a1) nounwind {163; SSE2-LABEL: concat_trunc_packssdw_128:164; SSE2: # %bb.0:165; SSE2-NEXT: psrad $17, %xmm0166; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1167; SSE2-NEXT: packssdw %xmm0, %xmm0168; SSE2-NEXT: packuswb %xmm1, %xmm1169; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]170; SSE2-NEXT: retq171;172; SSE4-LABEL: concat_trunc_packssdw_128:173; SSE4: # %bb.0:174; SSE4-NEXT: psrad $17, %xmm0175; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1176; SSE4-NEXT: packssdw %xmm1, %xmm0177; SSE4-NEXT: retq178;179; AVX1-LABEL: concat_trunc_packssdw_128:180; AVX1: # %bb.0:181; AVX1-NEXT: vpsrad $17, %xmm0, %xmm0182; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1183; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0184; AVX1-NEXT: retq185;186; AVX2-LABEL: concat_trunc_packssdw_128:187; AVX2: # %bb.0:188; AVX2-NEXT: vpsrad $17, %xmm0, %xmm0189; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [15,15,15,15]190; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1191; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0192; AVX2-NEXT: retq193;194; AVX512-LABEL: concat_trunc_packssdw_128:195; AVX512: # %bb.0:196; AVX512-NEXT: vpsrad $17, %xmm0, %xmm0197; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1198; AVX512-NEXT: vpackssdw %xmm1, %xmm0, %xmm0199; AVX512-NEXT: retq200 %1 = ashr <4 x i32> %a0, <i32 17, i32 17, i32 17, i32 17>201 %2 = and <4 x i32> %a1, <i32 15, i32 15, i32 15, i32 15>202 %3 = trunc <4 x i32> %1 to <4 x i16>203 %4 = trunc <4 x i32> %2 to <4 x i16>204 %5 = shufflevector <4 x i16> %3, <4 x i16> %4, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>205 ret <8 x i16> %5206}207 208define <8 x i16> @concat_trunc_packusdw_128(<4 x i32> %a0, <4 x i32> %a1) nounwind {209; SSE2-LABEL: concat_trunc_packusdw_128:210; SSE2: # %bb.0:211; SSE2-NEXT: psrld $17, %xmm0212; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1213; SSE2-NEXT: packssdw %xmm0, %xmm0214; SSE2-NEXT: packuswb %xmm1, %xmm1215; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]216; SSE2-NEXT: retq217;218; SSE4-LABEL: concat_trunc_packusdw_128:219; SSE4: # %bb.0:220; SSE4-NEXT: psrld $17, %xmm0221; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1222; SSE4-NEXT: packusdw %xmm1, %xmm0223; SSE4-NEXT: retq224;225; AVX1-LABEL: concat_trunc_packusdw_128:226; AVX1: # %bb.0:227; AVX1-NEXT: vpsrld $17, %xmm0, %xmm0228; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1229; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0230; AVX1-NEXT: retq231;232; AVX2-LABEL: concat_trunc_packusdw_128:233; AVX2: # %bb.0:234; AVX2-NEXT: vpsrld $17, %xmm0, %xmm0235; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [15,15,15,15]236; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1237; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0238; AVX2-NEXT: retq239;240; AVX512-LABEL: concat_trunc_packusdw_128:241; AVX512: # %bb.0:242; AVX512-NEXT: vpsrld $17, %xmm0, %xmm0243; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1244; AVX512-NEXT: vpackusdw %xmm1, %xmm0, %xmm0245; AVX512-NEXT: retq246 %1 = lshr <4 x i32> %a0, <i32 17, i32 17, i32 17, i32 17>247 %2 = and <4 x i32> %a1, <i32 15, i32 15, i32 15, i32 15>248 %3 = trunc <4 x i32> %1 to <4 x i16>249 %4 = trunc <4 x i32> %2 to <4 x i16>250 %5 = shufflevector <4 x i16> %3, <4 x i16> %4, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>251 ret <8 x i16> %5252}253 254define <16 x i8> @concat_trunc_packsswb_128(<8 x i16> %a0, <8 x i16> %a1) nounwind {255; SSE-LABEL: concat_trunc_packsswb_128:256; SSE: # %bb.0:257; SSE-NEXT: psraw $15, %xmm0258; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1259; SSE-NEXT: packsswb %xmm1, %xmm0260; SSE-NEXT: retq261;262; AVX1-LABEL: concat_trunc_packsswb_128:263; AVX1: # %bb.0:264; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0265; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1266; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0267; AVX1-NEXT: retq268;269; AVX2-LABEL: concat_trunc_packsswb_128:270; AVX2: # %bb.0:271; AVX2-NEXT: vpsraw $15, %xmm0, %xmm0272; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1273; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0274; AVX2-NEXT: retq275;276; AVX512-LABEL: concat_trunc_packsswb_128:277; AVX512: # %bb.0:278; AVX512-NEXT: vpsraw $15, %xmm0, %xmm0279; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1280; AVX512-NEXT: vpacksswb %xmm1, %xmm0, %xmm0281; AVX512-NEXT: retq282 %1 = ashr <8 x i16> %a0, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>283 %2 = and <8 x i16> %a1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>284 %3 = trunc <8 x i16> %1 to <8 x i8>285 %4 = trunc <8 x i16> %2 to <8 x i8>286 %5 = shufflevector <8 x i8> %3, <8 x i8> %4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>287 ret <16 x i8> %5288}289 290define <16 x i8> @concat_trunc_packuswb_128(<8 x i16> %a0, <8 x i16> %a1) nounwind {291; SSE-LABEL: concat_trunc_packuswb_128:292; SSE: # %bb.0:293; SSE-NEXT: psrlw $15, %xmm0294; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1295; SSE-NEXT: packuswb %xmm1, %xmm0296; SSE-NEXT: retq297;298; AVX1-LABEL: concat_trunc_packuswb_128:299; AVX1: # %bb.0:300; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0301; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1302; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0303; AVX1-NEXT: retq304;305; AVX2-LABEL: concat_trunc_packuswb_128:306; AVX2: # %bb.0:307; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0308; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1309; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0310; AVX2-NEXT: retq311;312; AVX512-LABEL: concat_trunc_packuswb_128:313; AVX512: # %bb.0:314; AVX512-NEXT: vpsrlw $15, %xmm0, %xmm0315; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1316; AVX512-NEXT: vpackuswb %xmm1, %xmm0, %xmm0317; AVX512-NEXT: retq318 %1 = lshr <8 x i16> %a0, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>319 %2 = and <8 x i16> %a1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>320 %3 = trunc <8 x i16> %1 to <8 x i8>321 %4 = trunc <8 x i16> %2 to <8 x i8>322 %5 = shufflevector <8 x i8> %3, <8 x i8> %4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>323 ret <16 x i8> %5324}325 326; Fuzz test - don't pack a v1i32 comparison result.327define void @autogen_SD10339(<1 x i32> %I49) {328; CHECK-LABEL: autogen_SD10339:329; CHECK: # %bb.0: # %BB330; CHECK-NEXT: .p2align 4331; CHECK-NEXT: .LBB8_1: # %CF332; CHECK-NEXT: # =>This Inner Loop Header: Depth=1333; CHECK-NEXT: movw $1, 0334; CHECK-NEXT: jmp .LBB8_1335BB:336 %Cmp53 = icmp uge <1 x i32> %I49, zeroinitializer337 br label %CF338 339CF: ; preds = %CF, %BB340 %ZE166 = zext <1 x i1> %Cmp53 to <1 x i16>341 store <1 x i16> %ZE166, ptr null, align 2342 br label %CF343}344 345;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:346; AVX: {{.*}}347