[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / fp128-select.ll
blob65e930e26d32381d9d91b44afed6f92ba63733d3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+sse \
3 ; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE
4 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+sse \
5 ; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE
6 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=-sse \
7 ; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE
8 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=-sse \
9 ; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE
11 define void @test_select(fp128* %p, fp128* %q, i1 zeroext %c) {
12 ; SSE-LABEL: test_select:
13 ; SSE:       # %bb.0:
14 ; SSE-NEXT:    testl %edx, %edx
15 ; SSE-NEXT:    jne .LBB0_1
16 ; SSE-NEXT:  # %bb.2:
17 ; SSE-NEXT:    movaps {{.*}}(%rip), %xmm0
18 ; SSE-NEXT:    movaps %xmm0, (%rsi)
19 ; SSE-NEXT:    retq
20 ; SSE-NEXT:  .LBB0_1:
21 ; SSE-NEXT:    movups (%rdi), %xmm0
22 ; SSE-NEXT:    movaps %xmm0, (%rsi)
23 ; SSE-NEXT:    retq
25 ; NOSSE-LABEL: test_select:
26 ; NOSSE:       # %bb.0:
27 ; NOSSE-NEXT:    xorl %eax, %eax
28 ; NOSSE-NEXT:    testl %edx, %edx
29 ; NOSSE-NEXT:    cmovneq (%rdi), %rax
30 ; NOSSE-NEXT:    movabsq $9223231299366420480, %rcx # imm = 0x7FFF800000000000
31 ; NOSSE-NEXT:    cmovneq 8(%rdi), %rcx
32 ; NOSSE-NEXT:    movq %rcx, 8(%rsi)
33 ; NOSSE-NEXT:    movq %rax, (%rsi)
34 ; NOSSE-NEXT:    retq
35   %a = load fp128, fp128* %p, align 2
36   %r = select i1 %c, fp128 %a, fp128 0xL00000000000000007FFF800000000000
37   store fp128 %r, fp128* %q
38   ret void
41 ; The uitofp will become a select_cc. This used to crash during type
42 ; legalization because we didn't expect the operands to need to be softened.
43 define fp128 @test_select_cc(fp128, fp128) {
44 ; SSE-LABEL: test_select_cc:
45 ; SSE:       # %bb.0: # %BB0
46 ; SSE-NEXT:    pushq %rbx
47 ; SSE-NEXT:    .cfi_def_cfa_offset 16
48 ; SSE-NEXT:    subq $32, %rsp
49 ; SSE-NEXT:    .cfi_def_cfa_offset 48
50 ; SSE-NEXT:    .cfi_offset %rbx, -16
51 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
52 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
53 ; SSE-NEXT:    callq __netf2
54 ; SSE-NEXT:    movl %eax, %ebx
55 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
56 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
57 ; SSE-NEXT:    callq __eqtf2
58 ; SSE-NEXT:    testl %eax, %eax
59 ; SSE-NEXT:    je .LBB1_1
60 ; SSE-NEXT:  # %bb.2: # %BB0
61 ; SSE-NEXT:    xorps %xmm1, %xmm1
62 ; SSE-NEXT:    jmp .LBB1_3
63 ; SSE-NEXT:  .LBB1_1:
64 ; SSE-NEXT:    movaps {{.*}}(%rip), %xmm1
65 ; SSE-NEXT:  .LBB1_3: # %BB0
66 ; SSE-NEXT:    testl %ebx, %ebx
67 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
68 ; SSE-NEXT:    jne .LBB1_5
69 ; SSE-NEXT:  # %bb.4: # %BB1
70 ; SSE-NEXT:    movaps %xmm1, %xmm0
71 ; SSE-NEXT:  .LBB1_5: # %BB2
72 ; SSE-NEXT:    addq $32, %rsp
73 ; SSE-NEXT:    .cfi_def_cfa_offset 16
74 ; SSE-NEXT:    popq %rbx
75 ; SSE-NEXT:    .cfi_def_cfa_offset 8
76 ; SSE-NEXT:    retq
78 ; NOSSE-LABEL: test_select_cc:
79 ; NOSSE:       # %bb.0: # %BB0
80 ; NOSSE-NEXT:    pushq %rbp
81 ; NOSSE-NEXT:    .cfi_def_cfa_offset 16
82 ; NOSSE-NEXT:    pushq %r15
83 ; NOSSE-NEXT:    .cfi_def_cfa_offset 24
84 ; NOSSE-NEXT:    pushq %r14
85 ; NOSSE-NEXT:    .cfi_def_cfa_offset 32
86 ; NOSSE-NEXT:    pushq %r12
87 ; NOSSE-NEXT:    .cfi_def_cfa_offset 40
88 ; NOSSE-NEXT:    pushq %rbx
89 ; NOSSE-NEXT:    .cfi_def_cfa_offset 48
90 ; NOSSE-NEXT:    .cfi_offset %rbx, -48
91 ; NOSSE-NEXT:    .cfi_offset %r12, -40
92 ; NOSSE-NEXT:    .cfi_offset %r14, -32
93 ; NOSSE-NEXT:    .cfi_offset %r15, -24
94 ; NOSSE-NEXT:    .cfi_offset %rbp, -16
95 ; NOSSE-NEXT:    movq %rcx, %r12
96 ; NOSSE-NEXT:    movq %rdx, %rbx
97 ; NOSSE-NEXT:    movq %rsi, %r14
98 ; NOSSE-NEXT:    movq %rdi, %r15
99 ; NOSSE-NEXT:    callq __netf2
100 ; NOSSE-NEXT:    movl %eax, %ebp
101 ; NOSSE-NEXT:    movq %r15, %rdi
102 ; NOSSE-NEXT:    movq %r14, %rsi
103 ; NOSSE-NEXT:    movq %rbx, %rdx
104 ; NOSSE-NEXT:    movq %r12, %rcx
105 ; NOSSE-NEXT:    callq __eqtf2
106 ; NOSSE-NEXT:    movl %eax, %ecx
107 ; NOSSE-NEXT:    xorl %eax, %eax
108 ; NOSSE-NEXT:    testl %ecx, %ecx
109 ; NOSSE-NEXT:    movabsq $4611404543450677248, %rdx # imm = 0x3FFF000000000000
110 ; NOSSE-NEXT:    cmovneq %rax, %rdx
111 ; NOSSE-NEXT:    testl %ebp, %ebp
112 ; NOSSE-NEXT:    je .LBB1_2
113 ; NOSSE-NEXT:  # %bb.1:
114 ; NOSSE-NEXT:    movq %r15, %rax
115 ; NOSSE-NEXT:    movq %r14, %rdx
116 ; NOSSE-NEXT:  .LBB1_2: # %BB2
117 ; NOSSE-NEXT:    popq %rbx
118 ; NOSSE-NEXT:    .cfi_def_cfa_offset 40
119 ; NOSSE-NEXT:    popq %r12
120 ; NOSSE-NEXT:    .cfi_def_cfa_offset 32
121 ; NOSSE-NEXT:    popq %r14
122 ; NOSSE-NEXT:    .cfi_def_cfa_offset 24
123 ; NOSSE-NEXT:    popq %r15
124 ; NOSSE-NEXT:    .cfi_def_cfa_offset 16
125 ; NOSSE-NEXT:    popq %rbp
126 ; NOSSE-NEXT:    .cfi_def_cfa_offset 8
127 ; NOSSE-NEXT:    retq
128 BB0:
129   %a = fcmp oeq fp128 %0, %1
130   %b = uitofp i1 %a to fp128
131   br i1 %a, label %BB1, label %BB2
132 BB1:
133   br label %BB2
134 BB2:
135   %c = phi fp128 [ %0, %BB0 ], [ %b, %BB1 ]
136   ret fp128 %c