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