1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=CHECK-LINUX64 3; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s --check-prefix=CHECK-WIN32-64 4; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefix=CHECK-X86 5 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 = 0x800 10; CHECK-LINUX64-NEXT: jne .LBB0_2 11; CHECK-LINUX64-NEXT: # %bb.1: # %yes 12; CHECK-LINUX64-NEXT: pushq %rax 13; CHECK-LINUX64-NEXT: callq bar@PLT 14; CHECK-LINUX64-NEXT: popq %rax 15; CHECK-LINUX64-NEXT: .LBB0_2: # %no 16; CHECK-LINUX64-NEXT: retq 17; 18; CHECK-WIN32-64-LABEL: g64xh: 19; CHECK-WIN32-64: # %bb.0: 20; CHECK-WIN32-64-NEXT: subq $40, %rsp 21; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 22; CHECK-WIN32-64-NEXT: jne .LBB0_2 23; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 24; CHECK-WIN32-64-NEXT: callq bar 25; CHECK-WIN32-64-NEXT: .LBB0_2: # %no 26; CHECK-WIN32-64-NEXT: addq $40, %rsp 27; CHECK-WIN32-64-NEXT: retq 28; 29; CHECK-X86-LABEL: g64xh: 30; CHECK-X86: # %bb.0: 31; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 32; CHECK-X86-NEXT: jne .LBB0_2 33; CHECK-X86-NEXT: # %bb.1: # %yes 34; CHECK-X86-NEXT: calll bar@PLT 35; CHECK-X86-NEXT: .LBB0_2: # %no 36; CHECK-X86-NEXT: retl 37 %t = and i64 %x, 2048 38 %s = icmp eq i64 %t, 0 39 br i1 %s, label %yes, label %no 40 41yes: 42 call void @bar() 43 ret void 44no: 45 ret void 46} 47 48define void @g64xl(i64 inreg %x) nounwind { 49; CHECK-LINUX64-LABEL: g64xl: 50; CHECK-LINUX64: # %bb.0: 51; CHECK-LINUX64-NEXT: testb $8, %dil 52; CHECK-LINUX64-NEXT: jne .LBB1_2 53; CHECK-LINUX64-NEXT: # %bb.1: # %yes 54; CHECK-LINUX64-NEXT: pushq %rax 55; CHECK-LINUX64-NEXT: callq bar@PLT 56; CHECK-LINUX64-NEXT: popq %rax 57; CHECK-LINUX64-NEXT: .LBB1_2: # %no 58; CHECK-LINUX64-NEXT: retq 59; 60; CHECK-WIN32-64-LABEL: g64xl: 61; CHECK-WIN32-64: # %bb.0: 62; CHECK-WIN32-64-NEXT: subq $40, %rsp 63; CHECK-WIN32-64-NEXT: testb $8, %cl 64; CHECK-WIN32-64-NEXT: jne .LBB1_2 65; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 66; CHECK-WIN32-64-NEXT: callq bar 67; CHECK-WIN32-64-NEXT: .LBB1_2: # %no 68; CHECK-WIN32-64-NEXT: addq $40, %rsp 69; CHECK-WIN32-64-NEXT: retq 70; 71; CHECK-X86-LABEL: g64xl: 72; CHECK-X86: # %bb.0: 73; CHECK-X86-NEXT: testb $8, %al 74; CHECK-X86-NEXT: jne .LBB1_2 75; CHECK-X86-NEXT: # %bb.1: # %yes 76; CHECK-X86-NEXT: calll bar@PLT 77; CHECK-X86-NEXT: .LBB1_2: # %no 78; CHECK-X86-NEXT: retl 79 %t = and i64 %x, 8 80 %s = icmp eq i64 %t, 0 81 br i1 %s, label %yes, label %no 82 83yes: 84 call void @bar() 85 ret void 86no: 87 ret void 88} 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 = 0x800 94; CHECK-LINUX64-NEXT: jne .LBB2_2 95; CHECK-LINUX64-NEXT: # %bb.1: # %yes 96; CHECK-LINUX64-NEXT: pushq %rax 97; CHECK-LINUX64-NEXT: callq bar@PLT 98; CHECK-LINUX64-NEXT: popq %rax 99; CHECK-LINUX64-NEXT: .LBB2_2: # %no 100; CHECK-LINUX64-NEXT: retq 101; 102; CHECK-WIN32-64-LABEL: g32xh: 103; CHECK-WIN32-64: # %bb.0: 104; CHECK-WIN32-64-NEXT: subq $40, %rsp 105; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 106; CHECK-WIN32-64-NEXT: jne .LBB2_2 107; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 108; CHECK-WIN32-64-NEXT: callq bar 109; CHECK-WIN32-64-NEXT: .LBB2_2: # %no 110; CHECK-WIN32-64-NEXT: addq $40, %rsp 111; CHECK-WIN32-64-NEXT: retq 112; 113; CHECK-X86-LABEL: g32xh: 114; CHECK-X86: # %bb.0: 115; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 116; CHECK-X86-NEXT: jne .LBB2_2 117; CHECK-X86-NEXT: # %bb.1: # %yes 118; CHECK-X86-NEXT: calll bar@PLT 119; CHECK-X86-NEXT: .LBB2_2: # %no 120; CHECK-X86-NEXT: retl 121 %t = and i32 %x, 2048 122 %s = icmp eq i32 %t, 0 123 br i1 %s, label %yes, label %no 124 125yes: 126 call void @bar() 127 ret void 128no: 129 ret void 130} 131 132define void @g32xl(i32 inreg %x) nounwind { 133; CHECK-LINUX64-LABEL: g32xl: 134; CHECK-LINUX64: # %bb.0: 135; CHECK-LINUX64-NEXT: testb $8, %dil 136; CHECK-LINUX64-NEXT: jne .LBB3_2 137; CHECK-LINUX64-NEXT: # %bb.1: # %yes 138; CHECK-LINUX64-NEXT: pushq %rax 139; CHECK-LINUX64-NEXT: callq bar@PLT 140; CHECK-LINUX64-NEXT: popq %rax 141; CHECK-LINUX64-NEXT: .LBB3_2: # %no 142; CHECK-LINUX64-NEXT: retq 143; 144; CHECK-WIN32-64-LABEL: g32xl: 145; CHECK-WIN32-64: # %bb.0: 146; CHECK-WIN32-64-NEXT: subq $40, %rsp 147; CHECK-WIN32-64-NEXT: testb $8, %cl 148; CHECK-WIN32-64-NEXT: jne .LBB3_2 149; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 150; CHECK-WIN32-64-NEXT: callq bar 151; CHECK-WIN32-64-NEXT: .LBB3_2: # %no 152; CHECK-WIN32-64-NEXT: addq $40, %rsp 153; CHECK-WIN32-64-NEXT: retq 154; 155; CHECK-X86-LABEL: g32xl: 156; CHECK-X86: # %bb.0: 157; CHECK-X86-NEXT: testb $8, %al 158; CHECK-X86-NEXT: jne .LBB3_2 159; CHECK-X86-NEXT: # %bb.1: # %yes 160; CHECK-X86-NEXT: calll bar@PLT 161; CHECK-X86-NEXT: .LBB3_2: # %no 162; CHECK-X86-NEXT: retl 163 %t = and i32 %x, 8 164 %s = icmp eq i32 %t, 0 165 br i1 %s, label %yes, label %no 166 167yes: 168 call void @bar() 169 ret void 170no: 171 ret void 172} 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 = 0x800 178; CHECK-LINUX64-NEXT: jne .LBB4_2 179; CHECK-LINUX64-NEXT: # %bb.1: # %yes 180; CHECK-LINUX64-NEXT: pushq %rax 181; CHECK-LINUX64-NEXT: callq bar@PLT 182; CHECK-LINUX64-NEXT: popq %rax 183; CHECK-LINUX64-NEXT: .LBB4_2: # %no 184; CHECK-LINUX64-NEXT: retq 185; 186; CHECK-WIN32-64-LABEL: g16xh: 187; CHECK-WIN32-64: # %bb.0: 188; CHECK-WIN32-64-NEXT: subq $40, %rsp 189; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 190; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 191; CHECK-WIN32-64-NEXT: jne .LBB4_2 192; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 193; CHECK-WIN32-64-NEXT: callq bar 194; CHECK-WIN32-64-NEXT: .LBB4_2: # %no 195; CHECK-WIN32-64-NEXT: addq $40, %rsp 196; CHECK-WIN32-64-NEXT: retq 197; 198; CHECK-X86-LABEL: g16xh: 199; CHECK-X86: # %bb.0: 200; CHECK-X86-NEXT: testl $2048, %eax # imm = 0x800 201; CHECK-X86-NEXT: jne .LBB4_2 202; CHECK-X86-NEXT: # %bb.1: # %yes 203; CHECK-X86-NEXT: calll bar@PLT 204; CHECK-X86-NEXT: .LBB4_2: # %no 205; CHECK-X86-NEXT: retl 206 %t = and i16 %x, 2048 207 %s = icmp eq i16 %t, 0 208 br i1 %s, label %yes, label %no 209 210yes: 211 call void @bar() 212 ret void 213no: 214 ret void 215} 216 217define void @g16xl(i16 inreg %x) nounwind { 218; CHECK-LINUX64-LABEL: g16xl: 219; CHECK-LINUX64: # %bb.0: 220; CHECK-LINUX64-NEXT: testb $8, %dil 221; CHECK-LINUX64-NEXT: jne .LBB5_2 222; CHECK-LINUX64-NEXT: # %bb.1: # %yes 223; CHECK-LINUX64-NEXT: pushq %rax 224; CHECK-LINUX64-NEXT: callq bar@PLT 225; CHECK-LINUX64-NEXT: popq %rax 226; CHECK-LINUX64-NEXT: .LBB5_2: # %no 227; CHECK-LINUX64-NEXT: retq 228; 229; CHECK-WIN32-64-LABEL: g16xl: 230; CHECK-WIN32-64: # %bb.0: 231; CHECK-WIN32-64-NEXT: subq $40, %rsp 232; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 233; CHECK-WIN32-64-NEXT: testb $8, %cl 234; CHECK-WIN32-64-NEXT: jne .LBB5_2 235; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 236; CHECK-WIN32-64-NEXT: callq bar 237; CHECK-WIN32-64-NEXT: .LBB5_2: # %no 238; CHECK-WIN32-64-NEXT: addq $40, %rsp 239; CHECK-WIN32-64-NEXT: retq 240; 241; CHECK-X86-LABEL: g16xl: 242; CHECK-X86: # %bb.0: 243; CHECK-X86-NEXT: testb $8, %al 244; CHECK-X86-NEXT: jne .LBB5_2 245; CHECK-X86-NEXT: # %bb.1: # %yes 246; CHECK-X86-NEXT: calll bar@PLT 247; CHECK-X86-NEXT: .LBB5_2: # %no 248; CHECK-X86-NEXT: retl 249 %t = and i16 %x, 8 250 %s = icmp eq i16 %t, 0 251 br i1 %s, label %yes, label %no 252 253yes: 254 call void @bar() 255 ret void 256no: 257 ret void 258} 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 = 0x8080 264; CHECK-LINUX64-NEXT: je .LBB6_1 265; CHECK-LINUX64-NEXT: # %bb.2: # %no 266; CHECK-LINUX64-NEXT: retq 267; CHECK-LINUX64-NEXT: .LBB6_1: # %yes 268; CHECK-LINUX64-NEXT: pushq %rax 269; CHECK-LINUX64-NEXT: callq bar@PLT 270; CHECK-LINUX64-NEXT: popq %rax 271; CHECK-LINUX64-NEXT: retq 272; 273; CHECK-WIN32-64-LABEL: g64x16: 274; CHECK-WIN32-64: # %bb.0: 275; CHECK-WIN32-64-NEXT: subq $40, %rsp 276; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080 277; CHECK-WIN32-64-NEXT: je .LBB6_1 278; CHECK-WIN32-64-NEXT: # %bb.2: # %no 279; CHECK-WIN32-64-NEXT: addq $40, %rsp 280; CHECK-WIN32-64-NEXT: retq 281; CHECK-WIN32-64-NEXT: .LBB6_1: # %yes 282; CHECK-WIN32-64-NEXT: callq bar 283; CHECK-WIN32-64-NEXT: addq $40, %rsp 284; CHECK-WIN32-64-NEXT: retq 285; 286; CHECK-X86-LABEL: g64x16: 287; CHECK-X86: # %bb.0: 288; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080 289; CHECK-X86-NEXT: je .LBB6_1 290; CHECK-X86-NEXT: # %bb.2: # %no 291; CHECK-X86-NEXT: retl 292; CHECK-X86-NEXT: .LBB6_1: # %yes 293; CHECK-X86-NEXT: calll bar@PLT 294; CHECK-X86-NEXT: retl 295 %t = and i64 %x, 32896 296 %s = icmp eq i64 %t, 0 297 br i1 %s, label %yes, label %no 298 299yes: 300 call void @bar() 301 ret void 302no: 303 ret void 304} 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 = 0x8080 310; CHECK-LINUX64-NEXT: je .LBB7_1 311; CHECK-LINUX64-NEXT: # %bb.2: # %no 312; CHECK-LINUX64-NEXT: retq 313; CHECK-LINUX64-NEXT: .LBB7_1: # %yes 314; CHECK-LINUX64-NEXT: pushq %rax 315; CHECK-LINUX64-NEXT: callq bar@PLT 316; CHECK-LINUX64-NEXT: popq %rax 317; CHECK-LINUX64-NEXT: retq 318; 319; CHECK-WIN32-64-LABEL: g64x16minsize: 320; CHECK-WIN32-64: # %bb.0: 321; CHECK-WIN32-64-NEXT: subq $40, %rsp 322; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080 323; CHECK-WIN32-64-NEXT: jne .LBB7_2 324; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 325; CHECK-WIN32-64-NEXT: callq bar 326; CHECK-WIN32-64-NEXT: .LBB7_2: # %no 327; CHECK-WIN32-64-NEXT: addq $40, %rsp 328; CHECK-WIN32-64-NEXT: retq 329; 330; CHECK-X86-LABEL: g64x16minsize: 331; CHECK-X86: # %bb.0: 332; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080 333; CHECK-X86-NEXT: je .LBB7_1 334; CHECK-X86-NEXT: # %bb.2: # %no 335; CHECK-X86-NEXT: retl 336; CHECK-X86-NEXT: .LBB7_1: # %yes 337; CHECK-X86-NEXT: calll bar@PLT 338; CHECK-X86-NEXT: retl 339 %t = and i64 %x, 32896 340 %s = icmp eq i64 %t, 0 341 br i1 %s, label %yes, label %no 342 343yes: 344 call void @bar() 345 ret void 346no: 347 ret void 348} 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 = 0x8080 354; CHECK-LINUX64-NEXT: je .LBB8_1 355; CHECK-LINUX64-NEXT: # %bb.2: # %no 356; CHECK-LINUX64-NEXT: retq 357; CHECK-LINUX64-NEXT: .LBB8_1: # %yes 358; CHECK-LINUX64-NEXT: pushq %rax 359; CHECK-LINUX64-NEXT: callq bar@PLT 360; CHECK-LINUX64-NEXT: popq %rax 361; CHECK-LINUX64-NEXT: retq 362; 363; CHECK-WIN32-64-LABEL: g32x16: 364; CHECK-WIN32-64: # %bb.0: 365; CHECK-WIN32-64-NEXT: subq $40, %rsp 366; CHECK-WIN32-64-NEXT: testl $32896, %ecx # imm = 0x8080 367; CHECK-WIN32-64-NEXT: je .LBB8_1 368; CHECK-WIN32-64-NEXT: # %bb.2: # %no 369; CHECK-WIN32-64-NEXT: addq $40, %rsp 370; CHECK-WIN32-64-NEXT: retq 371; CHECK-WIN32-64-NEXT: .LBB8_1: # %yes 372; CHECK-WIN32-64-NEXT: callq bar 373; CHECK-WIN32-64-NEXT: addq $40, %rsp 374; CHECK-WIN32-64-NEXT: retq 375; 376; CHECK-X86-LABEL: g32x16: 377; CHECK-X86: # %bb.0: 378; CHECK-X86-NEXT: testl $32896, %eax # imm = 0x8080 379; CHECK-X86-NEXT: je .LBB8_1 380; CHECK-X86-NEXT: # %bb.2: # %no 381; CHECK-X86-NEXT: retl 382; CHECK-X86-NEXT: .LBB8_1: # %yes 383; CHECK-X86-NEXT: calll bar@PLT 384; CHECK-X86-NEXT: retl 385 %t = and i32 %x, 32896 386 %s = icmp eq i32 %t, 0 387 br i1 %s, label %yes, label %no 388 389yes: 390 call void @bar() 391 ret void 392no: 393 ret void 394} 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 = 0x8080 400; CHECK-LINUX64-NEXT: je .LBB9_1 401; CHECK-LINUX64-NEXT: # %bb.2: # %no 402; CHECK-LINUX64-NEXT: retq 403; CHECK-LINUX64-NEXT: .LBB9_1: # %yes 404; CHECK-LINUX64-NEXT: pushq %rax 405; CHECK-LINUX64-NEXT: callq bar@PLT 406; CHECK-LINUX64-NEXT: popq %rax 407; CHECK-LINUX64-NEXT: retq 408; 409; CHECK-WIN32-64-LABEL: g32x16minsize: 410; CHECK-WIN32-64: # %bb.0: 411; CHECK-WIN32-64-NEXT: subq $40, %rsp 412; CHECK-WIN32-64-NEXT: testw $-32640, %cx # imm = 0x8080 413; CHECK-WIN32-64-NEXT: jne .LBB9_2 414; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 415; CHECK-WIN32-64-NEXT: callq bar 416; CHECK-WIN32-64-NEXT: .LBB9_2: # %no 417; CHECK-WIN32-64-NEXT: addq $40, %rsp 418; CHECK-WIN32-64-NEXT: retq 419; 420; CHECK-X86-LABEL: g32x16minsize: 421; CHECK-X86: # %bb.0: 422; CHECK-X86-NEXT: testw $-32640, %ax # imm = 0x8080 423; CHECK-X86-NEXT: je .LBB9_1 424; CHECK-X86-NEXT: # %bb.2: # %no 425; CHECK-X86-NEXT: retl 426; CHECK-X86-NEXT: .LBB9_1: # %yes 427; CHECK-X86-NEXT: calll bar@PLT 428; CHECK-X86-NEXT: retl 429 %t = and i32 %x, 32896 430 %s = icmp eq i32 %t, 0 431 br i1 %s, label %yes, label %no 432 433yes: 434 call void @bar() 435 ret void 436no: 437 ret void 438} 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 = 0x10008080 444; CHECK-LINUX64-NEXT: je .LBB10_1 445; CHECK-LINUX64-NEXT: # %bb.2: # %no 446; CHECK-LINUX64-NEXT: retq 447; CHECK-LINUX64-NEXT: .LBB10_1: # %yes 448; CHECK-LINUX64-NEXT: pushq %rax 449; CHECK-LINUX64-NEXT: callq bar@PLT 450; CHECK-LINUX64-NEXT: popq %rax 451; CHECK-LINUX64-NEXT: retq 452; 453; CHECK-WIN32-64-LABEL: g64x32: 454; CHECK-WIN32-64: # %bb.0: 455; CHECK-WIN32-64-NEXT: subq $40, %rsp 456; CHECK-WIN32-64-NEXT: testl $268468352, %ecx # imm = 0x10008080 457; CHECK-WIN32-64-NEXT: je .LBB10_1 458; CHECK-WIN32-64-NEXT: # %bb.2: # %no 459; CHECK-WIN32-64-NEXT: addq $40, %rsp 460; CHECK-WIN32-64-NEXT: retq 461; CHECK-WIN32-64-NEXT: .LBB10_1: # %yes 462; CHECK-WIN32-64-NEXT: callq bar 463; CHECK-WIN32-64-NEXT: addq $40, %rsp 464; CHECK-WIN32-64-NEXT: retq 465; 466; CHECK-X86-LABEL: g64x32: 467; CHECK-X86: # %bb.0: 468; CHECK-X86-NEXT: testl $268468352, %eax # imm = 0x10008080 469; CHECK-X86-NEXT: je .LBB10_1 470; CHECK-X86-NEXT: # %bb.2: # %no 471; CHECK-X86-NEXT: retl 472; CHECK-X86-NEXT: .LBB10_1: # %yes 473; CHECK-X86-NEXT: calll bar@PLT 474; CHECK-X86-NEXT: retl 475 %t = and i64 %x, 268468352 476 %s = icmp eq i64 %t, 0 477 br i1 %s, label %yes, label %no 478 479yes: 480 call void @bar() 481 ret void 482no: 483 ret void 484} 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 = 0x801 490; CHECK-LINUX64-NEXT: je .LBB11_1 491; CHECK-LINUX64-NEXT: # %bb.2: # %no 492; CHECK-LINUX64-NEXT: retq 493; CHECK-LINUX64-NEXT: .LBB11_1: # %yes 494; CHECK-LINUX64-NEXT: pushq %rax 495; CHECK-LINUX64-NEXT: callq bar@PLT 496; CHECK-LINUX64-NEXT: popq %rax 497; CHECK-LINUX64-NEXT: retq 498; 499; CHECK-WIN32-64-LABEL: truncand32: 500; CHECK-WIN32-64: # %bb.0: 501; CHECK-WIN32-64-NEXT: subq $40, %rsp 502; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 503; CHECK-WIN32-64-NEXT: testl $2049, %ecx # imm = 0x801 504; CHECK-WIN32-64-NEXT: je .LBB11_1 505; CHECK-WIN32-64-NEXT: # %bb.2: # %no 506; CHECK-WIN32-64-NEXT: addq $40, %rsp 507; CHECK-WIN32-64-NEXT: retq 508; CHECK-WIN32-64-NEXT: .LBB11_1: # %yes 509; CHECK-WIN32-64-NEXT: callq bar 510; CHECK-WIN32-64-NEXT: addq $40, %rsp 511; CHECK-WIN32-64-NEXT: retq 512; 513; CHECK-X86-LABEL: truncand32: 514; CHECK-X86: # %bb.0: 515; CHECK-X86-NEXT: testl $2049, %eax # imm = 0x801 516; CHECK-X86-NEXT: je .LBB11_1 517; CHECK-X86-NEXT: # %bb.2: # %no 518; CHECK-X86-NEXT: retl 519; CHECK-X86-NEXT: .LBB11_1: # %yes 520; CHECK-X86-NEXT: calll bar@PLT 521; CHECK-X86-NEXT: retl 522 %t = and i16 %x, 2049 523 %s = icmp eq i16 %t, 0 524 br i1 %s, label %yes, label %no 525 526yes: 527 call void @bar() 528 ret void 529no: 530 ret void 531} 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 = 0x801 537; CHECK-LINUX64-NEXT: je .LBB12_1 538; CHECK-LINUX64-NEXT: # %bb.2: # %no 539; CHECK-LINUX64-NEXT: retq 540; CHECK-LINUX64-NEXT: .LBB12_1: # %yes 541; CHECK-LINUX64-NEXT: pushq %rax 542; CHECK-LINUX64-NEXT: callq bar@PLT 543; CHECK-LINUX64-NEXT: popq %rax 544; CHECK-LINUX64-NEXT: retq 545; 546; CHECK-WIN32-64-LABEL: testw: 547; CHECK-WIN32-64: # %bb.0: 548; CHECK-WIN32-64-NEXT: subq $40, %rsp 549; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx 550; CHECK-WIN32-64-NEXT: testw $2049, %cx # imm = 0x801 551; CHECK-WIN32-64-NEXT: jne .LBB12_2 552; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 553; CHECK-WIN32-64-NEXT: callq bar 554; CHECK-WIN32-64-NEXT: .LBB12_2: # %no 555; CHECK-WIN32-64-NEXT: addq $40, %rsp 556; CHECK-WIN32-64-NEXT: retq 557; 558; CHECK-X86-LABEL: testw: 559; CHECK-X86: # %bb.0: 560; CHECK-X86-NEXT: testw $2049, %ax # imm = 0x801 561; CHECK-X86-NEXT: je .LBB12_1 562; CHECK-X86-NEXT: # %bb.2: # %no 563; CHECK-X86-NEXT: retl 564; CHECK-X86-NEXT: .LBB12_1: # %yes 565; CHECK-X86-NEXT: calll bar@PLT 566; CHECK-X86-NEXT: retl 567 %t = and i16 %x, 2049 568 %s = icmp eq i16 %t, 0 569 br i1 %s, label %yes, label %no 570 571yes: 572 call void @bar() 573 ret void 574no: 575 ret void 576} 577 578define void @and16_trunc_8_sign(i16 %x) nounwind { 579; CHECK-LINUX64-LABEL: and16_trunc_8_sign: 580; CHECK-LINUX64: # %bb.0: 581; CHECK-LINUX64-NEXT: testb $-128, %dil 582; CHECK-LINUX64-NEXT: js .LBB13_2 583; CHECK-LINUX64-NEXT: # %bb.1: # %yes 584; CHECK-LINUX64-NEXT: pushq %rax 585; CHECK-LINUX64-NEXT: callq bar@PLT 586; CHECK-LINUX64-NEXT: popq %rax 587; CHECK-LINUX64-NEXT: .LBB13_2: # %no 588; CHECK-LINUX64-NEXT: retq 589; 590; CHECK-WIN32-64-LABEL: and16_trunc_8_sign: 591; CHECK-WIN32-64: # %bb.0: 592; CHECK-WIN32-64-NEXT: subq $40, %rsp 593; CHECK-WIN32-64-NEXT: testb $-128, %cl 594; CHECK-WIN32-64-NEXT: js .LBB13_2 595; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 596; CHECK-WIN32-64-NEXT: callq bar 597; CHECK-WIN32-64-NEXT: .LBB13_2: # %no 598; CHECK-WIN32-64-NEXT: addq $40, %rsp 599; CHECK-WIN32-64-NEXT: retq 600; 601; CHECK-X86-LABEL: and16_trunc_8_sign: 602; CHECK-X86: # %bb.0: 603; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp) 604; CHECK-X86-NEXT: js .LBB13_2 605; CHECK-X86-NEXT: # %bb.1: # %yes 606; CHECK-X86-NEXT: calll bar@PLT 607; CHECK-X86-NEXT: .LBB13_2: # %no 608; CHECK-X86-NEXT: retl 609 %t = and i16 %x, 128 610 %r = trunc i16 %t to i8 611 %s = icmp sge i8 %r, 0 612 br i1 %s, label %yes, label %no 613 614yes: 615 call void @bar() 616 ret void 617no: 618 ret void 619} 620 621define void @and32_trunc_8_sign(i32 %x) nounwind { 622; CHECK-LINUX64-LABEL: and32_trunc_8_sign: 623; CHECK-LINUX64: # %bb.0: 624; CHECK-LINUX64-NEXT: testb $-128, %dil 625; CHECK-LINUX64-NEXT: js .LBB14_2 626; CHECK-LINUX64-NEXT: # %bb.1: # %yes 627; CHECK-LINUX64-NEXT: pushq %rax 628; CHECK-LINUX64-NEXT: callq bar@PLT 629; CHECK-LINUX64-NEXT: popq %rax 630; CHECK-LINUX64-NEXT: .LBB14_2: # %no 631; CHECK-LINUX64-NEXT: retq 632; 633; CHECK-WIN32-64-LABEL: and32_trunc_8_sign: 634; CHECK-WIN32-64: # %bb.0: 635; CHECK-WIN32-64-NEXT: subq $40, %rsp 636; CHECK-WIN32-64-NEXT: testb $-128, %cl 637; CHECK-WIN32-64-NEXT: js .LBB14_2 638; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 639; CHECK-WIN32-64-NEXT: callq bar 640; CHECK-WIN32-64-NEXT: .LBB14_2: # %no 641; CHECK-WIN32-64-NEXT: addq $40, %rsp 642; CHECK-WIN32-64-NEXT: retq 643; 644; CHECK-X86-LABEL: and32_trunc_8_sign: 645; CHECK-X86: # %bb.0: 646; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp) 647; CHECK-X86-NEXT: js .LBB14_2 648; CHECK-X86-NEXT: # %bb.1: # %yes 649; CHECK-X86-NEXT: calll bar@PLT 650; CHECK-X86-NEXT: .LBB14_2: # %no 651; CHECK-X86-NEXT: retl 652 %t = and i32 %x, 128 653 %r = trunc i32 %t to i8 654 %s = icmp sge i8 %r, 0 655 br i1 %s, label %yes, label %no 656 657yes: 658 call void @bar() 659 ret void 660no: 661 ret void 662} 663 664define void @and64_trunc_8_sign(i64 %x) nounwind { 665; CHECK-LINUX64-LABEL: and64_trunc_8_sign: 666; CHECK-LINUX64: # %bb.0: 667; CHECK-LINUX64-NEXT: testb $-128, %dil 668; CHECK-LINUX64-NEXT: js .LBB15_2 669; CHECK-LINUX64-NEXT: # %bb.1: # %yes 670; CHECK-LINUX64-NEXT: pushq %rax 671; CHECK-LINUX64-NEXT: callq bar@PLT 672; CHECK-LINUX64-NEXT: popq %rax 673; CHECK-LINUX64-NEXT: .LBB15_2: # %no 674; CHECK-LINUX64-NEXT: retq 675; 676; CHECK-WIN32-64-LABEL: and64_trunc_8_sign: 677; CHECK-WIN32-64: # %bb.0: 678; CHECK-WIN32-64-NEXT: subq $40, %rsp 679; CHECK-WIN32-64-NEXT: testb $-128, %cl 680; CHECK-WIN32-64-NEXT: js .LBB15_2 681; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 682; CHECK-WIN32-64-NEXT: callq bar 683; CHECK-WIN32-64-NEXT: .LBB15_2: # %no 684; CHECK-WIN32-64-NEXT: addq $40, %rsp 685; CHECK-WIN32-64-NEXT: retq 686; 687; CHECK-X86-LABEL: and64_trunc_8_sign: 688; CHECK-X86: # %bb.0: 689; CHECK-X86-NEXT: testb $-128, {{[0-9]+}}(%esp) 690; CHECK-X86-NEXT: js .LBB15_2 691; CHECK-X86-NEXT: # %bb.1: # %yes 692; CHECK-X86-NEXT: calll bar@PLT 693; CHECK-X86-NEXT: .LBB15_2: # %no 694; CHECK-X86-NEXT: retl 695 %t = and i64 %x, 128 696 %r = trunc i64 %t to i8 697 %s = icmp sge i8 %r, 0 698 br i1 %s, label %yes, label %no 699 700yes: 701 call void @bar() 702 ret void 703no: 704 ret void 705} 706 707define void @and32_trunc_16_sign(i32 %x) nounwind { 708; CHECK-LINUX64-LABEL: and32_trunc_16_sign: 709; CHECK-LINUX64: # %bb.0: 710; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 711; CHECK-LINUX64-NEXT: testw %di, %di 712; CHECK-LINUX64-NEXT: js .LBB16_2 713; CHECK-LINUX64-NEXT: # %bb.1: # %yes 714; CHECK-LINUX64-NEXT: pushq %rax 715; CHECK-LINUX64-NEXT: callq bar@PLT 716; CHECK-LINUX64-NEXT: popq %rax 717; CHECK-LINUX64-NEXT: .LBB16_2: # %no 718; CHECK-LINUX64-NEXT: retq 719; 720; CHECK-WIN32-64-LABEL: and32_trunc_16_sign: 721; CHECK-WIN32-64: # %bb.0: 722; CHECK-WIN32-64-NEXT: subq $40, %rsp 723; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000 724; CHECK-WIN32-64-NEXT: testw %cx, %cx 725; CHECK-WIN32-64-NEXT: js .LBB16_2 726; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 727; CHECK-WIN32-64-NEXT: callq bar 728; CHECK-WIN32-64-NEXT: .LBB16_2: # %no 729; CHECK-WIN32-64-NEXT: addq $40, %rsp 730; CHECK-WIN32-64-NEXT: retq 731; 732; CHECK-X86-LABEL: and32_trunc_16_sign: 733; CHECK-X86: # %bb.0: 734; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 735; CHECK-X86-NEXT: andl $32768, %eax # imm = 0x8000 736; CHECK-X86-NEXT: testw %ax, %ax 737; CHECK-X86-NEXT: js .LBB16_2 738; CHECK-X86-NEXT: # %bb.1: # %yes 739; CHECK-X86-NEXT: calll bar@PLT 740; CHECK-X86-NEXT: .LBB16_2: # %no 741; CHECK-X86-NEXT: retl 742 %t = and i32 %x, 32768 743 %r = trunc i32 %t to i16 744 %s = icmp sge i16 %r, 0 745 br i1 %s, label %yes, label %no 746 747yes: 748 call void @bar() 749 ret void 750no: 751 ret void 752} 753 754define void @and32_trunc_16_sign_minsize(i32 %x) minsize nounwind { 755; CHECK-LINUX64-LABEL: and32_trunc_16_sign_minsize: 756; CHECK-LINUX64: # %bb.0: 757; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000 758; CHECK-LINUX64-NEXT: js .LBB17_2 759; CHECK-LINUX64-NEXT: # %bb.1: # %yes 760; CHECK-LINUX64-NEXT: pushq %rax 761; CHECK-LINUX64-NEXT: callq bar@PLT 762; CHECK-LINUX64-NEXT: popq %rax 763; CHECK-LINUX64-NEXT: .LBB17_2: # %no 764; CHECK-LINUX64-NEXT: retq 765; 766; CHECK-WIN32-64-LABEL: and32_trunc_16_sign_minsize: 767; CHECK-WIN32-64: # %bb.0: 768; CHECK-WIN32-64-NEXT: subq $40, %rsp 769; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000 770; CHECK-WIN32-64-NEXT: js .LBB17_2 771; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 772; CHECK-WIN32-64-NEXT: callq bar 773; CHECK-WIN32-64-NEXT: .LBB17_2: # %no 774; CHECK-WIN32-64-NEXT: addq $40, %rsp 775; CHECK-WIN32-64-NEXT: retq 776; 777; CHECK-X86-LABEL: and32_trunc_16_sign_minsize: 778; CHECK-X86: # %bb.0: 779; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 780; CHECK-X86-NEXT: testw $-32768, %ax # imm = 0x8000 781; CHECK-X86-NEXT: js .LBB17_2 782; CHECK-X86-NEXT: # %bb.1: # %yes 783; CHECK-X86-NEXT: calll bar@PLT 784; CHECK-X86-NEXT: .LBB17_2: # %no 785; CHECK-X86-NEXT: retl 786 %t = and i32 %x, 32768 787 %r = trunc i32 %t to i16 788 %s = icmp sge i16 %r, 0 789 br i1 %s, label %yes, label %no 790 791yes: 792 call void @bar() 793 ret void 794no: 795 ret void 796} 797 798define void @and64_trunc_16_sign(i64 %x) nounwind { 799; CHECK-LINUX64-LABEL: and64_trunc_16_sign: 800; CHECK-LINUX64: # %bb.0: 801; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 802; CHECK-LINUX64-NEXT: testw %di, %di 803; CHECK-LINUX64-NEXT: js .LBB18_2 804; CHECK-LINUX64-NEXT: # %bb.1: # %yes 805; CHECK-LINUX64-NEXT: pushq %rax 806; CHECK-LINUX64-NEXT: callq bar@PLT 807; CHECK-LINUX64-NEXT: popq %rax 808; CHECK-LINUX64-NEXT: .LBB18_2: # %no 809; CHECK-LINUX64-NEXT: retq 810; 811; CHECK-WIN32-64-LABEL: and64_trunc_16_sign: 812; CHECK-WIN32-64: # %bb.0: 813; CHECK-WIN32-64-NEXT: subq $40, %rsp 814; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000 815; CHECK-WIN32-64-NEXT: testw %cx, %cx 816; CHECK-WIN32-64-NEXT: js .LBB18_2 817; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 818; CHECK-WIN32-64-NEXT: callq bar 819; CHECK-WIN32-64-NEXT: .LBB18_2: # %no 820; CHECK-WIN32-64-NEXT: addq $40, %rsp 821; CHECK-WIN32-64-NEXT: retq 822; 823; CHECK-X86-LABEL: and64_trunc_16_sign: 824; CHECK-X86: # %bb.0: 825; CHECK-X86-NEXT: movl $32768, %eax # imm = 0x8000 826; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax 827; CHECK-X86-NEXT: testw %ax, %ax 828; CHECK-X86-NEXT: js .LBB18_2 829; CHECK-X86-NEXT: # %bb.1: # %yes 830; CHECK-X86-NEXT: calll bar@PLT 831; CHECK-X86-NEXT: .LBB18_2: # %no 832; CHECK-X86-NEXT: retl 833 %t = and i64 %x, 32768 834 %r = trunc i64 %t to i16 835 %s = icmp sge i16 %r, 0 836 br i1 %s, label %yes, label %no 837 838yes: 839 call void @bar() 840 ret void 841no: 842 ret void 843} 844 845define void @and64_trunc_16_sign_minsize(i64 %x) minsize nounwind { 846; CHECK-LINUX64-LABEL: and64_trunc_16_sign_minsize: 847; CHECK-LINUX64: # %bb.0: 848; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000 849; CHECK-LINUX64-NEXT: js .LBB19_2 850; CHECK-LINUX64-NEXT: # %bb.1: # %yes 851; CHECK-LINUX64-NEXT: pushq %rax 852; CHECK-LINUX64-NEXT: callq bar@PLT 853; CHECK-LINUX64-NEXT: popq %rax 854; CHECK-LINUX64-NEXT: .LBB19_2: # %no 855; CHECK-LINUX64-NEXT: retq 856; 857; CHECK-WIN32-64-LABEL: and64_trunc_16_sign_minsize: 858; CHECK-WIN32-64: # %bb.0: 859; CHECK-WIN32-64-NEXT: subq $40, %rsp 860; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000 861; CHECK-WIN32-64-NEXT: js .LBB19_2 862; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 863; CHECK-WIN32-64-NEXT: callq bar 864; CHECK-WIN32-64-NEXT: .LBB19_2: # %no 865; CHECK-WIN32-64-NEXT: addq $40, %rsp 866; CHECK-WIN32-64-NEXT: retq 867; 868; CHECK-X86-LABEL: and64_trunc_16_sign_minsize: 869; CHECK-X86: # %bb.0: 870; CHECK-X86-NEXT: testw $-32768, {{[0-9]+}}(%esp) # imm = 0x8000 871; CHECK-X86-NEXT: js .LBB19_2 872; CHECK-X86-NEXT: # %bb.1: # %yes 873; CHECK-X86-NEXT: calll bar@PLT 874; CHECK-X86-NEXT: .LBB19_2: # %no 875; CHECK-X86-NEXT: retl 876 %t = and i64 %x, 32768 877 %r = trunc i64 %t to i16 878 %s = icmp sge i16 %r, 0 879 br i1 %s, label %yes, label %no 880 881yes: 882 call void @bar() 883 ret void 884no: 885 ret void 886} 887 888define void @and64_trunc_32_sign(i64 %x) nounwind { 889; CHECK-LINUX64-LABEL: and64_trunc_32_sign: 890; CHECK-LINUX64: # %bb.0: 891; CHECK-LINUX64-NEXT: testl $-2147483648, %edi # imm = 0x80000000 892; CHECK-LINUX64-NEXT: js .LBB20_2 893; CHECK-LINUX64-NEXT: # %bb.1: # %yes 894; CHECK-LINUX64-NEXT: pushq %rax 895; CHECK-LINUX64-NEXT: callq bar@PLT 896; CHECK-LINUX64-NEXT: popq %rax 897; CHECK-LINUX64-NEXT: .LBB20_2: # %no 898; CHECK-LINUX64-NEXT: retq 899; 900; CHECK-WIN32-64-LABEL: and64_trunc_32_sign: 901; CHECK-WIN32-64: # %bb.0: 902; CHECK-WIN32-64-NEXT: subq $40, %rsp 903; CHECK-WIN32-64-NEXT: testl $-2147483648, %ecx # imm = 0x80000000 904; CHECK-WIN32-64-NEXT: js .LBB20_2 905; CHECK-WIN32-64-NEXT: # %bb.1: # %yes 906; CHECK-WIN32-64-NEXT: callq bar 907; CHECK-WIN32-64-NEXT: .LBB20_2: # %no 908; CHECK-WIN32-64-NEXT: addq $40, %rsp 909; CHECK-WIN32-64-NEXT: retq 910; 911; CHECK-X86-LABEL: and64_trunc_32_sign: 912; CHECK-X86: # %bb.0: 913; CHECK-X86-NEXT: testl $-2147483648, {{[0-9]+}}(%esp) # imm = 0x80000000 914; CHECK-X86-NEXT: js .LBB20_2 915; CHECK-X86-NEXT: # %bb.1: # %yes 916; CHECK-X86-NEXT: calll bar@PLT 917; CHECK-X86-NEXT: .LBB20_2: # %no 918; CHECK-X86-NEXT: retl 919 %t = and i64 %x, 2147483648 920 %r = trunc i64 %t to i32 921 %s = icmp sge i32 %r, 0 922 br i1 %s, label %yes, label %no 923 924yes: 925 call void @bar() 926 ret void 927no: 928 ret void 929} 930 931declare void @bar() 932