Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / select-icc-dbl.ll
blobd8b0ecfd5dac05f7ddca0940f7b369010b7d0bcf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
5 ;; Test double-precision floating-point values selection after integers comparison
7 define double @select_eq(i32 signext %a, i32 signext %b, double %x, double %y) {
8 ; LA32-LABEL: select_eq:
9 ; LA32:       # %bb.0:
10 ; LA32-NEXT:    xor $a0, $a0, $a1
11 ; LA32-NEXT:    sltui $a0, $a0, 1
12 ; LA32-NEXT:    movgr2cf $fcc0, $a0
13 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
14 ; LA32-NEXT:    ret
16 ; LA64-LABEL: select_eq:
17 ; LA64:       # %bb.0:
18 ; LA64-NEXT:    xor $a0, $a0, $a1
19 ; LA64-NEXT:    sltui $a0, $a0, 1
20 ; LA64-NEXT:    movgr2cf $fcc0, $a0
21 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
22 ; LA64-NEXT:    ret
23   %cond = icmp eq i32 %a, %b
24   %res = select i1 %cond, double %x, double %y
25   ret double %res
28 define double @select_ne(i32 signext %a, i32 signext %b, double %x, double %y) {
29 ; LA32-LABEL: select_ne:
30 ; LA32:       # %bb.0:
31 ; LA32-NEXT:    xor $a0, $a0, $a1
32 ; LA32-NEXT:    sltu $a0, $zero, $a0
33 ; LA32-NEXT:    movgr2cf $fcc0, $a0
34 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
35 ; LA32-NEXT:    ret
37 ; LA64-LABEL: select_ne:
38 ; LA64:       # %bb.0:
39 ; LA64-NEXT:    xor $a0, $a0, $a1
40 ; LA64-NEXT:    sltu $a0, $zero, $a0
41 ; LA64-NEXT:    movgr2cf $fcc0, $a0
42 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
43 ; LA64-NEXT:    ret
44   %cond = icmp ne i32 %a, %b
45   %res = select i1 %cond, double %x, double %y
46   ret double %res
49 define double @select_ugt(i32 signext %a, i32 signext %b, double %x, double %y) {
50 ; LA32-LABEL: select_ugt:
51 ; LA32:       # %bb.0:
52 ; LA32-NEXT:    sltu $a0, $a1, $a0
53 ; LA32-NEXT:    movgr2cf $fcc0, $a0
54 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
55 ; LA32-NEXT:    ret
57 ; LA64-LABEL: select_ugt:
58 ; LA64:       # %bb.0:
59 ; LA64-NEXT:    sltu $a0, $a1, $a0
60 ; LA64-NEXT:    movgr2cf $fcc0, $a0
61 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
62 ; LA64-NEXT:    ret
63   %cond = icmp ugt i32 %a, %b
64   %res = select i1 %cond, double %x, double %y
65   ret double %res
68 define double @select_uge(i32 signext %a, i32 signext %b, double %x, double %y) {
69 ; LA32-LABEL: select_uge:
70 ; LA32:       # %bb.0:
71 ; LA32-NEXT:    sltu $a0, $a0, $a1
72 ; LA32-NEXT:    xori $a0, $a0, 1
73 ; LA32-NEXT:    movgr2cf $fcc0, $a0
74 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
75 ; LA32-NEXT:    ret
77 ; LA64-LABEL: select_uge:
78 ; LA64:       # %bb.0:
79 ; LA64-NEXT:    sltu $a0, $a0, $a1
80 ; LA64-NEXT:    xori $a0, $a0, 1
81 ; LA64-NEXT:    movgr2cf $fcc0, $a0
82 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
83 ; LA64-NEXT:    ret
84   %cond = icmp uge i32 %a, %b
85   %res = select i1 %cond, double %x, double %y
86   ret double %res
89 define double @select_ult(i32 signext %a, i32 signext %b, double %x, double %y) {
90 ; LA32-LABEL: select_ult:
91 ; LA32:       # %bb.0:
92 ; LA32-NEXT:    sltu $a0, $a0, $a1
93 ; LA32-NEXT:    movgr2cf $fcc0, $a0
94 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
95 ; LA32-NEXT:    ret
97 ; LA64-LABEL: select_ult:
98 ; LA64:       # %bb.0:
99 ; LA64-NEXT:    sltu $a0, $a0, $a1
100 ; LA64-NEXT:    movgr2cf $fcc0, $a0
101 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
102 ; LA64-NEXT:    ret
103   %cond = icmp ult i32 %a, %b
104   %res = select i1 %cond, double %x, double %y
105   ret double %res
108 define double @select_ule(i32 signext %a, i32 signext %b, double %x, double %y) {
109 ; LA32-LABEL: select_ule:
110 ; LA32:       # %bb.0:
111 ; LA32-NEXT:    sltu $a0, $a1, $a0
112 ; LA32-NEXT:    xori $a0, $a0, 1
113 ; LA32-NEXT:    movgr2cf $fcc0, $a0
114 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
115 ; LA32-NEXT:    ret
117 ; LA64-LABEL: select_ule:
118 ; LA64:       # %bb.0:
119 ; LA64-NEXT:    sltu $a0, $a1, $a0
120 ; LA64-NEXT:    xori $a0, $a0, 1
121 ; LA64-NEXT:    movgr2cf $fcc0, $a0
122 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
123 ; LA64-NEXT:    ret
124   %cond = icmp ule i32 %a, %b
125   %res = select i1 %cond, double %x, double %y
126   ret double %res
129 define double @select_sgt(i32 signext %a, i32 signext %b, double %x, double %y) {
130 ; LA32-LABEL: select_sgt:
131 ; LA32:       # %bb.0:
132 ; LA32-NEXT:    slt $a0, $a1, $a0
133 ; LA32-NEXT:    movgr2cf $fcc0, $a0
134 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
135 ; LA32-NEXT:    ret
137 ; LA64-LABEL: select_sgt:
138 ; LA64:       # %bb.0:
139 ; LA64-NEXT:    slt $a0, $a1, $a0
140 ; LA64-NEXT:    movgr2cf $fcc0, $a0
141 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
142 ; LA64-NEXT:    ret
143   %cond = icmp sgt i32 %a, %b
144   %res = select i1 %cond, double %x, double %y
145   ret double %res
148 define double @select_sge(i32 signext %a, i32 signext %b, double %x, double %y) {
149 ; LA32-LABEL: select_sge:
150 ; LA32:       # %bb.0:
151 ; LA32-NEXT:    slt $a0, $a0, $a1
152 ; LA32-NEXT:    xori $a0, $a0, 1
153 ; LA32-NEXT:    movgr2cf $fcc0, $a0
154 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
155 ; LA32-NEXT:    ret
157 ; LA64-LABEL: select_sge:
158 ; LA64:       # %bb.0:
159 ; LA64-NEXT:    slt $a0, $a0, $a1
160 ; LA64-NEXT:    xori $a0, $a0, 1
161 ; LA64-NEXT:    movgr2cf $fcc0, $a0
162 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
163 ; LA64-NEXT:    ret
164   %cond = icmp sge i32 %a, %b
165   %res = select i1 %cond, double %x, double %y
166   ret double %res
169 define double @select_slt(i32 signext %a, i32 signext %b, double %x, double %y) {
170 ; LA32-LABEL: select_slt:
171 ; LA32:       # %bb.0:
172 ; LA32-NEXT:    slt $a0, $a0, $a1
173 ; LA32-NEXT:    movgr2cf $fcc0, $a0
174 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
175 ; LA32-NEXT:    ret
177 ; LA64-LABEL: select_slt:
178 ; LA64:       # %bb.0:
179 ; LA64-NEXT:    slt $a0, $a0, $a1
180 ; LA64-NEXT:    movgr2cf $fcc0, $a0
181 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
182 ; LA64-NEXT:    ret
183   %cond = icmp slt i32 %a, %b
184   %res = select i1 %cond, double %x, double %y
185   ret double %res
188 define double @select_sle(i32 signext %a, i32 signext %b, double %x, double %y) {
189 ; LA32-LABEL: select_sle:
190 ; LA32:       # %bb.0:
191 ; LA32-NEXT:    slt $a0, $a1, $a0
192 ; LA32-NEXT:    xori $a0, $a0, 1
193 ; LA32-NEXT:    movgr2cf $fcc0, $a0
194 ; LA32-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
195 ; LA32-NEXT:    ret
197 ; LA64-LABEL: select_sle:
198 ; LA64:       # %bb.0:
199 ; LA64-NEXT:    slt $a0, $a1, $a0
200 ; LA64-NEXT:    xori $a0, $a0, 1
201 ; LA64-NEXT:    movgr2cf $fcc0, $a0
202 ; LA64-NEXT:    fsel $fa0, $fa1, $fa0, $fcc0
203 ; LA64-NEXT:    ret
204   %cond = icmp sle i32 %a, %b
205   %res = select i1 %cond, double %x, double %y
206   ret double %res