Skip to content

Commit ec2640b

Browse files
gonglingqinSixWeining
authored andcommitted
[LoongArch] Handle missing CondCodes
Support SETLE/SETEQ and expand SETGE/SETNE/SETGT Differential Revision: https://reviews.llvm.org/D135511
1 parent fe97f95 commit ec2640b

File tree

5 files changed

+236
-4
lines changed

5 files changed

+236
-4
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,13 @@ def : Pat<(fcanonicalize FPR32:$fj), (FMAX_S $fj, $fj)>;
160160
class PatFPSetcc<CondCode cc, LAInst CmpInst, RegisterClass RegTy>
161161
: Pat<(any_fsetcc RegTy:$fj, RegTy:$fk, cc),
162162
(MOVCF2GR (CmpInst RegTy:$fj, RegTy:$fk))>;
163-
// SETOGT/SETOGE/SETUGT/SETUGE will expand into SETOLT/SETOLE/SETULT/SETULE.
163+
// SETOGT/SETOGE/SETUGT/SETUGE/SETGE/SETNE/SETGT will expand into
164+
// SETOLT/SETOLE/SETULT/SETULE/SETLE/SETEQ/SETLT.
164165
def : PatFPSetcc<SETOEQ, FCMP_CEQ_S, FPR32>;
166+
def : PatFPSetcc<SETEQ, FCMP_CEQ_S, FPR32>;
165167
def : PatFPSetcc<SETOLT, FCMP_CLT_S, FPR32>;
166168
def : PatFPSetcc<SETOLE, FCMP_CLE_S, FPR32>;
169+
def : PatFPSetcc<SETLE, FCMP_CLE_S, FPR32>;
167170
def : PatFPSetcc<SETONE, FCMP_CNE_S, FPR32>;
168171
def : PatFPSetcc<SETO, FCMP_COR_S, FPR32>;
169172
def : PatFPSetcc<SETUEQ, FCMP_CUEQ_S, FPR32>;

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,13 @@ def : Pat<(fcanonicalize FPR64:$fj), (FMAX_D $fj, $fj)>;
168168

169169
// Match non-signaling comparison
170170

171-
// SETOGT/SETOGE/SETUGT/SETUGE will expand into SETOLT/SETOLE/SETULT/SETULE.
171+
// SETOGT/SETOGE/SETUGT/SETUGE/SETGE/SETNE/SETGT will expand into
172+
// SETOLT/SETOLE/SETULT/SETULE/SETLE/SETEQ/SETLT.
172173
def : PatFPSetcc<SETOEQ, FCMP_CEQ_D, FPR64>;
174+
def : PatFPSetcc<SETEQ, FCMP_CEQ_D, FPR64>;
173175
def : PatFPSetcc<SETOLT, FCMP_CLT_D, FPR64>;
174176
def : PatFPSetcc<SETOLE, FCMP_CLE_D, FPR64>;
177+
def : PatFPSetcc<SETLE, FCMP_CLE_D, FPR64>;
175178
def : PatFPSetcc<SETONE, FCMP_CNE_D, FPR64>;
176179
def : PatFPSetcc<SETO, FCMP_COR_D, FPR64>;
177180
def : PatFPSetcc<SETUEQ, FCMP_CUEQ_D, FPR64>;

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
111111
setOperationAction(ISD::BITREVERSE, MVT::i32, Legal);
112112
}
113113

114-
static const ISD::CondCode FPCCToExpand[] = {ISD::SETOGT, ISD::SETOGE,
115-
ISD::SETUGT, ISD::SETUGE};
114+
static const ISD::CondCode FPCCToExpand[] = {
115+
ISD::SETOGT, ISD::SETOGE, ISD::SETUGT, ISD::SETUGE,
116+
ISD::SETGE, ISD::SETNE, ISD::SETGT};
116117

