brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.6 KiB · d9064c6 Raw
1272 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(sext(a),sext(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:    movsbl {{[0-9]+}}(%esp), %eax13; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx14; X86-NEXT:    movl %ecx, %edx15; X86-NEXT:    subl %eax, %edx16; X86-NEXT:    subl %ecx, %eax17; X86-NEXT:    cmovll %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:    movsbl %sil, %eax25; X64-NEXT:    movsbl %dil, %ecx26; X64-NEXT:    movl %ecx, %edx27; X64-NEXT:    subl %eax, %edx28; X64-NEXT:    subl %ecx, %eax29; X64-NEXT:    cmovll %edx, %eax30; X64-NEXT:    negb %al31; X64-NEXT:    # kill: def $al killed $al killed $eax32; X64-NEXT:    retq33  %aext = sext i8 %a to i6434  %bext = sext 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:    movswl {{[0-9]+}}(%esp), %eax46; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx47; X86-NEXT:    movl %ecx, %edx48; X86-NEXT:    subl %eax, %edx49; X86-NEXT:    subl %ecx, %eax50; X86-NEXT:    cmovll %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:    movsbl %dil, %ecx58; X64-NEXT:    subl %esi, %edi59; X64-NEXT:    movswl %si, %eax60; X64-NEXT:    subl %ecx, %eax61; X64-NEXT:    cmovll %edi, %eax62; X64-NEXT:    negb %al63; X64-NEXT:    # kill: def $al killed $al killed $eax64; X64-NEXT:    retq65  %aext = sext i8 %a to i6466  %bext = sext 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:    movsbl {{[0-9]+}}(%esp), %eax78; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx79; X86-NEXT:    movl %ecx, %edx80; X86-NEXT:    subl %eax, %edx81; X86-NEXT:    subl %ecx, %eax82; X86-NEXT:    cmovll %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:    movsbl %sil, %eax90; X64-NEXT:    movsbl %dil, %ecx91; X64-NEXT:    movl %ecx, %edx92; X64-NEXT:    subl %eax, %edx93; X64-NEXT:    subl %ecx, %eax94; X64-NEXT:    cmovll %edx, %eax95; X64-NEXT:    negb %al96; X64-NEXT:    # kill: def $al killed $al killed $eax97; X64-NEXT:    retq98  %aext = sext i8 %a to i6499  %bext = sext 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:    movswl {{[0-9]+}}(%esp), %eax111; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx112; X86-NEXT:    movl %ecx, %edx113; X86-NEXT:    subl %eax, %edx114; X86-NEXT:    subl %ecx, %eax115; X86-NEXT:    cmovgel %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:    movswl %di, %ecx122; X64-NEXT:    subl %esi, %edi123; X64-NEXT:    movswl %si, %eax124; X64-NEXT:    subl %ecx, %eax125; X64-NEXT:    cmovll %edi, %eax126; X64-NEXT:    negl %eax127; X64-NEXT:    # kill: def $ax killed $ax killed $eax128; X64-NEXT:    retq129  %aext = sext i16 %a to i64130  %bext = sext 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:    movswl {{[0-9]+}}(%esp), %ecx143; X86-NEXT:    movl %ecx, %edx144; X86-NEXT:    subl %eax, %edx145; X86-NEXT:    subl %ecx, %eax146; X86-NEXT:    cmovgel %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:    movswl %di, %ecx153; X64-NEXT:    movl %edi, %eax154; X64-NEXT:    subl %esi, %eax155; X64-NEXT:    subl %ecx, %esi156; X64-NEXT:    cmovgel %esi, %eax157; X64-NEXT:    negl %eax158; X64-NEXT:    # kill: def $ax killed $ax killed $eax159; X64-NEXT:    retq160  %aext = sext i16 %a to i64161  %bext = sext 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:    movswl {{[0-9]+}}(%esp), %eax173; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx174; X86-NEXT:    movl %ecx, %edx175; X86-NEXT:    subl %eax, %edx176; X86-NEXT:    subl %ecx, %eax177; X86-NEXT:    cmovgel %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:    movswl %di, %ecx184; X64-NEXT:    subl %esi, %edi185; X64-NEXT:    movswl %si, %eax186; X64-NEXT:    subl %ecx, %eax187; X64-NEXT:    cmovll %edi, %eax188; X64-NEXT:    negl %eax189; X64-NEXT:    # kill: def $ax killed $ax killed $eax190; X64-NEXT:    retq191  %aext = sext i16 %a to i64192  %bext = sext 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:    cmovgel %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:    cmovll %esi, %eax217; X64-NEXT:    retq218  %aext = sext i32 %a to i64219  %bext = sext 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:    movswl {{[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:    cmovgel %edx, %eax236; X86-NEXT:    retl237;238; X64-LABEL: abd_ext_i32_i16:239; X64:       # %bb.0:240; X64-NEXT:    movswl %si, %eax241; X64-NEXT:    movl %edi, %ecx242; X64-NEXT:    subl %eax, %ecx243; X64-NEXT:    subl %edi, %eax244; X64-NEXT:    cmovgel %ecx, %eax245; X64-NEXT:    retq246  %aext = sext i32 %a to i64247  %bext = sext 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:    cmovgel %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:    cmovll %esi, %eax272; X64-NEXT:    retq273  %aext = sext i32 %a to i64274  %bext = sext 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 %ebx286; X86-NEXT:    pushl %edi287; X86-NEXT:    pushl %esi288; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax289; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx290; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx291; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi292; X86-NEXT:    movl %edx, %edi293; X86-NEXT:    subl %eax, %edi294; X86-NEXT:    movl %esi, %ebx295; X86-NEXT:    sbbl %ecx, %ebx296; X86-NEXT:    subl %edx, %eax297; X86-NEXT:    sbbl %esi, %ecx298; X86-NEXT:    cmovll %ebx, %ecx299; X86-NEXT:    cmovll %edi, %eax300; X86-NEXT:    xorl %edx, %edx301; X86-NEXT:    negl %eax302; X86-NEXT:    sbbl %ecx, %edx303; X86-NEXT:    popl %esi304; X86-NEXT:    popl %edi305; X86-NEXT:    popl %ebx306; X86-NEXT:    retl307;308; X64-LABEL: abd_ext_i64:309; X64:       # %bb.0:310; X64-NEXT:    movq %rdi, %rax311; X64-NEXT:    subq %rsi, %rax312; X64-NEXT:    subq %rdi, %rsi313; X64-NEXT:    cmovlq %rsi, %rax314; X64-NEXT:    retq315  %aext = sext i64 %a to i128316  %bext = sext i64 %b to i128317  %sub = sub i128 %aext, %bext318  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)319  %nabs = sub i128 0, %abs320  %trunc = trunc i128 %nabs to i64321  ret i64 %trunc322}323 324define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {325; X86-LABEL: abd_ext_i64_undef:326; X86:       # %bb.0:327; X86-NEXT:    pushl %ebx328; X86-NEXT:    pushl %edi329; X86-NEXT:    pushl %esi330; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax331; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx332; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx333; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi334; X86-NEXT:    movl %edx, %edi335; X86-NEXT:    subl %eax, %edi336; X86-NEXT:    movl %esi, %ebx337; X86-NEXT:    sbbl %ecx, %ebx338; X86-NEXT:    subl %edx, %eax339; X86-NEXT:    sbbl %esi, %ecx340; X86-NEXT:    cmovll %ebx, %ecx341; X86-NEXT:    cmovll %edi, %eax342; X86-NEXT:    xorl %edx, %edx343; X86-NEXT:    negl %eax344; X86-NEXT:    sbbl %ecx, %edx345; X86-NEXT:    popl %esi346; X86-NEXT:    popl %edi347; X86-NEXT:    popl %ebx348; X86-NEXT:    retl349;350; X64-LABEL: abd_ext_i64_undef:351; X64:       # %bb.0:352; X64-NEXT:    movq %rdi, %rax353; X64-NEXT:    subq %rsi, %rax354; X64-NEXT:    subq %rdi, %rsi355; X64-NEXT:    cmovlq %rsi, %rax356; X64-NEXT:    retq357  %aext = sext i64 %a to i128358  %bext = sext i64 %b to i128359  %sub = sub i128 %aext, %bext360  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)361  %nabs = sub i128 0, %abs362  %trunc = trunc i128 %nabs to i64363  ret i64 %trunc364}365 366define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {367; X86-LABEL: abd_ext_i128:368; X86:       # %bb.0:369; X86-NEXT:    pushl %ebp370; X86-NEXT:    movl %esp, %ebp371; X86-NEXT:    pushl %ebx372; X86-NEXT:    pushl %edi373; X86-NEXT:    pushl %esi374; X86-NEXT:    andl $-16, %esp375; X86-NEXT:    subl $16, %esp376; X86-NEXT:    movl 40(%ebp), %ecx377; X86-NEXT:    movl 44(%ebp), %eax378; X86-NEXT:    movl 24(%ebp), %edx379; X86-NEXT:    movl 28(%ebp), %esi380; X86-NEXT:    subl %ecx, %edx381; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill382; X86-NEXT:    movl %esi, %edx383; X86-NEXT:    sbbl %eax, %edx384; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill385; X86-NEXT:    movl 48(%ebp), %edx386; X86-NEXT:    movl 32(%ebp), %ebx387; X86-NEXT:    sbbl %edx, %ebx388; X86-NEXT:    movl 52(%ebp), %esi389; X86-NEXT:    movl 36(%ebp), %edi390; X86-NEXT:    sbbl %esi, %edi391; X86-NEXT:    subl 24(%ebp), %ecx392; X86-NEXT:    sbbl 28(%ebp), %eax393; X86-NEXT:    sbbl 32(%ebp), %edx394; X86-NEXT:    sbbl 36(%ebp), %esi395; X86-NEXT:    cmovll %edi, %esi396; X86-NEXT:    cmovll %ebx, %edx397; X86-NEXT:    cmovll {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload398; X86-NEXT:    cmovll {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload399; X86-NEXT:    xorl %edi, %edi400; X86-NEXT:    negl %ecx401; X86-NEXT:    movl $0, %ebx402; X86-NEXT:    sbbl %eax, %ebx403; X86-NEXT:    movl $0, %eax404; X86-NEXT:    sbbl %edx, %eax405; X86-NEXT:    sbbl %esi, %edi406; X86-NEXT:    movl 8(%ebp), %edx407; X86-NEXT:    movl %ecx, (%edx)408; X86-NEXT:    movl %ebx, 4(%edx)409; X86-NEXT:    movl %eax, 8(%edx)410; X86-NEXT:    movl %edi, 12(%edx)411; X86-NEXT:    movl %edx, %eax412; X86-NEXT:    leal -12(%ebp), %esp413; X86-NEXT:    popl %esi414; X86-NEXT:    popl %edi415; X86-NEXT:    popl %ebx416; X86-NEXT:    popl %ebp417; X86-NEXT:    retl $4418;419; X64-LABEL: abd_ext_i128:420; X64:       # %bb.0:421; X64-NEXT:    movq %rdi, %rax422; X64-NEXT:    subq %rdx, %rax423; X64-NEXT:    movq %rsi, %r8424; X64-NEXT:    sbbq %rcx, %r8425; X64-NEXT:    subq %rdi, %rdx426; X64-NEXT:    sbbq %rsi, %rcx427; X64-NEXT:    cmovlq %r8, %rcx428; X64-NEXT:    cmovgeq %rdx, %rax429; X64-NEXT:    xorl %edx, %edx430; X64-NEXT:    negq %rax431; X64-NEXT:    sbbq %rcx, %rdx432; X64-NEXT:    retq433  %aext = sext i128 %a to i256434  %bext = sext i128 %b to i256435  %sub = sub i256 %aext, %bext436  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)437  %nabs = sub i256 0, %abs438  %trunc = trunc i256 %nabs to i128439  ret i128 %trunc440}441 442define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {443; X86-LABEL: abd_ext_i128_undef:444; X86:       # %bb.0:445; X86-NEXT:    pushl %ebp446; X86-NEXT:    movl %esp, %ebp447; X86-NEXT:    pushl %ebx448; X86-NEXT:    pushl %edi449; X86-NEXT:    pushl %esi450; X86-NEXT:    andl $-16, %esp451; X86-NEXT:    subl $16, %esp452; X86-NEXT:    movl 40(%ebp), %ecx453; X86-NEXT:    movl 44(%ebp), %eax454; X86-NEXT:    movl 24(%ebp), %edx455; X86-NEXT:    movl 28(%ebp), %esi456; X86-NEXT:    subl %ecx, %edx457; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill458; X86-NEXT:    movl %esi, %edx459; X86-NEXT:    sbbl %eax, %edx460; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill461; X86-NEXT:    movl 48(%ebp), %edx462; X86-NEXT:    movl 32(%ebp), %ebx463; X86-NEXT:    sbbl %edx, %ebx464; X86-NEXT:    movl 52(%ebp), %esi465; X86-NEXT:    movl 36(%ebp), %edi466; X86-NEXT:    sbbl %esi, %edi467; X86-NEXT:    subl 24(%ebp), %ecx468; X86-NEXT:    sbbl 28(%ebp), %eax469; X86-NEXT:    sbbl 32(%ebp), %edx470; X86-NEXT:    sbbl 36(%ebp), %esi471; X86-NEXT:    cmovll %edi, %esi472; X86-NEXT:    cmovll %ebx, %edx473; X86-NEXT:    cmovll {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload474; X86-NEXT:    cmovll {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload475; X86-NEXT:    xorl %edi, %edi476; X86-NEXT:    negl %ecx477; X86-NEXT:    movl $0, %ebx478; X86-NEXT:    sbbl %eax, %ebx479; X86-NEXT:    movl $0, %eax480; X86-NEXT:    sbbl %edx, %eax481; X86-NEXT:    sbbl %esi, %edi482; X86-NEXT:    movl 8(%ebp), %edx483; X86-NEXT:    movl %ecx, (%edx)484; X86-NEXT:    movl %ebx, 4(%edx)485; X86-NEXT:    movl %eax, 8(%edx)486; X86-NEXT:    movl %edi, 12(%edx)487; X86-NEXT:    movl %edx, %eax488; X86-NEXT:    leal -12(%ebp), %esp489; X86-NEXT:    popl %esi490; X86-NEXT:    popl %edi491; X86-NEXT:    popl %ebx492; X86-NEXT:    popl %ebp493; X86-NEXT:    retl $4494;495; X64-LABEL: abd_ext_i128_undef:496; X64:       # %bb.0:497; X64-NEXT:    movq %rdi, %rax498; X64-NEXT:    subq %rdx, %rax499; X64-NEXT:    movq %rsi, %r8500; X64-NEXT:    sbbq %rcx, %r8501; X64-NEXT:    subq %rdi, %rdx502; X64-NEXT:    sbbq %rsi, %rcx503; X64-NEXT:    cmovlq %r8, %rcx504; X64-NEXT:    cmovgeq %rdx, %rax505; X64-NEXT:    xorl %edx, %edx506; X64-NEXT:    negq %rax507; X64-NEXT:    sbbq %rcx, %rdx508; X64-NEXT:    retq509  %aext = sext i128 %a to i256510  %bext = sext i128 %b to i256511  %sub = sub i256 %aext, %bext512  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)513  %nabs = sub i256 0, %abs514  %trunc = trunc i256 %nabs to i128515  ret i128 %trunc516}517 518;519; sub(smin(a,b),smax(a,b)) -> nabds(a,b)520;521 522define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {523; X86-LABEL: abd_minmax_i8:524; X86:       # %bb.0:525; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax526; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx527; X86-NEXT:    movl %ecx, %edx528; X86-NEXT:    subl %eax, %edx529; X86-NEXT:    subl %ecx, %eax530; X86-NEXT:    cmovll %edx, %eax531; X86-NEXT:    negb %al532; X86-NEXT:    # kill: def $al killed $al killed $eax533; X86-NEXT:    retl534;535; X64-LABEL: abd_minmax_i8:536; X64:       # %bb.0:537; X64-NEXT:    movsbl %sil, %eax538; X64-NEXT:    movsbl %dil, %ecx539; X64-NEXT:    movl %ecx, %edx540; X64-NEXT:    subl %eax, %edx541; X64-NEXT:    subl %ecx, %eax542; X64-NEXT:    cmovll %edx, %eax543; X64-NEXT:    negb %al544; X64-NEXT:    # kill: def $al killed $al killed $eax545; X64-NEXT:    retq546  %min = call i8 @llvm.smin.i8(i8 %a, i8 %b)547  %max = call i8 @llvm.smax.i8(i8 %a, i8 %b)548  %sub = sub i8 %min, %max549  ret i8 %sub550}551 552define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {553; X86-LABEL: abd_minmax_i16:554; X86:       # %bb.0:555; X86-NEXT:    movswl {{[0-9]+}}(%esp), %eax556; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx557; X86-NEXT:    movl %ecx, %edx558; X86-NEXT:    subl %eax, %edx559; X86-NEXT:    subl %ecx, %eax560; X86-NEXT:    cmovgel %edx, %eax561; X86-NEXT:    # kill: def $ax killed $ax killed $eax562; X86-NEXT:    retl563;564; X64-LABEL: abd_minmax_i16:565; X64:       # %bb.0:566; X64-NEXT:    movswl %di, %ecx567; X64-NEXT:    subl %esi, %edi568; X64-NEXT:    movswl %si, %eax569; X64-NEXT:    subl %ecx, %eax570; X64-NEXT:    cmovll %edi, %eax571; X64-NEXT:    negl %eax572; X64-NEXT:    # kill: def $ax killed $ax killed $eax573; X64-NEXT:    retq574  %min = call i16 @llvm.smin.i16(i16 %a, i16 %b)575  %max = call i16 @llvm.smax.i16(i16 %a, i16 %b)576  %sub = sub i16 %min, %max577  ret i16 %sub578}579 580define i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {581; X86-LABEL: abd_minmax_i32:582; X86:       # %bb.0:583; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax584; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx585; X86-NEXT:    movl %ecx, %edx586; X86-NEXT:    subl %eax, %edx587; X86-NEXT:    subl %ecx, %eax588; X86-NEXT:    cmovgel %edx, %eax589; X86-NEXT:    retl590;591; X64-LABEL: abd_minmax_i32:592; X64:       # %bb.0:593; X64-NEXT:    movl %edi, %eax594; X64-NEXT:    subl %esi, %eax595; X64-NEXT:    subl %edi, %esi596; X64-NEXT:    cmovll %esi, %eax597; X64-NEXT:    retq598  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)599  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)600  %sub = sub i32 %min, %max601  ret i32 %sub602}603 604define i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {605; X86-LABEL: abd_minmax_i64:606; X86:       # %bb.0:607; X86-NEXT:    pushl %ebp608; X86-NEXT:    pushl %ebx609; X86-NEXT:    pushl %edi610; X86-NEXT:    pushl %esi611; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi612; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx613; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi614; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx615; X86-NEXT:    cmpl %esi, %edi616; X86-NEXT:    movl %ebx, %eax617; X86-NEXT:    sbbl %ecx, %eax618; X86-NEXT:    movl %ecx, %edx619; X86-NEXT:    cmovll %ebx, %edx620; X86-NEXT:    movl %esi, %eax621; X86-NEXT:    cmovll %edi, %eax622; X86-NEXT:    cmpl %edi, %esi623; X86-NEXT:    movl %ecx, %ebp624; X86-NEXT:    sbbl %ebx, %ebp625; X86-NEXT:    cmovll %ebx, %ecx626; X86-NEXT:    cmovll %edi, %esi627; X86-NEXT:    subl %esi, %eax628; X86-NEXT:    sbbl %ecx, %edx629; X86-NEXT:    popl %esi630; X86-NEXT:    popl %edi631; X86-NEXT:    popl %ebx632; X86-NEXT:    popl %ebp633; X86-NEXT:    retl634;635; X64-LABEL: abd_minmax_i64:636; X64:       # %bb.0:637; X64-NEXT:    movq %rdi, %rax638; X64-NEXT:    subq %rsi, %rax639; X64-NEXT:    subq %rdi, %rsi640; X64-NEXT:    cmovlq %rsi, %rax641; X64-NEXT:    retq642  %min = call i64 @llvm.smin.i64(i64 %a, i64 %b)643  %max = call i64 @llvm.smax.i64(i64 %a, i64 %b)644  %sub = sub i64 %min, %max645  ret i64 %sub646}647 648define i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {649; X86-LABEL: abd_minmax_i128:650; X86:       # %bb.0:651; X86-NEXT:    pushl %ebp652; X86-NEXT:    movl %esp, %ebp653; X86-NEXT:    pushl %ebx654; X86-NEXT:    pushl %edi655; X86-NEXT:    pushl %esi656; X86-NEXT:    andl $-16, %esp657; X86-NEXT:    subl $16, %esp658; X86-NEXT:    movl 40(%ebp), %esi659; X86-NEXT:    movl 24(%ebp), %edi660; X86-NEXT:    movl 28(%ebp), %eax661; X86-NEXT:    cmpl %esi, %edi662; X86-NEXT:    sbbl 44(%ebp), %eax663; X86-NEXT:    movl 48(%ebp), %edx664; X86-NEXT:    movl 32(%ebp), %eax665; X86-NEXT:    sbbl %edx, %eax666; X86-NEXT:    movl 52(%ebp), %ebx667; X86-NEXT:    movl 36(%ebp), %ecx668; X86-NEXT:    movl %ecx, %eax669; X86-NEXT:    sbbl %ebx, %eax670; X86-NEXT:    movl %ebx, %eax671; X86-NEXT:    cmovll %ecx, %eax672; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill673; X86-NEXT:    movl %edx, %eax674; X86-NEXT:    cmovll 32(%ebp), %eax675; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill676; X86-NEXT:    movl 44(%ebp), %eax677; X86-NEXT:    cmovll 28(%ebp), %eax678; X86-NEXT:    movl %esi, %ecx679; X86-NEXT:    cmovll %edi, %ecx680; X86-NEXT:    cmpl %edi, %esi681; X86-NEXT:    movl 44(%ebp), %edi682; X86-NEXT:    sbbl 28(%ebp), %edi683; X86-NEXT:    movl %edx, %edi684; X86-NEXT:    sbbl 32(%ebp), %edi685; X86-NEXT:    movl %ebx, %edi686; X86-NEXT:    sbbl 36(%ebp), %edi687; X86-NEXT:    cmovll 36(%ebp), %ebx688; X86-NEXT:    cmovll 32(%ebp), %edx689; X86-NEXT:    movl 44(%ebp), %edi690; X86-NEXT:    cmovll 28(%ebp), %edi691; X86-NEXT:    cmovll 24(%ebp), %esi692; X86-NEXT:    subl %esi, %ecx693; X86-NEXT:    sbbl %edi, %eax694; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload695; X86-NEXT:    sbbl %edx, %edi696; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload697; X86-NEXT:    sbbl %ebx, %esi698; X86-NEXT:    movl 8(%ebp), %edx699; X86-NEXT:    movl %ecx, (%edx)700; X86-NEXT:    movl %eax, 4(%edx)701; X86-NEXT:    movl %edi, 8(%edx)702; X86-NEXT:    movl %esi, 12(%edx)703; X86-NEXT:    movl %edx, %eax704; X86-NEXT:    leal -12(%ebp), %esp705; X86-NEXT:    popl %esi706; X86-NEXT:    popl %edi707; X86-NEXT:    popl %ebx708; X86-NEXT:    popl %ebp709; X86-NEXT:    retl $4710;711; X64-LABEL: abd_minmax_i128:712; X64:       # %bb.0:713; X64-NEXT:    cmpq %rdx, %rdi714; X64-NEXT:    movq %rsi, %rax715; X64-NEXT:    sbbq %rcx, %rax716; X64-NEXT:    movq %rcx, %r8717; X64-NEXT:    cmovlq %rsi, %r8718; X64-NEXT:    movq %rdx, %rax719; X64-NEXT:    cmovlq %rdi, %rax720; X64-NEXT:    cmpq %rdi, %rdx721; X64-NEXT:    movq %rcx, %r9722; X64-NEXT:    sbbq %rsi, %r9723; X64-NEXT:    cmovlq %rsi, %rcx724; X64-NEXT:    cmovlq %rdi, %rdx725; X64-NEXT:    subq %rdx, %rax726; X64-NEXT:    sbbq %rcx, %r8727; X64-NEXT:    movq %r8, %rdx728; X64-NEXT:    retq729  %min = call i128 @llvm.smin.i128(i128 %a, i128 %b)730  %max = call i128 @llvm.smax.i128(i128 %a, i128 %b)731  %sub = sub i128 %min, %max732  ret i128 %sub733}734 735;736; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)737;738 739define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {740; X86-LABEL: abd_cmp_i8:741; X86:       # %bb.0:742; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax743; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx744; X86-NEXT:    movl %ecx, %edx745; X86-NEXT:    subl %eax, %edx746; X86-NEXT:    subl %ecx, %eax747; X86-NEXT:    cmovll %edx, %eax748; X86-NEXT:    negb %al749; X86-NEXT:    # kill: def $al killed $al killed $eax750; X86-NEXT:    retl751;752; X64-LABEL: abd_cmp_i8:753; X64:       # %bb.0:754; X64-NEXT:    movsbl %sil, %eax755; X64-NEXT:    movsbl %dil, %ecx756; X64-NEXT:    movl %ecx, %edx757; X64-NEXT:    subl %eax, %edx758; X64-NEXT:    subl %ecx, %eax759; X64-NEXT:    cmovll %edx, %eax760; X64-NEXT:    negb %al761; X64-NEXT:    # kill: def $al killed $al killed $eax762; X64-NEXT:    retq763  %cmp = icmp sle i8 %a, %b764  %ab = sub i8 %a, %b765  %ba = sub i8 %b, %a766  %sel = select i1 %cmp, i8 %ab, i8 %ba767  ret i8 %sel768}769 770define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {771; X86-LABEL: abd_cmp_i16:772; X86:       # %bb.0:773; X86-NEXT:    movswl {{[0-9]+}}(%esp), %eax774; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx775; X86-NEXT:    movl %ecx, %edx776; X86-NEXT:    subl %eax, %edx777; X86-NEXT:    subl %ecx, %eax778; X86-NEXT:    cmovgel %edx, %eax779; X86-NEXT:    # kill: def $ax killed $ax killed $eax780; X86-NEXT:    retl781;782; X64-LABEL: abd_cmp_i16:783; X64:       # %bb.0:784; X64-NEXT:    movswl %di, %ecx785; X64-NEXT:    subl %esi, %edi786; X64-NEXT:    movswl %si, %eax787; X64-NEXT:    subl %ecx, %eax788; X64-NEXT:    cmovll %edi, %eax789; X64-NEXT:    negl %eax790; X64-NEXT:    # kill: def $ax killed $ax killed $eax791; X64-NEXT:    retq792  %cmp = icmp slt i16 %a, %b793  %ab = sub i16 %a, %b794  %ba = sub i16 %b, %a795  %sel = select i1 %cmp, i16 %ab, i16 %ba796  ret i16 %sel797}798 799define i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {800; X86-LABEL: abd_cmp_i32:801; X86:       # %bb.0:802; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax803; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx804; X86-NEXT:    movl %ecx, %edx805; X86-NEXT:    subl %eax, %edx806; X86-NEXT:    subl %ecx, %eax807; X86-NEXT:    cmovgel %edx, %eax808; X86-NEXT:    retl809;810; X64-LABEL: abd_cmp_i32:811; X64:       # %bb.0:812; X64-NEXT:    movl %edi, %eax813; X64-NEXT:    subl %esi, %eax814; X64-NEXT:    subl %edi, %esi815; X64-NEXT:    cmovll %esi, %eax816; X64-NEXT:    retq817  %cmp = icmp sge i32 %a, %b818  %ab = sub i32 %a, %b819  %ba = sub i32 %b, %a820  %sel = select i1 %cmp, i32 %ba, i32 %ab821  ret i32 %sel822}823 824define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {825; X86-LABEL: abd_cmp_i64:826; X86:       # %bb.0:827; X86-NEXT:    pushl %ebx828; X86-NEXT:    pushl %edi829; X86-NEXT:    pushl %esi830; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax831; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx832; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx833; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi834; X86-NEXT:    movl %ecx, %edi835; X86-NEXT:    subl %eax, %edi836; X86-NEXT:    movl %esi, %ebx837; X86-NEXT:    sbbl %edx, %ebx838; X86-NEXT:    subl %ecx, %eax839; X86-NEXT:    sbbl %esi, %edx840; X86-NEXT:    cmovgel %edi, %eax841; X86-NEXT:    cmovgel %ebx, %edx842; X86-NEXT:    popl %esi843; X86-NEXT:    popl %edi844; X86-NEXT:    popl %ebx845; X86-NEXT:    retl846;847; X64-LABEL: abd_cmp_i64:848; X64:       # %bb.0:849; X64-NEXT:    movq %rdi, %rax850; X64-NEXT:    subq %rsi, %rax851; X64-NEXT:    subq %rdi, %rsi852; X64-NEXT:    cmovlq %rsi, %rax853; X64-NEXT:    retq854  %cmp = icmp slt i64 %a, %b855  %ab = sub i64 %a, %b856  %ba = sub i64 %b, %a857  %sel = select i1 %cmp, i64 %ab, i64 %ba858  ret i64 %sel859}860 861define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {862; X86-LABEL: abd_cmp_i128:863; X86:       # %bb.0:864; X86-NEXT:    pushl %ebp865; X86-NEXT:    movl %esp, %ebp866; X86-NEXT:    pushl %ebx867; X86-NEXT:    pushl %edi868; X86-NEXT:    pushl %esi869; X86-NEXT:    andl $-16, %esp870; X86-NEXT:    subl $16, %esp871; X86-NEXT:    movl 24(%ebp), %ecx872; X86-NEXT:    movl 28(%ebp), %edx873; X86-NEXT:    movl 40(%ebp), %eax874; X86-NEXT:    movl 44(%ebp), %esi875; X86-NEXT:    subl %ecx, %eax876; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill877; X86-NEXT:    movl %esi, %eax878; X86-NEXT:    sbbl %edx, %eax879; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill880; X86-NEXT:    movl 32(%ebp), %esi881; X86-NEXT:    movl 48(%ebp), %edi882; X86-NEXT:    sbbl %esi, %edi883; X86-NEXT:    movl 36(%ebp), %ebx884; X86-NEXT:    movl 52(%ebp), %eax885; X86-NEXT:    sbbl %ebx, %eax886; X86-NEXT:    subl 40(%ebp), %ecx887; X86-NEXT:    sbbl 44(%ebp), %edx888; X86-NEXT:    sbbl 48(%ebp), %esi889; X86-NEXT:    sbbl 52(%ebp), %ebx890; X86-NEXT:    cmovgel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload891; X86-NEXT:    cmovgel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload892; X86-NEXT:    cmovgel %edi, %esi893; X86-NEXT:    cmovgel %eax, %ebx894; X86-NEXT:    movl 8(%ebp), %eax895; X86-NEXT:    movl %ebx, 12(%eax)896; X86-NEXT:    movl %esi, 8(%eax)897; X86-NEXT:    movl %edx, 4(%eax)898; X86-NEXT:    movl %ecx, (%eax)899; X86-NEXT:    leal -12(%ebp), %esp900; X86-NEXT:    popl %esi901; X86-NEXT:    popl %edi902; X86-NEXT:    popl %ebx903; X86-NEXT:    popl %ebp904; X86-NEXT:    retl $4905;906; X64-LABEL: abd_cmp_i128:907; X64:       # %bb.0:908; X64-NEXT:    movq %rdx, %rax909; X64-NEXT:    subq %rdi, %rax910; X64-NEXT:    movq %rcx, %r8911; X64-NEXT:    sbbq %rsi, %r8912; X64-NEXT:    subq %rdx, %rdi913; X64-NEXT:    sbbq %rcx, %rsi914; X64-NEXT:    cmovlq %rdi, %rax915; X64-NEXT:    cmovlq %rsi, %r8916; X64-NEXT:    movq %r8, %rdx917; X64-NEXT:    retq918  %cmp = icmp slt i128 %a, %b919  %ab = sub i128 %a, %b920  %ba = sub i128 %b, %a921  %sel = select i1 %cmp, i128 %ab, i128 %ba922  ret i128 %sel923}924 925;926; nabs(sub_nsw(x, y)) -> nabds(a,b)927;928 929define i8 @abd_subnsw_i8(i8 %a, i8 %b) nounwind {930; X86-LABEL: abd_subnsw_i8:931; X86:       # %bb.0:932; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx933; X86-NEXT:    subb {{[0-9]+}}(%esp), %cl934; X86-NEXT:    movl %ecx, %eax935; X86-NEXT:    sarb $7, %al936; X86-NEXT:    xorb %al, %cl937; X86-NEXT:    subb %cl, %al938; X86-NEXT:    retl939;940; X64-LABEL: abd_subnsw_i8:941; X64:       # %bb.0:942; X64-NEXT:    subb %sil, %dil943; X64-NEXT:    movl %edi, %eax944; X64-NEXT:    sarb $7, %al945; X64-NEXT:    xorb %al, %dil946; X64-NEXT:    subb %dil, %al947; X64-NEXT:    retq948  %sub = sub nsw i8 %a, %b949  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 false)950  %nabs = sub i8 0, %abs951  ret i8 %nabs952}953 954define i8 @abd_subnsw_i8_undef(i8 %a, i8 %b) nounwind {955; X86-LABEL: abd_subnsw_i8_undef:956; X86:       # %bb.0:957; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx958; X86-NEXT:    subb {{[0-9]+}}(%esp), %cl959; X86-NEXT:    movl %ecx, %eax960; X86-NEXT:    sarb $7, %al961; X86-NEXT:    xorb %al, %cl962; X86-NEXT:    subb %cl, %al963; X86-NEXT:    retl964;965; X64-LABEL: abd_subnsw_i8_undef:966; X64:       # %bb.0:967; X64-NEXT:    subb %sil, %dil968; X64-NEXT:    movl %edi, %eax969; X64-NEXT:    sarb $7, %al970; X64-NEXT:    xorb %al, %dil971; X64-NEXT:    subb %dil, %al972; X64-NEXT:    retq973  %sub = sub nsw i8 %a, %b974  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 true)975  %nabs = sub i8 0, %abs976  ret i8 %nabs977}978 979define i16 @abd_subnsw_i16(i16 %a, i16 %b) nounwind {980; X86-LABEL: abd_subnsw_i16:981; X86:       # %bb.0:982; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx983; X86-NEXT:    subw {{[0-9]+}}(%esp), %cx984; X86-NEXT:    movl %ecx, %eax985; X86-NEXT:    negw %ax986; X86-NEXT:    cmovnsw %cx, %ax987; X86-NEXT:    retl988;989; X64-LABEL: abd_subnsw_i16:990; X64:       # %bb.0:991; X64-NEXT:    subl %esi, %edi992; X64-NEXT:    movl %edi, %eax993; X64-NEXT:    negw %ax994; X64-NEXT:    cmovnsw %di, %ax995; X64-NEXT:    retq996  %sub = sub nsw i16 %a, %b997  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 false)998  %nabs = sub i16 0, %abs999  ret i16 %nabs1000}1001 1002define i16 @abd_subnsw_i16_undef(i16 %a, i16 %b) nounwind {1003; X86-LABEL: abd_subnsw_i16_undef:1004; X86:       # %bb.0:1005; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx1006; X86-NEXT:    subw {{[0-9]+}}(%esp), %cx1007; X86-NEXT:    movl %ecx, %eax1008; X86-NEXT:    negw %ax1009; X86-NEXT:    cmovnsw %cx, %ax1010; X86-NEXT:    retl1011;1012; X64-LABEL: abd_subnsw_i16_undef:1013; X64:       # %bb.0:1014; X64-NEXT:    subl %esi, %edi1015; X64-NEXT:    movl %edi, %eax1016; X64-NEXT:    negw %ax1017; X64-NEXT:    cmovnsw %di, %ax1018; X64-NEXT:    retq1019  %sub = sub nsw i16 %a, %b1020  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 true)1021  %nabs = sub i16 0, %abs1022  ret i16 %nabs1023}1024 1025define i32 @abd_subnsw_i32(i32 %a, i32 %b) nounwind {1026; X86-LABEL: abd_subnsw_i32:1027; X86:       # %bb.0:1028; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1029; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1030; X86-NEXT:    movl %ecx, %edx1031; X86-NEXT:    subl %eax, %edx1032; X86-NEXT:    subl %ecx, %eax1033; X86-NEXT:    cmovgel %edx, %eax1034; X86-NEXT:    retl1035;1036; X64-LABEL: abd_subnsw_i32:1037; X64:       # %bb.0:1038; X64-NEXT:    movl %edi, %eax1039; X64-NEXT:    subl %esi, %eax1040; X64-NEXT:    subl %edi, %esi1041; X64-NEXT:    cmovll %esi, %eax1042; X64-NEXT:    retq1043  %sub = sub nsw i32 %a, %b1044  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 false)1045  %nabs = sub i32 0, %abs1046  ret i32 %nabs1047}1048 1049define i32 @abd_subnsw_i32_undef(i32 %a, i32 %b) nounwind {1050; X86-LABEL: abd_subnsw_i32_undef:1051; X86:       # %bb.0:1052; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1053; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1054; X86-NEXT:    movl %ecx, %edx1055; X86-NEXT:    subl %eax, %edx1056; X86-NEXT:    subl %ecx, %eax1057; X86-NEXT:    cmovgel %edx, %eax1058; X86-NEXT:    retl1059;1060; X64-LABEL: abd_subnsw_i32_undef:1061; X64:       # %bb.0:1062; X64-NEXT:    movl %edi, %eax1063; X64-NEXT:    subl %esi, %eax1064; X64-NEXT:    subl %edi, %esi1065; X64-NEXT:    cmovll %esi, %eax1066; X64-NEXT:    retq1067  %sub = sub nsw i32 %a, %b1068  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 true)1069  %nabs = sub i32 0, %abs1070  ret i32 %nabs1071}1072 1073define i64 @abd_subnsw_i64(i64 %a, i64 %b) nounwind {1074; X86-LABEL: abd_subnsw_i64:1075; X86:       # %bb.0:1076; X86-NEXT:    pushl %esi1077; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1078; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1079; X86-NEXT:    subl {{[0-9]+}}(%esp), %ecx1080; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %esi1081; X86-NEXT:    movl %esi, %edx1082; X86-NEXT:    sarl $31, %edx1083; X86-NEXT:    xorl %edx, %esi1084; X86-NEXT:    xorl %edx, %ecx1085; X86-NEXT:    movl %edx, %eax1086; X86-NEXT:    subl %ecx, %eax1087; X86-NEXT:    sbbl %esi, %edx1088; X86-NEXT:    popl %esi1089; X86-NEXT:    retl1090;1091; X64-LABEL: abd_subnsw_i64:1092; X64:       # %bb.0:1093; X64-NEXT:    movq %rdi, %rax1094; X64-NEXT:    subq %rsi, %rax1095; X64-NEXT:    subq %rdi, %rsi1096; X64-NEXT:    cmovlq %rsi, %rax1097; X64-NEXT:    retq1098  %sub = sub nsw i64 %a, %b1099  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)1100  %nabs = sub i64 0, %abs1101  ret i64 %nabs1102}1103 1104define i64 @abd_subnsw_i64_undef(i64 %a, i64 %b) nounwind {1105; X86-LABEL: abd_subnsw_i64_undef:1106; X86:       # %bb.0:1107; X86-NEXT:    pushl %esi1108; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1109; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1110; X86-NEXT:    subl {{[0-9]+}}(%esp), %ecx1111; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %esi1112; X86-NEXT:    movl %esi, %edx1113; X86-NEXT:    sarl $31, %edx1114; X86-NEXT:    xorl %edx, %esi1115; X86-NEXT:    xorl %edx, %ecx1116; X86-NEXT:    movl %edx, %eax1117; X86-NEXT:    subl %ecx, %eax1118; X86-NEXT:    sbbl %esi, %edx1119; X86-NEXT:    popl %esi1120; X86-NEXT:    retl1121;1122; X64-LABEL: abd_subnsw_i64_undef:1123; X64:       # %bb.0:1124; X64-NEXT:    movq %rdi, %rax1125; X64-NEXT:    subq %rsi, %rax1126; X64-NEXT:    subq %rdi, %rsi1127; X64-NEXT:    cmovlq %rsi, %rax1128; X64-NEXT:    retq1129  %sub = sub nsw i64 %a, %b1130  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)1131  %nabs = sub i64 0, %abs1132  ret i64 %nabs1133}1134 1135define i128 @abd_subnsw_i128(i128 %a, i128 %b) nounwind {1136; X86-LABEL: abd_subnsw_i128:1137; X86:       # %bb.0:1138; X86-NEXT:    pushl %ebp1139; X86-NEXT:    movl %esp, %ebp1140; X86-NEXT:    pushl %ebx1141; X86-NEXT:    pushl %edi1142; X86-NEXT:    pushl %esi1143; X86-NEXT:    andl $-16, %esp1144; X86-NEXT:    subl $16, %esp1145; X86-NEXT:    movl 32(%ebp), %ecx1146; X86-NEXT:    movl 36(%ebp), %eax1147; X86-NEXT:    movl 24(%ebp), %edi1148; X86-NEXT:    movl 28(%ebp), %edx1149; X86-NEXT:    subl 40(%ebp), %edi1150; X86-NEXT:    sbbl 44(%ebp), %edx1151; X86-NEXT:    sbbl 48(%ebp), %ecx1152; X86-NEXT:    sbbl 52(%ebp), %eax1153; X86-NEXT:    movl %eax, %esi1154; X86-NEXT:    sarl $31, %esi1155; X86-NEXT:    xorl %esi, %eax1156; X86-NEXT:    xorl %esi, %ecx1157; X86-NEXT:    xorl %esi, %edx1158; X86-NEXT:    xorl %esi, %edi1159; X86-NEXT:    movl %esi, %ebx1160; X86-NEXT:    subl %edi, %ebx1161; X86-NEXT:    movl %esi, %edi1162; X86-NEXT:    sbbl %edx, %edi1163; X86-NEXT:    movl %esi, %edx1164; X86-NEXT:    sbbl %ecx, %edx1165; X86-NEXT:    sbbl %eax, %esi1166; X86-NEXT:    movl 8(%ebp), %eax1167; X86-NEXT:    movl %ebx, (%eax)1168; X86-NEXT:    movl %edi, 4(%eax)1169; X86-NEXT:    movl %edx, 8(%eax)1170; X86-NEXT:    movl %esi, 12(%eax)1171; X86-NEXT:    leal -12(%ebp), %esp1172; X86-NEXT:    popl %esi1173; X86-NEXT:    popl %edi1174; X86-NEXT:    popl %ebx1175; X86-NEXT:    popl %ebp1176; X86-NEXT:    retl $41177;1178; X64-LABEL: abd_subnsw_i128:1179; X64:       # %bb.0:1180; X64-NEXT:    subq %rdx, %rdi1181; X64-NEXT:    sbbq %rcx, %rsi1182; X64-NEXT:    movq %rsi, %rdx1183; X64-NEXT:    sarq $63, %rdx1184; X64-NEXT:    xorq %rdx, %rsi1185; X64-NEXT:    xorq %rdx, %rdi1186; X64-NEXT:    movq %rdx, %rax1187; X64-NEXT:    subq %rdi, %rax1188; X64-NEXT:    sbbq %rsi, %rdx1189; X64-NEXT:    retq1190  %sub = sub nsw i128 %a, %b1191  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)1192  %nabs = sub i128 0, %abs1193  ret i128 %nabs1194}1195 1196define i128 @abd_subnsw_i128_undef(i128 %a, i128 %b) nounwind {1197; X86-LABEL: abd_subnsw_i128_undef:1198; X86:       # %bb.0:1199; X86-NEXT:    pushl %ebp1200; X86-NEXT:    movl %esp, %ebp1201; X86-NEXT:    pushl %ebx1202; X86-NEXT:    pushl %edi1203; X86-NEXT:    pushl %esi1204; X86-NEXT:    andl $-16, %esp1205; X86-NEXT:    subl $16, %esp1206; X86-NEXT:    movl 32(%ebp), %ecx1207; X86-NEXT:    movl 36(%ebp), %eax1208; X86-NEXT:    movl 24(%ebp), %edi1209; X86-NEXT:    movl 28(%ebp), %edx1210; X86-NEXT:    subl 40(%ebp), %edi1211; X86-NEXT:    sbbl 44(%ebp), %edx1212; X86-NEXT:    sbbl 48(%ebp), %ecx1213; X86-NEXT:    sbbl 52(%ebp), %eax1214; X86-NEXT:    movl %eax, %esi1215; X86-NEXT:    sarl $31, %esi1216; X86-NEXT:    xorl %esi, %eax1217; X86-NEXT:    xorl %esi, %ecx1218; X86-NEXT:    xorl %esi, %edx1219; X86-NEXT:    xorl %esi, %edi1220; X86-NEXT:    movl %esi, %ebx1221; X86-NEXT:    subl %edi, %ebx1222; X86-NEXT:    movl %esi, %edi1223; X86-NEXT:    sbbl %edx, %edi1224; X86-NEXT:    movl %esi, %edx1225; X86-NEXT:    sbbl %ecx, %edx1226; X86-NEXT:    sbbl %eax, %esi1227; X86-NEXT:    movl 8(%ebp), %eax1228; X86-NEXT:    movl %ebx, (%eax)1229; X86-NEXT:    movl %edi, 4(%eax)1230; X86-NEXT:    movl %edx, 8(%eax)1231; X86-NEXT:    movl %esi, 12(%eax)1232; X86-NEXT:    leal -12(%ebp), %esp1233; X86-NEXT:    popl %esi1234; X86-NEXT:    popl %edi1235; X86-NEXT:    popl %ebx1236; X86-NEXT:    popl %ebp1237; X86-NEXT:    retl $41238;1239; X64-LABEL: abd_subnsw_i128_undef:1240; X64:       # %bb.0:1241; X64-NEXT:    subq %rdx, %rdi1242; X64-NEXT:    sbbq %rcx, %rsi1243; X64-NEXT:    movq %rsi, %rdx1244; X64-NEXT:    sarq $63, %rdx1245; X64-NEXT:    xorq %rdx, %rsi1246; X64-NEXT:    xorq %rdx, %rdi1247; X64-NEXT:    movq %rdx, %rax1248; X64-NEXT:    subq %rdi, %rax1249; X64-NEXT:    sbbq %rsi, %rdx1250; X64-NEXT:    retq1251  %sub = sub nsw i128 %a, %b1252  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)1253  %nabs = sub i128 0, %abs1254  ret i128 %nabs1255}1256 1257declare i8 @llvm.abs.i8(i8, i1)1258declare i16 @llvm.abs.i16(i16, i1)1259declare i32 @llvm.abs.i32(i32, i1)1260declare i64 @llvm.abs.i64(i64, i1)1261declare i128 @llvm.abs.i128(i128, i1)1262 1263declare i8 @llvm.smax.i8(i8, i8)1264declare i16 @llvm.smax.i16(i16, i16)1265declare i32 @llvm.smax.i32(i32, i32)1266declare i64 @llvm.smax.i64(i64, i64)1267 1268declare i8 @llvm.smin.i8(i8, i8)1269declare i16 @llvm.smin.i16(i16, i16)1270declare i32 @llvm.smin.i32(i32, i32)1271declare i64 @llvm.smin.i64(i64, i64)1272