From: Craig Topper Date: Fri, 10 Mar 2023 07:09:27 +0000 (-0800) Subject: [RISCV] Move some RISCVLoadFPImm out of line. NFC X-Git-Tag: upstream/17.0.6~15286 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d704c7a6b3656e0a049f3c547ad5e2cbe4539c60;p=platform%2Fupstream%2Fllvm.git [RISCV] Move some RISCVLoadFPImm out of line. NFC 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. --- diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp index 90734c9..cad0cb2 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp @@ -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 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(I); +} + } // namespace llvm diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h index afefdd2..430e0da 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -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 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(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