568 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512BW3; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512F-324 5; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/avx512bw-builtins.c6 7;8; Signed Saturation9;10 11define <32 x i16> @test_mask_adds_epi16_rr_512(<32 x i16> %a, <32 x i16> %b) {12; AVX512BW-LABEL: test_mask_adds_epi16_rr_512:13; AVX512BW: ## %bb.0:14; AVX512BW-NEXT: vpaddsw %zmm1, %zmm0, %zmm015; AVX512BW-NEXT: retq16;17; AVX512F-32-LABEL: test_mask_adds_epi16_rr_512:18; AVX512F-32: # %bb.0:19; AVX512F-32-NEXT: vpaddsw %zmm1, %zmm0, %zmm020; AVX512F-32-NEXT: retl21 %res = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)22 ret <32 x i16> %res23}24declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>)25 26define <32 x i16> @test_mask_adds_epi16_rrk_512(<32 x i16> %a, <32 x i16> %b, <32 x i16> %passThru, i32 %mask) {27; AVX512BW-LABEL: test_mask_adds_epi16_rrk_512:28; AVX512BW: ## %bb.0:29; AVX512BW-NEXT: kmovd %edi, %k130; AVX512BW-NEXT: vpaddsw %zmm1, %zmm0, %zmm2 {%k1}31; AVX512BW-NEXT: vmovdqa64 %zmm2, %zmm032; AVX512BW-NEXT: retq33;34; AVX512F-32-LABEL: test_mask_adds_epi16_rrk_512:35; AVX512F-32: # %bb.0:36; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k137; AVX512F-32-NEXT: vpaddsw %zmm1, %zmm0, %zmm2 {%k1}38; AVX512F-32-NEXT: vmovdqa64 %zmm2, %zmm039; AVX512F-32-NEXT: retl40 %1 = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)41 %2 = bitcast i32 %mask to <32 x i1>42 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> %passThru43 ret <32 x i16> %344}45 46define <32 x i16> @test_mask_adds_epi16_rrkz_512(<32 x i16> %a, <32 x i16> %b, i32 %mask) {47; AVX512BW-LABEL: test_mask_adds_epi16_rrkz_512:48; AVX512BW: ## %bb.0:49; AVX512BW-NEXT: kmovd %edi, %k150; AVX512BW-NEXT: vpaddsw %zmm1, %zmm0, %zmm0 {%k1} {z}51; AVX512BW-NEXT: retq52;53; AVX512F-32-LABEL: test_mask_adds_epi16_rrkz_512:54; AVX512F-32: # %bb.0:55; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k156; AVX512F-32-NEXT: vpaddsw %zmm1, %zmm0, %zmm0 {%k1} {z}57; AVX512F-32-NEXT: retl58 %1 = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)59 %2 = bitcast i32 %mask to <32 x i1>60 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> zeroinitializer61 ret <32 x i16> %362}63 64define <32 x i16> @test_mask_adds_epi16_rm_512(<32 x i16> %a, ptr %ptr_b) {65; AVX512BW-LABEL: test_mask_adds_epi16_rm_512:66; AVX512BW: ## %bb.0:67; AVX512BW-NEXT: vpaddsw (%rdi), %zmm0, %zmm068; AVX512BW-NEXT: retq69;70; AVX512F-32-LABEL: test_mask_adds_epi16_rm_512:71; AVX512F-32: # %bb.0:72; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax73; AVX512F-32-NEXT: vpaddsw (%eax), %zmm0, %zmm074; AVX512F-32-NEXT: retl75 %b = load <32 x i16>, ptr %ptr_b76 %1 = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)77 ret <32 x i16> %178}79 80define <32 x i16> @test_mask_adds_epi16_rmk_512(<32 x i16> %a, ptr %ptr_b, <32 x i16> %passThru, i32 %mask) {81; AVX512BW-LABEL: test_mask_adds_epi16_rmk_512:82; AVX512BW: ## %bb.0:83; AVX512BW-NEXT: kmovd %esi, %k184; AVX512BW-NEXT: vpaddsw (%rdi), %zmm0, %zmm1 {%k1}85; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm086; AVX512BW-NEXT: retq87;88; AVX512F-32-LABEL: test_mask_adds_epi16_rmk_512:89; AVX512F-32: # %bb.0:90; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax91; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k192; AVX512F-32-NEXT: vpaddsw (%eax), %zmm0, %zmm1 {%k1}93; AVX512F-32-NEXT: vmovdqa64 %zmm1, %zmm094; AVX512F-32-NEXT: retl95 %b = load <32 x i16>, ptr %ptr_b96 %1 = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)97 %2 = bitcast i32 %mask to <32 x i1>98 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> %passThru99 ret <32 x i16> %3100}101 102define <32 x i16> @test_mask_adds_epi16_rmkz_512(<32 x i16> %a, ptr %ptr_b, i32 %mask) {103; AVX512BW-LABEL: test_mask_adds_epi16_rmkz_512:104; AVX512BW: ## %bb.0:105; AVX512BW-NEXT: kmovd %esi, %k1106; AVX512BW-NEXT: vpaddsw (%rdi), %zmm0, %zmm0 {%k1} {z}107; AVX512BW-NEXT: retq108;109; AVX512F-32-LABEL: test_mask_adds_epi16_rmkz_512:110; AVX512F-32: # %bb.0:111; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax112; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1113; AVX512F-32-NEXT: vpaddsw (%eax), %zmm0, %zmm0 {%k1} {z}114; AVX512F-32-NEXT: retl115 %b = load <32 x i16>, ptr %ptr_b116 %1 = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)117 %2 = bitcast i32 %mask to <32 x i1>118 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> zeroinitializer119 ret <32 x i16> %3120}121 122define <32 x i16> @test_mask_subs_epi16_rr_512(<32 x i16> %a, <32 x i16> %b) {123; AVX512BW-LABEL: test_mask_subs_epi16_rr_512:124; AVX512BW: ## %bb.0:125; AVX512BW-NEXT: vpsubsw %zmm1, %zmm0, %zmm0126; AVX512BW-NEXT: retq127;128; AVX512F-32-LABEL: test_mask_subs_epi16_rr_512:129; AVX512F-32: # %bb.0:130; AVX512F-32-NEXT: vpsubsw %zmm1, %zmm0, %zmm0131; AVX512F-32-NEXT: retl132 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)133 ret <32 x i16> %sub134}135declare <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16>, <32 x i16>)136 137define <32 x i16> @test_mask_subs_epi16_rrk_512(<32 x i16> %a, <32 x i16> %b, <32 x i16> %passThru, i32 %mask) {138; AVX512BW-LABEL: test_mask_subs_epi16_rrk_512:139; AVX512BW: ## %bb.0:140; AVX512BW-NEXT: kmovd %edi, %k1141; AVX512BW-NEXT: vpsubsw %zmm1, %zmm0, %zmm2 {%k1}142; AVX512BW-NEXT: vmovdqa64 %zmm2, %zmm0143; AVX512BW-NEXT: retq144;145; AVX512F-32-LABEL: test_mask_subs_epi16_rrk_512:146; AVX512F-32: # %bb.0:147; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1148; AVX512F-32-NEXT: vpsubsw %zmm1, %zmm0, %zmm2 {%k1}149; AVX512F-32-NEXT: vmovdqa64 %zmm2, %zmm0150; AVX512F-32-NEXT: retl151 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)152 %bc = bitcast i32 %mask to <32 x i1>153 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> %passThru154 ret <32 x i16> %res155}156 157define <32 x i16> @test_mask_subs_epi16_rrkz_512(<32 x i16> %a, <32 x i16> %b, i32 %mask) {158; AVX512BW-LABEL: test_mask_subs_epi16_rrkz_512:159; AVX512BW: ## %bb.0:160; AVX512BW-NEXT: kmovd %edi, %k1161; AVX512BW-NEXT: vpsubsw %zmm1, %zmm0, %zmm0 {%k1} {z}162; AVX512BW-NEXT: retq163;164; AVX512F-32-LABEL: test_mask_subs_epi16_rrkz_512:165; AVX512F-32: # %bb.0:166; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1167; AVX512F-32-NEXT: vpsubsw %zmm1, %zmm0, %zmm0 {%k1} {z}168; AVX512F-32-NEXT: retl169 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)170 %bc = bitcast i32 %mask to <32 x i1>171 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> zeroinitializer172 ret <32 x i16> %res173}174 175define <32 x i16> @test_mask_subs_epi16_rm_512(<32 x i16> %a, ptr %ptr_b) {176; AVX512BW-LABEL: test_mask_subs_epi16_rm_512:177; AVX512BW: ## %bb.0:178; AVX512BW-NEXT: vpsubsw (%rdi), %zmm0, %zmm0179; AVX512BW-NEXT: retq180;181; AVX512F-32-LABEL: test_mask_subs_epi16_rm_512:182; AVX512F-32: # %bb.0:183; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax184; AVX512F-32-NEXT: vpsubsw (%eax), %zmm0, %zmm0185; AVX512F-32-NEXT: retl186 %b = load <32 x i16>, ptr %ptr_b187 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)188 ret <32 x i16> %sub189}190 191define <32 x i16> @test_mask_subs_epi16_rmk_512(<32 x i16> %a, ptr %ptr_b, <32 x i16> %passThru, i32 %mask) {192; AVX512BW-LABEL: test_mask_subs_epi16_rmk_512:193; AVX512BW: ## %bb.0:194; AVX512BW-NEXT: kmovd %esi, %k1195; AVX512BW-NEXT: vpsubsw (%rdi), %zmm0, %zmm1 {%k1}196; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm0197; AVX512BW-NEXT: retq198;199; AVX512F-32-LABEL: test_mask_subs_epi16_rmk_512:200; AVX512F-32: # %bb.0:201; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax202; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1203; AVX512F-32-NEXT: vpsubsw (%eax), %zmm0, %zmm1 {%k1}204; AVX512F-32-NEXT: vmovdqa64 %zmm1, %zmm0205; AVX512F-32-NEXT: retl206 %b = load <32 x i16>, ptr %ptr_b207 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)208 %bc = bitcast i32 %mask to <32 x i1>209 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> %passThru210 ret <32 x i16> %res211}212 213define <32 x i16> @test_mask_subs_epi16_rmkz_512(<32 x i16> %a, ptr %ptr_b, i32 %mask) {214; AVX512BW-LABEL: test_mask_subs_epi16_rmkz_512:215; AVX512BW: ## %bb.0:216; AVX512BW-NEXT: kmovd %esi, %k1217; AVX512BW-NEXT: vpsubsw (%rdi), %zmm0, %zmm0 {%k1} {z}218; AVX512BW-NEXT: retq219;220; AVX512F-32-LABEL: test_mask_subs_epi16_rmkz_512:221; AVX512F-32: # %bb.0:222; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax223; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1224; AVX512F-32-NEXT: vpsubsw (%eax), %zmm0, %zmm0 {%k1} {z}225; AVX512F-32-NEXT: retl226 %b = load <32 x i16>, ptr %ptr_b227 %sub = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)228 %bc = bitcast i32 %mask to <32 x i1>229 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> zeroinitializer230 ret <32 x i16> %res231}232 233 234define <64 x i16> @test_mask_adds_epi16_rr_1024(<64 x i16> %a, <64 x i16> %b) {235; AVX512BW-LABEL: test_mask_adds_epi16_rr_1024:236; AVX512BW: ## %bb.0:237; AVX512BW-NEXT: vpaddsw %zmm2, %zmm0, %zmm0238; AVX512BW-NEXT: vpaddsw %zmm3, %zmm1, %zmm1239; AVX512BW-NEXT: retq240;241; AVX512F-32-LABEL: test_mask_adds_epi16_rr_1024:242; AVX512F-32: # %bb.0:243; AVX512F-32-NEXT: pushl %ebp244; AVX512F-32-NEXT: .cfi_def_cfa_offset 8245; AVX512F-32-NEXT: .cfi_offset %ebp, -8246; AVX512F-32-NEXT: movl %esp, %ebp247; AVX512F-32-NEXT: .cfi_def_cfa_register %ebp248; AVX512F-32-NEXT: andl $-64, %esp249; AVX512F-32-NEXT: subl $64, %esp250; AVX512F-32-NEXT: vpaddsw %zmm2, %zmm0, %zmm0251; AVX512F-32-NEXT: vpaddsw 8(%ebp), %zmm1, %zmm1252; AVX512F-32-NEXT: movl %ebp, %esp253; AVX512F-32-NEXT: popl %ebp254; AVX512F-32-NEXT: .cfi_def_cfa %esp, 4255; AVX512F-32-NEXT: retl256 %1 = call <64 x i16> @llvm.sadd.sat.v64i16(<64 x i16> %a, <64 x i16> %b)257 ret <64 x i16> %1258}259declare <64 x i16> @llvm.sadd.sat.v64i16(<64 x i16>, <64 x i16>)260 261define <64 x i16> @test_mask_subs_epi16_rr_1024(<64 x i16> %a, <64 x i16> %b) {262; AVX512BW-LABEL: test_mask_subs_epi16_rr_1024:263; AVX512BW: ## %bb.0:264; AVX512BW-NEXT: vpsubsw %zmm2, %zmm0, %zmm0265; AVX512BW-NEXT: vpsubsw %zmm3, %zmm1, %zmm1266; AVX512BW-NEXT: retq267;268; AVX512F-32-LABEL: test_mask_subs_epi16_rr_1024:269; AVX512F-32: # %bb.0:270; AVX512F-32-NEXT: pushl %ebp271; AVX512F-32-NEXT: .cfi_def_cfa_offset 8272; AVX512F-32-NEXT: .cfi_offset %ebp, -8273; AVX512F-32-NEXT: movl %esp, %ebp274; AVX512F-32-NEXT: .cfi_def_cfa_register %ebp275; AVX512F-32-NEXT: andl $-64, %esp276; AVX512F-32-NEXT: subl $64, %esp277; AVX512F-32-NEXT: vpsubsw %zmm2, %zmm0, %zmm0278; AVX512F-32-NEXT: vpsubsw 8(%ebp), %zmm1, %zmm1279; AVX512F-32-NEXT: movl %ebp, %esp280; AVX512F-32-NEXT: popl %ebp281; AVX512F-32-NEXT: .cfi_def_cfa %esp, 4282; AVX512F-32-NEXT: retl283 %sub = call <64 x i16> @llvm.ssub.sat.v64i16(<64 x i16> %a, <64 x i16> %b)284 ret <64 x i16> %sub285}286declare <64 x i16> @llvm.ssub.sat.v64i16(<64 x i16>, <64 x i16>);287 288;289; Unsigned Saturation290;291 292define <32 x i16> @test_mask_adds_epu16_rr_512(<32 x i16> %a, <32 x i16> %b) {293; AVX512BW-LABEL: test_mask_adds_epu16_rr_512:294; AVX512BW: ## %bb.0:295; AVX512BW-NEXT: vpaddusw %zmm1, %zmm0, %zmm0296; AVX512BW-NEXT: retq297;298; AVX512F-32-LABEL: test_mask_adds_epu16_rr_512:299; AVX512F-32: # %bb.0:300; AVX512F-32-NEXT: vpaddusw %zmm1, %zmm0, %zmm0301; AVX512F-32-NEXT: retl302 %res = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)303 ret <32 x i16> %res304}305declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)306 307define <32 x i16> @test_mask_adds_epu16_rrk_512(<32 x i16> %a, <32 x i16> %b, <32 x i16> %passThru, i32 %mask) {308; AVX512BW-LABEL: test_mask_adds_epu16_rrk_512:309; AVX512BW: ## %bb.0:310; AVX512BW-NEXT: kmovd %edi, %k1311; AVX512BW-NEXT: vpaddusw %zmm1, %zmm0, %zmm2 {%k1}312; AVX512BW-NEXT: vmovdqa64 %zmm2, %zmm0313; AVX512BW-NEXT: retq314;315; AVX512F-32-LABEL: test_mask_adds_epu16_rrk_512:316; AVX512F-32: # %bb.0:317; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1318; AVX512F-32-NEXT: vpaddusw %zmm1, %zmm0, %zmm2 {%k1}319; AVX512F-32-NEXT: vmovdqa64 %zmm2, %zmm0320; AVX512F-32-NEXT: retl321 %1 = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)322 %2 = bitcast i32 %mask to <32 x i1>323 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> %passThru324 ret <32 x i16> %3325}326 327define <32 x i16> @test_mask_adds_epu16_rrkz_512(<32 x i16> %a, <32 x i16> %b, i32 %mask) {328; AVX512BW-LABEL: test_mask_adds_epu16_rrkz_512:329; AVX512BW: ## %bb.0:330; AVX512BW-NEXT: kmovd %edi, %k1331; AVX512BW-NEXT: vpaddusw %zmm1, %zmm0, %zmm0 {%k1} {z}332; AVX512BW-NEXT: retq333;334; AVX512F-32-LABEL: test_mask_adds_epu16_rrkz_512:335; AVX512F-32: # %bb.0:336; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1337; AVX512F-32-NEXT: vpaddusw %zmm1, %zmm0, %zmm0 {%k1} {z}338; AVX512F-32-NEXT: retl339 %1 = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)340 %2 = bitcast i32 %mask to <32 x i1>341 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> zeroinitializer342 ret <32 x i16> %3343}344 345define <32 x i16> @test_mask_adds_epu16_rm_512(<32 x i16> %a, ptr %ptr_b) {346; AVX512BW-LABEL: test_mask_adds_epu16_rm_512:347; AVX512BW: ## %bb.0:348; AVX512BW-NEXT: vpaddusw (%rdi), %zmm0, %zmm0349; AVX512BW-NEXT: retq350;351; AVX512F-32-LABEL: test_mask_adds_epu16_rm_512:352; AVX512F-32: # %bb.0:353; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax354; AVX512F-32-NEXT: vpaddusw (%eax), %zmm0, %zmm0355; AVX512F-32-NEXT: retl356 %b = load <32 x i16>, ptr %ptr_b357 %1 = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)358 ret <32 x i16> %1359}360 361define <32 x i16> @test_mask_adds_epu16_rmk_512(<32 x i16> %a, ptr %ptr_b, <32 x i16> %passThru, i32 %mask) {362; AVX512BW-LABEL: test_mask_adds_epu16_rmk_512:363; AVX512BW: ## %bb.0:364; AVX512BW-NEXT: kmovd %esi, %k1365; AVX512BW-NEXT: vpaddusw (%rdi), %zmm0, %zmm1 {%k1}366; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm0367; AVX512BW-NEXT: retq368;369; AVX512F-32-LABEL: test_mask_adds_epu16_rmk_512:370; AVX512F-32: # %bb.0:371; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax372; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1373; AVX512F-32-NEXT: vpaddusw (%eax), %zmm0, %zmm1 {%k1}374; AVX512F-32-NEXT: vmovdqa64 %zmm1, %zmm0375; AVX512F-32-NEXT: retl376 %b = load <32 x i16>, ptr %ptr_b377 %1 = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)378 %2 = bitcast i32 %mask to <32 x i1>379 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> %passThru380 ret <32 x i16> %3381}382 383define <32 x i16> @test_mask_adds_epu16_rmkz_512(<32 x i16> %a, ptr %ptr_b, i32 %mask) {384; AVX512BW-LABEL: test_mask_adds_epu16_rmkz_512:385; AVX512BW: ## %bb.0:386; AVX512BW-NEXT: kmovd %esi, %k1387; AVX512BW-NEXT: vpaddusw (%rdi), %zmm0, %zmm0 {%k1} {z}388; AVX512BW-NEXT: retq389;390; AVX512F-32-LABEL: test_mask_adds_epu16_rmkz_512:391; AVX512F-32: # %bb.0:392; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax393; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1394; AVX512F-32-NEXT: vpaddusw (%eax), %zmm0, %zmm0 {%k1} {z}395; AVX512F-32-NEXT: retl396 %b = load <32 x i16>, ptr %ptr_b397 %1 = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %a, <32 x i16> %b)398 %2 = bitcast i32 %mask to <32 x i1>399 %3 = select <32 x i1> %2, <32 x i16> %1, <32 x i16> zeroinitializer400 ret <32 x i16> %3401}402 403define <32 x i16> @test_mask_subs_epu16_rr_512(<32 x i16> %a, <32 x i16> %b) {404; AVX512BW-LABEL: test_mask_subs_epu16_rr_512:405; AVX512BW: ## %bb.0:406; AVX512BW-NEXT: vpsubusw %zmm1, %zmm0, %zmm0407; AVX512BW-NEXT: retq408;409; AVX512F-32-LABEL: test_mask_subs_epu16_rr_512:410; AVX512F-32: # %bb.0:411; AVX512F-32-NEXT: vpsubusw %zmm1, %zmm0, %zmm0412; AVX512F-32-NEXT: retl413 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)414 ret <32 x i16> %sub415}416declare <32 x i16> @llvm.usub.sat.v32i16(<32 x i16>, <32 x i16>)417 418define <32 x i16> @test_mask_subs_epu16_rrk_512(<32 x i16> %a, <32 x i16> %b, <32 x i16> %passThru, i32 %mask) {419; AVX512BW-LABEL: test_mask_subs_epu16_rrk_512:420; AVX512BW: ## %bb.0:421; AVX512BW-NEXT: kmovd %edi, %k1422; AVX512BW-NEXT: vpsubusw %zmm1, %zmm0, %zmm2 {%k1}423; AVX512BW-NEXT: vmovdqa64 %zmm2, %zmm0424; AVX512BW-NEXT: retq425;426; AVX512F-32-LABEL: test_mask_subs_epu16_rrk_512:427; AVX512F-32: # %bb.0:428; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1429; AVX512F-32-NEXT: vpsubusw %zmm1, %zmm0, %zmm2 {%k1}430; AVX512F-32-NEXT: vmovdqa64 %zmm2, %zmm0431; AVX512F-32-NEXT: retl432 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)433 %bc = bitcast i32 %mask to <32 x i1>434 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> %passThru435 ret <32 x i16> %res436}437 438define <32 x i16> @test_mask_subs_epu16_rrkz_512(<32 x i16> %a, <32 x i16> %b, i32 %mask) {439; AVX512BW-LABEL: test_mask_subs_epu16_rrkz_512:440; AVX512BW: ## %bb.0:441; AVX512BW-NEXT: kmovd %edi, %k1442; AVX512BW-NEXT: vpsubusw %zmm1, %zmm0, %zmm0 {%k1} {z}443; AVX512BW-NEXT: retq444;445; AVX512F-32-LABEL: test_mask_subs_epu16_rrkz_512:446; AVX512F-32: # %bb.0:447; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1448; AVX512F-32-NEXT: vpsubusw %zmm1, %zmm0, %zmm0 {%k1} {z}449; AVX512F-32-NEXT: retl450 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)451 %bc = bitcast i32 %mask to <32 x i1>452 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> zeroinitializer453 ret <32 x i16> %res454}455 456define <32 x i16> @test_mask_subs_epu16_rm_512(<32 x i16> %a, ptr %ptr_b) {457; AVX512BW-LABEL: test_mask_subs_epu16_rm_512:458; AVX512BW: ## %bb.0:459; AVX512BW-NEXT: vpsubusw (%rdi), %zmm0, %zmm0460; AVX512BW-NEXT: retq461;462; AVX512F-32-LABEL: test_mask_subs_epu16_rm_512:463; AVX512F-32: # %bb.0:464; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax465; AVX512F-32-NEXT: vpsubusw (%eax), %zmm0, %zmm0466; AVX512F-32-NEXT: retl467 %b = load <32 x i16>, ptr %ptr_b468 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)469 ret <32 x i16> %sub470}471 472define <32 x i16> @test_mask_subs_epu16_rmk_512(<32 x i16> %a, ptr %ptr_b, <32 x i16> %passThru, i32 %mask) {473; AVX512BW-LABEL: test_mask_subs_epu16_rmk_512:474; AVX512BW: ## %bb.0:475; AVX512BW-NEXT: kmovd %esi, %k1476; AVX512BW-NEXT: vpsubusw (%rdi), %zmm0, %zmm1 {%k1}477; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm0478; AVX512BW-NEXT: retq479;480; AVX512F-32-LABEL: test_mask_subs_epu16_rmk_512:481; AVX512F-32: # %bb.0:482; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax483; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1484; AVX512F-32-NEXT: vpsubusw (%eax), %zmm0, %zmm1 {%k1}485; AVX512F-32-NEXT: vmovdqa64 %zmm1, %zmm0486; AVX512F-32-NEXT: retl487 %b = load <32 x i16>, ptr %ptr_b488 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)489 %bc = bitcast i32 %mask to <32 x i1>490 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> %passThru491 ret <32 x i16> %res492}493 494define <32 x i16> @test_mask_subs_epu16_rmkz_512(<32 x i16> %a, ptr %ptr_b, i32 %mask) {495; AVX512BW-LABEL: test_mask_subs_epu16_rmkz_512:496; AVX512BW: ## %bb.0:497; AVX512BW-NEXT: kmovd %esi, %k1498; AVX512BW-NEXT: vpsubusw (%rdi), %zmm0, %zmm0 {%k1} {z}499; AVX512BW-NEXT: retq500;501; AVX512F-32-LABEL: test_mask_subs_epu16_rmkz_512:502; AVX512F-32: # %bb.0:503; AVX512F-32-NEXT: movl {{[0-9]+}}(%esp), %eax504; AVX512F-32-NEXT: kmovd {{[0-9]+}}(%esp), %k1505; AVX512F-32-NEXT: vpsubusw (%eax), %zmm0, %zmm0 {%k1} {z}506; AVX512F-32-NEXT: retl507 %b = load <32 x i16>, ptr %ptr_b508 %sub = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %a, <32 x i16> %b)509 %bc = bitcast i32 %mask to <32 x i1>510 %res = select <32 x i1> %bc, <32 x i16> %sub, <32 x i16> zeroinitializer511 ret <32 x i16> %res512}513 514 515define <64 x i16> @test_mask_adds_epu16_rr_1024(<64 x i16> %a, <64 x i16> %b) {516; AVX512BW-LABEL: test_mask_adds_epu16_rr_1024:517; AVX512BW: ## %bb.0:518; AVX512BW-NEXT: vpaddusw %zmm2, %zmm0, %zmm0519; AVX512BW-NEXT: vpaddusw %zmm3, %zmm1, %zmm1520; AVX512BW-NEXT: retq521;522; AVX512F-32-LABEL: test_mask_adds_epu16_rr_1024:523; AVX512F-32: # %bb.0:524; AVX512F-32-NEXT: pushl %ebp525; AVX512F-32-NEXT: .cfi_def_cfa_offset 8526; AVX512F-32-NEXT: .cfi_offset %ebp, -8527; AVX512F-32-NEXT: movl %esp, %ebp528; AVX512F-32-NEXT: .cfi_def_cfa_register %ebp529; AVX512F-32-NEXT: andl $-64, %esp530; AVX512F-32-NEXT: subl $64, %esp531; AVX512F-32-NEXT: vpaddusw %zmm2, %zmm0, %zmm0532; AVX512F-32-NEXT: vpaddusw 8(%ebp), %zmm1, %zmm1533; AVX512F-32-NEXT: movl %ebp, %esp534; AVX512F-32-NEXT: popl %ebp535; AVX512F-32-NEXT: .cfi_def_cfa %esp, 4536; AVX512F-32-NEXT: retl537 %1 = call <64 x i16> @llvm.uadd.sat.v64i16(<64 x i16> %a, <64 x i16> %b)538 ret <64 x i16> %1539}540declare <64 x i16> @llvm.uadd.sat.v64i16(<64 x i16>, <64 x i16>)541 542define <64 x i16> @test_mask_subs_epu16_rr_1024(<64 x i16> %a, <64 x i16> %b) {543; AVX512BW-LABEL: test_mask_subs_epu16_rr_1024:544; AVX512BW: ## %bb.0:545; AVX512BW-NEXT: vpsubusw %zmm2, %zmm0, %zmm0546; AVX512BW-NEXT: vpsubusw %zmm3, %zmm1, %zmm1547; AVX512BW-NEXT: retq548;549; AVX512F-32-LABEL: test_mask_subs_epu16_rr_1024:550; AVX512F-32: # %bb.0:551; AVX512F-32-NEXT: pushl %ebp552; AVX512F-32-NEXT: .cfi_def_cfa_offset 8553; AVX512F-32-NEXT: .cfi_offset %ebp, -8554; AVX512F-32-NEXT: movl %esp, %ebp555; AVX512F-32-NEXT: .cfi_def_cfa_register %ebp556; AVX512F-32-NEXT: andl $-64, %esp557; AVX512F-32-NEXT: subl $64, %esp558; AVX512F-32-NEXT: vpsubusw %zmm2, %zmm0, %zmm0559; AVX512F-32-NEXT: vpsubusw 8(%ebp), %zmm1, %zmm1560; AVX512F-32-NEXT: movl %ebp, %esp561; AVX512F-32-NEXT: popl %ebp562; AVX512F-32-NEXT: .cfi_def_cfa %esp, 4563; AVX512F-32-NEXT: retl564 %sub = call <64 x i16> @llvm.usub.sat.v64i16(<64 x i16> %a, <64 x i16> %b)565 ret <64 x i16> %sub566}567declare <64 x i16> @llvm.usub.sat.v64i16(<64 x i16>, <64 x i16>)568