mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-05 22:59:16 +00:00
c2b840cb7c
When loading immediates into a GR32, the port prefered LHI, followed by LLILH or LLILL, followed by IILF. LHI and IILF are natural 32-bit operations, but LLILH and LLILL also clear the upper 32 bits of the register. This was represented as taking a 32-bit subreg of a 64-bit assignment. Using subregs for something as simple as a move immediate was probably a bad idea. Also, I have patches to add support for the high-word facility, and we don't want something like LLILH and LLILL to stop the high word of the same GPR from being used. This patch therefore uses LHI and IILF to begin with and adds a late machine-specific pass to use LLILH and LLILL if the other half of the register is not live. The high-word patches extend this behavior to IIHF, LLIHL and LLIHH. No behavioral change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191363 91177308-0d34-0410-b5e6-96231b3b80d8
69 lines
2.0 KiB
C++
69 lines
2.0 KiB
C++
//===-- SystemZRegisterInfo.h - SystemZ register information ----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SystemZREGISTERINFO_H
|
|
#define SystemZREGISTERINFO_H
|
|
|
|
#include "SystemZ.h"
|
|
#include "llvm/Target/TargetRegisterInfo.h"
|
|
|
|
#define GET_REGINFO_HEADER
|
|
#include "SystemZGenRegisterInfo.inc"
|
|
|
|
namespace llvm {
|
|
|
|
namespace SystemZ {
|
|
// Return the subreg to use for referring to the even and odd registers
|
|
// in a GR128 pair. Is32Bit says whether we want a GR32 or GR64.
|
|
inline unsigned even128(bool Is32bit) {
|
|
return Is32bit ? subreg_32bit : subreg_high;
|
|
}
|
|
inline unsigned odd128(bool Is32bit) {
|
|
return Is32bit ? subreg_low32 : subreg_low;
|
|
}
|
|
}
|
|
|
|
class SystemZSubtarget;
|
|
class SystemZInstrInfo;
|
|
|
|
struct SystemZRegisterInfo : public SystemZGenRegisterInfo {
|
|
private:
|
|
SystemZTargetMachine &TM;
|
|
|
|
public:
|
|
SystemZRegisterInfo(SystemZTargetMachine &tm);
|
|
|
|
// Override TargetRegisterInfo.h.
|
|
virtual bool requiresRegisterScavenging(const MachineFunction &MF) const
|
|
LLVM_OVERRIDE {
|
|
return true;
|
|
}
|
|
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const
|
|
LLVM_OVERRIDE {
|
|
return true;
|
|
}
|
|
virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
|
|
LLVM_OVERRIDE {
|
|
return true;
|
|
}
|
|
virtual const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0)
|
|
const LLVM_OVERRIDE;
|
|
virtual BitVector getReservedRegs(const MachineFunction &MF)
|
|
const LLVM_OVERRIDE;
|
|
virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
|
|
int SPAdj, unsigned FIOperandNum,
|
|
RegScavenger *RS) const LLVM_OVERRIDE;
|
|
virtual unsigned getFrameRegister(const MachineFunction &MF) const
|
|
LLVM_OVERRIDE;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|