Skip to content

Commit a7af5b2

Browse files
committed
[RISCV]: Implemented softening of FCANONICALIZE
1 parent 06fc87b commit a7af5b2

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
7070
case ISD::EXTRACT_VECTOR_ELT:
7171
R = SoftenFloatRes_EXTRACT_VECTOR_ELT(N, ResNo); break;
7272
case ISD::FABS: R = SoftenFloatRes_FABS(N); break;
73+
case ISD::FCANONICALIZE:
74+
R = SoftenFloatRes_FCANONICALIZE(N); break;
7375
case ISD::STRICT_FMINNUM:
7476
case ISD::FMINNUM: R = SoftenFloatRes_FMINNUM(N); break;
7577
case ISD::STRICT_FMAXNUM:
@@ -311,6 +313,12 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FABS(SDNode *N) {
311313
return DAG.getNode(ISD::AND, SDLoc(N), NVT, Op, Mask);
312314
}
313315

316+
SDValue DAGTypeLegalizer::SoftenFloatRes_FCANONICALIZE(SDNode *N) {
317+
return SoftenFloatRes_Unary(
318+
N, GetFPLibCall(N->getValueType(0), RTLIB::FMIN_F32, RTLIB::FMIN_F64,
319+
RTLIB::FMIN_F80, RTLIB::FMIN_F128, RTLIB::FMIN_PPCF128));
320+
}
321+
314322
SDValue DAGTypeLegalizer::SoftenFloatRes_FMINNUM(SDNode *N) {
315323
if (SDValue SelCC = TLI.createSelectForFMINNUM_FMAXNUM(N, DAG))
316324
return SoftenFloatRes_SELECT_CC(SelCC.getNode());

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
585585
SDValue SoftenFloatRes_FASIN(SDNode *N);
586586
SDValue SoftenFloatRes_FATAN(SDNode *N);
587587
SDValue SoftenFloatRes_FATAN2(SDNode *N);
588+
SDValue SoftenFloatRes_FCANONICALIZE(SDNode *N);
588589
SDValue SoftenFloatRes_FMINNUM(SDNode *N);
589590
SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
590591
SDValue SoftenFloatRes_FMINIMUMNUM(SDNode *N);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefix=RV64I %s
3+
; RUN: llc -mtriple=riscv64 -mattr=+d < %s | FileCheck -check-prefix=RV64D %s
4+
5+
define double @max(double, double) unnamed_addr #0 {
6+
; RV64I-LABEL: max:
7+
; RV64I: # %bb.0: # %start
8+
; RV64I-NEXT: addi sp, sp, -32
9+
; RV64I-NEXT: .cfi_def_cfa_offset 32
10+
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
11+
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
12+
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
13+
; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill
14+
; RV64I-NEXT: .cfi_offset ra, -8
15+
; RV64I-NEXT: .cfi_offset s0, -16
16+
; RV64I-NEXT: .cfi_offset s1, -24
17+
; RV64I-NEXT: .cfi_offset s2, -32
18+
; RV64I-NEXT: mv s0, a1
19+
; RV64I-NEXT: mv s1, a0
20+
; RV64I-NEXT: call __ltdf2
21+
; RV64I-NEXT: srli s2, a0, 63
22+
; RV64I-NEXT: mv a0, s1
23+
; RV64I-NEXT: mv a1, s1
24+
; RV64I-NEXT: call __unorddf2
25+
; RV64I-NEXT: snez a0, a0
26+
; RV64I-NEXT: or a0, a0, s2
27+
; RV64I-NEXT: bnez a0, .LBB0_2
28+
; RV64I-NEXT: # %bb.1: # %start
29+
; RV64I-NEXT: mv s0, s1
30+
; RV64I-NEXT: .LBB0_2: # %start
31+
; RV64I-NEXT: mv a0, s0
32+
; RV64I-NEXT: call fmin
33+
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
34+
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
35+
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
36+
; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload
37+
; RV64I-NEXT: .cfi_restore ra
38+
; RV64I-NEXT: .cfi_restore s0
39+
; RV64I-NEXT: .cfi_restore s1
40+
; RV64I-NEXT: .cfi_restore s2
41+
; RV64I-NEXT: addi sp, sp, 32
42+
; RV64I-NEXT: .cfi_def_cfa_offset 0
43+
; RV64I-NEXT: ret
44+
;
45+
; RV64D-LABEL: max:
46+
; RV64D: # %bb.0: # %start
47+
; RV64D-NEXT: flt.d a0, fa0, fa1
48+
; RV64D-NEXT: feq.d a1, fa0, fa0
49+
; RV64D-NEXT: xori a1, a1, 1
50+
; RV64D-NEXT: or a0, a1, a0
51+
; RV64D-NEXT: bnez a0, .LBB0_2
52+
; RV64D-NEXT: # %bb.1: # %start
53+
; RV64D-NEXT: fmv.d fa1, fa0
54+
; RV64D-NEXT: .LBB0_2: # %start
55+
; RV64D-NEXT: fmin.d fa0, fa1, fa1
56+
; RV64D-NEXT: ret
57+
start:
58+
%2 = fcmp olt double %0, %1
59+
%3 = fcmp uno double %0, 0.000000e+00
60+
%or.cond.i.i = or i1 %3, %2
61+
%4 = select i1 %or.cond.i.i, double %1, double %0
62+
%5 = tail call double @llvm.canonicalize.f64(double %4) #2
63+
ret double %5
64+
}

0 commit comments

Comments
 (0)