882 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X864 5; shift left6 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, %eax11; X64-NEXT: andl $16711680, %eax # imm = 0xFF000012; X64-NEXT: testb $1, %sil13; X64-NEXT: cmovel %edi, %eax14; X64-NEXT: shll $8, %eax15; X64-NEXT: movl %eax, (%rdx)16; X64-NEXT: retq17;18; X86-LABEL: and_signbit_select_shl:19; X86: # %bb.0:20; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx21; X86-NEXT: movl {{[0-9]+}}(%esp), %eax22; X86-NEXT: testb $1, {{[0-9]+}}(%esp)23; X86-NEXT: je .LBB0_224; X86-NEXT: # %bb.1:25; X86-NEXT: andl $16711680, %eax # imm = 0xFF000026; X86-NEXT: .LBB0_2:27; X86-NEXT: shll $8, %eax28; X86-NEXT: movl %eax, (%ecx)29; X86-NEXT: retl30 %t0 = and i32 %x, 4294901760 ; 0xFFFF000031 %t1 = select i1 %cond, i32 %t0, i32 %x32 %r = shl i32 %t1, 833 store i32 %r, ptr %dst34 ret i32 %r35}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, %eax40; X64-NEXT: andl $16711680, %eax # imm = 0xFF000041; X64-NEXT: testb $1, %sil42; X64-NEXT: cmovel %edi, %eax43; X64-NEXT: shll $8, %eax44; X64-NEXT: movl %eax, (%rdx)45; X64-NEXT: retq46;47; X86-LABEL: and_nosignbit_select_shl:48; X86: # %bb.0:49; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx50; X86-NEXT: movl {{[0-9]+}}(%esp), %eax51; X86-NEXT: testb $1, {{[0-9]+}}(%esp)52; X86-NEXT: je .LBB1_253; X86-NEXT: # %bb.1:54; X86-NEXT: andl $16711680, %eax # imm = 0xFF000055; X86-NEXT: .LBB1_2:56; X86-NEXT: shll $8, %eax57; X86-NEXT: movl %eax, (%ecx)58; X86-NEXT: retl59 %t0 = and i32 %x, 2147418112 ; 0x7FFF000060 %t1 = select i1 %cond, i32 %t0, i32 %x61 %r = shl i32 %t1, 862 store i32 %r, ptr %dst63 ret i32 %r64}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, %eax70; X64-NEXT: orl $16711680, %eax # imm = 0xFF000071; X64-NEXT: testb $1, %sil72; X64-NEXT: cmovel %edi, %eax73; X64-NEXT: shll $8, %eax74; X64-NEXT: movl %eax, (%rdx)75; X64-NEXT: retq76;77; X86-LABEL: or_signbit_select_shl:78; X86: # %bb.0:79; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx80; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax81; X86-NEXT: andl $1, %eax82; X86-NEXT: negl %eax83; X86-NEXT: andl $16711680, %eax # imm = 0xFF000084; X86-NEXT: orl {{[0-9]+}}(%esp), %eax85; X86-NEXT: shll $8, %eax86; X86-NEXT: movl %eax, (%ecx)87; X86-NEXT: retl88 %t0 = or i32 %x, 4294901760 ; 0xFFFF000089 %t1 = select i1 %cond, i32 %t0, i32 %x90 %r = shl i32 %t1, 891 store i32 %r, ptr %dst92 ret i32 %r93}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, %eax98; X64-NEXT: orl $16711680, %eax # imm = 0xFF000099; X64-NEXT: testb $1, %sil100; X64-NEXT: cmovel %edi, %eax101; X64-NEXT: shll $8, %eax102; X64-NEXT: movl %eax, (%rdx)103; X64-NEXT: retq104;105; X86-LABEL: or_nosignbit_select_shl:106; X86: # %bb.0:107; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx108; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax109; X86-NEXT: andl $1, %eax110; X86-NEXT: negl %eax111; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000112; X86-NEXT: orl {{[0-9]+}}(%esp), %eax113; X86-NEXT: shll $8, %eax114; X86-NEXT: movl %eax, (%ecx)115; X86-NEXT: retl116 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000117 %t1 = select i1 %cond, i32 %t0, i32 %x118 %r = shl i32 %t1, 8119 store i32 %r, ptr %dst120 ret i32 %r121}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, %eax127; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000128; X64-NEXT: testb $1, %sil129; X64-NEXT: cmovel %edi, %eax130; X64-NEXT: shll $8, %eax131; X64-NEXT: movl %eax, (%rdx)132; X64-NEXT: retq133;134; X86-LABEL: xor_signbit_select_shl:135; X86: # %bb.0:136; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx137; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax138; X86-NEXT: andl $1, %eax139; X86-NEXT: negl %eax140; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000141; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax142; X86-NEXT: shll $8, %eax143; X86-NEXT: movl %eax, (%ecx)144; X86-NEXT: retl145 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000146 %t1 = select i1 %cond, i32 %t0, i32 %x147 %r = shl i32 %t1, 8148 store i32 %r, ptr %dst149 ret i32 %r150}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, %eax155; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000156; X64-NEXT: testb $1, %sil157; X64-NEXT: cmovel %edi, %eax158; X64-NEXT: shll $8, %eax159; X64-NEXT: movl %eax, (%rdx)160; X64-NEXT: retq161;162; X86-LABEL: xor_nosignbit_select_shl:163; X86: # %bb.0:164; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx165; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax166; X86-NEXT: andl $1, %eax167; X86-NEXT: negl %eax168; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000169; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax170; X86-NEXT: shll $8, %eax171; X86-NEXT: movl %eax, (%ecx)172; X86-NEXT: retl173 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000174 %t1 = select i1 %cond, i32 %t0, i32 %x175 %r = shl i32 %t1, 8176 store i32 %r, ptr %dst177 ret i32 %r178}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 $rdi184; X64-NEXT: leal -65536(%rdi), %eax185; X64-NEXT: testb $1, %sil186; X64-NEXT: cmovel %edi, %eax187; X64-NEXT: shll $8, %eax188; X64-NEXT: movl %eax, (%rdx)189; X64-NEXT: retq190;191; X86-LABEL: add_signbit_select_shl:192; X86: # %bb.0:193; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx194; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax195; X86-NEXT: andl $1, %eax196; X86-NEXT: negl %eax197; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000198; X86-NEXT: addl {{[0-9]+}}(%esp), %eax199; X86-NEXT: shll $8, %eax200; X86-NEXT: movl %eax, (%ecx)201; X86-NEXT: retl202 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000203 %t1 = select i1 %cond, i32 %t0, i32 %x204 %r = shl i32 %t1, 8205 store i32 %r, ptr %dst206 ret i32 %r207}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 $rdi212; X64-NEXT: leal 2147418112(%rdi), %eax213; X64-NEXT: testb $1, %sil214; X64-NEXT: cmovel %edi, %eax215; X64-NEXT: shll $8, %eax216; X64-NEXT: movl %eax, (%rdx)217; X64-NEXT: retq218;219; X86-LABEL: add_nosignbit_select_shl:220; X86: # %bb.0:221; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx222; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax223; X86-NEXT: andl $1, %eax224; X86-NEXT: negl %eax225; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000226; X86-NEXT: addl {{[0-9]+}}(%esp), %eax227; X86-NEXT: shll $8, %eax228; X86-NEXT: movl %eax, (%ecx)229; X86-NEXT: retl230 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000231 %t1 = select i1 %cond, i32 %t0, i32 %x232 %r = shl i32 %t1, 8233 store i32 %r, ptr %dst234 ret i32 %r235}236 237; logical shift right238 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, %eax243; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000244; X64-NEXT: testb $1, %sil245; X64-NEXT: cmovel %edi, %eax246; X64-NEXT: shrl $8, %eax247; X64-NEXT: movl %eax, (%rdx)248; X64-NEXT: retq249;250; X86-LABEL: and_signbit_select_lshr:251; X86: # %bb.0:252; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx253; X86-NEXT: movl {{[0-9]+}}(%esp), %eax254; X86-NEXT: testb $1, {{[0-9]+}}(%esp)255; X86-NEXT: je .LBB8_2256; X86-NEXT: # %bb.1:257; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000258; X86-NEXT: .LBB8_2:259; X86-NEXT: shrl $8, %eax260; X86-NEXT: movl %eax, (%ecx)261; X86-NEXT: retl262 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000263 %t1 = select i1 %cond, i32 %t0, i32 %x264 %r = lshr i32 %t1, 8265 store i32 %r, ptr %dst266 ret i32 %r267}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, %eax272; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000273; X64-NEXT: testb $1, %sil274; X64-NEXT: cmovel %edi, %eax275; X64-NEXT: shrl $8, %eax276; X64-NEXT: movl %eax, (%rdx)277; X64-NEXT: retq278;279; X86-LABEL: and_nosignbit_select_lshr:280; X86: # %bb.0:281; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx282; X86-NEXT: movl {{[0-9]+}}(%esp), %eax283; X86-NEXT: testb $1, {{[0-9]+}}(%esp)284; X86-NEXT: je .LBB9_2285; X86-NEXT: # %bb.1:286; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000287; X86-NEXT: .LBB9_2:288; X86-NEXT: shrl $8, %eax289; X86-NEXT: movl %eax, (%ecx)290; X86-NEXT: retl291 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000292 %t1 = select i1 %cond, i32 %t0, i32 %x293 %r = lshr i32 %t1, 8294 store i32 %r, ptr %dst295 ret i32 %r296}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, %eax302; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000303; X64-NEXT: testb $1, %sil304; X64-NEXT: cmovel %edi, %eax305; X64-NEXT: shrl $8, %eax306; X64-NEXT: movl %eax, (%rdx)307; X64-NEXT: retq308;309; X86-LABEL: or_signbit_select_lshr:310; X86: # %bb.0:311; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx312; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax313; X86-NEXT: andl $1, %eax314; X86-NEXT: negl %eax315; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000316; X86-NEXT: orl {{[0-9]+}}(%esp), %eax317; X86-NEXT: shrl $8, %eax318; X86-NEXT: movl %eax, (%ecx)319; X86-NEXT: retl320 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000321 %t1 = select i1 %cond, i32 %t0, i32 %x322 %r = lshr i32 %t1, 8323 store i32 %r, ptr %dst324 ret i32 %r325}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, %eax330; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000331; X64-NEXT: testb $1, %sil332; X64-NEXT: cmovel %edi, %eax333; X64-NEXT: shrl $8, %eax334; X64-NEXT: movl %eax, (%rdx)335; X64-NEXT: retq336;337; X86-LABEL: or_nosignbit_select_lshr:338; X86: # %bb.0:339; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx340; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax341; X86-NEXT: andl $1, %eax342; X86-NEXT: negl %eax343; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000344; X86-NEXT: orl {{[0-9]+}}(%esp), %eax345; X86-NEXT: shrl $8, %eax346; X86-NEXT: movl %eax, (%ecx)347; X86-NEXT: retl348 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000349 %t1 = select i1 %cond, i32 %t0, i32 %x350 %r = lshr i32 %t1, 8351 store i32 %r, ptr %dst352 ret i32 %r353}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, %eax359; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000360; X64-NEXT: testb $1, %sil361; X64-NEXT: cmovel %edi, %eax362; X64-NEXT: shrl $8, %eax363; X64-NEXT: movl %eax, (%rdx)364; X64-NEXT: retq365;366; X86-LABEL: xor_signbit_select_lshr:367; X86: # %bb.0:368; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx369; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax370; X86-NEXT: andl $1, %eax371; X86-NEXT: negl %eax372; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000373; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax374; X86-NEXT: shrl $8, %eax375; X86-NEXT: movl %eax, (%ecx)376; X86-NEXT: retl377 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000378 %t1 = select i1 %cond, i32 %t0, i32 %x379 %r = lshr i32 %t1, 8380 store i32 %r, ptr %dst381 ret i32 %r382}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, %eax387; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000388; X64-NEXT: testb $1, %sil389; X64-NEXT: cmovel %edi, %eax390; X64-NEXT: shrl $8, %eax391; X64-NEXT: movl %eax, (%rdx)392; X64-NEXT: retq393;394; X86-LABEL: xor_nosignbit_select_lshr:395; X86: # %bb.0:396; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx397; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax398; X86-NEXT: andl $1, %eax399; X86-NEXT: negl %eax400; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000401; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax402; X86-NEXT: shrl $8, %eax403; X86-NEXT: movl %eax, (%ecx)404; X86-NEXT: retl405 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000406 %t1 = select i1 %cond, i32 %t0, i32 %x407 %r = lshr i32 %t1, 8408 store i32 %r, ptr %dst409 ret i32 %r410}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 $rdi416; X64-NEXT: leal -65536(%rdi), %eax417; X64-NEXT: testb $1, %sil418; X64-NEXT: cmovel %edi, %eax419; X64-NEXT: shrl $8, %eax420; X64-NEXT: movl %eax, (%rdx)421; X64-NEXT: retq422;423; X86-LABEL: add_signbit_select_lshr:424; X86: # %bb.0:425; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx426; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax427; X86-NEXT: andl $1, %eax428; X86-NEXT: negl %eax429; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000430; X86-NEXT: addl {{[0-9]+}}(%esp), %eax431; X86-NEXT: shrl $8, %eax432; X86-NEXT: movl %eax, (%ecx)433; X86-NEXT: retl434 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000435 %t1 = select i1 %cond, i32 %t0, i32 %x436 %r = lshr i32 %t1, 8437 store i32 %r, ptr %dst438 ret i32 %r439}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 $rdi444; X64-NEXT: leal 2147418112(%rdi), %eax445; X64-NEXT: testb $1, %sil446; X64-NEXT: cmovel %edi, %eax447; X64-NEXT: shrl $8, %eax448; X64-NEXT: movl %eax, (%rdx)449; X64-NEXT: retq450;451; X86-LABEL: add_nosignbit_select_lshr:452; X86: # %bb.0:453; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx454; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax455; X86-NEXT: andl $1, %eax456; X86-NEXT: negl %eax457; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000458; X86-NEXT: addl {{[0-9]+}}(%esp), %eax459; X86-NEXT: shrl $8, %eax460; X86-NEXT: movl %eax, (%ecx)461; X86-NEXT: retl462 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000463 %t1 = select i1 %cond, i32 %t0, i32 %x464 %r = lshr i32 %t1, 8465 store i32 %r, ptr %dst466 ret i32 %r467}468 469; arithmetic shift right470 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, %eax475; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000476; X64-NEXT: testb $1, %sil477; X64-NEXT: cmovel %edi, %eax478; X64-NEXT: sarl $8, %eax479; X64-NEXT: movl %eax, (%rdx)480; X64-NEXT: retq481;482; X86-LABEL: and_signbit_select_ashr:483; X86: # %bb.0:484; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx485; X86-NEXT: movl {{[0-9]+}}(%esp), %eax486; X86-NEXT: testb $1, {{[0-9]+}}(%esp)487; X86-NEXT: je .LBB16_2488; X86-NEXT: # %bb.1:489; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000490; X86-NEXT: .LBB16_2:491; X86-NEXT: sarl $8, %eax492; X86-NEXT: movl %eax, (%ecx)493; X86-NEXT: retl494 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000495 %t1 = select i1 %cond, i32 %t0, i32 %x496 %r = ashr i32 %t1, 8497 store i32 %r, ptr %dst498 ret i32 %r499}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, %eax504; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000505; X64-NEXT: testb $1, %sil506; X64-NEXT: cmovel %edi, %eax507; X64-NEXT: sarl $8, %eax508; X64-NEXT: movl %eax, (%rdx)509; X64-NEXT: retq510;511; X86-LABEL: and_nosignbit_select_ashr:512; X86: # %bb.0:513; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx514; X86-NEXT: movl {{[0-9]+}}(%esp), %eax515; X86-NEXT: testb $1, {{[0-9]+}}(%esp)516; X86-NEXT: je .LBB17_2517; X86-NEXT: # %bb.1:518; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000519; X86-NEXT: .LBB17_2:520; X86-NEXT: sarl $8, %eax521; X86-NEXT: movl %eax, (%ecx)522; X86-NEXT: retl523 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000524 %t1 = select i1 %cond, i32 %t0, i32 %x525 %r = ashr i32 %t1, 8526 store i32 %r, ptr %dst527 ret i32 %r528}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, %eax534; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000535; X64-NEXT: testb $1, %sil536; X64-NEXT: cmovel %edi, %eax537; X64-NEXT: sarl $8, %eax538; X64-NEXT: movl %eax, (%rdx)539; X64-NEXT: retq540;541; X86-LABEL: or_signbit_select_ashr:542; X86: # %bb.0:543; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx544; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax545; X86-NEXT: andl $1, %eax546; X86-NEXT: negl %eax547; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000548; X86-NEXT: orl {{[0-9]+}}(%esp), %eax549; X86-NEXT: sarl $8, %eax550; X86-NEXT: movl %eax, (%ecx)551; X86-NEXT: retl552 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000553 %t1 = select i1 %cond, i32 %t0, i32 %x554 %r = ashr i32 %t1, 8555 store i32 %r, ptr %dst556 ret i32 %r557}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, %eax562; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000563; X64-NEXT: testb $1, %sil564; X64-NEXT: cmovel %edi, %eax565; X64-NEXT: sarl $8, %eax566; X64-NEXT: movl %eax, (%rdx)567; X64-NEXT: retq568;569; X86-LABEL: or_nosignbit_select_ashr:570; X86: # %bb.0:571; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx572; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax573; X86-NEXT: andl $1, %eax574; X86-NEXT: negl %eax575; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000576; X86-NEXT: orl {{[0-9]+}}(%esp), %eax577; X86-NEXT: sarl $8, %eax578; X86-NEXT: movl %eax, (%ecx)579; X86-NEXT: retl580 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000581 %t1 = select i1 %cond, i32 %t0, i32 %x582 %r = ashr i32 %t1, 8583 store i32 %r, ptr %dst584 ret i32 %r585}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, %eax591; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000592; X64-NEXT: testb $1, %sil593; X64-NEXT: cmovel %edi, %eax594; X64-NEXT: sarl $8, %eax595; X64-NEXT: movl %eax, (%rdx)596; X64-NEXT: retq597;598; X86-LABEL: xor_signbit_select_ashr:599; X86: # %bb.0:600; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx601; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax602; X86-NEXT: andl $1, %eax603; X86-NEXT: negl %eax604; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000605; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax606; X86-NEXT: sarl $8, %eax607; X86-NEXT: movl %eax, (%ecx)608; X86-NEXT: retl609 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000610 %t1 = select i1 %cond, i32 %t0, i32 %x611 %r = ashr i32 %t1, 8612 store i32 %r, ptr %dst613 ret i32 %r614}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, %eax619; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000620; X64-NEXT: testb $1, %sil621; X64-NEXT: cmovel %edi, %eax622; X64-NEXT: sarl $8, %eax623; X64-NEXT: movl %eax, (%rdx)624; X64-NEXT: retq625;626; X86-LABEL: xor_nosignbit_select_ashr:627; X86: # %bb.0:628; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx629; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax630; X86-NEXT: andl $1, %eax631; X86-NEXT: negl %eax632; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000633; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax634; X86-NEXT: sarl $8, %eax635; X86-NEXT: movl %eax, (%ecx)636; X86-NEXT: retl637 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000638 %t1 = select i1 %cond, i32 %t0, i32 %x639 %r = ashr i32 %t1, 8640 store i32 %r, ptr %dst641 ret i32 %r642}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 $rdi648; X64-NEXT: leal -65536(%rdi), %eax649; X64-NEXT: testb $1, %sil650; X64-NEXT: cmovel %edi, %eax651; X64-NEXT: sarl $8, %eax652; X64-NEXT: movl %eax, (%rdx)653; X64-NEXT: retq654;655; X86-LABEL: add_signbit_select_ashr:656; X86: # %bb.0:657; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx658; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax659; X86-NEXT: andl $1, %eax660; X86-NEXT: negl %eax661; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000662; X86-NEXT: addl {{[0-9]+}}(%esp), %eax663; X86-NEXT: sarl $8, %eax664; X86-NEXT: movl %eax, (%ecx)665; X86-NEXT: retl666 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000667 %t1 = select i1 %cond, i32 %t0, i32 %x668 %r = ashr i32 %t1, 8669 store i32 %r, ptr %dst670 ret i32 %r671}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 $rdi676; X64-NEXT: leal 2147418112(%rdi), %eax677; X64-NEXT: testb $1, %sil678; X64-NEXT: cmovel %edi, %eax679; X64-NEXT: sarl $8, %eax680; X64-NEXT: movl %eax, (%rdx)681; X64-NEXT: retq682;683; X86-LABEL: add_nosignbit_select_ashr:684; X86: # %bb.0:685; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx686; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax687; X86-NEXT: andl $1, %eax688; X86-NEXT: negl %eax689; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000690; X86-NEXT: addl {{[0-9]+}}(%esp), %eax691; X86-NEXT: sarl $8, %eax692; X86-NEXT: movl %eax, (%ecx)693; X86-NEXT: retl694 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000695 %t1 = select i1 %cond, i32 %t0, i32 %x696 %r = ashr i32 %t1, 8697 store i32 %r, ptr %dst698 ret i32 %r699}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, %eax705; X64-NEXT: shll $4, %eax706; X64-NEXT: testb $1, %sil707; X64-NEXT: cmovel %edi, %eax708; X64-NEXT: addl $123456, %eax # imm = 0x1E240709; X64-NEXT: movl %eax, (%rdx)710; X64-NEXT: retq711;712; X86-LABEL: shl_signbit_select_add:713; X86: # %bb.0:714; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx715; X86-NEXT: andb $1, %cl716; X86-NEXT: movl {{[0-9]+}}(%esp), %edx717; X86-NEXT: movl {{[0-9]+}}(%esp), %eax718; X86-NEXT: negb %cl719; X86-NEXT: andb $4, %cl720; X86-NEXT: shll %cl, %eax721; X86-NEXT: addl $123456, %eax # imm = 0x1E240722; X86-NEXT: movl %eax, (%edx)723; X86-NEXT: retl724 %t0 = shl i32 %x, 4725 %t1 = select i1 %cond, i32 %t0, i32 %x726 %r = add i32 %t1, 123456727 store i32 %r, ptr %dst728 ret i32 %r729}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, %eax735; X64-NEXT: shll $4, %eax736; X64-NEXT: testb $1, %sil737; X64-NEXT: cmovnel %edi, %eax738; X64-NEXT: addl $123456, %eax # imm = 0x1E240739; X64-NEXT: movl %eax, (%rdx)740; X64-NEXT: retq741;742; X86-LABEL: shl_signbit_select_add_fail:743; X86: # %bb.0:744; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx745; X86-NEXT: movl {{[0-9]+}}(%esp), %eax746; X86-NEXT: testb $1, {{[0-9]+}}(%esp)747; X86-NEXT: jne .LBB25_2748; X86-NEXT: # %bb.1:749; X86-NEXT: shll $4, %eax750; X86-NEXT: .LBB25_2:751; X86-NEXT: addl $123456, %eax # imm = 0x1E240752; X86-NEXT: movl %eax, (%ecx)753; X86-NEXT: retl754 %t0 = shl i32 %x, 4755 %t1 = select i1 %cond, i32 %x, i32 %t0756 %r = add i32 %t1, 123456757 store i32 %r, ptr %dst758 ret i32 %r759}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, %eax765; X64-NEXT: # kill: def $cl killed $cl killed $ecx766; X64-NEXT: shrl %cl, %eax767; X64-NEXT: testb $1, %sil768; X64-NEXT: cmovel %edi, %eax769; X64-NEXT: addl $123456, %eax # imm = 0x1E240770; X64-NEXT: movl %eax, (%rdx)771; X64-NEXT: retq772;773; X86-LABEL: lshr_signbit_select_add:774; X86: # %bb.0:775; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx776; X86-NEXT: andb $1, %cl777; X86-NEXT: movl {{[0-9]+}}(%esp), %edx778; X86-NEXT: movl {{[0-9]+}}(%esp), %eax779; X86-NEXT: negb %cl780; X86-NEXT: andb {{[0-9]+}}(%esp), %cl781; X86-NEXT: shrl %cl, %eax782; X86-NEXT: addl $123456, %eax # imm = 0x1E240783; X86-NEXT: movl %eax, (%edx)784; X86-NEXT: retl785 %t0 = lshr i32 %x, %y786 %t1 = select i1 %cond, i32 %t0, i32 %x787 %r = add i32 %t1, 123456788 store i32 %r, ptr %dst789 ret i32 %r790}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, %eax796; X64-NEXT: sarl $4, %eax797; X64-NEXT: testb $1, %sil798; X64-NEXT: cmovel %edi, %eax799; X64-NEXT: addl $123456, %eax # imm = 0x1E240800; X64-NEXT: movl %eax, (%rdx)801; X64-NEXT: retq802;803; X86-LABEL: ashr_signbit_select_add:804; X86: # %bb.0:805; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx806; X86-NEXT: andb $1, %cl807; X86-NEXT: movl {{[0-9]+}}(%esp), %edx808; X86-NEXT: movl {{[0-9]+}}(%esp), %eax809; X86-NEXT: negb %cl810; X86-NEXT: andb $4, %cl811; X86-NEXT: sarl %cl, %eax812; X86-NEXT: addl $123456, %eax # imm = 0x1E240813; X86-NEXT: movl %eax, (%edx)814; X86-NEXT: retl815 %t0 = ashr i32 %x, 4816 %t1 = select i1 %cond, i32 %t0, i32 %x817 %r = add i32 %t1, 123456818 store i32 %r, ptr %dst819 ret i32 %r820}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 $rcx826; X64-NEXT: andl %edi, %ecx827; X64-NEXT: testb $1, %sil828; X64-NEXT: cmovnel %edi, %ecx829; X64-NEXT: leal 123456(%rcx), %eax830; X64-NEXT: movl %eax, (%rdx)831; X64-NEXT: retq832;833; X86-LABEL: and_signbit_select_add:834; X86: # %bb.0:835; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx836; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax837; X86-NEXT: andl $1, %eax838; X86-NEXT: negl %eax839; X86-NEXT: orl {{[0-9]+}}(%esp), %eax840; X86-NEXT: andl {{[0-9]+}}(%esp), %eax841; X86-NEXT: addl $123456, %eax # imm = 0x1E240842; X86-NEXT: movl %eax, (%ecx)843; X86-NEXT: retl844 %t0 = and i32 %x, %y845 %t1 = select i1 %cond, i32 %x, i32 %t0846 %r = add i32 %t1, 123456847 store i32 %r, ptr %dst848 ret i32 %r849}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 $rcx856; X64-NEXT: andl %edi, %ecx857; X64-NEXT: testb $1, %sil858; X64-NEXT: cmovel %edi, %ecx859; X64-NEXT: leal 123456(%rcx), %eax860; X64-NEXT: movl %eax, (%rdx)861; X64-NEXT: retq862;863; X86-LABEL: and_signbit_select_add_fail:864; X86: # %bb.0:865; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx866; X86-NEXT: movl {{[0-9]+}}(%esp), %eax867; X86-NEXT: testb $1, {{[0-9]+}}(%esp)868; X86-NEXT: je .LBB29_2869; X86-NEXT: # %bb.1:870; X86-NEXT: andl {{[0-9]+}}(%esp), %eax871; X86-NEXT: .LBB29_2:872; X86-NEXT: addl $123456, %eax # imm = 0x1E240873; X86-NEXT: movl %eax, (%ecx)874; X86-NEXT: retl875 %t0 = and i32 %x, %y876 %t1 = select i1 %cond, i32 %t0, i32 %x877 %r = add i32 %t1, 123456878 store i32 %r, ptr %dst879 ret i32 %r880}881 882