[llvm] fb9d676 - [LoongArch] Support floating-point number reciprocal

via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 30 23:23:03 PDT 2022


Author: gonglingqin
Date: 2022-08-31T14:20:46+08:00
New Revision: fb9d67636ae06c02f2235ad2ff5826599c86eaf9

URL: https://github.com/llvm/llvm-project/commit/fb9d67636ae06c02f2235ad2ff5826599c86eaf9
DIFF: https://github.com/llvm/llvm-project/commit/fb9d67636ae06c02f2235ad2ff5826599c86eaf9.diff

LOG: [LoongArch] Support floating-point number reciprocal

Differential Revision: https://reviews.llvm.org/D132847

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

Modified: 
    llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
    llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
index 447d255f0d03c..ce483532031b0 100644
--- a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
@@ -213,6 +213,9 @@ def : Pat<(f32 fpimm1), (FFINT_S_W (MOVGR2FR_W (ADDI_W R0, 1)))>;
 
 // FP Conversion
 def : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_W_S FPR32:$src)>;
+
+// FP reciprocal operation
+def : Pat<(fdiv fpimm1, FPR32:$src), (FRECIP_S $src)>;
 } // Predicates = [HasBasicF]
 
 let Predicates = [HasBasicF, IsLA64] in {

diff  --git a/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
index 3104a2d7ef440..3ba68267e3a6a 100644
--- a/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
@@ -215,6 +215,9 @@ def : Pat<(loongarch_ftint FPR32:$src), (FTINTRZ_L_S FPR32:$src)>;
 def : Pat<(f32 (fpround FPR64:$src)), (FCVT_S_D FPR64:$src)>;
 // f32 -> f64
 def : Pat<(f64 (fpextend FPR32:$src)), (FCVT_D_S FPR32:$src)>;
+
+// FP reciprocal operation
+def : Pat<(fdiv fpimm1, FPR64:$src), (FRECIP_D $src)>;
 } // Predicates = [HasBasicD]
 
 /// Floating point constants

diff  --git a/llvm/test/CodeGen/LoongArch/fp-reciprocal.ll b/llvm/test/CodeGen/LoongArch/fp-reciprocal.ll
new file mode 100644
index 0000000000000..b858099839cac
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/fp-reciprocal.ll
@@ -0,0 +1,68 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F
+; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
+; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
+; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
+
+
+define float @f32_reciprocal(float %a) nounwind {
+; LA32F-LABEL: f32_reciprocal:
+; LA32F:       # %bb.0:
+; LA32F-NEXT:    frecip.s $fa0, $fa0
+; LA32F-NEXT:    ret
+;
+; LA32D-LABEL: f32_reciprocal:
+; LA32D:       # %bb.0:
+; LA32D-NEXT:    frecip.s $fa0, $fa0
+; LA32D-NEXT:    ret
+;
+; LA64F-LABEL: f32_reciprocal:
+; LA64F:       # %bb.0:
+; LA64F-NEXT:    frecip.s $fa0, $fa0
+; LA64F-NEXT:    ret
+;
+; LA64D-LABEL: f32_reciprocal:
+; LA64D:       # %bb.0:
+; LA64D-NEXT:    frecip.s $fa0, $fa0
+; LA64D-NEXT:    ret
+  %1 = fdiv float 1.0, %a
+  ret float %1
+}
+
+define double @f64_reciprocal(double %a) nounwind {
+; LA32F-LABEL: f64_reciprocal:
+; LA32F:       # %bb.0:
+; LA32F-NEXT:    addi.w $sp, $sp, -16
+; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32F-NEXT:    move $a3, $a1
+; LA32F-NEXT:    move $a2, $a0
+; LA32F-NEXT:    lu12i.w $a1, 261888
+; LA32F-NEXT:    move $a0, $zero
+; LA32F-NEXT:    bl %plt(__divdf3)
+; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32F-NEXT:    addi.w $sp, $sp, 16
+; LA32F-NEXT:    ret
+;
+; LA32D-LABEL: f64_reciprocal:
+; LA32D:       # %bb.0:
+; LA32D-NEXT:    frecip.d $fa0, $fa0
+; LA32D-NEXT:    ret
+;
+; LA64F-LABEL: f64_reciprocal:
+; LA64F:       # %bb.0:
+; LA64F-NEXT:    addi.d $sp, $sp, -16
+; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64F-NEXT:    move $a1, $a0
+; LA64F-NEXT:    lu52i.d $a0, $zero, 1023
+; LA64F-NEXT:    bl %plt(__divdf3)
+; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64F-NEXT:    addi.d $sp, $sp, 16
+; LA64F-NEXT:    ret
+;
+; LA64D-LABEL: f64_reciprocal:
+; LA64D:       # %bb.0:
+; LA64D-NEXT:    frecip.d $fa0, $fa0
+; LA64D-NEXT:    ret
+  %1 = fdiv double 1.0, %a
+  ret double %1
+}


        


More information about the llvm-commits mailing list