brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.2 KiB · 03bba9c Raw
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