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