forked from OSchip/llvm-project
R600/SI: Use a custom encoding method for simm16 in SOPP branch instructions
This allows us to explicitly define the type of fixup that is needed, so we can distinguish this from future fixup types. llvm-svn: 213527
This commit is contained in:
parent
e08fe68bdd
commit
01825afad7
|
@ -9,9 +9,11 @@
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
||||||
|
#include "MCTargetDesc/AMDGPUFixupKinds.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/MC/MCAsmBackend.h"
|
#include "llvm/MC/MCAsmBackend.h"
|
||||||
#include "llvm/MC/MCAssembler.h"
|
#include "llvm/MC/MCAssembler.h"
|
||||||
|
#include "llvm/MC/MCFixupKindInfo.h"
|
||||||
#include "llvm/MC/MCObjectWriter.h"
|
#include "llvm/MC/MCObjectWriter.h"
|
||||||
#include "llvm/MC/MCValue.h"
|
#include "llvm/MC/MCValue.h"
|
||||||
#include "llvm/Support/TargetRegistry.h"
|
#include "llvm/Support/TargetRegistry.h"
|
||||||
|
@ -58,6 +60,8 @@ public:
|
||||||
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override {
|
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} //End anonymous namespace
|
} //End anonymous namespace
|
||||||
|
@ -78,6 +82,19 @@ void AMDGPUAsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
|
||||||
*Dst = (Value - 4) / 4;
|
*Dst = (Value - 4) / 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MCFixupKindInfo &AMDGPUAsmBackend::getFixupKindInfo(
|
||||||
|
MCFixupKind Kind) const {
|
||||||
|
const static MCFixupKindInfo Infos[AMDGPU::NumTargetFixupKinds] = {
|
||||||
|
// name offset bits flags
|
||||||
|
{ "fixup_si_sopp_br", 0, 16, MCFixupKindInfo::FKF_IsPCRel }
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Kind < FirstTargetFixupKind)
|
||||||
|
return MCAsmBackend::getFixupKindInfo(Kind);
|
||||||
|
|
||||||
|
return Infos[Kind - FirstTargetFixupKind];
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// ELFAMDGPUAsmBackend class
|
// ELFAMDGPUAsmBackend class
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
//===-- AMDGPUFixupKinds.h - AMDGPU Specific Fixup Entries ------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_AMDGPUFIXUPKINDS_H
|
||||||
|
#define LLVM_AMDGPUFIXUPKINDS_H
|
||||||
|
|
||||||
|
#include "llvm/MC/MCFixup.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace AMDGPU {
|
||||||
|
enum Fixups {
|
||||||
|
/// 16-bit PC relative fixup for SOPP branch instructions.
|
||||||
|
fixup_si_sopp_br = FirstTargetFixupKind,
|
||||||
|
|
||||||
|
// Marker
|
||||||
|
LastTargetFixupKind,
|
||||||
|
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LLVM_AMDGPUFIXUPKINDS_H
|
|
@ -37,6 +37,12 @@ public:
|
||||||
const MCSubtargetInfo &STI) const {
|
const MCSubtargetInfo &STI) const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual unsigned getSOPPBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||||
|
SmallVectorImpl<MCFixup> &Fixups,
|
||||||
|
const MCSubtargetInfo &STI) const {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End namespace llvm
|
} // End namespace llvm
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
|
||||||
#include "MCTargetDesc/AMDGPUMCCodeEmitter.h"
|
#include "MCTargetDesc/AMDGPUMCCodeEmitter.h"
|
||||||
|
#include "MCTargetDesc/AMDGPUFixupKinds.h"
|
||||||
#include "llvm/MC/MCCodeEmitter.h"
|
#include "llvm/MC/MCCodeEmitter.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
#include "llvm/MC/MCFixup.h"
|
#include "llvm/MC/MCFixup.h"
|
||||||
|
@ -62,6 +63,12 @@ public:
|
||||||
uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO,
|
||||||
SmallVectorImpl<MCFixup> &Fixups,
|
SmallVectorImpl<MCFixup> &Fixups,
|
||||||
const MCSubtargetInfo &STI) const override;
|
const MCSubtargetInfo &STI) const override;
|
||||||
|
|
||||||
|
/// \brief Use a fixup to encode the simm16 field for SOPP branch
|
||||||
|
/// instructions.
|
||||||
|
unsigned getSOPPBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||||
|
SmallVectorImpl<MCFixup> &Fixups,
|
||||||
|
const MCSubtargetInfo &STI) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End anonymous namespace
|
} // End anonymous namespace
|
||||||
|
@ -169,6 +176,21 @@ void SIMCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned SIMCCodeEmitter::getSOPPBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||||
|
SmallVectorImpl<MCFixup> &Fixups,
|
||||||
|
const MCSubtargetInfo &STI) const {
|
||||||
|
const MCOperand &MO = MI.getOperand(OpNo);
|
||||||
|
|
||||||
|
if (MO.isExpr()) {
|
||||||
|
const MCExpr *Expr = MO.getExpr();
|
||||||
|
MCFixupKind Kind = (MCFixupKind)AMDGPU::fixup_si_sopp_br;
|
||||||
|
Fixups.push_back(MCFixup::Create(0, Expr, Kind, MI.getLoc()));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getMachineOpValue(MI, MO, Fixups, STI);
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t SIMCCodeEmitter::getMachineOpValue(const MCInst &MI,
|
uint64_t SIMCCodeEmitter::getMachineOpValue(const MCInst &MI,
|
||||||
const MCOperand &MO,
|
const MCOperand &MO,
|
||||||
SmallVectorImpl<MCFixup> &Fixups,
|
SmallVectorImpl<MCFixup> &Fixups,
|
||||||
|
@ -176,13 +198,6 @@ uint64_t SIMCCodeEmitter::getMachineOpValue(const MCInst &MI,
|
||||||
if (MO.isReg())
|
if (MO.isReg())
|
||||||
return MRI.getEncodingValue(MO.getReg());
|
return MRI.getEncodingValue(MO.getReg());
|
||||||
|
|
||||||
if (MO.isExpr()) {
|
|
||||||
const MCExpr *Expr = MO.getExpr();
|
|
||||||
MCFixupKind Kind = MCFixupKind(FK_PCRel_4);
|
|
||||||
Fixups.push_back(MCFixup::Create(0, Expr, Kind, MI.getLoc()));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out the operand number, needed for isSrcOperand check
|
// Figure out the operand number, needed for isSrcOperand check
|
||||||
unsigned OpNo = 0;
|
unsigned OpNo = 0;
|
||||||
for (unsigned e = MI.getNumOperands(); OpNo < e; ++OpNo) {
|
for (unsigned e = MI.getNumOperands(); OpNo < e; ++OpNo) {
|
||||||
|
|
|
@ -142,10 +142,19 @@ class SGPRImm <dag frag> : PatLeaf<frag, [{
|
||||||
return false;
|
return false;
|
||||||
}]>;
|
}]>;
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Custom Operands
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
def FRAMEri32 : Operand<iPTR> {
|
def FRAMEri32 : Operand<iPTR> {
|
||||||
let MIOperandInfo = (ops i32:$ptr, i32imm:$index);
|
let MIOperandInfo = (ops i32:$ptr, i32imm:$index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def sopp_brtarget : Operand<OtherVT> {
|
||||||
|
let EncoderMethod = "getSOPPBrEncoding";
|
||||||
|
let OperandType = "OPERAND_PCREL";
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Complex patterns
|
// Complex patterns
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -378,42 +378,42 @@ def S_ENDPGM : SOPP <0x00000001, (ins), "S_ENDPGM",
|
||||||
|
|
||||||
let isBranch = 1 in {
|
let isBranch = 1 in {
|
||||||
def S_BRANCH : SOPP <
|
def S_BRANCH : SOPP <
|
||||||
0x00000002, (ins brtarget:$simm16), "S_BRANCH $simm16",
|
0x00000002, (ins sopp_brtarget:$simm16), "S_BRANCH $simm16",
|
||||||
[(br bb:$simm16)]> {
|
[(br bb:$simm16)]> {
|
||||||
let isBarrier = 1;
|
let isBarrier = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let DisableEncoding = "$scc" in {
|
let DisableEncoding = "$scc" in {
|
||||||
def S_CBRANCH_SCC0 : SOPP <
|
def S_CBRANCH_SCC0 : SOPP <
|
||||||
0x00000004, (ins brtarget:$simm16, SCCReg:$scc),
|
0x00000004, (ins sopp_brtarget:$simm16, SCCReg:$scc),
|
||||||
"S_CBRANCH_SCC0 $simm16", []
|
"S_CBRANCH_SCC0 $simm16", []
|
||||||
>;
|
>;
|
||||||
def S_CBRANCH_SCC1 : SOPP <
|
def S_CBRANCH_SCC1 : SOPP <
|
||||||
0x00000005, (ins brtarget:$simm16, SCCReg:$scc),
|
0x00000005, (ins sopp_brtarget:$simm16, SCCReg:$scc),
|
||||||
"S_CBRANCH_SCC1 $simm16",
|
"S_CBRANCH_SCC1 $simm16",
|
||||||
[]
|
[]
|
||||||
>;
|
>;
|
||||||
} // End DisableEncoding = "$scc"
|
} // End DisableEncoding = "$scc"
|
||||||
|
|
||||||
def S_CBRANCH_VCCZ : SOPP <
|
def S_CBRANCH_VCCZ : SOPP <
|
||||||
0x00000006, (ins brtarget:$simm16, VCCReg:$vcc),
|
0x00000006, (ins sopp_brtarget:$simm16, VCCReg:$vcc),
|
||||||
"S_CBRANCH_VCCZ $simm16",
|
"S_CBRANCH_VCCZ $simm16",
|
||||||
[]
|
[]
|
||||||
>;
|
>;
|
||||||
def S_CBRANCH_VCCNZ : SOPP <
|
def S_CBRANCH_VCCNZ : SOPP <
|
||||||
0x00000007, (ins brtarget:$simm16, VCCReg:$vcc),
|
0x00000007, (ins sopp_brtarget:$simm16, VCCReg:$vcc),
|
||||||
"S_CBRANCH_VCCNZ $simm16",
|
"S_CBRANCH_VCCNZ $simm16",
|
||||||
[]
|
[]
|
||||||
>;
|
>;
|
||||||
|
|
||||||
let DisableEncoding = "$exec" in {
|
let DisableEncoding = "$exec" in {
|
||||||
def S_CBRANCH_EXECZ : SOPP <
|
def S_CBRANCH_EXECZ : SOPP <
|
||||||
0x00000008, (ins brtarget:$simm16, EXECReg:$exec),
|
0x00000008, (ins sopp_brtarget:$simm16, EXECReg:$exec),
|
||||||
"S_CBRANCH_EXECZ $simm16",
|
"S_CBRANCH_EXECZ $simm16",
|
||||||
[]
|
[]
|
||||||
>;
|
>;
|
||||||
def S_CBRANCH_EXECNZ : SOPP <
|
def S_CBRANCH_EXECNZ : SOPP <
|
||||||
0x00000009, (ins brtarget:$simm16, EXECReg:$exec),
|
0x00000009, (ins sopp_brtarget:$simm16, EXECReg:$exec),
|
||||||
"S_CBRANCH_EXECNZ $simm16",
|
"S_CBRANCH_EXECNZ $simm16",
|
||||||
[]
|
[]
|
||||||
>;
|
>;
|
||||||
|
|
Loading…
Reference in New Issue