1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 3; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X86 4 5; shift left 6 7define i32 @and_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 8; X64-LABEL: and_signbit_select_shl: 9; X64: # %bb.0: 10; X64-NEXT: movl %edi, %eax 11; X64-NEXT: andl $16711680, %eax # imm = 0xFF0000 12; X64-NEXT: testb $1, %sil 13; X64-NEXT: cmovel %edi, %eax 14; X64-NEXT: shll $8, %eax 15; X64-NEXT: movl %eax, (%rdx) 16; X64-NEXT: retq 17; 18; X86-LABEL: and_signbit_select_shl: 19; X86: # %bb.0: 20; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 21; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 22; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 23; X86-NEXT: je .LBB0_2 24; X86-NEXT: # %bb.1: 25; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 26; X86-NEXT: .LBB0_2: 27; X86-NEXT: shll $8, %eax 28; X86-NEXT: movl %eax, (%ecx) 29; X86-NEXT: retl 30 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 31 %t1 = select i1 %cond, i32 %t0, i32 %x 32 %r = shl i32 %t1, 8 33 store i32 %r, ptr %dst 34 ret i32 %r 35} 36define i32 @and_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 37; X64-LABEL: and_nosignbit_select_shl: 38; X64: # %bb.0: 39; X64-NEXT: movl %edi, %eax 40; X64-NEXT: andl $16711680, %eax # imm = 0xFF0000 41; X64-NEXT: testb $1, %sil 42; X64-NEXT: cmovel %edi, %eax 43; X64-NEXT: shll $8, %eax 44; X64-NEXT: movl %eax, (%rdx) 45; X64-NEXT: retq 46; 47; X86-LABEL: and_nosignbit_select_shl: 48; X86: # %bb.0: 49; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 50; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 51; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 52; X86-NEXT: je .LBB1_2 53; X86-NEXT: # %bb.1: 54; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 55; X86-NEXT: .LBB1_2: 56; X86-NEXT: shll $8, %eax 57; X86-NEXT: movl %eax, (%ecx) 58; X86-NEXT: retl 59 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 60 %t1 = select i1 %cond, i32 %t0, i32 %x 61 %r = shl i32 %t1, 8 62 store i32 %r, ptr %dst 63 ret i32 %r 64} 65 66define i32 @or_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 67; X64-LABEL: or_signbit_select_shl: 68; X64: # %bb.0: 69; X64-NEXT: movl %edi, %eax 70; X64-NEXT: orl $16711680, %eax # imm = 0xFF0000 71; X64-NEXT: testb $1, %sil 72; X64-NEXT: cmovel %edi, %eax 73; X64-NEXT: shll $8, %eax 74; X64-NEXT: movl %eax, (%rdx) 75; X64-NEXT: retq 76; 77; X86-LABEL: or_signbit_select_shl: 78; X86: # %bb.0: 79; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 80; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 81; X86-NEXT: andl $1, %eax 82; X86-NEXT: negl %eax 83; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 84; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 85; X86-NEXT: shll $8, %eax 86; X86-NEXT: movl %eax, (%ecx) 87; X86-NEXT: retl 88 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 89 %t1 = select i1 %cond, i32 %t0, i32 %x 90 %r = shl i32 %t1, 8 91 store i32 %r, ptr %dst 92 ret i32 %r 93} 94define i32 @or_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 95; X64-LABEL: or_nosignbit_select_shl: 96; X64: # %bb.0: 97; X64-NEXT: movl %edi, %eax 98; X64-NEXT: orl $16711680, %eax # imm = 0xFF0000 99; X64-NEXT: testb $1, %sil 100; X64-NEXT: cmovel %edi, %eax 101; X64-NEXT: shll $8, %eax 102; X64-NEXT: movl %eax, (%rdx) 103; X64-NEXT: retq 104; 105; X86-LABEL: or_nosignbit_select_shl: 106; X86: # %bb.0: 107; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 108; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 109; X86-NEXT: andl $1, %eax 110; X86-NEXT: negl %eax 111; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 112; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 113; X86-NEXT: shll $8, %eax 114; X86-NEXT: movl %eax, (%ecx) 115; X86-NEXT: retl 116 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 117 %t1 = select i1 %cond, i32 %t0, i32 %x 118 %r = shl i32 %t1, 8 119 store i32 %r, ptr %dst 120 ret i32 %r 121} 122 123define i32 @xor_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 124; X64-LABEL: xor_signbit_select_shl: 125; X64: # %bb.0: 126; X64-NEXT: movl %edi, %eax 127; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000 128; X64-NEXT: testb $1, %sil 129; X64-NEXT: cmovel %edi, %eax 130; X64-NEXT: shll $8, %eax 131; X64-NEXT: movl %eax, (%rdx) 132; X64-NEXT: retq 133; 134; X86-LABEL: xor_signbit_select_shl: 135; X86: # %bb.0: 136; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 137; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 138; X86-NEXT: andl $1, %eax 139; X86-NEXT: negl %eax 140; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 141; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 142; X86-NEXT: shll $8, %eax 143; X86-NEXT: movl %eax, (%ecx) 144; X86-NEXT: retl 145 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 146 %t1 = select i1 %cond, i32 %t0, i32 %x 147 %r = shl i32 %t1, 8 148 store i32 %r, ptr %dst 149 ret i32 %r 150} 151define i32 @xor_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 152; X64-LABEL: xor_nosignbit_select_shl: 153; X64: # %bb.0: 154; X64-NEXT: movl %edi, %eax 155; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000 156; X64-NEXT: testb $1, %sil 157; X64-NEXT: cmovel %edi, %eax 158; X64-NEXT: shll $8, %eax 159; X64-NEXT: movl %eax, (%rdx) 160; X64-NEXT: retq 161; 162; X86-LABEL: xor_nosignbit_select_shl: 163; X86: # %bb.0: 164; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 165; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 166; X86-NEXT: andl $1, %eax 167; X86-NEXT: negl %eax 168; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 169; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 170; X86-NEXT: shll $8, %eax 171; X86-NEXT: movl %eax, (%ecx) 172; X86-NEXT: retl 173 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 174 %t1 = select i1 %cond, i32 %t0, i32 %x 175 %r = shl i32 %t1, 8 176 store i32 %r, ptr %dst 177 ret i32 %r 178} 179 180define i32 @add_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 181; X64-LABEL: add_signbit_select_shl: 182; X64: # %bb.0: 183; X64-NEXT: # kill: def $edi killed $edi def $rdi 184; X64-NEXT: leal -65536(%rdi), %eax 185; X64-NEXT: testb $1, %sil 186; X64-NEXT: cmovel %edi, %eax 187; X64-NEXT: shll $8, %eax 188; X64-NEXT: movl %eax, (%rdx) 189; X64-NEXT: retq 190; 191; X86-LABEL: add_signbit_select_shl: 192; X86: # %bb.0: 193; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 194; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 195; X86-NEXT: andl $1, %eax 196; X86-NEXT: negl %eax 197; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 198; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 199; X86-NEXT: shll $8, %eax 200; X86-NEXT: movl %eax, (%ecx) 201; X86-NEXT: retl 202 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 203 %t1 = select i1 %cond, i32 %t0, i32 %x 204 %r = shl i32 %t1, 8 205 store i32 %r, ptr %dst 206 ret i32 %r 207} 208define i32 @add_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) { 209; X64-LABEL: add_nosignbit_select_shl: 210; X64: # %bb.0: 211; X64-NEXT: # kill: def $edi killed $edi def $rdi 212; X64-NEXT: leal 2147418112(%rdi), %eax 213; X64-NEXT: testb $1, %sil 214; X64-NEXT: cmovel %edi, %eax 215; X64-NEXT: shll $8, %eax 216; X64-NEXT: movl %eax, (%rdx) 217; X64-NEXT: retq 218; 219; X86-LABEL: add_nosignbit_select_shl: 220; X86: # %bb.0: 221; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 222; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 223; X86-NEXT: andl $1, %eax 224; X86-NEXT: negl %eax 225; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000 226; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 227; X86-NEXT: shll $8, %eax 228; X86-NEXT: movl %eax, (%ecx) 229; X86-NEXT: retl 230 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 231 %t1 = select i1 %cond, i32 %t0, i32 %x 232 %r = shl i32 %t1, 8 233 store i32 %r, ptr %dst 234 ret i32 %r 235} 236 237; logical shift right 238 239define i32 @and_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 240; X64-LABEL: and_signbit_select_lshr: 241; X64: # %bb.0: 242; X64-NEXT: movl %edi, %eax 243; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 244; X64-NEXT: testb $1, %sil 245; X64-NEXT: cmovel %edi, %eax 246; X64-NEXT: shrl $8, %eax 247; X64-NEXT: movl %eax, (%rdx) 248; X64-NEXT: retq 249; 250; X86-LABEL: and_signbit_select_lshr: 251; X86: # %bb.0: 252; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 253; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 254; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 255; X86-NEXT: je .LBB8_2 256; X86-NEXT: # %bb.1: 257; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 258; X86-NEXT: .LBB8_2: 259; X86-NEXT: shrl $8, %eax 260; X86-NEXT: movl %eax, (%ecx) 261; X86-NEXT: retl 262 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 263 %t1 = select i1 %cond, i32 %t0, i32 %x 264 %r = lshr i32 %t1, 8 265 store i32 %r, ptr %dst 266 ret i32 %r 267} 268define i32 @and_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 269; X64-LABEL: and_nosignbit_select_lshr: 270; X64: # %bb.0: 271; X64-NEXT: movl %edi, %eax 272; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 273; X64-NEXT: testb $1, %sil 274; X64-NEXT: cmovel %edi, %eax 275; X64-NEXT: shrl $8, %eax 276; X64-NEXT: movl %eax, (%rdx) 277; X64-NEXT: retq 278; 279; X86-LABEL: and_nosignbit_select_lshr: 280; X86: # %bb.0: 281; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 282; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 283; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 284; X86-NEXT: je .LBB9_2 285; X86-NEXT: # %bb.1: 286; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 287; X86-NEXT: .LBB9_2: 288; X86-NEXT: shrl $8, %eax 289; X86-NEXT: movl %eax, (%ecx) 290; X86-NEXT: retl 291 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 292 %t1 = select i1 %cond, i32 %t0, i32 %x 293 %r = lshr i32 %t1, 8 294 store i32 %r, ptr %dst 295 ret i32 %r 296} 297 298define i32 @or_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 299; X64-LABEL: or_signbit_select_lshr: 300; X64: # %bb.0: 301; X64-NEXT: movl %edi, %eax 302; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000 303; X64-NEXT: testb $1, %sil 304; X64-NEXT: cmovel %edi, %eax 305; X64-NEXT: shrl $8, %eax 306; X64-NEXT: movl %eax, (%rdx) 307; X64-NEXT: retq 308; 309; X86-LABEL: or_signbit_select_lshr: 310; X86: # %bb.0: 311; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 312; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 313; X86-NEXT: andl $1, %eax 314; X86-NEXT: negl %eax 315; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 316; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 317; X86-NEXT: shrl $8, %eax 318; X86-NEXT: movl %eax, (%ecx) 319; X86-NEXT: retl 320 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 321 %t1 = select i1 %cond, i32 %t0, i32 %x 322 %r = lshr i32 %t1, 8 323 store i32 %r, ptr %dst 324 ret i32 %r 325} 326define i32 @or_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 327; X64-LABEL: or_nosignbit_select_lshr: 328; X64: # %bb.0: 329; X64-NEXT: movl %edi, %eax 330; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000 331; X64-NEXT: testb $1, %sil 332; X64-NEXT: cmovel %edi, %eax 333; X64-NEXT: shrl $8, %eax 334; X64-NEXT: movl %eax, (%rdx) 335; X64-NEXT: retq 336; 337; X86-LABEL: or_nosignbit_select_lshr: 338; X86: # %bb.0: 339; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 340; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 341; X86-NEXT: andl $1, %eax 342; X86-NEXT: negl %eax 343; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 344; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 345; X86-NEXT: shrl $8, %eax 346; X86-NEXT: movl %eax, (%ecx) 347; X86-NEXT: retl 348 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 349 %t1 = select i1 %cond, i32 %t0, i32 %x 350 %r = lshr i32 %t1, 8 351 store i32 %r, ptr %dst 352 ret i32 %r 353} 354 355define i32 @xor_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 356; X64-LABEL: xor_signbit_select_lshr: 357; X64: # %bb.0: 358; X64-NEXT: movl %edi, %eax 359; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000 360; X64-NEXT: testb $1, %sil 361; X64-NEXT: cmovel %edi, %eax 362; X64-NEXT: shrl $8, %eax 363; X64-NEXT: movl %eax, (%rdx) 364; X64-NEXT: retq 365; 366; X86-LABEL: xor_signbit_select_lshr: 367; X86: # %bb.0: 368; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 369; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 370; X86-NEXT: andl $1, %eax 371; X86-NEXT: negl %eax 372; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 373; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 374; X86-NEXT: shrl $8, %eax 375; X86-NEXT: movl %eax, (%ecx) 376; X86-NEXT: retl 377 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 378 %t1 = select i1 %cond, i32 %t0, i32 %x 379 %r = lshr i32 %t1, 8 380 store i32 %r, ptr %dst 381 ret i32 %r 382} 383define i32 @xor_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 384; X64-LABEL: xor_nosignbit_select_lshr: 385; X64: # %bb.0: 386; X64-NEXT: movl %edi, %eax 387; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000 388; X64-NEXT: testb $1, %sil 389; X64-NEXT: cmovel %edi, %eax 390; X64-NEXT: shrl $8, %eax 391; X64-NEXT: movl %eax, (%rdx) 392; X64-NEXT: retq 393; 394; X86-LABEL: xor_nosignbit_select_lshr: 395; X86: # %bb.0: 396; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 397; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 398; X86-NEXT: andl $1, %eax 399; X86-NEXT: negl %eax 400; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 401; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 402; X86-NEXT: shrl $8, %eax 403; X86-NEXT: movl %eax, (%ecx) 404; X86-NEXT: retl 405 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 406 %t1 = select i1 %cond, i32 %t0, i32 %x 407 %r = lshr i32 %t1, 8 408 store i32 %r, ptr %dst 409 ret i32 %r 410} 411 412define i32 @add_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 413; X64-LABEL: add_signbit_select_lshr: 414; X64: # %bb.0: 415; X64-NEXT: # kill: def $edi killed $edi def $rdi 416; X64-NEXT: leal -65536(%rdi), %eax 417; X64-NEXT: testb $1, %sil 418; X64-NEXT: cmovel %edi, %eax 419; X64-NEXT: shrl $8, %eax 420; X64-NEXT: movl %eax, (%rdx) 421; X64-NEXT: retq 422; 423; X86-LABEL: add_signbit_select_lshr: 424; X86: # %bb.0: 425; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 426; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 427; X86-NEXT: andl $1, %eax 428; X86-NEXT: negl %eax 429; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 430; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 431; X86-NEXT: shrl $8, %eax 432; X86-NEXT: movl %eax, (%ecx) 433; X86-NEXT: retl 434 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 435 %t1 = select i1 %cond, i32 %t0, i32 %x 436 %r = lshr i32 %t1, 8 437 store i32 %r, ptr %dst 438 ret i32 %r 439} 440define i32 @add_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) { 441; X64-LABEL: add_nosignbit_select_lshr: 442; X64: # %bb.0: 443; X64-NEXT: # kill: def $edi killed $edi def $rdi 444; X64-NEXT: leal 2147418112(%rdi), %eax 445; X64-NEXT: testb $1, %sil 446; X64-NEXT: cmovel %edi, %eax 447; X64-NEXT: shrl $8, %eax 448; X64-NEXT: movl %eax, (%rdx) 449; X64-NEXT: retq 450; 451; X86-LABEL: add_nosignbit_select_lshr: 452; X86: # %bb.0: 453; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 454; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 455; X86-NEXT: andl $1, %eax 456; X86-NEXT: negl %eax 457; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 458; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 459; X86-NEXT: shrl $8, %eax 460; X86-NEXT: movl %eax, (%ecx) 461; X86-NEXT: retl 462 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 463 %t1 = select i1 %cond, i32 %t0, i32 %x 464 %r = lshr i32 %t1, 8 465 store i32 %r, ptr %dst 466 ret i32 %r 467} 468 469; arithmetic shift right 470 471define i32 @and_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 472; X64-LABEL: and_signbit_select_ashr: 473; X64: # %bb.0: 474; X64-NEXT: movl %edi, %eax 475; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 476; X64-NEXT: testb $1, %sil 477; X64-NEXT: cmovel %edi, %eax 478; X64-NEXT: sarl $8, %eax 479; X64-NEXT: movl %eax, (%rdx) 480; X64-NEXT: retq 481; 482; X86-LABEL: and_signbit_select_ashr: 483; X86: # %bb.0: 484; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 485; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 486; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 487; X86-NEXT: je .LBB16_2 488; X86-NEXT: # %bb.1: 489; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 490; X86-NEXT: .LBB16_2: 491; X86-NEXT: sarl $8, %eax 492; X86-NEXT: movl %eax, (%ecx) 493; X86-NEXT: retl 494 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 495 %t1 = select i1 %cond, i32 %t0, i32 %x 496 %r = ashr i32 %t1, 8 497 store i32 %r, ptr %dst 498 ret i32 %r 499} 500define i32 @and_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 501; X64-LABEL: and_nosignbit_select_ashr: 502; X64: # %bb.0: 503; X64-NEXT: movl %edi, %eax 504; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 505; X64-NEXT: testb $1, %sil 506; X64-NEXT: cmovel %edi, %eax 507; X64-NEXT: sarl $8, %eax 508; X64-NEXT: movl %eax, (%rdx) 509; X64-NEXT: retq 510; 511; X86-LABEL: and_nosignbit_select_ashr: 512; X86: # %bb.0: 513; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 514; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 515; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 516; X86-NEXT: je .LBB17_2 517; X86-NEXT: # %bb.1: 518; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 519; X86-NEXT: .LBB17_2: 520; X86-NEXT: sarl $8, %eax 521; X86-NEXT: movl %eax, (%ecx) 522; X86-NEXT: retl 523 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 524 %t1 = select i1 %cond, i32 %t0, i32 %x 525 %r = ashr i32 %t1, 8 526 store i32 %r, ptr %dst 527 ret i32 %r 528} 529 530define i32 @or_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 531; X64-LABEL: or_signbit_select_ashr: 532; X64: # %bb.0: 533; X64-NEXT: movl %edi, %eax 534; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000 535; X64-NEXT: testb $1, %sil 536; X64-NEXT: cmovel %edi, %eax 537; X64-NEXT: sarl $8, %eax 538; X64-NEXT: movl %eax, (%rdx) 539; X64-NEXT: retq 540; 541; X86-LABEL: or_signbit_select_ashr: 542; X86: # %bb.0: 543; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 544; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 545; X86-NEXT: andl $1, %eax 546; X86-NEXT: negl %eax 547; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 548; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 549; X86-NEXT: sarl $8, %eax 550; X86-NEXT: movl %eax, (%ecx) 551; X86-NEXT: retl 552 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 553 %t1 = select i1 %cond, i32 %t0, i32 %x 554 %r = ashr i32 %t1, 8 555 store i32 %r, ptr %dst 556 ret i32 %r 557} 558define i32 @or_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 559; X64-LABEL: or_nosignbit_select_ashr: 560; X64: # %bb.0: 561; X64-NEXT: movl %edi, %eax 562; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000 563; X64-NEXT: testb $1, %sil 564; X64-NEXT: cmovel %edi, %eax 565; X64-NEXT: sarl $8, %eax 566; X64-NEXT: movl %eax, (%rdx) 567; X64-NEXT: retq 568; 569; X86-LABEL: or_nosignbit_select_ashr: 570; X86: # %bb.0: 571; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 572; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 573; X86-NEXT: andl $1, %eax 574; X86-NEXT: negl %eax 575; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 576; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 577; X86-NEXT: sarl $8, %eax 578; X86-NEXT: movl %eax, (%ecx) 579; X86-NEXT: retl 580 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 581 %t1 = select i1 %cond, i32 %t0, i32 %x 582 %r = ashr i32 %t1, 8 583 store i32 %r, ptr %dst 584 ret i32 %r 585} 586 587define i32 @xor_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 588; X64-LABEL: xor_signbit_select_ashr: 589; X64: # %bb.0: 590; X64-NEXT: movl %edi, %eax 591; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000 592; X64-NEXT: testb $1, %sil 593; X64-NEXT: cmovel %edi, %eax 594; X64-NEXT: sarl $8, %eax 595; X64-NEXT: movl %eax, (%rdx) 596; X64-NEXT: retq 597; 598; X86-LABEL: xor_signbit_select_ashr: 599; X86: # %bb.0: 600; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 601; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 602; X86-NEXT: andl $1, %eax 603; X86-NEXT: negl %eax 604; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 605; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 606; X86-NEXT: sarl $8, %eax 607; X86-NEXT: movl %eax, (%ecx) 608; X86-NEXT: retl 609 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 610 %t1 = select i1 %cond, i32 %t0, i32 %x 611 %r = ashr i32 %t1, 8 612 store i32 %r, ptr %dst 613 ret i32 %r 614} 615define i32 @xor_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 616; X64-LABEL: xor_nosignbit_select_ashr: 617; X64: # %bb.0: 618; X64-NEXT: movl %edi, %eax 619; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000 620; X64-NEXT: testb $1, %sil 621; X64-NEXT: cmovel %edi, %eax 622; X64-NEXT: sarl $8, %eax 623; X64-NEXT: movl %eax, (%rdx) 624; X64-NEXT: retq 625; 626; X86-LABEL: xor_nosignbit_select_ashr: 627; X86: # %bb.0: 628; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 629; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 630; X86-NEXT: andl $1, %eax 631; X86-NEXT: negl %eax 632; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 633; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax 634; X86-NEXT: sarl $8, %eax 635; X86-NEXT: movl %eax, (%ecx) 636; X86-NEXT: retl 637 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 638 %t1 = select i1 %cond, i32 %t0, i32 %x 639 %r = ashr i32 %t1, 8 640 store i32 %r, ptr %dst 641 ret i32 %r 642} 643 644define i32 @add_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 645; X64-LABEL: add_signbit_select_ashr: 646; X64: # %bb.0: 647; X64-NEXT: # kill: def $edi killed $edi def $rdi 648; X64-NEXT: leal -65536(%rdi), %eax 649; X64-NEXT: testb $1, %sil 650; X64-NEXT: cmovel %edi, %eax 651; X64-NEXT: sarl $8, %eax 652; X64-NEXT: movl %eax, (%rdx) 653; X64-NEXT: retq 654; 655; X86-LABEL: add_signbit_select_ashr: 656; X86: # %bb.0: 657; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 658; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 659; X86-NEXT: andl $1, %eax 660; X86-NEXT: negl %eax 661; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 662; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 663; X86-NEXT: sarl $8, %eax 664; X86-NEXT: movl %eax, (%ecx) 665; X86-NEXT: retl 666 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 667 %t1 = select i1 %cond, i32 %t0, i32 %x 668 %r = ashr i32 %t1, 8 669 store i32 %r, ptr %dst 670 ret i32 %r 671} 672define i32 @add_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) { 673; X64-LABEL: add_nosignbit_select_ashr: 674; X64: # %bb.0: 675; X64-NEXT: # kill: def $edi killed $edi def $rdi 676; X64-NEXT: leal 2147418112(%rdi), %eax 677; X64-NEXT: testb $1, %sil 678; X64-NEXT: cmovel %edi, %eax 679; X64-NEXT: sarl $8, %eax 680; X64-NEXT: movl %eax, (%rdx) 681; X64-NEXT: retq 682; 683; X86-LABEL: add_nosignbit_select_ashr: 684; X86: # %bb.0: 685; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 686; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 687; X86-NEXT: andl $1, %eax 688; X86-NEXT: negl %eax 689; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000 690; X86-NEXT: addl {{[0-9]+}}(%esp), %eax 691; X86-NEXT: sarl $8, %eax 692; X86-NEXT: movl %eax, (%ecx) 693; X86-NEXT: retl 694 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 695 %t1 = select i1 %cond, i32 %t0, i32 %x 696 %r = ashr i32 %t1, 8 697 store i32 %r, ptr %dst 698 ret i32 %r 699} 700 701define i32 @shl_signbit_select_add(i32 %x, i1 %cond, ptr %dst) { 702; X64-LABEL: shl_signbit_select_add: 703; X64: # %bb.0: 704; X64-NEXT: movl %edi, %eax 705; X64-NEXT: shll $4, %eax 706; X64-NEXT: testb $1, %sil 707; X64-NEXT: cmovel %edi, %eax 708; X64-NEXT: addl $123456, %eax # imm = 0x1E240 709; X64-NEXT: movl %eax, (%rdx) 710; X64-NEXT: retq 711; 712; X86-LABEL: shl_signbit_select_add: 713; X86: # %bb.0: 714; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 715; X86-NEXT: andb $1, %cl 716; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 717; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 718; X86-NEXT: negb %cl 719; X86-NEXT: andb $4, %cl 720; X86-NEXT: shll %cl, %eax 721; X86-NEXT: addl $123456, %eax # imm = 0x1E240 722; X86-NEXT: movl %eax, (%edx) 723; X86-NEXT: retl 724 %t0 = shl i32 %x, 4 725 %t1 = select i1 %cond, i32 %t0, i32 %x 726 %r = add i32 %t1, 123456 727 store i32 %r, ptr %dst 728 ret i32 %r 729} 730 731define i32 @shl_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst) { 732; X64-LABEL: shl_signbit_select_add_fail: 733; X64: # %bb.0: 734; X64-NEXT: movl %edi, %eax 735; X64-NEXT: shll $4, %eax 736; X64-NEXT: testb $1, %sil 737; X64-NEXT: cmovnel %edi, %eax 738; X64-NEXT: addl $123456, %eax # imm = 0x1E240 739; X64-NEXT: movl %eax, (%rdx) 740; X64-NEXT: retq 741; 742; X86-LABEL: shl_signbit_select_add_fail: 743; X86: # %bb.0: 744; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 745; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 746; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 747; X86-NEXT: jne .LBB25_2 748; X86-NEXT: # %bb.1: 749; X86-NEXT: shll $4, %eax 750; X86-NEXT: .LBB25_2: 751; X86-NEXT: addl $123456, %eax # imm = 0x1E240 752; X86-NEXT: movl %eax, (%ecx) 753; X86-NEXT: retl 754 %t0 = shl i32 %x, 4 755 %t1 = select i1 %cond, i32 %x, i32 %t0 756 %r = add i32 %t1, 123456 757 store i32 %r, ptr %dst 758 ret i32 %r 759} 760 761define i32 @lshr_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) { 762; X64-LABEL: lshr_signbit_select_add: 763; X64: # %bb.0: 764; X64-NEXT: movl %edi, %eax 765; X64-NEXT: # kill: def $cl killed $cl killed $ecx 766; X64-NEXT: shrl %cl, %eax 767; X64-NEXT: testb $1, %sil 768; X64-NEXT: cmovel %edi, %eax 769; X64-NEXT: addl $123456, %eax # imm = 0x1E240 770; X64-NEXT: movl %eax, (%rdx) 771; X64-NEXT: retq 772; 773; X86-LABEL: lshr_signbit_select_add: 774; X86: # %bb.0: 775; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 776; X86-NEXT: andb $1, %cl 777; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 778; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 779; X86-NEXT: negb %cl 780; X86-NEXT: andb {{[0-9]+}}(%esp), %cl 781; X86-NEXT: shrl %cl, %eax 782; X86-NEXT: addl $123456, %eax # imm = 0x1E240 783; X86-NEXT: movl %eax, (%edx) 784; X86-NEXT: retl 785 %t0 = lshr i32 %x, %y 786 %t1 = select i1 %cond, i32 %t0, i32 %x 787 %r = add i32 %t1, 123456 788 store i32 %r, ptr %dst 789 ret i32 %r 790} 791 792define i32 @ashr_signbit_select_add(i32 %x, i1 %cond, ptr %dst) { 793; X64-LABEL: ashr_signbit_select_add: 794; X64: # %bb.0: 795; X64-NEXT: movl %edi, %eax 796; X64-NEXT: sarl $4, %eax 797; X64-NEXT: testb $1, %sil 798; X64-NEXT: cmovel %edi, %eax 799; X64-NEXT: addl $123456, %eax # imm = 0x1E240 800; X64-NEXT: movl %eax, (%rdx) 801; X64-NEXT: retq 802; 803; X86-LABEL: ashr_signbit_select_add: 804; X86: # %bb.0: 805; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 806; X86-NEXT: andb $1, %cl 807; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 808; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 809; X86-NEXT: negb %cl 810; X86-NEXT: andb $4, %cl 811; X86-NEXT: sarl %cl, %eax 812; X86-NEXT: addl $123456, %eax # imm = 0x1E240 813; X86-NEXT: movl %eax, (%edx) 814; X86-NEXT: retl 815 %t0 = ashr i32 %x, 4 816 %t1 = select i1 %cond, i32 %t0, i32 %x 817 %r = add i32 %t1, 123456 818 store i32 %r, ptr %dst 819 ret i32 %r 820} 821 822define i32 @and_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) { 823; X64-LABEL: and_signbit_select_add: 824; X64: # %bb.0: 825; X64-NEXT: # kill: def $ecx killed $ecx def $rcx 826; X64-NEXT: andl %edi, %ecx 827; X64-NEXT: testb $1, %sil 828; X64-NEXT: cmovnel %edi, %ecx 829; X64-NEXT: leal 123456(%rcx), %eax 830; X64-NEXT: movl %eax, (%rdx) 831; X64-NEXT: retq 832; 833; X86-LABEL: and_signbit_select_add: 834; X86: # %bb.0: 835; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 836; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 837; X86-NEXT: andl $1, %eax 838; X86-NEXT: negl %eax 839; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 840; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 841; X86-NEXT: addl $123456, %eax # imm = 0x1E240 842; X86-NEXT: movl %eax, (%ecx) 843; X86-NEXT: retl 844 %t0 = and i32 %x, %y 845 %t1 = select i1 %cond, i32 %x, i32 %t0 846 %r = add i32 %t1, 123456 847 store i32 %r, ptr %dst 848 ret i32 %r 849} 850 851 852define i32 @and_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst, i32 %y) { 853; X64-LABEL: and_signbit_select_add_fail: 854; X64: # %bb.0: 855; X64-NEXT: # kill: def $ecx killed $ecx def $rcx 856; X64-NEXT: andl %edi, %ecx 857; X64-NEXT: testb $1, %sil 858; X64-NEXT: cmovel %edi, %ecx 859; X64-NEXT: leal 123456(%rcx), %eax 860; X64-NEXT: movl %eax, (%rdx) 861; X64-NEXT: retq 862; 863; X86-LABEL: and_signbit_select_add_fail: 864; X86: # %bb.0: 865; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 866; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 867; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 868; X86-NEXT: je .LBB29_2 869; X86-NEXT: # %bb.1: 870; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 871; X86-NEXT: .LBB29_2: 872; X86-NEXT: addl $123456, %eax # imm = 0x1E240 873; X86-NEXT: movl %eax, (%ecx) 874; X86-NEXT: retl 875 %t0 = and i32 %x, %y 876 %t1 = select i1 %cond, i32 %t0, i32 %x 877 %r = add i32 %t1, 123456 878 store i32 %r, ptr %dst 879 ret i32 %r 880} 881 882