brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.5 KiB · 21ae182 Raw
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