1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X64,SSE 3; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx | FileCheck %s --check-prefixes=X64,AVX,AVX1 4; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx2 | FileCheck %s --check-prefixes=X64,AVX,AVX2 5; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86 6 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, %eax 29; X64-NEXT: movl %eax, %ecx 30; X64-NEXT: sarb $7, %cl 31; X64-NEXT: xorb %cl, %al 32; X64-NEXT: subb %cl, %al 33; X64-NEXT: # kill: def $al killed $al killed $eax 34; X64-NEXT: retq 35; 36; X86-LABEL: test_i8: 37; X86: # %bb.0: 38; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 39; X86-NEXT: movl %eax, %ecx 40; X86-NEXT: sarb $7, %cl 41; X86-NEXT: xorb %cl, %al 42; X86-NEXT: subb %cl, %al 43; X86-NEXT: retl 44 %r = call i8 @llvm.abs.i8(i8 %a, i1 false) 45 ret i8 %r 46} 47 48define i16 @test_i16(i16 %a) nounwind { 49; X64-LABEL: test_i16: 50; X64: # %bb.0: 51; X64-NEXT: movl %edi, %eax 52; X64-NEXT: negw %ax 53; X64-NEXT: cmovsw %di, %ax 54; X64-NEXT: retq 55; 56; X86-LABEL: test_i16: 57; X86: # %bb.0: 58; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 59; X86-NEXT: movl %ecx, %eax 60; X86-NEXT: negw %ax 61; X86-NEXT: cmovsw %cx, %ax 62; X86-NEXT: retl 63 %r = call i16 @llvm.abs.i16(i16 %a, i1 false) 64 ret i16 %r 65} 66 67define i24 @test_i24(i24 %a) nounwind { 68; X64-LABEL: test_i24: 69; X64: # %bb.0: 70; X64-NEXT: shll $8, %edi 71; X64-NEXT: sarl $8, %edi 72; X64-NEXT: movl %edi, %eax 73; X64-NEXT: negl %eax 74; X64-NEXT: cmovsl %edi, %eax 75; X64-NEXT: retq 76; 77; X86-LABEL: test_i24: 78; X86: # %bb.0: 79; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 80; X86-NEXT: shll $8, %ecx 81; X86-NEXT: sarl $8, %ecx 82; X86-NEXT: movl %ecx, %eax 83; X86-NEXT: negl %eax 84; X86-NEXT: cmovsl %ecx, %eax 85; X86-NEXT: retl 86 %r = call i24 @llvm.abs.i24(i24 %a, i1 false) 87 ret i24 %r 88} 89 90define i32 @test_i32(i32 %a) nounwind { 91; X64-LABEL: test_i32: 92; X64: # %bb.0: 93; X64-NEXT: movl %edi, %eax 94; X64-NEXT: negl %eax 95; X64-NEXT: cmovsl %edi, %eax 96; X64-NEXT: retq 97; 98; X86-LABEL: test_i32: 99; X86: # %bb.0: 100; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 101; X86-NEXT: movl %ecx, %eax 102; X86-NEXT: negl %eax 103; X86-NEXT: cmovsl %ecx, %eax 104; X86-NEXT: retl 105 %r = call i32 @llvm.abs.i32(i32 %a, i1 false) 106 ret i32 %r 107} 108 109define i64 @test_i64(i64 %a) nounwind { 110; X64-LABEL: test_i64: 111; X64: # %bb.0: 112; X64-NEXT: movq %rdi, %rax 113; X64-NEXT: negq %rax 114; X64-NEXT: cmovsq %rdi, %rax 115; X64-NEXT: retq 116; 117; X86-LABEL: test_i64: 118; X86: # %bb.0: 119; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 120; X86-NEXT: movl %edx, %ecx 121; X86-NEXT: sarl $31, %ecx 122; X86-NEXT: xorl %ecx, %edx 123; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 124; X86-NEXT: xorl %ecx, %eax 125; X86-NEXT: subl %ecx, %eax 126; X86-NEXT: sbbl %ecx, %edx 127; X86-NEXT: retl 128 %r = call i64 @llvm.abs.i64(i64 %a, i1 false) 129 ret i64 %r 130} 131 132define i128 @test_i128(i128 %a) nounwind { 133; X64-LABEL: test_i128: 134; X64: # %bb.0: 135; X64-NEXT: movq %rsi, %rdx 136; X64-NEXT: movq %rdi, %rax 137; X64-NEXT: movq %rsi, %rcx 138; X64-NEXT: sarq $63, %rcx 139; X64-NEXT: xorq %rcx, %rdx 140; X64-NEXT: xorq %rcx, %rax 141; X64-NEXT: subq %rcx, %rax 142; X64-NEXT: sbbq %rcx, %rdx 143; X64-NEXT: retq 144; 145; X86-LABEL: test_i128: 146; X86: # %bb.0: 147; X86-NEXT: pushl %ebx 148; X86-NEXT: pushl %edi 149; X86-NEXT: pushl %esi 150; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 151; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 152; X86-NEXT: movl %ecx, %edx 153; X86-NEXT: sarl $31, %edx 154; X86-NEXT: xorl %edx, %ecx 155; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 156; X86-NEXT: xorl %edx, %esi 157; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 158; X86-NEXT: xorl %edx, %edi 159; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 160; X86-NEXT: xorl %edx, %ebx 161; X86-NEXT: subl %edx, %ebx 162; X86-NEXT: sbbl %edx, %edi 163; X86-NEXT: sbbl %edx, %esi 164; X86-NEXT: sbbl %edx, %ecx 165; X86-NEXT: movl %ebx, (%eax) 166; X86-NEXT: movl %edi, 4(%eax) 167; X86-NEXT: movl %esi, 8(%eax) 168; X86-NEXT: movl %ecx, 12(%eax) 169; X86-NEXT: popl %esi 170; X86-NEXT: popl %edi 171; X86-NEXT: popl %ebx 172; X86-NEXT: retl $4 173 %r = call i128 @llvm.abs.i128(i128 %a, i1 false) 174 ret i128 %r 175} 176 177define <1 x i32> @test_v1i32(<1 x i32> %a) nounwind { 178; X64-LABEL: test_v1i32: 179; X64: # %bb.0: 180; X64-NEXT: movl %edi, %eax 181; X64-NEXT: negl %eax 182; X64-NEXT: cmovsl %edi, %eax 183; X64-NEXT: retq 184; 185; X86-LABEL: test_v1i32: 186; X86: # %bb.0: 187; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 188; X86-NEXT: movl %ecx, %eax 189; X86-NEXT: negl %eax 190; X86-NEXT: cmovsl %ecx, %eax 191; X86-NEXT: retl 192 %r = call <1 x i32> @llvm.abs.v1i32(<1 x i32> %a, i1 false) 193 ret <1 x i32> %r 194} 195 196define <2 x i32> @test_v2i32(<2 x i32> %a) nounwind { 197; SSE-LABEL: test_v2i32: 198; SSE: # %bb.0: 199; SSE-NEXT: movdqa %xmm0, %xmm1 200; SSE-NEXT: psrad $31, %xmm1 201; SSE-NEXT: pxor %xmm1, %xmm0 202; SSE-NEXT: psubd %xmm1, %xmm0 203; SSE-NEXT: retq 204; 205; AVX-LABEL: test_v2i32: 206; AVX: # %bb.0: 207; AVX-NEXT: vpabsd %xmm0, %xmm0 208; AVX-NEXT: retq 209; 210; X86-LABEL: test_v2i32: 211; X86: # %bb.0: 212; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 213; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 214; X86-NEXT: movl %edx, %eax 215; X86-NEXT: negl %eax 216; X86-NEXT: cmovsl %edx, %eax 217; X86-NEXT: movl %ecx, %edx 218; X86-NEXT: negl %edx 219; X86-NEXT: cmovsl %ecx, %edx 220; X86-NEXT: retl 221 %r = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %a, i1 false) 222 ret <2 x i32> %r 223} 224 225define <3 x i32> @test_v3i32(<3 x i32> %a) nounwind { 226; SSE-LABEL: test_v3i32: 227; SSE: # %bb.0: 228; SSE-NEXT: movdqa %xmm0, %xmm1 229; SSE-NEXT: psrad $31, %xmm1 230; SSE-NEXT: pxor %xmm1, %xmm0 231; SSE-NEXT: psubd %xmm1, %xmm0 232; SSE-NEXT: retq 233; 234; AVX-LABEL: test_v3i32: 235; AVX: # %bb.0: 236; AVX-NEXT: vpabsd %xmm0, %xmm0 237; AVX-NEXT: retq 238; 239; X86-LABEL: test_v3i32: 240; X86: # %bb.0: 241; X86-NEXT: pushl %esi 242; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 243; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 244; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 245; X86-NEXT: movl %edx, %eax 246; X86-NEXT: negl %eax 247; X86-NEXT: cmovsl %edx, %eax 248; X86-NEXT: movl %ecx, %edx 249; X86-NEXT: negl %edx 250; X86-NEXT: cmovsl %ecx, %edx 251; X86-NEXT: movl %esi, %ecx 252; X86-NEXT: negl %ecx 253; X86-NEXT: cmovsl %esi, %ecx 254; X86-NEXT: popl %esi 255; X86-NEXT: retl 256 %r = call <3 x i32> @llvm.abs.v3i32(<3 x i32> %a, i1 false) 257 ret <3 x i32> %r 258} 259 260define <4 x i32> @test_v4i32(<4 x i32> %a) nounwind { 261; SSE-LABEL: test_v4i32: 262; SSE: # %bb.0: 263; SSE-NEXT: movdqa %xmm0, %xmm1 264; SSE-NEXT: psrad $31, %xmm1 265; SSE-NEXT: pxor %xmm1, %xmm0 266; SSE-NEXT: psubd %xmm1, %xmm0 267; SSE-NEXT: retq 268; 269; AVX-LABEL: test_v4i32: 270; AVX: # %bb.0: 271; AVX-NEXT: vpabsd %xmm0, %xmm0 272; AVX-NEXT: retq 273; 274; X86-LABEL: test_v4i32: 275; X86: # %bb.0: 276; X86-NEXT: pushl %ebx 277; X86-NEXT: pushl %edi 278; X86-NEXT: pushl %esi 279; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 280; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 281; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 282; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 283; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 284; X86-NEXT: movl %ebx, %edx 285; X86-NEXT: negl %edx 286; X86-NEXT: cmovsl %ebx, %edx 287; X86-NEXT: movl %edi, %ebx 288; X86-NEXT: negl %ebx 289; X86-NEXT: cmovsl %edi, %ebx 290; X86-NEXT: movl %esi, %edi 291; X86-NEXT: negl %edi 292; X86-NEXT: cmovsl %esi, %edi 293; X86-NEXT: movl %ecx, %esi 294; X86-NEXT: negl %esi 295; X86-NEXT: cmovsl %ecx, %esi 296; X86-NEXT: movl %esi, 12(%eax) 297; X86-NEXT: movl %edi, 8(%eax) 298; X86-NEXT: movl %ebx, 4(%eax) 299; X86-NEXT: movl %edx, (%eax) 300; X86-NEXT: popl %esi 301; X86-NEXT: popl %edi 302; X86-NEXT: popl %ebx 303; X86-NEXT: retl $4 304 %r = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a, i1 false) 305 ret <4 x i32> %r 306} 307 308define <8 x i32> @test_v8i32(<8 x i32> %a) nounwind { 309; SSE-LABEL: test_v8i32: 310; SSE: # %bb.0: 311; SSE-NEXT: movdqa %xmm0, %xmm2 312; SSE-NEXT: psrad $31, %xmm2 313; SSE-NEXT: pxor %xmm2, %xmm0 314; SSE-NEXT: psubd %xmm2, %xmm0 315; SSE-NEXT: movdqa %xmm1, %xmm2 316; SSE-NEXT: psrad $31, %xmm2 317; SSE-NEXT: pxor %xmm2, %xmm1 318; SSE-NEXT: psubd %xmm2, %xmm1 319; SSE-NEXT: retq 320; 321; AVX1-LABEL: test_v8i32: 322; AVX1: # %bb.0: 323; AVX1-NEXT: vpabsd %xmm0, %xmm1 324; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 325; AVX1-NEXT: vpabsd %xmm0, %xmm0 326; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 327; AVX1-NEXT: retq 328; 329; AVX2-LABEL: test_v8i32: 330; AVX2: # %bb.0: 331; AVX2-NEXT: vpabsd %ymm0, %ymm0 332; AVX2-NEXT: retq 333; 334; X86-LABEL: test_v8i32: 335; X86: # %bb.0: 336; X86-NEXT: pushl %ebp 337; X86-NEXT: pushl %ebx 338; X86-NEXT: pushl %edi 339; X86-NEXT: pushl %esi 340; X86-NEXT: subl $8, %esp 341; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 342; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 343; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 344; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 345; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 346; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 347; X86-NEXT: movl %edx, %ecx 348; X86-NEXT: negl %ecx 349; X86-NEXT: cmovsl %edx, %ecx 350; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 351; X86-NEXT: movl %esi, %ecx 352; X86-NEXT: negl %ecx 353; X86-NEXT: cmovsl %esi, %ecx 354; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill 355; X86-NEXT: movl %edi, %esi 356; X86-NEXT: negl %esi 357; X86-NEXT: cmovsl %edi, %esi 358; X86-NEXT: movl %ebp, %edi 359; X86-NEXT: negl %edi 360; X86-NEXT: cmovsl %ebp, %edi 361; X86-NEXT: movl %ebx, %ebp 362; X86-NEXT: negl %ebp 363; X86-NEXT: cmovsl %ebx, %ebp 364; X86-NEXT: movl %eax, %ebx 365; X86-NEXT: negl %ebx 366; X86-NEXT: cmovsl %eax, %ebx 367; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 368; X86-NEXT: movl %ecx, %eax 369; X86-NEXT: negl %eax 370; X86-NEXT: cmovsl %ecx, %eax 371; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 372; X86-NEXT: movl %edx, %ecx 373; X86-NEXT: negl %ecx 374; X86-NEXT: cmovsl %edx, %ecx 375; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 376; X86-NEXT: movl %ecx, 28(%edx) 377; X86-NEXT: movl %eax, 24(%edx) 378; X86-NEXT: movl %ebx, 20(%edx) 379; X86-NEXT: movl %ebp, 16(%edx) 380; X86-NEXT: movl %edi, 12(%edx) 381; X86-NEXT: movl %esi, 8(%edx) 382; X86-NEXT: movl (%esp), %eax # 4-byte Reload 383; X86-NEXT: movl %eax, 4(%edx) 384; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload 385; X86-NEXT: movl %eax, (%edx) 386; X86-NEXT: movl %edx, %eax 387; X86-NEXT: addl $8, %esp 388; X86-NEXT: popl %esi 389; X86-NEXT: popl %edi 390; X86-NEXT: popl %ebx 391; X86-NEXT: popl %ebp 392; X86-NEXT: retl $4 393 %r = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %a, i1 false) 394 ret <8 x i32> %r 395} 396 397define <8 x i16> @test_v8i16(<8 x i16> %a) nounwind { 398; SSE-LABEL: test_v8i16: 399; SSE: # %bb.0: 400; SSE-NEXT: pxor %xmm1, %xmm1 401; SSE-NEXT: psubw %xmm0, %xmm1 402; SSE-NEXT: pmaxsw %xmm1, %xmm0 403; SSE-NEXT: retq 404; 405; AVX-LABEL: test_v8i16: 406; AVX: # %bb.0: 407; AVX-NEXT: vpabsw %xmm0, %xmm0 408; AVX-NEXT: retq 409; 410; X86-LABEL: test_v8i16: 411; X86: # %bb.0: 412; X86-NEXT: pushl %ebp 413; X86-NEXT: pushl %ebx 414; X86-NEXT: pushl %edi 415; X86-NEXT: pushl %esi 416; X86-NEXT: pushl %eax 417; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 418; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ebx 419; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ebp 420; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edi 421; X86-NEXT: movzwl {{[0-9]+}}(%esp), %esi 422; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx 423; X86-NEXT: movl %edx, %ecx 424; X86-NEXT: negw %cx 425; X86-NEXT: cmovsw %dx, %cx 426; X86-NEXT: movw %cx, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 427; X86-NEXT: movl %esi, %ecx 428; X86-NEXT: negw %cx 429; X86-NEXT: cmovsw %si, %cx 430; X86-NEXT: movw %cx, (%esp) # 2-byte Spill 431; X86-NEXT: movl %edi, %esi 432; X86-NEXT: negw %si 433; X86-NEXT: cmovsw %di, %si 434; X86-NEXT: movl %ebp, %edi 435; X86-NEXT: negw %di 436; X86-NEXT: cmovsw %bp, %di 437; X86-NEXT: movl %ebx, %ebp 438; X86-NEXT: negw %bp 439; X86-NEXT: cmovsw %bx, %bp 440; X86-NEXT: movl %eax, %ebx 441; X86-NEXT: negw %bx 442; X86-NEXT: cmovsw %ax, %bx 443; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 444; X86-NEXT: movl %ecx, %eax 445; X86-NEXT: negw %ax 446; X86-NEXT: cmovsw %cx, %ax 447; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx 448; X86-NEXT: movl %edx, %ecx 449; X86-NEXT: negw %cx 450; X86-NEXT: cmovsw %dx, %cx 451; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 452; X86-NEXT: movw %cx, 14(%edx) 453; X86-NEXT: movw %ax, 12(%edx) 454; X86-NEXT: movw %bx, 10(%edx) 455; X86-NEXT: movw %bp, 8(%edx) 456; X86-NEXT: movw %di, 6(%edx) 457; X86-NEXT: movw %si, 4(%edx) 458; X86-NEXT: movzwl (%esp), %eax # 2-byte Folded Reload 459; X86-NEXT: movw %ax, 2(%edx) 460; X86-NEXT: movzwl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 2-byte Folded Reload 461; X86-NEXT: movw %ax, (%edx) 462; X86-NEXT: movl %edx, %eax 463; X86-NEXT: addl $4, %esp 464; X86-NEXT: popl %esi 465; X86-NEXT: popl %edi 466; X86-NEXT: popl %ebx 467; X86-NEXT: popl %ebp 468; X86-NEXT: retl $4 469 %r = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %a, i1 false) 470 ret <8 x i16> %r 471} 472 473define <16 x i8> @test_v16i8(<16 x i8> %a) nounwind { 474; SSE-LABEL: test_v16i8: 475; SSE: # %bb.0: 476; SSE-NEXT: pxor %xmm1, %xmm1 477; SSE-NEXT: psubb %xmm0, %xmm1 478; SSE-NEXT: pminub %xmm1, %xmm0 479; SSE-NEXT: retq 480; 481; AVX-LABEL: test_v16i8: 482; AVX: # %bb.0: 483; AVX-NEXT: vpabsb %xmm0, %xmm0 484; AVX-NEXT: retq 485; 486; X86-LABEL: test_v16i8: 487; X86: # %bb.0: 488; X86-NEXT: pushl %ebx 489; X86-NEXT: subl $12, %esp 490; X86-NEXT: movb {{[0-9]+}}(%esp), %bh 491; X86-NEXT: movb {{[0-9]+}}(%esp), %bl 492; X86-NEXT: movb {{[0-9]+}}(%esp), %dh 493; X86-NEXT: movb {{[0-9]+}}(%esp), %ch 494; X86-NEXT: movb {{[0-9]+}}(%esp), %ah 495; X86-NEXT: movb {{[0-9]+}}(%esp), %dl 496; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 497; X86-NEXT: movb %cl, %al 498; X86-NEXT: sarb $7, %al 499; X86-NEXT: xorb %al, %cl 500; X86-NEXT: subb %al, %cl 501; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 502; X86-NEXT: movb %dl, %al 503; X86-NEXT: sarb $7, %al 504; X86-NEXT: xorb %al, %dl 505; X86-NEXT: subb %al, %dl 506; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 507; X86-NEXT: movb %ah, %al 508; X86-NEXT: sarb $7, %al 509; X86-NEXT: xorb %al, %ah 510; X86-NEXT: subb %al, %ah 511; X86-NEXT: movb %ah, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 512; X86-NEXT: movb %ch, %al 513; X86-NEXT: sarb $7, %al 514; X86-NEXT: xorb %al, %ch 515; X86-NEXT: subb %al, %ch 516; X86-NEXT: movb %ch, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 517; X86-NEXT: movb %dh, %al 518; X86-NEXT: sarb $7, %al 519; X86-NEXT: xorb %al, %dh 520; X86-NEXT: subb %al, %dh 521; X86-NEXT: movb %dh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 522; X86-NEXT: movl %ebx, %eax 523; X86-NEXT: sarb $7, %al 524; X86-NEXT: xorb %al, %bl 525; X86-NEXT: subb %al, %bl 526; X86-NEXT: movb %bl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 527; X86-NEXT: movb %bh, %al 528; X86-NEXT: sarb $7, %al 529; X86-NEXT: xorb %al, %bh 530; X86-NEXT: subb %al, %bh 531; X86-NEXT: movb %bh, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 532; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 533; X86-NEXT: movl %ecx, %eax 534; X86-NEXT: sarb $7, %al 535; X86-NEXT: xorb %al, %cl 536; X86-NEXT: subb %al, %cl 537; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 538; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 539; X86-NEXT: movl %ecx, %eax 540; X86-NEXT: sarb $7, %al 541; X86-NEXT: xorb %al, %cl 542; X86-NEXT: subb %al, %cl 543; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 544; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 545; X86-NEXT: movl %ecx, %eax 546; X86-NEXT: sarb $7, %al 547; X86-NEXT: xorb %al, %cl 548; X86-NEXT: subb %al, %cl 549; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill 550; X86-NEXT: movb {{[0-9]+}}(%esp), %bh 551; X86-NEXT: movb %bh, %al 552; X86-NEXT: sarb $7, %al 553; X86-NEXT: xorb %al, %bh 554; X86-NEXT: subb %al, %bh 555; X86-NEXT: movb {{[0-9]+}}(%esp), %bl 556; X86-NEXT: movl %ebx, %eax 557; X86-NEXT: sarb $7, %al 558; X86-NEXT: xorb %al, %bl 559; X86-NEXT: subb %al, %bl 560; X86-NEXT: movb {{[0-9]+}}(%esp), %dh 561; X86-NEXT: movb %dh, %al 562; X86-NEXT: sarb $7, %al 563; X86-NEXT: xorb %al, %dh 564; X86-NEXT: subb %al, %dh 565; X86-NEXT: movb {{[0-9]+}}(%esp), %ch 566; X86-NEXT: movb %ch, %al 567; X86-NEXT: sarb $7, %al 568; X86-NEXT: xorb %al, %ch 569; X86-NEXT: subb %al, %ch 570; X86-NEXT: movb {{[0-9]+}}(%esp), %dl 571; X86-NEXT: movl %edx, %eax 572; X86-NEXT: sarb $7, %al 573; X86-NEXT: xorb %al, %dl 574; X86-NEXT: subb %al, %dl 575; X86-NEXT: movb {{[0-9]+}}(%esp), %cl 576; X86-NEXT: movl %ecx, %eax 577; X86-NEXT: sarb $7, %al 578; X86-NEXT: xorb %al, %cl 579; X86-NEXT: subb %al, %cl 580; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 581; X86-NEXT: movb %cl, 15(%eax) 582; X86-NEXT: movb %dl, 14(%eax) 583; X86-NEXT: movb %ch, 13(%eax) 584; X86-NEXT: movb %dh, 12(%eax) 585; X86-NEXT: movb %bl, 11(%eax) 586; X86-NEXT: movb %bh, 10(%eax) 587; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 588; X86-NEXT: movb %cl, 9(%eax) 589; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 590; X86-NEXT: movb %cl, 8(%eax) 591; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 592; X86-NEXT: movb %cl, 7(%eax) 593; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 594; X86-NEXT: movb %cl, 6(%eax) 595; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 596; X86-NEXT: movb %cl, 5(%eax) 597; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 598; X86-NEXT: movb %cl, 4(%eax) 599; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 600; X86-NEXT: movb %cl, 3(%eax) 601; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 602; X86-NEXT: movb %cl, 2(%eax) 603; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 604; X86-NEXT: movb %cl, 1(%eax) 605; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload 606; X86-NEXT: movb %cl, (%eax) 607; X86-NEXT: addl $12, %esp 608; X86-NEXT: popl %ebx 609; X86-NEXT: retl $4 610 %r = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %a, i1 false) 611 ret <16 x i8> %r 612} 613 614define i16 @test_sextinreg_i16(i16 %a) nounwind { 615; X64-LABEL: test_sextinreg_i16: 616; X64: # %bb.0: 617; X64-NEXT: movsbl %dil, %ecx 618; X64-NEXT: movl %ecx, %eax 619; X64-NEXT: negw %ax 620; X64-NEXT: cmovsw %cx, %ax 621; X64-NEXT: retq 622; 623; X86-LABEL: test_sextinreg_i16: 624; X86: # %bb.0: 625; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx 626; X86-NEXT: movl %ecx, %eax 627; X86-NEXT: negw %ax 628; X86-NEXT: cmovsw %cx, %ax 629; X86-NEXT: retl 630 %shl = shl i16 %a, 8 631 %ashr = ashr exact i16 %shl, 8 632 %res = call i16 @llvm.abs.i16(i16 %ashr, i1 true) 633 ret i16 %res 634} 635 636define i32 @test_sextinreg_i32(i32 %a) nounwind { 637; X64-LABEL: test_sextinreg_i32: 638; X64: # %bb.0: 639; X64-NEXT: movswl %di, %ecx 640; X64-NEXT: movl %ecx, %eax 641; X64-NEXT: negl %eax 642; X64-NEXT: cmovsl %ecx, %eax 643; X64-NEXT: retq 644; 645; X86-LABEL: test_sextinreg_i32: 646; X86: # %bb.0: 647; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx 648; X86-NEXT: movl %ecx, %eax 649; X86-NEXT: negl %eax 650; X86-NEXT: cmovsl %ecx, %eax 651; X86-NEXT: retl 652 %shl = shl i32 %a, 16 653 %ashr = ashr exact i32 %shl, 16 654 %res = call i32 @llvm.abs.i32(i32 %ashr, i1 true) 655 ret i32 %res 656} 657 658define i64 @test_sextinreg_i64(i64 %a) nounwind { 659; X64-LABEL: test_sextinreg_i64: 660; X64: # %bb.0: 661; X64-NEXT: movl %edi, %eax 662; X64-NEXT: negl %eax 663; X64-NEXT: cmovsl %edi, %eax 664; X64-NEXT: retq 665; 666; X86-LABEL: test_sextinreg_i64: 667; X86: # %bb.0: 668; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 669; X86-NEXT: movl %ecx, %eax 670; X86-NEXT: negl %eax 671; X86-NEXT: cmovsl %ecx, %eax 672; X86-NEXT: xorl %edx, %edx 673; X86-NEXT: retl 674 %shl = shl i64 %a, 32 675 %ashr = ashr exact i64 %shl, 32 676 %res = call i64 @llvm.abs.i64(i64 %ashr, i1 true) 677 ret i64 %res 678} 679 680define i128 @test_sextinreg_i128(i128 %a) nounwind { 681; X64-LABEL: test_sextinreg_i128: 682; X64: # %bb.0: 683; X64-NEXT: movq %rdi, %rax 684; X64-NEXT: negq %rax 685; X64-NEXT: cmovsq %rdi, %rax 686; X64-NEXT: xorl %edx, %edx 687; X64-NEXT: retq 688; 689; X86-LABEL: test_sextinreg_i128: 690; X86: # %bb.0: 691; X86-NEXT: pushl %esi 692; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 693; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 694; X86-NEXT: movl %ecx, %edx 695; X86-NEXT: sarl $31, %edx 696; X86-NEXT: xorl %edx, %ecx 697; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 698; X86-NEXT: xorl %edx, %esi 699; X86-NEXT: subl %edx, %esi 700; X86-NEXT: sbbl %edx, %ecx 701; X86-NEXT: movl %esi, (%eax) 702; X86-NEXT: movl %ecx, 4(%eax) 703; X86-NEXT: movl $0, 12(%eax) 704; X86-NEXT: movl $0, 8(%eax) 705; X86-NEXT: popl %esi 706; X86-NEXT: retl $4 707 %shl = shl i128 %a, 64 708 %ashr = ashr exact i128 %shl, 64 709 %res = call i128 @llvm.abs.i128(i128 %ashr, i1 true) 710 ret i128 %res 711} 712 713define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind { 714; X64-LABEL: test_minsigned_i8: 715; X64: # %bb.0: 716; X64-NEXT: movl %edi, %eax 717; X64-NEXT: sarb $7, %al 718; X64-NEXT: movl %edi, %ecx 719; X64-NEXT: xorb %al, %cl 720; X64-NEXT: subb %al, %cl 721; X64-NEXT: cmpb $-128, %dil 722; X64-NEXT: movzbl %cl, %eax 723; X64-NEXT: cmovel %esi, %eax 724; X64-NEXT: # kill: def $al killed $al killed $eax 725; X64-NEXT: retq 726; 727; X86-LABEL: test_minsigned_i8: 728; X86: # %bb.0: 729; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 730; X86-NEXT: cmpb $-128, %al 731; X86-NEXT: jne .LBB17_1 732; X86-NEXT: # %bb.2: 733; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 734; X86-NEXT: # kill: def $al killed $al killed $eax 735; X86-NEXT: retl 736; X86-NEXT: .LBB17_1: 737; X86-NEXT: movl %eax, %ecx 738; X86-NEXT: sarb $7, %cl 739; X86-NEXT: xorb %cl, %al 740; X86-NEXT: subb %cl, %al 741; X86-NEXT: movzbl %al, %eax 742; X86-NEXT: # kill: def $al killed $al killed $eax 743; X86-NEXT: retl 744 %lim = icmp eq i8 %a0, -128 745 %abs = tail call i8 @llvm.abs.i8(i8 %a0, i1 false) 746 %res = select i1 %lim, i8 %a1, i8 %abs 747 ret i8 %res 748} 749 750define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind { 751; X64-LABEL: test_minsigned_i16: 752; X64: # %bb.0: 753; X64-NEXT: movzwl %di, %ecx 754; X64-NEXT: movl %ecx, %eax 755; X64-NEXT: negw %ax 756; X64-NEXT: cmovsw %cx, %ax 757; X64-NEXT: cmpl $32768, %ecx # imm = 0x8000 758; X64-NEXT: cmovel %esi, %eax 759; X64-NEXT: # kill: def $ax killed $ax killed $eax 760; X64-NEXT: retq 761; 762; X86-LABEL: test_minsigned_i16: 763; X86: # %bb.0: 764; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 765; X86-NEXT: movl %ecx, %eax 766; X86-NEXT: negw %ax 767; X86-NEXT: cmovsw %cx, %ax 768; X86-NEXT: cmpl $32768, %ecx # imm = 0x8000 769; X86-NEXT: jne .LBB18_2 770; X86-NEXT: # %bb.1: 771; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 772; X86-NEXT: .LBB18_2: 773; X86-NEXT: retl 774 %lim = icmp eq i16 %a0, -32768 775 %abs = tail call i16 @llvm.abs.i16(i16 %a0, i1 false) 776 %res = select i1 %lim, i16 %a1, i16 %abs 777 ret i16 %res 778} 779 780define i32 @test_minsigned_i32(i32 %a0, i32 %a1) nounwind { 781; X64-LABEL: test_minsigned_i32: 782; X64: # %bb.0: 783; X64-NEXT: movl %edi, %eax 784; X64-NEXT: negl %eax 785; X64-NEXT: cmovsl %edi, %eax 786; X64-NEXT: cmovol %esi, %eax 787; X64-NEXT: retq 788; 789; X86-LABEL: test_minsigned_i32: 790; X86: # %bb.0: 791; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 792; X86-NEXT: movl %ecx, %eax 793; X86-NEXT: negl %eax 794; X86-NEXT: cmovsl %ecx, %eax 795; X86-NEXT: cmovol {{[0-9]+}}(%esp), %eax 796; X86-NEXT: retl 797 %lim = icmp eq i32 %a0, -2147483648 798 %abs = tail call i32 @llvm.abs.i32(i32 %a0, i1 false) 799 %res = select i1 %lim, i32 %a1, i32 %abs 800 ret i32 %res 801} 802 803define i64 @test_minsigned_i64(i64 %a0, i64 %a1) nounwind { 804; X64-LABEL: test_minsigned_i64: 805; X64: # %bb.0: 806; X64-NEXT: movq %rdi, %rax 807; X64-NEXT: negq %rax 808; X64-NEXT: cmovsq %rdi, %rax 809; X64-NEXT: cmovoq %rsi, %rax 810; X64-NEXT: retq 811; 812; X86-LABEL: test_minsigned_i64: 813; X86: # %bb.0: 814; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 815; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 816; X86-NEXT: leal -2147483648(%edx), %ecx 817; X86-NEXT: orl %eax, %ecx 818; X86-NEXT: jne .LBB20_1 819; X86-NEXT: # %bb.2: # %select.end 820; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 821; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 822; X86-NEXT: retl 823; X86-NEXT: .LBB20_1: # %select.false.sink 824; X86-NEXT: movl %edx, %ecx 825; X86-NEXT: sarl $31, %ecx 826; X86-NEXT: xorl %ecx, %edx 827; X86-NEXT: xorl %ecx, %eax 828; X86-NEXT: subl %ecx, %eax 829; X86-NEXT: sbbl %ecx, %edx 830; X86-NEXT: retl 831 %lim = icmp eq i64 %a0, -9223372036854775808 832 %abs = tail call i64 @llvm.abs.i64(i64 %a0, i1 false) 833 %res = select i1 %lim, i64 %a1, i64 %abs 834 ret i64 %res 835} 836