223 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,X644 5; PR 92676 7define <4 x i16> @func_16_32(ptr %a, ptr %b, ptr %c) nounwind {8; X86-LABEL: func_16_32:9; X86: # %bb.0:10; X86-NEXT: movl {{[0-9]+}}(%esp), %eax11; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx12; X86-NEXT: movl {{[0-9]+}}(%esp), %edx13; X86-NEXT: vmovdqa (%edx), %xmm014; X86-NEXT: vpaddw (%ecx), %xmm0, %xmm015; X86-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]16; X86-NEXT: vmovq %xmm0, (%eax)17; X86-NEXT: retl18;19; X64-LABEL: func_16_32:20; X64: # %bb.0:21; X64-NEXT: vmovdqa (%rsi), %xmm022; X64-NEXT: vpaddw (%rdi), %xmm0, %xmm023; X64-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]24; X64-NEXT: vmovq %xmm0, (%rdx)25; X64-NEXT: retq26 %F = load <4 x i32>, ptr %a27 %G = trunc <4 x i32> %F to <4 x i16>28 %H = load <4 x i32>, ptr %b29 %Y = trunc <4 x i32> %H to <4 x i16>30 %T = add <4 x i16> %Y, %G31 store <4 x i16>%T , ptr %c32 ret <4 x i16> %T33}34 35define <4 x i16> @func_16_64(ptr %a, ptr %b, ptr %c) nounwind {36; X86-LABEL: func_16_64:37; X86: # %bb.0:38; X86-NEXT: movl {{[0-9]+}}(%esp), %eax39; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx40; X86-NEXT: movl {{[0-9]+}}(%esp), %edx41; X86-NEXT: vmovaps (%edx), %ymm042; X86-NEXT: vxorps (%ecx), %ymm0, %ymm043; X86-NEXT: vextractf128 $1, %ymm0, %xmm144; X86-NEXT: vpxor %xmm2, %xmm2, %xmm245; X86-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]46; X86-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]47; X86-NEXT: vpackusdw %xmm1, %xmm0, %xmm048; X86-NEXT: vpackusdw %xmm0, %xmm0, %xmm049; X86-NEXT: vmovq %xmm0, (%eax)50; X86-NEXT: vzeroupper51; X86-NEXT: retl52;53; X64-LABEL: func_16_64:54; X64: # %bb.0:55; X64-NEXT: vmovdqa (%rsi), %ymm056; X64-NEXT: vpxor (%rdi), %ymm0, %ymm057; X64-NEXT: vpxor %xmm1, %xmm1, %xmm158; X64-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7],ymm0[8],ymm1[9,10,11],ymm0[12],ymm1[13,14,15]59; X64-NEXT: vextracti128 $1, %ymm0, %xmm160; X64-NEXT: vpackusdw %xmm1, %xmm0, %xmm061; X64-NEXT: vpackusdw %xmm0, %xmm0, %xmm062; X64-NEXT: vmovq %xmm0, (%rdx)63; X64-NEXT: vzeroupper64; X64-NEXT: retq65 %F = load <4 x i64>, ptr %a66 %G = trunc <4 x i64> %F to <4 x i16>67 %H = load <4 x i64>, ptr %b68 %Y = trunc <4 x i64> %H to <4 x i16>69 %T = xor <4 x i16> %Y, %G70 store <4 x i16>%T , ptr %c71 ret <4 x i16> %T72}73 74define <4 x i32> @func_32_64(ptr %a, ptr %b) nounwind {75; X86-LABEL: func_32_64:76; X86: # %bb.0:77; X86-NEXT: movl {{[0-9]+}}(%esp), %eax78; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx79; X86-NEXT: vmovaps (%ecx), %ymm080; X86-NEXT: vorps (%eax), %ymm0, %ymm081; X86-NEXT: vextractf128 $1, %ymm0, %xmm182; X86-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]83; X86-NEXT: vzeroupper84; X86-NEXT: retl85;86; X64-LABEL: func_32_64:87; X64: # %bb.0:88; X64-NEXT: vmovaps (%rsi), %ymm089; X64-NEXT: vorps (%rdi), %ymm0, %ymm090; X64-NEXT: vextractf128 $1, %ymm0, %xmm191; X64-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]92; X64-NEXT: vzeroupper93; X64-NEXT: retq94 %F = load <4 x i64>, ptr %a95 %G = trunc <4 x i64> %F to <4 x i32>96 %H = load <4 x i64>, ptr %b97 %Y = trunc <4 x i64> %H to <4 x i32>98 %T = or <4 x i32> %Y, %G99 ret <4 x i32> %T100}101 102define <4 x i8> @func_8_16(ptr %a, ptr %b) nounwind {103; X86-LABEL: func_8_16:104; X86: # %bb.0:105; X86-NEXT: movl {{[0-9]+}}(%esp), %eax106; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx107; X86-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero108; X86-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero109; X86-NEXT: vpaddb %xmm0, %xmm1, %xmm0110; X86-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,u,u,u,u,u,u,u,u,u,u,u,u]111; X86-NEXT: retl112;113; X64-LABEL: func_8_16:114; X64: # %bb.0:115; X64-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero116; X64-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero117; X64-NEXT: vpaddb %xmm0, %xmm1, %xmm0118; X64-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,u,u,u,u,u,u,u,u,u,u,u,u]119; X64-NEXT: retq120 %F = load <4 x i16>, ptr %a121 %G = trunc <4 x i16> %F to <4 x i8>122 %H = load <4 x i16>, ptr %b123 %Y = trunc <4 x i16> %H to <4 x i8>124 %T = add <4 x i8> %Y, %G125 ret <4 x i8> %T126}127 128define <4 x i8> @func_8_32(ptr %a, ptr %b) nounwind {129; X86-LABEL: func_8_32:130; X86: # %bb.0:131; X86-NEXT: movl {{[0-9]+}}(%esp), %eax132; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx133; X86-NEXT: vmovdqa (%ecx), %xmm0134; X86-NEXT: vpsubb (%eax), %xmm0, %xmm0135; X86-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]136; X86-NEXT: retl137;138; X64-LABEL: func_8_32:139; X64: # %bb.0:140; X64-NEXT: vmovdqa (%rsi), %xmm0141; X64-NEXT: vpsubb (%rdi), %xmm0, %xmm0142; X64-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]143; X64-NEXT: retq144 %F = load <4 x i32>, ptr %a145 %G = trunc <4 x i32> %F to <4 x i8>146 %H = load <4 x i32>, ptr %b147 %Y = trunc <4 x i32> %H to <4 x i8>148 %T = sub <4 x i8> %Y, %G149 ret <4 x i8> %T150}151 152define <4 x i8> @func_8_64(ptr %a, ptr %b) nounwind {153; X86-LABEL: func_8_64:154; X86: # %bb.0:155; X86-NEXT: movl {{[0-9]+}}(%esp), %eax156; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx157; X86-NEXT: vmovdqa (%ecx), %xmm0158; X86-NEXT: vmovdqa 16(%ecx), %xmm1159; X86-NEXT: vmovd {{.*#+}} xmm2 = [0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0]160; X86-NEXT: vpshufb %xmm2, %xmm1, %xmm1161; X86-NEXT: vpshufb %xmm2, %xmm0, %xmm0162; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]163; X86-NEXT: vmovdqa (%eax), %xmm1164; X86-NEXT: vmovdqa 16(%eax), %xmm3165; X86-NEXT: vpshufb %xmm2, %xmm3, %xmm3166; X86-NEXT: vpshufb %xmm2, %xmm1, %xmm1167; X86-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]168; X86-NEXT: vpaddb %xmm0, %xmm1, %xmm0169; X86-NEXT: retl170;171; X64-LABEL: func_8_64:172; X64: # %bb.0:173; X64-NEXT: vmovdqa (%rdi), %xmm0174; X64-NEXT: vmovdqa 16(%rdi), %xmm1175; X64-NEXT: vpbroadcastw {{.*#+}} xmm2 = [0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8]176; X64-NEXT: vpshufb %xmm2, %xmm1, %xmm1177; X64-NEXT: vpshufb %xmm2, %xmm0, %xmm0178; X64-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]179; X64-NEXT: vmovdqa (%rsi), %xmm1180; X64-NEXT: vmovdqa 16(%rsi), %xmm3181; X64-NEXT: vpshufb %xmm2, %xmm3, %xmm3182; X64-NEXT: vpshufb %xmm2, %xmm1, %xmm1183; X64-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]184; X64-NEXT: vpaddb %xmm0, %xmm1, %xmm0185; X64-NEXT: retq186 %F = load <4 x i64>, ptr %a187 %G = trunc <4 x i64> %F to <4 x i8>188 %H = load <4 x i64>, ptr %b189 %Y = trunc <4 x i64> %H to <4 x i8>190 %T = add <4 x i8> %Y, %G191 ret <4 x i8> %T192}193 194define <4 x i16> @const_16_32() nounwind {195; CHECK-LABEL: const_16_32:196; CHECK: # %bb.0:197; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = [0,3,8,7,0,0,0,0]198; CHECK-NEXT: ret{{[l|q]}}199 %G = trunc <4 x i32> <i32 0, i32 3, i32 8, i32 7> to <4 x i16>200 ret <4 x i16> %G201}202 203define <4 x i16> @const_16_64() nounwind {204; CHECK-LABEL: const_16_64:205; CHECK: # %bb.0:206; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = [0,3,8,7,0,0,0,0]207; CHECK-NEXT: ret{{[l|q]}}208 %G = trunc <4 x i64> <i64 0, i64 3, i64 8, i64 7> to <4 x i16>209 ret <4 x i16> %G210}211 212define void @bugOnTruncBitwidthReduce() nounwind {213; CHECK-LABEL: bugOnTruncBitwidthReduce:214; CHECK: # %bb.0: # %meh215; CHECK-NEXT: ret{{[l|q]}}216meh:217 %0 = xor <4 x i64> zeroinitializer, zeroinitializer218 %1 = trunc <4 x i64> %0 to <4 x i32>219 %2 = lshr <4 x i32> %1, <i32 18, i32 18, i32 18, i32 18>220 %3 = xor <4 x i32> %2, %1221 ret void222}223