xref: /llvm-project/llvm/test/CodeGen/X86/select-smin-smax.ll (revision 842d0bf93176b9cb1e0d6894a2bbfb32ad33ebb8)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOBMI
3; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi < %s | FileCheck %s --check-prefixes=CHECK,CHECK-BMI
4
5declare i32 @llvm.smax.i32(i32, i32)
6declare i32 @llvm.smin.i32(i32, i32)
7declare i64 @llvm.smax.i64(i64, i64)
8declare i64 @llvm.smin.i64(i64, i64)
9
10define i32 @test_i32_smax(i32 %a) nounwind {
11; CHECK-NOBMI-LABEL: test_i32_smax:
12; CHECK-NOBMI:       # %bb.0:
13; CHECK-NOBMI-NEXT:    xorl %eax, %eax
14; CHECK-NOBMI-NEXT:    testl %edi, %edi
15; CHECK-NOBMI-NEXT:    cmovgl %edi, %eax
16; CHECK-NOBMI-NEXT:    retq
17;
18; CHECK-BMI-LABEL: test_i32_smax:
19; CHECK-BMI:       # %bb.0:
20; CHECK-BMI-NEXT:    movl %edi, %eax
21; CHECK-BMI-NEXT:    sarl $31, %eax
22; CHECK-BMI-NEXT:    andnl %edi, %eax, %eax
23; CHECK-BMI-NEXT:    retq
24  %r = call i32 @llvm.smax.i32(i32 %a, i32 0)
25  ret i32 %r
26}
27
28define i32 @test_i32_smin(i32 %a) nounwind {
29; CHECK-LABEL: test_i32_smin:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    movl %edi, %eax
32; CHECK-NEXT:    sarl $31, %eax
33; CHECK-NEXT:    andl %edi, %eax
34; CHECK-NEXT:    retq
35  %r = call i32 @llvm.smin.i32(i32 %a, i32 0)
36  ret i32 %r
37}
38
39define i64 @test_i64_smax(i64 %a) nounwind {
40; CHECK-NOBMI-LABEL: test_i64_smax:
41; CHECK-NOBMI:       # %bb.0:
42; CHECK-NOBMI-NEXT:    xorl %eax, %eax
43; CHECK-NOBMI-NEXT:    testq %rdi, %rdi
44; CHECK-NOBMI-NEXT:    cmovgq %rdi, %rax
45; CHECK-NOBMI-NEXT:    retq
46;
47; CHECK-BMI-LABEL: test_i64_smax:
48; CHECK-BMI:       # %bb.0:
49; CHECK-BMI-NEXT:    movq %rdi, %rax
50; CHECK-BMI-NEXT:    sarq $63, %rax
51; CHECK-BMI-NEXT:    andnq %rdi, %rax, %rax
52; CHECK-BMI-NEXT:    retq
53  %r = call i64 @llvm.smax.i64(i64 %a, i64 0)
54  ret i64 %r
55}
56
57define i64 @test_i64_smin(i64 %a) nounwind {
58; CHECK-LABEL: test_i64_smin:
59; CHECK:       # %bb.0:
60; CHECK-NEXT:    movq %rdi, %rax
61; CHECK-NEXT:    sarq $63, %rax
62; CHECK-NEXT:    andq %rdi, %rax
63; CHECK-NEXT:    retq
64  %r = call i64 @llvm.smin.i64(i64 %a, i64 0)
65  ret i64 %r
66}
67