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