brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.6 KiB · 8c858e0 Raw
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