2757 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=XOP5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL,AVX512VL-FALLBACK9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW-FALLBACK10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512VL,AVX512VLBW11 12; These test cases are inspired by C++2a std::midpoint().13; See https://bugs.llvm.org/show_bug.cgi?id=4096514 15; Using 256-bit vector regs.16 17; ---------------------------------------------------------------------------- ;18; 32-bit width. 256 / 32 = 8 elts.19; ---------------------------------------------------------------------------- ;20 21; Values come from regs22 23define <8 x i32> @vec256_i32_signed_reg_reg(<8 x i32> %a1, <8 x i32> %a2) nounwind {24; AVX1-LABEL: vec256_i32_signed_reg_reg:25; AVX1: # %bb.0:26; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm227; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm328; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm229; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm130; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm331; AVX1-NEXT: vpminsd %xmm1, %xmm3, %xmm432; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm133; AVX1-NEXT: vpsubd %xmm4, %xmm1, %xmm134; AVX1-NEXT: vpsrld $1, %xmm1, %xmm135; AVX1-NEXT: vpsrld $1, %xmm2, %xmm236; AVX1-NEXT: vpmulld %xmm2, %xmm2, %xmm237; AVX1-NEXT: vpmulld %xmm1, %xmm1, %xmm138; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm139; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm040; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm041; AVX1-NEXT: retq42;43; AVX2-LABEL: vec256_i32_signed_reg_reg:44; AVX2: # %bb.0:45; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm246; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm147; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm148; AVX2-NEXT: vpsrld $1, %ymm1, %ymm149; AVX2-NEXT: vpmulld %ymm1, %ymm1, %ymm150; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm051; AVX2-NEXT: retq52;53; XOP-LABEL: vec256_i32_signed_reg_reg:54; XOP: # %bb.0:55; XOP-NEXT: vextractf128 $1, %ymm1, %xmm256; XOP-NEXT: vextractf128 $1, %ymm0, %xmm357; XOP-NEXT: vpminsd %xmm2, %xmm3, %xmm458; XOP-NEXT: vpmaxsd %xmm2, %xmm3, %xmm259; XOP-NEXT: vpsubd %xmm4, %xmm2, %xmm260; XOP-NEXT: vpminsd %xmm1, %xmm0, %xmm461; XOP-NEXT: vpmaxsd %xmm1, %xmm0, %xmm162; XOP-NEXT: vpsubd %xmm4, %xmm1, %xmm163; XOP-NEXT: vpsrld $1, %xmm1, %xmm164; XOP-NEXT: vpsrld $1, %xmm2, %xmm265; XOP-NEXT: vpmacsdd %xmm3, %xmm2, %xmm2, %xmm266; XOP-NEXT: vpmacsdd %xmm0, %xmm1, %xmm1, %xmm067; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm068; XOP-NEXT: retq69;70; AVX512-LABEL: vec256_i32_signed_reg_reg:71; AVX512: # %bb.0:72; AVX512-NEXT: vpminsd %ymm1, %ymm0, %ymm273; AVX512-NEXT: vpmaxsd %ymm1, %ymm0, %ymm174; AVX512-NEXT: vpsubd %ymm2, %ymm1, %ymm175; AVX512-NEXT: vpsrld $1, %ymm1, %ymm176; AVX512-NEXT: vpmulld %ymm1, %ymm1, %ymm177; AVX512-NEXT: vpaddd %ymm0, %ymm1, %ymm078; AVX512-NEXT: retq79 %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed80 %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>81 %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a182 %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a283 %t7 = sub <8 x i32> %t6, %t584 %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>85 %t9 = mul nsw <8 x i32> %t8, %t8 ; signed86 %a10 = add nsw <8 x i32> %t9, %a1 ; signed87 ret <8 x i32> %a1088}89 90define <8 x i32> @vec256_i32_unsigned_reg_reg(<8 x i32> %a1, <8 x i32> %a2) nounwind {91; AVX1-LABEL: vec256_i32_unsigned_reg_reg:92; AVX1: # %bb.0:93; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm294; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm395; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm296; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm197; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm398; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm499; AVX1-NEXT: vpmaxud %xmm1, %xmm3, %xmm1100; AVX1-NEXT: vpsubd %xmm4, %xmm1, %xmm1101; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1102; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2103; AVX1-NEXT: vpmulld %xmm2, %xmm2, %xmm2104; AVX1-NEXT: vpmulld %xmm1, %xmm1, %xmm1105; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1106; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm0107; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0108; AVX1-NEXT: retq109;110; AVX2-LABEL: vec256_i32_unsigned_reg_reg:111; AVX2: # %bb.0:112; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm2113; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm1114; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1115; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1116; AVX2-NEXT: vpmulld %ymm1, %ymm1, %ymm1117; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0118; AVX2-NEXT: retq119;120; XOP-LABEL: vec256_i32_unsigned_reg_reg:121; XOP: # %bb.0:122; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2123; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3124; XOP-NEXT: vpminud %xmm2, %xmm3, %xmm4125; XOP-NEXT: vpmaxud %xmm2, %xmm3, %xmm2126; XOP-NEXT: vpsubd %xmm4, %xmm2, %xmm2127; XOP-NEXT: vpminud %xmm1, %xmm0, %xmm4128; XOP-NEXT: vpmaxud %xmm1, %xmm0, %xmm1129; XOP-NEXT: vpsubd %xmm4, %xmm1, %xmm1130; XOP-NEXT: vpsrld $1, %xmm1, %xmm1131; XOP-NEXT: vpsrld $1, %xmm2, %xmm2132; XOP-NEXT: vpmacsdd %xmm3, %xmm2, %xmm2, %xmm2133; XOP-NEXT: vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0134; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0135; XOP-NEXT: retq136;137; AVX512-LABEL: vec256_i32_unsigned_reg_reg:138; AVX512: # %bb.0:139; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm2140; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm1141; AVX512-NEXT: vpsubd %ymm2, %ymm1, %ymm1142; AVX512-NEXT: vpsrld $1, %ymm1, %ymm1143; AVX512-NEXT: vpmulld %ymm1, %ymm1, %ymm1144; AVX512-NEXT: vpaddd %ymm0, %ymm1, %ymm0145; AVX512-NEXT: retq146 %t3 = icmp ugt <8 x i32> %a1, %a2147 %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>148 %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1149 %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2150 %t7 = sub <8 x i32> %t6, %t5151 %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>152 %t9 = mul <8 x i32> %t8, %t8153 %a10 = add <8 x i32> %t9, %a1154 ret <8 x i32> %a10155}156 157; Values are loaded. Only check signed case.158 159define <8 x i32> @vec256_i32_signed_mem_reg(ptr %a1_addr, <8 x i32> %a2) nounwind {160; AVX1-LABEL: vec256_i32_signed_mem_reg:161; AVX1: # %bb.0:162; AVX1-NEXT: vmovdqa (%rdi), %xmm1163; AVX1-NEXT: vmovdqa 16(%rdi), %xmm2164; AVX1-NEXT: vpminsd %xmm0, %xmm1, %xmm3165; AVX1-NEXT: vpmaxsd %xmm0, %xmm1, %xmm4166; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3167; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0168; AVX1-NEXT: vpminsd %xmm0, %xmm2, %xmm4169; AVX1-NEXT: vpmaxsd %xmm0, %xmm2, %xmm0170; AVX1-NEXT: vpsubd %xmm4, %xmm0, %xmm0171; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0172; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3173; AVX1-NEXT: vpmulld %xmm3, %xmm3, %xmm3174; AVX1-NEXT: vpmulld %xmm0, %xmm0, %xmm0175; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0176; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1177; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0178; AVX1-NEXT: retq179;180; AVX2-LABEL: vec256_i32_signed_mem_reg:181; AVX2: # %bb.0:182; AVX2-NEXT: vmovdqa (%rdi), %ymm1183; AVX2-NEXT: vpminsd %ymm0, %ymm1, %ymm2184; AVX2-NEXT: vpmaxsd %ymm0, %ymm1, %ymm0185; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm0186; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0187; AVX2-NEXT: vpmulld %ymm0, %ymm0, %ymm0188; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0189; AVX2-NEXT: retq190;191; XOP-LABEL: vec256_i32_signed_mem_reg:192; XOP: # %bb.0:193; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1194; XOP-NEXT: vmovdqa (%rdi), %xmm2195; XOP-NEXT: vmovdqa 16(%rdi), %xmm3196; XOP-NEXT: vpminsd %xmm1, %xmm3, %xmm4197; XOP-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1198; XOP-NEXT: vpsubd %xmm4, %xmm1, %xmm1199; XOP-NEXT: vpminsd %xmm0, %xmm2, %xmm4200; XOP-NEXT: vpmaxsd %xmm0, %xmm2, %xmm0201; XOP-NEXT: vpsubd %xmm4, %xmm0, %xmm0202; XOP-NEXT: vpsrld $1, %xmm0, %xmm0203; XOP-NEXT: vpsrld $1, %xmm1, %xmm1204; XOP-NEXT: vpmacsdd %xmm3, %xmm1, %xmm1, %xmm1205; XOP-NEXT: vpmacsdd %xmm2, %xmm0, %xmm0, %xmm0206; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0207; XOP-NEXT: retq208;209; AVX512-LABEL: vec256_i32_signed_mem_reg:210; AVX512: # %bb.0:211; AVX512-NEXT: vmovdqa (%rdi), %ymm1212; AVX512-NEXT: vpminsd %ymm0, %ymm1, %ymm2213; AVX512-NEXT: vpmaxsd %ymm0, %ymm1, %ymm0214; AVX512-NEXT: vpsubd %ymm2, %ymm0, %ymm0215; AVX512-NEXT: vpsrld $1, %ymm0, %ymm0216; AVX512-NEXT: vpmulld %ymm0, %ymm0, %ymm0217; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0218; AVX512-NEXT: retq219 %a1 = load <8 x i32>, ptr %a1_addr220 %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed221 %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>222 %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1223 %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2224 %t7 = sub <8 x i32> %t6, %t5225 %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>226 %t9 = mul nsw <8 x i32> %t8, %t8 ; signed227 %a10 = add nsw <8 x i32> %t9, %a1 ; signed228 ret <8 x i32> %a10229}230 231define <8 x i32> @vec256_i32_signed_reg_mem(<8 x i32> %a1, ptr %a2_addr) nounwind {232; AVX1-LABEL: vec256_i32_signed_reg_mem:233; AVX1: # %bb.0:234; AVX1-NEXT: vmovdqa (%rdi), %ymm1235; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm2236; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm3237; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2238; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3239; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1240; AVX1-NEXT: vpminsd %xmm1, %xmm3, %xmm4241; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1242; AVX1-NEXT: vpsubd %xmm4, %xmm1, %xmm1243; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1244; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2245; AVX1-NEXT: vpmulld %xmm2, %xmm2, %xmm2246; AVX1-NEXT: vpmulld %xmm1, %xmm1, %xmm1247; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1248; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm0249; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0250; AVX1-NEXT: retq251;252; AVX2-LABEL: vec256_i32_signed_reg_mem:253; AVX2: # %bb.0:254; AVX2-NEXT: vmovdqa (%rdi), %ymm1255; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm2256; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm1257; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1258; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1259; AVX2-NEXT: vpmulld %ymm1, %ymm1, %ymm1260; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0261; AVX2-NEXT: retq262;263; XOP-LABEL: vec256_i32_signed_reg_mem:264; XOP: # %bb.0:265; XOP-NEXT: vmovdqa (%rdi), %ymm1266; XOP-NEXT: vextractf128 $1, %ymm0, %xmm2267; XOP-NEXT: vextractf128 $1, %ymm1, %xmm3268; XOP-NEXT: vpminsd %xmm3, %xmm2, %xmm4269; XOP-NEXT: vpmaxsd %xmm3, %xmm2, %xmm3270; XOP-NEXT: vpsubd %xmm4, %xmm3, %xmm3271; XOP-NEXT: vpminsd %xmm1, %xmm0, %xmm4272; XOP-NEXT: vpmaxsd %xmm1, %xmm0, %xmm1273; XOP-NEXT: vpsubd %xmm4, %xmm1, %xmm1274; XOP-NEXT: vpsrld $1, %xmm1, %xmm1275; XOP-NEXT: vpsrld $1, %xmm3, %xmm3276; XOP-NEXT: vpmacsdd %xmm2, %xmm3, %xmm3, %xmm2277; XOP-NEXT: vpmacsdd %xmm0, %xmm1, %xmm1, %xmm0278; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0279; XOP-NEXT: retq280;281; AVX512-LABEL: vec256_i32_signed_reg_mem:282; AVX512: # %bb.0:283; AVX512-NEXT: vmovdqa (%rdi), %ymm1284; AVX512-NEXT: vpminsd %ymm1, %ymm0, %ymm2285; AVX512-NEXT: vpmaxsd %ymm1, %ymm0, %ymm1286; AVX512-NEXT: vpsubd %ymm2, %ymm1, %ymm1287; AVX512-NEXT: vpsrld $1, %ymm1, %ymm1288; AVX512-NEXT: vpmulld %ymm1, %ymm1, %ymm1289; AVX512-NEXT: vpaddd %ymm0, %ymm1, %ymm0290; AVX512-NEXT: retq291 %a2 = load <8 x i32>, ptr %a2_addr292 %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed293 %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>294 %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1295 %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2296 %t7 = sub <8 x i32> %t6, %t5297 %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>298 %t9 = mul nsw <8 x i32> %t8, %t8 ; signed299 %a10 = add nsw <8 x i32> %t9, %a1 ; signed300 ret <8 x i32> %a10301}302 303define <8 x i32> @vec256_i32_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {304; AVX1-LABEL: vec256_i32_signed_mem_mem:305; AVX1: # %bb.0:306; AVX1-NEXT: vmovdqa (%rsi), %ymm0307; AVX1-NEXT: vmovdqa (%rdi), %xmm1308; AVX1-NEXT: vmovdqa 16(%rdi), %xmm2309; AVX1-NEXT: vpminsd %xmm0, %xmm1, %xmm3310; AVX1-NEXT: vpmaxsd %xmm0, %xmm1, %xmm4311; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3312; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0313; AVX1-NEXT: vpminsd %xmm0, %xmm2, %xmm4314; AVX1-NEXT: vpmaxsd %xmm0, %xmm2, %xmm0315; AVX1-NEXT: vpsubd %xmm4, %xmm0, %xmm0316; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0317; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3318; AVX1-NEXT: vpmulld %xmm3, %xmm3, %xmm3319; AVX1-NEXT: vpmulld %xmm0, %xmm0, %xmm0320; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0321; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1322; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0323; AVX1-NEXT: retq324;325; AVX2-LABEL: vec256_i32_signed_mem_mem:326; AVX2: # %bb.0:327; AVX2-NEXT: vmovdqa (%rdi), %ymm0328; AVX2-NEXT: vmovdqa (%rsi), %ymm1329; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm2330; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm1331; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1332; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1333; AVX2-NEXT: vpmulld %ymm1, %ymm1, %ymm1334; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0335; AVX2-NEXT: retq336;337; XOP-LABEL: vec256_i32_signed_mem_mem:338; XOP: # %bb.0:339; XOP-NEXT: vmovdqa (%rsi), %ymm0340; XOP-NEXT: vmovdqa (%rdi), %xmm1341; XOP-NEXT: vmovdqa 16(%rdi), %xmm2342; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3343; XOP-NEXT: vpminsd %xmm3, %xmm2, %xmm4344; XOP-NEXT: vpmaxsd %xmm3, %xmm2, %xmm3345; XOP-NEXT: vpsubd %xmm4, %xmm3, %xmm3346; XOP-NEXT: vpminsd %xmm0, %xmm1, %xmm4347; XOP-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0348; XOP-NEXT: vpsubd %xmm4, %xmm0, %xmm0349; XOP-NEXT: vpsrld $1, %xmm0, %xmm0350; XOP-NEXT: vpsrld $1, %xmm3, %xmm3351; XOP-NEXT: vpmacsdd %xmm2, %xmm3, %xmm3, %xmm2352; XOP-NEXT: vpmacsdd %xmm1, %xmm0, %xmm0, %xmm0353; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0354; XOP-NEXT: retq355;356; AVX512-LABEL: vec256_i32_signed_mem_mem:357; AVX512: # %bb.0:358; AVX512-NEXT: vmovdqa (%rdi), %ymm0359; AVX512-NEXT: vmovdqa (%rsi), %ymm1360; AVX512-NEXT: vpminsd %ymm1, %ymm0, %ymm2361; AVX512-NEXT: vpmaxsd %ymm1, %ymm0, %ymm1362; AVX512-NEXT: vpsubd %ymm2, %ymm1, %ymm1363; AVX512-NEXT: vpsrld $1, %ymm1, %ymm1364; AVX512-NEXT: vpmulld %ymm1, %ymm1, %ymm1365; AVX512-NEXT: vpaddd %ymm0, %ymm1, %ymm0366; AVX512-NEXT: retq367 %a1 = load <8 x i32>, ptr %a1_addr368 %a2 = load <8 x i32>, ptr %a2_addr369 %t3 = icmp sgt <8 x i32> %a1, %a2 ; signed370 %t4 = select <8 x i1> %t3, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>371 %t5 = select <8 x i1> %t3, <8 x i32> %a2, <8 x i32> %a1372 %t6 = select <8 x i1> %t3, <8 x i32> %a1, <8 x i32> %a2373 %t7 = sub <8 x i32> %t6, %t5374 %t8 = lshr <8 x i32> %t7, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>375 %t9 = mul nsw <8 x i32> %t8, %t8 ; signed376 %a10 = add nsw <8 x i32> %t9, %a1 ; signed377 ret <8 x i32> %a10378}379 380; ---------------------------------------------------------------------------- ;381; 64-bit width. 256 / 64 = 4 elts.382; ---------------------------------------------------------------------------- ;383 384; Values come from regs385 386define <4 x i64> @vec256_i64_signed_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {387; AVX1-LABEL: vec256_i64_signed_reg_reg:388; AVX1: # %bb.0:389; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3391; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm4392; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm5393; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1394; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1395; AVX1-NEXT: vpsubq %xmm1, %xmm5, %xmm1396; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2397; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2398; AVX1-NEXT: vpsubq %xmm2, %xmm4, %xmm2399; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm6400; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm7401; AVX1-NEXT: vpsrlq $33, %xmm1, %xmm1402; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]403; AVX1-NEXT: vpor %xmm5, %xmm8, %xmm9404; AVX1-NEXT: vpmuludq %xmm1, %xmm9, %xmm1405; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm5406; AVX1-NEXT: vpmuludq %xmm5, %xmm7, %xmm5407; AVX1-NEXT: vpaddq %xmm1, %xmm5, %xmm1408; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1409; AVX1-NEXT: vpmuludq %xmm7, %xmm9, %xmm5410; AVX1-NEXT: vpsrlq $33, %xmm2, %xmm2411; AVX1-NEXT: vpor %xmm4, %xmm8, %xmm7412; AVX1-NEXT: vpmuludq %xmm7, %xmm2, %xmm2413; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm4414; AVX1-NEXT: vpmuludq %xmm4, %xmm6, %xmm4415; AVX1-NEXT: vpaddq %xmm2, %xmm4, %xmm2416; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2417; AVX1-NEXT: vpmuludq %xmm7, %xmm6, %xmm4418; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3419; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2420; AVX1-NEXT: vpaddq %xmm0, %xmm5, %xmm0421; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0422; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0423; AVX1-NEXT: retq424;425; AVX2-LABEL: vec256_i64_signed_reg_reg:426; AVX2: # %bb.0:427; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2428; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]429; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm3430; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm1431; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1432; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1433; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm4434; AVX2-NEXT: vpsrlq $33, %ymm1, %ymm1435; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1436; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm2437; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm2438; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1439; AVX2-NEXT: vpsllq $32, %ymm1, %ymm1440; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm2441; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0442; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0443; AVX2-NEXT: retq444;445; XOP-LABEL: vec256_i64_signed_reg_reg:446; XOP: # %bb.0:447; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2448; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3449; XOP-NEXT: vpcomgtq %xmm2, %xmm3, %xmm4450; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm5451; XOP-NEXT: vpsubq %xmm1, %xmm0, %xmm1452; XOP-NEXT: vpxor %xmm5, %xmm1, %xmm1453; XOP-NEXT: vpsubq %xmm1, %xmm5, %xmm1454; XOP-NEXT: vpsubq %xmm2, %xmm3, %xmm2455; XOP-NEXT: vpxor %xmm4, %xmm2, %xmm2456; XOP-NEXT: vpsubq %xmm2, %xmm4, %xmm2457; XOP-NEXT: vpsrlq $1, %xmm2, %xmm6458; XOP-NEXT: vpsrlq $1, %xmm1, %xmm7459; XOP-NEXT: vpsrlq $33, %xmm1, %xmm1460; XOP-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]461; XOP-NEXT: vpor %xmm5, %xmm8, %xmm9462; XOP-NEXT: vpmuludq %xmm1, %xmm9, %xmm1463; XOP-NEXT: vpsrlq $32, %xmm5, %xmm5464; XOP-NEXT: vpmuludq %xmm5, %xmm7, %xmm5465; XOP-NEXT: vpaddq %xmm1, %xmm5, %xmm1466; XOP-NEXT: vpsllq $32, %xmm1, %xmm1467; XOP-NEXT: vpmuludq %xmm7, %xmm9, %xmm5468; XOP-NEXT: vpsrlq $33, %xmm2, %xmm2469; XOP-NEXT: vpor %xmm4, %xmm8, %xmm7470; XOP-NEXT: vpmuludq %xmm7, %xmm2, %xmm2471; XOP-NEXT: vpsrlq $32, %xmm4, %xmm4472; XOP-NEXT: vpmuludq %xmm4, %xmm6, %xmm4473; XOP-NEXT: vpaddq %xmm2, %xmm4, %xmm2474; XOP-NEXT: vpsllq $32, %xmm2, %xmm2475; XOP-NEXT: vpmuludq %xmm7, %xmm6, %xmm4476; XOP-NEXT: vpaddq %xmm3, %xmm4, %xmm3477; XOP-NEXT: vpaddq %xmm2, %xmm3, %xmm2478; XOP-NEXT: vpaddq %xmm0, %xmm5, %xmm0479; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0480; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0481; XOP-NEXT: retq482;483; AVX512F-LABEL: vec256_i64_signed_reg_reg:484; AVX512F: # %bb.0:485; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1486; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0487; AVX512F-NEXT: vpcmpgtq %zmm1, %zmm0, %k1488; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2489; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]490; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}491; AVX512F-NEXT: vpminsq %zmm1, %zmm0, %zmm2492; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm1493; AVX512F-NEXT: vpsubq %ymm2, %ymm1, %ymm1494; AVX512F-NEXT: vpsrlq $1, %ymm1, %ymm2495; AVX512F-NEXT: vpsrlq $33, %ymm1, %ymm1496; AVX512F-NEXT: vpmuludq %ymm3, %ymm1, %ymm1497; AVX512F-NEXT: vpsrlq $32, %ymm3, %ymm4498; AVX512F-NEXT: vpmuludq %ymm4, %ymm2, %ymm4499; AVX512F-NEXT: vpaddq %ymm1, %ymm4, %ymm1500; AVX512F-NEXT: vpsllq $32, %ymm1, %ymm1501; AVX512F-NEXT: vpmuludq %ymm3, %ymm2, %ymm2502; AVX512F-NEXT: vpaddq %ymm0, %ymm2, %ymm0503; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm0504; AVX512F-NEXT: retq505;506; AVX512VL-LABEL: vec256_i64_signed_reg_reg:507; AVX512VL: # %bb.0:508; AVX512VL-NEXT: vpcmpgtq %ymm1, %ymm0, %k1509; AVX512VL-NEXT: vpminsq %ymm1, %ymm0, %ymm2510; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm1511; AVX512VL-NEXT: vpsubq %ymm2, %ymm1, %ymm1512; AVX512VL-NEXT: vpsrlq $1, %ymm1, %ymm1513; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2514; AVX512VL-NEXT: vpsubq %ymm1, %ymm2, %ymm1 {%k1}515; AVX512VL-NEXT: vpaddq %ymm0, %ymm1, %ymm0516; AVX512VL-NEXT: retq517;518; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_reg:519; AVX512BW-FALLBACK: # %bb.0:520; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1521; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0522; AVX512BW-FALLBACK-NEXT: vpcmpgtq %zmm1, %zmm0, %k1523; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2524; AVX512BW-FALLBACK-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]525; AVX512BW-FALLBACK-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}526; AVX512BW-FALLBACK-NEXT: vpminsq %zmm1, %zmm0, %zmm2527; AVX512BW-FALLBACK-NEXT: vpmaxsq %zmm1, %zmm0, %zmm1528; AVX512BW-FALLBACK-NEXT: vpsubq %ymm2, %ymm1, %ymm1529; AVX512BW-FALLBACK-NEXT: vpsrlq $1, %ymm1, %ymm2530; AVX512BW-FALLBACK-NEXT: vpsrlq $33, %ymm1, %ymm1531; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm1, %ymm1532; AVX512BW-FALLBACK-NEXT: vpsrlq $32, %ymm3, %ymm4533; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm4, %ymm2, %ymm4534; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm4, %ymm1535; AVX512BW-FALLBACK-NEXT: vpsllq $32, %ymm1, %ymm1536; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm2, %ymm2537; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm2, %ymm0538; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm0, %ymm0539; AVX512BW-FALLBACK-NEXT: retq540 %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed541 %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>542 %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1543 %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2544 %t7 = sub <4 x i64> %t6, %t5545 %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>546 %t9 = mul nsw <4 x i64> %t8, %t4 ; signed547 %a10 = add nsw <4 x i64> %t9, %a1 ; signed548 ret <4 x i64> %a10549}550 551define <4 x i64> @vec256_i64_unsigned_reg_reg(<4 x i64> %a1, <4 x i64> %a2) nounwind {552; AVX1-LABEL: vec256_i64_unsigned_reg_reg:553; AVX1: # %bb.0:554; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3555; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]556; AVX1-NEXT: # xmm4 = mem[0,0]557; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm5558; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2559; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6560; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5561; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm6562; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm4563; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm4564; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1565; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1566; AVX1-NEXT: vpsubq %xmm1, %xmm4, %xmm1567; AVX1-NEXT: vpsubq %xmm3, %xmm2, %xmm3568; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3569; AVX1-NEXT: vpsubq %xmm3, %xmm5, %xmm3570; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm6571; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm7572; AVX1-NEXT: vpsrlq $33, %xmm1, %xmm1573; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]574; AVX1-NEXT: vpor %xmm4, %xmm8, %xmm9575; AVX1-NEXT: vpmuludq %xmm1, %xmm9, %xmm1576; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm4577; AVX1-NEXT: vpmuludq %xmm4, %xmm7, %xmm4578; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1579; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1580; AVX1-NEXT: vpmuludq %xmm7, %xmm9, %xmm4581; AVX1-NEXT: vpsrlq $33, %xmm3, %xmm3582; AVX1-NEXT: vpor %xmm5, %xmm8, %xmm7583; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm3584; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm5585; AVX1-NEXT: vpmuludq %xmm5, %xmm6, %xmm5586; AVX1-NEXT: vpaddq %xmm3, %xmm5, %xmm3587; AVX1-NEXT: vpsllq $32, %xmm3, %xmm3588; AVX1-NEXT: vpmuludq %xmm7, %xmm6, %xmm5589; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm2590; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2591; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0592; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0593; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0594; AVX1-NEXT: retq595;596; AVX2-LABEL: vec256_i64_unsigned_reg_reg:597; AVX2: # %bb.0:598; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]599; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3600; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2601; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2602; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]603; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm3604; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm1605; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1606; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1607; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm4608; AVX2-NEXT: vpsrlq $33, %ymm1, %ymm1609; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1610; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm2611; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm2612; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1613; AVX2-NEXT: vpsllq $32, %ymm1, %ymm1614; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm2615; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0616; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0617; AVX2-NEXT: retq618;619; XOP-LABEL: vec256_i64_unsigned_reg_reg:620; XOP: # %bb.0:621; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2622; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3623; XOP-NEXT: vpcomgtuq %xmm2, %xmm3, %xmm4624; XOP-NEXT: vpcomgtuq %xmm1, %xmm0, %xmm5625; XOP-NEXT: vpsubq %xmm1, %xmm0, %xmm1626; XOP-NEXT: vpxor %xmm5, %xmm1, %xmm1627; XOP-NEXT: vpsubq %xmm1, %xmm5, %xmm1628; XOP-NEXT: vpsubq %xmm2, %xmm3, %xmm2629; XOP-NEXT: vpxor %xmm4, %xmm2, %xmm2630; XOP-NEXT: vpsubq %xmm2, %xmm4, %xmm2631; XOP-NEXT: vpsrlq $1, %xmm2, %xmm6632; XOP-NEXT: vpsrlq $1, %xmm1, %xmm7633; XOP-NEXT: vpsrlq $33, %xmm1, %xmm1634; XOP-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]635; XOP-NEXT: vpor %xmm5, %xmm8, %xmm9636; XOP-NEXT: vpmuludq %xmm1, %xmm9, %xmm1637; XOP-NEXT: vpsrlq $32, %xmm5, %xmm5638; XOP-NEXT: vpmuludq %xmm5, %xmm7, %xmm5639; XOP-NEXT: vpaddq %xmm1, %xmm5, %xmm1640; XOP-NEXT: vpsllq $32, %xmm1, %xmm1641; XOP-NEXT: vpmuludq %xmm7, %xmm9, %xmm5642; XOP-NEXT: vpsrlq $33, %xmm2, %xmm2643; XOP-NEXT: vpor %xmm4, %xmm8, %xmm7644; XOP-NEXT: vpmuludq %xmm7, %xmm2, %xmm2645; XOP-NEXT: vpsrlq $32, %xmm4, %xmm4646; XOP-NEXT: vpmuludq %xmm4, %xmm6, %xmm4647; XOP-NEXT: vpaddq %xmm2, %xmm4, %xmm2648; XOP-NEXT: vpsllq $32, %xmm2, %xmm2649; XOP-NEXT: vpmuludq %xmm7, %xmm6, %xmm4650; XOP-NEXT: vpaddq %xmm3, %xmm4, %xmm3651; XOP-NEXT: vpaddq %xmm2, %xmm3, %xmm2652; XOP-NEXT: vpaddq %xmm0, %xmm5, %xmm0653; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0654; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0655; XOP-NEXT: retq656;657; AVX512F-LABEL: vec256_i64_unsigned_reg_reg:658; AVX512F: # %bb.0:659; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1660; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0661; AVX512F-NEXT: vpcmpnleuq %zmm1, %zmm0, %k1662; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2663; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]664; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}665; AVX512F-NEXT: vpminuq %zmm1, %zmm0, %zmm2666; AVX512F-NEXT: vpmaxuq %zmm1, %zmm0, %zmm1667; AVX512F-NEXT: vpsubq %ymm2, %ymm1, %ymm1668; AVX512F-NEXT: vpsrlq $1, %ymm1, %ymm2669; AVX512F-NEXT: vpsrlq $33, %ymm1, %ymm1670; AVX512F-NEXT: vpmuludq %ymm3, %ymm1, %ymm1671; AVX512F-NEXT: vpsrlq $32, %ymm3, %ymm4672; AVX512F-NEXT: vpmuludq %ymm4, %ymm2, %ymm4673; AVX512F-NEXT: vpaddq %ymm1, %ymm4, %ymm1674; AVX512F-NEXT: vpsllq $32, %ymm1, %ymm1675; AVX512F-NEXT: vpmuludq %ymm3, %ymm2, %ymm2676; AVX512F-NEXT: vpaddq %ymm0, %ymm2, %ymm0677; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm0678; AVX512F-NEXT: retq679;680; AVX512VL-LABEL: vec256_i64_unsigned_reg_reg:681; AVX512VL: # %bb.0:682; AVX512VL-NEXT: vpcmpnleuq %ymm1, %ymm0, %k1683; AVX512VL-NEXT: vpminuq %ymm1, %ymm0, %ymm2684; AVX512VL-NEXT: vpmaxuq %ymm1, %ymm0, %ymm1685; AVX512VL-NEXT: vpsubq %ymm2, %ymm1, %ymm1686; AVX512VL-NEXT: vpsrlq $1, %ymm1, %ymm1687; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2688; AVX512VL-NEXT: vpsubq %ymm1, %ymm2, %ymm1 {%k1}689; AVX512VL-NEXT: vpaddq %ymm0, %ymm1, %ymm0690; AVX512VL-NEXT: retq691;692; AVX512BW-FALLBACK-LABEL: vec256_i64_unsigned_reg_reg:693; AVX512BW-FALLBACK: # %bb.0:694; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1695; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0696; AVX512BW-FALLBACK-NEXT: vpcmpnleuq %zmm1, %zmm0, %k1697; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2698; AVX512BW-FALLBACK-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]699; AVX512BW-FALLBACK-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}700; AVX512BW-FALLBACK-NEXT: vpminuq %zmm1, %zmm0, %zmm2701; AVX512BW-FALLBACK-NEXT: vpmaxuq %zmm1, %zmm0, %zmm1702; AVX512BW-FALLBACK-NEXT: vpsubq %ymm2, %ymm1, %ymm1703; AVX512BW-FALLBACK-NEXT: vpsrlq $1, %ymm1, %ymm2704; AVX512BW-FALLBACK-NEXT: vpsrlq $33, %ymm1, %ymm1705; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm1, %ymm1706; AVX512BW-FALLBACK-NEXT: vpsrlq $32, %ymm3, %ymm4707; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm4, %ymm2, %ymm4708; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm4, %ymm1709; AVX512BW-FALLBACK-NEXT: vpsllq $32, %ymm1, %ymm1710; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm2, %ymm2711; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm2, %ymm0712; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm0, %ymm0713; AVX512BW-FALLBACK-NEXT: retq714 %t3 = icmp ugt <4 x i64> %a1, %a2715 %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>716 %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1717 %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2718 %t7 = sub <4 x i64> %t6, %t5719 %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>720 %t9 = mul <4 x i64> %t8, %t4721 %a10 = add <4 x i64> %t9, %a1722 ret <4 x i64> %a10723}724 725; Values are loaded. Only check signed case.726 727define <4 x i64> @vec256_i64_signed_mem_reg(ptr %a1_addr, <4 x i64> %a2) nounwind {728; AVX1-LABEL: vec256_i64_signed_mem_reg:729; AVX1: # %bb.0:730; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1731; AVX1-NEXT: vmovdqa (%rdi), %xmm2732; AVX1-NEXT: vmovdqa 16(%rdi), %xmm3733; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm4734; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm5735; AVX1-NEXT: vpsubq %xmm0, %xmm2, %xmm0736; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0737; AVX1-NEXT: vpsubq %xmm0, %xmm5, %xmm0738; AVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1739; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1740; AVX1-NEXT: vpsubq %xmm1, %xmm4, %xmm1741; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm6742; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm7743; AVX1-NEXT: vpsrlq $33, %xmm0, %xmm0744; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]745; AVX1-NEXT: vpor %xmm5, %xmm8, %xmm9746; AVX1-NEXT: vpmuludq %xmm0, %xmm9, %xmm0747; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm5748; AVX1-NEXT: vpmuludq %xmm5, %xmm7, %xmm5749; AVX1-NEXT: vpaddq %xmm0, %xmm5, %xmm0750; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0751; AVX1-NEXT: vpmuludq %xmm7, %xmm9, %xmm5752; AVX1-NEXT: vpsrlq $33, %xmm1, %xmm1753; AVX1-NEXT: vpor %xmm4, %xmm8, %xmm7754; AVX1-NEXT: vpmuludq %xmm7, %xmm1, %xmm1755; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm4756; AVX1-NEXT: vpmuludq %xmm4, %xmm6, %xmm4757; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1758; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1759; AVX1-NEXT: vpmuludq %xmm7, %xmm6, %xmm4760; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3761; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm1762; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm2763; AVX1-NEXT: vpaddq %xmm0, %xmm2, %xmm0764; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0765; AVX1-NEXT: retq766;767; AVX2-LABEL: vec256_i64_signed_mem_reg:768; AVX2: # %bb.0:769; AVX2-NEXT: vmovdqa (%rdi), %ymm1770; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2771; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]772; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm3773; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm0774; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0775; AVX2-NEXT: vpsubq %ymm0, %ymm2, %ymm0776; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm4777; AVX2-NEXT: vpsrlq $33, %ymm0, %ymm0778; AVX2-NEXT: vpmuludq %ymm3, %ymm0, %ymm0779; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm2780; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm2781; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0782; AVX2-NEXT: vpsllq $32, %ymm0, %ymm0783; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm2784; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1785; AVX2-NEXT: vpaddq %ymm0, %ymm1, %ymm0786; AVX2-NEXT: retq787;788; XOP-LABEL: vec256_i64_signed_mem_reg:789; XOP: # %bb.0:790; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1791; XOP-NEXT: vmovdqa (%rdi), %xmm2792; XOP-NEXT: vmovdqa 16(%rdi), %xmm3793; XOP-NEXT: vpcomgtq %xmm1, %xmm3, %xmm4794; XOP-NEXT: vpcomgtq %xmm0, %xmm2, %xmm5795; XOP-NEXT: vpsubq %xmm0, %xmm2, %xmm0796; XOP-NEXT: vpxor %xmm5, %xmm0, %xmm0797; XOP-NEXT: vpsubq %xmm0, %xmm5, %xmm0798; XOP-NEXT: vpsubq %xmm1, %xmm3, %xmm1799; XOP-NEXT: vpxor %xmm4, %xmm1, %xmm1800; XOP-NEXT: vpsubq %xmm1, %xmm4, %xmm1801; XOP-NEXT: vpsrlq $1, %xmm1, %xmm6802; XOP-NEXT: vpsrlq $1, %xmm0, %xmm7803; XOP-NEXT: vpsrlq $33, %xmm0, %xmm0804; XOP-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]805; XOP-NEXT: vpor %xmm5, %xmm8, %xmm9806; XOP-NEXT: vpmuludq %xmm0, %xmm9, %xmm0807; XOP-NEXT: vpsrlq $32, %xmm5, %xmm5808; XOP-NEXT: vpmuludq %xmm5, %xmm7, %xmm5809; XOP-NEXT: vpaddq %xmm0, %xmm5, %xmm0810; XOP-NEXT: vpsllq $32, %xmm0, %xmm0811; XOP-NEXT: vpmuludq %xmm7, %xmm9, %xmm5812; XOP-NEXT: vpsrlq $33, %xmm1, %xmm1813; XOP-NEXT: vpor %xmm4, %xmm8, %xmm7814; XOP-NEXT: vpmuludq %xmm7, %xmm1, %xmm1815; XOP-NEXT: vpsrlq $32, %xmm4, %xmm4816; XOP-NEXT: vpmuludq %xmm4, %xmm6, %xmm4817; XOP-NEXT: vpaddq %xmm1, %xmm4, %xmm1818; XOP-NEXT: vpsllq $32, %xmm1, %xmm1819; XOP-NEXT: vpmuludq %xmm7, %xmm6, %xmm4820; XOP-NEXT: vpaddq %xmm3, %xmm4, %xmm3821; XOP-NEXT: vpaddq %xmm1, %xmm3, %xmm1822; XOP-NEXT: vpaddq %xmm2, %xmm5, %xmm2823; XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0824; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0825; XOP-NEXT: retq826;827; AVX512F-LABEL: vec256_i64_signed_mem_reg:828; AVX512F: # %bb.0:829; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0830; AVX512F-NEXT: vmovdqa (%rdi), %ymm1831; AVX512F-NEXT: vpcmpgtq %zmm0, %zmm1, %k1832; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2833; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]834; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}835; AVX512F-NEXT: vpminsq %zmm0, %zmm1, %zmm2836; AVX512F-NEXT: vpmaxsq %zmm0, %zmm1, %zmm0837; AVX512F-NEXT: vpsubq %ymm2, %ymm0, %ymm0838; AVX512F-NEXT: vpsrlq $1, %ymm0, %ymm2839; AVX512F-NEXT: vpsrlq $33, %ymm0, %ymm0840; AVX512F-NEXT: vpmuludq %ymm3, %ymm0, %ymm0841; AVX512F-NEXT: vpsrlq $32, %ymm3, %ymm4842; AVX512F-NEXT: vpmuludq %ymm4, %ymm2, %ymm4843; AVX512F-NEXT: vpaddq %ymm0, %ymm4, %ymm0844; AVX512F-NEXT: vpsllq $32, %ymm0, %ymm0845; AVX512F-NEXT: vpmuludq %ymm3, %ymm2, %ymm2846; AVX512F-NEXT: vpaddq %ymm1, %ymm2, %ymm1847; AVX512F-NEXT: vpaddq %ymm0, %ymm1, %ymm0848; AVX512F-NEXT: retq849;850; AVX512VL-LABEL: vec256_i64_signed_mem_reg:851; AVX512VL: # %bb.0:852; AVX512VL-NEXT: vmovdqa (%rdi), %ymm1853; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm1, %k1854; AVX512VL-NEXT: vpminsq %ymm0, %ymm1, %ymm2855; AVX512VL-NEXT: vpmaxsq %ymm0, %ymm1, %ymm0856; AVX512VL-NEXT: vpsubq %ymm2, %ymm0, %ymm0857; AVX512VL-NEXT: vpsrlq $1, %ymm0, %ymm0858; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2859; AVX512VL-NEXT: vpsubq %ymm0, %ymm2, %ymm0 {%k1}860; AVX512VL-NEXT: vpaddq %ymm1, %ymm0, %ymm0861; AVX512VL-NEXT: retq862;863; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_reg:864; AVX512BW-FALLBACK: # %bb.0:865; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0866; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm1867; AVX512BW-FALLBACK-NEXT: vpcmpgtq %zmm0, %zmm1, %k1868; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2869; AVX512BW-FALLBACK-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]870; AVX512BW-FALLBACK-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}871; AVX512BW-FALLBACK-NEXT: vpminsq %zmm0, %zmm1, %zmm2872; AVX512BW-FALLBACK-NEXT: vpmaxsq %zmm0, %zmm1, %zmm0873; AVX512BW-FALLBACK-NEXT: vpsubq %ymm2, %ymm0, %ymm0874; AVX512BW-FALLBACK-NEXT: vpsrlq $1, %ymm0, %ymm2875; AVX512BW-FALLBACK-NEXT: vpsrlq $33, %ymm0, %ymm0876; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm0, %ymm0877; AVX512BW-FALLBACK-NEXT: vpsrlq $32, %ymm3, %ymm4878; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm4, %ymm2, %ymm4879; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm4, %ymm0880; AVX512BW-FALLBACK-NEXT: vpsllq $32, %ymm0, %ymm0881; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm2, %ymm2882; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm2, %ymm1883; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm1, %ymm0884; AVX512BW-FALLBACK-NEXT: retq885 %a1 = load <4 x i64>, ptr %a1_addr886 %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed887 %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>888 %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a1889 %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a2890 %t7 = sub <4 x i64> %t6, %t5891 %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>892 %t9 = mul nsw <4 x i64> %t8, %t4 ; signed893 %a10 = add nsw <4 x i64> %t9, %a1 ; signed894 ret <4 x i64> %a10895}896 897define <4 x i64> @vec256_i64_signed_reg_mem(<4 x i64> %a1, ptr %a2_addr) nounwind {898; AVX1-LABEL: vec256_i64_signed_reg_mem:899; AVX1: # %bb.0:900; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1901; AVX1-NEXT: vmovdqa (%rdi), %xmm2902; AVX1-NEXT: vmovdqa 16(%rdi), %xmm3903; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm4904; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm5905; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm2906; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2907; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2908; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm3909; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3910; AVX1-NEXT: vpsubq %xmm3, %xmm4, %xmm3911; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm6912; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm7913; AVX1-NEXT: vpsrlq $33, %xmm2, %xmm2914; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]915; AVX1-NEXT: vpor %xmm5, %xmm8, %xmm9916; AVX1-NEXT: vpmuludq %xmm2, %xmm9, %xmm2917; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm5918; AVX1-NEXT: vpmuludq %xmm5, %xmm7, %xmm5919; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm2920; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2921; AVX1-NEXT: vpmuludq %xmm7, %xmm9, %xmm5922; AVX1-NEXT: vpsrlq $33, %xmm3, %xmm3923; AVX1-NEXT: vpor %xmm4, %xmm8, %xmm7924; AVX1-NEXT: vpmuludq %xmm7, %xmm3, %xmm3925; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm4926; AVX1-NEXT: vpmuludq %xmm4, %xmm6, %xmm4927; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3928; AVX1-NEXT: vpsllq $32, %xmm3, %xmm3929; AVX1-NEXT: vpmuludq %xmm7, %xmm6, %xmm4930; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1931; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1932; AVX1-NEXT: vpaddq %xmm0, %xmm5, %xmm0933; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0934; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0935; AVX1-NEXT: retq936;937; AVX2-LABEL: vec256_i64_signed_reg_mem:938; AVX2: # %bb.0:939; AVX2-NEXT: vmovdqa (%rdi), %ymm1940; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2941; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]942; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm3943; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm1944; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1945; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1946; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm4947; AVX2-NEXT: vpsrlq $33, %ymm1, %ymm1948; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1949; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm2950; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm2951; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1952; AVX2-NEXT: vpsllq $32, %ymm1, %ymm1953; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm2954; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0955; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0956; AVX2-NEXT: retq957;958; XOP-LABEL: vec256_i64_signed_reg_mem:959; XOP: # %bb.0:960; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1961; XOP-NEXT: vmovdqa (%rdi), %xmm2962; XOP-NEXT: vmovdqa 16(%rdi), %xmm3963; XOP-NEXT: vpcomgtq %xmm3, %xmm1, %xmm4964; XOP-NEXT: vpcomgtq %xmm2, %xmm0, %xmm5965; XOP-NEXT: vpsubq %xmm2, %xmm0, %xmm2966; XOP-NEXT: vpxor %xmm5, %xmm2, %xmm2967; XOP-NEXT: vpsubq %xmm2, %xmm5, %xmm2968; XOP-NEXT: vpsubq %xmm3, %xmm1, %xmm3969; XOP-NEXT: vpxor %xmm4, %xmm3, %xmm3970; XOP-NEXT: vpsubq %xmm3, %xmm4, %xmm3971; XOP-NEXT: vpsrlq $1, %xmm3, %xmm6972; XOP-NEXT: vpsrlq $1, %xmm2, %xmm7973; XOP-NEXT: vpsrlq $33, %xmm2, %xmm2974; XOP-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]975; XOP-NEXT: vpor %xmm5, %xmm8, %xmm9976; XOP-NEXT: vpmuludq %xmm2, %xmm9, %xmm2977; XOP-NEXT: vpsrlq $32, %xmm5, %xmm5978; XOP-NEXT: vpmuludq %xmm5, %xmm7, %xmm5979; XOP-NEXT: vpaddq %xmm2, %xmm5, %xmm2980; XOP-NEXT: vpsllq $32, %xmm2, %xmm2981; XOP-NEXT: vpmuludq %xmm7, %xmm9, %xmm5982; XOP-NEXT: vpsrlq $33, %xmm3, %xmm3983; XOP-NEXT: vpor %xmm4, %xmm8, %xmm7984; XOP-NEXT: vpmuludq %xmm7, %xmm3, %xmm3985; XOP-NEXT: vpsrlq $32, %xmm4, %xmm4986; XOP-NEXT: vpmuludq %xmm4, %xmm6, %xmm4987; XOP-NEXT: vpaddq %xmm3, %xmm4, %xmm3988; XOP-NEXT: vpsllq $32, %xmm3, %xmm3989; XOP-NEXT: vpmuludq %xmm7, %xmm6, %xmm4990; XOP-NEXT: vpaddq %xmm1, %xmm4, %xmm1991; XOP-NEXT: vpaddq %xmm3, %xmm1, %xmm1992; XOP-NEXT: vpaddq %xmm0, %xmm5, %xmm0993; XOP-NEXT: vpaddq %xmm2, %xmm0, %xmm0994; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0995; XOP-NEXT: retq996;997; AVX512F-LABEL: vec256_i64_signed_reg_mem:998; AVX512F: # %bb.0:999; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01000; AVX512F-NEXT: vmovdqa (%rdi), %ymm11001; AVX512F-NEXT: vpcmpgtq %zmm1, %zmm0, %k11002; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21003; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]1004; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}1005; AVX512F-NEXT: vpminsq %zmm1, %zmm0, %zmm21006; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm11007; AVX512F-NEXT: vpsubq %ymm2, %ymm1, %ymm11008; AVX512F-NEXT: vpsrlq $1, %ymm1, %ymm21009; AVX512F-NEXT: vpsrlq $33, %ymm1, %ymm11010; AVX512F-NEXT: vpmuludq %ymm3, %ymm1, %ymm11011; AVX512F-NEXT: vpsrlq $32, %ymm3, %ymm41012; AVX512F-NEXT: vpmuludq %ymm4, %ymm2, %ymm41013; AVX512F-NEXT: vpaddq %ymm1, %ymm4, %ymm11014; AVX512F-NEXT: vpsllq $32, %ymm1, %ymm11015; AVX512F-NEXT: vpmuludq %ymm3, %ymm2, %ymm21016; AVX512F-NEXT: vpaddq %ymm0, %ymm2, %ymm01017; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm01018; AVX512F-NEXT: retq1019;1020; AVX512VL-LABEL: vec256_i64_signed_reg_mem:1021; AVX512VL: # %bb.0:1022; AVX512VL-NEXT: vmovdqa (%rdi), %ymm11023; AVX512VL-NEXT: vpcmpgtq %ymm1, %ymm0, %k11024; AVX512VL-NEXT: vpminsq %ymm1, %ymm0, %ymm21025; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm11026; AVX512VL-NEXT: vpsubq %ymm2, %ymm1, %ymm11027; AVX512VL-NEXT: vpsrlq $1, %ymm1, %ymm11028; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm21029; AVX512VL-NEXT: vpsubq %ymm1, %ymm2, %ymm1 {%k1}1030; AVX512VL-NEXT: vpaddq %ymm0, %ymm1, %ymm01031; AVX512VL-NEXT: retq1032;1033; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_reg_mem:1034; AVX512BW-FALLBACK: # %bb.0:1035; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01036; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm11037; AVX512BW-FALLBACK-NEXT: vpcmpgtq %zmm1, %zmm0, %k11038; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21039; AVX512BW-FALLBACK-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]1040; AVX512BW-FALLBACK-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}1041; AVX512BW-FALLBACK-NEXT: vpminsq %zmm1, %zmm0, %zmm21042; AVX512BW-FALLBACK-NEXT: vpmaxsq %zmm1, %zmm0, %zmm11043; AVX512BW-FALLBACK-NEXT: vpsubq %ymm2, %ymm1, %ymm11044; AVX512BW-FALLBACK-NEXT: vpsrlq $1, %ymm1, %ymm21045; AVX512BW-FALLBACK-NEXT: vpsrlq $33, %ymm1, %ymm11046; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm1, %ymm11047; AVX512BW-FALLBACK-NEXT: vpsrlq $32, %ymm3, %ymm41048; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm4, %ymm2, %ymm41049; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm4, %ymm11050; AVX512BW-FALLBACK-NEXT: vpsllq $32, %ymm1, %ymm11051; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm2, %ymm21052; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm2, %ymm01053; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm0, %ymm01054; AVX512BW-FALLBACK-NEXT: retq1055 %a2 = load <4 x i64>, ptr %a2_addr1056 %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed1057 %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>1058 %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a11059 %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a21060 %t7 = sub <4 x i64> %t6, %t51061 %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>1062 %t9 = mul nsw <4 x i64> %t8, %t4 ; signed1063 %a10 = add nsw <4 x i64> %t9, %a1 ; signed1064 ret <4 x i64> %a101065}1066 1067define <4 x i64> @vec256_i64_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {1068; AVX1-LABEL: vec256_i64_signed_mem_mem:1069; AVX1: # %bb.0:1070; AVX1-NEXT: vmovdqa (%rsi), %xmm01071; AVX1-NEXT: vmovdqa 16(%rsi), %xmm11072; AVX1-NEXT: vmovdqa (%rdi), %xmm21073; AVX1-NEXT: vmovdqa 16(%rdi), %xmm31074; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm41075; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm51076; AVX1-NEXT: vpsubq %xmm0, %xmm2, %xmm01077; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm01078; AVX1-NEXT: vpsubq %xmm0, %xmm5, %xmm01079; AVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm11080; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm11081; AVX1-NEXT: vpsubq %xmm1, %xmm4, %xmm11082; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm61083; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm71084; AVX1-NEXT: vpsrlq $33, %xmm0, %xmm01085; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]1086; AVX1-NEXT: vpor %xmm5, %xmm8, %xmm91087; AVX1-NEXT: vpmuludq %xmm0, %xmm9, %xmm01088; AVX1-NEXT: vpsrlq $32, %xmm5, %xmm51089; AVX1-NEXT: vpmuludq %xmm5, %xmm7, %xmm51090; AVX1-NEXT: vpaddq %xmm0, %xmm5, %xmm01091; AVX1-NEXT: vpsllq $32, %xmm0, %xmm01092; AVX1-NEXT: vpmuludq %xmm7, %xmm9, %xmm51093; AVX1-NEXT: vpsrlq $33, %xmm1, %xmm11094; AVX1-NEXT: vpor %xmm4, %xmm8, %xmm71095; AVX1-NEXT: vpmuludq %xmm7, %xmm1, %xmm11096; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm41097; AVX1-NEXT: vpmuludq %xmm4, %xmm6, %xmm41098; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm11099; AVX1-NEXT: vpsllq $32, %xmm1, %xmm11100; AVX1-NEXT: vpmuludq %xmm7, %xmm6, %xmm41101; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm31102; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm11103; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm21104; AVX1-NEXT: vpaddq %xmm0, %xmm2, %xmm01105; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01106; AVX1-NEXT: retq1107;1108; AVX2-LABEL: vec256_i64_signed_mem_mem:1109; AVX2: # %bb.0:1110; AVX2-NEXT: vmovdqa (%rdi), %ymm01111; AVX2-NEXT: vmovdqa (%rsi), %ymm11112; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm21113; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]1114; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm31115; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm11116; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm11117; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm11118; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm41119; AVX2-NEXT: vpsrlq $33, %ymm1, %ymm11120; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm11121; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm21122; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm21123; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm11124; AVX2-NEXT: vpsllq $32, %ymm1, %ymm11125; AVX2-NEXT: vpmuludq %ymm3, %ymm4, %ymm21126; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm01127; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm01128; AVX2-NEXT: retq1129;1130; XOP-LABEL: vec256_i64_signed_mem_mem:1131; XOP: # %bb.0:1132; XOP-NEXT: vmovdqa (%rsi), %xmm01133; XOP-NEXT: vmovdqa 16(%rsi), %xmm11134; XOP-NEXT: vmovdqa (%rdi), %xmm21135; XOP-NEXT: vmovdqa 16(%rdi), %xmm31136; XOP-NEXT: vpcomgtq %xmm1, %xmm3, %xmm41137; XOP-NEXT: vpcomgtq %xmm0, %xmm2, %xmm51138; XOP-NEXT: vpsubq %xmm0, %xmm2, %xmm01139; XOP-NEXT: vpxor %xmm5, %xmm0, %xmm01140; XOP-NEXT: vpsubq %xmm0, %xmm5, %xmm01141; XOP-NEXT: vpsubq %xmm1, %xmm3, %xmm11142; XOP-NEXT: vpxor %xmm4, %xmm1, %xmm11143; XOP-NEXT: vpsubq %xmm1, %xmm4, %xmm11144; XOP-NEXT: vpsrlq $1, %xmm1, %xmm61145; XOP-NEXT: vpsrlq $1, %xmm0, %xmm71146; XOP-NEXT: vpsrlq $33, %xmm0, %xmm01147; XOP-NEXT: vpmovsxbq {{.*#+}} xmm8 = [1,1]1148; XOP-NEXT: vpor %xmm5, %xmm8, %xmm91149; XOP-NEXT: vpmuludq %xmm0, %xmm9, %xmm01150; XOP-NEXT: vpsrlq $32, %xmm5, %xmm51151; XOP-NEXT: vpmuludq %xmm5, %xmm7, %xmm51152; XOP-NEXT: vpaddq %xmm0, %xmm5, %xmm01153; XOP-NEXT: vpsllq $32, %xmm0, %xmm01154; XOP-NEXT: vpmuludq %xmm7, %xmm9, %xmm51155; XOP-NEXT: vpsrlq $33, %xmm1, %xmm11156; XOP-NEXT: vpor %xmm4, %xmm8, %xmm71157; XOP-NEXT: vpmuludq %xmm7, %xmm1, %xmm11158; XOP-NEXT: vpsrlq $32, %xmm4, %xmm41159; XOP-NEXT: vpmuludq %xmm4, %xmm6, %xmm41160; XOP-NEXT: vpaddq %xmm1, %xmm4, %xmm11161; XOP-NEXT: vpsllq $32, %xmm1, %xmm11162; XOP-NEXT: vpmuludq %xmm7, %xmm6, %xmm41163; XOP-NEXT: vpaddq %xmm3, %xmm4, %xmm31164; XOP-NEXT: vpaddq %xmm1, %xmm3, %xmm11165; XOP-NEXT: vpaddq %xmm2, %xmm5, %xmm21166; XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm01167; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01168; XOP-NEXT: retq1169;1170; AVX512F-LABEL: vec256_i64_signed_mem_mem:1171; AVX512F: # %bb.0:1172; AVX512F-NEXT: vmovdqa (%rdi), %ymm01173; AVX512F-NEXT: vmovdqa (%rsi), %ymm11174; AVX512F-NEXT: vpcmpgtq %zmm1, %zmm0, %k11175; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21176; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]1177; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}1178; AVX512F-NEXT: vpminsq %zmm1, %zmm0, %zmm21179; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm11180; AVX512F-NEXT: vpsubq %ymm2, %ymm1, %ymm11181; AVX512F-NEXT: vpsrlq $1, %ymm1, %ymm21182; AVX512F-NEXT: vpsrlq $33, %ymm1, %ymm11183; AVX512F-NEXT: vpmuludq %ymm3, %ymm1, %ymm11184; AVX512F-NEXT: vpsrlq $32, %ymm3, %ymm41185; AVX512F-NEXT: vpmuludq %ymm4, %ymm2, %ymm41186; AVX512F-NEXT: vpaddq %ymm1, %ymm4, %ymm11187; AVX512F-NEXT: vpsllq $32, %ymm1, %ymm11188; AVX512F-NEXT: vpmuludq %ymm3, %ymm2, %ymm21189; AVX512F-NEXT: vpaddq %ymm0, %ymm2, %ymm01190; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm01191; AVX512F-NEXT: retq1192;1193; AVX512VL-LABEL: vec256_i64_signed_mem_mem:1194; AVX512VL: # %bb.0:1195; AVX512VL-NEXT: vmovdqa (%rdi), %ymm01196; AVX512VL-NEXT: vmovdqa (%rsi), %ymm11197; AVX512VL-NEXT: vpcmpgtq %ymm1, %ymm0, %k11198; AVX512VL-NEXT: vpminsq %ymm1, %ymm0, %ymm21199; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm11200; AVX512VL-NEXT: vpsubq %ymm2, %ymm1, %ymm11201; AVX512VL-NEXT: vpsrlq $1, %ymm1, %ymm11202; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm21203; AVX512VL-NEXT: vpsubq %ymm1, %ymm2, %ymm1 {%k1}1204; AVX512VL-NEXT: vpaddq %ymm0, %ymm1, %ymm01205; AVX512VL-NEXT: retq1206;1207; AVX512BW-FALLBACK-LABEL: vec256_i64_signed_mem_mem:1208; AVX512BW-FALLBACK: # %bb.0:1209; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm01210; AVX512BW-FALLBACK-NEXT: vmovdqa (%rsi), %ymm11211; AVX512BW-FALLBACK-NEXT: vpcmpgtq %zmm1, %zmm0, %k11212; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21213; AVX512BW-FALLBACK-NEXT: vpbroadcastq {{.*#+}} ymm3 = [1,1,1,1]1214; AVX512BW-FALLBACK-NEXT: vmovdqa64 %zmm2, %zmm3 {%k1}1215; AVX512BW-FALLBACK-NEXT: vpminsq %zmm1, %zmm0, %zmm21216; AVX512BW-FALLBACK-NEXT: vpmaxsq %zmm1, %zmm0, %zmm11217; AVX512BW-FALLBACK-NEXT: vpsubq %ymm2, %ymm1, %ymm11218; AVX512BW-FALLBACK-NEXT: vpsrlq $1, %ymm1, %ymm21219; AVX512BW-FALLBACK-NEXT: vpsrlq $33, %ymm1, %ymm11220; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm1, %ymm11221; AVX512BW-FALLBACK-NEXT: vpsrlq $32, %ymm3, %ymm41222; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm4, %ymm2, %ymm41223; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm4, %ymm11224; AVX512BW-FALLBACK-NEXT: vpsllq $32, %ymm1, %ymm11225; AVX512BW-FALLBACK-NEXT: vpmuludq %ymm3, %ymm2, %ymm21226; AVX512BW-FALLBACK-NEXT: vpaddq %ymm0, %ymm2, %ymm01227; AVX512BW-FALLBACK-NEXT: vpaddq %ymm1, %ymm0, %ymm01228; AVX512BW-FALLBACK-NEXT: retq1229 %a1 = load <4 x i64>, ptr %a1_addr1230 %a2 = load <4 x i64>, ptr %a2_addr1231 %t3 = icmp sgt <4 x i64> %a1, %a2 ; signed1232 %t4 = select <4 x i1> %t3, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>1233 %t5 = select <4 x i1> %t3, <4 x i64> %a2, <4 x i64> %a11234 %t6 = select <4 x i1> %t3, <4 x i64> %a1, <4 x i64> %a21235 %t7 = sub <4 x i64> %t6, %t51236 %t8 = lshr <4 x i64> %t7, <i64 1, i64 1, i64 1, i64 1>1237 %t9 = mul nsw <4 x i64> %t8, %t4 ; signed1238 %a10 = add nsw <4 x i64> %t9, %a1 ; signed1239 ret <4 x i64> %a101240}1241 1242; ---------------------------------------------------------------------------- ;1243; 16-bit width. 256 / 16 = 16 elts.1244; ---------------------------------------------------------------------------- ;1245 1246; Values come from regs1247 1248define <16 x i16> @vec256_i16_signed_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {1249; AVX1-LABEL: vec256_i16_signed_reg_reg:1250; AVX1: # %bb.0:1251; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21252; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31253; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm41254; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm51255; AVX1-NEXT: vpminsw %xmm1, %xmm0, %xmm61256; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm11257; AVX1-NEXT: vpsubw %xmm6, %xmm1, %xmm11258; AVX1-NEXT: vpminsw %xmm2, %xmm3, %xmm61259; AVX1-NEXT: vpmaxsw %xmm2, %xmm3, %xmm21260; AVX1-NEXT: vpsubw %xmm6, %xmm2, %xmm21261; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm21262; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm11263; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1264; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm51265; AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm11266; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm41267; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm21268; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm21269; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm01270; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01271; AVX1-NEXT: retq1272;1273; AVX2-LABEL: vec256_i16_signed_reg_reg:1274; AVX2: # %bb.0:1275; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21276; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21277; AVX2-NEXT: vpminsw %ymm1, %ymm0, %ymm31278; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11279; AVX2-NEXT: vpsubw %ymm3, %ymm1, %ymm11280; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm11281; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm11282; AVX2-NEXT: vpaddw %ymm0, %ymm1, %ymm01283; AVX2-NEXT: retq1284;1285; XOP-LABEL: vec256_i16_signed_reg_reg:1286; XOP: # %bb.0:1287; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21288; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31289; XOP-NEXT: vpcomgtw %xmm2, %xmm3, %xmm41290; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm51291; XOP-NEXT: vpminsw %xmm2, %xmm3, %xmm61292; XOP-NEXT: vpmaxsw %xmm2, %xmm3, %xmm21293; XOP-NEXT: vpsubw %xmm6, %xmm2, %xmm21294; XOP-NEXT: vpminsw %xmm1, %xmm0, %xmm61295; XOP-NEXT: vpmaxsw %xmm1, %xmm0, %xmm11296; XOP-NEXT: vpsubw %xmm6, %xmm1, %xmm11297; XOP-NEXT: vpsrlw $1, %xmm1, %xmm11298; XOP-NEXT: vpsrlw $1, %xmm2, %xmm21299; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1300; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51301; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41302; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm2, %xmm21303; XOP-NEXT: vpmacsww %xmm0, %xmm5, %xmm1, %xmm01304; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01305; XOP-NEXT: retq1306;1307; AVX512F-LABEL: vec256_i16_signed_reg_reg:1308; AVX512F: # %bb.0:1309; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21310; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21311; AVX512F-NEXT: vpminsw %ymm1, %ymm0, %ymm31312; AVX512F-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11313; AVX512F-NEXT: vpsubw %ymm3, %ymm1, %ymm11314; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm11315; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm11316; AVX512F-NEXT: vpaddw %ymm0, %ymm1, %ymm01317; AVX512F-NEXT: retq1318;1319; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_reg:1320; AVX512VL-FALLBACK: # %bb.0:1321; AVX512VL-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21322; AVX512VL-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm31323; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm3, %ymm21324; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm21325; AVX512VL-FALLBACK-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm11326; AVX512VL-FALLBACK-NEXT: vpxor %ymm1, %ymm2, %ymm21327; AVX512VL-FALLBACK-NEXT: vpsubw %ymm1, %ymm2, %ymm11328; AVX512VL-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01329; AVX512VL-FALLBACK-NEXT: retq1330;1331; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_reg:1332; AVX512BW-FALLBACK: # %bb.0:1333; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11334; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01335; AVX512BW-FALLBACK-NEXT: vpcmpgtw %zmm1, %zmm0, %k11336; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21337; AVX512BW-FALLBACK-NEXT: vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1338; AVX512BW-FALLBACK-NEXT: vmovdqu16 %zmm2, %zmm3 {%k1}1339; AVX512BW-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21340; AVX512BW-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11341; AVX512BW-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11342; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm11343; AVX512BW-FALLBACK-NEXT: vpmullw %ymm3, %ymm1, %ymm11344; AVX512BW-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01345; AVX512BW-FALLBACK-NEXT: retq1346;1347; AVX512VLBW-LABEL: vec256_i16_signed_reg_reg:1348; AVX512VLBW: # %bb.0:1349; AVX512VLBW-NEXT: vpcmpgtw %ymm1, %ymm0, %k11350; AVX512VLBW-NEXT: vpminsw %ymm1, %ymm0, %ymm21351; AVX512VLBW-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11352; AVX512VLBW-NEXT: vpsubw %ymm2, %ymm1, %ymm11353; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm11354; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm21355; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm2, %ymm1 {%k1}1356; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm1, %ymm01357; AVX512VLBW-NEXT: retq1358 %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed1359 %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1360 %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a11361 %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a21362 %t7 = sub <16 x i16> %t6, %t51363 %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1364 %t9 = mul nsw <16 x i16> %t16, %t4 ; signed1365 %a10 = add nsw <16 x i16> %t9, %a1 ; signed1366 ret <16 x i16> %a101367}1368 1369define <16 x i16> @vec256_i16_unsigned_reg_reg(<16 x i16> %a1, <16 x i16> %a2) nounwind {1370; AVX1-LABEL: vec256_i16_unsigned_reg_reg:1371; AVX1: # %bb.0:1372; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21373; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31374; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm41375; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm51376; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm61377; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm51378; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm71379; AVX1-NEXT: vpcmpeqw %xmm7, %xmm0, %xmm81380; AVX1-NEXT: vpxor %xmm6, %xmm8, %xmm61381; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm11382; AVX1-NEXT: vpsubw %xmm7, %xmm1, %xmm11383; AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm21384; AVX1-NEXT: vpsubw %xmm4, %xmm2, %xmm21385; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm21386; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm11387; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1]1388; AVX1-NEXT: vpor %xmm4, %xmm6, %xmm61389; AVX1-NEXT: vpmullw %xmm6, %xmm1, %xmm11390; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm41391; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm21392; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm21393; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm01394; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01395; AVX1-NEXT: retq1396;1397; AVX2-LABEL: vec256_i16_unsigned_reg_reg:1398; AVX2: # %bb.0:1399; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm21400; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm31401; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm41402; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm31403; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm31404; AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm11405; AVX2-NEXT: vpsubw %ymm2, %ymm1, %ymm11406; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm11407; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm11408; AVX2-NEXT: vpaddw %ymm0, %ymm1, %ymm01409; AVX2-NEXT: retq1410;1411; XOP-LABEL: vec256_i16_unsigned_reg_reg:1412; XOP: # %bb.0:1413; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21414; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31415; XOP-NEXT: vpcomgtuw %xmm2, %xmm3, %xmm41416; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm51417; XOP-NEXT: vpminuw %xmm2, %xmm3, %xmm61418; XOP-NEXT: vpmaxuw %xmm2, %xmm3, %xmm21419; XOP-NEXT: vpsubw %xmm6, %xmm2, %xmm21420; XOP-NEXT: vpminuw %xmm1, %xmm0, %xmm61421; XOP-NEXT: vpmaxuw %xmm1, %xmm0, %xmm11422; XOP-NEXT: vpsubw %xmm6, %xmm1, %xmm11423; XOP-NEXT: vpsrlw $1, %xmm1, %xmm11424; XOP-NEXT: vpsrlw $1, %xmm2, %xmm21425; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1426; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51427; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41428; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm2, %xmm21429; XOP-NEXT: vpmacsww %xmm0, %xmm5, %xmm1, %xmm01430; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01431; XOP-NEXT: retq1432;1433; AVX512F-LABEL: vec256_i16_unsigned_reg_reg:1434; AVX512F: # %bb.0:1435; AVX512F-NEXT: vpminuw %ymm1, %ymm0, %ymm21436; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm31437; AVX512F-NEXT: vpternlogq {{.*#+}} zmm3 = ~zmm31438; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm31439; AVX512F-NEXT: vpmaxuw %ymm1, %ymm0, %ymm11440; AVX512F-NEXT: vpsubw %ymm2, %ymm1, %ymm11441; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm11442; AVX512F-NEXT: vpmullw %ymm3, %ymm1, %ymm11443; AVX512F-NEXT: vpaddw %ymm0, %ymm1, %ymm01444; AVX512F-NEXT: retq1445;1446; AVX512VL-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:1447; AVX512VL-FALLBACK: # %bb.0:1448; AVX512VL-FALLBACK-NEXT: vpminuw %ymm1, %ymm0, %ymm21449; AVX512VL-FALLBACK-NEXT: vpmaxuw %ymm1, %ymm0, %ymm11450; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11451; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm11452; AVX512VL-FALLBACK-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm21453; AVX512VL-FALLBACK-NEXT: vpternlogq {{.*#+}} ymm2 = ~ymm21454; AVX512VL-FALLBACK-NEXT: vpxor %ymm2, %ymm1, %ymm11455; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11456; AVX512VL-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01457; AVX512VL-FALLBACK-NEXT: retq1458;1459; AVX512BW-FALLBACK-LABEL: vec256_i16_unsigned_reg_reg:1460; AVX512BW-FALLBACK: # %bb.0:1461; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11462; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01463; AVX512BW-FALLBACK-NEXT: vpcmpnleuw %zmm1, %zmm0, %k11464; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21465; AVX512BW-FALLBACK-NEXT: vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1466; AVX512BW-FALLBACK-NEXT: vmovdqu16 %zmm2, %zmm3 {%k1}1467; AVX512BW-FALLBACK-NEXT: vpminuw %ymm1, %ymm0, %ymm21468; AVX512BW-FALLBACK-NEXT: vpmaxuw %ymm1, %ymm0, %ymm11469; AVX512BW-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11470; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm11471; AVX512BW-FALLBACK-NEXT: vpmullw %ymm3, %ymm1, %ymm11472; AVX512BW-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01473; AVX512BW-FALLBACK-NEXT: retq1474;1475; AVX512VLBW-LABEL: vec256_i16_unsigned_reg_reg:1476; AVX512VLBW: # %bb.0:1477; AVX512VLBW-NEXT: vpcmpnleuw %ymm1, %ymm0, %k11478; AVX512VLBW-NEXT: vpminuw %ymm1, %ymm0, %ymm21479; AVX512VLBW-NEXT: vpmaxuw %ymm1, %ymm0, %ymm11480; AVX512VLBW-NEXT: vpsubw %ymm2, %ymm1, %ymm11481; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm11482; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm21483; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm2, %ymm1 {%k1}1484; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm1, %ymm01485; AVX512VLBW-NEXT: retq1486 %t3 = icmp ugt <16 x i16> %a1, %a21487 %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1488 %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a11489 %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a21490 %t7 = sub <16 x i16> %t6, %t51491 %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1492 %t9 = mul <16 x i16> %t16, %t41493 %a10 = add <16 x i16> %t9, %a11494 ret <16 x i16> %a101495}1496 1497; Values are loaded. Only check signed case.1498 1499define <16 x i16> @vec256_i16_signed_mem_reg(ptr %a1_addr, <16 x i16> %a2) nounwind {1500; AVX1-LABEL: vec256_i16_signed_mem_reg:1501; AVX1: # %bb.0:1502; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11503; AVX1-NEXT: vmovdqa (%rdi), %xmm21504; AVX1-NEXT: vmovdqa 16(%rdi), %xmm31505; AVX1-NEXT: vpcmpgtw %xmm1, %xmm3, %xmm41506; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm51507; AVX1-NEXT: vpminsw %xmm0, %xmm2, %xmm61508; AVX1-NEXT: vpmaxsw %xmm0, %xmm2, %xmm01509; AVX1-NEXT: vpsubw %xmm6, %xmm0, %xmm01510; AVX1-NEXT: vpminsw %xmm1, %xmm3, %xmm61511; AVX1-NEXT: vpmaxsw %xmm1, %xmm3, %xmm11512; AVX1-NEXT: vpsubw %xmm6, %xmm1, %xmm11513; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm11514; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm01515; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1516; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm51517; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm01518; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm41519; AVX1-NEXT: vpmullw %xmm4, %xmm1, %xmm11520; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm11521; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm01522; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01523; AVX1-NEXT: retq1524;1525; AVX2-LABEL: vec256_i16_signed_mem_reg:1526; AVX2: # %bb.0:1527; AVX2-NEXT: vmovdqa (%rdi), %ymm11528; AVX2-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm21529; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21530; AVX2-NEXT: vpminsw %ymm0, %ymm1, %ymm31531; AVX2-NEXT: vpmaxsw %ymm0, %ymm1, %ymm01532; AVX2-NEXT: vpsubw %ymm3, %ymm0, %ymm01533; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm01534; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm01535; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm01536; AVX2-NEXT: retq1537;1538; XOP-LABEL: vec256_i16_signed_mem_reg:1539; XOP: # %bb.0:1540; XOP-NEXT: vextractf128 $1, %ymm0, %xmm11541; XOP-NEXT: vmovdqa (%rdi), %xmm21542; XOP-NEXT: vmovdqa 16(%rdi), %xmm31543; XOP-NEXT: vpcomgtw %xmm1, %xmm3, %xmm41544; XOP-NEXT: vpcomgtw %xmm0, %xmm2, %xmm51545; XOP-NEXT: vpminsw %xmm1, %xmm3, %xmm61546; XOP-NEXT: vpmaxsw %xmm1, %xmm3, %xmm11547; XOP-NEXT: vpsubw %xmm6, %xmm1, %xmm11548; XOP-NEXT: vpminsw %xmm0, %xmm2, %xmm61549; XOP-NEXT: vpmaxsw %xmm0, %xmm2, %xmm01550; XOP-NEXT: vpsubw %xmm6, %xmm0, %xmm01551; XOP-NEXT: vpsrlw $1, %xmm0, %xmm01552; XOP-NEXT: vpsrlw $1, %xmm1, %xmm11553; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1554; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51555; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41556; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm1, %xmm11557; XOP-NEXT: vpmacsww %xmm2, %xmm5, %xmm0, %xmm01558; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01559; XOP-NEXT: retq1560;1561; AVX512F-LABEL: vec256_i16_signed_mem_reg:1562; AVX512F: # %bb.0:1563; AVX512F-NEXT: vmovdqa (%rdi), %ymm11564; AVX512F-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm21565; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21566; AVX512F-NEXT: vpminsw %ymm0, %ymm1, %ymm31567; AVX512F-NEXT: vpmaxsw %ymm0, %ymm1, %ymm01568; AVX512F-NEXT: vpsubw %ymm3, %ymm0, %ymm01569; AVX512F-NEXT: vpsrlw $1, %ymm0, %ymm01570; AVX512F-NEXT: vpmullw %ymm2, %ymm0, %ymm01571; AVX512F-NEXT: vpaddw %ymm1, %ymm0, %ymm01572; AVX512F-NEXT: retq1573;1574; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_reg:1575; AVX512VL-FALLBACK: # %bb.0:1576; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm11577; AVX512VL-FALLBACK-NEXT: vpminsw %ymm0, %ymm1, %ymm21578; AVX512VL-FALLBACK-NEXT: vpmaxsw %ymm0, %ymm1, %ymm31579; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm3, %ymm21580; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm21581; AVX512VL-FALLBACK-NEXT: vpcmpgtw %ymm0, %ymm1, %ymm01582; AVX512VL-FALLBACK-NEXT: vpxor %ymm0, %ymm2, %ymm21583; AVX512VL-FALLBACK-NEXT: vpsubw %ymm0, %ymm2, %ymm01584; AVX512VL-FALLBACK-NEXT: vpaddw %ymm1, %ymm0, %ymm01585; AVX512VL-FALLBACK-NEXT: retq1586;1587; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_reg:1588; AVX512BW-FALLBACK: # %bb.0:1589; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01590; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm11591; AVX512BW-FALLBACK-NEXT: vpcmpgtw %zmm0, %zmm1, %k11592; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21593; AVX512BW-FALLBACK-NEXT: vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1594; AVX512BW-FALLBACK-NEXT: vmovdqu16 %zmm2, %zmm3 {%k1}1595; AVX512BW-FALLBACK-NEXT: vpminsw %ymm0, %ymm1, %ymm21596; AVX512BW-FALLBACK-NEXT: vpmaxsw %ymm0, %ymm1, %ymm01597; AVX512BW-FALLBACK-NEXT: vpsubw %ymm2, %ymm0, %ymm01598; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm0, %ymm01599; AVX512BW-FALLBACK-NEXT: vpmullw %ymm3, %ymm0, %ymm01600; AVX512BW-FALLBACK-NEXT: vpaddw %ymm1, %ymm0, %ymm01601; AVX512BW-FALLBACK-NEXT: retq1602;1603; AVX512VLBW-LABEL: vec256_i16_signed_mem_reg:1604; AVX512VLBW: # %bb.0:1605; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm11606; AVX512VLBW-NEXT: vpcmpgtw %ymm0, %ymm1, %k11607; AVX512VLBW-NEXT: vpminsw %ymm0, %ymm1, %ymm21608; AVX512VLBW-NEXT: vpmaxsw %ymm0, %ymm1, %ymm01609; AVX512VLBW-NEXT: vpsubw %ymm2, %ymm0, %ymm01610; AVX512VLBW-NEXT: vpsrlw $1, %ymm0, %ymm01611; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm21612; AVX512VLBW-NEXT: vpsubw %ymm0, %ymm2, %ymm0 {%k1}1613; AVX512VLBW-NEXT: vpaddw %ymm1, %ymm0, %ymm01614; AVX512VLBW-NEXT: retq1615 %a1 = load <16 x i16>, ptr %a1_addr1616 %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed1617 %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1618 %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a11619 %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a21620 %t7 = sub <16 x i16> %t6, %t51621 %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1622 %t9 = mul nsw <16 x i16> %t16, %t4 ; signed1623 %a10 = add nsw <16 x i16> %t9, %a1 ; signed1624 ret <16 x i16> %a101625}1626 1627define <16 x i16> @vec256_i16_signed_reg_mem(<16 x i16> %a1, ptr %a2_addr) nounwind {1628; AVX1-LABEL: vec256_i16_signed_reg_mem:1629; AVX1: # %bb.0:1630; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11631; AVX1-NEXT: vmovdqa (%rdi), %xmm21632; AVX1-NEXT: vmovdqa 16(%rdi), %xmm31633; AVX1-NEXT: vpcmpgtw %xmm3, %xmm1, %xmm41634; AVX1-NEXT: vpcmpgtw %xmm2, %xmm0, %xmm51635; AVX1-NEXT: vpminsw %xmm2, %xmm0, %xmm61636; AVX1-NEXT: vpmaxsw %xmm2, %xmm0, %xmm21637; AVX1-NEXT: vpsubw %xmm6, %xmm2, %xmm21638; AVX1-NEXT: vpminsw %xmm3, %xmm1, %xmm61639; AVX1-NEXT: vpmaxsw %xmm3, %xmm1, %xmm31640; AVX1-NEXT: vpsubw %xmm6, %xmm3, %xmm31641; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm31642; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm21643; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1644; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm51645; AVX1-NEXT: vpmullw %xmm5, %xmm2, %xmm21646; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm41647; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm31648; AVX1-NEXT: vpaddw %xmm1, %xmm3, %xmm11649; AVX1-NEXT: vpaddw %xmm0, %xmm2, %xmm01650; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01651; AVX1-NEXT: retq1652;1653; AVX2-LABEL: vec256_i16_signed_reg_mem:1654; AVX2: # %bb.0:1655; AVX2-NEXT: vmovdqa (%rdi), %ymm11656; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21657; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21658; AVX2-NEXT: vpminsw %ymm1, %ymm0, %ymm31659; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11660; AVX2-NEXT: vpsubw %ymm3, %ymm1, %ymm11661; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm11662; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm11663; AVX2-NEXT: vpaddw %ymm0, %ymm1, %ymm01664; AVX2-NEXT: retq1665;1666; XOP-LABEL: vec256_i16_signed_reg_mem:1667; XOP: # %bb.0:1668; XOP-NEXT: vextractf128 $1, %ymm0, %xmm11669; XOP-NEXT: vmovdqa (%rdi), %xmm21670; XOP-NEXT: vmovdqa 16(%rdi), %xmm31671; XOP-NEXT: vpcomgtw %xmm3, %xmm1, %xmm41672; XOP-NEXT: vpcomgtw %xmm2, %xmm0, %xmm51673; XOP-NEXT: vpminsw %xmm3, %xmm1, %xmm61674; XOP-NEXT: vpmaxsw %xmm3, %xmm1, %xmm31675; XOP-NEXT: vpsubw %xmm6, %xmm3, %xmm31676; XOP-NEXT: vpminsw %xmm2, %xmm0, %xmm61677; XOP-NEXT: vpmaxsw %xmm2, %xmm0, %xmm21678; XOP-NEXT: vpsubw %xmm6, %xmm2, %xmm21679; XOP-NEXT: vpsrlw $1, %xmm2, %xmm21680; XOP-NEXT: vpsrlw $1, %xmm3, %xmm31681; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1682; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51683; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41684; XOP-NEXT: vpmacsww %xmm1, %xmm4, %xmm3, %xmm11685; XOP-NEXT: vpmacsww %xmm0, %xmm5, %xmm2, %xmm01686; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01687; XOP-NEXT: retq1688;1689; AVX512F-LABEL: vec256_i16_signed_reg_mem:1690; AVX512F: # %bb.0:1691; AVX512F-NEXT: vmovdqa (%rdi), %ymm11692; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21693; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21694; AVX512F-NEXT: vpminsw %ymm1, %ymm0, %ymm31695; AVX512F-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11696; AVX512F-NEXT: vpsubw %ymm3, %ymm1, %ymm11697; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm11698; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm11699; AVX512F-NEXT: vpaddw %ymm0, %ymm1, %ymm01700; AVX512F-NEXT: retq1701;1702; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_reg_mem:1703; AVX512VL-FALLBACK: # %bb.0:1704; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm11705; AVX512VL-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21706; AVX512VL-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm31707; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm3, %ymm21708; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm21709; AVX512VL-FALLBACK-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm11710; AVX512VL-FALLBACK-NEXT: vpxor %ymm1, %ymm2, %ymm21711; AVX512VL-FALLBACK-NEXT: vpsubw %ymm1, %ymm2, %ymm11712; AVX512VL-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01713; AVX512VL-FALLBACK-NEXT: retq1714;1715; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_reg_mem:1716; AVX512BW-FALLBACK: # %bb.0:1717; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01718; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm11719; AVX512BW-FALLBACK-NEXT: vpcmpgtw %zmm1, %zmm0, %k11720; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21721; AVX512BW-FALLBACK-NEXT: vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1722; AVX512BW-FALLBACK-NEXT: vmovdqu16 %zmm2, %zmm3 {%k1}1723; AVX512BW-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21724; AVX512BW-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11725; AVX512BW-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11726; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm11727; AVX512BW-FALLBACK-NEXT: vpmullw %ymm3, %ymm1, %ymm11728; AVX512BW-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01729; AVX512BW-FALLBACK-NEXT: retq1730;1731; AVX512VLBW-LABEL: vec256_i16_signed_reg_mem:1732; AVX512VLBW: # %bb.0:1733; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm11734; AVX512VLBW-NEXT: vpcmpgtw %ymm1, %ymm0, %k11735; AVX512VLBW-NEXT: vpminsw %ymm1, %ymm0, %ymm21736; AVX512VLBW-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11737; AVX512VLBW-NEXT: vpsubw %ymm2, %ymm1, %ymm11738; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm11739; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm21740; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm2, %ymm1 {%k1}1741; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm1, %ymm01742; AVX512VLBW-NEXT: retq1743 %a2 = load <16 x i16>, ptr %a2_addr1744 %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed1745 %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1746 %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a11747 %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a21748 %t7 = sub <16 x i16> %t6, %t51749 %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1750 %t9 = mul nsw <16 x i16> %t16, %t4 ; signed1751 %a10 = add nsw <16 x i16> %t9, %a1 ; signed1752 ret <16 x i16> %a101753}1754 1755define <16 x i16> @vec256_i16_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {1756; AVX1-LABEL: vec256_i16_signed_mem_mem:1757; AVX1: # %bb.0:1758; AVX1-NEXT: vmovdqa (%rsi), %xmm01759; AVX1-NEXT: vmovdqa 16(%rsi), %xmm11760; AVX1-NEXT: vmovdqa (%rdi), %xmm21761; AVX1-NEXT: vmovdqa 16(%rdi), %xmm31762; AVX1-NEXT: vpcmpgtw %xmm1, %xmm3, %xmm41763; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm51764; AVX1-NEXT: vpminsw %xmm0, %xmm2, %xmm61765; AVX1-NEXT: vpmaxsw %xmm0, %xmm2, %xmm01766; AVX1-NEXT: vpsubw %xmm6, %xmm0, %xmm01767; AVX1-NEXT: vpminsw %xmm1, %xmm3, %xmm61768; AVX1-NEXT: vpmaxsw %xmm1, %xmm3, %xmm11769; AVX1-NEXT: vpsubw %xmm6, %xmm1, %xmm11770; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm11771; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm01772; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1773; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm51774; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm01775; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm41776; AVX1-NEXT: vpmullw %xmm4, %xmm1, %xmm11777; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm11778; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm01779; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01780; AVX1-NEXT: retq1781;1782; AVX2-LABEL: vec256_i16_signed_mem_mem:1783; AVX2: # %bb.0:1784; AVX2-NEXT: vmovdqa (%rdi), %ymm01785; AVX2-NEXT: vmovdqa (%rsi), %ymm11786; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21787; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21788; AVX2-NEXT: vpminsw %ymm1, %ymm0, %ymm31789; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11790; AVX2-NEXT: vpsubw %ymm3, %ymm1, %ymm11791; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm11792; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm11793; AVX2-NEXT: vpaddw %ymm0, %ymm1, %ymm01794; AVX2-NEXT: retq1795;1796; XOP-LABEL: vec256_i16_signed_mem_mem:1797; XOP: # %bb.0:1798; XOP-NEXT: vmovdqa (%rsi), %xmm01799; XOP-NEXT: vmovdqa 16(%rsi), %xmm11800; XOP-NEXT: vmovdqa (%rdi), %xmm21801; XOP-NEXT: vmovdqa 16(%rdi), %xmm31802; XOP-NEXT: vpcomgtw %xmm1, %xmm3, %xmm41803; XOP-NEXT: vpcomgtw %xmm0, %xmm2, %xmm51804; XOP-NEXT: vpminsw %xmm1, %xmm3, %xmm61805; XOP-NEXT: vpmaxsw %xmm1, %xmm3, %xmm11806; XOP-NEXT: vpsubw %xmm6, %xmm1, %xmm11807; XOP-NEXT: vpminsw %xmm0, %xmm2, %xmm61808; XOP-NEXT: vpmaxsw %xmm0, %xmm2, %xmm01809; XOP-NEXT: vpsubw %xmm6, %xmm0, %xmm01810; XOP-NEXT: vpsrlw $1, %xmm0, %xmm01811; XOP-NEXT: vpsrlw $1, %xmm1, %xmm11812; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1]1813; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51814; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41815; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm1, %xmm11816; XOP-NEXT: vpmacsww %xmm2, %xmm5, %xmm0, %xmm01817; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01818; XOP-NEXT: retq1819;1820; AVX512F-LABEL: vec256_i16_signed_mem_mem:1821; AVX512F: # %bb.0:1822; AVX512F-NEXT: vmovdqa (%rdi), %ymm01823; AVX512F-NEXT: vmovdqa (%rsi), %ymm11824; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm21825; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21826; AVX512F-NEXT: vpminsw %ymm1, %ymm0, %ymm31827; AVX512F-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11828; AVX512F-NEXT: vpsubw %ymm3, %ymm1, %ymm11829; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm11830; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm11831; AVX512F-NEXT: vpaddw %ymm0, %ymm1, %ymm01832; AVX512F-NEXT: retq1833;1834; AVX512VL-FALLBACK-LABEL: vec256_i16_signed_mem_mem:1835; AVX512VL-FALLBACK: # %bb.0:1836; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm01837; AVX512VL-FALLBACK-NEXT: vmovdqa (%rsi), %ymm11838; AVX512VL-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21839; AVX512VL-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm31840; AVX512VL-FALLBACK-NEXT: vpsubw %ymm2, %ymm3, %ymm21841; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm21842; AVX512VL-FALLBACK-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm11843; AVX512VL-FALLBACK-NEXT: vpxor %ymm1, %ymm2, %ymm21844; AVX512VL-FALLBACK-NEXT: vpsubw %ymm1, %ymm2, %ymm11845; AVX512VL-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01846; AVX512VL-FALLBACK-NEXT: retq1847;1848; AVX512BW-FALLBACK-LABEL: vec256_i16_signed_mem_mem:1849; AVX512BW-FALLBACK: # %bb.0:1850; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm01851; AVX512BW-FALLBACK-NEXT: vmovdqa (%rsi), %ymm11852; AVX512BW-FALLBACK-NEXT: vpcmpgtw %zmm1, %zmm0, %k11853; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21854; AVX512BW-FALLBACK-NEXT: vpbroadcastw {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1855; AVX512BW-FALLBACK-NEXT: vmovdqu16 %zmm2, %zmm3 {%k1}1856; AVX512BW-FALLBACK-NEXT: vpminsw %ymm1, %ymm0, %ymm21857; AVX512BW-FALLBACK-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11858; AVX512BW-FALLBACK-NEXT: vpsubw %ymm2, %ymm1, %ymm11859; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm11860; AVX512BW-FALLBACK-NEXT: vpmullw %ymm3, %ymm1, %ymm11861; AVX512BW-FALLBACK-NEXT: vpaddw %ymm0, %ymm1, %ymm01862; AVX512BW-FALLBACK-NEXT: retq1863;1864; AVX512VLBW-LABEL: vec256_i16_signed_mem_mem:1865; AVX512VLBW: # %bb.0:1866; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm01867; AVX512VLBW-NEXT: vmovdqa (%rsi), %ymm11868; AVX512VLBW-NEXT: vpcmpgtw %ymm1, %ymm0, %k11869; AVX512VLBW-NEXT: vpminsw %ymm1, %ymm0, %ymm21870; AVX512VLBW-NEXT: vpmaxsw %ymm1, %ymm0, %ymm11871; AVX512VLBW-NEXT: vpsubw %ymm2, %ymm1, %ymm11872; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm11873; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm21874; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm2, %ymm1 {%k1}1875; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm1, %ymm01876; AVX512VLBW-NEXT: retq1877 %a1 = load <16 x i16>, ptr %a1_addr1878 %a2 = load <16 x i16>, ptr %a2_addr1879 %t3 = icmp sgt <16 x i16> %a1, %a2 ; signed1880 %t4 = select <16 x i1> %t3, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1881 %t5 = select <16 x i1> %t3, <16 x i16> %a2, <16 x i16> %a11882 %t6 = select <16 x i1> %t3, <16 x i16> %a1, <16 x i16> %a21883 %t7 = sub <16 x i16> %t6, %t51884 %t16 = lshr <16 x i16> %t7, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>1885 %t9 = mul nsw <16 x i16> %t16, %t4 ; signed1886 %a10 = add nsw <16 x i16> %t9, %a1 ; signed1887 ret <16 x i16> %a101888}1889 1890; ---------------------------------------------------------------------------- ;1891; 8-bit width. 256 / 8 = 32 elts.1892; ---------------------------------------------------------------------------- ;1893 1894; Values come from regs1895 1896define <32 x i8> @vec256_i8_signed_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {1897; AVX1-LABEL: vec256_i8_signed_reg_reg:1898; AVX1: # %bb.0:1899; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21900; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31901; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm41902; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm51903; AVX1-NEXT: vpminsb %xmm1, %xmm0, %xmm61904; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm11905; AVX1-NEXT: vpsubb %xmm6, %xmm1, %xmm11906; AVX1-NEXT: vpminsb %xmm2, %xmm3, %xmm61907; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm21908; AVX1-NEXT: vpsubb %xmm6, %xmm2, %xmm21909; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm21910; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1911; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm21912; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm11913; AVX1-NEXT: vpand %xmm6, %xmm1, %xmm11914; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1915; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm51916; AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm71917; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]1918; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm71919; AVX1-NEXT: vpandn %xmm5, %xmm8, %xmm51920; AVX1-NEXT: vpmaddubsw %xmm5, %xmm1, %xmm11921; AVX1-NEXT: vpsllw $8, %xmm1, %xmm11922; AVX1-NEXT: vpor %xmm1, %xmm7, %xmm11923; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm41924; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm51925; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm51926; AVX1-NEXT: vpandn %xmm4, %xmm8, %xmm41927; AVX1-NEXT: vpmaddubsw %xmm4, %xmm2, %xmm21928; AVX1-NEXT: vpsllw $8, %xmm2, %xmm21929; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm21930; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm21931; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm01932; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01933; AVX1-NEXT: retq1934;1935; AVX2-LABEL: vec256_i8_signed_reg_reg:1936; AVX2: # %bb.0:1937; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm21938; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21939; AVX2-NEXT: vpminsb %ymm1, %ymm0, %ymm31940; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm11941; AVX2-NEXT: vpsubb %ymm3, %ymm1, %ymm11942; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm11943; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11944; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm31945; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]1946; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31947; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm21948; AVX2-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm11949; AVX2-NEXT: vpsllw $8, %ymm1, %ymm11950; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm11951; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm01952; AVX2-NEXT: retq1953;1954; XOP-LABEL: vec256_i8_signed_reg_reg:1955; XOP: # %bb.0:1956; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21957; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31958; XOP-NEXT: vpcomgtb %xmm2, %xmm3, %xmm41959; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm51960; XOP-NEXT: vpminsb %xmm1, %xmm0, %xmm61961; XOP-NEXT: vpmaxsb %xmm1, %xmm0, %xmm11962; XOP-NEXT: vpsubb %xmm6, %xmm1, %xmm11963; XOP-NEXT: vpminsb %xmm2, %xmm3, %xmm61964; XOP-NEXT: vpmaxsb %xmm2, %xmm3, %xmm21965; XOP-NEXT: vpsubb %xmm6, %xmm2, %xmm21966; XOP-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm61967; XOP-NEXT: vpshlb %xmm6, %xmm2, %xmm21968; XOP-NEXT: vpshlb %xmm6, %xmm1, %xmm11969; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1970; XOP-NEXT: vpor %xmm6, %xmm5, %xmm51971; XOP-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]1972; XOP-NEXT: vpandn %xmm5, %xmm7, %xmm81973; XOP-NEXT: vpmaddubsw %xmm8, %xmm1, %xmm81974; XOP-NEXT: vpmullw %xmm5, %xmm1, %xmm11975; XOP-NEXT: vmovdqa {{.*#+}} xmm5 = [0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30]1976; XOP-NEXT: vpperm %xmm5, %xmm8, %xmm1, %xmm11977; XOP-NEXT: vpor %xmm6, %xmm4, %xmm41978; XOP-NEXT: vpandn %xmm4, %xmm7, %xmm61979; XOP-NEXT: vpmaddubsw %xmm6, %xmm2, %xmm61980; XOP-NEXT: vpmullw %xmm4, %xmm2, %xmm21981; XOP-NEXT: vpperm %xmm5, %xmm6, %xmm2, %xmm21982; XOP-NEXT: vpaddb %xmm3, %xmm2, %xmm21983; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm01984; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01985; XOP-NEXT: retq1986;1987; AVX512F-LABEL: vec256_i8_signed_reg_reg:1988; AVX512F: # %bb.0:1989; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm21990; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21991; AVX512F-NEXT: vpminsb %ymm1, %ymm0, %ymm31992; AVX512F-NEXT: vpmaxsb %ymm1, %ymm0, %ymm11993; AVX512F-NEXT: vpsubb %ymm3, %ymm1, %ymm11994; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm11995; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11996; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm31997; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]1998; AVX512F-NEXT: vpand %ymm4, %ymm3, %ymm31999; AVX512F-NEXT: vpandn %ymm2, %ymm4, %ymm22000; AVX512F-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm12001; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm12002; AVX512F-NEXT: vpor %ymm1, %ymm3, %ymm12003; AVX512F-NEXT: vpaddb %ymm0, %ymm1, %ymm02004; AVX512F-NEXT: retq2005;2006; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_reg:2007; AVX512VL-FALLBACK: # %bb.0:2008; AVX512VL-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22009; AVX512VL-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm32010; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm3, %ymm22011; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm22012; AVX512VL-FALLBACK-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm12013; AVX512VL-FALLBACK-NEXT: vpternlogd {{.*#+}} ymm2 = ymm1 ^ (ymm2 & m32bcst)2014; AVX512VL-FALLBACK-NEXT: vpsubb %ymm1, %ymm2, %ymm12015; AVX512VL-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02016; AVX512VL-FALLBACK-NEXT: retq2017;2018; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_reg:2019; AVX512BW-FALLBACK: # %bb.0:2020; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12021; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02022; AVX512BW-FALLBACK-NEXT: vpcmpgtb %zmm1, %zmm0, %k12023; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm22024; AVX512BW-FALLBACK-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2025; AVX512BW-FALLBACK-NEXT: vmovdqu8 %zmm2, %zmm3 {%k1}2026; AVX512BW-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22027; AVX512BW-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12028; AVX512BW-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12029; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm12030; AVX512BW-FALLBACK-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12031; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero2032; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero2033; AVX512BW-FALLBACK-NEXT: vpmullw %zmm2, %zmm1, %zmm12034; AVX512BW-FALLBACK-NEXT: vpmovwb %zmm1, %ymm12035; AVX512BW-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02036; AVX512BW-FALLBACK-NEXT: retq2037;2038; AVX512VLBW-LABEL: vec256_i8_signed_reg_reg:2039; AVX512VLBW: # %bb.0:2040; AVX512VLBW-NEXT: vpcmpgtb %ymm1, %ymm0, %k12041; AVX512VLBW-NEXT: vpminsb %ymm1, %ymm0, %ymm22042; AVX512VLBW-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12043; AVX512VLBW-NEXT: vpsubb %ymm2, %ymm1, %ymm12044; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm12045; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm12046; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm22047; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1 {%k1}2048; AVX512VLBW-NEXT: vpaddb %ymm0, %ymm1, %ymm02049; AVX512VLBW-NEXT: retq2050 %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed2051 %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2052 %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a12053 %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a22054 %t7 = sub <32 x i8> %t6, %t52055 %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2056 %t9 = mul nsw <32 x i8> %t8, %t4 ; signed2057 %a10 = add nsw <32 x i8> %t9, %a1 ; signed2058 ret <32 x i8> %a102059}2060 2061define <32 x i8> @vec256_i8_unsigned_reg_reg(<32 x i8> %a1, <32 x i8> %a2) nounwind {2062; AVX1-LABEL: vec256_i8_unsigned_reg_reg:2063; AVX1: # %bb.0:2064; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32065; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22066; AVX1-NEXT: vpminub %xmm3, %xmm2, %xmm42067; AVX1-NEXT: vpcmpeqb %xmm4, %xmm2, %xmm52068; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm62069; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm52070; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm72071; AVX1-NEXT: vpcmpeqb %xmm7, %xmm0, %xmm82072; AVX1-NEXT: vpxor %xmm6, %xmm8, %xmm62073; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm12074; AVX1-NEXT: vpsubb %xmm7, %xmm1, %xmm12075; AVX1-NEXT: vpmaxub %xmm3, %xmm2, %xmm32076; AVX1-NEXT: vpsubb %xmm4, %xmm3, %xmm32077; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm32078; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]2079; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm32080; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm12081; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm12082; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2083; AVX1-NEXT: vpor %xmm4, %xmm6, %xmm62084; AVX1-NEXT: vpmullw %xmm6, %xmm1, %xmm72085; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]2086; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm72087; AVX1-NEXT: vpandn %xmm6, %xmm8, %xmm62088; AVX1-NEXT: vpmaddubsw %xmm6, %xmm1, %xmm12089; AVX1-NEXT: vpsllw $8, %xmm1, %xmm12090; AVX1-NEXT: vpor %xmm1, %xmm7, %xmm12091; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm42092; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm52093; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm52094; AVX1-NEXT: vpandn %xmm4, %xmm8, %xmm42095; AVX1-NEXT: vpmaddubsw %xmm4, %xmm3, %xmm32096; AVX1-NEXT: vpsllw $8, %xmm3, %xmm32097; AVX1-NEXT: vpor %xmm3, %xmm5, %xmm32098; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm22099; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm02100; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02101; AVX1-NEXT: retq2102;2103; AVX2-LABEL: vec256_i8_unsigned_reg_reg:2104; AVX2: # %bb.0:2105; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm22106; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm32107; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm42108; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm32109; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32110; AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm12111; AVX2-NEXT: vpsubb %ymm2, %ymm1, %ymm12112; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm12113; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12114; AVX2-NEXT: vpmullw %ymm3, %ymm1, %ymm22115; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2116; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm22117; AVX2-NEXT: vpandn %ymm3, %ymm4, %ymm32118; AVX2-NEXT: vpmaddubsw %ymm3, %ymm1, %ymm12119; AVX2-NEXT: vpsllw $8, %ymm1, %ymm12120; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12121; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm02122; AVX2-NEXT: retq2123;2124; XOP-LABEL: vec256_i8_unsigned_reg_reg:2125; XOP: # %bb.0:2126; XOP-NEXT: vextractf128 $1, %ymm1, %xmm22127; XOP-NEXT: vextractf128 $1, %ymm0, %xmm32128; XOP-NEXT: vpcomgtub %xmm2, %xmm3, %xmm42129; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm52130; XOP-NEXT: vpminub %xmm1, %xmm0, %xmm62131; XOP-NEXT: vpmaxub %xmm1, %xmm0, %xmm12132; XOP-NEXT: vpsubb %xmm6, %xmm1, %xmm12133; XOP-NEXT: vpminub %xmm2, %xmm3, %xmm62134; XOP-NEXT: vpmaxub %xmm2, %xmm3, %xmm22135; XOP-NEXT: vpsubb %xmm6, %xmm2, %xmm22136; XOP-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm62137; XOP-NEXT: vpshlb %xmm6, %xmm2, %xmm22138; XOP-NEXT: vpshlb %xmm6, %xmm1, %xmm12139; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2140; XOP-NEXT: vpor %xmm6, %xmm5, %xmm52141; XOP-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]2142; XOP-NEXT: vpandn %xmm5, %xmm7, %xmm82143; XOP-NEXT: vpmaddubsw %xmm8, %xmm1, %xmm82144; XOP-NEXT: vpmullw %xmm5, %xmm1, %xmm12145; XOP-NEXT: vmovdqa {{.*#+}} xmm5 = [0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30]2146; XOP-NEXT: vpperm %xmm5, %xmm8, %xmm1, %xmm12147; XOP-NEXT: vpor %xmm6, %xmm4, %xmm42148; XOP-NEXT: vpandn %xmm4, %xmm7, %xmm62149; XOP-NEXT: vpmaddubsw %xmm6, %xmm2, %xmm62150; XOP-NEXT: vpmullw %xmm4, %xmm2, %xmm22151; XOP-NEXT: vpperm %xmm5, %xmm6, %xmm2, %xmm22152; XOP-NEXT: vpaddb %xmm3, %xmm2, %xmm22153; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm02154; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02155; XOP-NEXT: retq2156;2157; AVX512F-LABEL: vec256_i8_unsigned_reg_reg:2158; AVX512F: # %bb.0:2159; AVX512F-NEXT: vpminub %ymm1, %ymm0, %ymm22160; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm32161; AVX512F-NEXT: vpternlogq {{.*#+}} zmm3 = ~zmm32162; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32163; AVX512F-NEXT: vpmaxub %ymm1, %ymm0, %ymm12164; AVX512F-NEXT: vpsubb %ymm2, %ymm1, %ymm12165; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm12166; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12167; AVX512F-NEXT: vpmullw %ymm3, %ymm1, %ymm22168; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2169; AVX512F-NEXT: vpand %ymm4, %ymm2, %ymm22170; AVX512F-NEXT: vpandn %ymm3, %ymm4, %ymm32171; AVX512F-NEXT: vpmaddubsw %ymm3, %ymm1, %ymm12172; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm12173; AVX512F-NEXT: vpor %ymm1, %ymm2, %ymm12174; AVX512F-NEXT: vpaddb %ymm0, %ymm1, %ymm02175; AVX512F-NEXT: retq2176;2177; AVX512VL-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:2178; AVX512VL-FALLBACK: # %bb.0:2179; AVX512VL-FALLBACK-NEXT: vpminub %ymm1, %ymm0, %ymm22180; AVX512VL-FALLBACK-NEXT: vpmaxub %ymm1, %ymm0, %ymm12181; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12182; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm12183; AVX512VL-FALLBACK-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm22184; AVX512VL-FALLBACK-NEXT: vpternlogq {{.*#+}} ymm2 = ~ymm22185; AVX512VL-FALLBACK-NEXT: vpternlogd {{.*#+}} ymm1 = ymm2 ^ (ymm1 & m32bcst)2186; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12187; AVX512VL-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02188; AVX512VL-FALLBACK-NEXT: retq2189;2190; AVX512BW-FALLBACK-LABEL: vec256_i8_unsigned_reg_reg:2191; AVX512BW-FALLBACK: # %bb.0:2192; AVX512BW-FALLBACK-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12193; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02194; AVX512BW-FALLBACK-NEXT: vpcmpnleub %zmm1, %zmm0, %k12195; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm22196; AVX512BW-FALLBACK-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2197; AVX512BW-FALLBACK-NEXT: vmovdqu8 %zmm2, %zmm3 {%k1}2198; AVX512BW-FALLBACK-NEXT: vpminub %ymm1, %ymm0, %ymm22199; AVX512BW-FALLBACK-NEXT: vpmaxub %ymm1, %ymm0, %ymm12200; AVX512BW-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12201; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm12202; AVX512BW-FALLBACK-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12203; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero2204; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero2205; AVX512BW-FALLBACK-NEXT: vpmullw %zmm2, %zmm1, %zmm12206; AVX512BW-FALLBACK-NEXT: vpmovwb %zmm1, %ymm12207; AVX512BW-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02208; AVX512BW-FALLBACK-NEXT: retq2209;2210; AVX512VLBW-LABEL: vec256_i8_unsigned_reg_reg:2211; AVX512VLBW: # %bb.0:2212; AVX512VLBW-NEXT: vpcmpnleub %ymm1, %ymm0, %k12213; AVX512VLBW-NEXT: vpminub %ymm1, %ymm0, %ymm22214; AVX512VLBW-NEXT: vpmaxub %ymm1, %ymm0, %ymm12215; AVX512VLBW-NEXT: vpsubb %ymm2, %ymm1, %ymm12216; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm12217; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm12218; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm22219; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1 {%k1}2220; AVX512VLBW-NEXT: vpaddb %ymm0, %ymm1, %ymm02221; AVX512VLBW-NEXT: retq2222 %t3 = icmp ugt <32 x i8> %a1, %a22223 %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2224 %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a12225 %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a22226 %t7 = sub <32 x i8> %t6, %t52227 %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2228 %t9 = mul <32 x i8> %t8, %t42229 %a10 = add <32 x i8> %t9, %a12230 ret <32 x i8> %a102231}2232 2233; Values are loaded. Only check signed case.2234 2235define <32 x i8> @vec256_i8_signed_mem_reg(ptr %a1_addr, <32 x i8> %a2) nounwind {2236; AVX1-LABEL: vec256_i8_signed_mem_reg:2237; AVX1: # %bb.0:2238; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22239; AVX1-NEXT: vmovdqa (%rdi), %xmm12240; AVX1-NEXT: vmovdqa 16(%rdi), %xmm32241; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm42242; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm52243; AVX1-NEXT: vpminsb %xmm0, %xmm1, %xmm62244; AVX1-NEXT: vpmaxsb %xmm0, %xmm1, %xmm02245; AVX1-NEXT: vpsubb %xmm6, %xmm0, %xmm02246; AVX1-NEXT: vpminsb %xmm2, %xmm3, %xmm62247; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm22248; AVX1-NEXT: vpsubb %xmm6, %xmm2, %xmm22249; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm22250; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]2251; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm22252; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm02253; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm02254; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2255; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm52256; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm72257; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]2258; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm72259; AVX1-NEXT: vpandn %xmm5, %xmm8, %xmm52260; AVX1-NEXT: vpmaddubsw %xmm5, %xmm0, %xmm02261; AVX1-NEXT: vpsllw $8, %xmm0, %xmm02262; AVX1-NEXT: vpor %xmm0, %xmm7, %xmm02263; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm42264; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm52265; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm52266; AVX1-NEXT: vpandn %xmm4, %xmm8, %xmm42267; AVX1-NEXT: vpmaddubsw %xmm4, %xmm2, %xmm22268; AVX1-NEXT: vpsllw $8, %xmm2, %xmm22269; AVX1-NEXT: vpor %xmm2, %xmm5, %xmm22270; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm22271; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm02272; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02273; AVX1-NEXT: retq2274;2275; AVX2-LABEL: vec256_i8_signed_mem_reg:2276; AVX2: # %bb.0:2277; AVX2-NEXT: vmovdqa (%rdi), %ymm12278; AVX2-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm22279; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22280; AVX2-NEXT: vpminsb %ymm0, %ymm1, %ymm32281; AVX2-NEXT: vpmaxsb %ymm0, %ymm1, %ymm02282; AVX2-NEXT: vpsubb %ymm3, %ymm0, %ymm02283; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm02284; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02285; AVX2-NEXT: vpmullw %ymm2, %ymm0, %ymm32286; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2287; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm32288; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm22289; AVX2-NEXT: vpmaddubsw %ymm2, %ymm0, %ymm02290; AVX2-NEXT: vpsllw $8, %ymm0, %ymm02291; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm02292; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm02293; AVX2-NEXT: retq2294;2295; XOP-LABEL: vec256_i8_signed_mem_reg:2296; XOP: # %bb.0:2297; XOP-NEXT: vextractf128 $1, %ymm0, %xmm12298; XOP-NEXT: vmovdqa (%rdi), %xmm22299; XOP-NEXT: vmovdqa 16(%rdi), %xmm32300; XOP-NEXT: vpcomgtb %xmm1, %xmm3, %xmm42301; XOP-NEXT: vpcomgtb %xmm0, %xmm2, %xmm52302; XOP-NEXT: vpminsb %xmm0, %xmm2, %xmm62303; XOP-NEXT: vpmaxsb %xmm0, %xmm2, %xmm02304; XOP-NEXT: vpsubb %xmm6, %xmm0, %xmm02305; XOP-NEXT: vpminsb %xmm1, %xmm3, %xmm62306; XOP-NEXT: vpmaxsb %xmm1, %xmm3, %xmm12307; XOP-NEXT: vpsubb %xmm6, %xmm1, %xmm12308; XOP-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm62309; XOP-NEXT: vpshlb %xmm6, %xmm1, %xmm12310; XOP-NEXT: vpshlb %xmm6, %xmm0, %xmm02311; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2312; XOP-NEXT: vpor %xmm6, %xmm5, %xmm52313; XOP-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]2314; XOP-NEXT: vpandn %xmm5, %xmm7, %xmm82315; XOP-NEXT: vpmaddubsw %xmm8, %xmm0, %xmm82316; XOP-NEXT: vpmullw %xmm5, %xmm0, %xmm02317; XOP-NEXT: vmovdqa {{.*#+}} xmm5 = [0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30]2318; XOP-NEXT: vpperm %xmm5, %xmm8, %xmm0, %xmm02319; XOP-NEXT: vpor %xmm6, %xmm4, %xmm42320; XOP-NEXT: vpandn %xmm4, %xmm7, %xmm62321; XOP-NEXT: vpmaddubsw %xmm6, %xmm1, %xmm62322; XOP-NEXT: vpmullw %xmm4, %xmm1, %xmm12323; XOP-NEXT: vpperm %xmm5, %xmm6, %xmm1, %xmm12324; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm12325; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm02326; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02327; XOP-NEXT: retq2328;2329; AVX512F-LABEL: vec256_i8_signed_mem_reg:2330; AVX512F: # %bb.0:2331; AVX512F-NEXT: vmovdqa (%rdi), %ymm12332; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm22333; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22334; AVX512F-NEXT: vpminsb %ymm0, %ymm1, %ymm32335; AVX512F-NEXT: vpmaxsb %ymm0, %ymm1, %ymm02336; AVX512F-NEXT: vpsubb %ymm3, %ymm0, %ymm02337; AVX512F-NEXT: vpsrlw $1, %ymm0, %ymm02338; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02339; AVX512F-NEXT: vpmullw %ymm2, %ymm0, %ymm32340; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2341; AVX512F-NEXT: vpand %ymm4, %ymm3, %ymm32342; AVX512F-NEXT: vpandn %ymm2, %ymm4, %ymm22343; AVX512F-NEXT: vpmaddubsw %ymm2, %ymm0, %ymm02344; AVX512F-NEXT: vpsllw $8, %ymm0, %ymm02345; AVX512F-NEXT: vpor %ymm0, %ymm3, %ymm02346; AVX512F-NEXT: vpaddb %ymm1, %ymm0, %ymm02347; AVX512F-NEXT: retq2348;2349; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_reg:2350; AVX512VL-FALLBACK: # %bb.0:2351; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm12352; AVX512VL-FALLBACK-NEXT: vpminsb %ymm0, %ymm1, %ymm22353; AVX512VL-FALLBACK-NEXT: vpmaxsb %ymm0, %ymm1, %ymm32354; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm3, %ymm22355; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm22356; AVX512VL-FALLBACK-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm02357; AVX512VL-FALLBACK-NEXT: vpternlogd {{.*#+}} ymm2 = ymm0 ^ (ymm2 & m32bcst)2358; AVX512VL-FALLBACK-NEXT: vpsubb %ymm0, %ymm2, %ymm02359; AVX512VL-FALLBACK-NEXT: vpaddb %ymm1, %ymm0, %ymm02360; AVX512VL-FALLBACK-NEXT: retq2361;2362; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_reg:2363; AVX512BW-FALLBACK: # %bb.0:2364; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02365; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm12366; AVX512BW-FALLBACK-NEXT: vpcmpgtb %zmm0, %zmm1, %k12367; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm22368; AVX512BW-FALLBACK-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2369; AVX512BW-FALLBACK-NEXT: vmovdqu8 %zmm2, %zmm3 {%k1}2370; AVX512BW-FALLBACK-NEXT: vpminsb %ymm0, %ymm1, %ymm22371; AVX512BW-FALLBACK-NEXT: vpmaxsb %ymm0, %ymm1, %ymm02372; AVX512BW-FALLBACK-NEXT: vpsubb %ymm2, %ymm0, %ymm02373; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm0, %ymm02374; AVX512BW-FALLBACK-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02375; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero2376; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero2377; AVX512BW-FALLBACK-NEXT: vpmullw %zmm2, %zmm0, %zmm02378; AVX512BW-FALLBACK-NEXT: vpmovwb %zmm0, %ymm02379; AVX512BW-FALLBACK-NEXT: vpaddb %ymm1, %ymm0, %ymm02380; AVX512BW-FALLBACK-NEXT: retq2381;2382; AVX512VLBW-LABEL: vec256_i8_signed_mem_reg:2383; AVX512VLBW: # %bb.0:2384; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm12385; AVX512VLBW-NEXT: vpcmpgtb %ymm0, %ymm1, %k12386; AVX512VLBW-NEXT: vpminsb %ymm0, %ymm1, %ymm22387; AVX512VLBW-NEXT: vpmaxsb %ymm0, %ymm1, %ymm02388; AVX512VLBW-NEXT: vpsubb %ymm2, %ymm0, %ymm02389; AVX512VLBW-NEXT: vpsrlw $1, %ymm0, %ymm02390; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm02391; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm22392; AVX512VLBW-NEXT: vpsubb %ymm0, %ymm2, %ymm0 {%k1}2393; AVX512VLBW-NEXT: vpaddb %ymm1, %ymm0, %ymm02394; AVX512VLBW-NEXT: retq2395 %a1 = load <32 x i8>, ptr %a1_addr2396 %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed2397 %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2398 %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a12399 %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a22400 %t7 = sub <32 x i8> %t6, %t52401 %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2402 %t9 = mul nsw <32 x i8> %t8, %t4 ; signed2403 %a10 = add nsw <32 x i8> %t9, %a1 ; signed2404 ret <32 x i8> %a102405}2406 2407define <32 x i8> @vec256_i8_signed_reg_mem(<32 x i8> %a1, ptr %a2_addr) nounwind {2408; AVX1-LABEL: vec256_i8_signed_reg_mem:2409; AVX1: # %bb.0:2410; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12411; AVX1-NEXT: vmovdqa (%rdi), %xmm22412; AVX1-NEXT: vmovdqa 16(%rdi), %xmm32413; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm42414; AVX1-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm52415; AVX1-NEXT: vpminsb %xmm2, %xmm0, %xmm62416; AVX1-NEXT: vpmaxsb %xmm2, %xmm0, %xmm22417; AVX1-NEXT: vpsubb %xmm6, %xmm2, %xmm22418; AVX1-NEXT: vpminsb %xmm3, %xmm1, %xmm62419; AVX1-NEXT: vpmaxsb %xmm3, %xmm1, %xmm32420; AVX1-NEXT: vpsubb %xmm6, %xmm3, %xmm32421; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm32422; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]2423; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm32424; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm22425; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm22426; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2427; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm52428; AVX1-NEXT: vpmullw %xmm5, %xmm2, %xmm72429; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]2430; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm72431; AVX1-NEXT: vpandn %xmm5, %xmm8, %xmm52432; AVX1-NEXT: vpmaddubsw %xmm5, %xmm2, %xmm22433; AVX1-NEXT: vpsllw $8, %xmm2, %xmm22434; AVX1-NEXT: vpor %xmm2, %xmm7, %xmm22435; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm42436; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm52437; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm52438; AVX1-NEXT: vpandn %xmm4, %xmm8, %xmm42439; AVX1-NEXT: vpmaddubsw %xmm4, %xmm3, %xmm32440; AVX1-NEXT: vpsllw $8, %xmm3, %xmm32441; AVX1-NEXT: vpor %xmm3, %xmm5, %xmm32442; AVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm12443; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm02444; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02445; AVX1-NEXT: retq2446;2447; AVX2-LABEL: vec256_i8_signed_reg_mem:2448; AVX2: # %bb.0:2449; AVX2-NEXT: vmovdqa (%rdi), %ymm12450; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm22451; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22452; AVX2-NEXT: vpminsb %ymm1, %ymm0, %ymm32453; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12454; AVX2-NEXT: vpsubb %ymm3, %ymm1, %ymm12455; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm12456; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12457; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm32458; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2459; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm32460; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm22461; AVX2-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm12462; AVX2-NEXT: vpsllw $8, %ymm1, %ymm12463; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm12464; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm02465; AVX2-NEXT: retq2466;2467; XOP-LABEL: vec256_i8_signed_reg_mem:2468; XOP: # %bb.0:2469; XOP-NEXT: vextractf128 $1, %ymm0, %xmm12470; XOP-NEXT: vmovdqa (%rdi), %xmm22471; XOP-NEXT: vmovdqa 16(%rdi), %xmm32472; XOP-NEXT: vpcomgtb %xmm3, %xmm1, %xmm42473; XOP-NEXT: vpcomgtb %xmm2, %xmm0, %xmm52474; XOP-NEXT: vpminsb %xmm2, %xmm0, %xmm62475; XOP-NEXT: vpmaxsb %xmm2, %xmm0, %xmm22476; XOP-NEXT: vpsubb %xmm6, %xmm2, %xmm22477; XOP-NEXT: vpminsb %xmm3, %xmm1, %xmm62478; XOP-NEXT: vpmaxsb %xmm3, %xmm1, %xmm32479; XOP-NEXT: vpsubb %xmm6, %xmm3, %xmm32480; XOP-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm62481; XOP-NEXT: vpshlb %xmm6, %xmm3, %xmm32482; XOP-NEXT: vpshlb %xmm6, %xmm2, %xmm22483; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2484; XOP-NEXT: vpor %xmm6, %xmm5, %xmm52485; XOP-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]2486; XOP-NEXT: vpandn %xmm5, %xmm7, %xmm82487; XOP-NEXT: vpmaddubsw %xmm8, %xmm2, %xmm82488; XOP-NEXT: vpmullw %xmm5, %xmm2, %xmm22489; XOP-NEXT: vmovdqa {{.*#+}} xmm5 = [0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30]2490; XOP-NEXT: vpperm %xmm5, %xmm8, %xmm2, %xmm22491; XOP-NEXT: vpor %xmm6, %xmm4, %xmm42492; XOP-NEXT: vpandn %xmm4, %xmm7, %xmm62493; XOP-NEXT: vpmaddubsw %xmm6, %xmm3, %xmm62494; XOP-NEXT: vpmullw %xmm4, %xmm3, %xmm32495; XOP-NEXT: vpperm %xmm5, %xmm6, %xmm3, %xmm32496; XOP-NEXT: vpaddb %xmm1, %xmm3, %xmm12497; XOP-NEXT: vpaddb %xmm0, %xmm2, %xmm02498; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02499; XOP-NEXT: retq2500;2501; AVX512F-LABEL: vec256_i8_signed_reg_mem:2502; AVX512F: # %bb.0:2503; AVX512F-NEXT: vmovdqa (%rdi), %ymm12504; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm22505; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22506; AVX512F-NEXT: vpminsb %ymm1, %ymm0, %ymm32507; AVX512F-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12508; AVX512F-NEXT: vpsubb %ymm3, %ymm1, %ymm12509; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm12510; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12511; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm32512; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2513; AVX512F-NEXT: vpand %ymm4, %ymm3, %ymm32514; AVX512F-NEXT: vpandn %ymm2, %ymm4, %ymm22515; AVX512F-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm12516; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm12517; AVX512F-NEXT: vpor %ymm1, %ymm3, %ymm12518; AVX512F-NEXT: vpaddb %ymm0, %ymm1, %ymm02519; AVX512F-NEXT: retq2520;2521; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_reg_mem:2522; AVX512VL-FALLBACK: # %bb.0:2523; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm12524; AVX512VL-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22525; AVX512VL-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm32526; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm3, %ymm22527; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm22528; AVX512VL-FALLBACK-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm12529; AVX512VL-FALLBACK-NEXT: vpternlogd {{.*#+}} ymm2 = ymm1 ^ (ymm2 & m32bcst)2530; AVX512VL-FALLBACK-NEXT: vpsubb %ymm1, %ymm2, %ymm12531; AVX512VL-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02532; AVX512VL-FALLBACK-NEXT: retq2533;2534; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_reg_mem:2535; AVX512BW-FALLBACK: # %bb.0:2536; AVX512BW-FALLBACK-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02537; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm12538; AVX512BW-FALLBACK-NEXT: vpcmpgtb %zmm1, %zmm0, %k12539; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm22540; AVX512BW-FALLBACK-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2541; AVX512BW-FALLBACK-NEXT: vmovdqu8 %zmm2, %zmm3 {%k1}2542; AVX512BW-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22543; AVX512BW-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12544; AVX512BW-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12545; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm12546; AVX512BW-FALLBACK-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12547; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero2548; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero2549; AVX512BW-FALLBACK-NEXT: vpmullw %zmm2, %zmm1, %zmm12550; AVX512BW-FALLBACK-NEXT: vpmovwb %zmm1, %ymm12551; AVX512BW-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02552; AVX512BW-FALLBACK-NEXT: retq2553;2554; AVX512VLBW-LABEL: vec256_i8_signed_reg_mem:2555; AVX512VLBW: # %bb.0:2556; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm12557; AVX512VLBW-NEXT: vpcmpgtb %ymm1, %ymm0, %k12558; AVX512VLBW-NEXT: vpminsb %ymm1, %ymm0, %ymm22559; AVX512VLBW-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12560; AVX512VLBW-NEXT: vpsubb %ymm2, %ymm1, %ymm12561; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm12562; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm12563; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm22564; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1 {%k1}2565; AVX512VLBW-NEXT: vpaddb %ymm0, %ymm1, %ymm02566; AVX512VLBW-NEXT: retq2567 %a2 = load <32 x i8>, ptr %a2_addr2568 %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed2569 %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2570 %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a12571 %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a22572 %t7 = sub <32 x i8> %t6, %t52573 %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2574 %t9 = mul nsw <32 x i8> %t8, %t4 ; signed2575 %a10 = add nsw <32 x i8> %t9, %a1 ; signed2576 ret <32 x i8> %a102577}2578 2579define <32 x i8> @vec256_i8_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {2580; AVX1-LABEL: vec256_i8_signed_mem_mem:2581; AVX1: # %bb.0:2582; AVX1-NEXT: vmovdqa (%rsi), %xmm02583; AVX1-NEXT: vmovdqa 16(%rsi), %xmm12584; AVX1-NEXT: vmovdqa (%rdi), %xmm22585; AVX1-NEXT: vmovdqa 16(%rdi), %xmm32586; AVX1-NEXT: vpcmpgtb %xmm1, %xmm3, %xmm42587; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm52588; AVX1-NEXT: vpminsb %xmm0, %xmm2, %xmm62589; AVX1-NEXT: vpmaxsb %xmm0, %xmm2, %xmm02590; AVX1-NEXT: vpsubb %xmm6, %xmm0, %xmm02591; AVX1-NEXT: vpminsb %xmm1, %xmm3, %xmm62592; AVX1-NEXT: vpmaxsb %xmm1, %xmm3, %xmm12593; AVX1-NEXT: vpsubb %xmm6, %xmm1, %xmm12594; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm12595; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]2596; AVX1-NEXT: vpand %xmm6, %xmm1, %xmm12597; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm02598; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm02599; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2600; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm52601; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm72602; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]2603; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm72604; AVX1-NEXT: vpandn %xmm5, %xmm8, %xmm52605; AVX1-NEXT: vpmaddubsw %xmm5, %xmm0, %xmm02606; AVX1-NEXT: vpsllw $8, %xmm0, %xmm02607; AVX1-NEXT: vpor %xmm0, %xmm7, %xmm02608; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm42609; AVX1-NEXT: vpmullw %xmm4, %xmm1, %xmm52610; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm52611; AVX1-NEXT: vpandn %xmm4, %xmm8, %xmm42612; AVX1-NEXT: vpmaddubsw %xmm4, %xmm1, %xmm12613; AVX1-NEXT: vpsllw $8, %xmm1, %xmm12614; AVX1-NEXT: vpor %xmm1, %xmm5, %xmm12615; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm12616; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm02617; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02618; AVX1-NEXT: retq2619;2620; AVX2-LABEL: vec256_i8_signed_mem_mem:2621; AVX2: # %bb.0:2622; AVX2-NEXT: vmovdqa (%rdi), %ymm02623; AVX2-NEXT: vmovdqa (%rsi), %ymm12624; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm22625; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22626; AVX2-NEXT: vpminsb %ymm1, %ymm0, %ymm32627; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12628; AVX2-NEXT: vpsubb %ymm3, %ymm1, %ymm12629; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm12630; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12631; AVX2-NEXT: vpmullw %ymm2, %ymm1, %ymm32632; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2633; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm32634; AVX2-NEXT: vpandn %ymm2, %ymm4, %ymm22635; AVX2-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm12636; AVX2-NEXT: vpsllw $8, %ymm1, %ymm12637; AVX2-NEXT: vpor %ymm1, %ymm3, %ymm12638; AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm02639; AVX2-NEXT: retq2640;2641; XOP-LABEL: vec256_i8_signed_mem_mem:2642; XOP: # %bb.0:2643; XOP-NEXT: vmovdqa (%rsi), %xmm02644; XOP-NEXT: vmovdqa 16(%rsi), %xmm12645; XOP-NEXT: vmovdqa (%rdi), %xmm22646; XOP-NEXT: vmovdqa 16(%rdi), %xmm32647; XOP-NEXT: vpcomgtb %xmm1, %xmm3, %xmm42648; XOP-NEXT: vpcomgtb %xmm0, %xmm2, %xmm52649; XOP-NEXT: vpminsb %xmm0, %xmm2, %xmm62650; XOP-NEXT: vpmaxsb %xmm0, %xmm2, %xmm02651; XOP-NEXT: vpsubb %xmm6, %xmm0, %xmm02652; XOP-NEXT: vpminsb %xmm1, %xmm3, %xmm62653; XOP-NEXT: vpmaxsb %xmm1, %xmm3, %xmm12654; XOP-NEXT: vpsubb %xmm6, %xmm1, %xmm12655; XOP-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm62656; XOP-NEXT: vpshlb %xmm6, %xmm1, %xmm12657; XOP-NEXT: vpshlb %xmm6, %xmm0, %xmm02658; XOP-NEXT: vbroadcastss {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2659; XOP-NEXT: vpor %xmm6, %xmm5, %xmm52660; XOP-NEXT: vbroadcastss {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]2661; XOP-NEXT: vpandn %xmm5, %xmm7, %xmm82662; XOP-NEXT: vpmaddubsw %xmm8, %xmm0, %xmm82663; XOP-NEXT: vpmullw %xmm5, %xmm0, %xmm02664; XOP-NEXT: vmovdqa {{.*#+}} xmm5 = [0,16,2,18,4,20,6,22,8,24,10,26,12,28,14,30]2665; XOP-NEXT: vpperm %xmm5, %xmm8, %xmm0, %xmm02666; XOP-NEXT: vpor %xmm6, %xmm4, %xmm42667; XOP-NEXT: vpandn %xmm4, %xmm7, %xmm62668; XOP-NEXT: vpmaddubsw %xmm6, %xmm1, %xmm62669; XOP-NEXT: vpmullw %xmm4, %xmm1, %xmm12670; XOP-NEXT: vpperm %xmm5, %xmm6, %xmm1, %xmm12671; XOP-NEXT: vpaddb %xmm3, %xmm1, %xmm12672; XOP-NEXT: vpaddb %xmm2, %xmm0, %xmm02673; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02674; XOP-NEXT: retq2675;2676; AVX512F-LABEL: vec256_i8_signed_mem_mem:2677; AVX512F: # %bb.0:2678; AVX512F-NEXT: vmovdqa (%rdi), %ymm02679; AVX512F-NEXT: vmovdqa (%rsi), %ymm12680; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm22681; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22682; AVX512F-NEXT: vpminsb %ymm1, %ymm0, %ymm32683; AVX512F-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12684; AVX512F-NEXT: vpsubb %ymm3, %ymm1, %ymm12685; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm12686; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12687; AVX512F-NEXT: vpmullw %ymm2, %ymm1, %ymm32688; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2689; AVX512F-NEXT: vpand %ymm4, %ymm3, %ymm32690; AVX512F-NEXT: vpandn %ymm2, %ymm4, %ymm22691; AVX512F-NEXT: vpmaddubsw %ymm2, %ymm1, %ymm12692; AVX512F-NEXT: vpsllw $8, %ymm1, %ymm12693; AVX512F-NEXT: vpor %ymm1, %ymm3, %ymm12694; AVX512F-NEXT: vpaddb %ymm0, %ymm1, %ymm02695; AVX512F-NEXT: retq2696;2697; AVX512VL-FALLBACK-LABEL: vec256_i8_signed_mem_mem:2698; AVX512VL-FALLBACK: # %bb.0:2699; AVX512VL-FALLBACK-NEXT: vmovdqa (%rdi), %ymm02700; AVX512VL-FALLBACK-NEXT: vmovdqa (%rsi), %ymm12701; AVX512VL-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22702; AVX512VL-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm32703; AVX512VL-FALLBACK-NEXT: vpsubb %ymm2, %ymm3, %ymm22704; AVX512VL-FALLBACK-NEXT: vpsrlw $1, %ymm2, %ymm22705; AVX512VL-FALLBACK-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm12706; AVX512VL-FALLBACK-NEXT: vpternlogd {{.*#+}} ymm2 = ymm1 ^ (ymm2 & m32bcst)2707; AVX512VL-FALLBACK-NEXT: vpsubb %ymm1, %ymm2, %ymm12708; AVX512VL-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02709; AVX512VL-FALLBACK-NEXT: retq2710;2711; AVX512BW-FALLBACK-LABEL: vec256_i8_signed_mem_mem:2712; AVX512BW-FALLBACK: # %bb.0:2713; AVX512BW-FALLBACK-NEXT: vmovdqa (%rdi), %ymm02714; AVX512BW-FALLBACK-NEXT: vmovdqa (%rsi), %ymm12715; AVX512BW-FALLBACK-NEXT: vpcmpgtb %zmm1, %zmm0, %k12716; AVX512BW-FALLBACK-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm22717; AVX512BW-FALLBACK-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2718; AVX512BW-FALLBACK-NEXT: vmovdqu8 %zmm2, %zmm3 {%k1}2719; AVX512BW-FALLBACK-NEXT: vpminsb %ymm1, %ymm0, %ymm22720; AVX512BW-FALLBACK-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12721; AVX512BW-FALLBACK-NEXT: vpsubb %ymm2, %ymm1, %ymm12722; AVX512BW-FALLBACK-NEXT: vpsrlw $1, %ymm1, %ymm12723; AVX512BW-FALLBACK-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12724; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero2725; AVX512BW-FALLBACK-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero2726; AVX512BW-FALLBACK-NEXT: vpmullw %zmm2, %zmm1, %zmm12727; AVX512BW-FALLBACK-NEXT: vpmovwb %zmm1, %ymm12728; AVX512BW-FALLBACK-NEXT: vpaddb %ymm0, %ymm1, %ymm02729; AVX512BW-FALLBACK-NEXT: retq2730;2731; AVX512VLBW-LABEL: vec256_i8_signed_mem_mem:2732; AVX512VLBW: # %bb.0:2733; AVX512VLBW-NEXT: vmovdqa (%rdi), %ymm02734; AVX512VLBW-NEXT: vmovdqa (%rsi), %ymm12735; AVX512VLBW-NEXT: vpcmpgtb %ymm1, %ymm0, %k12736; AVX512VLBW-NEXT: vpminsb %ymm1, %ymm0, %ymm22737; AVX512VLBW-NEXT: vpmaxsb %ymm1, %ymm0, %ymm12738; AVX512VLBW-NEXT: vpsubb %ymm2, %ymm1, %ymm12739; AVX512VLBW-NEXT: vpsrlw $1, %ymm1, %ymm12740; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm12741; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm22742; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1 {%k1}2743; AVX512VLBW-NEXT: vpaddb %ymm0, %ymm1, %ymm02744; AVX512VLBW-NEXT: retq2745 %a1 = load <32 x i8>, ptr %a1_addr2746 %a2 = load <32 x i8>, ptr %a2_addr2747 %t3 = icmp sgt <32 x i8> %a1, %a2 ; signed2748 %t4 = select <32 x i1> %t3, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2749 %t5 = select <32 x i1> %t3, <32 x i8> %a2, <32 x i8> %a12750 %t6 = select <32 x i1> %t3, <32 x i8> %a1, <32 x i8> %a22751 %t7 = sub <32 x i8> %t6, %t52752 %t8 = lshr <32 x i8> %t7, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2753 %t9 = mul nsw <32 x i8> %t8, %t4 ; signed2754 %a10 = add nsw <32 x i8> %t9, %a1 ; signed2755 ret <32 x i8> %a102756}2757