@@ -17367,25 +17367,29 @@ SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,
1736717367 return FrameAddr;
1736817368}
1736917369
17370- // FIXME? Maybe this could be a TableGen attribute on some registers and
17371- // this table could be generated automatically from RegInfo.
17370+ #define GET_REGISTER_MATCHER
17371+ #include "PPCGenAsmMatcher.inc"
17372+
1737217373Register PPCTargetLowering::getRegisterByName(const char* RegName, LLT VT,
1737317374 const MachineFunction &MF) const {
17374- bool isPPC64 = Subtarget.isPPC64();
1737517375
17376- bool is64Bit = isPPC64 && VT == LLT::scalar(64);
17377- if (!is64Bit && VT != LLT::scalar(32))
17376+ bool Is64Bit = Subtarget. isPPC64() && VT == LLT::scalar(64);
17377+ if (!Is64Bit && VT != LLT::scalar(32))
1737817378 report_fatal_error("Invalid register global variable type");
1737917379
17380- Register Reg = StringSwitch<Register>(RegName)
17381- .Case("r1", is64Bit ? PPC::X1 : PPC::R1)
17382- .Case("r2", isPPC64 ? Register() : PPC::R2)
17383- .Case("r13", (is64Bit ? PPC::X13 : PPC::R13))
17384- .Default(Register());
17380+ Register Reg = MatchRegisterName(RegName);
17381+ if (!Reg)
17382+ report_fatal_error(Twine("Invalid global name register \""
17383+ + StringRef(RegName) + "\"."));
17384+
17385+ // Convert GPR to GP8R register for 64bit.
17386+ if (Is64Bit && StringRef(RegName).starts_with_insensitive("r"))
17387+ Reg = Reg.id() - PPC::R0 + PPC::X0;
1738517388
17386- if (Reg)
17387- return Reg;
17388- report_fatal_error("Invalid register name global variable");
17389+ if (Subtarget.getRegisterInfo()->getReservedRegs(MF).test(Reg))
17390+ report_fatal_error(Twine("Trying to obtain non-reservable register \"" +
17391+ StringRef(RegName) + "\"."));
17392+ return Reg;
1738917393}
1739017394
1739117395bool PPCTargetLowering::isAccessedAsGotIndirect(SDValue GA) const {
0 commit comments