brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.4 KiB · b7c3407 Raw
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