brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.7 KiB · c058e37 Raw
1159 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; These test cases are inspired by C++2a std::midpoint().6; See https://bugs.llvm.org/show_bug.cgi?id=409657 8; ---------------------------------------------------------------------------- ;9; 32-bit width10; ---------------------------------------------------------------------------- ;11 12; Values come from regs13 14define i32 @scalar_i32_signed_reg_reg(i32 %a1, i32 %a2) nounwind {15; X64-LABEL: scalar_i32_signed_reg_reg:16; X64:       # %bb.0:17; X64-NEXT:    xorl %ecx, %ecx18; X64-NEXT:    movl %edi, %eax19; X64-NEXT:    subl %esi, %eax20; X64-NEXT:    setle %cl21; X64-NEXT:    leal -1(%rcx,%rcx), %ecx22; X64-NEXT:    subl %edi, %esi23; X64-NEXT:    cmovgel %esi, %eax24; X64-NEXT:    shrl %eax25; X64-NEXT:    imull %ecx, %eax26; X64-NEXT:    addl %edi, %eax27; X64-NEXT:    retq28;29; X86-LABEL: scalar_i32_signed_reg_reg:30; X86:       # %bb.0:31; X86-NEXT:    pushl %ebx32; X86-NEXT:    pushl %esi33; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi34; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx35; X86-NEXT:    movl %ecx, %edx36; X86-NEXT:    subl %esi, %edx37; X86-NEXT:    xorl %ebx, %ebx38; X86-NEXT:    movl %ecx, %eax39; X86-NEXT:    subl %esi, %eax40; X86-NEXT:    setle %bl41; X86-NEXT:    leal -1(%ebx,%ebx), %esi42; X86-NEXT:    jg .LBB0_243; X86-NEXT:  # %bb.1:44; X86-NEXT:    negl %edx45; X86-NEXT:    movl %edx, %eax46; X86-NEXT:  .LBB0_2:47; X86-NEXT:    shrl %eax48; X86-NEXT:    imull %esi, %eax49; X86-NEXT:    addl %ecx, %eax50; X86-NEXT:    popl %esi51; X86-NEXT:    popl %ebx52; X86-NEXT:    retl53  %t3 = icmp sgt i32 %a1, %a2 ; signed54  %t4 = select i1 %t3, i32 -1, i32 155  %t5 = select i1 %t3, i32 %a2, i32 %a156  %t6 = select i1 %t3, i32 %a1, i32 %a257  %t7 = sub i32 %t6, %t558  %t8 = lshr i32 %t7, 159  %t9 = mul nsw i32 %t8, %t4 ; signed60  %a10 = add nsw i32 %t9, %a1 ; signed61  ret i32 %a1062}63 64define i32 @scalar_i32_unsigned_reg_reg(i32 %a1, i32 %a2) nounwind {65; X64-LABEL: scalar_i32_unsigned_reg_reg:66; X64:       # %bb.0:67; X64-NEXT:    xorl %ecx, %ecx68; X64-NEXT:    cmpl %edi, %esi69; X64-NEXT:    sbbl %ecx, %ecx70; X64-NEXT:    movl %edi, %eax71; X64-NEXT:    subl %esi, %eax72; X64-NEXT:    subl %edi, %esi73; X64-NEXT:    cmovael %esi, %eax74; X64-NEXT:    orl $1, %ecx75; X64-NEXT:    shrl %eax76; X64-NEXT:    imull %ecx, %eax77; X64-NEXT:    addl %edi, %eax78; X64-NEXT:    retq79;80; X86-LABEL: scalar_i32_unsigned_reg_reg:81; X86:       # %bb.0:82; X86-NEXT:    pushl %ebx83; X86-NEXT:    pushl %esi84; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi85; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx86; X86-NEXT:    movl %ecx, %edx87; X86-NEXT:    subl %esi, %edx88; X86-NEXT:    xorl %ebx, %ebx89; X86-NEXT:    movl %ecx, %eax90; X86-NEXT:    subl %esi, %eax91; X86-NEXT:    setbe %bl92; X86-NEXT:    leal -1(%ebx,%ebx), %esi93; X86-NEXT:    ja .LBB1_294; X86-NEXT:  # %bb.1:95; X86-NEXT:    negl %edx96; X86-NEXT:    movl %edx, %eax97; X86-NEXT:  .LBB1_2:98; X86-NEXT:    shrl %eax99; X86-NEXT:    imull %esi, %eax100; X86-NEXT:    addl %ecx, %eax101; X86-NEXT:    popl %esi102; X86-NEXT:    popl %ebx103; X86-NEXT:    retl104  %t3 = icmp ugt i32 %a1, %a2105  %t4 = select i1 %t3, i32 -1, i32 1106  %t5 = select i1 %t3, i32 %a2, i32 %a1107  %t6 = select i1 %t3, i32 %a1, i32 %a2108  %t7 = sub i32 %t6, %t5109  %t8 = lshr i32 %t7, 1110  %t9 = mul i32 %t8, %t4111  %a10 = add i32 %t9, %a1112  ret i32 %a10113}114 115; Values are loaded. Only check signed case.116 117define i32 @scalar_i32_signed_mem_reg(ptr %a1_addr, i32 %a2) nounwind {118; X64-LABEL: scalar_i32_signed_mem_reg:119; X64:       # %bb.0:120; X64-NEXT:    movl (%rdi), %ecx121; X64-NEXT:    xorl %edx, %edx122; X64-NEXT:    movl %ecx, %eax123; X64-NEXT:    subl %esi, %eax124; X64-NEXT:    setle %dl125; X64-NEXT:    leal -1(%rdx,%rdx), %edx126; X64-NEXT:    subl %ecx, %esi127; X64-NEXT:    cmovgel %esi, %eax128; X64-NEXT:    shrl %eax129; X64-NEXT:    imull %edx, %eax130; X64-NEXT:    addl %ecx, %eax131; X64-NEXT:    retq132;133; X86-LABEL: scalar_i32_signed_mem_reg:134; X86:       # %bb.0:135; X86-NEXT:    pushl %ebx136; X86-NEXT:    pushl %esi137; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi138; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax139; X86-NEXT:    movl (%eax), %ecx140; X86-NEXT:    movl %ecx, %edx141; X86-NEXT:    subl %esi, %edx142; X86-NEXT:    xorl %ebx, %ebx143; X86-NEXT:    movl %ecx, %eax144; X86-NEXT:    subl %esi, %eax145; X86-NEXT:    setle %bl146; X86-NEXT:    leal -1(%ebx,%ebx), %esi147; X86-NEXT:    jg .LBB2_2148; X86-NEXT:  # %bb.1:149; X86-NEXT:    negl %edx150; X86-NEXT:    movl %edx, %eax151; X86-NEXT:  .LBB2_2:152; X86-NEXT:    shrl %eax153; X86-NEXT:    imull %esi, %eax154; X86-NEXT:    addl %ecx, %eax155; X86-NEXT:    popl %esi156; X86-NEXT:    popl %ebx157; X86-NEXT:    retl158  %a1 = load i32, ptr %a1_addr159  %t3 = icmp sgt i32 %a1, %a2 ; signed160  %t4 = select i1 %t3, i32 -1, i32 1161  %t5 = select i1 %t3, i32 %a2, i32 %a1162  %t6 = select i1 %t3, i32 %a1, i32 %a2163  %t7 = sub i32 %t6, %t5164  %t8 = lshr i32 %t7, 1165  %t9 = mul nsw i32 %t8, %t4 ; signed166  %a10 = add nsw i32 %t9, %a1 ; signed167  ret i32 %a10168}169 170define i32 @scalar_i32_signed_reg_mem(i32 %a1, ptr %a2_addr) nounwind {171; X64-LABEL: scalar_i32_signed_reg_mem:172; X64:       # %bb.0:173; X64-NEXT:    movl (%rsi), %eax174; X64-NEXT:    xorl %ecx, %ecx175; X64-NEXT:    movl %edi, %edx176; X64-NEXT:    subl %eax, %edx177; X64-NEXT:    setle %cl178; X64-NEXT:    leal -1(%rcx,%rcx), %ecx179; X64-NEXT:    subl %edi, %eax180; X64-NEXT:    cmovll %edx, %eax181; X64-NEXT:    shrl %eax182; X64-NEXT:    imull %ecx, %eax183; X64-NEXT:    addl %edi, %eax184; X64-NEXT:    retq185;186; X86-LABEL: scalar_i32_signed_reg_mem:187; X86:       # %bb.0:188; X86-NEXT:    pushl %ebx189; X86-NEXT:    pushl %esi190; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx191; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax192; X86-NEXT:    movl (%eax), %esi193; X86-NEXT:    movl %ecx, %edx194; X86-NEXT:    subl %esi, %edx195; X86-NEXT:    xorl %ebx, %ebx196; X86-NEXT:    movl %ecx, %eax197; X86-NEXT:    subl %esi, %eax198; X86-NEXT:    setle %bl199; X86-NEXT:    leal -1(%ebx,%ebx), %esi200; X86-NEXT:    jg .LBB3_2201; X86-NEXT:  # %bb.1:202; X86-NEXT:    negl %edx203; X86-NEXT:    movl %edx, %eax204; X86-NEXT:  .LBB3_2:205; X86-NEXT:    shrl %eax206; X86-NEXT:    imull %esi, %eax207; X86-NEXT:    addl %ecx, %eax208; X86-NEXT:    popl %esi209; X86-NEXT:    popl %ebx210; X86-NEXT:    retl211  %a2 = load i32, ptr %a2_addr212  %t3 = icmp sgt i32 %a1, %a2 ; signed213  %t4 = select i1 %t3, i32 -1, i32 1214  %t5 = select i1 %t3, i32 %a2, i32 %a1215  %t6 = select i1 %t3, i32 %a1, i32 %a2216  %t7 = sub i32 %t6, %t5217  %t8 = lshr i32 %t7, 1218  %t9 = mul nsw i32 %t8, %t4 ; signed219  %a10 = add nsw i32 %t9, %a1 ; signed220  ret i32 %a10221}222 223define i32 @scalar_i32_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {224; X64-LABEL: scalar_i32_signed_mem_mem:225; X64:       # %bb.0:226; X64-NEXT:    movl (%rdi), %ecx227; X64-NEXT:    movl (%rsi), %eax228; X64-NEXT:    xorl %edx, %edx229; X64-NEXT:    movl %ecx, %esi230; X64-NEXT:    subl %eax, %esi231; X64-NEXT:    setle %dl232; X64-NEXT:    leal -1(%rdx,%rdx), %edx233; X64-NEXT:    subl %ecx, %eax234; X64-NEXT:    cmovll %esi, %eax235; X64-NEXT:    shrl %eax236; X64-NEXT:    imull %edx, %eax237; X64-NEXT:    addl %ecx, %eax238; X64-NEXT:    retq239;240; X86-LABEL: scalar_i32_signed_mem_mem:241; X86:       # %bb.0:242; X86-NEXT:    pushl %ebx243; X86-NEXT:    pushl %esi244; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax245; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx246; X86-NEXT:    movl (%ecx), %ecx247; X86-NEXT:    movl (%eax), %esi248; X86-NEXT:    movl %ecx, %edx249; X86-NEXT:    subl %esi, %edx250; X86-NEXT:    xorl %ebx, %ebx251; X86-NEXT:    movl %ecx, %eax252; X86-NEXT:    subl %esi, %eax253; X86-NEXT:    setle %bl254; X86-NEXT:    leal -1(%ebx,%ebx), %esi255; X86-NEXT:    jg .LBB4_2256; X86-NEXT:  # %bb.1:257; X86-NEXT:    negl %edx258; X86-NEXT:    movl %edx, %eax259; X86-NEXT:  .LBB4_2:260; X86-NEXT:    shrl %eax261; X86-NEXT:    imull %esi, %eax262; X86-NEXT:    addl %ecx, %eax263; X86-NEXT:    popl %esi264; X86-NEXT:    popl %ebx265; X86-NEXT:    retl266  %a1 = load i32, ptr %a1_addr267  %a2 = load i32, ptr %a2_addr268  %t3 = icmp sgt i32 %a1, %a2 ; signed269  %t4 = select i1 %t3, i32 -1, i32 1270  %t5 = select i1 %t3, i32 %a2, i32 %a1271  %t6 = select i1 %t3, i32 %a1, i32 %a2272  %t7 = sub i32 %t6, %t5273  %t8 = lshr i32 %t7, 1274  %t9 = mul nsw i32 %t8, %t4 ; signed275  %a10 = add nsw i32 %t9, %a1 ; signed276  ret i32 %a10277}278 279; ---------------------------------------------------------------------------- ;280; 64-bit width281; ---------------------------------------------------------------------------- ;282 283; Values come from regs284 285define i64 @scalar_i64_signed_reg_reg(i64 %a1, i64 %a2) nounwind {286; X64-LABEL: scalar_i64_signed_reg_reg:287; X64:       # %bb.0:288; X64-NEXT:    xorl %ecx, %ecx289; X64-NEXT:    movq %rdi, %rax290; X64-NEXT:    subq %rsi, %rax291; X64-NEXT:    setle %cl292; X64-NEXT:    leaq -1(%rcx,%rcx), %rcx293; X64-NEXT:    subq %rdi, %rsi294; X64-NEXT:    cmovgeq %rsi, %rax295; X64-NEXT:    shrq %rax296; X64-NEXT:    imulq %rcx, %rax297; X64-NEXT:    addq %rdi, %rax298; X64-NEXT:    retq299;300; X86-LABEL: scalar_i64_signed_reg_reg:301; X86:       # %bb.0:302; X86-NEXT:    pushl %ebp303; X86-NEXT:    pushl %ebx304; X86-NEXT:    pushl %edi305; X86-NEXT:    pushl %esi306; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx307; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp308; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi309; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx310; X86-NEXT:    movl %esi, %eax311; X86-NEXT:    subl %edx, %eax312; X86-NEXT:    movl %ecx, %edi313; X86-NEXT:    sbbl %ebp, %edi314; X86-NEXT:    subl %esi, %edx315; X86-NEXT:    sbbl %ecx, %ebp316; X86-NEXT:    setl %bl317; X86-NEXT:    movzbl %bl, %ebx318; X86-NEXT:    jl .LBB5_2319; X86-NEXT:  # %bb.1:320; X86-NEXT:    movl %edx, %eax321; X86-NEXT:    movl %ebp, %edi322; X86-NEXT:  .LBB5_2:323; X86-NEXT:    negl %ebx324; X86-NEXT:    shrdl $1, %edi, %eax325; X86-NEXT:    shrl %edi326; X86-NEXT:    movl %eax, %ebp327; X86-NEXT:    imull %ebx, %ebp328; X86-NEXT:    orl $1, %ebx329; X86-NEXT:    mull %ebx330; X86-NEXT:    addl %ebp, %edx331; X86-NEXT:    imull %edi, %ebx332; X86-NEXT:    addl %ebx, %edx333; X86-NEXT:    addl %esi, %eax334; X86-NEXT:    adcl %ecx, %edx335; X86-NEXT:    popl %esi336; X86-NEXT:    popl %edi337; X86-NEXT:    popl %ebx338; X86-NEXT:    popl %ebp339; X86-NEXT:    retl340  %t3 = icmp sgt i64 %a1, %a2 ; signed341  %t4 = select i1 %t3, i64 -1, i64 1342  %t5 = select i1 %t3, i64 %a2, i64 %a1343  %t6 = select i1 %t3, i64 %a1, i64 %a2344  %t7 = sub i64 %t6, %t5345  %t8 = lshr i64 %t7, 1346  %t9 = mul nsw i64 %t8, %t4 ; signed347  %a10 = add nsw i64 %t9, %a1 ; signed348  ret i64 %a10349}350 351define i64 @scalar_i64_unsigned_reg_reg(i64 %a1, i64 %a2) nounwind {352; X64-LABEL: scalar_i64_unsigned_reg_reg:353; X64:       # %bb.0:354; X64-NEXT:    xorl %ecx, %ecx355; X64-NEXT:    cmpq %rdi, %rsi356; X64-NEXT:    sbbq %rcx, %rcx357; X64-NEXT:    movq %rdi, %rax358; X64-NEXT:    subq %rsi, %rax359; X64-NEXT:    subq %rdi, %rsi360; X64-NEXT:    cmovaeq %rsi, %rax361; X64-NEXT:    orq $1, %rcx362; X64-NEXT:    shrq %rax363; X64-NEXT:    imulq %rcx, %rax364; X64-NEXT:    addq %rdi, %rax365; X64-NEXT:    retq366;367; X86-LABEL: scalar_i64_unsigned_reg_reg:368; X86:       # %bb.0:369; X86-NEXT:    pushl %ebp370; X86-NEXT:    pushl %ebx371; X86-NEXT:    pushl %edi372; X86-NEXT:    pushl %esi373; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax374; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx375; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp376; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi377; X86-NEXT:    xorl %edx, %edx378; X86-NEXT:    cmpl %eax, %ebp379; X86-NEXT:    sbbl %ecx, %esi380; X86-NEXT:    movl $0, %ebx381; X86-NEXT:    sbbl %ebx, %ebx382; X86-NEXT:    movl %ebx, %edi383; X86-NEXT:    orl $1, %edi384; X86-NEXT:    movl %eax, %esi385; X86-NEXT:    subl %ebp, %esi386; X86-NEXT:    movl %ecx, %eax387; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %eax388; X86-NEXT:    sbbl %edx, %edx389; X86-NEXT:    xorl %edx, %eax390; X86-NEXT:    xorl %edx, %esi391; X86-NEXT:    subl %edx, %esi392; X86-NEXT:    sbbl %edx, %eax393; X86-NEXT:    movl %eax, %ebp394; X86-NEXT:    shldl $31, %esi, %eax395; X86-NEXT:    imull %eax, %ebx396; X86-NEXT:    mull %edi397; X86-NEXT:    addl %ebx, %edx398; X86-NEXT:    shrl %ebp399; X86-NEXT:    imull %edi, %ebp400; X86-NEXT:    addl %ebp, %edx401; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax402; X86-NEXT:    adcl %ecx, %edx403; X86-NEXT:    popl %esi404; X86-NEXT:    popl %edi405; X86-NEXT:    popl %ebx406; X86-NEXT:    popl %ebp407; X86-NEXT:    retl408  %t3 = icmp ugt i64 %a1, %a2409  %t4 = select i1 %t3, i64 -1, i64 1410  %t5 = select i1 %t3, i64 %a2, i64 %a1411  %t6 = select i1 %t3, i64 %a1, i64 %a2412  %t7 = sub i64 %t6, %t5413  %t8 = lshr i64 %t7, 1414  %t9 = mul i64 %t8, %t4415  %a10 = add i64 %t9, %a1416  ret i64 %a10417}418 419; Values are loaded. Only check signed case.420 421define i64 @scalar_i64_signed_mem_reg(ptr %a1_addr, i64 %a2) nounwind {422; X64-LABEL: scalar_i64_signed_mem_reg:423; X64:       # %bb.0:424; X64-NEXT:    movq (%rdi), %rcx425; X64-NEXT:    xorl %edx, %edx426; X64-NEXT:    movq %rcx, %rax427; X64-NEXT:    subq %rsi, %rax428; X64-NEXT:    setle %dl429; X64-NEXT:    leaq -1(%rdx,%rdx), %rdx430; X64-NEXT:    subq %rcx, %rsi431; X64-NEXT:    cmovgeq %rsi, %rax432; X64-NEXT:    shrq %rax433; X64-NEXT:    imulq %rdx, %rax434; X64-NEXT:    addq %rcx, %rax435; X64-NEXT:    retq436;437; X86-LABEL: scalar_i64_signed_mem_reg:438; X86:       # %bb.0:439; X86-NEXT:    pushl %ebp440; X86-NEXT:    pushl %ebx441; X86-NEXT:    pushl %edi442; X86-NEXT:    pushl %esi443; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx444; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp445; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax446; X86-NEXT:    movl (%eax), %esi447; X86-NEXT:    movl 4(%eax), %ecx448; X86-NEXT:    movl %esi, %eax449; X86-NEXT:    subl %edx, %eax450; X86-NEXT:    movl %ecx, %edi451; X86-NEXT:    sbbl %ebp, %edi452; X86-NEXT:    subl %esi, %edx453; X86-NEXT:    sbbl %ecx, %ebp454; X86-NEXT:    setl %bl455; X86-NEXT:    movzbl %bl, %ebx456; X86-NEXT:    jl .LBB7_2457; X86-NEXT:  # %bb.1:458; X86-NEXT:    movl %edx, %eax459; X86-NEXT:    movl %ebp, %edi460; X86-NEXT:  .LBB7_2:461; X86-NEXT:    negl %ebx462; X86-NEXT:    shrdl $1, %edi, %eax463; X86-NEXT:    shrl %edi464; X86-NEXT:    movl %eax, %ebp465; X86-NEXT:    imull %ebx, %ebp466; X86-NEXT:    orl $1, %ebx467; X86-NEXT:    mull %ebx468; X86-NEXT:    addl %ebp, %edx469; X86-NEXT:    imull %edi, %ebx470; X86-NEXT:    addl %ebx, %edx471; X86-NEXT:    addl %esi, %eax472; X86-NEXT:    adcl %ecx, %edx473; X86-NEXT:    popl %esi474; X86-NEXT:    popl %edi475; X86-NEXT:    popl %ebx476; X86-NEXT:    popl %ebp477; X86-NEXT:    retl478  %a1 = load i64, ptr %a1_addr479  %t3 = icmp sgt i64 %a1, %a2 ; signed480  %t4 = select i1 %t3, i64 -1, i64 1481  %t5 = select i1 %t3, i64 %a2, i64 %a1482  %t6 = select i1 %t3, i64 %a1, i64 %a2483  %t7 = sub i64 %t6, %t5484  %t8 = lshr i64 %t7, 1485  %t9 = mul nsw i64 %t8, %t4 ; signed486  %a10 = add nsw i64 %t9, %a1 ; signed487  ret i64 %a10488}489 490define i64 @scalar_i64_signed_reg_mem(i64 %a1, ptr %a2_addr) nounwind {491; X64-LABEL: scalar_i64_signed_reg_mem:492; X64:       # %bb.0:493; X64-NEXT:    movq (%rsi), %rax494; X64-NEXT:    xorl %ecx, %ecx495; X64-NEXT:    movq %rdi, %rdx496; X64-NEXT:    subq %rax, %rdx497; X64-NEXT:    setle %cl498; X64-NEXT:    leaq -1(%rcx,%rcx), %rcx499; X64-NEXT:    subq %rdi, %rax500; X64-NEXT:    cmovlq %rdx, %rax501; X64-NEXT:    shrq %rax502; X64-NEXT:    imulq %rcx, %rax503; X64-NEXT:    addq %rdi, %rax504; X64-NEXT:    retq505;506; X86-LABEL: scalar_i64_signed_reg_mem:507; X86:       # %bb.0:508; X86-NEXT:    pushl %ebp509; X86-NEXT:    pushl %ebx510; X86-NEXT:    pushl %edi511; X86-NEXT:    pushl %esi512; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi513; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx514; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax515; X86-NEXT:    movl (%eax), %edx516; X86-NEXT:    movl 4(%eax), %ebp517; X86-NEXT:    movl %esi, %eax518; X86-NEXT:    subl %edx, %eax519; X86-NEXT:    movl %ecx, %edi520; X86-NEXT:    sbbl %ebp, %edi521; X86-NEXT:    subl %esi, %edx522; X86-NEXT:    sbbl %ecx, %ebp523; X86-NEXT:    setl %bl524; X86-NEXT:    movzbl %bl, %ebx525; X86-NEXT:    jl .LBB8_2526; X86-NEXT:  # %bb.1:527; X86-NEXT:    movl %edx, %eax528; X86-NEXT:    movl %ebp, %edi529; X86-NEXT:  .LBB8_2:530; X86-NEXT:    negl %ebx531; X86-NEXT:    shrdl $1, %edi, %eax532; X86-NEXT:    shrl %edi533; X86-NEXT:    movl %eax, %ebp534; X86-NEXT:    imull %ebx, %ebp535; X86-NEXT:    orl $1, %ebx536; X86-NEXT:    mull %ebx537; X86-NEXT:    addl %ebp, %edx538; X86-NEXT:    imull %edi, %ebx539; X86-NEXT:    addl %ebx, %edx540; X86-NEXT:    addl %esi, %eax541; X86-NEXT:    adcl %ecx, %edx542; X86-NEXT:    popl %esi543; X86-NEXT:    popl %edi544; X86-NEXT:    popl %ebx545; X86-NEXT:    popl %ebp546; X86-NEXT:    retl547  %a2 = load i64, ptr %a2_addr548  %t3 = icmp sgt i64 %a1, %a2 ; signed549  %t4 = select i1 %t3, i64 -1, i64 1550  %t5 = select i1 %t3, i64 %a2, i64 %a1551  %t6 = select i1 %t3, i64 %a1, i64 %a2552  %t7 = sub i64 %t6, %t5553  %t8 = lshr i64 %t7, 1554  %t9 = mul nsw i64 %t8, %t4 ; signed555  %a10 = add nsw i64 %t9, %a1 ; signed556  ret i64 %a10557}558 559define i64 @scalar_i64_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {560; X64-LABEL: scalar_i64_signed_mem_mem:561; X64:       # %bb.0:562; X64-NEXT:    movq (%rdi), %rcx563; X64-NEXT:    movq (%rsi), %rax564; X64-NEXT:    xorl %edx, %edx565; X64-NEXT:    movq %rcx, %rsi566; X64-NEXT:    subq %rax, %rsi567; X64-NEXT:    setle %dl568; X64-NEXT:    leaq -1(%rdx,%rdx), %rdx569; X64-NEXT:    subq %rcx, %rax570; X64-NEXT:    cmovlq %rsi, %rax571; X64-NEXT:    shrq %rax572; X64-NEXT:    imulq %rdx, %rax573; X64-NEXT:    addq %rcx, %rax574; X64-NEXT:    retq575;576; X86-LABEL: scalar_i64_signed_mem_mem:577; X86:       # %bb.0:578; X86-NEXT:    pushl %ebp579; X86-NEXT:    pushl %ebx580; X86-NEXT:    pushl %edi581; X86-NEXT:    pushl %esi582; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax583; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx584; X86-NEXT:    movl (%ecx), %esi585; X86-NEXT:    movl 4(%ecx), %ecx586; X86-NEXT:    movl (%eax), %edx587; X86-NEXT:    movl 4(%eax), %ebp588; X86-NEXT:    movl %esi, %eax589; X86-NEXT:    subl %edx, %eax590; X86-NEXT:    movl %ecx, %edi591; X86-NEXT:    sbbl %ebp, %edi592; X86-NEXT:    subl %esi, %edx593; X86-NEXT:    sbbl %ecx, %ebp594; X86-NEXT:    setl %bl595; X86-NEXT:    movzbl %bl, %ebx596; X86-NEXT:    jl .LBB9_2597; X86-NEXT:  # %bb.1:598; X86-NEXT:    movl %edx, %eax599; X86-NEXT:    movl %ebp, %edi600; X86-NEXT:  .LBB9_2:601; X86-NEXT:    negl %ebx602; X86-NEXT:    shrdl $1, %edi, %eax603; X86-NEXT:    shrl %edi604; X86-NEXT:    movl %eax, %ebp605; X86-NEXT:    imull %ebx, %ebp606; X86-NEXT:    orl $1, %ebx607; X86-NEXT:    mull %ebx608; X86-NEXT:    addl %ebp, %edx609; X86-NEXT:    imull %edi, %ebx610; X86-NEXT:    addl %ebx, %edx611; X86-NEXT:    addl %esi, %eax612; X86-NEXT:    adcl %ecx, %edx613; X86-NEXT:    popl %esi614; X86-NEXT:    popl %edi615; X86-NEXT:    popl %ebx616; X86-NEXT:    popl %ebp617; X86-NEXT:    retl618  %a1 = load i64, ptr %a1_addr619  %a2 = load i64, ptr %a2_addr620  %t3 = icmp sgt i64 %a1, %a2 ; signed621  %t4 = select i1 %t3, i64 -1, i64 1622  %t5 = select i1 %t3, i64 %a2, i64 %a1623  %t6 = select i1 %t3, i64 %a1, i64 %a2624  %t7 = sub i64 %t6, %t5625  %t8 = lshr i64 %t7, 1626  %t9 = mul nsw i64 %t8, %t4 ; signed627  %a10 = add nsw i64 %t9, %a1 ; signed628  ret i64 %a10629}630 631; ---------------------------------------------------------------------------- ;632; 16-bit width633; ---------------------------------------------------------------------------- ;634 635; Values come from regs636 637define i16 @scalar_i16_signed_reg_reg(i16 %a1, i16 %a2) nounwind {638; X64-LABEL: scalar_i16_signed_reg_reg:639; X64:       # %bb.0:640; X64-NEXT:    xorl %eax, %eax641; X64-NEXT:    cmpw %si, %di642; X64-NEXT:    setle %al643; X64-NEXT:    leal -1(%rax,%rax), %ecx644; X64-NEXT:    movl %edi, %eax645; X64-NEXT:    subl %esi, %eax646; X64-NEXT:    movswl %di, %edx647; X64-NEXT:    movswl %si, %esi648; X64-NEXT:    subl %edx, %esi649; X64-NEXT:    cmovll %eax, %esi650; X64-NEXT:    movzwl %si, %eax651; X64-NEXT:    shrl %eax652; X64-NEXT:    imull %ecx, %eax653; X64-NEXT:    addl %edi, %eax654; X64-NEXT:    # kill: def $ax killed $ax killed $eax655; X64-NEXT:    retq656;657; X86-LABEL: scalar_i16_signed_reg_reg:658; X86:       # %bb.0:659; X86-NEXT:    pushl %ebx660; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx661; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax662; X86-NEXT:    xorl %ebx, %ebx663; X86-NEXT:    movl %eax, %ecx664; X86-NEXT:    subw %dx, %ax665; X86-NEXT:    setle %bl666; X86-NEXT:    leal -1(%ebx,%ebx), %edx667; X86-NEXT:    jg .LBB10_2668; X86-NEXT:  # %bb.1:669; X86-NEXT:    negl %eax670; X86-NEXT:  .LBB10_2:671; X86-NEXT:    movzwl %ax, %eax672; X86-NEXT:    shrl %eax673; X86-NEXT:    imull %edx, %eax674; X86-NEXT:    addl %ecx, %eax675; X86-NEXT:    # kill: def $ax killed $ax killed $eax676; X86-NEXT:    popl %ebx677; X86-NEXT:    retl678  %t3 = icmp sgt i16 %a1, %a2 ; signed679  %t4 = select i1 %t3, i16 -1, i16 1680  %t5 = select i1 %t3, i16 %a2, i16 %a1681  %t6 = select i1 %t3, i16 %a1, i16 %a2682  %t7 = sub i16 %t6, %t5683  %t8 = lshr i16 %t7, 1684  %t9 = mul nsw i16 %t8, %t4 ; signed685  %a10 = add nsw i16 %t9, %a1 ; signed686  ret i16 %a10687}688 689define i16 @scalar_i16_unsigned_reg_reg(i16 %a1, i16 %a2) nounwind {690; X64-LABEL: scalar_i16_unsigned_reg_reg:691; X64:       # %bb.0:692; X64-NEXT:    xorl %eax, %eax693; X64-NEXT:    cmpw %di, %si694; X64-NEXT:    setae %al695; X64-NEXT:    leal -1(%rax,%rax), %ecx696; X64-NEXT:    movl %edi, %eax697; X64-NEXT:    subl %esi, %eax698; X64-NEXT:    movzwl %di, %edx699; X64-NEXT:    movzwl %si, %esi700; X64-NEXT:    subl %edx, %esi701; X64-NEXT:    cmovbl %eax, %esi702; X64-NEXT:    movzwl %si, %eax703; X64-NEXT:    shrl %eax704; X64-NEXT:    imull %ecx, %eax705; X64-NEXT:    addl %edi, %eax706; X64-NEXT:    # kill: def $ax killed $ax killed $eax707; X64-NEXT:    retq708;709; X86-LABEL: scalar_i16_unsigned_reg_reg:710; X86:       # %bb.0:711; X86-NEXT:    pushl %ebx712; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx713; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax714; X86-NEXT:    xorl %ebx, %ebx715; X86-NEXT:    movl %eax, %ecx716; X86-NEXT:    subw %dx, %ax717; X86-NEXT:    setbe %bl718; X86-NEXT:    leal -1(%ebx,%ebx), %edx719; X86-NEXT:    ja .LBB11_2720; X86-NEXT:  # %bb.1:721; X86-NEXT:    negl %eax722; X86-NEXT:  .LBB11_2:723; X86-NEXT:    movzwl %ax, %eax724; X86-NEXT:    shrl %eax725; X86-NEXT:    imull %edx, %eax726; X86-NEXT:    addl %ecx, %eax727; X86-NEXT:    # kill: def $ax killed $ax killed $eax728; X86-NEXT:    popl %ebx729; X86-NEXT:    retl730  %t3 = icmp ugt i16 %a1, %a2731  %t4 = select i1 %t3, i16 -1, i16 1732  %t5 = select i1 %t3, i16 %a2, i16 %a1733  %t6 = select i1 %t3, i16 %a1, i16 %a2734  %t7 = sub i16 %t6, %t5735  %t8 = lshr i16 %t7, 1736  %t9 = mul i16 %t8, %t4737  %a10 = add i16 %t9, %a1738  ret i16 %a10739}740 741; Values are loaded. Only check signed case.742 743define i16 @scalar_i16_signed_mem_reg(ptr %a1_addr, i16 %a2) nounwind {744; X64-LABEL: scalar_i16_signed_mem_reg:745; X64:       # %bb.0:746; X64-NEXT:    movswl (%rdi), %ecx747; X64-NEXT:    xorl %eax, %eax748; X64-NEXT:    cmpw %si, %cx749; X64-NEXT:    setle %al750; X64-NEXT:    leal -1(%rax,%rax), %edx751; X64-NEXT:    movl %ecx, %eax752; X64-NEXT:    subl %esi, %eax753; X64-NEXT:    movswl %si, %esi754; X64-NEXT:    subl %ecx, %esi755; X64-NEXT:    cmovll %eax, %esi756; X64-NEXT:    movzwl %si, %eax757; X64-NEXT:    shrl %eax758; X64-NEXT:    imull %edx, %eax759; X64-NEXT:    addl %ecx, %eax760; X64-NEXT:    # kill: def $ax killed $ax killed $eax761; X64-NEXT:    retq762;763; X86-LABEL: scalar_i16_signed_mem_reg:764; X86:       # %bb.0:765; X86-NEXT:    pushl %ebx766; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx767; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax768; X86-NEXT:    movzwl (%eax), %eax769; X86-NEXT:    xorl %ebx, %ebx770; X86-NEXT:    movl %eax, %ecx771; X86-NEXT:    subw %dx, %ax772; X86-NEXT:    setle %bl773; X86-NEXT:    leal -1(%ebx,%ebx), %edx774; X86-NEXT:    jg .LBB12_2775; X86-NEXT:  # %bb.1:776; X86-NEXT:    negl %eax777; X86-NEXT:  .LBB12_2:778; X86-NEXT:    movzwl %ax, %eax779; X86-NEXT:    shrl %eax780; X86-NEXT:    imull %edx, %eax781; X86-NEXT:    addl %ecx, %eax782; X86-NEXT:    # kill: def $ax killed $ax killed $eax783; X86-NEXT:    popl %ebx784; X86-NEXT:    retl785  %a1 = load i16, ptr %a1_addr786  %t3 = icmp sgt i16 %a1, %a2 ; signed787  %t4 = select i1 %t3, i16 -1, i16 1788  %t5 = select i1 %t3, i16 %a2, i16 %a1789  %t6 = select i1 %t3, i16 %a1, i16 %a2790  %t7 = sub i16 %t6, %t5791  %t8 = lshr i16 %t7, 1792  %t9 = mul nsw i16 %t8, %t4 ; signed793  %a10 = add nsw i16 %t9, %a1 ; signed794  ret i16 %a10795}796 797define i16 @scalar_i16_signed_reg_mem(i16 %a1, ptr %a2_addr) nounwind {798; X64-LABEL: scalar_i16_signed_reg_mem:799; X64:       # %bb.0:800; X64-NEXT:    movswl (%rsi), %eax801; X64-NEXT:    xorl %ecx, %ecx802; X64-NEXT:    cmpw %ax, %di803; X64-NEXT:    setle %cl804; X64-NEXT:    leal -1(%rcx,%rcx), %ecx805; X64-NEXT:    movl %edi, %edx806; X64-NEXT:    subl %eax, %edx807; X64-NEXT:    movswl %di, %esi808; X64-NEXT:    subl %esi, %eax809; X64-NEXT:    cmovll %edx, %eax810; X64-NEXT:    movzwl %ax, %eax811; X64-NEXT:    shrl %eax812; X64-NEXT:    imull %ecx, %eax813; X64-NEXT:    addl %edi, %eax814; X64-NEXT:    # kill: def $ax killed $ax killed $eax815; X64-NEXT:    retq816;817; X86-LABEL: scalar_i16_signed_reg_mem:818; X86:       # %bb.0:819; X86-NEXT:    pushl %ebx820; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax821; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx822; X86-NEXT:    movzwl (%ecx), %edx823; X86-NEXT:    xorl %ebx, %ebx824; X86-NEXT:    movl %eax, %ecx825; X86-NEXT:    subw %dx, %ax826; X86-NEXT:    setle %bl827; X86-NEXT:    leal -1(%ebx,%ebx), %edx828; X86-NEXT:    jg .LBB13_2829; X86-NEXT:  # %bb.1:830; X86-NEXT:    negl %eax831; X86-NEXT:  .LBB13_2:832; X86-NEXT:    movzwl %ax, %eax833; X86-NEXT:    shrl %eax834; X86-NEXT:    imull %edx, %eax835; X86-NEXT:    addl %ecx, %eax836; X86-NEXT:    # kill: def $ax killed $ax killed $eax837; X86-NEXT:    popl %ebx838; X86-NEXT:    retl839  %a2 = load i16, ptr %a2_addr840  %t3 = icmp sgt i16 %a1, %a2 ; signed841  %t4 = select i1 %t3, i16 -1, i16 1842  %t5 = select i1 %t3, i16 %a2, i16 %a1843  %t6 = select i1 %t3, i16 %a1, i16 %a2844  %t7 = sub i16 %t6, %t5845  %t8 = lshr i16 %t7, 1846  %t9 = mul nsw i16 %t8, %t4 ; signed847  %a10 = add nsw i16 %t9, %a1 ; signed848  ret i16 %a10849}850 851define i16 @scalar_i16_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {852; X64-LABEL: scalar_i16_signed_mem_mem:853; X64:       # %bb.0:854; X64-NEXT:    movswl (%rdi), %ecx855; X64-NEXT:    movswl (%rsi), %eax856; X64-NEXT:    xorl %edx, %edx857; X64-NEXT:    cmpw %ax, %cx858; X64-NEXT:    setle %dl859; X64-NEXT:    leal -1(%rdx,%rdx), %edx860; X64-NEXT:    movl %ecx, %esi861; X64-NEXT:    subl %eax, %esi862; X64-NEXT:    subl %ecx, %eax863; X64-NEXT:    cmovll %esi, %eax864; X64-NEXT:    movzwl %ax, %eax865; X64-NEXT:    shrl %eax866; X64-NEXT:    imull %edx, %eax867; X64-NEXT:    addl %ecx, %eax868; X64-NEXT:    # kill: def $ax killed $ax killed $eax869; X64-NEXT:    retq870;871; X86-LABEL: scalar_i16_signed_mem_mem:872; X86:       # %bb.0:873; X86-NEXT:    pushl %ebx874; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx875; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax876; X86-NEXT:    movzwl (%eax), %eax877; X86-NEXT:    movzwl (%ecx), %edx878; X86-NEXT:    xorl %ebx, %ebx879; X86-NEXT:    movl %eax, %ecx880; X86-NEXT:    subw %dx, %ax881; X86-NEXT:    setle %bl882; X86-NEXT:    leal -1(%ebx,%ebx), %edx883; X86-NEXT:    jg .LBB14_2884; X86-NEXT:  # %bb.1:885; X86-NEXT:    negl %eax886; X86-NEXT:  .LBB14_2:887; X86-NEXT:    movzwl %ax, %eax888; X86-NEXT:    shrl %eax889; X86-NEXT:    imull %edx, %eax890; X86-NEXT:    addl %ecx, %eax891; X86-NEXT:    # kill: def $ax killed $ax killed $eax892; X86-NEXT:    popl %ebx893; X86-NEXT:    retl894  %a1 = load i16, ptr %a1_addr895  %a2 = load i16, ptr %a2_addr896  %t3 = icmp sgt i16 %a1, %a2 ; signed897  %t4 = select i1 %t3, i16 -1, i16 1898  %t5 = select i1 %t3, i16 %a2, i16 %a1899  %t6 = select i1 %t3, i16 %a1, i16 %a2900  %t7 = sub i16 %t6, %t5901  %t8 = lshr i16 %t7, 1902  %t9 = mul nsw i16 %t8, %t4 ; signed903  %a10 = add nsw i16 %t9, %a1 ; signed904  ret i16 %a10905}906 907; ---------------------------------------------------------------------------- ;908; 8-bit width909; ---------------------------------------------------------------------------- ;910 911; Values come from regs912 913define i8 @scalar_i8_signed_reg_reg(i8 %a1, i8 %a2) nounwind {914; X64-LABEL: scalar_i8_signed_reg_reg:915; X64:       # %bb.0:916; X64-NEXT:    cmpb %sil, %dil917; X64-NEXT:    setg %cl918; X64-NEXT:    negb %cl919; X64-NEXT:    orb $1, %cl920; X64-NEXT:    movsbl %dil, %edx921; X64-NEXT:    subl %esi, %edi922; X64-NEXT:    movsbl %sil, %eax923; X64-NEXT:    subl %edx, %eax924; X64-NEXT:    cmovll %edi, %eax925; X64-NEXT:    shrb %al926; X64-NEXT:    # kill: def $al killed $al killed $eax927; X64-NEXT:    mulb %cl928; X64-NEXT:    addb %dl, %al929; X64-NEXT:    retq930;931; X86-LABEL: scalar_i8_signed_reg_reg:932; X86:       # %bb.0:933; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx934; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah935; X86-NEXT:    movb %cl, %al936; X86-NEXT:    subb %ah, %al937; X86-NEXT:    setg %dl938; X86-NEXT:    jg .LBB15_2939; X86-NEXT:  # %bb.1:940; X86-NEXT:    subb %cl, %ah941; X86-NEXT:    movb %ah, %al942; X86-NEXT:  .LBB15_2:943; X86-NEXT:    negb %dl944; X86-NEXT:    orb $1, %dl945; X86-NEXT:    shrb %al946; X86-NEXT:    mulb %dl947; X86-NEXT:    addb %cl, %al948; X86-NEXT:    retl949  %t3 = icmp sgt i8 %a1, %a2 ; signed950  %t4 = select i1 %t3, i8 -1, i8 1951  %t5 = select i1 %t3, i8 %a2, i8 %a1952  %t6 = select i1 %t3, i8 %a1, i8 %a2953  %t7 = sub i8 %t6, %t5954  %t8 = lshr i8 %t7, 1955  %t9 = mul nsw i8 %t8, %t4 ; signed956  %a10 = add nsw i8 %t9, %a1 ; signed957  ret i8 %a10958}959 960define i8 @scalar_i8_unsigned_reg_reg(i8 %a1, i8 %a2) nounwind {961; X64-LABEL: scalar_i8_unsigned_reg_reg:962; X64:       # %bb.0:963; X64-NEXT:    xorl %ecx, %ecx964; X64-NEXT:    cmpb %dil, %sil965; X64-NEXT:    sbbl %ecx, %ecx966; X64-NEXT:    orb $1, %cl967; X64-NEXT:    movzbl %dil, %edx968; X64-NEXT:    subl %esi, %edi969; X64-NEXT:    movzbl %sil, %eax970; X64-NEXT:    subl %edx, %eax971; X64-NEXT:    cmovbl %edi, %eax972; X64-NEXT:    shrb %al973; X64-NEXT:    # kill: def $al killed $al killed $eax974; X64-NEXT:    mulb %cl975; X64-NEXT:    addb %dl, %al976; X64-NEXT:    retq977;978; X86-LABEL: scalar_i8_unsigned_reg_reg:979; X86:       # %bb.0:980; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx981; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah982; X86-NEXT:    movb %cl, %al983; X86-NEXT:    subb %ah, %al984; X86-NEXT:    seta %dl985; X86-NEXT:    ja .LBB16_2986; X86-NEXT:  # %bb.1:987; X86-NEXT:    subb %cl, %ah988; X86-NEXT:    movb %ah, %al989; X86-NEXT:  .LBB16_2:990; X86-NEXT:    negb %dl991; X86-NEXT:    orb $1, %dl992; X86-NEXT:    shrb %al993; X86-NEXT:    mulb %dl994; X86-NEXT:    addb %cl, %al995; X86-NEXT:    retl996  %t3 = icmp ugt i8 %a1, %a2997  %t4 = select i1 %t3, i8 -1, i8 1998  %t5 = select i1 %t3, i8 %a2, i8 %a1999  %t6 = select i1 %t3, i8 %a1, i8 %a21000  %t7 = sub i8 %t6, %t51001  %t8 = lshr i8 %t7, 11002  %t9 = mul i8 %t8, %t41003  %a10 = add i8 %t9, %a11004  ret i8 %a101005}1006 1007; Values are loaded. Only check signed case.1008 1009define i8 @scalar_i8_signed_mem_reg(ptr %a1_addr, i8 %a2) nounwind {1010; X64-LABEL: scalar_i8_signed_mem_reg:1011; X64:       # %bb.0:1012; X64-NEXT:    movsbl (%rdi), %ecx1013; X64-NEXT:    cmpb %sil, %cl1014; X64-NEXT:    setg %dl1015; X64-NEXT:    negb %dl1016; X64-NEXT:    orb $1, %dl1017; X64-NEXT:    movl %ecx, %edi1018; X64-NEXT:    subl %esi, %edi1019; X64-NEXT:    movsbl %sil, %eax1020; X64-NEXT:    subl %ecx, %eax1021; X64-NEXT:    cmovll %edi, %eax1022; X64-NEXT:    shrb %al1023; X64-NEXT:    # kill: def $al killed $al killed $eax1024; X64-NEXT:    mulb %dl1025; X64-NEXT:    addb %cl, %al1026; X64-NEXT:    retq1027;1028; X86-LABEL: scalar_i8_signed_mem_reg:1029; X86:       # %bb.0:1030; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah1031; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1032; X86-NEXT:    movzbl (%ecx), %ecx1033; X86-NEXT:    movb %cl, %al1034; X86-NEXT:    subb %ah, %al1035; X86-NEXT:    setg %dl1036; X86-NEXT:    jg .LBB17_21037; X86-NEXT:  # %bb.1:1038; X86-NEXT:    subb %cl, %ah1039; X86-NEXT:    movb %ah, %al1040; X86-NEXT:  .LBB17_2:1041; X86-NEXT:    negb %dl1042; X86-NEXT:    orb $1, %dl1043; X86-NEXT:    shrb %al1044; X86-NEXT:    mulb %dl1045; X86-NEXT:    addb %cl, %al1046; X86-NEXT:    retl1047  %a1 = load i8, ptr %a1_addr1048  %t3 = icmp sgt i8 %a1, %a2 ; signed1049  %t4 = select i1 %t3, i8 -1, i8 11050  %t5 = select i1 %t3, i8 %a2, i8 %a11051  %t6 = select i1 %t3, i8 %a1, i8 %a21052  %t7 = sub i8 %t6, %t51053  %t8 = lshr i8 %t7, 11054  %t9 = mul nsw i8 %t8, %t4 ; signed1055  %a10 = add nsw i8 %t9, %a1 ; signed1056  ret i8 %a101057}1058 1059define i8 @scalar_i8_signed_reg_mem(i8 %a1, ptr %a2_addr) nounwind {1060; X64-LABEL: scalar_i8_signed_reg_mem:1061; X64:       # %bb.0:1062; X64-NEXT:    movsbl (%rsi), %eax1063; X64-NEXT:    cmpb %al, %dil1064; X64-NEXT:    setg %cl1065; X64-NEXT:    negb %cl1066; X64-NEXT:    orb $1, %cl1067; X64-NEXT:    movsbl %dil, %edx1068; X64-NEXT:    subl %eax, %edi1069; X64-NEXT:    subl %edx, %eax1070; X64-NEXT:    cmovll %edi, %eax1071; X64-NEXT:    shrb %al1072; X64-NEXT:    # kill: def $al killed $al killed $eax1073; X64-NEXT:    mulb %cl1074; X64-NEXT:    addb %dl, %al1075; X64-NEXT:    retq1076;1077; X86-LABEL: scalar_i8_signed_reg_mem:1078; X86:       # %bb.0:1079; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1080; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1081; X86-NEXT:    movb (%eax), %ah1082; X86-NEXT:    movb %cl, %al1083; X86-NEXT:    subb %ah, %al1084; X86-NEXT:    setg %dl1085; X86-NEXT:    jg .LBB18_21086; X86-NEXT:  # %bb.1:1087; X86-NEXT:    subb %cl, %ah1088; X86-NEXT:    movb %ah, %al1089; X86-NEXT:  .LBB18_2:1090; X86-NEXT:    negb %dl1091; X86-NEXT:    orb $1, %dl1092; X86-NEXT:    shrb %al1093; X86-NEXT:    mulb %dl1094; X86-NEXT:    addb %cl, %al1095; X86-NEXT:    retl1096  %a2 = load i8, ptr %a2_addr1097  %t3 = icmp sgt i8 %a1, %a2 ; signed1098  %t4 = select i1 %t3, i8 -1, i8 11099  %t5 = select i1 %t3, i8 %a2, i8 %a11100  %t6 = select i1 %t3, i8 %a1, i8 %a21101  %t7 = sub i8 %t6, %t51102  %t8 = lshr i8 %t7, 11103  %t9 = mul nsw i8 %t8, %t4 ; signed1104  %a10 = add nsw i8 %t9, %a1 ; signed1105  ret i8 %a101106}1107 1108define i8 @scalar_i8_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind {1109; X64-LABEL: scalar_i8_signed_mem_mem:1110; X64:       # %bb.0:1111; X64-NEXT:    movsbl (%rdi), %ecx1112; X64-NEXT:    movsbl (%rsi), %eax1113; X64-NEXT:    cmpb %al, %cl1114; X64-NEXT:    setg %dl1115; X64-NEXT:    negb %dl1116; X64-NEXT:    orb $1, %dl1117; X64-NEXT:    movl %ecx, %esi1118; X64-NEXT:    subl %eax, %esi1119; X64-NEXT:    subl %ecx, %eax1120; X64-NEXT:    cmovll %esi, %eax1121; X64-NEXT:    shrb %al1122; X64-NEXT:    # kill: def $al killed $al killed $eax1123; X64-NEXT:    mulb %dl1124; X64-NEXT:    addb %cl, %al1125; X64-NEXT:    retq1126;1127; X86-LABEL: scalar_i8_signed_mem_mem:1128; X86:       # %bb.0:1129; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1130; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1131; X86-NEXT:    movzbl (%ecx), %ecx1132; X86-NEXT:    movb (%eax), %ah1133; X86-NEXT:    movb %cl, %al1134; X86-NEXT:    subb %ah, %al1135; X86-NEXT:    setg %dl1136; X86-NEXT:    jg .LBB19_21137; X86-NEXT:  # %bb.1:1138; X86-NEXT:    subb %cl, %ah1139; X86-NEXT:    movb %ah, %al1140; X86-NEXT:  .LBB19_2:1141; X86-NEXT:    negb %dl1142; X86-NEXT:    orb $1, %dl1143; X86-NEXT:    shrb %al1144; X86-NEXT:    mulb %dl1145; X86-NEXT:    addb %cl, %al1146; X86-NEXT:    retl1147  %a1 = load i8, ptr %a1_addr1148  %a2 = load i8, ptr %a2_addr1149  %t3 = icmp sgt i8 %a1, %a2 ; signed1150  %t4 = select i1 %t3, i8 -1, i8 11151  %t5 = select i1 %t3, i8 %a2, i8 %a11152  %t6 = select i1 %t3, i8 %a1, i8 %a21153  %t7 = sub i8 %t6, %t51154  %t8 = lshr i8 %t7, 11155  %t9 = mul nsw i8 %t8, %t4 ; signed1156  %a10 = add nsw i8 %t9, %a1 ; signed1157  ret i8 %a101158}1159