brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.7 KiB · e229165 Raw
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