mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-10 08:40:41 +00:00
Promote the X86 Get/SetSSEDomain functions to TargetInstrInfo.
I am going to unify the SSEDomainFix and NEONMoveFix passes into a single target independent pass. They are essentially doing the same thing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140652 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
25ddc2bf7e
commit
98e933f9ad
@ -687,6 +687,37 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
/// getExecutionDomain - Return the current execution domain and bit mask of
|
||||
/// possible domains for instruction.
|
||||
///
|
||||
/// Some micro-architectures have multiple execution domains, and multiple
|
||||
/// opcodes that perform the same operation in different domains. For
|
||||
/// example, the x86 architecture provides the por, orps, and orpd
|
||||
/// instructions that all do the same thing. There is a latency penalty if a
|
||||
/// register is written in one domain and read in another.
|
||||
///
|
||||
/// This function returns a pair (domain, mask) containing the execution
|
||||
/// domain of MI, and a bit mask of possible domains. The setExecutionDomain
|
||||
/// function can be used to change the opcode to one of the domains in the
|
||||
/// bit mask. Instructions whose execution domain can't be changed should
|
||||
/// return a 0 mask.
|
||||
///
|
||||
/// The execution domain numbers don't have any special meaning except domain
|
||||
/// 0 is used for instructions that are not associated with any interesting
|
||||
/// execution domain.
|
||||
///
|
||||
virtual std::pair<uint16_t, uint16_t>
|
||||
getExecutionDomain(const MachineInstr *MI) const {
|
||||
return std::make_pair(0, 0);
|
||||
}
|
||||
|
||||
/// setExecutionDomain - Change the opcode of MI to execute in Domain.
|
||||
///
|
||||
/// The bit (1 << Domain) must be set in the mask returned from
|
||||
/// getExecutionDomain(MI).
|
||||
///
|
||||
virtual void setExecutionDomain(MachineInstr *MI, unsigned Domain) const {}
|
||||
|
||||
private:
|
||||
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
|
||||
};
|
||||
|
@ -236,7 +236,7 @@ void SSEDomainFixPass::Collapse(DomainValue *dv, unsigned domain) {
|
||||
|
||||
// Collapse all the instructions.
|
||||
while (!dv->Instrs.empty())
|
||||
TII->SetSSEDomain(dv->Instrs.pop_back_val(), domain);
|
||||
TII->setExecutionDomain(dv->Instrs.pop_back_val(), domain);
|
||||
dv->setSingleDomain(domain);
|
||||
|
||||
// If there are multiple users, give them new, unique DomainValues.
|
||||
@ -362,7 +362,7 @@ void SSEDomainFixPass::visitSoftInstr(MachineInstr *mi, unsigned mask) {
|
||||
// If the collapsed operands force a single domain, propagate the collapse.
|
||||
if (isPowerOf2_32(available)) {
|
||||
unsigned domain = CountTrailingZeros_32(available);
|
||||
TII->SetSSEDomain(mi, domain);
|
||||
TII->setExecutionDomain(mi, domain);
|
||||
visitHardInstr(mi, domain);
|
||||
return;
|
||||
}
|
||||
@ -473,7 +473,7 @@ bool SSEDomainFixPass::runOnMachineFunction(MachineFunction &mf) {
|
||||
MachineInstr *mi = I;
|
||||
if (mi->isDebugValue()) continue;
|
||||
++Distance;
|
||||
std::pair<uint16_t, uint16_t> domp = TII->GetSSEDomain(mi);
|
||||
std::pair<uint16_t, uint16_t> domp = TII->getExecutionDomain(mi);
|
||||
if (domp.first)
|
||||
if (domp.second)
|
||||
visitSoftInstr(mi, domp.second);
|
||||
|
@ -3355,13 +3355,13 @@ static const unsigned *lookup(unsigned opcode, unsigned domain) {
|
||||
}
|
||||
|
||||
std::pair<uint16_t, uint16_t>
|
||||
X86InstrInfo::GetSSEDomain(const MachineInstr *MI) const {
|
||||
X86InstrInfo::getExecutionDomain(const MachineInstr *MI) const {
|
||||
uint16_t domain = (MI->getDesc().TSFlags >> X86II::SSEDomainShift) & 3;
|
||||
return std::make_pair(domain,
|
||||
domain && lookup(MI->getOpcode(), domain) ? 0xe : 0);
|
||||
}
|
||||
|
||||
void X86InstrInfo::SetSSEDomain(MachineInstr *MI, unsigned Domain) const {
|
||||
void X86InstrInfo::setExecutionDomain(MachineInstr *MI, unsigned Domain) const {
|
||||
assert(Domain>0 && Domain<4 && "Invalid execution domain");
|
||||
uint16_t dom = (MI->getDesc().TSFlags >> X86II::SSEDomainShift) & 3;
|
||||
assert(dom && "Not an SSE instruction");
|
||||
|
@ -337,12 +337,10 @@ public:
|
||||
///
|
||||
unsigned getGlobalBaseReg(MachineFunction *MF) const;
|
||||
|
||||
/// GetSSEDomain - Return the SSE execution domain of MI as the first element,
|
||||
/// and a bitmask of possible arguments to SetSSEDomain ase the second.
|
||||
std::pair<uint16_t, uint16_t> GetSSEDomain(const MachineInstr *MI) const;
|
||||
std::pair<uint16_t, uint16_t>
|
||||
getExecutionDomain(const MachineInstr *MI) const;
|
||||
|
||||
/// SetSSEDomain - Set the SSEDomain of MI.
|
||||
void SetSSEDomain(MachineInstr *MI, unsigned Domain) const;
|
||||
void setExecutionDomain(MachineInstr *MI, unsigned Domain) const;
|
||||
|
||||
MachineInstr* foldMemoryOperandImpl(MachineFunction &MF,
|
||||
MachineInstr* MI,
|
||||
|
Loading…
x
Reference in New Issue
Block a user