Skip to content

Commit 5a86dc9

Browse files
andreisfrtru
authored andcommitted
[Xtensa] Fix lowering FP compare operations.
Impelement lowering of the SETONE/SETOGT/SETOGE/SETUGT/SETUGE operations. This fixes f32 "copysign" and "ueq" tests.
1 parent bb383ad commit 5a86dc9

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,6 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
232232
setOperationAction(ISD::SINT_TO_FP, MVT::i32, Legal);
233233
setOperationAction(ISD::FP_TO_UINT, MVT::i32, Legal);
234234
setOperationAction(ISD::FP_TO_SINT, MVT::i32, Legal);
235-
236-
setCondCodeAction(ISD::SETOGT, MVT::f32, Expand);
237-
setCondCodeAction(ISD::SETOGE, MVT::f32, Expand);
238-
setCondCodeAction(ISD::SETONE, MVT::f32, Expand);
239-
setCondCodeAction(ISD::SETUGE, MVT::f32, Expand);
240-
setCondCodeAction(ISD::SETUGT, MVT::f32, Expand);
241235
} else {
242236
setOperationAction(ISD::BITCAST, MVT::i32, Expand);
243237
setOperationAction(ISD::BITCAST, MVT::f32, Expand);
@@ -877,6 +871,16 @@ static std::pair<unsigned, unsigned> getFPBranchKind(ISD::CondCode Cond) {
877871
return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
878872
case ISD::SETGT:
879873
return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
874+
case ISD::SETOGT:
875+
return std::make_pair(Xtensa::BF, Xtensa::ULE_S);
876+
case ISD::SETOGE:
877+
return std::make_pair(Xtensa::BF, Xtensa::ULT_S);
878+
case ISD::SETONE:
879+
return std::make_pair(Xtensa::BF, Xtensa::UEQ_S);
880+
case ISD::SETUGT:
881+
return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
882+
case ISD::SETUGE:
883+
return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
880884
default:
881885
llvm_unreachable("Invalid condition!");
882886
}

llvm/test/CodeGen/Xtensa/select-cc-fp.ll

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ define float @brcc_olt(float %a, float %b) nounwind {
103103
; CHECK: # %bb.0:
104104
; CHECK-NEXT: wfr f8, a3
105105
; CHECK-NEXT: wfr f9, a2
106-
; CHECK-NEXT: ule.s b0, f8, f9
107-
; CHECK-NEXT: bt b0, .LBB3_2
106+
; CHECK-NEXT: olt.s b0, f9, f8
107+
; CHECK-NEXT: bf b0, .LBB3_2
108108
; CHECK-NEXT: # %bb.1: # %t1
109109
; CHECK-NEXT: l32r a8, .LCPI3_1
110110
; CHECK-NEXT: wfr f8, a8
@@ -135,8 +135,8 @@ define float @brcc_ole(float %a, float %b) nounwind {
135135
; CHECK: # %bb.0:
136136
; CHECK-NEXT: wfr f8, a3
137137
; CHECK-NEXT: wfr f9, a2
138-
; CHECK-NEXT: ult.s b0, f8, f9
139-
; CHECK-NEXT: bt b0, .LBB4_2
138+
; CHECK-NEXT: ole.s b0, f9, f8
139+
; CHECK-NEXT: bf b0, .LBB4_2
140140
; CHECK-NEXT: # %bb.1: # %t1
141141
; CHECK-NEXT: l32r a8, .LCPI4_1
142142
; CHECK-NEXT: wfr f8, a8
@@ -232,7 +232,7 @@ define float @brcc_ueq(float %a, float %b) nounwind {
232232
; CHECK-NEXT: wfr f8, a3
233233
; CHECK-NEXT: wfr f9, a2
234234
; CHECK-NEXT: ueq.s b0, f9, f8
235-
; CHECK-NEXT: bt b0, .LBB7_2
235+
; CHECK-NEXT: bf b0, .LBB7_2
236236
; CHECK-NEXT: # %bb.1: # %t1
237237
; CHECK-NEXT: l32r a8, .LCPI7_1
238238
; CHECK-NEXT: wfr f8, a8
@@ -327,8 +327,8 @@ define float @brcc_ult(float %a, float %b) nounwind {
327327
; CHECK: # %bb.0:
328328
; CHECK-NEXT: wfr f8, a3
329329
; CHECK-NEXT: wfr f9, a2
330-
; CHECK-NEXT: ole.s b0, f8, f9
331-
; CHECK-NEXT: bt b0, .LBB10_2
330+
; CHECK-NEXT: ult.s b0, f9, f8
331+
; CHECK-NEXT: bf b0, .LBB10_2
332332
; CHECK-NEXT: # %bb.1: # %t1
333333
; CHECK-NEXT: l32r a8, .LCPI10_1
334334
; CHECK-NEXT: wfr f8, a8
@@ -359,8 +359,8 @@ define float @brcc_ule(float %a, float %b) nounwind {
359359
; CHECK: # %bb.0:
360360
; CHECK-NEXT: wfr f8, a3
361361
; CHECK-NEXT: wfr f9, a2
362-
; CHECK-NEXT: olt.s b0, f8, f9
363-
; CHECK-NEXT: bt b0, .LBB11_2
362+
; CHECK-NEXT: ule.s b0, f9, f8
363+
; CHECK-NEXT: bf b0, .LBB11_2
364364
; CHECK-NEXT: # %bb.1: # %t1
365365
; CHECK-NEXT: l32r a8, .LCPI11_1
366366
; CHECK-NEXT: wfr f8, a8
@@ -451,6 +451,21 @@ exit:
451451
}
452452

453453
define float @copysign_f32(float %a, float %b) {
454+
; CHECK-LABEL: copysign_f32:
455+
; CHECK: .cfi_startproc
456+
; CHECK-NEXT: # %bb.0: # %entry
457+
; CHECK-NEXT: l32r a8, .LCPI14_0
458+
; CHECK-NEXT: and a8, a3, a8
459+
; CHECK-NEXT: l32r a9, .LCPI14_1
460+
; CHECK-NEXT: and a9, a2, a9
461+
; CHECK-NEXT: wfr f8, a9
462+
; CHECK-NEXT: movi a9, 0
463+
; CHECK-NEXT: beq a8, a9, .LBB14_2
464+
; CHECK-NEXT: # %bb.1:
465+
; CHECK-NEXT: neg.s f8, f8
466+
; CHECK-NEXT: .LBB14_2: # %entry
467+
; CHECK-NEXT: rfr a2, f8
468+
; CHECK-NEXT: ret
454469
entry:
455470
%c = call float @llvm.copysign.f32(float %a, float %b)
456471
ret float %c

0 commit comments

Comments
 (0)