931 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=CHECK-LINUX643; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s --check-prefix=CHECK-WIN32-644; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefix=CHECK-X865 6define void @g64xh(i64 inreg %x) nounwind {7; CHECK-LINUX64-LABEL: g64xh:8; CHECK-LINUX64: # %bb.0:9; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x80010; CHECK-LINUX64-NEXT: jne .LBB0_211; CHECK-LINUX64-NEXT: # %bb.1: # %yes12; CHECK-LINUX64-NEXT: pushq %rax13; CHECK-LINUX64-NEXT: callq bar@PLT14; CHECK-LINUX64-NEXT: popq %rax15; CHECK-LINUX64-NEXT: .LBB0_2: # %no16; CHECK-LINUX64-NEXT: retq17;18; CHECK-WIN32-64-LABEL: g64xh:19; CHECK-WIN32-64: # %bb.0:20; CHECK-WIN32-64-NEXT: subq $40, %rsp21; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x80022; CHECK-WIN32-64-NEXT: jne .LBB0_223; CHECK-WIN32-64-NEXT: # %bb.1: # %yes24; CHECK-WIN32-64-NEXT: callq bar25; CHECK-WIN32-64-NEXT: .LBB0_2: # %no26; CHECK-WIN32-64-NEXT: addq $40, %rsp27; CHECK-WIN32-64-NEXT: retq28;29; CHECK-X86-LABEL: g64xh:30; CHECK-X86: # %bb.0:31; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x80032; CHECK-X86-NEXT: jne .LBB0_233; CHECK-X86-NEXT: # %bb.1: # %yes34; CHECK-X86-NEXT: calll bar@PLT35; CHECK-X86-NEXT: .LBB0_2: # %no36; CHECK-X86-NEXT: retl37 %t = and i64 %x, 204838 %s = icmp eq i64 %t, 039 br i1 %s, label %yes, label %no40 41yes:42 call void @bar()43 ret void44no:45 ret void46}47 48define void @g64xl(i64 inreg %x) nounwind {49; CHECK-LINUX64-LABEL: g64xl:50; CHECK-LINUX64: # %bb.0:51; CHECK-LINUX64-NEXT: testb $8, %dil52; CHECK-LINUX64-NEXT: jne .LBB1_253; CHECK-LINUX64-NEXT: # %bb.1: # %yes54; CHECK-LINUX64-NEXT: pushq %rax55; CHECK-LINUX64-NEXT: callq bar@PLT56; CHECK-LINUX64-NEXT: popq %rax57; CHECK-LINUX64-NEXT: .LBB1_2: # %no58; CHECK-LINUX64-NEXT: retq59;60; CHECK-WIN32-64-LABEL: g64xl:61; CHECK-WIN32-64: # %bb.0:62; CHECK-WIN32-64-NEXT: subq $40, %rsp63; CHECK-WIN32-64-NEXT: testb $8, %cl64; CHECK-WIN32-64-NEXT: jne .LBB1_265; CHECK-WIN32-64-NEXT: # %bb.1: # %yes66; CHECK-WIN32-64-NEXT: callq bar67; CHECK-WIN32-64-NEXT: .LBB1_2: # %no68; CHECK-WIN32-64-NEXT: addq $40, %rsp69; CHECK-WIN32-64-NEXT: retq70;71; CHECK-X86-LABEL: g64xl:72; CHECK-X86: # %bb.0:73; CHECK-X86-NEXT: testb $8, %al74; CHECK-X86-NEXT: jne .LBB1_275; CHECK-X86-NEXT: # %bb.1: # %yes76; CHECK-X86-NEXT: calll bar@PLT77; CHECK-X86-NEXT: .LBB1_2: # %no78; CHECK-X86-NEXT: retl79 %t = and i64 %x, 880 %s = icmp eq i64 %t, 081 br i1 %s, label %yes, label %no82 83yes:84 call void @bar()85 ret void86no:87 ret void88}89 90define void @g32xh(i32 inreg %x) nounwind {91; CHECK-LINUX64-LABEL: g32xh:92; CHECK-LINUX64: # %bb.0:93; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x80094; CHECK-LINUX64-NEXT: jne .LBB2_295; CHECK-LINUX64-NEXT: # %bb.1: # %yes96; CHECK-LINUX64-NEXT: pushq %rax97; CHECK-LINUX64-NEXT: callq bar@PLT98; CHECK-LINUX64-NEXT: popq %rax99; CHECK-LINUX64-NEXT: .LBB2_2: # %no100; CHECK-LINUX64-NEXT: retq101;102; CHECK-WIN32-64-LABEL: g32xh:103; CHECK-WIN32-64: # %bb.0:104; CHECK-WIN32-64-NEXT: subq $40, %rsp105; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800106; CHECK-WIN32-64-NEXT: jne .LBB2_2107; CHECK-WIN32-64-NEXT: # %bb.1: # %yes108; CHECK-WIN32-64-NEXT: callq bar109; CHECK-WIN32-64-NEXT: .LBB2_2: # %no110; CHECK-WIN32-64-NEXT: addq $40, %rsp111; CHECK-WIN32-64-NEXT: retq112;113; CHECK-X86-LABEL: g32xh:114; CHECK-X86: # %bb.0:115; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800116; CHECK-X86-NEXT: jne .LBB2_2117; CHECK-X86-NEXT: # %bb.1: # %yes118; CHECK-X86-NEXT: calll bar@PLT119; CHECK-X86-NEXT: .LBB2_2: # %no120; CHECK-X86-NEXT: retl121 %t = and i32 %x, 2048122 %s = icmp eq i32 %t, 0123 br i1 %s, label %yes, label %no124 125yes:126 call void @bar()127 ret void128no:129 ret void130}131 132define void @g32xl(i32 inreg %x) nounwind {133; CHECK-LINUX64-LABEL: g32xl:134; CHECK-LINUX64: # %bb.0:135; CHECK-LINUX64-NEXT: testb $8, %dil136; CHECK-LINUX64-NEXT: jne .LBB3_2137; CHECK-LINUX64-NEXT: # %bb.1: # %yes138; CHECK-LINUX64-NEXT: pushq %rax139; CHECK-LINUX64-NEXT: callq bar@PLT140; CHECK-LINUX64-NEXT: popq %rax141; CHECK-LINUX64-NEXT: .LBB3_2: # %no142; CHECK-LINUX64-NEXT: retq143;144; CHECK-WIN32-64-LABEL: g32xl:145; CHECK-WIN32-64: # %bb.0:146; CHECK-WIN32-64-NEXT: subq $40, %rsp147; CHECK-WIN32-64-NEXT: testb $8, %cl148; CHECK-WIN32-64-NEXT: jne .LBB3_2149; CHECK-WIN32-64-NEXT: # %bb.1: # %yes150; CHECK-WIN32-64-NEXT: callq bar151; CHECK-WIN32-64-NEXT: .LBB3_2: # %no152; CHECK-WIN32-64-NEXT: addq $40, %rsp153; CHECK-WIN32-64-NEXT: retq154;155; CHECK-X86-LABEL: g32xl:156; CHECK-X86: # %bb.0:157; CHECK-X86-NEXT: testb $8, %al158; CHECK-X86-NEXT: jne .LBB3_2159; CHECK-X86-NEXT: # %bb.1: # %yes160; CHECK-X86-NEXT: calll bar@PLT161; CHECK-X86-NEXT: .LBB3_2: # %no162; CHECK-X86-NEXT: retl163 %t = and i32 %x, 8164 %s = icmp eq i32 %t, 0165 br i1 %s, label %yes, label %no166 167yes:168 call void @bar()169 ret void170no:171 ret void172}173 174define void @g16xh(i16 inreg %x) nounwind {175; CHECK-LINUX64-LABEL: g16xh:176; CHECK-LINUX64: # %bb.0:177; CHECK-LINUX64-NEXT: testl $2048, %edi # imm = 0x800178; CHECK-LINUX64-NEXT: jne .LBB4_2179; CHECK-LINUX64-NEXT: # %bb.1: # %yes180; CHECK-LINUX64-NEXT: pushq %rax181; CHECK-LINUX64-NEXT: callq bar@PLT182; CHECK-LINUX64-NEXT: popq %rax183; CHECK-LINUX64-NEXT: .LBB4_2: # %no184; CHECK-LINUX64-NEXT: retq185;186; CHECK-WIN32-64-LABEL: g16xh:187; CHECK-WIN32-64: # %bb.0:188; CHECK-WIN32-64-NEXT: subq $40, %rsp189; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx190; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800191; CHECK-WIN32-64-NEXT: jne .LBB4_2192; CHECK-WIN32-64-NEXT: # %bb.1: # %yes193; CHECK-WIN32-64-NEXT: callq bar194; CHECK-WIN32-64-NEXT: .LBB4_2: # %no195; CHECK-WIN32-64-NEXT: addq $40, %rsp196; CHECK-WIN32-64-NEXT: retq197;198; CHECK-X86-LABEL: g16xh:199; CHECK-X86: # %bb.0:200; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800201; CHECK-X86-NEXT: jne .LBB4_2202; CHECK-X86-NEXT: # %bb.1: # %yes203; CHECK-X86-NEXT: calll bar@PLT204; CHECK-X86-NEXT: .LBB4_2: # %no205; CHECK-X86-NEXT: retl206 %t = and i16 %x, 2048207 %s = icmp eq i16 %t, 0208 br i1 %s, label %yes, label %no209 210yes:211 call void @bar()212 ret void213no:214 ret void215}216 217define void @g16xl(i16 inreg %x) nounwind {218; CHECK-LINUX64-LABEL: g16xl:219; CHECK-LINUX64: # %bb.0:220; CHECK-LINUX64-NEXT: testb $8, %dil221; CHECK-LINUX64-NEXT: jne .LBB5_2222; CHECK-LINUX64-NEXT: # %bb.1: # %yes223; CHECK-LINUX64-NEXT: pushq %rax224; CHECK-LINUX64-NEXT: callq bar@PLT225; CHECK-LINUX64-NEXT: popq %rax226; CHECK-LINUX64-NEXT: .LBB5_2: # %no227; CHECK-LINUX64-NEXT: retq228;229; CHECK-WIN32-64-LABEL: g16xl:230; CHECK-WIN32-64: # %bb.0:231; CHECK-WIN32-64-NEXT: subq $40, %rsp232; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx233; CHECK-WIN32-64-NEXT: testb $8, %cl234; CHECK-WIN32-64-NEXT: jne .LBB5_2235; CHECK-WIN32-64-NEXT: # %bb.1: # %yes236; CHECK-WIN32-64-NEXT: callq bar237; CHECK-WIN32-64-NEXT: .LBB5_2: # %no238; CHECK-WIN32-64-NEXT: addq $40, %rsp239; CHECK-WIN32-64-NEXT: retq240;241; CHECK-X86-LABEL: g16xl:242; CHECK-X86: # %bb.0:243; CHECK-X86-NEXT: testb $8, %al244; CHECK-X86-NEXT: jne .LBB5_2245; CHECK-X86-NEXT: # %bb.1: # %yes246; CHECK-X86-NEXT: calll bar@PLT247; CHECK-X86-NEXT: .LBB5_2: # %no248; CHECK-X86-NEXT: retl249 %t = and i16 %x, 8250 %s = icmp eq i16 %t, 0251 br i1 %s, label %yes, label %no252 253yes:254 call void @bar()255 ret void256no:257 ret void258}259 260define void @g64x16(i64 inreg %x) nounwind {261; CHECK-LINUX64-LABEL: g64x16:262; CHECK-LINUX64: # %bb.0:263; CHECK-LINUX64-NEXT: testl $32896, %edi # imm = 0x8080264; CHECK-LINUX64-NEXT: je .LBB6_1265; CHECK-LINUX64-NEXT: # %bb.2: # %no266; CHECK-LINUX64-NEXT: retq267; CHECK-LINUX64-NEXT: .LBB6_1: # %yes268; CHECK-LINUX64-NEXT: pushq %rax269; CHECK-LINUX64-NEXT: callq bar@PLT270; CHECK-LINUX64-NEXT: popq %rax271; CHECK-LINUX64-NEXT: retq272;273; CHECK-WIN32-64-LABEL: g64x16:274; CHECK-WIN32-64: # %bb.0:275; CHECK-WIN32-64-NEXT: subq $40, %rsp276; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080277; CHECK-WIN32-64-NEXT: je .LBB6_1278; CHECK-WIN32-64-NEXT: # %bb.2: # %no279; CHECK-WIN32-64-NEXT: addq $40, %rsp280; CHECK-WIN32-64-NEXT: retq281; CHECK-WIN32-64-NEXT: .LBB6_1: # %yes282; CHECK-WIN32-64-NEXT: callq bar283; CHECK-WIN32-64-NEXT: addq $40, %rsp284; CHECK-WIN32-64-NEXT: retq285;286; CHECK-X86-LABEL: g64x16:287; CHECK-X86: # %bb.0:288; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080289; CHECK-X86-NEXT: je .LBB6_1290; CHECK-X86-NEXT: # %bb.2: # %no291; CHECK-X86-NEXT: retl292; CHECK-X86-NEXT: .LBB6_1: # %yes293; CHECK-X86-NEXT: calll bar@PLT294; CHECK-X86-NEXT: retl295 %t = and i64 %x, 32896296 %s = icmp eq i64 %t, 0297 br i1 %s, label %yes, label %no298 299yes:300 call void @bar()301 ret void302no:303 ret void304}305 306define void @g64x16minsize(i64 inreg %x) nounwind minsize {307; CHECK-LINUX64-LABEL: g64x16minsize:308; CHECK-LINUX64: # %bb.0:309; CHECK-LINUX64-NEXT: testw $-32640, %di # imm = 0x8080310; CHECK-LINUX64-NEXT: je .LBB7_1311; CHECK-LINUX64-NEXT: # %bb.2: # %no312; CHECK-LINUX64-NEXT: retq313; CHECK-LINUX64-NEXT: .LBB7_1: # %yes314; CHECK-LINUX64-NEXT: pushq %rax315; CHECK-LINUX64-NEXT: callq bar@PLT316; CHECK-LINUX64-NEXT: popq %rax317; CHECK-LINUX64-NEXT: retq318;319; CHECK-WIN32-64-LABEL: g64x16minsize:320; CHECK-WIN32-64: # %bb.0:321; CHECK-WIN32-64-NEXT: subq $40, %rsp322; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080323; CHECK-WIN32-64-NEXT: jne .LBB7_2324; CHECK-WIN32-64-NEXT: # %bb.1: # %yes325; CHECK-WIN32-64-NEXT: callq bar326; CHECK-WIN32-64-NEXT: .LBB7_2: # %no327; CHECK-WIN32-64-NEXT: addq $40, %rsp328; CHECK-WIN32-64-NEXT: retq329;330; CHECK-X86-LABEL: g64x16minsize:331; CHECK-X86: # %bb.0:332; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080333; CHECK-X86-NEXT: je .LBB7_1334; CHECK-X86-NEXT: # %bb.2: # %no335; CHECK-X86-NEXT: retl336; CHECK-X86-NEXT: .LBB7_1: # %yes337; CHECK-X86-NEXT: calll bar@PLT338; CHECK-X86-NEXT: retl339 %t = and i64 %x, 32896340 %s = icmp eq i64 %t, 0341 br i1 %s, label %yes, label %no342 343yes:344 call void @bar()345 ret void346no:347 ret void348}349 350define void @g32x16(i32 inreg %x) nounwind {351; CHECK-LINUX64-LABEL: g32x16:352; CHECK-LINUX64: # %bb.0:353; CHECK-LINUX64-NEXT: testl $32896, %edi # imm = 0x8080354; CHECK-LINUX64-NEXT: je .LBB8_1355; CHECK-LINUX64-NEXT: # %bb.2: # %no356; CHECK-LINUX64-NEXT: retq357; CHECK-LINUX64-NEXT: .LBB8_1: # %yes358; CHECK-LINUX64-NEXT: pushq %rax359; CHECK-LINUX64-NEXT: callq bar@PLT360; CHECK-LINUX64-NEXT: popq %rax361; CHECK-LINUX64-NEXT: retq362;363; CHECK-WIN32-64-LABEL: g32x16:364; CHECK-WIN32-64: # %bb.0:365; CHECK-WIN32-64-NEXT: subq $40, %rsp366; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080367; CHECK-WIN32-64-NEXT: je .LBB8_1368; CHECK-WIN32-64-NEXT: # %bb.2: # %no369; CHECK-WIN32-64-NEXT: addq $40, %rsp370; CHECK-WIN32-64-NEXT: retq371; CHECK-WIN32-64-NEXT: .LBB8_1: # %yes372; CHECK-WIN32-64-NEXT: callq bar373; CHECK-WIN32-64-NEXT: addq $40, %rsp374; CHECK-WIN32-64-NEXT: retq375;376; CHECK-X86-LABEL: g32x16:377; CHECK-X86: # %bb.0:378; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080379; CHECK-X86-NEXT: je .LBB8_1380; CHECK-X86-NEXT: # %bb.2: # %no381; CHECK-X86-NEXT: retl382; CHECK-X86-NEXT: .LBB8_1: # %yes383; CHECK-X86-NEXT: calll bar@PLT384; CHECK-X86-NEXT: retl385 %t = and i32 %x, 32896386 %s = icmp eq i32 %t, 0387 br i1 %s, label %yes, label %no388 389yes:390 call void @bar()391 ret void392no:393 ret void394}395 396define void @g32x16minsize(i32 inreg %x) nounwind minsize {397; CHECK-LINUX64-LABEL: g32x16minsize:398; CHECK-LINUX64: # %bb.0:399; CHECK-LINUX64-NEXT: testw $-32640, %di # imm = 0x8080400; CHECK-LINUX64-NEXT: je .LBB9_1401; CHECK-LINUX64-NEXT: # %bb.2: # %no402; CHECK-LINUX64-NEXT: retq403; CHECK-LINUX64-NEXT: .LBB9_1: # %yes404; CHECK-LINUX64-NEXT: pushq %rax405; CHECK-LINUX64-NEXT: callq bar@PLT406; CHECK-LINUX64-NEXT: popq %rax407; CHECK-LINUX64-NEXT: retq408;409; CHECK-WIN32-64-LABEL: g32x16minsize:410; CHECK-WIN32-64: # %bb.0:411; CHECK-WIN32-64-NEXT: subq $40, %rsp412; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080413; CHECK-WIN32-64-NEXT: jne .LBB9_2414; CHECK-WIN32-64-NEXT: # %bb.1: # %yes415; CHECK-WIN32-64-NEXT: callq bar416; CHECK-WIN32-64-NEXT: .LBB9_2: # %no417; CHECK-WIN32-64-NEXT: addq $40, %rsp418; CHECK-WIN32-64-NEXT: retq419;420; CHECK-X86-LABEL: g32x16minsize:421; CHECK-X86: # %bb.0:422; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080423; CHECK-X86-NEXT: je .LBB9_1424; CHECK-X86-NEXT: # %bb.2: # %no425; CHECK-X86-NEXT: retl426; CHECK-X86-NEXT: .LBB9_1: # %yes427; CHECK-X86-NEXT: calll bar@PLT428; CHECK-X86-NEXT: retl429 %t = and i32 %x, 32896430 %s = icmp eq i32 %t, 0431 br i1 %s, label %yes, label %no432 433yes:434 call void @bar()435 ret void436no:437 ret void438}439 440define void @g64x32(i64 inreg %x) nounwind {441; CHECK-LINUX64-LABEL: g64x32:442; CHECK-LINUX64: # %bb.0:443; CHECK-LINUX64-NEXT: testl $268468352, %edi # imm = 0x10008080444; CHECK-LINUX64-NEXT: je .LBB10_1445; CHECK-LINUX64-NEXT: # %bb.2: # %no446; CHECK-LINUX64-NEXT: retq447; CHECK-LINUX64-NEXT: .LBB10_1: # %yes448; CHECK-LINUX64-NEXT: pushq %rax449; CHECK-LINUX64-NEXT: callq bar@PLT450; CHECK-LINUX64-NEXT: popq %rax451; CHECK-LINUX64-NEXT: retq452;453; CHECK-WIN32-64-LABEL: g64x32:454; CHECK-WIN32-64: # %bb.0:455; CHECK-WIN32-64-NEXT: subq $40, %rsp456; CHECK-WIN32-64-NEXT: testl $268468352, %ecx # imm = 0x10008080457; CHECK-WIN32-64-NEXT: je .LBB10_1458; CHECK-WIN32-64-NEXT: # %bb.2: # %no459; CHECK-WIN32-64-NEXT: addq $40, %rsp460; CHECK-WIN32-64-NEXT: retq461; CHECK-WIN32-64-NEXT: .LBB10_1: # %yes462; CHECK-WIN32-64-NEXT: callq bar463; CHECK-WIN32-64-NEXT: addq $40, %rsp464; CHECK-WIN32-64-NEXT: retq465;466; CHECK-X86-LABEL: g64x32:467; CHECK-X86: # %bb.0:468; CHECK-X86-NEXT: testl $268468352, %eax # imm = 0x10008080469; CHECK-X86-NEXT: je .LBB10_1470; CHECK-X86-NEXT: # %bb.2: # %no471; CHECK-X86-NEXT: retl472; CHECK-X86-NEXT: .LBB10_1: # %yes473; CHECK-X86-NEXT: calll bar@PLT474; CHECK-X86-NEXT: retl475 %t = and i64 %x, 268468352476 %s = icmp eq i64 %t, 0477 br i1 %s, label %yes, label %no478 479yes:480 call void @bar()481 ret void482no:483 ret void484}485 486define void @truncand32(i16 inreg %x) nounwind {487; CHECK-LINUX64-LABEL: truncand32:488; CHECK-LINUX64: # %bb.0:489; CHECK-LINUX64-NEXT: testl $2049, %edi # imm = 0x801490; CHECK-LINUX64-NEXT: je .LBB11_1491; CHECK-LINUX64-NEXT: # %bb.2: # %no492; CHECK-LINUX64-NEXT: retq493; CHECK-LINUX64-NEXT: .LBB11_1: # %yes494; CHECK-LINUX64-NEXT: pushq %rax495; CHECK-LINUX64-NEXT: callq bar@PLT496; CHECK-LINUX64-NEXT: popq %rax497; CHECK-LINUX64-NEXT: retq498;499; CHECK-WIN32-64-LABEL: truncand32:500; CHECK-WIN32-64: # %bb.0:501; CHECK-WIN32-64-NEXT: subq $40, %rsp502; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx503; CHECK-WIN32-64-NEXT: testl $2049, %ecx # imm = 0x801504; CHECK-WIN32-64-NEXT: je .LBB11_1505; CHECK-WIN32-64-NEXT: # %bb.2: # %no506; CHECK-WIN32-64-NEXT: addq $40, %rsp507; CHECK-WIN32-64-NEXT: retq508; CHECK-WIN32-64-NEXT: .LBB11_1: # %yes509; CHECK-WIN32-64-NEXT: callq bar510; CHECK-WIN32-64-NEXT: addq $40, %rsp511; CHECK-WIN32-64-NEXT: retq512;513; CHECK-X86-LABEL: truncand32:514; CHECK-X86: # %bb.0:515; CHECK-X86-NEXT: testl $2049, %eax # imm = 0x801516; CHECK-X86-NEXT: je .LBB11_1517; CHECK-X86-NEXT: # %bb.2: # %no518; CHECK-X86-NEXT: retl519; CHECK-X86-NEXT: .LBB11_1: # %yes520; CHECK-X86-NEXT: calll bar@PLT521; CHECK-X86-NEXT: retl522 %t = and i16 %x, 2049523 %s = icmp eq i16 %t, 0524 br i1 %s, label %yes, label %no525 526yes:527 call void @bar()528 ret void529no:530 ret void531}532 533define void @testw(i16 inreg %x) nounwind minsize {534; CHECK-LINUX64-LABEL: testw:535; CHECK-LINUX64: # %bb.0:536; CHECK-LINUX64-NEXT: testw $2049, %di # imm = 0x801537; CHECK-LINUX64-NEXT: je .LBB12_1538; CHECK-LINUX64-NEXT: # %bb.2: # %no539; CHECK-LINUX64-NEXT: retq540; CHECK-LINUX64-NEXT: .LBB12_1: # %yes541; CHECK-LINUX64-NEXT: pushq %rax542; CHECK-LINUX64-NEXT: callq bar@PLT543; CHECK-LINUX64-NEXT: popq %rax544; CHECK-LINUX64-NEXT: retq545;546; CHECK-WIN32-64-LABEL: testw:547; CHECK-WIN32-64: # %bb.0:548; CHECK-WIN32-64-NEXT: subq $40, %rsp549; CHECK-WIN32-64-NEXT: testw $2049, %cx # imm = 0x801550; CHECK-WIN32-64-NEXT: jne .LBB12_2551; CHECK-WIN32-64-NEXT: # %bb.1: # %yes552; CHECK-WIN32-64-NEXT: callq bar553; CHECK-WIN32-64-NEXT: .LBB12_2: # %no554; CHECK-WIN32-64-NEXT: addq $40, %rsp555; CHECK-WIN32-64-NEXT: retq556;557; CHECK-X86-LABEL: testw:558; CHECK-X86: # %bb.0:559; CHECK-X86-NEXT: testw $2049, %ax # imm = 0x801560; CHECK-X86-NEXT: je .LBB12_1561; CHECK-X86-NEXT: # %bb.2: # %no562; CHECK-X86-NEXT: retl563; CHECK-X86-NEXT: .LBB12_1: # %yes564; CHECK-X86-NEXT: calll bar@PLT565; CHECK-X86-NEXT: retl566 %t = and i16 %x, 2049567 %s = icmp eq i16 %t, 0568 br i1 %s, label %yes, label %no569 570yes:571 call void @bar()572 ret void573no:574 ret void575}576 577define void @and16_trunc_8_sign(i16 %x) nounwind {578; CHECK-LINUX64-LABEL: and16_trunc_8_sign:579; CHECK-LINUX64: # %bb.0:580; CHECK-LINUX64-NEXT: testb $-128, %dil581; CHECK-LINUX64-NEXT: js .LBB13_2582; CHECK-LINUX64-NEXT: # %bb.1: # %yes583; CHECK-LINUX64-NEXT: pushq %rax584; CHECK-LINUX64-NEXT: callq bar@PLT585; CHECK-LINUX64-NEXT: popq %rax586; CHECK-LINUX64-NEXT: .LBB13_2: # %no587; CHECK-LINUX64-NEXT: retq588;589; CHECK-WIN32-64-LABEL: and16_trunc_8_sign:590; CHECK-WIN32-64: # %bb.0:591; CHECK-WIN32-64-NEXT: subq $40, %rsp592; CHECK-WIN32-64-NEXT: testb $-128, %cl593; CHECK-WIN32-64-NEXT: js .LBB13_2594; CHECK-WIN32-64-NEXT: # %bb.1: # %yes595; CHECK-WIN32-64-NEXT: callq bar596; CHECK-WIN32-64-NEXT: .LBB13_2: # %no597; CHECK-WIN32-64-NEXT: addq $40, %rsp598; CHECK-WIN32-64-NEXT: retq599;600; CHECK-X86-LABEL: and16_trunc_8_sign:601; CHECK-X86: # %bb.0:602; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp)603; CHECK-X86-NEXT: js .LBB13_2604; CHECK-X86-NEXT: # %bb.1: # %yes605; CHECK-X86-NEXT: calll bar@PLT606; CHECK-X86-NEXT: .LBB13_2: # %no607; CHECK-X86-NEXT: retl608 %t = and i16 %x, 128609 %r = trunc i16 %t to i8610 %s = icmp sge i8 %r, 0611 br i1 %s, label %yes, label %no612 613yes:614 call void @bar()615 ret void616no:617 ret void618}619 620define void @and32_trunc_8_sign(i32 %x) nounwind {621; CHECK-LINUX64-LABEL: and32_trunc_8_sign:622; CHECK-LINUX64: # %bb.0:623; CHECK-LINUX64-NEXT: testb $-128, %dil624; CHECK-LINUX64-NEXT: js .LBB14_2625; CHECK-LINUX64-NEXT: # %bb.1: # %yes626; CHECK-LINUX64-NEXT: pushq %rax627; CHECK-LINUX64-NEXT: callq bar@PLT628; CHECK-LINUX64-NEXT: popq %rax629; CHECK-LINUX64-NEXT: .LBB14_2: # %no630; CHECK-LINUX64-NEXT: retq631;632; CHECK-WIN32-64-LABEL: and32_trunc_8_sign:633; CHECK-WIN32-64: # %bb.0:634; CHECK-WIN32-64-NEXT: subq $40, %rsp635; CHECK-WIN32-64-NEXT: testb $-128, %cl636; CHECK-WIN32-64-NEXT: js .LBB14_2637; CHECK-WIN32-64-NEXT: # %bb.1: # %yes638; CHECK-WIN32-64-NEXT: callq bar639; CHECK-WIN32-64-NEXT: .LBB14_2: # %no640; CHECK-WIN32-64-NEXT: addq $40, %rsp641; CHECK-WIN32-64-NEXT: retq642;643; CHECK-X86-LABEL: and32_trunc_8_sign:644; CHECK-X86: # %bb.0:645; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp)646; CHECK-X86-NEXT: js .LBB14_2647; CHECK-X86-NEXT: # %bb.1: # %yes648; CHECK-X86-NEXT: calll bar@PLT649; CHECK-X86-NEXT: .LBB14_2: # %no650; CHECK-X86-NEXT: retl651 %t = and i32 %x, 128652 %r = trunc i32 %t to i8653 %s = icmp sge i8 %r, 0654 br i1 %s, label %yes, label %no655 656yes:657 call void @bar()658 ret void659no:660 ret void661}662 663define void @and64_trunc_8_sign(i64 %x) nounwind {664; CHECK-LINUX64-LABEL: and64_trunc_8_sign:665; CHECK-LINUX64: # %bb.0:666; CHECK-LINUX64-NEXT: testb $-128, %dil667; CHECK-LINUX64-NEXT: js .LBB15_2668; CHECK-LINUX64-NEXT: # %bb.1: # %yes669; CHECK-LINUX64-NEXT: pushq %rax670; CHECK-LINUX64-NEXT: callq bar@PLT671; CHECK-LINUX64-NEXT: popq %rax672; CHECK-LINUX64-NEXT: .LBB15_2: # %no673; CHECK-LINUX64-NEXT: retq674;675; CHECK-WIN32-64-LABEL: and64_trunc_8_sign:676; CHECK-WIN32-64: # %bb.0:677; CHECK-WIN32-64-NEXT: subq $40, %rsp678; CHECK-WIN32-64-NEXT: testb $-128, %cl679; CHECK-WIN32-64-NEXT: js .LBB15_2680; CHECK-WIN32-64-NEXT: # %bb.1: # %yes681; CHECK-WIN32-64-NEXT: callq bar682; CHECK-WIN32-64-NEXT: .LBB15_2: # %no683; CHECK-WIN32-64-NEXT: addq $40, %rsp684; CHECK-WIN32-64-NEXT: retq685;686; CHECK-X86-LABEL: and64_trunc_8_sign:687; CHECK-X86: # %bb.0:688; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp)689; CHECK-X86-NEXT: js .LBB15_2690; CHECK-X86-NEXT: # %bb.1: # %yes691; CHECK-X86-NEXT: calll bar@PLT692; CHECK-X86-NEXT: .LBB15_2: # %no693; CHECK-X86-NEXT: retl694 %t = and i64 %x, 128695 %r = trunc i64 %t to i8696 %s = icmp sge i8 %r, 0697 br i1 %s, label %yes, label %no698 699yes:700 call void @bar()701 ret void702no:703 ret void704}705 706define void @and32_trunc_16_sign(i32 %x) nounwind {707; CHECK-LINUX64-LABEL: and32_trunc_16_sign:708; CHECK-LINUX64: # %bb.0:709; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000710; CHECK-LINUX64-NEXT: testw %di, %di711; CHECK-LINUX64-NEXT: js .LBB16_2712; CHECK-LINUX64-NEXT: # %bb.1: # %yes713; CHECK-LINUX64-NEXT: pushq %rax714; CHECK-LINUX64-NEXT: callq bar@PLT715; CHECK-LINUX64-NEXT: popq %rax716; CHECK-LINUX64-NEXT: .LBB16_2: # %no717; CHECK-LINUX64-NEXT: retq718;719; CHECK-WIN32-64-LABEL: and32_trunc_16_sign:720; CHECK-WIN32-64: # %bb.0:721; CHECK-WIN32-64-NEXT: subq $40, %rsp722; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000723; CHECK-WIN32-64-NEXT: testw %cx, %cx724; CHECK-WIN32-64-NEXT: js .LBB16_2725; CHECK-WIN32-64-NEXT: # %bb.1: # %yes726; CHECK-WIN32-64-NEXT: callq bar727; CHECK-WIN32-64-NEXT: .LBB16_2: # %no728; CHECK-WIN32-64-NEXT: addq $40, %rsp729; CHECK-WIN32-64-NEXT: retq730;731; CHECK-X86-LABEL: and32_trunc_16_sign:732; CHECK-X86: # %bb.0:733; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax734; CHECK-X86-NEXT: andl $32768, %eax # imm = 0x8000735; CHECK-X86-NEXT: testw %ax, %ax736; CHECK-X86-NEXT: js .LBB16_2737; CHECK-X86-NEXT: # %bb.1: # %yes738; CHECK-X86-NEXT: calll bar@PLT739; CHECK-X86-NEXT: .LBB16_2: # %no740; CHECK-X86-NEXT: retl741 %t = and i32 %x, 32768742 %r = trunc i32 %t to i16743 %s = icmp sge i16 %r, 0744 br i1 %s, label %yes, label %no745 746yes:747 call void @bar()748 ret void749no:750 ret void751}752 753define void @and32_trunc_16_sign_minsize(i32 %x) minsize nounwind {754; CHECK-LINUX64-LABEL: and32_trunc_16_sign_minsize:755; CHECK-LINUX64: # %bb.0:756; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000757; CHECK-LINUX64-NEXT: js .LBB17_2758; CHECK-LINUX64-NEXT: # %bb.1: # %yes759; CHECK-LINUX64-NEXT: pushq %rax760; CHECK-LINUX64-NEXT: callq bar@PLT761; CHECK-LINUX64-NEXT: popq %rax762; CHECK-LINUX64-NEXT: .LBB17_2: # %no763; CHECK-LINUX64-NEXT: retq764;765; CHECK-WIN32-64-LABEL: and32_trunc_16_sign_minsize:766; CHECK-WIN32-64: # %bb.0:767; CHECK-WIN32-64-NEXT: subq $40, %rsp768; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000769; CHECK-WIN32-64-NEXT: js .LBB17_2770; CHECK-WIN32-64-NEXT: # %bb.1: # %yes771; CHECK-WIN32-64-NEXT: callq bar772; CHECK-WIN32-64-NEXT: .LBB17_2: # %no773; CHECK-WIN32-64-NEXT: addq $40, %rsp774; CHECK-WIN32-64-NEXT: retq775;776; CHECK-X86-LABEL: and32_trunc_16_sign_minsize:777; CHECK-X86: # %bb.0:778; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax779; CHECK-X86-NEXT: testw $-32768, %ax # imm = 0x8000780; CHECK-X86-NEXT: js .LBB17_2781; CHECK-X86-NEXT: # %bb.1: # %yes782; CHECK-X86-NEXT: calll bar@PLT783; CHECK-X86-NEXT: .LBB17_2: # %no784; CHECK-X86-NEXT: retl785 %t = and i32 %x, 32768786 %r = trunc i32 %t to i16787 %s = icmp sge i16 %r, 0788 br i1 %s, label %yes, label %no789 790yes:791 call void @bar()792 ret void793no:794 ret void795}796 797define void @and64_trunc_16_sign(i64 %x) nounwind {798; CHECK-LINUX64-LABEL: and64_trunc_16_sign:799; CHECK-LINUX64: # %bb.0:800; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000801; CHECK-LINUX64-NEXT: testw %di, %di802; CHECK-LINUX64-NEXT: js .LBB18_2803; CHECK-LINUX64-NEXT: # %bb.1: # %yes804; CHECK-LINUX64-NEXT: pushq %rax805; CHECK-LINUX64-NEXT: callq bar@PLT806; CHECK-LINUX64-NEXT: popq %rax807; CHECK-LINUX64-NEXT: .LBB18_2: # %no808; CHECK-LINUX64-NEXT: retq809;810; CHECK-WIN32-64-LABEL: and64_trunc_16_sign:811; CHECK-WIN32-64: # %bb.0:812; CHECK-WIN32-64-NEXT: subq $40, %rsp813; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000814; CHECK-WIN32-64-NEXT: testw %cx, %cx815; CHECK-WIN32-64-NEXT: js .LBB18_2816; CHECK-WIN32-64-NEXT: # %bb.1: # %yes817; CHECK-WIN32-64-NEXT: callq bar818; CHECK-WIN32-64-NEXT: .LBB18_2: # %no819; CHECK-WIN32-64-NEXT: addq $40, %rsp820; CHECK-WIN32-64-NEXT: retq821;822; CHECK-X86-LABEL: and64_trunc_16_sign:823; CHECK-X86: # %bb.0:824; CHECK-X86-NEXT: movl $32768, %eax # imm = 0x8000825; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax826; CHECK-X86-NEXT: testw %ax, %ax827; CHECK-X86-NEXT: js .LBB18_2828; CHECK-X86-NEXT: # %bb.1: # %yes829; CHECK-X86-NEXT: calll bar@PLT830; CHECK-X86-NEXT: .LBB18_2: # %no831; CHECK-X86-NEXT: retl832 %t = and i64 %x, 32768833 %r = trunc i64 %t to i16834 %s = icmp sge i16 %r, 0835 br i1 %s, label %yes, label %no836 837yes:838 call void @bar()839 ret void840no:841 ret void842}843 844define void @and64_trunc_16_sign_minsize(i64 %x) minsize nounwind {845; CHECK-LINUX64-LABEL: and64_trunc_16_sign_minsize:846; CHECK-LINUX64: # %bb.0:847; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000848; CHECK-LINUX64-NEXT: js .LBB19_2849; CHECK-LINUX64-NEXT: # %bb.1: # %yes850; CHECK-LINUX64-NEXT: pushq %rax851; CHECK-LINUX64-NEXT: callq bar@PLT852; CHECK-LINUX64-NEXT: popq %rax853; CHECK-LINUX64-NEXT: .LBB19_2: # %no854; CHECK-LINUX64-NEXT: retq855;856; CHECK-WIN32-64-LABEL: and64_trunc_16_sign_minsize:857; CHECK-WIN32-64: # %bb.0:858; CHECK-WIN32-64-NEXT: subq $40, %rsp859; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000860; CHECK-WIN32-64-NEXT: js .LBB19_2861; CHECK-WIN32-64-NEXT: # %bb.1: # %yes862; CHECK-WIN32-64-NEXT: callq bar863; CHECK-WIN32-64-NEXT: .LBB19_2: # %no864; CHECK-WIN32-64-NEXT: addq $40, %rsp865; CHECK-WIN32-64-NEXT: retq866;867; CHECK-X86-LABEL: and64_trunc_16_sign_minsize:868; CHECK-X86: # %bb.0:869; CHECK-X86-NEXT: testw $-32768, {{[0-9]+}}(%esp) # imm = 0x8000870; CHECK-X86-NEXT: js .LBB19_2871; CHECK-X86-NEXT: # %bb.1: # %yes872; CHECK-X86-NEXT: calll bar@PLT873; CHECK-X86-NEXT: .LBB19_2: # %no874; CHECK-X86-NEXT: retl875 %t = and i64 %x, 32768876 %r = trunc i64 %t to i16877 %s = icmp sge i16 %r, 0878 br i1 %s, label %yes, label %no879 880yes:881 call void @bar()882 ret void883no:884 ret void885}886 887define void @and64_trunc_32_sign(i64 %x) nounwind {888; CHECK-LINUX64-LABEL: and64_trunc_32_sign:889; CHECK-LINUX64: # %bb.0:890; CHECK-LINUX64-NEXT: testl $-2147483648, %edi # imm = 0x80000000891; CHECK-LINUX64-NEXT: js .LBB20_2892; CHECK-LINUX64-NEXT: # %bb.1: # %yes893; CHECK-LINUX64-NEXT: pushq %rax894; CHECK-LINUX64-NEXT: callq bar@PLT895; CHECK-LINUX64-NEXT: popq %rax896; CHECK-LINUX64-NEXT: .LBB20_2: # %no897; CHECK-LINUX64-NEXT: retq898;899; CHECK-WIN32-64-LABEL: and64_trunc_32_sign:900; CHECK-WIN32-64: # %bb.0:901; CHECK-WIN32-64-NEXT: subq $40, %rsp902; CHECK-WIN32-64-NEXT: testl $-2147483648, %ecx # imm = 0x80000000903; CHECK-WIN32-64-NEXT: js .LBB20_2904; CHECK-WIN32-64-NEXT: # %bb.1: # %yes905; CHECK-WIN32-64-NEXT: callq bar906; CHECK-WIN32-64-NEXT: .LBB20_2: # %no907; CHECK-WIN32-64-NEXT: addq $40, %rsp908; CHECK-WIN32-64-NEXT: retq909;910; CHECK-X86-LABEL: and64_trunc_32_sign:911; CHECK-X86: # %bb.0:912; CHECK-X86-NEXT: testl $-2147483648, {{[0-9]+}}(%esp) # imm = 0x80000000913; CHECK-X86-NEXT: js .LBB20_2914; CHECK-X86-NEXT: # %bb.1: # %yes915; CHECK-X86-NEXT: calll bar@PLT916; CHECK-X86-NEXT: .LBB20_2: # %no917; CHECK-X86-NEXT: retl918 %t = and i64 %x, 2147483648919 %r = trunc i64 %t to i32920 %s = icmp sge i32 %r, 0921 br i1 %s, label %yes, label %no922 923yes:924 call void @bar()925 ret void926no:927 ret void928}929 930declare void @bar()931