mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[PowerPC] Split s34imm into two types
Currently the instruction paddi always takes s34imm as the type for the 34 bit immediate. However, the PC Relative form of the instruction should not produce the same fixup as the non PC Relative form. This patch splits the s34imm type into s34imm and s34imm_pcrel so that two different fixups can be emitted. Reviewed By: nemanjai, #powerpc, kamaub Differential Revision: https://reviews.llvm.org/D83255
This commit is contained in:
parent
06a0c0fb9c
commit
be7973e40b
@ -46,6 +46,7 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
|
||||
case PPC::fixup_ppc_half16ds:
|
||||
return Value & 0xfffc;
|
||||
case PPC::fixup_ppc_pcrel34:
|
||||
case PPC::fixup_ppc_imm34:
|
||||
return Value & 0x3ffffffff;
|
||||
}
|
||||
}
|
||||
@ -68,6 +69,7 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
|
||||
case PPC::fixup_ppc_br24_notoc:
|
||||
return 4;
|
||||
case PPC::fixup_ppc_pcrel34:
|
||||
case PPC::fixup_ppc_imm34:
|
||||
case FK_Data_8:
|
||||
return 8;
|
||||
case PPC::fixup_ppc_nofixup:
|
||||
@ -100,6 +102,7 @@ public:
|
||||
{ "fixup_ppc_half16", 0, 16, 0 },
|
||||
{ "fixup_ppc_half16ds", 0, 14, 0 },
|
||||
{ "fixup_ppc_pcrel34", 0, 34, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "fixup_ppc_imm34", 0, 34, 0 },
|
||||
{ "fixup_ppc_nofixup", 0, 0, 0 }
|
||||
};
|
||||
const static MCFixupKindInfo InfosLE[PPC::NumTargetFixupKinds] = {
|
||||
@ -112,6 +115,7 @@ public:
|
||||
{ "fixup_ppc_half16", 0, 16, 0 },
|
||||
{ "fixup_ppc_half16ds", 2, 14, 0 },
|
||||
{ "fixup_ppc_pcrel34", 0, 34, MCFixupKindInfo::FKF_IsPCRel },
|
||||
{ "fixup_ppc_imm34", 0, 34, 0 },
|
||||
{ "fixup_ppc_nofixup", 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
@ -409,6 +409,9 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PPC::fixup_ppc_imm34:
|
||||
report_fatal_error("Unsupported Modifier for fixup_ppc_imm34.");
|
||||
break;
|
||||
case FK_Data_8:
|
||||
switch (Modifier) {
|
||||
default: llvm_unreachable("Unsupported Modifier");
|
||||
|
@ -43,6 +43,9 @@ enum Fixups {
|
||||
// A 34-bit fixup corresponding to PC-relative paddi.
|
||||
fixup_ppc_pcrel34,
|
||||
|
||||
// A 34-bit fixup corresponding to Non-PC-relative paddi.
|
||||
fixup_ppc_imm34,
|
||||
|
||||
/// Not a true fixup, but ties a symbol to a call to __tls_get_addr for the
|
||||
/// TLS general and local dynamic models, or inserts the thread-pointer
|
||||
/// register number.
|
||||
|
@ -104,20 +104,36 @@ unsigned PPCMCCodeEmitter::getImm16Encoding(const MCInst &MI, unsigned OpNo,
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
PPCMCCodeEmitter::getImm34Encoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
uint64_t PPCMCCodeEmitter::getImm34Encoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI,
|
||||
MCFixupKind Fixup) const {
|
||||
const MCOperand &MO = MI.getOperand(OpNo);
|
||||
if (MO.isReg() || MO.isImm())
|
||||
assert(!MO.isReg() && "Not expecting a register for this operand.");
|
||||
if (MO.isImm())
|
||||
return getMachineOpValue(MI, MO, Fixups, STI);
|
||||
|
||||
// Add a fixup for the immediate field.
|
||||
Fixups.push_back(MCFixup::create(0, MO.getExpr(),
|
||||
(MCFixupKind)PPC::fixup_ppc_pcrel34));
|
||||
Fixups.push_back(MCFixup::create(0, MO.getExpr(), Fixup));
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
PPCMCCodeEmitter::getImm34EncodingNoPCRel(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getImm34Encoding(MI, OpNo, Fixups, STI,
|
||||
(MCFixupKind)PPC::fixup_ppc_imm34);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
PPCMCCodeEmitter::getImm34EncodingPCRel(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
return getImm34Encoding(MI, OpNo, Fixups, STI,
|
||||
(MCFixupKind)PPC::fixup_ppc_pcrel34);
|
||||
}
|
||||
|
||||
unsigned PPCMCCodeEmitter::getMemRIEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
|
@ -52,7 +52,14 @@ public:
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getImm34Encoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
const MCSubtargetInfo &STI,
|
||||
MCFixupKind Fixup) const;
|
||||
uint64_t getImm34EncodingNoPCRel(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
uint64_t getImm34EncodingPCRel(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
unsigned getMemRIEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
@ -757,7 +757,13 @@ def PPCS34ImmAsmOperand : AsmOperandClass {
|
||||
}
|
||||
def s34imm : Operand<i64> {
|
||||
let PrintMethod = "printS34ImmOperand";
|
||||
let EncoderMethod = "getImm34Encoding";
|
||||
let EncoderMethod = "getImm34EncodingNoPCRel";
|
||||
let ParserMatchClass = PPCS34ImmAsmOperand;
|
||||
let DecoderMethod = "decodeSImmOperand<34>";
|
||||
}
|
||||
def s34imm_pcrel : Operand<i64> {
|
||||
let PrintMethod = "printS34ImmOperand";
|
||||
let EncoderMethod = "getImm34EncodingPCRel";
|
||||
let ParserMatchClass = PPCS34ImmAsmOperand;
|
||||
let DecoderMethod = "decodeSImmOperand<34>";
|
||||
}
|
||||
|
@ -459,7 +459,7 @@ let Predicates = [PrefixInstrs] in {
|
||||
let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
|
||||
defm PADDI8 :
|
||||
MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc:$RA, s34imm:$SI),
|
||||
(ins immZero:$RA, s34imm:$SI),
|
||||
(ins immZero:$RA, s34imm_pcrel:$SI),
|
||||
"paddi $RT, $RA, $SI", IIC_LdStLFD>;
|
||||
let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
|
||||
def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
|
||||
@ -469,7 +469,7 @@ let Predicates = [PrefixInstrs] in {
|
||||
}
|
||||
defm PADDI :
|
||||
MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc:$RA, s34imm:$SI),
|
||||
(ins immZero:$RA, s34imm:$SI),
|
||||
(ins immZero:$RA, s34imm_pcrel:$SI),
|
||||
"paddi $RT, $RA, $SI", IIC_LdStLFD>;
|
||||
let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
|
||||
def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
|
||||
|
7
test/MC/PowerPC/ppc64-errors-emit-obj.s
Normal file
7
test/MC/PowerPC/ppc64-errors-emit-obj.s
Normal file
@ -0,0 +1,7 @@
|
||||
# RUN: not --crash llvm-mc -triple powerpc64-- --filetype=obj < %s 2> %t
|
||||
# RUN: FileCheck < %t %s
|
||||
# RUN: not --crash llvm-mc -triple powerpc64le-- --filetype=obj < %s 2> %t
|
||||
# RUN: FileCheck < %t %s
|
||||
|
||||
# CHECK: Unsupported Modifier for fixup_ppc_imm34.
|
||||
paddi 3, 13, symbol@toc, 0
|
Loading…
Reference in New Issue
Block a user