Skip to content

Commit fb9d676

Browse files
committed
[LoongArch] Support floating-point number reciprocal
Differential Revision: https://reviews.llvm.org/D132847
1 parent 6917799 commit fb9d676

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ def : Pat<(f32 fpimm1), (FFINT_S_W (MOVGR2FR_W (ADDI_W R0, 1)))>;
213213

214214
// FP Conversion
215215
def : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_W_S FPR32:$src)>;
216+
217+
// FP reciprocal operation
218+
def : Pat<(fdiv fpimm1, FPR32:$src), (FRECIP_S $src)>;
216219
} // Predicates = [HasBasicF]
217220

218221
let Predicates = [HasBasicF, IsLA64] in {

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_L_S FPR32:$src)>;
215215
def : Pat<(f32 (fpround FPR64:$src)), (FCVT_S_D FPR64:$src)>;
216216
// f32 -> f64
217217
def : Pat<(f64 (fpextend FPR32:$src)), (FCVT_D_S FPR32:$src)>;
218+
219+
// FP reciprocal operation
220+
def : Pat<(fdiv fpimm1, FPR64:$src), (FRECIP_D $src)>;
218221
} // Predicates = [HasBasicD]
219222

220223
/// Floating point constants
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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=LA32F
3+
; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
4+
; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
5+
; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
6+
7+
8+
define float @f32_reciprocal(float %a) nounwind {
9+
; LA32F-LABEL: f32_reciprocal:
10+
; LA32F: # %bb.0:
11+
; LA32F-NEXT: frecip.s $fa0, $fa0
12+
; LA32F-NEXT: ret
13+
;
14+
; LA32D-LABEL: f32_reciprocal:
15+
; LA32D: # %bb.0:
16+
; LA32D-NEXT: frecip.s $fa0, $fa0
17+
; LA32D-NEXT: ret
18+
;
19+
; LA64F-LABEL: f32_reciprocal:
20+
; LA64F: # %bb.0:
21+
; LA64F-NEXT: frecip.s $fa0, $fa0
22+
; LA64F-NEXT: ret
23+
;
24+
; LA64D-LABEL: f32_reciprocal:
25+
; LA64D: # %bb.0:
26+
; LA64D-NEXT: frecip.s $fa0, $fa0
27+
; LA64D-NEXT: ret
28+
%1 = fdiv float 1.0, %a
29+
ret float %1
30+
}
31+
32+
define double @f64_reciprocal(double %a) nounwind {
33+
; LA32F-LABEL: f64_reciprocal:
34+
; LA32F: # %bb.0:
35+
; LA32F-NEXT: addi.w $sp, $sp, -16
36+
; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
37+
; LA32F-NEXT: move $a3, $a1
38+
; LA32F-NEXT: move $a2, $a0
39+
; LA32F-NEXT: lu12i.w $a1, 261888
40+
; LA32F-NEXT: move $a0, $zero
41+
; LA32F-NEXT: bl %plt(__divdf3)
42+
; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
43+
; LA32F-NEXT: addi.w $sp, $sp, 16
44+
; LA32F-NEXT: ret
45+
;
46+
; LA32D-LABEL: f64_reciprocal:
47+
; LA32D: # %bb.0:
48+
; LA32D-NEXT: frecip.d $fa0, $fa0
49+
; LA32D-NEXT: ret
50+
;
51+
; LA64F-LABEL: f64_reciprocal:
52+
; LA64F: # %bb.0:
53+
; LA64F-NEXT: addi.d $sp, $sp, -16
54+
; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
55+
; LA64F-NEXT: move $a1, $a0
56+
; LA64F-NEXT: lu52i.d $a0, $zero, 1023
57+
; LA64F-NEXT: bl %plt(__divdf3)
58+
; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
59+
; LA64F-NEXT: addi.d $sp, $sp, 16
60+
; LA64F-NEXT: ret
61+
;
62+
; LA64D-LABEL: f64_reciprocal:
63+
; LA64D: # %bb.0:
64+
; LA64D-NEXT: frecip.d $fa0, $fa0
65+
; LA64D-NEXT: ret
66+
%1 = fdiv double 1.0, %a
67+
ret double %1
68+
}

0 commit comments

Comments
 (0)