brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.2 KiB · 1df284f Raw
636 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefixes=X644; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+tbm | FileCheck %s --check-prefixes=X645 6; PR35908 - Fold ADD/SUB and bit extracts into ADC/SBB+BT7;8; int test_add_add(int x, int y, int z) { return ((x + y) + bool(z & (1 << 30))); }9; int test_add_sub(int x, int y, int z) { return ((x - y) + bool(z & (1 << 30))); }10; int test_sub_add(int x, int y, int z) { return ((x + y) - bool(z & (1 << 30))); }11; int test_sub_sub(int x, int y, int z) { return (x - (y - bool(z & (1 << 30)))); }12 13;14; Constant Bit Indices15;16 17define i32 @test_i32_add_add_idx(i32 %x, i32 %y, i32 %z) nounwind {18; X86-LABEL: test_i32_add_add_idx:19; X86:       # %bb.0:20; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax21; X86-NEXT:    btl $30, {{[0-9]+}}(%esp)22; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax23; X86-NEXT:    retl24;25; X64-LABEL: test_i32_add_add_idx:26; X64:       # %bb.0:27; X64-NEXT:    movl %edi, %eax28; X64-NEXT:    btl $30, %edx29; X64-NEXT:    adcl %esi, %eax30; X64-NEXT:    retq31  %add = add i32 %y, %x32  %shift = lshr i32 %z, 3033  %mask = and i32 %shift, 134  %add1 = add i32 %add, %mask35  ret i32 %add136}37 38define i32 @test_i32_add_add_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {39; X86-LABEL: test_i32_add_add_commute_idx:40; X86:       # %bb.0:41; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax42; X86-NEXT:    btl $2, {{[0-9]+}}(%esp)43; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax44; X86-NEXT:    retl45;46; X64-LABEL: test_i32_add_add_commute_idx:47; X64:       # %bb.0:48; X64-NEXT:    movl %edi, %eax49; X64-NEXT:    btl $2, %edx50; X64-NEXT:    adcl %esi, %eax51; X64-NEXT:    retq52  %add = add i32 %y, %x53  %shift = lshr i32 %z, 254  %mask = and i32 %shift, 155  %add1 = add i32 %mask, %add56  ret i32 %add157}58 59define i32 @test_i32_add_add_idx0(i32 %x, i32 %y, i32 %z) nounwind {60; X86-LABEL: test_i32_add_add_idx0:61; X86:       # %bb.0:62; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax63; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx64; X86-NEXT:    addl {{[0-9]+}}(%esp), %ecx65; X86-NEXT:    andl $1, %eax66; X86-NEXT:    addl %ecx, %eax67; X86-NEXT:    retl68;69; X64-LABEL: test_i32_add_add_idx0:70; X64:       # %bb.0:71; X64-NEXT:    # kill: def $esi killed $esi def $rsi72; X64-NEXT:    # kill: def $edi killed $edi def $rdi73; X64-NEXT:    leal (%rdi,%rsi), %eax74; X64-NEXT:    andl $1, %edx75; X64-NEXT:    addl %edx, %eax76; X64-NEXT:    retq77  %add = add i32 %y, %x78  %mask = and i32 %z, 179  %add1 = add i32 %mask, %add80  ret i32 %add181}82 83define i24 @test_i24_add_add_idx(i24 %x, i24 %y, i24 %z) nounwind {84; X86-LABEL: test_i24_add_add_idx:85; X86:       # %bb.0:86; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax87; X86-NEXT:    btl $15, {{[0-9]+}}(%esp)88; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax89; X86-NEXT:    retl90;91; X64-LABEL: test_i24_add_add_idx:92; X64:       # %bb.0:93; X64-NEXT:    movl %edi, %eax94; X64-NEXT:    btl $15, %edx95; X64-NEXT:    adcl %esi, %eax96; X64-NEXT:    retq97  %add = add i24 %y, %x98  %shift = lshr i24 %z, 1599  %mask = and i24 %shift, 1100  %add1 = add i24 %add, %mask101  ret i24 %add1102}103 104define i128 @test_i128_add_add_idx(i128 %x, i128 %y, i128 %z) nounwind {105; X86-LABEL: test_i128_add_add_idx:106; X86:       # %bb.0:107; X86-NEXT:    pushl %ebp108; X86-NEXT:    movl %esp, %ebp109; X86-NEXT:    pushl %edi110; X86-NEXT:    pushl %esi111; X86-NEXT:    andl $-16, %esp112; X86-NEXT:    movl 8(%ebp), %eax113; X86-NEXT:    movl 48(%ebp), %ecx114; X86-NEXT:    movl 52(%ebp), %edx115; X86-NEXT:    movl 40(%ebp), %esi116; X86-NEXT:    movl 44(%ebp), %edi117; X86-NEXT:    addl 24(%ebp), %esi118; X86-NEXT:    adcl 28(%ebp), %edi119; X86-NEXT:    adcl 32(%ebp), %ecx120; X86-NEXT:    adcl 36(%ebp), %edx121; X86-NEXT:    btl $5, 64(%ebp)122; X86-NEXT:    adcl $0, %esi123; X86-NEXT:    adcl $0, %edi124; X86-NEXT:    adcl $0, %ecx125; X86-NEXT:    adcl $0, %edx126; X86-NEXT:    movl %edi, 4(%eax)127; X86-NEXT:    movl %esi, (%eax)128; X86-NEXT:    movl %ecx, 8(%eax)129; X86-NEXT:    movl %edx, 12(%eax)130; X86-NEXT:    leal -8(%ebp), %esp131; X86-NEXT:    popl %esi132; X86-NEXT:    popl %edi133; X86-NEXT:    popl %ebp134; X86-NEXT:    retl $4135;136; X64-LABEL: test_i128_add_add_idx:137; X64:       # %bb.0:138; X64-NEXT:    movq %rdi, %rax139; X64-NEXT:    addq %rdx, %rax140; X64-NEXT:    adcq %rcx, %rsi141; X64-NEXT:    btl $5, %r9d142; X64-NEXT:    adcq $0, %rax143; X64-NEXT:    adcq $0, %rsi144; X64-NEXT:    movq %rsi, %rdx145; X64-NEXT:    retq146  %add = add i128 %y, %x147  %shift = lshr i128 %z, 69148  %mask = and i128 %shift, 1149  %add1 = add i128 %add, %mask150  ret i128 %add1151}152 153define i32 @test_i32_add_sub_idx(i32 %x, i32 %y, i32 %z) nounwind {154; X86-LABEL: test_i32_add_sub_idx:155; X86:       # %bb.0:156; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax157; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx158; X86-NEXT:    subl {{[0-9]+}}(%esp), %ecx159; X86-NEXT:    shrl $31, %eax160; X86-NEXT:    addl %ecx, %eax161; X86-NEXT:    retl162;163; X64-LABEL: test_i32_add_sub_idx:164; X64:       # %bb.0:165; X64-NEXT:    # kill: def $edx killed $edx def $rdx166; X64-NEXT:    # kill: def $edi killed $edi def $rdi167; X64-NEXT:    subl %esi, %edi168; X64-NEXT:    shrl $31, %edx169; X64-NEXT:    leal (%rdx,%rdi), %eax170; X64-NEXT:    retq171  %sub = sub i32 %x, %y172  %shift = lshr i32 %z, 31173  %mask = and i32 %shift, 1174  %add = add i32 %sub, %mask175  ret i32 %add176}177 178define i32 @test_i32_add_sub_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {179; X86-LABEL: test_i32_add_sub_commute_idx:180; X86:       # %bb.0:181; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax182; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax183; X86-NEXT:    btl $8, {{[0-9]+}}(%esp)184; X86-NEXT:    adcl $0, %eax185; X86-NEXT:    retl186;187; X64-LABEL: test_i32_add_sub_commute_idx:188; X64:       # %bb.0:189; X64-NEXT:    movl %edi, %eax190; X64-NEXT:    subl %esi, %eax191; X64-NEXT:    btl $8, %edx192; X64-NEXT:    adcl $0, %eax193; X64-NEXT:    retq194  %sub = sub i32 %x, %y195  %shift = lshr i32 %z, 8196  %mask = and i32 %shift, 1197  %add = add i32 %mask, %sub198  ret i32 %add199}200 201define i32 @test_i32_sub_add_idx(i32 %x, i32 %y, i32 %z) nounwind {202; X86-LABEL: test_i32_sub_add_idx:203; X86:       # %bb.0:204; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax205; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax206; X86-NEXT:    btl $1, {{[0-9]+}}(%esp)207; X86-NEXT:    sbbl $0, %eax208; X86-NEXT:    retl209;210; X64-LABEL: test_i32_sub_add_idx:211; X64:       # %bb.0:212; X64-NEXT:    # kill: def $esi killed $esi def $rsi213; X64-NEXT:    # kill: def $edi killed $edi def $rdi214; X64-NEXT:    leal (%rdi,%rsi), %eax215; X64-NEXT:    btl $1, %edx216; X64-NEXT:    sbbl $0, %eax217; X64-NEXT:    retq218  %add = add i32 %y, %x219  %shift = lshr i32 %z, 1220  %mask = and i32 %shift, 1221  %sub = sub i32 %add, %mask222  ret i32 %sub223}224 225define i32 @test_i32_sub_add_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {226; X86-LABEL: test_i32_sub_add_commute_idx:227; X86:       # %bb.0:228; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax229; X86-NEXT:    btl $1, {{[0-9]+}}(%esp)230; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax231; X86-NEXT:    retl232;233; X64-LABEL: test_i32_sub_add_commute_idx:234; X64:       # %bb.0:235; X64-NEXT:    movl %edi, %eax236; X64-NEXT:    btl $1, %edx237; X64-NEXT:    sbbl %esi, %eax238; X64-NEXT:    retq239  %shift = lshr i32 %z, 1240  %mask = and i32 %shift, 1241  %add = add i32 %y, %mask242  %sub = sub i32 %x, %add243  ret i32 %sub244}245 246define i32 @test_i32_sub_add_sext_idx(i32 %x, i32 %y, i32 %z) nounwind {247; X86-LABEL: test_i32_sub_add_sext_idx:248; X86:       # %bb.0:249; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax250; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx251; X86-NEXT:    shll $25, %ecx252; X86-NEXT:    sarl $31, %ecx253; X86-NEXT:    addl {{[0-9]+}}(%esp), %ecx254; X86-NEXT:    subl %ecx, %eax255; X86-NEXT:    retl256;257; X64-LABEL: test_i32_sub_add_sext_idx:258; X64:       # %bb.0:259; X64-NEXT:    movl %edi, %eax260; X64-NEXT:    shll $25, %edx261; X64-NEXT:    sarl $31, %edx262; X64-NEXT:    addl %esi, %edx263; X64-NEXT:    subl %edx, %eax264; X64-NEXT:    retq265  %shl = shl i32 %z, 25266  %sext = ashr i32 %shl, 31267  %add = add i32 %y, %sext268  %sub = sub i32 %x, %add269  ret i32 %sub270}271 272define i32 @test_i32_sub_sub_idx(i32 %x, i32 %y, i32 %z) nounwind {273; X86-LABEL: test_i32_sub_sub_idx:274; X86:       # %bb.0:275; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax276; X86-NEXT:    btl $16, {{[0-9]+}}(%esp)277; X86-NEXT:    adcl $0, %eax278; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax279; X86-NEXT:    retl280;281; X64-LABEL: test_i32_sub_sub_idx:282; X64:       # %bb.0:283; X64-NEXT:    movl %edi, %eax284; X64-NEXT:    btl $16, %edx285; X64-NEXT:    adcl $0, %eax286; X64-NEXT:    subl %esi, %eax287; X64-NEXT:    retq288  %shift = lshr i32 %z, 16289  %mask = and i32 %shift, 1290  %sub0 = sub i32 %y, %mask291  %sub1 = sub i32 %x, %sub0292  ret i32 %sub1293}294 295define i32 @test_i32_sub_sub_commute_idx(i32 %x, i32 %y, i32 %z) nounwind {296; X86-LABEL: test_i32_sub_sub_commute_idx:297; X86:       # %bb.0:298; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax299; X86-NEXT:    btl $15, {{[0-9]+}}(%esp)300; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax301; X86-NEXT:    retl302;303; X64-LABEL: test_i32_sub_sub_commute_idx:304; X64:       # %bb.0:305; X64-NEXT:    movl %edi, %eax306; X64-NEXT:    btl $15, %edx307; X64-NEXT:    sbbl %esi, %eax308; X64-NEXT:    retq309  %shift = lshr i32 %z, 15310  %mask = and i32 %shift, 1311  %sub0 = sub i32 %x, %y312  %sub1 = sub i32 %sub0, %mask313  ret i32 %sub1314}315 316define i32 @test_i32_sub_sum_idx(i32 %x, i32 %y, i32 %z) nounwind {317; X86-LABEL: test_i32_sub_sum_idx:318; X86:       # %bb.0:319; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax320; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax321; X86-NEXT:    btl $30, {{[0-9]+}}(%esp)322; X86-NEXT:    sbbl $0, %eax323; X86-NEXT:    negl %eax324; X86-NEXT:    retl325;326; X64-LABEL: test_i32_sub_sum_idx:327; X64:       # %bb.0:328; X64-NEXT:    # kill: def $esi killed $esi def $rsi329; X64-NEXT:    # kill: def $edi killed $edi def $rdi330; X64-NEXT:    leal (%rdi,%rsi), %eax331; X64-NEXT:    btl $30, %edx332; X64-NEXT:    sbbl $0, %eax333; X64-NEXT:    negl %eax334; X64-NEXT:    retq335  %shift = lshr i32 %z, 30336  %mask = and i32 %shift, 1337  %add = add i32 %y, %x338  %sub = sub i32 %mask, %add339  ret i32 %sub340}341 342;343; Variable Bit Indices344;345 346define i32 @test_i32_add_add_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {347; X86-LABEL: test_i32_add_add_var:348; X86:       # %bb.0:349; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax350; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx351; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx352; X86-NEXT:    btl %ecx, %edx353; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax354; X86-NEXT:    retl355;356; X64-LABEL: test_i32_add_add_var:357; X64:       # %bb.0:358; X64-NEXT:    movl %edi, %eax359; X64-NEXT:    btl %ecx, %edx360; X64-NEXT:    adcl %esi, %eax361; X64-NEXT:    retq362  %add = add i32 %y, %x363  %shift = lshr i32 %z, %w364  %mask = and i32 %shift, 1365  %add1 = add i32 %add, %mask366  ret i32 %add1367}368 369define i32 @test_i32_add_add_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {370; X86-LABEL: test_i32_add_add_commute_var:371; X86:       # %bb.0:372; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax373; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx374; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx375; X86-NEXT:    btl %ecx, %edx376; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax377; X86-NEXT:    retl378;379; X64-LABEL: test_i32_add_add_commute_var:380; X64:       # %bb.0:381; X64-NEXT:    movl %edi, %eax382; X64-NEXT:    btl %ecx, %edx383; X64-NEXT:    adcl %esi, %eax384; X64-NEXT:    retq385  %add = add i32 %y, %x386  %shift = lshr i32 %z, %w387  %mask = and i32 %shift, 1388  %add1 = add i32 %mask, %add389  ret i32 %add1390}391 392define i64 @test_i64_add_add_var(i64 %x, i64 %y, i64 %z, i64 %w) nounwind {393; X86-LABEL: test_i64_add_add_var:394; X86:       # %bb.0:395; X86-NEXT:    pushl %ebx396; X86-NEXT:    pushl %edi397; X86-NEXT:    pushl %esi398; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx399; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi400; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx401; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax402; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx403; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax404; X86-NEXT:    adcl {{[0-9]+}}(%esp), %edx405; X86-NEXT:    movl %ebx, %edi406; X86-NEXT:    shrl %cl, %edi407; X86-NEXT:    shrdl %cl, %ebx, %esi408; X86-NEXT:    testb $32, %cl409; X86-NEXT:    jne .LBB15_2410; X86-NEXT:  # %bb.1:411; X86-NEXT:    movl %esi, %edi412; X86-NEXT:  .LBB15_2:413; X86-NEXT:    andl $1, %edi414; X86-NEXT:    addl %edi, %eax415; X86-NEXT:    adcl $0, %edx416; X86-NEXT:    popl %esi417; X86-NEXT:    popl %edi418; X86-NEXT:    popl %ebx419; X86-NEXT:    retl420;421; X64-LABEL: test_i64_add_add_var:422; X64:       # %bb.0:423; X64-NEXT:    movq %rdi, %rax424; X64-NEXT:    btq %rcx, %rdx425; X64-NEXT:    adcq %rsi, %rax426; X64-NEXT:    retq427  %add = add i64 %y, %x428  %shift = lshr i64 %z, %w429  %mask = and i64 %shift, 1430  %add1 = add i64 %add, %mask431  ret i64 %add1432}433 434define i32 @test_i32_add_sub_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {435; X86-LABEL: test_i32_add_sub_var:436; X86:       # %bb.0:437; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx438; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx439; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax440; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax441; X86-NEXT:    btl %ecx, %edx442; X86-NEXT:    adcl $0, %eax443; X86-NEXT:    retl444;445; X64-LABEL: test_i32_add_sub_var:446; X64:       # %bb.0:447; X64-NEXT:    movl %edi, %eax448; X64-NEXT:    subl %esi, %eax449; X64-NEXT:    btl %ecx, %edx450; X64-NEXT:    adcl $0, %eax451; X64-NEXT:    retq452  %sub = sub i32 %x, %y453  %shift = lshr i32 %z, %w454  %mask = and i32 %shift, 1455  %add = add i32 %sub, %mask456  ret i32 %add457}458 459define i32 @test_i32_add_sub_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {460; X86-LABEL: test_i32_add_sub_commute_var:461; X86:       # %bb.0:462; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx463; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx464; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax465; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax466; X86-NEXT:    btl %ecx, %edx467; X86-NEXT:    adcl $0, %eax468; X86-NEXT:    retl469;470; X64-LABEL: test_i32_add_sub_commute_var:471; X64:       # %bb.0:472; X64-NEXT:    movl %edi, %eax473; X64-NEXT:    subl %esi, %eax474; X64-NEXT:    btl %ecx, %edx475; X64-NEXT:    adcl $0, %eax476; X64-NEXT:    retq477  %sub = sub i32 %x, %y478  %shift = lshr i32 %z, %w479  %mask = and i32 %shift, 1480  %add = add i32 %mask, %sub481  ret i32 %add482}483 484define i32 @test_i32_sub_add_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {485; X86-LABEL: test_i32_sub_add_var:486; X86:       # %bb.0:487; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx488; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx489; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax490; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax491; X86-NEXT:    btl %ecx, %edx492; X86-NEXT:    sbbl $0, %eax493; X86-NEXT:    retl494;495; X64-LABEL: test_i32_sub_add_var:496; X64:       # %bb.0:497; X64-NEXT:    # kill: def $esi killed $esi def $rsi498; X64-NEXT:    # kill: def $edi killed $edi def $rdi499; X64-NEXT:    leal (%rdi,%rsi), %eax500; X64-NEXT:    btl %ecx, %edx501; X64-NEXT:    sbbl $0, %eax502; X64-NEXT:    retq503  %add = add i32 %y, %x504  %shift = lshr i32 %z, %w505  %mask = and i32 %shift, 1506  %sub = sub i32 %add, %mask507  ret i32 %sub508}509 510define i32 @test_i32_sub_add_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {511; X86-LABEL: test_i32_sub_add_commute_var:512; X86:       # %bb.0:513; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax514; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx515; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx516; X86-NEXT:    btl %ecx, %edx517; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax518; X86-NEXT:    retl519;520; X64-LABEL: test_i32_sub_add_commute_var:521; X64:       # %bb.0:522; X64-NEXT:    movl %edi, %eax523; X64-NEXT:    btl %ecx, %edx524; X64-NEXT:    sbbl %esi, %eax525; X64-NEXT:    retq526  %shift = lshr i32 %z, %w527  %mask = and i32 %shift, 1528  %add = add i32 %y, %mask529  %sub = sub i32 %x, %add530  ret i32 %sub531}532 533define i32 @test_i32_sub_add_sext_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {534; X86-LABEL: test_i32_sub_add_sext_var:535; X86:       # %bb.0:536; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax537; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx538; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx539; X86-NEXT:    shll %cl, %edx540; X86-NEXT:    sarl $31, %edx541; X86-NEXT:    addl {{[0-9]+}}(%esp), %edx542; X86-NEXT:    subl %edx, %eax543; X86-NEXT:    retl544;545; X64-LABEL: test_i32_sub_add_sext_var:546; X64:       # %bb.0:547; X64-NEXT:    movl %edi, %eax548; X64-NEXT:    # kill: def $cl killed $cl killed $ecx549; X64-NEXT:    shll %cl, %edx550; X64-NEXT:    sarl $31, %edx551; X64-NEXT:    addl %esi, %edx552; X64-NEXT:    subl %edx, %eax553; X64-NEXT:    retq554  %shl = shl i32 %z, %w555  %sext = ashr i32 %shl, 31556  %add = add i32 %y, %sext557  %sub = sub i32 %x, %add558  ret i32 %sub559}560 561define i32 @test_i32_sub_sub_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {562; X86-LABEL: test_i32_sub_sub_var:563; X86:       # %bb.0:564; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax565; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx566; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx567; X86-NEXT:    btl %ecx, %edx568; X86-NEXT:    adcl $0, %eax569; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax570; X86-NEXT:    retl571;572; X64-LABEL: test_i32_sub_sub_var:573; X64:       # %bb.0:574; X64-NEXT:    movl %edi, %eax575; X64-NEXT:    btl %ecx, %edx576; X64-NEXT:    adcl $0, %eax577; X64-NEXT:    subl %esi, %eax578; X64-NEXT:    retq579  %shift = lshr i32 %z, %w580  %mask = and i32 %shift, 1581  %sub0 = sub i32 %y, %mask582  %sub1 = sub i32 %x, %sub0583  ret i32 %sub1584}585 586define i32 @test_i32_sub_sub_commute_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {587; X86-LABEL: test_i32_sub_sub_commute_var:588; X86:       # %bb.0:589; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax590; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx591; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx592; X86-NEXT:    btl %ecx, %edx593; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax594; X86-NEXT:    retl595;596; X64-LABEL: test_i32_sub_sub_commute_var:597; X64:       # %bb.0:598; X64-NEXT:    movl %edi, %eax599; X64-NEXT:    btl %ecx, %edx600; X64-NEXT:    sbbl %esi, %eax601; X64-NEXT:    retq602  %shift = lshr i32 %z, %w603  %mask = and i32 %shift, 1604  %sub0 = sub i32 %x, %y605  %sub1 = sub i32 %sub0, %mask606  ret i32 %sub1607}608 609define i32 @test_i32_sub_sum_var(i32 %x, i32 %y, i32 %z, i32 %w) nounwind {610; X86-LABEL: test_i32_sub_sum_var:611; X86:       # %bb.0:612; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx613; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx614; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax615; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax616; X86-NEXT:    btl %ecx, %edx617; X86-NEXT:    sbbl $0, %eax618; X86-NEXT:    negl %eax619; X86-NEXT:    retl620;621; X64-LABEL: test_i32_sub_sum_var:622; X64:       # %bb.0:623; X64-NEXT:    # kill: def $esi killed $esi def $rsi624; X64-NEXT:    # kill: def $edi killed $edi def $rdi625; X64-NEXT:    leal (%rdi,%rsi), %eax626; X64-NEXT:    btl %ecx, %edx627; X64-NEXT:    sbbl $0, %eax628; X64-NEXT:    negl %eax629; X64-NEXT:    retq630  %shift = lshr i32 %z, %w631  %mask = and i32 %shift, 1632  %add = add i32 %y, %x633  %sub = sub i32 %mask, %add634  ret i32 %sub635}636