562 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX,AVX5127 8 9; PR66191 - movmsk msb bit extraction10 11define i32 @movmsk_eq_v2i64_0(<2 x i64> %v, i32 %a, i32 %b) {12; SSE-LABEL: movmsk_eq_v2i64_0:13; SSE: # %bb.0:14; SSE-NEXT: movl %edi, %eax15; SSE-NEXT: movmskpd %xmm0, %ecx16; SSE-NEXT: testb $1, %cl17; SSE-NEXT: cmovel %esi, %eax18; SSE-NEXT: retq19;20; AVX-LABEL: movmsk_eq_v2i64_0:21; AVX: # %bb.0:22; AVX-NEXT: movl %edi, %eax23; AVX-NEXT: vmovmskpd %xmm0, %ecx24; AVX-NEXT: testb $1, %cl25; AVX-NEXT: cmovel %esi, %eax26; AVX-NEXT: retq27 %cmp = icmp slt <2 x i64> %v, zeroinitializer28 %msk = bitcast <2 x i1> %cmp to i229 %bit = and i2 %msk, 130 %icmp = icmp eq i2 %bit, 031 %cond = select i1 %icmp, i32 %b, i32 %a32 ret i32 %cond33}34 35define i32 @movmsk_slt_v2i64_1(<2 x i64> %v, i32 %a, i32 %b) {36; SSE-LABEL: movmsk_slt_v2i64_1:37; SSE: # %bb.0:38; SSE-NEXT: movl %edi, %eax39; SSE-NEXT: movmskpd %xmm0, %ecx40; SSE-NEXT: testb $2, %cl41; SSE-NEXT: cmovel %esi, %eax42; SSE-NEXT: retq43;44; AVX-LABEL: movmsk_slt_v2i64_1:45; AVX: # %bb.0:46; AVX-NEXT: movl %edi, %eax47; AVX-NEXT: vmovmskpd %xmm0, %ecx48; AVX-NEXT: testb $2, %cl49; AVX-NEXT: cmovel %esi, %eax50; AVX-NEXT: retq51 %cmp = icmp slt <2 x i64> %v, zeroinitializer52 %msk = bitcast <2 x i1> %cmp to i253 %icmp = icmp slt i2 %msk, 054 %cond = select i1 %icmp, i32 %a, i32 %b55 ret i32 %cond56}57 58define i32 @movmsk_sgt_v2i64_1(<2 x i64> %v, i32 %a, i32 %b) {59; SSE-LABEL: movmsk_sgt_v2i64_1:60; SSE: # %bb.0:61; SSE-NEXT: movl %edi, %eax62; SSE-NEXT: movmskpd %xmm0, %ecx63; SSE-NEXT: testb $2, %cl64; SSE-NEXT: cmovnel %esi, %eax65; SSE-NEXT: retq66;67; AVX-LABEL: movmsk_sgt_v2i64_1:68; AVX: # %bb.0:69; AVX-NEXT: movl %edi, %eax70; AVX-NEXT: vmovmskpd %xmm0, %ecx71; AVX-NEXT: testb $2, %cl72; AVX-NEXT: cmovnel %esi, %eax73; AVX-NEXT: retq74 %cmp = icmp slt <2 x i64> %v, zeroinitializer75 %msk = bitcast <2 x i1> %cmp to i276 %icmp = icmp sgt i2 %msk, -177 %cond = select i1 %icmp, i32 %a, i32 %b78 ret i32 %cond79}80 81define i32 @movmsk_eq_v4i32_0(<4 x i32> %v, i32 %a, i32 %b) {82; SSE-LABEL: movmsk_eq_v4i32_0:83; SSE: # %bb.0:84; SSE-NEXT: movl %edi, %eax85; SSE-NEXT: movmskps %xmm0, %ecx86; SSE-NEXT: testb $1, %cl87; SSE-NEXT: cmovel %esi, %eax88; SSE-NEXT: retq89;90; AVX-LABEL: movmsk_eq_v4i32_0:91; AVX: # %bb.0:92; AVX-NEXT: movl %edi, %eax93; AVX-NEXT: vmovmskps %xmm0, %ecx94; AVX-NEXT: testb $1, %cl95; AVX-NEXT: cmovel %esi, %eax96; AVX-NEXT: retq97 %cmp = icmp slt <4 x i32> %v, zeroinitializer98 %msk = bitcast <4 x i1> %cmp to i499 %bit = and i4 %msk, 1100 %icmp = icmp eq i4 %bit, 0101 %cond = select i1 %icmp, i32 %b, i32 %a102 ret i32 %cond103}104 105define i32 @movmsk_slt_v4i32_3(<4 x i32> %v, i32 %a, i32 %b) {106; SSE-LABEL: movmsk_slt_v4i32_3:107; SSE: # %bb.0:108; SSE-NEXT: movl %edi, %eax109; SSE-NEXT: movmskps %xmm0, %ecx110; SSE-NEXT: testb $8, %cl111; SSE-NEXT: cmovel %esi, %eax112; SSE-NEXT: retq113;114; AVX-LABEL: movmsk_slt_v4i32_3:115; AVX: # %bb.0:116; AVX-NEXT: movl %edi, %eax117; AVX-NEXT: vmovmskps %xmm0, %ecx118; AVX-NEXT: testb $8, %cl119; AVX-NEXT: cmovel %esi, %eax120; AVX-NEXT: retq121 %cmp = icmp slt <4 x i32> %v, zeroinitializer122 %msk = bitcast <4 x i1> %cmp to i4123 %icmp = icmp slt i4 %msk, 0124 %cond = select i1 %icmp, i32 %a, i32 %b125 ret i32 %cond126}127 128define i32 @movmsk_sgt_v4i32_3(<4 x i32> %v, i32 %a, i32 %b) {129; SSE-LABEL: movmsk_sgt_v4i32_3:130; SSE: # %bb.0:131; SSE-NEXT: movl %edi, %eax132; SSE-NEXT: movmskps %xmm0, %ecx133; SSE-NEXT: testb $8, %cl134; SSE-NEXT: cmovnel %esi, %eax135; SSE-NEXT: retq136;137; AVX-LABEL: movmsk_sgt_v4i32_3:138; AVX: # %bb.0:139; AVX-NEXT: movl %edi, %eax140; AVX-NEXT: vmovmskps %xmm0, %ecx141; AVX-NEXT: testb $8, %cl142; AVX-NEXT: cmovnel %esi, %eax143; AVX-NEXT: retq144 %cmp = icmp slt <4 x i32> %v, zeroinitializer145 %msk = bitcast <4 x i1> %cmp to i4146 %icmp = icmp sgt i4 %msk, -1147 %cond = select i1 %icmp, i32 %a, i32 %b148 ret i32 %cond149}150 151define i32 @movmsk_eq_v16i8_0(<16 x i8> %v, i32 %a, i32 %b) {152; SSE-LABEL: movmsk_eq_v16i8_0:153; SSE: # %bb.0:154; SSE-NEXT: movl %edi, %eax155; SSE-NEXT: pmovmskb %xmm0, %ecx156; SSE-NEXT: testb $1, %cl157; SSE-NEXT: cmovel %esi, %eax158; SSE-NEXT: retq159;160; AVX-LABEL: movmsk_eq_v16i8_0:161; AVX: # %bb.0:162; AVX-NEXT: movl %edi, %eax163; AVX-NEXT: vpmovmskb %xmm0, %ecx164; AVX-NEXT: testb $1, %cl165; AVX-NEXT: cmovel %esi, %eax166; AVX-NEXT: retq167 %cmp = icmp slt <16 x i8> %v, zeroinitializer168 %msk = bitcast <16 x i1> %cmp to i16169 %bit = and i16 %msk, 1170 %icmp = icmp eq i16 %bit, 0171 %cond = select i1 %icmp, i32 %b, i32 %a172 ret i32 %cond173}174 175define i32 @movmsk_slt_v16i8_15(<16 x i8> %v, i32 %a, i32 %b) {176; SSE-LABEL: movmsk_slt_v16i8_15:177; SSE: # %bb.0:178; SSE-NEXT: movl %edi, %eax179; SSE-NEXT: pmovmskb %xmm0, %ecx180; SSE-NEXT: testw %cx, %cx181; SSE-NEXT: cmovnsl %esi, %eax182; SSE-NEXT: retq183;184; AVX-LABEL: movmsk_slt_v16i8_15:185; AVX: # %bb.0:186; AVX-NEXT: movl %edi, %eax187; AVX-NEXT: vpmovmskb %xmm0, %ecx188; AVX-NEXT: testw %cx, %cx189; AVX-NEXT: cmovnsl %esi, %eax190; AVX-NEXT: retq191 %cmp = icmp slt <16 x i8> %v, zeroinitializer192 %msk = bitcast <16 x i1> %cmp to i16193 %icmp = icmp slt i16 %msk, 0194 %cond = select i1 %icmp, i32 %a, i32 %b195 ret i32 %cond196}197 198define i32 @movmsk_sgt_v16i8_15(<16 x i8> %v, i32 %a, i32 %b) {199; SSE-LABEL: movmsk_sgt_v16i8_15:200; SSE: # %bb.0:201; SSE-NEXT: movl %edi, %eax202; SSE-NEXT: pmovmskb %xmm0, %ecx203; SSE-NEXT: testw %cx, %cx204; SSE-NEXT: cmovsl %esi, %eax205; SSE-NEXT: retq206;207; AVX-LABEL: movmsk_sgt_v16i8_15:208; AVX: # %bb.0:209; AVX-NEXT: movl %edi, %eax210; AVX-NEXT: vpmovmskb %xmm0, %ecx211; AVX-NEXT: testw %cx, %cx212; AVX-NEXT: cmovsl %esi, %eax213; AVX-NEXT: retq214 %cmp = icmp slt <16 x i8> %v, zeroinitializer215 %msk = bitcast <16 x i1> %cmp to i16216 %icmp = icmp sgt i16 %msk, -1217 %cond = select i1 %icmp, i32 %a, i32 %b218 ret i32 %cond219}220 221define i32 @movmsk_eq_v4i64_0(<4 x i64> %v, i32 %a, i32 %b) {222; SSE-LABEL: movmsk_eq_v4i64_0:223; SSE: # %bb.0:224; SSE-NEXT: movl %edi, %eax225; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]226; SSE-NEXT: movmskps %xmm0, %ecx227; SSE-NEXT: testb $1, %cl228; SSE-NEXT: cmovel %esi, %eax229; SSE-NEXT: retq230;231; AVX-LABEL: movmsk_eq_v4i64_0:232; AVX: # %bb.0:233; AVX-NEXT: movl %edi, %eax234; AVX-NEXT: vmovmskpd %xmm0, %ecx235; AVX-NEXT: testb $1, %cl236; AVX-NEXT: cmovel %esi, %eax237; AVX-NEXT: vzeroupper238; AVX-NEXT: retq239 %cmp = icmp slt <4 x i64> %v, zeroinitializer240 %msk = bitcast <4 x i1> %cmp to i4241 %bit = and i4 %msk, 1242 %icmp = icmp eq i4 %bit, 0243 %cond = select i1 %icmp, i32 %b, i32 %a244 ret i32 %cond245}246 247define i32 @movmsk_slt_v4i64_3(<4 x i64> %v, i32 %a, i32 %b) {248; SSE-LABEL: movmsk_slt_v4i64_3:249; SSE: # %bb.0:250; SSE-NEXT: movl %edi, %eax251; SSE-NEXT: movmskps %xmm1, %ecx252; SSE-NEXT: testb $8, %cl253; SSE-NEXT: cmovel %esi, %eax254; SSE-NEXT: retq255;256; AVX-LABEL: movmsk_slt_v4i64_3:257; AVX: # %bb.0:258; AVX-NEXT: movl %edi, %eax259; AVX-NEXT: vmovmskpd %ymm0, %ecx260; AVX-NEXT: testb $8, %cl261; AVX-NEXT: cmovel %esi, %eax262; AVX-NEXT: vzeroupper263; AVX-NEXT: retq264 %cmp = icmp slt <4 x i64> %v, zeroinitializer265 %msk = bitcast <4 x i1> %cmp to i4266 %icmp = icmp slt i4 %msk, 0267 %cond = select i1 %icmp, i32 %a, i32 %b268 ret i32 %cond269}270 271define i32 @movmsk_sgt_v4i64_3(<4 x i64> %v, i32 %a, i32 %b) {272; SSE-LABEL: movmsk_sgt_v4i64_3:273; SSE: # %bb.0:274; SSE-NEXT: movl %edi, %eax275; SSE-NEXT: movmskps %xmm1, %ecx276; SSE-NEXT: testb $8, %cl277; SSE-NEXT: cmovnel %esi, %eax278; SSE-NEXT: retq279;280; AVX-LABEL: movmsk_sgt_v4i64_3:281; AVX: # %bb.0:282; AVX-NEXT: movl %edi, %eax283; AVX-NEXT: vmovmskpd %ymm0, %ecx284; AVX-NEXT: testb $8, %cl285; AVX-NEXT: cmovnel %esi, %eax286; AVX-NEXT: vzeroupper287; AVX-NEXT: retq288 %cmp = icmp slt <4 x i64> %v, zeroinitializer289 %msk = bitcast <4 x i1> %cmp to i4290 %icmp = icmp sgt i4 %msk, -1291 %cond = select i1 %icmp, i32 %a, i32 %b292 ret i32 %cond293}294 295define i32 @movmsk_eq_v8i32_0(<8 x i32> %v, i32 %a, i32 %b) {296; SSE-LABEL: movmsk_eq_v8i32_0:297; SSE: # %bb.0:298; SSE-NEXT: movl %edi, %eax299; SSE-NEXT: packssdw %xmm0, %xmm0300; SSE-NEXT: packsswb %xmm0, %xmm0301; SSE-NEXT: pmovmskb %xmm0, %ecx302; SSE-NEXT: testb $1, %cl303; SSE-NEXT: cmovel %esi, %eax304; SSE-NEXT: retq305;306; AVX-LABEL: movmsk_eq_v8i32_0:307; AVX: # %bb.0:308; AVX-NEXT: movl %edi, %eax309; AVX-NEXT: vmovmskps %xmm0, %ecx310; AVX-NEXT: testb $1, %cl311; AVX-NEXT: cmovel %esi, %eax312; AVX-NEXT: vzeroupper313; AVX-NEXT: retq314 %cmp = icmp slt <8 x i32> %v, zeroinitializer315 %msk = bitcast <8 x i1> %cmp to i8316 %bit = and i8 %msk, 1317 %icmp = icmp eq i8 %bit, 0318 %cond = select i1 %icmp, i32 %b, i32 %a319 ret i32 %cond320}321 322define i32 @movmsk_eq_v8i32_3(<8 x i32> %v, i32 %a, i32 %b) {323; SSE-LABEL: movmsk_eq_v8i32_3:324; SSE: # %bb.0:325; SSE-NEXT: movl %edi, %eax326; SSE-NEXT: packssdw %xmm0, %xmm0327; SSE-NEXT: packsswb %xmm0, %xmm0328; SSE-NEXT: pmovmskb %xmm0, %ecx329; SSE-NEXT: testb $8, %cl330; SSE-NEXT: cmovel %esi, %eax331; SSE-NEXT: retq332;333; AVX-LABEL: movmsk_eq_v8i32_3:334; AVX: # %bb.0:335; AVX-NEXT: movl %edi, %eax336; AVX-NEXT: vmovmskps %xmm0, %ecx337; AVX-NEXT: testb $8, %cl338; AVX-NEXT: cmovel %esi, %eax339; AVX-NEXT: vzeroupper340; AVX-NEXT: retq341 %cmp = icmp slt <8 x i32> %v, zeroinitializer342 %msk = bitcast <8 x i1> %cmp to i8343 %bit = and i8 %msk, 8344 %icmp = icmp eq i8 %bit, 0345 %cond = select i1 %icmp, i32 %b, i32 %a346 ret i32 %cond347}348 349define i32 @movmsk_slt_v8i32_7(<8 x i32> %v, i32 %a, i32 %b) {350; SSE-LABEL: movmsk_slt_v8i32_7:351; SSE: # %bb.0:352; SSE-NEXT: movl %edi, %eax353; SSE-NEXT: packssdw %xmm1, %xmm0354; SSE-NEXT: packsswb %xmm0, %xmm0355; SSE-NEXT: pmovmskb %xmm0, %ecx356; SSE-NEXT: testb %cl, %cl357; SSE-NEXT: cmovnsl %esi, %eax358; SSE-NEXT: retq359;360; AVX-LABEL: movmsk_slt_v8i32_7:361; AVX: # %bb.0:362; AVX-NEXT: movl %edi, %eax363; AVX-NEXT: vmovmskps %ymm0, %ecx364; AVX-NEXT: testb %cl, %cl365; AVX-NEXT: cmovnsl %esi, %eax366; AVX-NEXT: vzeroupper367; AVX-NEXT: retq368 %cmp = icmp slt <8 x i32> %v, zeroinitializer369 %msk = bitcast <8 x i1> %cmp to i8370 %icmp = icmp slt i8 %msk, 0371 %cond = select i1 %icmp, i32 %a, i32 %b372 ret i32 %cond373}374 375define i32 @movmsk_sgt_v8i32_7(<8 x i32> %v, i32 %a, i32 %b) {376; SSE-LABEL: movmsk_sgt_v8i32_7:377; SSE: # %bb.0:378; SSE-NEXT: movl %edi, %eax379; SSE-NEXT: packssdw %xmm1, %xmm0380; SSE-NEXT: packsswb %xmm0, %xmm0381; SSE-NEXT: pmovmskb %xmm0, %ecx382; SSE-NEXT: testb %cl, %cl383; SSE-NEXT: cmovsl %esi, %eax384; SSE-NEXT: retq385;386; AVX-LABEL: movmsk_sgt_v8i32_7:387; AVX: # %bb.0:388; AVX-NEXT: movl %edi, %eax389; AVX-NEXT: vmovmskps %ymm0, %ecx390; AVX-NEXT: testb %cl, %cl391; AVX-NEXT: cmovsl %esi, %eax392; AVX-NEXT: vzeroupper393; AVX-NEXT: retq394 %cmp = icmp slt <8 x i32> %v, zeroinitializer395 %msk = bitcast <8 x i1> %cmp to i8396 %icmp = icmp sgt i8 %msk, -1397 %cond = select i1 %icmp, i32 %a, i32 %b398 ret i32 %cond399}400 401define i32 @movmsk_eq_v32i8_0(<32 x i8> %v, i32 %a, i32 %b) {402; SSE-LABEL: movmsk_eq_v32i8_0:403; SSE: # %bb.0:404; SSE-NEXT: movl %edi, %eax405; SSE-NEXT: pmovmskb %xmm0, %ecx406; SSE-NEXT: testb $1, %cl407; SSE-NEXT: cmovel %esi, %eax408; SSE-NEXT: retq409;410; AVX-LABEL: movmsk_eq_v32i8_0:411; AVX: # %bb.0:412; AVX-NEXT: movl %edi, %eax413; AVX-NEXT: vpmovmskb %xmm0, %ecx414; AVX-NEXT: testb $1, %cl415; AVX-NEXT: cmovel %esi, %eax416; AVX-NEXT: vzeroupper417; AVX-NEXT: retq418 %cmp = icmp slt <32 x i8> %v, zeroinitializer419 %msk = bitcast <32 x i1> %cmp to i32420 %bit = and i32 %msk, 1421 %icmp = icmp eq i32 %bit, 0422 %cond = select i1 %icmp, i32 %b, i32 %a423 ret i32 %cond424}425 426define i32 @movmsk_eq_v32i8_30(<32 x i8> %v, i32 %a, i32 %b) {427; SSE-LABEL: movmsk_eq_v32i8_30:428; SSE: # %bb.0:429; SSE-NEXT: movl %edi, %eax430; SSE-NEXT: pmovmskb %xmm1, %ecx431; SSE-NEXT: shll $16, %ecx432; SSE-NEXT: testl $1073741824, %ecx # imm = 0x40000000433; SSE-NEXT: cmovel %esi, %eax434; SSE-NEXT: retq435;436; AVX1-LABEL: movmsk_eq_v32i8_30:437; AVX1: # %bb.0:438; AVX1-NEXT: movl %edi, %eax439; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0440; AVX1-NEXT: vpmovmskb %xmm0, %ecx441; AVX1-NEXT: shll $16, %ecx442; AVX1-NEXT: testl $1073741824, %ecx # imm = 0x40000000443; AVX1-NEXT: cmovel %esi, %eax444; AVX1-NEXT: vzeroupper445; AVX1-NEXT: retq446;447; AVX2-LABEL: movmsk_eq_v32i8_30:448; AVX2: # %bb.0:449; AVX2-NEXT: movl %edi, %eax450; AVX2-NEXT: vpmovmskb %ymm0, %ecx451; AVX2-NEXT: testl $1073741824, %ecx # imm = 0x40000000452; AVX2-NEXT: cmovel %esi, %eax453; AVX2-NEXT: vzeroupper454; AVX2-NEXT: retq455;456; AVX512-LABEL: movmsk_eq_v32i8_30:457; AVX512: # %bb.0:458; AVX512-NEXT: movl %edi, %eax459; AVX512-NEXT: vpmovmskb %ymm0, %ecx460; AVX512-NEXT: testl $1073741824, %ecx # imm = 0x40000000461; AVX512-NEXT: cmovel %esi, %eax462; AVX512-NEXT: vzeroupper463; AVX512-NEXT: retq464 %cmp = icmp slt <32 x i8> %v, zeroinitializer465 %msk = bitcast <32 x i1> %cmp to i32466 %bit = and i32 %msk, 1073741824467 %icmp = icmp eq i32 %bit, 0468 %cond = select i1 %icmp, i32 %b, i32 %a469 ret i32 %cond470}471 472define i32 @movmsk_slt_v32i8_31(<32 x i8> %v, i32 %a, i32 %b) {473; SSE-LABEL: movmsk_slt_v32i8_31:474; SSE: # %bb.0:475; SSE-NEXT: movl %edi, %eax476; SSE-NEXT: pmovmskb %xmm1, %ecx477; SSE-NEXT: testl $32768, %ecx # imm = 0x8000478; SSE-NEXT: cmovel %esi, %eax479; SSE-NEXT: retq480;481; AVX1-LABEL: movmsk_slt_v32i8_31:482; AVX1: # %bb.0:483; AVX1-NEXT: movl %edi, %eax484; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0485; AVX1-NEXT: vpmovmskb %xmm0, %ecx486; AVX1-NEXT: testl $32768, %ecx # imm = 0x8000487; AVX1-NEXT: cmovel %esi, %eax488; AVX1-NEXT: vzeroupper489; AVX1-NEXT: retq490;491; AVX2-LABEL: movmsk_slt_v32i8_31:492; AVX2: # %bb.0:493; AVX2-NEXT: movl %edi, %eax494; AVX2-NEXT: vpmovmskb %ymm0, %ecx495; AVX2-NEXT: testl %ecx, %ecx496; AVX2-NEXT: cmovnsl %esi, %eax497; AVX2-NEXT: vzeroupper498; AVX2-NEXT: retq499;500; AVX512-LABEL: movmsk_slt_v32i8_31:501; AVX512: # %bb.0:502; AVX512-NEXT: movl %edi, %eax503; AVX512-NEXT: vpmovmskb %ymm0, %ecx504; AVX512-NEXT: testl %ecx, %ecx505; AVX512-NEXT: cmovnsl %esi, %eax506; AVX512-NEXT: vzeroupper507; AVX512-NEXT: retq508 %cmp = icmp slt <32 x i8> %v, zeroinitializer509 %msk = bitcast <32 x i1> %cmp to i32510 %icmp = icmp slt i32 %msk, 0511 %cond = select i1 %icmp, i32 %a, i32 %b512 ret i32 %cond513}514 515define i32 @movmsk_sgt_v32i8_31(<32 x i8> %v, i32 %a, i32 %b) {516; SSE-LABEL: movmsk_sgt_v32i8_31:517; SSE: # %bb.0:518; SSE-NEXT: movl %edi, %eax519; SSE-NEXT: pmovmskb %xmm1, %ecx520; SSE-NEXT: testl $32768, %ecx # imm = 0x8000521; SSE-NEXT: cmovnel %esi, %eax522; SSE-NEXT: retq523;524; AVX1-LABEL: movmsk_sgt_v32i8_31:525; AVX1: # %bb.0:526; AVX1-NEXT: movl %edi, %eax527; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0528; AVX1-NEXT: vpmovmskb %xmm0, %ecx529; AVX1-NEXT: testl $32768, %ecx # imm = 0x8000530; AVX1-NEXT: cmovnel %esi, %eax531; AVX1-NEXT: vzeroupper532; AVX1-NEXT: retq533;534; AVX2-LABEL: movmsk_sgt_v32i8_31:535; AVX2: # %bb.0:536; AVX2-NEXT: movl %edi, %eax537; AVX2-NEXT: vpmovmskb %ymm0, %ecx538; AVX2-NEXT: testl %ecx, %ecx539; AVX2-NEXT: cmovsl %esi, %eax540; AVX2-NEXT: vzeroupper541; AVX2-NEXT: retq542;543; AVX512-LABEL: movmsk_sgt_v32i8_31:544; AVX512: # %bb.0:545; AVX512-NEXT: movl %edi, %eax546; AVX512-NEXT: vpmovmskb %ymm0, %ecx547; AVX512-NEXT: testl %ecx, %ecx548; AVX512-NEXT: cmovsl %esi, %eax549; AVX512-NEXT: vzeroupper550; AVX512-NEXT: retq551 %cmp = icmp slt <32 x i8> %v, zeroinitializer552 %msk = bitcast <32 x i1> %cmp to i32553 %icmp = icmp sgt i32 %msk, -1554 %cond = select i1 %icmp, i32 %a, i32 %b555 ret i32 %cond556}557 558;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:559; AVX1OR2: {{.*}}560; SSE2: {{.*}}561; SSE41: {{.*}}562