Skip to content

Commit 9f20903

Browse files
committed
deal with frecip and frsqrt
1 parent 7c370cd commit 9f20903

File tree

5 files changed

+45
-47
lines changed

5 files changed

+45
-47
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,14 @@ def : PatFpr<fneg, FNEG_S, FPR32>;
189189
def : PatFpr<fabs, FABS_S, FPR32>;
190190
def : PatFpr<fsqrt, FSQRT_S, FPR32>;
191191
def : Pat<(fdiv fpimm1, (fsqrt FPR32:$fj)), (FRSQRT_S FPR32:$fj)>;
192+
let Predicates = [HasBasicF, IsLA64] in {
193+
def : Pat<(fdiv (loongarch_movgr2fr_w_la64 (i64 1065353216)), (fsqrt FPR32:$fj)),
194+
(FRSQRT_S FPR32:$fj)>;
195+
} // Predicates = [HasBasicF, IsLA64]
196+
let Predicates = [HasBasicF, IsLA32] in {
197+
def : Pat<(fdiv (loongarch_movgr2fr_w (i32 1065353216)), (fsqrt FPR32:$fj)),
198+
(FRSQRT_S FPR32:$fj)>;
199+
} // Predicates = [HasBasicF, IsLA32]
192200
def : Pat<(fcanonicalize FPR32:$fj), (FMAX_S $fj, $fj)>;
193201
def : Pat<(is_fpclass FPR32:$fj, (i32 timm:$mask)),
194202
(SLTU R0, (ANDI (MOVFR2GR_S (FCLASS_S FPR32:$fj)),
@@ -299,6 +307,14 @@ def : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_W_S FPR32:$src)>;
299307

300308
// FP reciprocal operation
301309
def : Pat<(fdiv fpimm1, FPR32:$src), (FRECIP_S $src)>;
310+
let Predicates = [HasBasicF, IsLA64] in {
311+
def : Pat<(fdiv (loongarch_movgr2fr_w_la64 (i64 1065353216)), FPR32:$src),
312+
(FRECIP_S $src)>;
313+
} // Predicates = [HasBasicF, IsLA64]
314+
let Predicates = [HasBasicF, IsLA32] in {
315+
def : Pat<(fdiv (loongarch_movgr2fr_w (i32 1065353216)), FPR32:$src),
316+
(FRECIP_S $src)>;
317+
} // Predicates = [HasBasicF, IsLA32]
302318

303319
let Predicates = [HasFrecipe] in {
304320
// FP approximate reciprocal operation

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ def : PatFpr<fneg, FNEG_D, FPR64>;
162162
def : PatFpr<fabs, FABS_D, FPR64>;
163163
def : PatFpr<fsqrt, FSQRT_D, FPR64>;
164164
def : Pat<(fdiv fpimm1, (fsqrt FPR64:$fj)), (FRSQRT_D FPR64:$fj)>;
165+
let Predicates = [IsLA32] in {
166+
def : Pat<(fdiv (loongarch_movgr2fr_d_lo_hi (i32 0), (i32 1072693248)),
167+
(fsqrt FPR64:$fj)),
168+
(FRSQRT_D FPR64:$fj)>;
169+
} // Predicates = [IsLA32]
165170
def : Pat<(fcopysign FPR64:$fj, FPR32:$fk),
166171
(FCOPYSIGN_D FPR64:$fj, (FCVT_D_S FPR32:$fk))>;
167172
def : Pat<(fcopysign FPR32:$fj, FPR64:$fk),
@@ -267,6 +272,10 @@ def : Pat<(f64 (fpextend FPR32:$src)), (FCVT_D_S FPR32:$src)>;
267272

268273
// FP reciprocal operation
269274
def : Pat<(fdiv fpimm1, FPR64:$src), (FRECIP_D $src)>;
275+
let Predicates = [IsLA32] in {
276+
def : Pat<(fdiv (loongarch_movgr2fr_d_lo_hi (i32 0), (i32 1072693248)), FPR64:$src),
277+
(FRECIP_D FPR64:$src)>;
278+
} // Predicates = [IsLA32]
270279

271280
let Predicates = [HasFrecipe] in {
272281
// FP approximate reciprocal operation

llvm/test/CodeGen/LoongArch/fp-reciprocal.ll

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,17 @@
88
define float @f32_reciprocal(float %a) nounwind {
99
; LA32F-LABEL: f32_reciprocal:
1010
; LA32F: # %bb.0:
11-
; LA32F-NEXT: lu12i.w $a0, 260096
12-
; LA32F-NEXT: movgr2fr.w $fa1, $a0
13-
; LA32F-NEXT: fdiv.s $fa0, $fa1, $fa0
11+
; LA32F-NEXT: frecip.s $fa0, $fa0
1412
; LA32F-NEXT: ret
1513
;
1614
; LA32D-LABEL: f32_reciprocal:
1715
; LA32D: # %bb.0:
18-
; LA32D-NEXT: lu12i.w $a0, 260096
19-
; LA32D-NEXT: movgr2fr.w $fa1, $a0
20-
; LA32D-NEXT: fdiv.s $fa0, $fa1, $fa0
16+
; LA32D-NEXT: frecip.s $fa0, $fa0
2117
; LA32D-NEXT: ret
2218
;
2319
; LA64F-LABEL: f32_reciprocal:
2420
; LA64F: # %bb.0:
25-
; LA64F-NEXT: lu12i.w $a0, 260096
26-
; LA64F-NEXT: movgr2fr.w $fa1, $a0
27-
; LA64F-NEXT: fdiv.s $fa0, $fa1, $fa0
21+
; LA64F-NEXT: frecip.s $fa0, $fa0
2822
; LA64F-NEXT: ret
2923
;
3024
; LA64D-LABEL: f32_reciprocal:
@@ -51,10 +45,7 @@ define double @f64_reciprocal(double %a) nounwind {
5145
;
5246
; LA32D-LABEL: f64_reciprocal:
5347
; LA32D: # %bb.0:
54-
; LA32D-NEXT: movgr2fr.w $fa1, $zero
55-
; LA32D-NEXT: lu12i.w $a0, 261888
56-
; LA32D-NEXT: movgr2frh.w $fa1, $a0
57-
; LA32D-NEXT: fdiv.d $fa0, $fa1, $fa0
48+
; LA32D-NEXT: frecip.d $fa0, $fa0
5849
; LA32D-NEXT: ret
5950
;
6051
; LA64F-LABEL: f64_reciprocal:

llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ declare double @llvm.sqrt.f64(double)
1111
define float @frsqrt_f32(float %a) nounwind {
1212
; LA32F-LABEL: frsqrt_f32:
1313
; LA32F: # %bb.0:
14-
; LA32F-NEXT: fsqrt.s $fa0, $fa0
15-
; LA32F-NEXT: lu12i.w $a0, 260096
16-
; LA32F-NEXT: movgr2fr.w $fa1, $a0
17-
; LA32F-NEXT: fdiv.s $fa0, $fa1, $fa0
14+
; LA32F-NEXT: frsqrt.s $fa0, $fa0
1815
; LA32F-NEXT: ret
1916
;
2017
; LA32F-FRECIPE-LABEL: frsqrt_f32:
@@ -564,15 +561,14 @@ define double @sqrt_simplify_before_recip_4_uses_f64(double %x, ptr %p1, ptr %p2
564561
define float @sqrt_simplify_before_recip_3_uses_f32(float %x, ptr %p1, ptr %p2) nounwind {
565562
; LA32F-LABEL: sqrt_simplify_before_recip_3_uses_f32:
566563
; LA32F: # %bb.0:
567-
; LA32F-NEXT: fsqrt.s $fa0, $fa0
568-
; LA32F-NEXT: lu12i.w $a2, 260096
569-
; LA32F-NEXT: movgr2fr.w $fa1, $a2
570-
; LA32F-NEXT: fdiv.s $fa1, $fa1, $fa0
564+
; LA32F-NEXT: fsqrt.s $fa1, $fa0
565+
; LA32F-NEXT: frsqrt.s $fa0, $fa0
571566
; LA32F-NEXT: lu12i.w $a2, 270976
572567
; LA32F-NEXT: movgr2fr.w $fa2, $a2
573-
; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa0
574-
; LA32F-NEXT: fst.s $fa1, $a0, 0
568+
; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa1
569+
; LA32F-NEXT: fst.s $fa0, $a0, 0
575570
; LA32F-NEXT: fst.s $fa2, $a1, 0
571+
; LA32F-NEXT: fmov.s $fa0, $fa1
576572
; LA32F-NEXT: ret
577573
;
578574
; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f32:
@@ -636,19 +632,18 @@ define float @sqrt_simplify_before_recip_3_uses_f32(float %x, ptr %p1, ptr %p2)
636632
define float @sqrt_simplify_before_recip_4_uses_f32(float %x, ptr %p1, ptr %p2, ptr %p3) nounwind {
637633
; LA32F-LABEL: sqrt_simplify_before_recip_4_uses_f32:
638634
; LA32F: # %bb.0:
639-
; LA32F-NEXT: fsqrt.s $fa0, $fa0
640-
; LA32F-NEXT: lu12i.w $a3, 260096
641-
; LA32F-NEXT: movgr2fr.w $fa1, $a3
642-
; LA32F-NEXT: fdiv.s $fa1, $fa1, $fa0
635+
; LA32F-NEXT: fsqrt.s $fa1, $fa0
636+
; LA32F-NEXT: frsqrt.s $fa0, $fa0
643637
; LA32F-NEXT: lu12i.w $a3, 270976
644638
; LA32F-NEXT: movgr2fr.w $fa2, $a3
645-
; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa0
639+
; LA32F-NEXT: fdiv.s $fa2, $fa2, $fa1
646640
; LA32F-NEXT: lu12i.w $a3, 271040
647641
; LA32F-NEXT: movgr2fr.w $fa3, $a3
648-
; LA32F-NEXT: fdiv.s $fa3, $fa3, $fa0
649-
; LA32F-NEXT: fst.s $fa1, $a0, 0
642+
; LA32F-NEXT: fdiv.s $fa3, $fa3, $fa1
643+
; LA32F-NEXT: fst.s $fa0, $a0, 0
650644
; LA32F-NEXT: fst.s $fa2, $a1, 0
651645
; LA32F-NEXT: fst.s $fa3, $a2, 0
646+
; LA32F-NEXT: fmov.s $fa0, $fa1
652647
; LA32F-NEXT: ret
653648
;
654649
; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f32:

llvm/test/CodeGen/LoongArch/fsqrt.ll

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,17 @@ define double @fsqrt_f64(double %a) nounwind {
6767
define float @frsqrt_f32(float %a) nounwind {
6868
; LA32F-LABEL: frsqrt_f32:
6969
; LA32F: # %bb.0:
70-
; LA32F-NEXT: fsqrt.s $fa0, $fa0
71-
; LA32F-NEXT: lu12i.w $a0, 260096
72-
; LA32F-NEXT: movgr2fr.w $fa1, $a0
73-
; LA32F-NEXT: fdiv.s $fa0, $fa1, $fa0
70+
; LA32F-NEXT: frsqrt.s $fa0, $fa0
7471
; LA32F-NEXT: ret
7572
;
7673
; LA32D-LABEL: frsqrt_f32:
7774
; LA32D: # %bb.0:
78-
; LA32D-NEXT: fsqrt.s $fa0, $fa0
79-
; LA32D-NEXT: lu12i.w $a0, 260096
80-
; LA32D-NEXT: movgr2fr.w $fa1, $a0
81-
; LA32D-NEXT: fdiv.s $fa0, $fa1, $fa0
75+
; LA32D-NEXT: frsqrt.s $fa0, $fa0
8276
; LA32D-NEXT: ret
8377
;
8478
; LA64F-LABEL: frsqrt_f32:
8579
; LA64F: # %bb.0:
86-
; LA64F-NEXT: fsqrt.s $fa0, $fa0
87-
; LA64F-NEXT: lu12i.w $a0, 260096
88-
; LA64F-NEXT: movgr2fr.w $fa1, $a0
89-
; LA64F-NEXT: fdiv.s $fa0, $fa1, $fa0
80+
; LA64F-NEXT: frsqrt.s $fa0, $fa0
9081
; LA64F-NEXT: ret
9182
;
9283
; LA64D-LABEL: frsqrt_f32:
@@ -115,11 +106,7 @@ define double @frsqrt_f64(double %a) nounwind {
115106
;
116107
; LA32D-LABEL: frsqrt_f64:
117108
; LA32D: # %bb.0:
118-
; LA32D-NEXT: fsqrt.d $fa0, $fa0
119-
; LA32D-NEXT: movgr2fr.w $fa1, $zero
120-
; LA32D-NEXT: lu12i.w $a0, 261888
121-
; LA32D-NEXT: movgr2frh.w $fa1, $a0
122-
; LA32D-NEXT: fdiv.d $fa0, $fa1, $fa0
109+
; LA32D-NEXT: frsqrt.d $fa0, $fa0
123110
; LA32D-NEXT: ret
124111
;
125112
; LA64F-LABEL: frsqrt_f64:

0 commit comments

Comments
 (0)