[RISCV] Move some RISCVLoadFPImm out of line. NFC
authorCraig Topper <craig.topper@sifive.com>
Fri, 10 Mar 2023 07:09:27 +0000 (23:09 -0800)
committerCraig Topper <craig.topper@sifive.com>
Fri, 10 Mar 2023 07:22:33 +0000 (23:22 -0800)
This moves the LoadFPImmArr array to the cpp file. Being in the header
meant it was duplicated in every translation unit that includes the
header.

Move the 2 functions that use the array out of line.

llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp
llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h

index 90734c9..cad0cb2 100644 (file)
@@ -214,4 +214,52 @@ bool RISCVRVC::uncompress(MCInst &OutInst, const MCInst &MI,
   return uncompressInst(OutInst, MI, STI);
 }
 
+// We expect an 5-bit binary encoding of a floating-point constant here.
+static constexpr std::pair<uint8_t, uint8_t> LoadFPImmArr[] = {
+    {0b00000001, 0b000}, {0b01101111, 0b000}, {0b01110000, 0b000},
+    {0b01110111, 0b000}, {0b01111000, 0b000}, {0b01111011, 0b000},
+    {0b01111100, 0b000}, {0b01111101, 0b000}, {0b01111101, 0b010},
+    {0b01111101, 0b100}, {0b01111101, 0b110}, {0b01111110, 0b000},
+    {0b01111110, 0b010}, {0b01111110, 0b100}, {0b01111110, 0b110},
+    {0b01111111, 0b000}, {0b01111111, 0b010}, {0b01111111, 0b100},
+    {0b01111111, 0b110}, {0b10000000, 0b000}, {0b10000000, 0b010},
+    {0b10000000, 0b100}, {0b10000001, 0b000}, {0b10000010, 0b000},
+    {0b10000011, 0b000}, {0b10000110, 0b000}, {0b10000111, 0b000},
+    {0b10001110, 0b000}, {0b10001111, 0b000}, {0b11111111, 0b000},
+    {0b11111111, 0b100},
+};
+
+int RISCVLoadFPImm::getLoadFPImm(uint8_t Sign, uint8_t Exp, uint8_t Mantissa) {
+  if (Sign == 0b1 && Exp == 0b01111111 && Mantissa == 0b000)
+    return 0;
+
+  if (Sign == 0b0) {
+    auto EMI = llvm::find(LoadFPImmArr, std::make_pair(Exp, Mantissa));
+    if (EMI != std::end(LoadFPImmArr))
+      return std::distance(std::begin(LoadFPImmArr), EMI) + 1;
+  }
+
+  return -1;
+}
+
+float RISCVLoadFPImm::getFPImm(unsigned Imm) {
+  assert(Imm != 1 && Imm != 30 && Imm != 31 && "Unsupported immediate");
+  uint8_t Sign;
+  uint8_t Exp;
+  uint8_t Mantissa;
+
+  if (Imm == 0) {
+    Sign = 0b1;
+    Exp = 0b01111111;
+    Mantissa = 0b000;
+  } else {
+    Sign = 0b0;
+    Exp = LoadFPImmArr[Imm - 1].first;
+    Mantissa = LoadFPImmArr[Imm - 1].second;
+  }
+
+  uint32_t I = Sign << 31 | Exp << 23 | Mantissa << 20;
+  return bit_cast<float>(I);
+}
+
 } // namespace llvm
index afefdd2..430e0da 100644 (file)
@@ -346,54 +346,9 @@ inline static bool isValidRoundingMode(unsigned Mode) {
 // Floating-point Immediates
 //
 
-// We expect an 5-bit binary encoding of a floating-point constant here.
-static const std::pair<uint8_t, uint8_t> LoadFPImmArr[] = {
-    {0b00000001, 0b000}, {0b01101111, 0b000}, {0b01110000, 0b000},
-    {0b01110111, 0b000}, {0b01111000, 0b000}, {0b01111011, 0b000},
-    {0b01111100, 0b000}, {0b01111101, 0b000}, {0b01111101, 0b010},
-    {0b01111101, 0b100}, {0b01111101, 0b110}, {0b01111110, 0b000},
-    {0b01111110, 0b010}, {0b01111110, 0b100}, {0b01111110, 0b110},
-    {0b01111111, 0b000}, {0b01111111, 0b010}, {0b01111111, 0b100},
-    {0b01111111, 0b110}, {0b10000000, 0b000}, {0b10000000, 0b010},
-    {0b10000000, 0b100}, {0b10000001, 0b000}, {0b10000010, 0b000},
-    {0b10000011, 0b000}, {0b10000110, 0b000}, {0b10000111, 0b000},
-    {0b10001110, 0b000}, {0b10001111, 0b000}, {0b11111111, 0b000},
-    {0b11111111, 0b100},
-};
-
-static inline int getLoadFPImm(uint8_t Sign, uint8_t Exp, uint8_t Mantissa) {
-  if (Sign == 0b1 && Exp == 0b01111111 && Mantissa == 0b000)
-    return 0;
-
-  if (Sign == 0b0) {
-    auto EMI = llvm::find(LoadFPImmArr, std::make_pair(Exp, Mantissa));
-    if (EMI != std::end(LoadFPImmArr))
-      return std::distance(std::begin(LoadFPImmArr), EMI) + 1;
-  }
-
-  return -1;
-}
-
 namespace RISCVLoadFPImm {
-inline static float getFPImm(unsigned Imm) {
-  assert(Imm != 1 && Imm != 30 && Imm != 31 && "Unsupported immediate");
-  uint8_t Sign;
-  uint8_t Exp;
-  uint8_t Mantissa;
-
-  if (Imm == 0) {
-    Sign = 0b1;
-    Exp = 0b01111111;
-    Mantissa = 0b000;
-  } else {
-    Sign = 0b0;
-    Exp = LoadFPImmArr[Imm - 1].first;
-    Mantissa = LoadFPImmArr[Imm - 1].second;
-  }
-
-  uint32_t I = Sign << 31 | Exp << 23 | Mantissa << 20;
-  return bit_cast<float>(I);
-}
+int getLoadFPImm(uint8_t Sign, uint8_t Exp, uint8_t Mantissa);
+float getFPImm(unsigned Imm);
 
 /// getLoadFP32Imm - Return a 5-bit binary encoding of the 32-bit
 /// floating-point immediate value. If the value cannot be represented as a