923 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X644 5;6; trunc(nabs(sub(zext(a),zext(b)))) -> nabds(a,b)7;8 9define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {10; X86-LABEL: abd_ext_i8:11; X86: # %bb.0:12; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax13; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx14; X86-NEXT: movl %ecx, %edx15; X86-NEXT: subl %eax, %edx16; X86-NEXT: subl %ecx, %eax17; X86-NEXT: cmovbl %edx, %eax18; X86-NEXT: negb %al19; X86-NEXT: # kill: def $al killed $al killed $eax20; X86-NEXT: retl21;22; X64-LABEL: abd_ext_i8:23; X64: # %bb.0:24; X64-NEXT: movzbl %sil, %eax25; X64-NEXT: movzbl %dil, %ecx26; X64-NEXT: movl %ecx, %edx27; X64-NEXT: subl %eax, %edx28; X64-NEXT: subl %ecx, %eax29; X64-NEXT: cmovbl %edx, %eax30; X64-NEXT: negb %al31; X64-NEXT: # kill: def $al killed $al killed $eax32; X64-NEXT: retq33 %aext = zext i8 %a to i6434 %bext = zext i8 %b to i6435 %sub = sub i64 %aext, %bext36 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)37 %nabs = sub i64 0, %abs38 %trunc = trunc i64 %nabs to i839 ret i8 %trunc40}41 42define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {43; X86-LABEL: abd_ext_i8_i16:44; X86: # %bb.0:45; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax46; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx47; X86-NEXT: movl %ecx, %edx48; X86-NEXT: subl %eax, %edx49; X86-NEXT: subl %ecx, %eax50; X86-NEXT: cmovbl %edx, %eax51; X86-NEXT: negb %al52; X86-NEXT: # kill: def $al killed $al killed $eax53; X86-NEXT: retl54;55; X64-LABEL: abd_ext_i8_i16:56; X64: # %bb.0:57; X64-NEXT: movzbl %dil, %ecx58; X64-NEXT: subl %esi, %edi59; X64-NEXT: movzwl %si, %eax60; X64-NEXT: subl %ecx, %eax61; X64-NEXT: cmovbl %edi, %eax62; X64-NEXT: negb %al63; X64-NEXT: # kill: def $al killed $al killed $eax64; X64-NEXT: retq65 %aext = zext i8 %a to i6466 %bext = zext i16 %b to i6467 %sub = sub i64 %aext, %bext68 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)69 %nabs = sub i64 0, %abs70 %trunc = trunc i64 %nabs to i871 ret i8 %trunc72}73 74define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {75; X86-LABEL: abd_ext_i8_undef:76; X86: # %bb.0:77; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax78; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx79; X86-NEXT: movl %ecx, %edx80; X86-NEXT: subl %eax, %edx81; X86-NEXT: subl %ecx, %eax82; X86-NEXT: cmovbl %edx, %eax83; X86-NEXT: negb %al84; X86-NEXT: # kill: def $al killed $al killed $eax85; X86-NEXT: retl86;87; X64-LABEL: abd_ext_i8_undef:88; X64: # %bb.0:89; X64-NEXT: movzbl %sil, %eax90; X64-NEXT: movzbl %dil, %ecx91; X64-NEXT: movl %ecx, %edx92; X64-NEXT: subl %eax, %edx93; X64-NEXT: subl %ecx, %eax94; X64-NEXT: cmovbl %edx, %eax95; X64-NEXT: negb %al96; X64-NEXT: # kill: def $al killed $al killed $eax97; X64-NEXT: retq98 %aext = zext i8 %a to i6499 %bext = zext i8 %b to i64100 %sub = sub i64 %aext, %bext101 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)102 %nabs = sub i64 0, %abs103 %trunc = trunc i64 %nabs to i8104 ret i8 %trunc105}106 107define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {108; X86-LABEL: abd_ext_i16:109; X86: # %bb.0:110; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax111; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx112; X86-NEXT: movl %ecx, %edx113; X86-NEXT: subl %eax, %edx114; X86-NEXT: subl %ecx, %eax115; X86-NEXT: cmovael %edx, %eax116; X86-NEXT: # kill: def $ax killed $ax killed $eax117; X86-NEXT: retl118;119; X64-LABEL: abd_ext_i16:120; X64: # %bb.0:121; X64-NEXT: movzwl %di, %ecx122; X64-NEXT: subl %esi, %edi123; X64-NEXT: movzwl %si, %eax124; X64-NEXT: subl %ecx, %eax125; X64-NEXT: cmovbl %edi, %eax126; X64-NEXT: negl %eax127; X64-NEXT: # kill: def $ax killed $ax killed $eax128; X64-NEXT: retq129 %aext = zext i16 %a to i64130 %bext = zext i16 %b to i64131 %sub = sub i64 %aext, %bext132 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)133 %nabs = sub i64 0, %abs134 %trunc = trunc i64 %nabs to i16135 ret i16 %trunc136}137 138define i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {139; X86-LABEL: abd_ext_i16_i32:140; X86: # %bb.0:141; X86-NEXT: movl {{[0-9]+}}(%esp), %eax142; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx143; X86-NEXT: movl %ecx, %edx144; X86-NEXT: subl %eax, %edx145; X86-NEXT: subl %ecx, %eax146; X86-NEXT: cmovael %edx, %eax147; X86-NEXT: # kill: def $ax killed $ax killed $eax148; X86-NEXT: retl149;150; X64-LABEL: abd_ext_i16_i32:151; X64: # %bb.0:152; X64-NEXT: movzwl %di, %ecx153; X64-NEXT: movl %edi, %eax154; X64-NEXT: subl %esi, %eax155; X64-NEXT: subl %ecx, %esi156; X64-NEXT: cmovael %esi, %eax157; X64-NEXT: negl %eax158; X64-NEXT: # kill: def $ax killed $ax killed $eax159; X64-NEXT: retq160 %aext = zext i16 %a to i64161 %bext = zext i32 %b to i64162 %sub = sub i64 %aext, %bext163 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)164 %nabs = sub i64 0, %abs165 %trunc = trunc i64 %nabs to i16166 ret i16 %trunc167}168 169define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {170; X86-LABEL: abd_ext_i16_undef:171; X86: # %bb.0:172; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax173; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx174; X86-NEXT: movl %ecx, %edx175; X86-NEXT: subl %eax, %edx176; X86-NEXT: subl %ecx, %eax177; X86-NEXT: cmovael %edx, %eax178; X86-NEXT: # kill: def $ax killed $ax killed $eax179; X86-NEXT: retl180;181; X64-LABEL: abd_ext_i16_undef:182; X64: # %bb.0:183; X64-NEXT: movzwl %di, %ecx184; X64-NEXT: subl %esi, %edi185; X64-NEXT: movzwl %si, %eax186; X64-NEXT: subl %ecx, %eax187; X64-NEXT: cmovbl %edi, %eax188; X64-NEXT: negl %eax189; X64-NEXT: # kill: def $ax killed $ax killed $eax190; X64-NEXT: retq191 %aext = zext i16 %a to i64192 %bext = zext i16 %b to i64193 %sub = sub i64 %aext, %bext194 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)195 %nabs = sub i64 0, %abs196 %trunc = trunc i64 %nabs to i16197 ret i16 %trunc198}199 200define i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {201; X86-LABEL: abd_ext_i32:202; X86: # %bb.0:203; X86-NEXT: movl {{[0-9]+}}(%esp), %eax204; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx205; X86-NEXT: movl %ecx, %edx206; X86-NEXT: subl %eax, %edx207; X86-NEXT: subl %ecx, %eax208; X86-NEXT: cmovael %edx, %eax209; X86-NEXT: retl210;211; X64-LABEL: abd_ext_i32:212; X64: # %bb.0:213; X64-NEXT: movl %edi, %eax214; X64-NEXT: subl %esi, %eax215; X64-NEXT: subl %edi, %esi216; X64-NEXT: cmovbl %esi, %eax217; X64-NEXT: retq218 %aext = zext i32 %a to i64219 %bext = zext i32 %b to i64220 %sub = sub i64 %aext, %bext221 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)222 %nabs = sub i64 0, %abs223 %trunc = trunc i64 %nabs to i32224 ret i32 %trunc225}226 227define i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {228; X86-LABEL: abd_ext_i32_i16:229; X86: # %bb.0:230; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax231; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx232; X86-NEXT: movl %ecx, %edx233; X86-NEXT: subl %eax, %edx234; X86-NEXT: subl %ecx, %eax235; X86-NEXT: cmovael %edx, %eax236; X86-NEXT: retl237;238; X64-LABEL: abd_ext_i32_i16:239; X64: # %bb.0:240; X64-NEXT: movzwl %si, %eax241; X64-NEXT: movl %edi, %ecx242; X64-NEXT: subl %eax, %ecx243; X64-NEXT: subl %edi, %eax244; X64-NEXT: cmovael %ecx, %eax245; X64-NEXT: retq246 %aext = zext i32 %a to i64247 %bext = zext i16 %b to i64248 %sub = sub i64 %aext, %bext249 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)250 %nabs = sub i64 0, %abs251 %trunc = trunc i64 %nabs to i32252 ret i32 %trunc253}254 255define i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {256; X86-LABEL: abd_ext_i32_undef:257; X86: # %bb.0:258; X86-NEXT: movl {{[0-9]+}}(%esp), %eax259; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx260; X86-NEXT: movl %ecx, %edx261; X86-NEXT: subl %eax, %edx262; X86-NEXT: subl %ecx, %eax263; X86-NEXT: cmovael %edx, %eax264; X86-NEXT: retl265;266; X64-LABEL: abd_ext_i32_undef:267; X64: # %bb.0:268; X64-NEXT: movl %edi, %eax269; X64-NEXT: subl %esi, %eax270; X64-NEXT: subl %edi, %esi271; X64-NEXT: cmovbl %esi, %eax272; X64-NEXT: retq273 %aext = zext i32 %a to i64274 %bext = zext i32 %b to i64275 %sub = sub i64 %aext, %bext276 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)277 %nabs = sub i64 0, %abs278 %trunc = trunc i64 %nabs to i32279 ret i32 %trunc280}281 282define i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {283; X86-LABEL: abd_ext_i64:284; X86: # %bb.0:285; X86-NEXT: pushl %esi286; X86-NEXT: movl {{[0-9]+}}(%esp), %eax287; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx288; X86-NEXT: xorl %edx, %edx289; X86-NEXT: subl {{[0-9]+}}(%esp), %eax290; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ecx291; X86-NEXT: movl $0, %esi292; X86-NEXT: sbbl %esi, %esi293; X86-NEXT: xorl %esi, %ecx294; X86-NEXT: xorl %esi, %eax295; X86-NEXT: subl %esi, %eax296; X86-NEXT: sbbl %esi, %ecx297; X86-NEXT: negl %eax298; X86-NEXT: sbbl %ecx, %edx299; X86-NEXT: popl %esi300; X86-NEXT: retl301;302; X64-LABEL: abd_ext_i64:303; X64: # %bb.0:304; X64-NEXT: movq %rdi, %rax305; X64-NEXT: subq %rsi, %rax306; X64-NEXT: subq %rdi, %rsi307; X64-NEXT: cmovbq %rsi, %rax308; X64-NEXT: retq309 %aext = zext i64 %a to i128310 %bext = zext i64 %b to i128311 %sub = sub i128 %aext, %bext312 %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)313 %nabs = sub i128 0, %abs314 %trunc = trunc i128 %nabs to i64315 ret i64 %trunc316}317 318define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {319; X86-LABEL: abd_ext_i64_undef:320; X86: # %bb.0:321; X86-NEXT: pushl %esi322; X86-NEXT: movl {{[0-9]+}}(%esp), %eax323; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx324; X86-NEXT: xorl %edx, %edx325; X86-NEXT: subl {{[0-9]+}}(%esp), %eax326; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ecx327; X86-NEXT: movl $0, %esi328; X86-NEXT: sbbl %esi, %esi329; X86-NEXT: xorl %esi, %ecx330; X86-NEXT: xorl %esi, %eax331; X86-NEXT: subl %esi, %eax332; X86-NEXT: sbbl %esi, %ecx333; X86-NEXT: negl %eax334; X86-NEXT: sbbl %ecx, %edx335; X86-NEXT: popl %esi336; X86-NEXT: retl337;338; X64-LABEL: abd_ext_i64_undef:339; X64: # %bb.0:340; X64-NEXT: movq %rdi, %rax341; X64-NEXT: subq %rsi, %rax342; X64-NEXT: subq %rdi, %rsi343; X64-NEXT: cmovbq %rsi, %rax344; X64-NEXT: retq345 %aext = zext i64 %a to i128346 %bext = zext i64 %b to i128347 %sub = sub i128 %aext, %bext348 %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)349 %nabs = sub i128 0, %abs350 %trunc = trunc i128 %nabs to i64351 ret i64 %trunc352}353 354define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {355; X86-LABEL: abd_ext_i128:356; X86: # %bb.0:357; X86-NEXT: pushl %ebp358; X86-NEXT: movl %esp, %ebp359; X86-NEXT: pushl %ebx360; X86-NEXT: pushl %edi361; X86-NEXT: pushl %esi362; X86-NEXT: andl $-16, %esp363; X86-NEXT: subl $16, %esp364; X86-NEXT: movl 32(%ebp), %esi365; X86-NEXT: movl 36(%ebp), %eax366; X86-NEXT: movl 24(%ebp), %ecx367; X86-NEXT: movl 28(%ebp), %edi368; X86-NEXT: xorl %edx, %edx369; X86-NEXT: subl 40(%ebp), %ecx370; X86-NEXT: sbbl 44(%ebp), %edi371; X86-NEXT: sbbl 48(%ebp), %esi372; X86-NEXT: sbbl 52(%ebp), %eax373; X86-NEXT: movl $0, %ebx374; X86-NEXT: sbbl %ebx, %ebx375; X86-NEXT: xorl %ebx, %eax376; X86-NEXT: xorl %ebx, %esi377; X86-NEXT: xorl %ebx, %edi378; X86-NEXT: xorl %ebx, %ecx379; X86-NEXT: subl %ebx, %ecx380; X86-NEXT: sbbl %ebx, %edi381; X86-NEXT: sbbl %ebx, %esi382; X86-NEXT: sbbl %ebx, %eax383; X86-NEXT: negl %ecx384; X86-NEXT: movl $0, %ebx385; X86-NEXT: sbbl %edi, %ebx386; X86-NEXT: movl $0, %edi387; X86-NEXT: sbbl %esi, %edi388; X86-NEXT: sbbl %eax, %edx389; X86-NEXT: movl 8(%ebp), %eax390; X86-NEXT: movl %ecx, (%eax)391; X86-NEXT: movl %ebx, 4(%eax)392; X86-NEXT: movl %edi, 8(%eax)393; X86-NEXT: movl %edx, 12(%eax)394; X86-NEXT: leal -12(%ebp), %esp395; X86-NEXT: popl %esi396; X86-NEXT: popl %edi397; X86-NEXT: popl %ebx398; X86-NEXT: popl %ebp399; X86-NEXT: retl $4400;401; X64-LABEL: abd_ext_i128:402; X64: # %bb.0:403; X64-NEXT: movq %rdi, %rax404; X64-NEXT: xorl %edi, %edi405; X64-NEXT: subq %rdx, %rax406; X64-NEXT: sbbq %rcx, %rsi407; X64-NEXT: movl $0, %ecx408; X64-NEXT: sbbq %rcx, %rcx409; X64-NEXT: xorq %rcx, %rsi410; X64-NEXT: xorq %rcx, %rax411; X64-NEXT: subq %rcx, %rax412; X64-NEXT: sbbq %rcx, %rsi413; X64-NEXT: negq %rax414; X64-NEXT: sbbq %rsi, %rdi415; X64-NEXT: movq %rdi, %rdx416; X64-NEXT: retq417 %aext = zext i128 %a to i256418 %bext = zext i128 %b to i256419 %sub = sub i256 %aext, %bext420 %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)421 %nabs = sub i256 0, %abs422 %trunc = trunc i256 %nabs to i128423 ret i128 %trunc424}425 426define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {427; X86-LABEL: abd_ext_i128_undef:428; X86: # %bb.0:429; X86-NEXT: pushl %ebp430; X86-NEXT: movl %esp, %ebp431; X86-NEXT: pushl %ebx432; X86-NEXT: pushl %edi433; X86-NEXT: pushl %esi434; X86-NEXT: andl $-16, %esp435; X86-NEXT: subl $16, %esp436; X86-NEXT: movl 32(%ebp), %esi437; X86-NEXT: movl 36(%ebp), %eax438; X86-NEXT: movl 24(%ebp), %ecx439; X86-NEXT: movl 28(%ebp), %edi440; X86-NEXT: xorl %edx, %edx441; X86-NEXT: subl 40(%ebp), %ecx442; X86-NEXT: sbbl 44(%ebp), %edi443; X86-NEXT: sbbl 48(%ebp), %esi444; X86-NEXT: sbbl 52(%ebp), %eax445; X86-NEXT: movl $0, %ebx446; X86-NEXT: sbbl %ebx, %ebx447; X86-NEXT: xorl %ebx, %eax448; X86-NEXT: xorl %ebx, %esi449; X86-NEXT: xorl %ebx, %edi450; X86-NEXT: xorl %ebx, %ecx451; X86-NEXT: subl %ebx, %ecx452; X86-NEXT: sbbl %ebx, %edi453; X86-NEXT: sbbl %ebx, %esi454; X86-NEXT: sbbl %ebx, %eax455; X86-NEXT: negl %ecx456; X86-NEXT: movl $0, %ebx457; X86-NEXT: sbbl %edi, %ebx458; X86-NEXT: movl $0, %edi459; X86-NEXT: sbbl %esi, %edi460; X86-NEXT: sbbl %eax, %edx461; X86-NEXT: movl 8(%ebp), %eax462; X86-NEXT: movl %ecx, (%eax)463; X86-NEXT: movl %ebx, 4(%eax)464; X86-NEXT: movl %edi, 8(%eax)465; X86-NEXT: movl %edx, 12(%eax)466; X86-NEXT: leal -12(%ebp), %esp467; X86-NEXT: popl %esi468; X86-NEXT: popl %edi469; X86-NEXT: popl %ebx470; X86-NEXT: popl %ebp471; X86-NEXT: retl $4472;473; X64-LABEL: abd_ext_i128_undef:474; X64: # %bb.0:475; X64-NEXT: movq %rdi, %rax476; X64-NEXT: xorl %edi, %edi477; X64-NEXT: subq %rdx, %rax478; X64-NEXT: sbbq %rcx, %rsi479; X64-NEXT: movl $0, %ecx480; X64-NEXT: sbbq %rcx, %rcx481; X64-NEXT: xorq %rcx, %rsi482; X64-NEXT: xorq %rcx, %rax483; X64-NEXT: subq %rcx, %rax484; X64-NEXT: sbbq %rcx, %rsi485; X64-NEXT: negq %rax486; X64-NEXT: sbbq %rsi, %rdi487; X64-NEXT: movq %rdi, %rdx488; X64-NEXT: retq489 %aext = zext i128 %a to i256490 %bext = zext i128 %b to i256491 %sub = sub i256 %aext, %bext492 %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)493 %nabs = sub i256 0, %abs494 %trunc = trunc i256 %nabs to i128495 ret i128 %trunc496}497 498;499; sub(umin(a,b),umax(a,b)) -> nabds(a,b)500;501 502define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {503; X86-LABEL: abd_minmax_i8:504; X86: # %bb.0:505; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax506; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx507; X86-NEXT: movl %ecx, %edx508; X86-NEXT: subl %eax, %edx509; X86-NEXT: subl %ecx, %eax510; X86-NEXT: cmovbl %edx, %eax511; X86-NEXT: negb %al512; X86-NEXT: # kill: def $al killed $al killed $eax513; X86-NEXT: retl514;515; X64-LABEL: abd_minmax_i8:516; X64: # %bb.0:517; X64-NEXT: movzbl %sil, %eax518; X64-NEXT: movzbl %dil, %ecx519; X64-NEXT: movl %ecx, %edx520; X64-NEXT: subl %eax, %edx521; X64-NEXT: subl %ecx, %eax522; X64-NEXT: cmovbl %edx, %eax523; X64-NEXT: negb %al524; X64-NEXT: # kill: def $al killed $al killed $eax525; X64-NEXT: retq526 %min = call i8 @llvm.umin.i8(i8 %a, i8 %b)527 %max = call i8 @llvm.umax.i8(i8 %a, i8 %b)528 %sub = sub i8 %min, %max529 ret i8 %sub530}531 532define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {533; X86-LABEL: abd_minmax_i16:534; X86: # %bb.0:535; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax536; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx537; X86-NEXT: movl %ecx, %edx538; X86-NEXT: subl %eax, %edx539; X86-NEXT: subl %ecx, %eax540; X86-NEXT: cmovael %edx, %eax541; X86-NEXT: # kill: def $ax killed $ax killed $eax542; X86-NEXT: retl543;544; X64-LABEL: abd_minmax_i16:545; X64: # %bb.0:546; X64-NEXT: movzwl %di, %ecx547; X64-NEXT: subl %esi, %edi548; X64-NEXT: movzwl %si, %eax549; X64-NEXT: subl %ecx, %eax550; X64-NEXT: cmovbl %edi, %eax551; X64-NEXT: negl %eax552; X64-NEXT: # kill: def $ax killed $ax killed $eax553; X64-NEXT: retq554 %min = call i16 @llvm.umin.i16(i16 %a, i16 %b)555 %max = call i16 @llvm.umax.i16(i16 %a, i16 %b)556 %sub = sub i16 %min, %max557 ret i16 %sub558}559 560define i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {561; X86-LABEL: abd_minmax_i32:562; X86: # %bb.0:563; X86-NEXT: movl {{[0-9]+}}(%esp), %eax564; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx565; X86-NEXT: movl %ecx, %edx566; X86-NEXT: subl %eax, %edx567; X86-NEXT: subl %ecx, %eax568; X86-NEXT: cmovael %edx, %eax569; X86-NEXT: retl570;571; X64-LABEL: abd_minmax_i32:572; X64: # %bb.0:573; X64-NEXT: movl %edi, %eax574; X64-NEXT: subl %esi, %eax575; X64-NEXT: subl %edi, %esi576; X64-NEXT: cmovbl %esi, %eax577; X64-NEXT: retq578 %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)579 %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)580 %sub = sub i32 %min, %max581 ret i32 %sub582}583 584define i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {585; X86-LABEL: abd_minmax_i64:586; X86: # %bb.0:587; X86-NEXT: pushl %ebp588; X86-NEXT: pushl %ebx589; X86-NEXT: pushl %edi590; X86-NEXT: pushl %esi591; X86-NEXT: movl {{[0-9]+}}(%esp), %esi592; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx593; X86-NEXT: movl {{[0-9]+}}(%esp), %edi594; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx595; X86-NEXT: cmpl %esi, %edi596; X86-NEXT: movl %ebx, %eax597; X86-NEXT: sbbl %ecx, %eax598; X86-NEXT: movl %ecx, %edx599; X86-NEXT: cmovbl %ebx, %edx600; X86-NEXT: movl %esi, %eax601; X86-NEXT: cmovbl %edi, %eax602; X86-NEXT: cmpl %edi, %esi603; X86-NEXT: movl %ecx, %ebp604; X86-NEXT: sbbl %ebx, %ebp605; X86-NEXT: cmovbl %ebx, %ecx606; X86-NEXT: cmovbl %edi, %esi607; X86-NEXT: subl %esi, %eax608; X86-NEXT: sbbl %ecx, %edx609; X86-NEXT: popl %esi610; X86-NEXT: popl %edi611; X86-NEXT: popl %ebx612; X86-NEXT: popl %ebp613; X86-NEXT: retl614;615; X64-LABEL: abd_minmax_i64:616; X64: # %bb.0:617; X64-NEXT: movq %rdi, %rax618; X64-NEXT: subq %rsi, %rax619; X64-NEXT: subq %rdi, %rsi620; X64-NEXT: cmovbq %rsi, %rax621; X64-NEXT: retq622 %min = call i64 @llvm.umin.i64(i64 %a, i64 %b)623 %max = call i64 @llvm.umax.i64(i64 %a, i64 %b)624 %sub = sub i64 %min, %max625 ret i64 %sub626}627 628define i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {629; X86-LABEL: abd_minmax_i128:630; X86: # %bb.0:631; X86-NEXT: pushl %ebp632; X86-NEXT: movl %esp, %ebp633; X86-NEXT: pushl %ebx634; X86-NEXT: pushl %edi635; X86-NEXT: pushl %esi636; X86-NEXT: andl $-16, %esp637; X86-NEXT: subl $16, %esp638; X86-NEXT: movl 40(%ebp), %esi639; X86-NEXT: movl 24(%ebp), %edi640; X86-NEXT: movl 28(%ebp), %eax641; X86-NEXT: cmpl %esi, %edi642; X86-NEXT: sbbl 44(%ebp), %eax643; X86-NEXT: movl 48(%ebp), %edx644; X86-NEXT: movl 32(%ebp), %eax645; X86-NEXT: sbbl %edx, %eax646; X86-NEXT: movl 52(%ebp), %ebx647; X86-NEXT: movl 36(%ebp), %ecx648; X86-NEXT: movl %ecx, %eax649; X86-NEXT: sbbl %ebx, %eax650; X86-NEXT: movl %ebx, %eax651; X86-NEXT: cmovbl %ecx, %eax652; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill653; X86-NEXT: movl %edx, %eax654; X86-NEXT: cmovbl 32(%ebp), %eax655; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill656; X86-NEXT: movl 44(%ebp), %eax657; X86-NEXT: cmovbl 28(%ebp), %eax658; X86-NEXT: movl %esi, %ecx659; X86-NEXT: cmovbl %edi, %ecx660; X86-NEXT: cmpl %edi, %esi661; X86-NEXT: movl 44(%ebp), %edi662; X86-NEXT: sbbl 28(%ebp), %edi663; X86-NEXT: movl %edx, %edi664; X86-NEXT: sbbl 32(%ebp), %edi665; X86-NEXT: movl %ebx, %edi666; X86-NEXT: sbbl 36(%ebp), %edi667; X86-NEXT: cmovbl 36(%ebp), %ebx668; X86-NEXT: cmovbl 32(%ebp), %edx669; X86-NEXT: movl 44(%ebp), %edi670; X86-NEXT: cmovbl 28(%ebp), %edi671; X86-NEXT: cmovbl 24(%ebp), %esi672; X86-NEXT: subl %esi, %ecx673; X86-NEXT: sbbl %edi, %eax674; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload675; X86-NEXT: sbbl %edx, %edi676; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload677; X86-NEXT: sbbl %ebx, %esi678; X86-NEXT: movl 8(%ebp), %edx679; X86-NEXT: movl %ecx, (%edx)680; X86-NEXT: movl %eax, 4(%edx)681; X86-NEXT: movl %edi, 8(%edx)682; X86-NEXT: movl %esi, 12(%edx)683; X86-NEXT: movl %edx, %eax684; X86-NEXT: leal -12(%ebp), %esp685; X86-NEXT: popl %esi686; X86-NEXT: popl %edi687; X86-NEXT: popl %ebx688; X86-NEXT: popl %ebp689; X86-NEXT: retl $4690;691; X64-LABEL: abd_minmax_i128:692; X64: # %bb.0:693; X64-NEXT: cmpq %rdx, %rdi694; X64-NEXT: movq %rsi, %rax695; X64-NEXT: sbbq %rcx, %rax696; X64-NEXT: movq %rcx, %r8697; X64-NEXT: cmovbq %rsi, %r8698; X64-NEXT: movq %rdx, %rax699; X64-NEXT: cmovbq %rdi, %rax700; X64-NEXT: cmpq %rdi, %rdx701; X64-NEXT: movq %rcx, %r9702; X64-NEXT: sbbq %rsi, %r9703; X64-NEXT: cmovbq %rsi, %rcx704; X64-NEXT: cmovbq %rdi, %rdx705; X64-NEXT: subq %rdx, %rax706; X64-NEXT: sbbq %rcx, %r8707; X64-NEXT: movq %r8, %rdx708; X64-NEXT: retq709 %min = call i128 @llvm.umin.i128(i128 %a, i128 %b)710 %max = call i128 @llvm.umax.i128(i128 %a, i128 %b)711 %sub = sub i128 %min, %max712 ret i128 %sub713}714 715;716; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)717;718 719define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {720; X86-LABEL: abd_cmp_i8:721; X86: # %bb.0:722; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax723; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx724; X86-NEXT: movl %ecx, %edx725; X86-NEXT: subl %eax, %edx726; X86-NEXT: subl %ecx, %eax727; X86-NEXT: cmovbl %edx, %eax728; X86-NEXT: negb %al729; X86-NEXT: # kill: def $al killed $al killed $eax730; X86-NEXT: retl731;732; X64-LABEL: abd_cmp_i8:733; X64: # %bb.0:734; X64-NEXT: movzbl %sil, %eax735; X64-NEXT: movzbl %dil, %ecx736; X64-NEXT: movl %ecx, %edx737; X64-NEXT: subl %eax, %edx738; X64-NEXT: subl %ecx, %eax739; X64-NEXT: cmovbl %edx, %eax740; X64-NEXT: negb %al741; X64-NEXT: # kill: def $al killed $al killed $eax742; X64-NEXT: retq743 %cmp = icmp ule i8 %a, %b744 %ab = sub i8 %a, %b745 %ba = sub i8 %b, %a746 %sel = select i1 %cmp, i8 %ab, i8 %ba747 ret i8 %sel748}749 750define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {751; X86-LABEL: abd_cmp_i16:752; X86: # %bb.0:753; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax754; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx755; X86-NEXT: movl %ecx, %edx756; X86-NEXT: subl %eax, %edx757; X86-NEXT: subl %ecx, %eax758; X86-NEXT: cmovael %edx, %eax759; X86-NEXT: # kill: def $ax killed $ax killed $eax760; X86-NEXT: retl761;762; X64-LABEL: abd_cmp_i16:763; X64: # %bb.0:764; X64-NEXT: movzwl %di, %ecx765; X64-NEXT: subl %esi, %edi766; X64-NEXT: movzwl %si, %eax767; X64-NEXT: subl %ecx, %eax768; X64-NEXT: cmovbl %edi, %eax769; X64-NEXT: negl %eax770; X64-NEXT: # kill: def $ax killed $ax killed $eax771; X64-NEXT: retq772 %cmp = icmp ult i16 %a, %b773 %ab = sub i16 %a, %b774 %ba = sub i16 %b, %a775 %sel = select i1 %cmp, i16 %ab, i16 %ba776 ret i16 %sel777}778 779define i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {780; X86-LABEL: abd_cmp_i32:781; X86: # %bb.0:782; X86-NEXT: movl {{[0-9]+}}(%esp), %eax783; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx784; X86-NEXT: movl %ecx, %edx785; X86-NEXT: subl %eax, %edx786; X86-NEXT: subl %ecx, %eax787; X86-NEXT: cmovael %edx, %eax788; X86-NEXT: retl789;790; X64-LABEL: abd_cmp_i32:791; X64: # %bb.0:792; X64-NEXT: movl %edi, %eax793; X64-NEXT: subl %esi, %eax794; X64-NEXT: subl %edi, %esi795; X64-NEXT: cmovbl %esi, %eax796; X64-NEXT: retq797 %cmp = icmp uge i32 %a, %b798 %ab = sub i32 %a, %b799 %ba = sub i32 %b, %a800 %sel = select i1 %cmp, i32 %ba, i32 %ab801 ret i32 %sel802}803 804define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {805; X86-LABEL: abd_cmp_i64:806; X86: # %bb.0:807; X86-NEXT: pushl %esi808; X86-NEXT: movl {{[0-9]+}}(%esp), %eax809; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx810; X86-NEXT: xorl %edx, %edx811; X86-NEXT: subl {{[0-9]+}}(%esp), %eax812; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ecx813; X86-NEXT: movl $0, %esi814; X86-NEXT: sbbl %esi, %esi815; X86-NEXT: xorl %esi, %ecx816; X86-NEXT: xorl %esi, %eax817; X86-NEXT: subl %esi, %eax818; X86-NEXT: sbbl %esi, %ecx819; X86-NEXT: negl %eax820; X86-NEXT: sbbl %ecx, %edx821; X86-NEXT: popl %esi822; X86-NEXT: retl823;824; X64-LABEL: abd_cmp_i64:825; X64: # %bb.0:826; X64-NEXT: movq %rdi, %rax827; X64-NEXT: subq %rsi, %rax828; X64-NEXT: subq %rdi, %rsi829; X64-NEXT: cmovbq %rsi, %rax830; X64-NEXT: retq831 %cmp = icmp ult i64 %a, %b832 %ab = sub i64 %a, %b833 %ba = sub i64 %b, %a834 %sel = select i1 %cmp, i64 %ab, i64 %ba835 ret i64 %sel836}837 838define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {839; X86-LABEL: abd_cmp_i128:840; X86: # %bb.0:841; X86-NEXT: pushl %ebp842; X86-NEXT: movl %esp, %ebp843; X86-NEXT: pushl %ebx844; X86-NEXT: pushl %edi845; X86-NEXT: pushl %esi846; X86-NEXT: andl $-16, %esp847; X86-NEXT: subl $16, %esp848; X86-NEXT: movl 32(%ebp), %esi849; X86-NEXT: movl 36(%ebp), %eax850; X86-NEXT: movl 24(%ebp), %ecx851; X86-NEXT: movl 28(%ebp), %edi852; X86-NEXT: xorl %edx, %edx853; X86-NEXT: subl 40(%ebp), %ecx854; X86-NEXT: sbbl 44(%ebp), %edi855; X86-NEXT: sbbl 48(%ebp), %esi856; X86-NEXT: sbbl 52(%ebp), %eax857; X86-NEXT: movl $0, %ebx858; X86-NEXT: sbbl %ebx, %ebx859; X86-NEXT: xorl %ebx, %eax860; X86-NEXT: xorl %ebx, %esi861; X86-NEXT: xorl %ebx, %edi862; X86-NEXT: xorl %ebx, %ecx863; X86-NEXT: subl %ebx, %ecx864; X86-NEXT: sbbl %ebx, %edi865; X86-NEXT: sbbl %ebx, %esi866; X86-NEXT: sbbl %ebx, %eax867; X86-NEXT: negl %ecx868; X86-NEXT: movl $0, %ebx869; X86-NEXT: sbbl %edi, %ebx870; X86-NEXT: movl $0, %edi871; X86-NEXT: sbbl %esi, %edi872; X86-NEXT: sbbl %eax, %edx873; X86-NEXT: movl 8(%ebp), %eax874; X86-NEXT: movl %ecx, (%eax)875; X86-NEXT: movl %ebx, 4(%eax)876; X86-NEXT: movl %edi, 8(%eax)877; X86-NEXT: movl %edx, 12(%eax)878; X86-NEXT: leal -12(%ebp), %esp879; X86-NEXT: popl %esi880; X86-NEXT: popl %edi881; X86-NEXT: popl %ebx882; X86-NEXT: popl %ebp883; X86-NEXT: retl $4884;885; X64-LABEL: abd_cmp_i128:886; X64: # %bb.0:887; X64-NEXT: movq %rdi, %rax888; X64-NEXT: xorl %edi, %edi889; X64-NEXT: subq %rdx, %rax890; X64-NEXT: sbbq %rcx, %rsi891; X64-NEXT: movl $0, %ecx892; X64-NEXT: sbbq %rcx, %rcx893; X64-NEXT: xorq %rcx, %rsi894; X64-NEXT: xorq %rcx, %rax895; X64-NEXT: subq %rcx, %rax896; X64-NEXT: sbbq %rcx, %rsi897; X64-NEXT: negq %rax898; X64-NEXT: sbbq %rsi, %rdi899; X64-NEXT: movq %rdi, %rdx900; X64-NEXT: retq901 %cmp = icmp ult i128 %a, %b902 %ab = sub i128 %a, %b903 %ba = sub i128 %b, %a904 %sel = select i1 %cmp, i128 %ab, i128 %ba905 ret i128 %sel906}907 908declare i8 @llvm.abs.i8(i8, i1)909declare i16 @llvm.abs.i16(i16, i1)910declare i32 @llvm.abs.i32(i32, i1)911declare i64 @llvm.abs.i64(i64, i1)912declare i128 @llvm.abs.i128(i128, i1)913 914declare i8 @llvm.umax.i8(i8, i8)915declare i16 @llvm.umax.i16(i16, i16)916declare i32 @llvm.umax.i32(i32, i32)917declare i64 @llvm.umax.i64(i64, i64)918 919declare i8 @llvm.umin.i8(i8, i8)920declare i16 @llvm.umin.i16(i16, i16)921declare i32 @llvm.umin.i32(i32, i32)922declare i64 @llvm.umin.i64(i64, i64)923