brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.0 KiB · e252d59 Raw
845 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X64,SSE3; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx | FileCheck %s --check-prefixes=X64,AVX,AVX14; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx2 | FileCheck %s --check-prefixes=X64,AVX,AVX25; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X866 7; The i1 parameter is not codegen-relevant right now.8 9declare i8 @llvm.abs.i8(i8, i1)10declare i16 @llvm.abs.i16(i16, i1)11declare i24 @llvm.abs.i24(i24, i1)12declare i32 @llvm.abs.i32(i32, i1)13declare i64 @llvm.abs.i64(i64, i1)14declare i128 @llvm.abs.i128(i128, i1)15 16declare <1 x i32> @llvm.abs.v1i32(<1 x i32>, i1)17declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1)18declare <3 x i32> @llvm.abs.v3i32(<3 x i32>, i1)19declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)20declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)21 22declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1)23declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)24 25define i8 @test_i8(i8 %a) nounwind {26; X64-LABEL: test_i8:27; X64:       # %bb.0:28; X64-NEXT:    movl %edi, %eax29; X64-NEXT:    movl %eax, %ecx30; X64-NEXT:    sarb $7, %cl31; X64-NEXT:    xorb %cl, %al32; X64-NEXT:    subb %cl, %al33; X64-NEXT:    # kill: def $al killed $al killed $eax34; X64-NEXT:    retq35;36; X86-LABEL: test_i8:37; X86:       # %bb.0:38; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax39; X86-NEXT:    movl %eax, %ecx40; X86-NEXT:    sarb $7, %cl41; X86-NEXT:    xorb %cl, %al42; X86-NEXT:    subb %cl, %al43; X86-NEXT:    retl44  %r = call i8 @llvm.abs.i8(i8 %a, i1 false)45  ret i8 %r46}47 48define i16 @test_i16(i16 %a) nounwind {49; X64-LABEL: test_i16:50; X64:       # %bb.0:51; X64-NEXT:    movl %edi, %eax52; X64-NEXT:    negw %ax53; X64-NEXT:    cmovsw %di, %ax54; X64-NEXT:    retq55;56; X86-LABEL: test_i16:57; X86:       # %bb.0:58; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx59; X86-NEXT:    movl %ecx, %eax60; X86-NEXT:    negw %ax61; X86-NEXT:    cmovsw %cx, %ax62; X86-NEXT:    retl63  %r = call i16 @llvm.abs.i16(i16 %a, i1 false)64  ret i16 %r65}66 67define i24 @test_i24(i24 %a) nounwind {68; X64-LABEL: test_i24:69; X64:       # %bb.0:70; X64-NEXT:    shll $8, %edi71; X64-NEXT:    sarl $8, %edi72; X64-NEXT:    movl %edi, %eax73; X64-NEXT:    negl %eax74; X64-NEXT:    cmovsl %edi, %eax75; X64-NEXT:    retq76;77; X86-LABEL: test_i24:78; X86:       # %bb.0:79; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx80; X86-NEXT:    shll $8, %ecx81; X86-NEXT:    sarl $8, %ecx82; X86-NEXT:    movl %ecx, %eax83; X86-NEXT:    negl %eax84; X86-NEXT:    cmovsl %ecx, %eax85; X86-NEXT:    retl86  %r = call i24 @llvm.abs.i24(i24 %a, i1 false)87  ret i24 %r88}89 90define i32 @test_i32(i32 %a) nounwind {91; X64-LABEL: test_i32:92; X64:       # %bb.0:93; X64-NEXT:    movl %edi, %eax94; X64-NEXT:    negl %eax95; X64-NEXT:    cmovsl %edi, %eax96; X64-NEXT:    retq97;98; X86-LABEL: test_i32:99; X86:       # %bb.0:100; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx101; X86-NEXT:    movl %ecx, %eax102; X86-NEXT:    negl %eax103; X86-NEXT:    cmovsl %ecx, %eax104; X86-NEXT:    retl105  %r = call i32 @llvm.abs.i32(i32 %a, i1 false)106  ret i32 %r107}108 109define i64 @test_i64(i64 %a) nounwind {110; X64-LABEL: test_i64:111; X64:       # %bb.0:112; X64-NEXT:    movq %rdi, %rax113; X64-NEXT:    negq %rax114; X64-NEXT:    cmovsq %rdi, %rax115; X64-NEXT:    retq116;117; X86-LABEL: test_i64:118; X86:       # %bb.0:119; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx120; X86-NEXT:    movl %edx, %ecx121; X86-NEXT:    sarl $31, %ecx122; X86-NEXT:    xorl %ecx, %edx123; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax124; X86-NEXT:    xorl %ecx, %eax125; X86-NEXT:    subl %ecx, %eax126; X86-NEXT:    sbbl %ecx, %edx127; X86-NEXT:    retl128  %r = call i64 @llvm.abs.i64(i64 %a, i1 false)129  ret i64 %r130}131 132define i128 @test_i128(i128 %a) nounwind {133; X64-LABEL: test_i128:134; X64:       # %bb.0:135; X64-NEXT:    movq %rsi, %rdx136; X64-NEXT:    movq %rdi, %rax137; X64-NEXT:    movq %rsi, %rcx138; X64-NEXT:    sarq $63, %rcx139; X64-NEXT:    xorq %rcx, %rdx140; X64-NEXT:    xorq %rcx, %rax141; X64-NEXT:    subq %rcx, %rax142; X64-NEXT:    sbbq %rcx, %rdx143; X64-NEXT:    retq144;145; X86-LABEL: test_i128:146; X86:       # %bb.0:147; X86-NEXT:    pushl %ebp148; X86-NEXT:    movl %esp, %ebp149; X86-NEXT:    pushl %edi150; X86-NEXT:    pushl %esi151; X86-NEXT:    andl $-16, %esp152; X86-NEXT:    movl 36(%ebp), %ecx153; X86-NEXT:    movl %ecx, %eax154; X86-NEXT:    sarl $31, %eax155; X86-NEXT:    xorl %eax, %ecx156; X86-NEXT:    movl 32(%ebp), %edx157; X86-NEXT:    xorl %eax, %edx158; X86-NEXT:    movl 28(%ebp), %esi159; X86-NEXT:    xorl %eax, %esi160; X86-NEXT:    movl 24(%ebp), %edi161; X86-NEXT:    xorl %eax, %edi162; X86-NEXT:    subl %eax, %edi163; X86-NEXT:    sbbl %eax, %esi164; X86-NEXT:    sbbl %eax, %edx165; X86-NEXT:    sbbl %eax, %ecx166; X86-NEXT:    movl 8(%ebp), %eax167; X86-NEXT:    movl %edi, (%eax)168; X86-NEXT:    movl %esi, 4(%eax)169; X86-NEXT:    movl %edx, 8(%eax)170; X86-NEXT:    movl %ecx, 12(%eax)171; X86-NEXT:    leal -8(%ebp), %esp172; X86-NEXT:    popl %esi173; X86-NEXT:    popl %edi174; X86-NEXT:    popl %ebp175; X86-NEXT:    retl $4176  %r = call i128 @llvm.abs.i128(i128 %a, i1 false)177  ret i128 %r178}179 180define <1 x i32> @test_v1i32(<1 x i32> %a) nounwind {181; X64-LABEL: test_v1i32:182; X64:       # %bb.0:183; X64-NEXT:    movl %edi, %eax184; X64-NEXT:    negl %eax185; X64-NEXT:    cmovsl %edi, %eax186; X64-NEXT:    retq187;188; X86-LABEL: test_v1i32:189; X86:       # %bb.0:190; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx191; X86-NEXT:    movl %ecx, %eax192; X86-NEXT:    negl %eax193; X86-NEXT:    cmovsl %ecx, %eax194; X86-NEXT:    retl195  %r = call <1 x i32> @llvm.abs.v1i32(<1 x i32> %a, i1 false)196  ret <1 x i32> %r197}198 199define <2 x i32> @test_v2i32(<2 x i32> %a) nounwind {200; SSE-LABEL: test_v2i32:201; SSE:       # %bb.0:202; SSE-NEXT:    movdqa %xmm0, %xmm1203; SSE-NEXT:    psrad $31, %xmm1204; SSE-NEXT:    pxor %xmm1, %xmm0205; SSE-NEXT:    psubd %xmm1, %xmm0206; SSE-NEXT:    retq207;208; AVX-LABEL: test_v2i32:209; AVX:       # %bb.0:210; AVX-NEXT:    vpabsd %xmm0, %xmm0211; AVX-NEXT:    retq212;213; X86-LABEL: test_v2i32:214; X86:       # %bb.0:215; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx216; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx217; X86-NEXT:    movl %edx, %eax218; X86-NEXT:    negl %eax219; X86-NEXT:    cmovsl %edx, %eax220; X86-NEXT:    movl %ecx, %edx221; X86-NEXT:    negl %edx222; X86-NEXT:    cmovsl %ecx, %edx223; X86-NEXT:    retl224  %r = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %a, i1 false)225  ret <2 x i32> %r226}227 228define <3 x i32> @test_v3i32(<3 x i32> %a) nounwind {229; SSE-LABEL: test_v3i32:230; SSE:       # %bb.0:231; SSE-NEXT:    movdqa %xmm0, %xmm1232; SSE-NEXT:    psrad $31, %xmm1233; SSE-NEXT:    pxor %xmm1, %xmm0234; SSE-NEXT:    psubd %xmm1, %xmm0235; SSE-NEXT:    retq236;237; AVX-LABEL: test_v3i32:238; AVX:       # %bb.0:239; AVX-NEXT:    vpabsd %xmm0, %xmm0240; AVX-NEXT:    retq241;242; X86-LABEL: test_v3i32:243; X86:       # %bb.0:244; X86-NEXT:    pushl %esi245; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi246; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx247; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx248; X86-NEXT:    movl %edx, %eax249; X86-NEXT:    negl %eax250; X86-NEXT:    cmovsl %edx, %eax251; X86-NEXT:    movl %ecx, %edx252; X86-NEXT:    negl %edx253; X86-NEXT:    cmovsl %ecx, %edx254; X86-NEXT:    movl %esi, %ecx255; X86-NEXT:    negl %ecx256; X86-NEXT:    cmovsl %esi, %ecx257; X86-NEXT:    popl %esi258; X86-NEXT:    retl259  %r = call <3 x i32> @llvm.abs.v3i32(<3 x i32> %a, i1 false)260  ret <3 x i32> %r261}262 263define <4 x i32> @test_v4i32(<4 x i32> %a) nounwind {264; SSE-LABEL: test_v4i32:265; SSE:       # %bb.0:266; SSE-NEXT:    movdqa %xmm0, %xmm1267; SSE-NEXT:    psrad $31, %xmm1268; SSE-NEXT:    pxor %xmm1, %xmm0269; SSE-NEXT:    psubd %xmm1, %xmm0270; SSE-NEXT:    retq271;272; AVX-LABEL: test_v4i32:273; AVX:       # %bb.0:274; AVX-NEXT:    vpabsd %xmm0, %xmm0275; AVX-NEXT:    retq276;277; X86-LABEL: test_v4i32:278; X86:       # %bb.0:279; X86-NEXT:    pushl %ebx280; X86-NEXT:    pushl %edi281; X86-NEXT:    pushl %esi282; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax283; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx284; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi285; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi286; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx287; X86-NEXT:    movl %ebx, %edx288; X86-NEXT:    negl %edx289; X86-NEXT:    cmovsl %ebx, %edx290; X86-NEXT:    movl %edi, %ebx291; X86-NEXT:    negl %ebx292; X86-NEXT:    cmovsl %edi, %ebx293; X86-NEXT:    movl %esi, %edi294; X86-NEXT:    negl %edi295; X86-NEXT:    cmovsl %esi, %edi296; X86-NEXT:    movl %ecx, %esi297; X86-NEXT:    negl %esi298; X86-NEXT:    cmovsl %ecx, %esi299; X86-NEXT:    movl %esi, 12(%eax)300; X86-NEXT:    movl %edi, 8(%eax)301; X86-NEXT:    movl %ebx, 4(%eax)302; X86-NEXT:    movl %edx, (%eax)303; X86-NEXT:    popl %esi304; X86-NEXT:    popl %edi305; X86-NEXT:    popl %ebx306; X86-NEXT:    retl $4307  %r = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a, i1 false)308  ret <4 x i32> %r309}310 311define <8 x i32> @test_v8i32(<8 x i32> %a) nounwind {312; SSE-LABEL: test_v8i32:313; SSE:       # %bb.0:314; SSE-NEXT:    movdqa %xmm0, %xmm2315; SSE-NEXT:    psrad $31, %xmm2316; SSE-NEXT:    pxor %xmm2, %xmm0317; SSE-NEXT:    psubd %xmm2, %xmm0318; SSE-NEXT:    movdqa %xmm1, %xmm2319; SSE-NEXT:    psrad $31, %xmm2320; SSE-NEXT:    pxor %xmm2, %xmm1321; SSE-NEXT:    psubd %xmm2, %xmm1322; SSE-NEXT:    retq323;324; AVX1-LABEL: test_v8i32:325; AVX1:       # %bb.0:326; AVX1-NEXT:    vpabsd %xmm0, %xmm1327; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0328; AVX1-NEXT:    vpabsd %xmm0, %xmm0329; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0330; AVX1-NEXT:    retq331;332; AVX2-LABEL: test_v8i32:333; AVX2:       # %bb.0:334; AVX2-NEXT:    vpabsd %ymm0, %ymm0335; AVX2-NEXT:    retq336;337; X86-LABEL: test_v8i32:338; X86:       # %bb.0:339; X86-NEXT:    pushl %ebp340; X86-NEXT:    pushl %ebx341; X86-NEXT:    pushl %edi342; X86-NEXT:    pushl %esi343; X86-NEXT:    subl $8, %esp344; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax345; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx346; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp347; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi348; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi349; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx350; X86-NEXT:    movl %edx, %ecx351; X86-NEXT:    negl %ecx352; X86-NEXT:    cmovsl %edx, %ecx353; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill354; X86-NEXT:    movl %esi, %ecx355; X86-NEXT:    negl %ecx356; X86-NEXT:    cmovsl %esi, %ecx357; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill358; X86-NEXT:    movl %edi, %esi359; X86-NEXT:    negl %esi360; X86-NEXT:    cmovsl %edi, %esi361; X86-NEXT:    movl %ebp, %edi362; X86-NEXT:    negl %edi363; X86-NEXT:    cmovsl %ebp, %edi364; X86-NEXT:    movl %ebx, %ebp365; X86-NEXT:    negl %ebp366; X86-NEXT:    cmovsl %ebx, %ebp367; X86-NEXT:    movl %eax, %ebx368; X86-NEXT:    negl %ebx369; X86-NEXT:    cmovsl %eax, %ebx370; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx371; X86-NEXT:    movl %ecx, %eax372; X86-NEXT:    negl %eax373; X86-NEXT:    cmovsl %ecx, %eax374; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx375; X86-NEXT:    movl %edx, %ecx376; X86-NEXT:    negl %ecx377; X86-NEXT:    cmovsl %edx, %ecx378; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx379; X86-NEXT:    movl %ecx, 28(%edx)380; X86-NEXT:    movl %eax, 24(%edx)381; X86-NEXT:    movl %ebx, 20(%edx)382; X86-NEXT:    movl %ebp, 16(%edx)383; X86-NEXT:    movl %edi, 12(%edx)384; X86-NEXT:    movl %esi, 8(%edx)385; X86-NEXT:    movl (%esp), %eax # 4-byte Reload386; X86-NEXT:    movl %eax, 4(%edx)387; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload388; X86-NEXT:    movl %eax, (%edx)389; X86-NEXT:    movl %edx, %eax390; X86-NEXT:    addl $8, %esp391; X86-NEXT:    popl %esi392; X86-NEXT:    popl %edi393; X86-NEXT:    popl %ebx394; X86-NEXT:    popl %ebp395; X86-NEXT:    retl $4396  %r = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %a, i1 false)397  ret <8 x i32> %r398}399 400define <8 x i16> @test_v8i16(<8 x i16> %a) nounwind {401; SSE-LABEL: test_v8i16:402; SSE:       # %bb.0:403; SSE-NEXT:    pxor %xmm1, %xmm1404; SSE-NEXT:    psubw %xmm0, %xmm1405; SSE-NEXT:    pmaxsw %xmm1, %xmm0406; SSE-NEXT:    retq407;408; AVX-LABEL: test_v8i16:409; AVX:       # %bb.0:410; AVX-NEXT:    vpabsw %xmm0, %xmm0411; AVX-NEXT:    retq412;413; X86-LABEL: test_v8i16:414; X86:       # %bb.0:415; X86-NEXT:    pushl %ebp416; X86-NEXT:    pushl %ebx417; X86-NEXT:    pushl %edi418; X86-NEXT:    pushl %esi419; X86-NEXT:    pushl %eax420; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax421; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ebx422; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ebp423; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edi424; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %esi425; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx426; X86-NEXT:    movl %edx, %ecx427; X86-NEXT:    negw %cx428; X86-NEXT:    cmovsw %dx, %cx429; X86-NEXT:    movw %cx, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill430; X86-NEXT:    movl %esi, %ecx431; X86-NEXT:    negw %cx432; X86-NEXT:    cmovsw %si, %cx433; X86-NEXT:    movw %cx, (%esp) # 2-byte Spill434; X86-NEXT:    movl %edi, %esi435; X86-NEXT:    negw %si436; X86-NEXT:    cmovsw %di, %si437; X86-NEXT:    movl %ebp, %edi438; X86-NEXT:    negw %di439; X86-NEXT:    cmovsw %bp, %di440; X86-NEXT:    movl %ebx, %ebp441; X86-NEXT:    negw %bp442; X86-NEXT:    cmovsw %bx, %bp443; X86-NEXT:    movl %eax, %ebx444; X86-NEXT:    negw %bx445; X86-NEXT:    cmovsw %ax, %bx446; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx447; X86-NEXT:    movl %ecx, %eax448; X86-NEXT:    negw %ax449; X86-NEXT:    cmovsw %cx, %ax450; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %edx451; X86-NEXT:    movl %edx, %ecx452; X86-NEXT:    negw %cx453; X86-NEXT:    cmovsw %dx, %cx454; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx455; X86-NEXT:    movw %cx, 14(%edx)456; X86-NEXT:    movw %ax, 12(%edx)457; X86-NEXT:    movw %bx, 10(%edx)458; X86-NEXT:    movw %bp, 8(%edx)459; X86-NEXT:    movw %di, 6(%edx)460; X86-NEXT:    movw %si, 4(%edx)461; X86-NEXT:    movzwl (%esp), %eax # 2-byte Folded Reload462; X86-NEXT:    movw %ax, 2(%edx)463; X86-NEXT:    movzwl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 2-byte Folded Reload464; X86-NEXT:    movw %ax, (%edx)465; X86-NEXT:    movl %edx, %eax466; X86-NEXT:    addl $4, %esp467; X86-NEXT:    popl %esi468; X86-NEXT:    popl %edi469; X86-NEXT:    popl %ebx470; X86-NEXT:    popl %ebp471; X86-NEXT:    retl $4472  %r = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %a, i1 false)473  ret <8 x i16> %r474}475 476define <16 x i8> @test_v16i8(<16 x i8> %a) nounwind {477; SSE-LABEL: test_v16i8:478; SSE:       # %bb.0:479; SSE-NEXT:    pxor %xmm1, %xmm1480; SSE-NEXT:    psubb %xmm0, %xmm1481; SSE-NEXT:    pminub %xmm1, %xmm0482; SSE-NEXT:    retq483;484; AVX-LABEL: test_v16i8:485; AVX:       # %bb.0:486; AVX-NEXT:    vpabsb %xmm0, %xmm0487; AVX-NEXT:    retq488;489; X86-LABEL: test_v16i8:490; X86:       # %bb.0:491; X86-NEXT:    pushl %ebx492; X86-NEXT:    subl $12, %esp493; X86-NEXT:    movb {{[0-9]+}}(%esp), %bh494; X86-NEXT:    movb {{[0-9]+}}(%esp), %bl495; X86-NEXT:    movb {{[0-9]+}}(%esp), %dh496; X86-NEXT:    movb {{[0-9]+}}(%esp), %ch497; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah498; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl499; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl500; X86-NEXT:    movb %cl, %al501; X86-NEXT:    sarb $7, %al502; X86-NEXT:    xorb %al, %cl503; X86-NEXT:    subb %al, %cl504; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill505; X86-NEXT:    movb %dl, %al506; X86-NEXT:    sarb $7, %al507; X86-NEXT:    xorb %al, %dl508; X86-NEXT:    subb %al, %dl509; X86-NEXT:    movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill510; X86-NEXT:    movb %ah, %al511; X86-NEXT:    sarb $7, %al512; X86-NEXT:    xorb %al, %ah513; X86-NEXT:    subb %al, %ah514; X86-NEXT:    movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill515; X86-NEXT:    movb %ch, %al516; X86-NEXT:    sarb $7, %al517; X86-NEXT:    xorb %al, %ch518; X86-NEXT:    subb %al, %ch519; X86-NEXT:    movb %ch, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill520; X86-NEXT:    movb %dh, %al521; X86-NEXT:    sarb $7, %al522; X86-NEXT:    xorb %al, %dh523; X86-NEXT:    subb %al, %dh524; X86-NEXT:    movb %dh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill525; X86-NEXT:    movl %ebx, %eax526; X86-NEXT:    sarb $7, %al527; X86-NEXT:    xorb %al, %bl528; X86-NEXT:    subb %al, %bl529; X86-NEXT:    movb %bl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill530; X86-NEXT:    movb %bh, %al531; X86-NEXT:    sarb $7, %al532; X86-NEXT:    xorb %al, %bh533; X86-NEXT:    subb %al, %bh534; X86-NEXT:    movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill535; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx536; X86-NEXT:    movl %ecx, %eax537; X86-NEXT:    sarb $7, %al538; X86-NEXT:    xorb %al, %cl539; X86-NEXT:    subb %al, %cl540; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill541; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx542; X86-NEXT:    movl %ecx, %eax543; X86-NEXT:    sarb $7, %al544; X86-NEXT:    xorb %al, %cl545; X86-NEXT:    subb %al, %cl546; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill547; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx548; X86-NEXT:    movl %ecx, %eax549; X86-NEXT:    sarb $7, %al550; X86-NEXT:    xorb %al, %cl551; X86-NEXT:    subb %al, %cl552; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill553; X86-NEXT:    movb {{[0-9]+}}(%esp), %bh554; X86-NEXT:    movb %bh, %al555; X86-NEXT:    sarb $7, %al556; X86-NEXT:    xorb %al, %bh557; X86-NEXT:    subb %al, %bh558; X86-NEXT:    movb {{[0-9]+}}(%esp), %bl559; X86-NEXT:    movl %ebx, %eax560; X86-NEXT:    sarb $7, %al561; X86-NEXT:    xorb %al, %bl562; X86-NEXT:    subb %al, %bl563; X86-NEXT:    movb {{[0-9]+}}(%esp), %dh564; X86-NEXT:    movb %dh, %al565; X86-NEXT:    sarb $7, %al566; X86-NEXT:    xorb %al, %dh567; X86-NEXT:    subb %al, %dh568; X86-NEXT:    movb {{[0-9]+}}(%esp), %ch569; X86-NEXT:    movb %ch, %al570; X86-NEXT:    sarb $7, %al571; X86-NEXT:    xorb %al, %ch572; X86-NEXT:    subb %al, %ch573; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl574; X86-NEXT:    movl %edx, %eax575; X86-NEXT:    sarb $7, %al576; X86-NEXT:    xorb %al, %dl577; X86-NEXT:    subb %al, %dl578; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl579; X86-NEXT:    movl %ecx, %eax580; X86-NEXT:    sarb $7, %al581; X86-NEXT:    xorb %al, %cl582; X86-NEXT:    subb %al, %cl583; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax584; X86-NEXT:    movb %cl, 15(%eax)585; X86-NEXT:    movb %dl, 14(%eax)586; X86-NEXT:    movb %ch, 13(%eax)587; X86-NEXT:    movb %dh, 12(%eax)588; X86-NEXT:    movb %bl, 11(%eax)589; X86-NEXT:    movb %bh, 10(%eax)590; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload591; X86-NEXT:    movb %cl, 9(%eax)592; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload593; X86-NEXT:    movb %cl, 8(%eax)594; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload595; X86-NEXT:    movb %cl, 7(%eax)596; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload597; X86-NEXT:    movb %cl, 6(%eax)598; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload599; X86-NEXT:    movb %cl, 5(%eax)600; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload601; X86-NEXT:    movb %cl, 4(%eax)602; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload603; X86-NEXT:    movb %cl, 3(%eax)604; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload605; X86-NEXT:    movb %cl, 2(%eax)606; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload607; X86-NEXT:    movb %cl, 1(%eax)608; X86-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload609; X86-NEXT:    movb %cl, (%eax)610; X86-NEXT:    addl $12, %esp611; X86-NEXT:    popl %ebx612; X86-NEXT:    retl $4613  %r = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %a, i1 false)614  ret <16 x i8> %r615}616 617define i16 @test_sextinreg_i16(i16 %a) nounwind {618; X64-LABEL: test_sextinreg_i16:619; X64:       # %bb.0:620; X64-NEXT:    movsbl %dil, %ecx621; X64-NEXT:    movl %ecx, %eax622; X64-NEXT:    negw %ax623; X64-NEXT:    cmovsw %cx, %ax624; X64-NEXT:    retq625;626; X86-LABEL: test_sextinreg_i16:627; X86:       # %bb.0:628; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx629; X86-NEXT:    movl %ecx, %eax630; X86-NEXT:    negw %ax631; X86-NEXT:    cmovsw %cx, %ax632; X86-NEXT:    retl633  %shl = shl i16 %a, 8634  %ashr = ashr exact i16 %shl, 8635  %res = call i16 @llvm.abs.i16(i16 %ashr, i1 true)636  ret i16 %res637}638 639define i32 @test_sextinreg_i32(i32 %a) nounwind {640; X64-LABEL: test_sextinreg_i32:641; X64:       # %bb.0:642; X64-NEXT:    movswl %di, %ecx643; X64-NEXT:    movl %ecx, %eax644; X64-NEXT:    negl %eax645; X64-NEXT:    cmovsl %ecx, %eax646; X64-NEXT:    retq647;648; X86-LABEL: test_sextinreg_i32:649; X86:       # %bb.0:650; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx651; X86-NEXT:    movl %ecx, %eax652; X86-NEXT:    negl %eax653; X86-NEXT:    cmovsl %ecx, %eax654; X86-NEXT:    retl655  %shl = shl i32 %a, 16656  %ashr = ashr exact i32 %shl, 16657  %res = call i32 @llvm.abs.i32(i32 %ashr, i1 true)658  ret i32 %res659}660 661define i64 @test_sextinreg_i64(i64 %a) nounwind {662; X64-LABEL: test_sextinreg_i64:663; X64:       # %bb.0:664; X64-NEXT:    movl %edi, %eax665; X64-NEXT:    negl %eax666; X64-NEXT:    cmovsl %edi, %eax667; X64-NEXT:    retq668;669; X86-LABEL: test_sextinreg_i64:670; X86:       # %bb.0:671; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx672; X86-NEXT:    movl %ecx, %eax673; X86-NEXT:    negl %eax674; X86-NEXT:    cmovsl %ecx, %eax675; X86-NEXT:    xorl %edx, %edx676; X86-NEXT:    retl677  %shl = shl i64 %a, 32678  %ashr = ashr exact i64 %shl, 32679  %res = call i64 @llvm.abs.i64(i64 %ashr, i1 true)680  ret i64 %res681}682 683define i128 @test_sextinreg_i128(i128 %a) nounwind {684; X64-LABEL: test_sextinreg_i128:685; X64:       # %bb.0:686; X64-NEXT:    movq %rdi, %rax687; X64-NEXT:    negq %rax688; X64-NEXT:    cmovsq %rdi, %rax689; X64-NEXT:    xorl %edx, %edx690; X64-NEXT:    retq691;692; X86-LABEL: test_sextinreg_i128:693; X86:       # %bb.0:694; X86-NEXT:    pushl %ebp695; X86-NEXT:    movl %esp, %ebp696; X86-NEXT:    pushl %esi697; X86-NEXT:    andl $-16, %esp698; X86-NEXT:    subl $16, %esp699; X86-NEXT:    movl 8(%ebp), %eax700; X86-NEXT:    movl 28(%ebp), %ecx701; X86-NEXT:    movl %ecx, %edx702; X86-NEXT:    sarl $31, %edx703; X86-NEXT:    xorl %edx, %ecx704; X86-NEXT:    movl 24(%ebp), %esi705; X86-NEXT:    xorl %edx, %esi706; X86-NEXT:    subl %edx, %esi707; X86-NEXT:    sbbl %edx, %ecx708; X86-NEXT:    movl %esi, (%eax)709; X86-NEXT:    movl %ecx, 4(%eax)710; X86-NEXT:    movl $0, 12(%eax)711; X86-NEXT:    movl $0, 8(%eax)712; X86-NEXT:    leal -4(%ebp), %esp713; X86-NEXT:    popl %esi714; X86-NEXT:    popl %ebp715; X86-NEXT:    retl $4716  %shl = shl i128 %a, 64717  %ashr = ashr exact i128 %shl, 64718  %res = call i128 @llvm.abs.i128(i128 %ashr, i1 true)719  ret i128 %res720}721 722define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {723; X64-LABEL: test_minsigned_i8:724; X64:       # %bb.0:725; X64-NEXT:    movl %edi, %eax726; X64-NEXT:    sarb $7, %al727; X64-NEXT:    movl %edi, %ecx728; X64-NEXT:    xorb %al, %cl729; X64-NEXT:    subb %al, %cl730; X64-NEXT:    cmpb $-128, %dil731; X64-NEXT:    movzbl %cl, %eax732; X64-NEXT:    cmovel %esi, %eax733; X64-NEXT:    # kill: def $al killed $al killed $eax734; X64-NEXT:    retq735;736; X86-LABEL: test_minsigned_i8:737; X86:       # %bb.0:738; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax739; X86-NEXT:    cmpb $-128, %al740; X86-NEXT:    jne .LBB17_1741; X86-NEXT:  # %bb.2:742; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax743; X86-NEXT:    # kill: def $al killed $al killed $eax744; X86-NEXT:    retl745; X86-NEXT:  .LBB17_1:746; X86-NEXT:    movl %eax, %ecx747; X86-NEXT:    sarb $7, %cl748; X86-NEXT:    xorb %cl, %al749; X86-NEXT:    subb %cl, %al750; X86-NEXT:    movzbl %al, %eax751; X86-NEXT:    # kill: def $al killed $al killed $eax752; X86-NEXT:    retl753  %lim = icmp eq i8 %a0, -128754  %abs = tail call i8 @llvm.abs.i8(i8 %a0, i1 false)755  %res = select i1 %lim, i8 %a1, i8 %abs756  ret i8 %res757}758 759define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind {760; X64-LABEL: test_minsigned_i16:761; X64:       # %bb.0:762; X64-NEXT:    movzwl %di, %ecx763; X64-NEXT:    movl %ecx, %eax764; X64-NEXT:    negw %ax765; X64-NEXT:    cmovsw %cx, %ax766; X64-NEXT:    cmpl $32768, %ecx # imm = 0x8000767; X64-NEXT:    cmovel %esi, %eax768; X64-NEXT:    # kill: def $ax killed $ax killed $eax769; X64-NEXT:    retq770;771; X86-LABEL: test_minsigned_i16:772; X86:       # %bb.0:773; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx774; X86-NEXT:    movl %ecx, %eax775; X86-NEXT:    negw %ax776; X86-NEXT:    cmovsw %cx, %ax777; X86-NEXT:    cmpl $32768, %ecx # imm = 0x8000778; X86-NEXT:    jne .LBB18_2779; X86-NEXT:  # %bb.1:780; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax781; X86-NEXT:  .LBB18_2:782; X86-NEXT:    retl783  %lim = icmp eq i16 %a0, -32768784  %abs = tail call i16 @llvm.abs.i16(i16 %a0, i1 false)785  %res = select i1 %lim, i16 %a1, i16 %abs786  ret i16 %res787}788 789define i32 @test_minsigned_i32(i32 %a0, i32 %a1) nounwind {790; X64-LABEL: test_minsigned_i32:791; X64:       # %bb.0:792; X64-NEXT:    movl %edi, %eax793; X64-NEXT:    negl %eax794; X64-NEXT:    cmovsl %edi, %eax795; X64-NEXT:    cmovol %esi, %eax796; X64-NEXT:    retq797;798; X86-LABEL: test_minsigned_i32:799; X86:       # %bb.0:800; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx801; X86-NEXT:    movl %ecx, %eax802; X86-NEXT:    negl %eax803; X86-NEXT:    cmovsl %ecx, %eax804; X86-NEXT:    cmovol {{[0-9]+}}(%esp), %eax805; X86-NEXT:    retl806  %lim = icmp eq i32 %a0, -2147483648807  %abs = tail call i32 @llvm.abs.i32(i32 %a0, i1 false)808  %res = select i1 %lim, i32 %a1, i32 %abs809  ret i32 %res810}811 812define i64 @test_minsigned_i64(i64 %a0, i64 %a1) nounwind {813; X64-LABEL: test_minsigned_i64:814; X64:       # %bb.0:815; X64-NEXT:    movq %rdi, %rax816; X64-NEXT:    negq %rax817; X64-NEXT:    cmovsq %rdi, %rax818; X64-NEXT:    cmovoq %rsi, %rax819; X64-NEXT:    retq820;821; X86-LABEL: test_minsigned_i64:822; X86:       # %bb.0:823; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx824; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax825; X86-NEXT:    leal -2147483648(%edx), %ecx826; X86-NEXT:    orl %eax, %ecx827; X86-NEXT:    jne .LBB20_1828; X86-NEXT:  # %bb.2: # %select.end829; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx830; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax831; X86-NEXT:    retl832; X86-NEXT:  .LBB20_1: # %select.false.sink833; X86-NEXT:    movl %edx, %ecx834; X86-NEXT:    sarl $31, %ecx835; X86-NEXT:    xorl %ecx, %edx836; X86-NEXT:    xorl %ecx, %eax837; X86-NEXT:    subl %ecx, %eax838; X86-NEXT:    sbbl %ecx, %edx839; X86-NEXT:    retl840  %lim = icmp eq i64 %a0, -9223372036854775808841  %abs = tail call i64 @llvm.abs.i64(i64 %a0, i1 false)842  %res = select i1 %lim, i64 %a1, i64 %abs843  ret i64 %res844}845