brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.3 KiB · c107a98 Raw
558 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; 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.2 | FileCheck %s --check-prefixes=SSE,SSE424; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+prefer-movmsk-over-vtest | FileCheck %s --check-prefixes=ADL7 8declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>)9declare i32 @llvm.x86.sse2.movmsk.pd(<2 x double>)10declare i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8>)11 12; Use widest possible vector for movmsk comparisons (PR37087)13 14define i1 @movmskps_noneof_bitcast_v2f64(<2 x double> %a0) {15; SSE-LABEL: movmskps_noneof_bitcast_v2f64:16; SSE:       # %bb.0:17; SSE-NEXT:    xorpd %xmm1, %xmm118; SSE-NEXT:    cmpeqpd %xmm0, %xmm119; SSE-NEXT:    movmskpd %xmm1, %eax20; SSE-NEXT:    testl %eax, %eax21; SSE-NEXT:    sete %al22; SSE-NEXT:    retq23;24; AVX-LABEL: movmskps_noneof_bitcast_v2f64:25; AVX:       # %bb.0:26; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm127; AVX-NEXT:    vcmpeqpd %xmm0, %xmm1, %xmm028; AVX-NEXT:    vtestpd %xmm0, %xmm029; AVX-NEXT:    sete %al30; AVX-NEXT:    retq31;32; ADL-LABEL: movmskps_noneof_bitcast_v2f64:33; ADL:       # %bb.0:34; ADL-NEXT:    vxorpd %xmm1, %xmm1, %xmm135; ADL-NEXT:    vcmpeqpd %xmm0, %xmm1, %xmm036; ADL-NEXT:    vmovmskpd %xmm0, %eax37; ADL-NEXT:    testl %eax, %eax38; ADL-NEXT:    sete %al39; ADL-NEXT:    retq40  %1 = fcmp oeq <2 x double> zeroinitializer, %a041  %2 = sext <2 x i1> %1 to <2 x i64>42  %3 = bitcast <2 x i64> %2 to <4 x float>43  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)44  %5 = icmp eq i32 %4, 045  ret i1 %546}47 48define i1 @movmskps_allof_bitcast_v2f64(<2 x double> %a0) {49; SSE-LABEL: movmskps_allof_bitcast_v2f64:50; SSE:       # %bb.0:51; SSE-NEXT:    xorpd %xmm1, %xmm152; SSE-NEXT:    cmpeqpd %xmm0, %xmm153; SSE-NEXT:    movmskpd %xmm1, %eax54; SSE-NEXT:    cmpl $3, %eax55; SSE-NEXT:    sete %al56; SSE-NEXT:    retq57;58; AVX-LABEL: movmskps_allof_bitcast_v2f64:59; AVX:       # %bb.0:60; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm161; AVX-NEXT:    vcmpeqpd %xmm0, %xmm1, %xmm062; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm163; AVX-NEXT:    vtestpd %xmm1, %xmm064; AVX-NEXT:    setb %al65; AVX-NEXT:    retq66;67; ADL-LABEL: movmskps_allof_bitcast_v2f64:68; ADL:       # %bb.0:69; ADL-NEXT:    vxorpd %xmm1, %xmm1, %xmm170; ADL-NEXT:    vcmpeqpd %xmm0, %xmm1, %xmm071; ADL-NEXT:    vmovmskpd %xmm0, %eax72; ADL-NEXT:    cmpl $3, %eax73; ADL-NEXT:    sete %al74; ADL-NEXT:    retq75  %1 = fcmp oeq <2 x double> zeroinitializer, %a076  %2 = sext <2 x i1> %1 to <2 x i64>77  %3 = bitcast <2 x i64> %2 to <4 x float>78  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)79  %5 = icmp eq i32 %4, 1580  ret i1 %581}82 83define i1 @pmovmskb_noneof_bitcast_v2i64(<2 x i64> %a0) {84; SSE2-LABEL: pmovmskb_noneof_bitcast_v2i64:85; SSE2:       # %bb.0:86; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]87; SSE2-NEXT:    movmskps %xmm0, %eax88; SSE2-NEXT:    testl %eax, %eax89; SSE2-NEXT:    sete %al90; SSE2-NEXT:    retq91;92; SSE42-LABEL: pmovmskb_noneof_bitcast_v2i64:93; SSE42:       # %bb.0:94; SSE42-NEXT:    movmskpd %xmm0, %eax95; SSE42-NEXT:    testl %eax, %eax96; SSE42-NEXT:    sete %al97; SSE42-NEXT:    retq98;99; AVX-LABEL: pmovmskb_noneof_bitcast_v2i64:100; AVX:       # %bb.0:101; AVX-NEXT:    vtestpd %xmm0, %xmm0102; AVX-NEXT:    sete %al103; AVX-NEXT:    retq104;105; ADL-LABEL: pmovmskb_noneof_bitcast_v2i64:106; ADL:       # %bb.0:107; ADL-NEXT:    vmovmskpd %xmm0, %eax108; ADL-NEXT:    testl %eax, %eax109; ADL-NEXT:    sete %al110; ADL-NEXT:    retq111  %1 = icmp sgt <2 x i64> zeroinitializer, %a0112  %2 = sext <2 x i1> %1 to <2 x i64>113  %3 = bitcast <2 x i64> %2 to <16 x i8>114  %4 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %3)115  %5 = icmp eq i32 %4, 0116  ret i1 %5117}118 119define i1 @pmovmskb_allof_bitcast_v2i64(<2 x i64> %a0) {120; SSE2-LABEL: pmovmskb_allof_bitcast_v2i64:121; SSE2:       # %bb.0:122; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]123; SSE2-NEXT:    movmskps %xmm0, %eax124; SSE2-NEXT:    cmpl $15, %eax125; SSE2-NEXT:    sete %al126; SSE2-NEXT:    retq127;128; SSE42-LABEL: pmovmskb_allof_bitcast_v2i64:129; SSE42:       # %bb.0:130; SSE42-NEXT:    movmskpd %xmm0, %eax131; SSE42-NEXT:    cmpl $3, %eax132; SSE42-NEXT:    sete %al133; SSE42-NEXT:    retq134;135; AVX-LABEL: pmovmskb_allof_bitcast_v2i64:136; AVX:       # %bb.0:137; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1138; AVX-NEXT:    vtestpd %xmm1, %xmm0139; AVX-NEXT:    setb %al140; AVX-NEXT:    retq141;142; ADL-LABEL: pmovmskb_allof_bitcast_v2i64:143; ADL:       # %bb.0:144; ADL-NEXT:    vmovmskpd %xmm0, %eax145; ADL-NEXT:    cmpl $3, %eax146; ADL-NEXT:    sete %al147; ADL-NEXT:    retq148  %1 = icmp sgt <2 x i64> zeroinitializer, %a0149  %2 = sext <2 x i1> %1 to <2 x i64>150  %3 = bitcast <2 x i64> %2 to <16 x i8>151  %4 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %3)152  %5 = icmp eq i32 %4, 65535153  ret i1 %5154}155 156define i1 @pmovmskb_noneof_bitcast_v4f32(<4 x float> %a0) {157; SSE-LABEL: pmovmskb_noneof_bitcast_v4f32:158; SSE:       # %bb.0:159; SSE-NEXT:    xorps %xmm1, %xmm1160; SSE-NEXT:    cmpeqps %xmm0, %xmm1161; SSE-NEXT:    movmskps %xmm1, %eax162; SSE-NEXT:    testl %eax, %eax163; SSE-NEXT:    sete %al164; SSE-NEXT:    retq165;166; AVX-LABEL: pmovmskb_noneof_bitcast_v4f32:167; AVX:       # %bb.0:168; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1169; AVX-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0170; AVX-NEXT:    vtestps %xmm0, %xmm0171; AVX-NEXT:    sete %al172; AVX-NEXT:    retq173;174; ADL-LABEL: pmovmskb_noneof_bitcast_v4f32:175; ADL:       # %bb.0:176; ADL-NEXT:    vxorps %xmm1, %xmm1, %xmm1177; ADL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0178; ADL-NEXT:    vmovmskps %xmm0, %eax179; ADL-NEXT:    testl %eax, %eax180; ADL-NEXT:    sete %al181; ADL-NEXT:    retq182  %1 = fcmp oeq <4 x float> %a0, zeroinitializer183  %2 = sext <4 x i1> %1 to <4 x i32>184  %3 = bitcast <4 x i32> %2 to <16 x i8>185  %4 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %3)186  %5 = icmp eq i32 %4, 0187  ret i1 %5188}189 190define i1 @pmovmskb_allof_bitcast_v4f32(<4 x float> %a0) {191; SSE-LABEL: pmovmskb_allof_bitcast_v4f32:192; SSE:       # %bb.0:193; SSE-NEXT:    xorps %xmm1, %xmm1194; SSE-NEXT:    cmpeqps %xmm0, %xmm1195; SSE-NEXT:    movmskps %xmm1, %eax196; SSE-NEXT:    cmpl $15, %eax197; SSE-NEXT:    sete %al198; SSE-NEXT:    retq199;200; AVX-LABEL: pmovmskb_allof_bitcast_v4f32:201; AVX:       # %bb.0:202; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1203; AVX-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0204; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1205; AVX-NEXT:    vtestps %xmm1, %xmm0206; AVX-NEXT:    setb %al207; AVX-NEXT:    retq208;209; ADL-LABEL: pmovmskb_allof_bitcast_v4f32:210; ADL:       # %bb.0:211; ADL-NEXT:    vxorps %xmm1, %xmm1, %xmm1212; ADL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0213; ADL-NEXT:    vmovmskps %xmm0, %eax214; ADL-NEXT:    cmpl $15, %eax215; ADL-NEXT:    sete %al216; ADL-NEXT:    retq217  %1 = fcmp oeq <4 x float> %a0, zeroinitializer218  %2 = sext <4 x i1> %1 to <4 x i32>219  %3 = bitcast <4 x i32> %2 to <16 x i8>220  %4 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %3)221  %5 = icmp eq i32 %4, 65535222  ret i1 %5223}224 225; MOVMSK(ICMP_SGT(X,-1)) -> NOT(MOVMSK(X)))226define i1 @movmskps_allof_v4i32_positive(<4 x i32> %a0) {227; SSE-LABEL: movmskps_allof_v4i32_positive:228; SSE:       # %bb.0:229; SSE-NEXT:    movmskps %xmm0, %eax230; SSE-NEXT:    xorl $15, %eax231; SSE-NEXT:    cmpl $15, %eax232; SSE-NEXT:    sete %al233; SSE-NEXT:    retq234;235; AVX-LABEL: movmskps_allof_v4i32_positive:236; AVX:       # %bb.0:237; AVX-NEXT:    vmovmskps %xmm0, %eax238; AVX-NEXT:    xorl $15, %eax239; AVX-NEXT:    cmpl $15, %eax240; AVX-NEXT:    sete %al241; AVX-NEXT:    retq242;243; ADL-LABEL: movmskps_allof_v4i32_positive:244; ADL:       # %bb.0:245; ADL-NEXT:    vmovmskps %xmm0, %eax246; ADL-NEXT:    xorl $15, %eax247; ADL-NEXT:    cmpl $15, %eax248; ADL-NEXT:    sete %al249; ADL-NEXT:    retq250  %1 = icmp sgt <4 x i32> %a0, <i32 -1, i32 -1, i32 -1, i32 -1>251  %2 = sext <4 x i1> %1 to <4 x i32>252  %3 = bitcast <4 x i32> %2 to <4 x float>253  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)254  %5 = icmp eq i32 %4, 15255  ret i1 %5256}257 258define i1 @pmovmskb_noneof_v16i8_positive(<16 x i8> %a0) {259; SSE-LABEL: pmovmskb_noneof_v16i8_positive:260; SSE:       # %bb.0:261; SSE-NEXT:    pmovmskb %xmm0, %eax262; SSE-NEXT:    xorl $65535, %eax # imm = 0xFFFF263; SSE-NEXT:    sete %al264; SSE-NEXT:    retq265;266; AVX-LABEL: pmovmskb_noneof_v16i8_positive:267; AVX:       # %bb.0:268; AVX-NEXT:    vpmovmskb %xmm0, %eax269; AVX-NEXT:    xorl $65535, %eax # imm = 0xFFFF270; AVX-NEXT:    sete %al271; AVX-NEXT:    retq272;273; ADL-LABEL: pmovmskb_noneof_v16i8_positive:274; ADL:       # %bb.0:275; ADL-NEXT:    vpmovmskb %xmm0, %eax276; ADL-NEXT:    xorl $65535, %eax # imm = 0xFFFF277; ADL-NEXT:    sete %al278; ADL-NEXT:    retq279  %1 = icmp sgt <16 x i8> %a0, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>280  %2 = sext <16 x i1> %1 to <16 x i8>281  %3 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %2)282  %4 = icmp eq i32 %3, 0283  ret i1 %4284}285 286; MOVMSK(CMPEQ(AND(X,C1),0)) -> MOVMSK(NOT(SHL(X,C2)))287define i32 @movmskpd_pow2_mask(<2 x i64> %a0) {288; SSE2-LABEL: movmskpd_pow2_mask:289; SSE2:       # %bb.0:290; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0291; SSE2-NEXT:    pxor %xmm1, %xmm1292; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1293; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]294; SSE2-NEXT:    pand %xmm1, %xmm0295; SSE2-NEXT:    movmskpd %xmm0, %eax296; SSE2-NEXT:    retq297;298; SSE42-LABEL: movmskpd_pow2_mask:299; SSE42:       # %bb.0:300; SSE42-NEXT:    movmskpd %xmm0, %eax301; SSE42-NEXT:    xorl $3, %eax302; SSE42-NEXT:    retq303;304; AVX-LABEL: movmskpd_pow2_mask:305; AVX:       # %bb.0:306; AVX-NEXT:    vmovmskpd %xmm0, %eax307; AVX-NEXT:    xorl $3, %eax308; AVX-NEXT:    retq309;310; ADL-LABEL: movmskpd_pow2_mask:311; ADL:       # %bb.0:312; ADL-NEXT:    vmovmskpd %xmm0, %eax313; ADL-NEXT:    xorl $3, %eax314; ADL-NEXT:    retq315  %1 = and <2 x i64> %a0, <i64 -9223372036854775808, i64 -9223372036854775808>316  %2 = icmp eq <2 x i64> %1, zeroinitializer317  %3 = sext <2 x i1> %2 to <2 x i64>318  %4 = bitcast <2 x i64> %3 to <2 x double>319  %5 = tail call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %4)320  ret i32 %5321}322 323define i32 @movmskps_pow2_mask(<4 x i32> %a0) {324; SSE-LABEL: movmskps_pow2_mask:325; SSE:       # %bb.0:326; SSE-NEXT:    pslld $29, %xmm0327; SSE-NEXT:    movmskps %xmm0, %eax328; SSE-NEXT:    xorl $15, %eax329; SSE-NEXT:    retq330;331; AVX-LABEL: movmskps_pow2_mask:332; AVX:       # %bb.0:333; AVX-NEXT:    vpslld $29, %xmm0, %xmm0334; AVX-NEXT:    vmovmskps %xmm0, %eax335; AVX-NEXT:    xorl $15, %eax336; AVX-NEXT:    retq337;338; ADL-LABEL: movmskps_pow2_mask:339; ADL:       # %bb.0:340; ADL-NEXT:    vpslld $29, %xmm0, %xmm0341; ADL-NEXT:    vmovmskps %xmm0, %eax342; ADL-NEXT:    xorl $15, %eax343; ADL-NEXT:    retq344  %1 = and <4 x i32> %a0, <i32 4, i32 4, i32 4, i32 4>345  %2 = icmp eq <4 x i32> %1, zeroinitializer346  %3 = sext <4 x i1> %2 to <4 x i32>347  %4 = bitcast <4 x i32> %3 to <4 x float>348  %5 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %4)349  ret i32 %5350}351 352define i32 @pmovmskb_pow2_mask(<16 x i8> %a0) {353; SSE-LABEL: pmovmskb_pow2_mask:354; SSE:       # %bb.0:355; SSE-NEXT:    psllw $7, %xmm0356; SSE-NEXT:    pmovmskb %xmm0, %eax357; SSE-NEXT:    xorl $65535, %eax # imm = 0xFFFF358; SSE-NEXT:    retq359;360; AVX-LABEL: pmovmskb_pow2_mask:361; AVX:       # %bb.0:362; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0363; AVX-NEXT:    vpmovmskb %xmm0, %eax364; AVX-NEXT:    xorl $65535, %eax # imm = 0xFFFF365; AVX-NEXT:    retq366;367; ADL-LABEL: pmovmskb_pow2_mask:368; ADL:       # %bb.0:369; ADL-NEXT:    vpsllw $7, %xmm0, %xmm0370; ADL-NEXT:    vpmovmskb %xmm0, %eax371; ADL-NEXT:    xorl $65535, %eax # imm = 0xFFFF372; ADL-NEXT:    retq373  %1 = and <16 x i8> %a0, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>374  %2 = icmp eq <16 x i8> %1, zeroinitializer375  %3 = sext <16 x i1> %2 to <16 x i8>376  %4 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %3)377  ret i32 %4378}379 380; AND(MOVMSK(X),MOVMSK(Y)) -> MOVMSK(AND(X,Y))381; XOR(MOVMSK(X),MOVMSK(Y)) -> MOVMSK(XOR(X,Y))382; OR(MOVMSK(X),MOVMSK(Y)) -> MOVMSK(OR(X,Y))383; if the elements are the same width.384 385define i32 @and_movmskpd_movmskpd(<2 x double> %a0, <2 x i64> %a1) {386; SSE-LABEL: and_movmskpd_movmskpd:387; SSE:       # %bb.0:388; SSE-NEXT:    xorpd %xmm2, %xmm2389; SSE-NEXT:    cmpeqpd %xmm0, %xmm2390; SSE-NEXT:    andpd %xmm1, %xmm2391; SSE-NEXT:    movmskpd %xmm2, %eax392; SSE-NEXT:    retq393;394; AVX-LABEL: and_movmskpd_movmskpd:395; AVX:       # %bb.0:396; AVX-NEXT:    vxorpd %xmm2, %xmm2, %xmm2397; AVX-NEXT:    vcmpeqpd %xmm0, %xmm2, %xmm0398; AVX-NEXT:    vandpd %xmm1, %xmm0, %xmm0399; AVX-NEXT:    vmovmskpd %xmm0, %eax400; AVX-NEXT:    retq401;402; ADL-LABEL: and_movmskpd_movmskpd:403; ADL:       # %bb.0:404; ADL-NEXT:    vxorpd %xmm2, %xmm2, %xmm2405; ADL-NEXT:    vcmpeqpd %xmm0, %xmm2, %xmm0406; ADL-NEXT:    vandpd %xmm1, %xmm0, %xmm0407; ADL-NEXT:    vmovmskpd %xmm0, %eax408; ADL-NEXT:    retq409  %1 = fcmp oeq <2 x double> zeroinitializer, %a0410  %2 = sext <2 x i1> %1 to <2 x i64>411  %3 = bitcast <2 x i64> %2 to <2 x double>412  %4 = tail call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %3)413  %5 = icmp sgt <2 x i64> zeroinitializer, %a1414  %6 = bitcast <2 x i1> %5 to i2415  %7 = zext i2 %6 to i32416  %8 = and i32 %4, %7417  ret i32 %8418}419 420define i32 @xor_movmskps_movmskps(<4 x float> %a0, <4 x i32> %a1) {421; SSE-LABEL: xor_movmskps_movmskps:422; SSE:       # %bb.0:423; SSE-NEXT:    xorps %xmm2, %xmm2424; SSE-NEXT:    cmpeqps %xmm0, %xmm2425; SSE-NEXT:    xorps %xmm1, %xmm2426; SSE-NEXT:    movmskps %xmm2, %eax427; SSE-NEXT:    retq428;429; AVX-LABEL: xor_movmskps_movmskps:430; AVX:       # %bb.0:431; AVX-NEXT:    vxorps %xmm2, %xmm2, %xmm2432; AVX-NEXT:    vcmpeqps %xmm0, %xmm2, %xmm0433; AVX-NEXT:    vxorps %xmm1, %xmm0, %xmm0434; AVX-NEXT:    vmovmskps %xmm0, %eax435; AVX-NEXT:    retq436;437; ADL-LABEL: xor_movmskps_movmskps:438; ADL:       # %bb.0:439; ADL-NEXT:    vxorps %xmm2, %xmm2, %xmm2440; ADL-NEXT:    vcmpeqps %xmm0, %xmm2, %xmm0441; ADL-NEXT:    vxorps %xmm1, %xmm0, %xmm0442; ADL-NEXT:    vmovmskps %xmm0, %eax443; ADL-NEXT:    retq444  %1 = fcmp oeq <4 x float> zeroinitializer, %a0445  %2 = sext <4 x i1> %1 to <4 x i32>446  %3 = bitcast <4 x i32> %2 to <4 x float>447  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)448  %5 = ashr <4 x i32> %a1, <i32 31, i32 31, i32 31, i32 31>449  %6 = bitcast <4 x i32> %5 to <4 x float>450  %7 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %6)451  %8 = xor i32 %4, %7452  ret i32 %8453}454 455define i32 @or_pmovmskb_pmovmskb(<16 x i8> %a0, <8 x i16> %a1) {456; SSE-LABEL: or_pmovmskb_pmovmskb:457; SSE:       # %bb.0:458; SSE-NEXT:    pxor %xmm2, %xmm2459; SSE-NEXT:    pcmpeqb %xmm0, %xmm2460; SSE-NEXT:    psraw $15, %xmm1461; SSE-NEXT:    por %xmm2, %xmm1462; SSE-NEXT:    pmovmskb %xmm1, %eax463; SSE-NEXT:    retq464;465; AVX-LABEL: or_pmovmskb_pmovmskb:466; AVX:       # %bb.0:467; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2468; AVX-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0469; AVX-NEXT:    vpsraw $15, %xmm1, %xmm1470; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0471; AVX-NEXT:    vpmovmskb %xmm0, %eax472; AVX-NEXT:    retq473;474; ADL-LABEL: or_pmovmskb_pmovmskb:475; ADL:       # %bb.0:476; ADL-NEXT:    vpxor %xmm2, %xmm2, %xmm2477; ADL-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0478; ADL-NEXT:    vpsraw $15, %xmm1, %xmm1479; ADL-NEXT:    vpor %xmm1, %xmm0, %xmm0480; ADL-NEXT:    vpmovmskb %xmm0, %eax481; ADL-NEXT:    retq482  %1 = icmp eq <16 x i8> zeroinitializer, %a0483  %2 = sext <16 x i1> %1 to <16 x i8>484  %3 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %2)485  %4 = ashr <8 x i16> %a1, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>486  %5 = bitcast <8 x i16> %4 to <16 x i8>487  %6 = tail call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %5)488  %7 = or i32 %3, %6489  ret i32 %7490}491 492; FREEZE(MOVMSK(X)) -> MOVMSK(FREEZE(X))493define i32 @movmskps_freeze(<4 x i32> %a0) {494; SSE-LABEL: movmskps_freeze:495; SSE:       # %bb.0:496; SSE-NEXT:    movmskps %xmm0, %eax497; SSE-NEXT:    retq498;499; AVX-LABEL: movmskps_freeze:500; AVX:       # %bb.0:501; AVX-NEXT:    vmovmskps %xmm0, %eax502; AVX-NEXT:    retq503;504; ADL-LABEL: movmskps_freeze:505; ADL:       # %bb.0:506; ADL-NEXT:    vmovmskps %xmm0, %eax507; ADL-NEXT:    retq508  %1 = icmp slt <4 x i32> %a0, zeroinitializer509  %2 = sext <4 x i1> %1 to <4 x i32>510  %3 = bitcast <4 x i32> %2 to <4 x float>511  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)512  %5 = freeze i32 %4513  %6 = and i32 %5, 15514  ret i32 %6515}516 517; We can't fold to ptest if we're not checking every pcmpeq result518define i32 @movmskps_ptest_numelts_mismatch(<16 x i8> %a0) {519; SSE-LABEL: movmskps_ptest_numelts_mismatch:520; SSE:       # %bb.0:521; SSE-NEXT:    pxor %xmm1, %xmm1522; SSE-NEXT:    pcmpeqb %xmm0, %xmm1523; SSE-NEXT:    movmskps %xmm1, %ecx524; SSE-NEXT:    xorl %eax, %eax525; SSE-NEXT:    cmpl $15, %ecx526; SSE-NEXT:    sete %al527; SSE-NEXT:    negl %eax528; SSE-NEXT:    retq529;530; AVX-LABEL: movmskps_ptest_numelts_mismatch:531; AVX:       # %bb.0:532; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1533; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0534; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1535; AVX-NEXT:    xorl %eax, %eax536; AVX-NEXT:    vtestps %xmm1, %xmm0537; AVX-NEXT:    sbbl %eax, %eax538; AVX-NEXT:    retq539;540; ADL-LABEL: movmskps_ptest_numelts_mismatch:541; ADL:       # %bb.0:542; ADL-NEXT:    vpxor %xmm1, %xmm1, %xmm1543; ADL-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0544; ADL-NEXT:    vmovmskps %xmm0, %ecx545; ADL-NEXT:    xorl %eax, %eax546; ADL-NEXT:    cmpl $15, %ecx547; ADL-NEXT:    sete %al548; ADL-NEXT:    negl %eax549; ADL-NEXT:    retq550  %1 = icmp eq <16 x i8> %a0, zeroinitializer551  %2 = sext <16 x i1> %1 to <16 x i8>552  %3 = bitcast <16 x i8> %2 to <4 x float>553  %4 = tail call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %3)554  %5 = icmp eq i32 %4, 15555  %6 = sext i1 %5 to i32556  ret i32 %6557}558