brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.2 KiB · bc9e299 Raw
464 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=CHECK,X644 5define i32 @freeze_sext(i8 %a0) nounwind {6; X86-LABEL: freeze_sext:7; X86:       # %bb.0:8; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax9; X86-NEXT:    retl10;11; X64-LABEL: freeze_sext:12; X64:       # %bb.0:13; X64-NEXT:    movsbl %dil, %eax14; X64-NEXT:    retq15  %x = sext i8 %a0 to i1616  %y = freeze i16 %x17  %z = sext i16 %y to i3218  ret i32 %z19}20 21define <4 x i32> @freeze_sext_vec(<4 x i8> %a0) nounwind {22; X86-LABEL: freeze_sext_vec:23; X86:       # %bb.0:24; X86-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]25; X86-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]26; X86-NEXT:    psrad $24, %xmm027; X86-NEXT:    retl28;29; X64-LABEL: freeze_sext_vec:30; X64:       # %bb.0:31; X64-NEXT:    pmovsxbd %xmm0, %xmm032; X64-NEXT:    retq33  %x = sext <4 x i8> %a0 to <4 x i16>34  %y = freeze <4 x i16> %x35  %z = sext <4 x i16> %y to <4 x i32>36  ret <4 x i32> %z37}38 39define i32 @freeze_zext(i8 %a0) nounwind {40; X86-LABEL: freeze_zext:41; X86:       # %bb.0:42; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax43; X86-NEXT:    retl44;45; X64-LABEL: freeze_zext:46; X64:       # %bb.0:47; X64-NEXT:    movzbl %dil, %eax48; X64-NEXT:    retq49  %x = zext i8 %a0 to i1650  %y = freeze i16 %x51  %z = zext i16 %y to i3252  ret i32 %z53}54 55define <2 x i64> @freeze_zext_vec(<2 x i16> %a0) nounwind {56; X86-LABEL: freeze_zext_vec:57; X86:       # %bb.0:58; X86-NEXT:    pxor %xmm1, %xmm159; X86-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]60; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]61; X86-NEXT:    retl62;63; X64-LABEL: freeze_zext_vec:64; X64:       # %bb.0:65; X64-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero66; X64-NEXT:    retq67  %x = zext <2 x i16> %a0 to <2 x i32>68  %y = freeze <2 x i32> %x69  %z = zext <2 x i32> %y to <2 x i64>70  ret <2 x i64> %z71}72 73define i32 @freeze_abs(i32 %a0) nounwind {74; X86-LABEL: freeze_abs:75; X86:       # %bb.0:76; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx77; X86-NEXT:    movl %ecx, %eax78; X86-NEXT:    negl %eax79; X86-NEXT:    cmovsl %ecx, %eax80; X86-NEXT:    retl81;82; X64-LABEL: freeze_abs:83; X64:       # %bb.0:84; X64-NEXT:    movl %edi, %eax85; X64-NEXT:    negl %eax86; X64-NEXT:    cmovsl %edi, %eax87; X64-NEXT:    retq88  %x = call i32 @llvm.abs.i32(i32 %a0, i1 0)89  %f = freeze i32 %x90  %r = call i32 @llvm.abs.i32(i32 %f, i1 0)91  ret i32 %r92}93 94define <4 x i32> @freeze_abs_vec(<4 x i32> %a0) nounwind {95; X86-LABEL: freeze_abs_vec:96; X86:       # %bb.0:97; X86-NEXT:    movdqa %xmm0, %xmm198; X86-NEXT:    psrad $31, %xmm199; X86-NEXT:    pxor %xmm1, %xmm0100; X86-NEXT:    psubd %xmm1, %xmm0101; X86-NEXT:    retl102;103; X64-LABEL: freeze_abs_vec:104; X64:       # %bb.0:105; X64-NEXT:    pabsd %xmm0, %xmm0106; X64-NEXT:    retq107  %x = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a0, i1 0)108  %f = freeze <4 x i32> %x109  %r = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %f, i1 0)110  ret <4 x i32> %r111}112 113define i32 @freeze_abs_undef(i32 %a0) nounwind {114; X86-LABEL: freeze_abs_undef:115; X86:       # %bb.0:116; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx117; X86-NEXT:    movl %ecx, %eax118; X86-NEXT:    negl %eax119; X86-NEXT:    cmovsl %ecx, %eax120; X86-NEXT:    retl121;122; X64-LABEL: freeze_abs_undef:123; X64:       # %bb.0:124; X64-NEXT:    movl %edi, %eax125; X64-NEXT:    negl %eax126; X64-NEXT:    cmovsl %edi, %eax127; X64-NEXT:    retq128  %x = call i32 @llvm.abs.i32(i32 %a0, i1 -1)129  %f = freeze i32 %x130  %r = call i32 @llvm.abs.i32(i32 %f, i1 -1)131  ret i32 %r132}133 134define <4 x i32> @freeze_abs_undef_vec(<4 x i32> %a0) nounwind {135; X86-LABEL: freeze_abs_undef_vec:136; X86:       # %bb.0:137; X86-NEXT:    movdqa %xmm0, %xmm1138; X86-NEXT:    psrad $31, %xmm1139; X86-NEXT:    pxor %xmm1, %xmm0140; X86-NEXT:    psubd %xmm1, %xmm0141; X86-NEXT:    retl142;143; X64-LABEL: freeze_abs_undef_vec:144; X64:       # %bb.0:145; X64-NEXT:    pabsd %xmm0, %xmm0146; X64-NEXT:    retq147  %x = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a0, i1 -1)148  %f = freeze <4 x i32> %x149  %r = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %f, i1 -1)150  ret <4 x i32> %r151}152 153define i32 @freeze_bswap(i32 %a0) nounwind {154; X86-LABEL: freeze_bswap:155; X86:       # %bb.0:156; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax157; X86-NEXT:    retl158;159; X64-LABEL: freeze_bswap:160; X64:       # %bb.0:161; X64-NEXT:    movl %edi, %eax162; X64-NEXT:    retq163  %x = call i32 @llvm.bswap.i32(i32 %a0)164  %y = freeze i32 %x165  %z = call i32 @llvm.bswap.i32(i32 %y)166  ret i32 %z167}168declare i32 @llvm.bswap.i32(i32)169 170define <4 x i32> @freeze_bswap_vec(<4 x i32> %a0) nounwind {171; CHECK-LABEL: freeze_bswap_vec:172; CHECK:       # %bb.0:173; CHECK-NEXT:    ret{{[l|q]}}174  %x = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %a0)175  %y = freeze <4 x i32> %x176  %z = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %y)177  ret <4 x i32> %z178}179declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)180 181define i32 @freeze_bitreverse(i32 %a0) nounwind {182; X86-LABEL: freeze_bitreverse:183; X86:       # %bb.0:184; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax185; X86-NEXT:    retl186;187; X64-LABEL: freeze_bitreverse:188; X64:       # %bb.0:189; X64-NEXT:    movl %edi, %eax190; X64-NEXT:    retq191  %x = call i32 @llvm.bitreverse.i32(i32 %a0)192  %y = freeze i32 %x193  %z = call i32 @llvm.bitreverse.i32(i32 %y)194  ret i32 %z195}196declare i32 @llvm.bitreverse.i32(i32)197 198define <4 x i32> @freeze_bitreverse_vec(<4 x i32> %a0) nounwind {199; CHECK-LABEL: freeze_bitreverse_vec:200; CHECK:       # %bb.0:201; CHECK-NEXT:    ret{{[l|q]}}202  %x = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a0)203  %y = freeze <4 x i32> %x204  %z = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %y)205  ret <4 x i32> %z206}207declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)208 209define i32 @freeze_ctlz(i32 %a0) nounwind {210; X86-LABEL: freeze_ctlz:211; X86:       # %bb.0:212; X86-NEXT:    bsrl {{[0-9]+}}(%esp), %ecx213; X86-NEXT:    movl $63, %eax214; X86-NEXT:    cmovnel %ecx, %eax215; X86-NEXT:    xorl $31, %eax216; X86-NEXT:    retl217;218; X64-LABEL: freeze_ctlz:219; X64:       # %bb.0:220; X64-NEXT:    movl $63, %eax221; X64-NEXT:    bsrl %edi, %eax222; X64-NEXT:    xorl $31, %eax223; X64-NEXT:    retq224  %x = call i32 @llvm.ctlz.i32(i32 %a0, i1 0)225  %f = freeze i32 %x226  %c = icmp eq i32 %a0, 0227  %r = select i1 %c, i32 32, i32 %f228  ret i32 %r229}230 231define i32 @freeze_ctlz_undef(i32 %a0) nounwind {232; X86-LABEL: freeze_ctlz_undef:233; X86:       # %bb.0:234; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax235; X86-NEXT:    bsrl %eax, %ecx236; X86-NEXT:    xorl $31, %ecx237; X86-NEXT:    testl %eax, %eax238; X86-NEXT:    movl $32, %eax239; X86-NEXT:    cmovnel %ecx, %eax240; X86-NEXT:    retl241;242; X64-LABEL: freeze_ctlz_undef:243; X64:       # %bb.0:244; X64-NEXT:    bsrl %edi, %ecx245; X64-NEXT:    xorl $31, %ecx246; X64-NEXT:    testl %edi, %edi247; X64-NEXT:    movl $32, %eax248; X64-NEXT:    cmovnel %ecx, %eax249; X64-NEXT:    retq250  %x = call i32 @llvm.ctlz.i32(i32 %a0, i1 -1)251  %f = freeze i32 %x252  %c = icmp eq i32 %a0, 0253  %r = select i1 %c, i32 32, i32 %f254  ret i32 %r255}256 257define i32 @freeze_ctlz_undef_nonzero(i32 %a0) nounwind {258; X86-LABEL: freeze_ctlz_undef_nonzero:259; X86:       # %bb.0:260; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax261; X86-NEXT:    orl $1, %eax262; X86-NEXT:    bsrl %eax, %eax263; X86-NEXT:    xorl $31, %eax264; X86-NEXT:    retl265;266; X64-LABEL: freeze_ctlz_undef_nonzero:267; X64:       # %bb.0:268; X64-NEXT:    orl $1, %edi269; X64-NEXT:    bsrl %edi, %eax270; X64-NEXT:    xorl $31, %eax271; X64-NEXT:    retq272  %y = or i32 %a0, 1273  %x = call i32 @llvm.ctlz.i32(i32 %y, i1 -1)274  %f = freeze i32 %x275  %c = icmp eq i32 %y, 0276  %r = select i1 %c, i32 32, i32 %f277  ret i32 %r278}279 280define i32 @freeze_cttz(i32 %a0) nounwind {281; X86-LABEL: freeze_cttz:282; X86:       # %bb.0:283; X86-NEXT:    bsfl {{[0-9]+}}(%esp), %ecx284; X86-NEXT:    movl $32, %eax285; X86-NEXT:    cmovnel %ecx, %eax286; X86-NEXT:    retl287;288; X64-LABEL: freeze_cttz:289; X64:       # %bb.0:290; X64-NEXT:    movl $32, %eax291; X64-NEXT:    rep bsfl %edi, %eax292; X64-NEXT:    retq293  %x = call i32 @llvm.cttz.i32(i32 %a0, i1 0)294  %f = freeze i32 %x295  %c = icmp eq i32 %a0, 0296  %r = select i1 %c, i32 32, i32 %f297  ret i32 %r298}299 300define i32 @freeze_cttz_undef(i32 %a0) nounwind {301; X86-LABEL: freeze_cttz_undef:302; X86:       # %bb.0:303; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax304; X86-NEXT:    bsfl %eax, %ecx305; X86-NEXT:    movl $32, %eax306; X86-NEXT:    cmovnel %ecx, %eax307; X86-NEXT:    retl308;309; X64-LABEL: freeze_cttz_undef:310; X64:       # %bb.0:311; X64-NEXT:    bsfl %edi, %ecx312; X64-NEXT:    movl $32, %eax313; X64-NEXT:    cmovnel %ecx, %eax314; X64-NEXT:    retq315  %x = call i32 @llvm.cttz.i32(i32 %a0, i1 -1)316  %f = freeze i32 %x317  %c = icmp eq i32 %a0, 0318  %r = select i1 %c, i32 32, i32 %f319  ret i32 %r320}321 322define i32 @freeze_cttz_undef_nonzero(i32 %a0) nounwind {323; X86-LABEL: freeze_cttz_undef_nonzero:324; X86:       # %bb.0:325; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax326; X86-NEXT:    orl $1, %eax327; X86-NEXT:    rep bsfl %eax, %eax328; X86-NEXT:    retl329;330; X64-LABEL: freeze_cttz_undef_nonzero:331; X64:       # %bb.0:332; X64-NEXT:    orl $1, %edi333; X64-NEXT:    rep bsfl %edi, %eax334; X64-NEXT:    retq335  %y = or i32 %a0, 1336  %x = call i32 @llvm.cttz.i32(i32 %y, i1 -1)337  %f = freeze i32 %x338  %c = icmp eq i32 %y, 0339  %r = select i1 %c, i32 32, i32 %f340  ret i32 %r341}342 343; split parity pattern344define i8 @freeze_ctpop(i8 %a0) nounwind {345; X86-LABEL: freeze_ctpop:346; X86:       # %bb.0:347; X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)348; X86-NEXT:    setnp %al349; X86-NEXT:    retl350;351; X64-LABEL: freeze_ctpop:352; X64:       # %bb.0:353; X64-NEXT:    testb %dil, %dil354; X64-NEXT:    setnp %al355; X64-NEXT:    retq356  %x = call i8 @llvm.ctpop.i8(i8 %a0)357  %y = freeze i8 %x358  %z = and i8 %y, 1359  ret i8 %z360}361declare i8 @llvm.ctpop.i8(i8)362 363define <16 x i8> @freeze_ctpop_vec(<16 x i8> %a0) nounwind {364; X86-LABEL: freeze_ctpop_vec:365; X86:       # %bb.0:366; X86-NEXT:    movdqa %xmm0, %xmm1367; X86-NEXT:    psrlw $1, %xmm1368; X86-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1369; X86-NEXT:    psubb %xmm1, %xmm0370; X86-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]371; X86-NEXT:    movdqa %xmm0, %xmm2372; X86-NEXT:    pand %xmm1, %xmm2373; X86-NEXT:    psrlw $2, %xmm0374; X86-NEXT:    pand %xmm1, %xmm0375; X86-NEXT:    paddb %xmm2, %xmm0376; X86-NEXT:    movdqa %xmm0, %xmm1377; X86-NEXT:    psrlw $4, %xmm1378; X86-NEXT:    paddb %xmm1, %xmm0379; X86-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0380; X86-NEXT:    retl381;382; X64-LABEL: freeze_ctpop_vec:383; X64:       # %bb.0:384; X64-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]385; X64-NEXT:    movdqa %xmm0, %xmm3386; X64-NEXT:    pand %xmm2, %xmm3387; X64-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]388; X64-NEXT:    movdqa %xmm1, %xmm4389; X64-NEXT:    pshufb %xmm3, %xmm4390; X64-NEXT:    psrlw $4, %xmm0391; X64-NEXT:    pand %xmm2, %xmm0392; X64-NEXT:    pshufb %xmm0, %xmm1393; X64-NEXT:    paddb %xmm4, %xmm1394; X64-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1395; X64-NEXT:    movdqa %xmm1, %xmm0396; X64-NEXT:    retq397  %x = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a0)398  %y = freeze <16 x i8> %x399  %z = and <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>400  ret <16 x i8> %z401}402declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)403 404; parity knownbits pattern405define i8 @freeze_parity(i8 %a0) nounwind {406; X86-LABEL: freeze_parity:407; X86:       # %bb.0:408; X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)409; X86-NEXT:    setnp %al410; X86-NEXT:    retl411;412; X64-LABEL: freeze_parity:413; X64:       # %bb.0:414; X64-NEXT:    testb %dil, %dil415; X64-NEXT:    setnp %al416; X64-NEXT:    retq417  %x = call i8 @llvm.ctpop.i8(i8 %a0)418  %y = and i8 %x, 1419  %z = freeze i8 %y420  %w = and i8 %z, 1421  ret i8 %w422}423 424define <16 x i8> @freeze_parity_vec(<16 x i8> %a0) nounwind {425; X86-LABEL: freeze_parity_vec:426; X86:       # %bb.0:427; X86-NEXT:    movdqa %xmm0, %xmm1428; X86-NEXT:    psrlw $1, %xmm1429; X86-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1430; X86-NEXT:    psubb %xmm1, %xmm0431; X86-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]432; X86-NEXT:    movdqa %xmm0, %xmm2433; X86-NEXT:    pand %xmm1, %xmm2434; X86-NEXT:    psrlw $2, %xmm0435; X86-NEXT:    pand %xmm1, %xmm0436; X86-NEXT:    paddb %xmm2, %xmm0437; X86-NEXT:    movdqa %xmm0, %xmm1438; X86-NEXT:    psrlw $4, %xmm1439; X86-NEXT:    paddb %xmm1, %xmm0440; X86-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0441; X86-NEXT:    retl442;443; X64-LABEL: freeze_parity_vec:444; X64:       # %bb.0:445; X64-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]446; X64-NEXT:    movdqa %xmm0, %xmm3447; X64-NEXT:    pand %xmm2, %xmm3448; X64-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]449; X64-NEXT:    movdqa %xmm1, %xmm4450; X64-NEXT:    pshufb %xmm3, %xmm4451; X64-NEXT:    psrlw $4, %xmm0452; X64-NEXT:    pand %xmm2, %xmm0453; X64-NEXT:    pshufb %xmm0, %xmm1454; X64-NEXT:    paddb %xmm4, %xmm1455; X64-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1456; X64-NEXT:    movdqa %xmm1, %xmm0457; X64-NEXT:    retq458  %x = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a0)459  %y = and <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>460  %z = freeze <16 x i8> %y461  %w = and <16 x i8> %z, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>462  ret <16 x i8> %z463}464