117118
if (Subtarget.hasBasicF()) {
118119
setCondCodeAction(FPCCToExpand, MVT::f32, Expand);

llvm/test/CodeGen/LoongArch/ir-instruction/fcmp-dbl.ll

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,120 @@ define i1 @fcmp_true(double %a, double %b) {
256256
%cmp = fcmp true double %a, %b
257257
ret i1 %cmp
258258
}
259+
260+
define i1 @fcmp_fast_olt(double %a, double %b, i1 %c) nounwind {
261+
; LA32-LABEL: fcmp_fast_olt:
262+
; LA32: # %bb.0:
263+
; LA32-NEXT: movgr2fr.w $fa1, $zero
264+
; LA32-NEXT: movgr2frh.w $fa1, $zero
265+
; LA32-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0
266+
; LA32-NEXT: movcf2gr $a1, $fcc0
267+
; LA32-NEXT: bnez $a1, .LBB16_2
268+
; LA32-NEXT: # %bb.1: # %if.then
269+
; LA32-NEXT: ret
270+
; LA32-NEXT: .LBB16_2: # %if.else
271+
; LA32-NEXT: movgr2fr.w $fa1, $zero
272+
; LA32-NEXT: movgr2frh.w $fa1, $zero
273+
; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1
274+
; LA32-NEXT: movcf2gr $a0, $fcc0
275+
; LA32-NEXT: ret
276+
;
277+
; LA64-LABEL: fcmp_fast_olt:
278+
; LA64: # %bb.0:
279+
; LA64-NEXT: movgr2fr.d $fa1, $zero
280+
; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0
281+
; LA64-NEXT: movcf2gr $a1, $fcc0
282+
; LA64-NEXT: bnez $a1, .LBB16_2
283+
; LA64-NEXT: # %bb.1: # %if.then
284+
; LA64-NEXT: ret
285+
; LA64-NEXT: .LBB16_2: # %if.else
286+
; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1
287+
; LA64-NEXT: movcf2gr $a0, $fcc0
288+
; LA64-NEXT: ret
289+
%cmp = fcmp fast olt double %a, 0.000000e+00
290+
br i1 %cmp, label %if.then, label %if.else
291+
292+
if.then:
293+
ret i1 %c
294+
295+
if.else:
296+
ret i1 %cmp
297+
}
298+
299+
define i1 @fcmp_fast_oeq(double %a, double %b, i1 %c) nounwind {
300+
; LA32-LABEL: fcmp_fast_oeq:
301+
; LA32: # %bb.0:
302+
; LA32-NEXT: movgr2fr.w $fa1, $zero
303+
; LA32-NEXT: movgr2frh.w $fa1, $zero
304+
; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
305+
; LA32-NEXT: movcf2gr $a1, $fcc0
306+
; LA32-NEXT: xori $a1, $a1, 1
307+
; LA32-NEXT: bnez $a1, .LBB17_2
308+
; LA32-NEXT: # %bb.1: # %if.then
309+
; LA32-NEXT: ret
310+
; LA32-NEXT: .LBB17_2: # %if.else
311+
; LA32-NEXT: movgr2fr.w $fa1, $zero
312+
; LA32-NEXT: movgr2frh.w $fa1, $zero
313+
; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
314+
; LA32-NEXT: movcf2gr $a0, $fcc0
315+
; LA32-NEXT: ret
316+
;
317+
; LA64-LABEL: fcmp_fast_oeq:
318+
; LA64: # %bb.0:
319+
; LA64-NEXT: movgr2fr.d $fa1, $zero
320+
; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
321+
; LA64-NEXT: movcf2gr $a1, $fcc0
322+
; LA64-NEXT: xori $a1, $a1, 1
323+
; LA64-NEXT: bnez $a1, .LBB17_2
324+
; LA64-NEXT: # %bb.1: # %if.then
325+
; LA64-NEXT: ret
326+
; LA64-NEXT: .LBB17_2: # %if.else
327+
; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
328+
; LA64-NEXT: movcf2gr $a0, $fcc0
329+
; LA64-NEXT: ret
330+
%cmp = fcmp fast oeq double %a, 0.000000e+00
331+
br i1 %cmp, label %if.then, label %if.else
332+
333+
if.then:
334+
ret i1 %c
335+
336+
if.else:
337+
ret i1 %cmp
338+
}
339+
340+
define i1 @fcmp_fast_ole(double %a, double %b, i1 %c) nounwind {
341+
; LA32-LABEL: fcmp_fast_ole:
342+
; LA32: # %bb.0:
343+
; LA32-NEXT: movgr2fr.w $fa1, $zero
344+
; LA32-NEXT: movgr2frh.w $fa1, $zero
345+
; LA32-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0
346+
; LA32-NEXT: bcnez $fcc0, .LBB18_2
347+
; LA32-NEXT: # %bb.1: # %if.then
348+
; LA32-NEXT: ret
349+
; LA32-NEXT: .LBB18_2: # %if.else
350+
; LA32-NEXT: movgr2fr.w $fa1, $zero
351+
; LA32-NEXT: movgr2frh.w $fa1, $zero
352+
; LA32-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1
353+
; LA32-NEXT: movcf2gr $a0, $fcc0
354+
; LA32-NEXT: ret
355+
;
356+
; LA64-LABEL: fcmp_fast_ole:
357+
; LA64: # %bb.0:
358+
; LA64-NEXT: movgr2fr.d $fa1, $zero
359+
; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0
360+
; LA64-NEXT: bcnez $fcc0, .LBB18_2
361+
; LA64-NEXT: # %bb.1: # %if.then
362+
; LA64-NEXT: ret
363+
; LA64-NEXT: .LBB18_2: # %if.else
364+
; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1
365+
; LA64-NEXT: movcf2gr $a0, $fcc0
366+
; LA64-NEXT: ret
367+
%cmp = fcmp fast ole double %a, 0.000000e+00
368+
br i1 %cmp, label %if.then, label %if.else
369+
370+
if.then:
371+
ret i1 %c
372+
373+
if.else:
374+
ret i1 %cmp
375+
}

llvm/test/CodeGen/LoongArch/ir-instruction/fcmp-flt.ll

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,111 @@ define i1 @fcmp_true(float %a, float %b) {
256256
%cmp = fcmp true float %a, %b
257257
ret i1 %cmp
258258
}
259+
260+
define i1 @fcmp_fast_olt(float %a, float %b, i1 %c) nounwind {
261+
; LA32-LABEL: fcmp_fast_olt:
262+
; LA32: # %bb.0:
263+
; LA32-NEXT: movgr2fr.w $fa1, $zero
264+
; LA32-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0
265+
; LA32-NEXT: movcf2gr $a1, $fcc0
266+
; LA32-NEXT: bnez $a1, .LBB16_2
267+
; LA32-NEXT: # %bb.1: # %if.then
268+
; LA32-NEXT: ret
269+
; LA32-NEXT: .LBB16_2: # %if.else
270+
; LA32-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1
271+
; LA32-NEXT: movcf2gr $a0, $fcc0
272+
; LA32-NEXT: ret
273+
;
274+
; LA64-LABEL: fcmp_fast_olt:
275+
; LA64: # %bb.0:
276+
; LA64-NEXT: movgr2fr.w $fa1, $zero
277+
; LA64-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0
278+
; LA64-NEXT: movcf2gr $a1, $fcc0
279+
; LA64-NEXT: bnez $a1, .LBB16_2
280+
; LA64-NEXT: # %bb.1: # %if.then
281+
; LA64-NEXT: ret
282+
; LA64-NEXT: .LBB16_2: # %if.else
283+
; LA64-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1
284+
; LA64-NEXT: movcf2gr $a0, $fcc0
285+
; LA64-NEXT: ret
286+
%cmp = fcmp fast olt float %a, 0.000000e+00
287+
br i1 %cmp, label %if.then, label %if.else
288+
289+
if.then:
290+
ret i1 %c
291+
292+
if.else:
293+
ret i1 %cmp
294+
}
295+
296+
define i1 @fcmp_fast_oeq(float %a, float %b, i1 %c) nounwind {
297+
; LA32-LABEL: fcmp_fast_oeq:
298+
; LA32: # %bb.0:
299+
; LA32-NEXT: movgr2fr.w $fa1, $zero
300+
; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
301+
; LA32-NEXT: movcf2gr $a1, $fcc0
302+
; LA32-NEXT: xori $a1, $a1, 1
303+
; LA32-NEXT: bnez $a1, .LBB17_2
304+
; LA32-NEXT: # %bb.1: # %if.then
305+
; LA32-NEXT: ret
306+
; LA32-NEXT: .LBB17_2: # %if.else
307+
; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
308+
; LA32-NEXT: movcf2gr $a0, $fcc0
309+
; LA32-NEXT: ret
310+
;
311+
; LA64-LABEL: fcmp_fast_oeq:
312+
; LA64: # %bb.0:
313+
; LA64-NEXT: movgr2fr.w $fa1, $zero
314+
; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
315+
; LA64-NEXT: movcf2gr $a1, $fcc0
316+
; LA64-NEXT: xori $a1, $a1, 1
317+
; LA64-NEXT: bnez $a1, .LBB17_2
318+
; LA64-NEXT: # %bb.1: # %if.then
319+
; LA64-NEXT: ret
320+
; LA64-NEXT: .LBB17_2: # %if.else
321+
; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
322+
; LA64-NEXT: movcf2gr $a0, $fcc0
323+
; LA64-NEXT: ret
324+
%cmp = fcmp fast oeq float %a, 0.000000e+00
325+
br i1 %cmp, label %if.then, label %if.else
326+
327+
if.then:
328+
ret i1 %c
329+
330+
if.else:
331+
ret i1 %cmp
332+
}
333+
334+
define i1 @fcmp_fast_ole(float %a, float %b, i1 %c) nounwind {
335+
; LA32-LABEL: fcmp_fast_ole:
336+
; LA32: # %bb.0:
337+
; LA32-NEXT: movgr2fr.w $fa1, $zero
338+
; LA32-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
339+
; LA32-NEXT: bcnez $fcc0, .LBB18_2
340+
; LA32-NEXT: # %bb.1: # %if.then
341+
; LA32-NEXT: ret
342+
; LA32-NEXT: .LBB18_2: # %if.else
343+
; LA32-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1
344+
; LA32-NEXT: movcf2gr $a0, $fcc0
345+
; LA32-NEXT: ret
346+
;
347+
; LA64-LABEL: fcmp_fast_ole:
348+
; LA64: # %bb.0:
349+
; LA64-NEXT: movgr2fr.w $fa1, $zero
350+
; LA64-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
351+
; LA64-NEXT: bcnez $fcc0, .LBB18_2
352+
; LA64-NEXT: # %bb.1: # %if.then
353+
; LA64-NEXT: ret
354+
; LA64-NEXT: .LBB18_2: # %if.else
355+
; LA64-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1
356+
; LA64-NEXT: movcf2gr $a0, $fcc0
357+
; LA64-NEXT: ret
358+
%cmp = fcmp fast ole float %a, 0.000000e+00
359+
br i1 %cmp, label %if.then, label %if.else
360+
361+
if.then:
362+
ret i1 %c
363+
364+
if.else:
365+
ret i1 %cmp
366+
}

0 commit comments

Comments
 (0)