From 1401703fe42003745e6937efa13078b462a9d706 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 6 Jan 2025 10:11:29 -0800 Subject: [PATCH] [RISCV] Add Enum for CSR encodings. (#121674) This allows us to use them in C++ code without needing to do a table lookup. --- .../Target/RISCV/MCTargetDesc/RISCVBaseInfo.h | 1 + llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 18 ++++++------------ llvm/lib/Target/RISCV/RISCVSystemOperands.td | 6 ++++++ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h index 1c1a8b8009d2ca..7048e40822342f 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -480,6 +480,7 @@ struct SysReg { } }; +#define GET_SysRegEncodings_DECL #define GET_SysRegsList_DECL #include "RISCVGenSearchableTables.inc" } // end namespace RISCVSysReg diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 7efe3732d8be13..a03a6c8049e315 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -12663,8 +12663,7 @@ SDValue RISCVTargetLowering::lowerGET_ROUNDING(SDValue Op, const MVT XLenVT = Subtarget.getXLenVT(); SDLoc DL(Op); SDValue Chain = Op->getOperand(0); - SDValue SysRegNo = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("FRM")->Encoding, DL, XLenVT); + SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::frm, DL, XLenVT); SDVTList VTs = DAG.getVTList(XLenVT, MVT::Other); SDValue RM = DAG.getNode(RISCVISD::READ_CSR, DL, VTs, Chain, SysRegNo); @@ -12695,8 +12694,7 @@ SDValue RISCVTargetLowering::lowerSET_ROUNDING(SDValue Op, SDLoc DL(Op); SDValue Chain = Op->getOperand(0); SDValue RMValue = Op->getOperand(1); - SDValue SysRegNo = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("FRM")->Encoding, DL, XLenVT); + SDValue SysRegNo = DAG.getTargetConstant(RISCVSysReg::frm, DL, XLenVT); // Encoding used for rounding mode in RISC-V differs from that used in // FLT_ROUNDS. To convert it the C rounding mode is used as an index in @@ -12899,15 +12897,11 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N, SDValue LoCounter, HiCounter; MVT XLenVT = Subtarget.getXLenVT(); if (N->getOpcode() == ISD::READCYCLECOUNTER) { - LoCounter = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("CYCLE")->Encoding, DL, XLenVT); - HiCounter = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("CYCLEH")->Encoding, DL, XLenVT); + LoCounter = DAG.getTargetConstant(RISCVSysReg::cycle, DL, XLenVT); + HiCounter = DAG.getTargetConstant(RISCVSysReg::cycleh, DL, XLenVT); } else { - LoCounter = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("TIME")->Encoding, DL, XLenVT); - HiCounter = DAG.getTargetConstant( - RISCVSysReg::lookupSysRegByName("TIMEH")->Encoding, DL, XLenVT); + LoCounter = DAG.getTargetConstant(RISCVSysReg::time, DL, XLenVT); + HiCounter = DAG.getTargetConstant(RISCVSysReg::timeh, DL, XLenVT); } SDVTList VTs = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other); SDValue RCW = DAG.getNode(RISCVISD::READ_COUNTER_WIDE, DL, VTs, diff --git a/llvm/lib/Target/RISCV/RISCVSystemOperands.td b/llvm/lib/Target/RISCV/RISCVSystemOperands.td index 39853cf13a920c..4c86103db99d26 100644 --- a/llvm/lib/Target/RISCV/RISCVSystemOperands.td +++ b/llvm/lib/Target/RISCV/RISCVSystemOperands.td @@ -48,6 +48,12 @@ def SysRegsList : GenericTable { let PrimaryKeyReturnRange = true; } +def SysRegEncodings : GenericEnum { + let FilterClass = "SysReg"; + let NameField = "Name"; + let ValueField = "Encoding"; +} + def lookupSysRegByName : SearchIndex { let Table = SysRegsList; let Key = [ "Name" ];