xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/select-icc-flt.ll (revision ed078c48f0d7b499a4565d4da2dde22a4dbf19d9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64
4
5;; Test single-precision floating-point values selection after integers comparison
6
7define float @select_eq(i32 signext %a, i32 signext %b, float %x, float %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
15;
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, float %x, float %y
25  ret float %res
26}
27
28define float @select_ne(i32 signext %a, i32 signext %b, float %x, float %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
36;
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, float %x, float %y
46  ret float %res
47}
48
49define float @select_ugt(i32 signext %a, i32 signext %b, float %x, float %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
56;
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, float %x, float %y
65  ret float %res
66}
67
68define float @select_uge(i32 signext %a, i32 signext %b, float %x, float %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
76;
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, float %x, float %y
86  ret float %res
87}
88
89define float @select_ult(i32 signext %a, i32 signext %b, float %x, float %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
96;
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, float %x, float %y
105  ret float %res
106}
107
108define float @select_ule(i32 signext %a, i32 signext %b, float %x, float %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
116;
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, float %x, float %y
126  ret float %res
127}
128
129define float @select_sgt(i32 signext %a, i32 signext %b, float %x, float %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
136;
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, float %x, float %y
145  ret float %res
146}
147
148define float @select_sge(i32 signext %a, i32 signext %b, float %x, float %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
156;
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, float %x, float %y
166  ret float %res
167}
168
169define float @select_slt(i32 signext %a, i32 signext %b, float %x, float %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
176;
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, float %x, float %y
185  ret float %res
186}
187
188define float @select_sle(i32 signext %a, i32 signext %b, float %x, float %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
196;
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, float %x, float %y
206  ret float %res
207}
208