1 //===-- VERegisterInfo.cpp - VE Register Information ----------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains the VE implementation of the TargetRegisterInfo class.
11 //===----------------------------------------------------------------------===//
13 #include "VERegisterInfo.h"
15 #include "VESubtarget.h"
16 #include "llvm/ADT/BitVector.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/CodeGen/MachineFrameInfo.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/MachineRegisterInfo.h"
22 #include "llvm/CodeGen/TargetInstrInfo.h"
23 #include "llvm/IR/Type.h"
24 #include "llvm/Support/CommandLine.h"
25 #include "llvm/Support/ErrorHandling.h"
29 #define GET_REGINFO_TARGET_DESC
30 #include "VEGenRegisterInfo.inc"
32 // VE uses %s10 == %lp to keep return address
33 VERegisterInfo::VERegisterInfo() : VEGenRegisterInfo(VE::SX10) {}
36 VERegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
40 const uint32_t *VERegisterInfo::getCallPreservedMask(const MachineFunction &MF,
41 CallingConv::ID CC) const {
45 const uint32_t *VERegisterInfo::getNoPreservedMask() const {
46 return CSR_NoRegs_RegMask;
49 BitVector VERegisterInfo::getReservedRegs(const MachineFunction &MF) const {
50 BitVector Reserved(getNumRegs());
51 Reserved.set(VE::SX8); // stack limit
52 Reserved.set(VE::SX9); // frame pointer
53 Reserved.set(VE::SX10); // link register (return address)
54 Reserved.set(VE::SX11); // stack pointer
56 Reserved.set(VE::SX12); // outer register
57 Reserved.set(VE::SX13); // id register for dynamic linker
59 Reserved.set(VE::SX14); // thread pointer
60 Reserved.set(VE::SX15); // global offset table register
61 Reserved.set(VE::SX16); // procedure linkage table register
62 Reserved.set(VE::SX17); // linkage-area register
64 // sx18-sx33 are callee-saved registers
65 // sx34-sx63 are temporary registers
70 bool VERegisterInfo::isConstantPhysReg(unsigned PhysReg) const { return false; }
72 const TargetRegisterClass *
73 VERegisterInfo::getPointerRegClass(const MachineFunction &MF,
74 unsigned Kind) const {
75 return &VE::I64RegClass;
78 static void replaceFI(MachineFunction &MF, MachineBasicBlock::iterator II,
79 MachineInstr &MI, const DebugLoc &dl,
80 unsigned FIOperandNum, int Offset, unsigned FramePtr) {
81 // Replace frame index with a frame pointer reference directly.
82 // VE has 32 bit offset field, so no need to expand a target instruction.
83 // Directly encode it.
84 MI.getOperand(FIOperandNum).ChangeToRegister(FramePtr, false);
85 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
88 void VERegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
89 int SPAdj, unsigned FIOperandNum,
90 RegScavenger *RS) const {
91 assert(SPAdj == 0 && "Unexpected");
93 MachineInstr &MI = *II;
94 DebugLoc dl = MI.getDebugLoc();
95 int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
96 MachineFunction &MF = *MI.getParent()->getParent();
97 const VEFrameLowering *TFI = getFrameLowering(MF);
101 Offset = TFI->getFrameIndexReference(MF, FrameIndex, FrameReg);
103 Offset += MI.getOperand(FIOperandNum + 1).getImm();
105 replaceFI(MF, II, MI, dl, FIOperandNum, Offset, FrameReg);
108 Register VERegisterInfo::getFrameRegister(const MachineFunction &MF) const {
112 // VE has no architectural need for stack realignment support,
113 // except that LLVM unfortunately currently implements overaligned
114 // stack objects by depending upon stack realignment support.
115 // If that ever changes, this can probably be deleted.
116 bool VERegisterInfo::canRealignStack(const MachineFunction &MF) const {
117 if (!TargetRegisterInfo::canRealignStack(MF))
120 // VE always has a fixed frame pointer register, so don't need to
121 // worry about needing to reserve it. [even if we don't have a frame
122 // pointer for our frame, it still cannot be used for other things,
123 // or register window traps will be SADNESS.]
125 // If there's a reserved call frame, we can use VE to access locals.
126 if (getFrameLowering(MF)->hasReservedCallFrame(MF))
129 // Otherwise, we'd need a base pointer, but those aren't implemented
130 // for VE at the moment.