mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-27 08:26:23 +00:00
[PowerPC] Support symbolic u16imm operands
Currently, all instructions taking s16imm operands support symbolic operands. However, for u16imm operands, we only support actual immediate integers. This causes the assembler to reject code like ori %r5, %r5, symbol@l This patch changes the u16imm operand definition to likewise accept symbolic operands. In fact, s16imm and u16imm can share the same encoding routine, now renamed to getImm16Encoding. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184944 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6e0857e0b6
commit
0b8594268f
@ -205,7 +205,10 @@ void PPCInstPrinter::printS16ImmOperand(const MCInst *MI, unsigned OpNo,
|
||||
|
||||
void PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
|
||||
raw_ostream &O) {
|
||||
O << (unsigned short)MI->getOperand(OpNo).getImm();
|
||||
if (MI->getOperand(OpNo).isImm())
|
||||
O << (unsigned short)MI->getOperand(OpNo).getImm();
|
||||
else
|
||||
printOperand(MI, OpNo, O);
|
||||
}
|
||||
|
||||
void PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo,
|
||||
|
@ -52,7 +52,7 @@ public:
|
||||
SmallVectorImpl<MCFixup> &Fixups) const;
|
||||
unsigned getAbsCondBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const;
|
||||
unsigned getS16ImmEncoding(const MCInst &MI, unsigned OpNo,
|
||||
unsigned getImm16Encoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const;
|
||||
unsigned getMemRIEncoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const;
|
||||
@ -162,12 +162,12 @@ getAbsCondBrEncoding(const MCInst &MI, unsigned OpNo,
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned PPCMCCodeEmitter::getS16ImmEncoding(const MCInst &MI, unsigned OpNo,
|
||||
unsigned PPCMCCodeEmitter::getImm16Encoding(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
const MCOperand &MO = MI.getOperand(OpNo);
|
||||
if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO, Fixups);
|
||||
|
||||
// Add a fixup for the branch target.
|
||||
// Add a fixup for the immediate field.
|
||||
Fixups.push_back(MCFixup::Create(2, MO.getExpr(),
|
||||
(MCFixupKind)PPC::fixup_ppc_half16));
|
||||
return 0;
|
||||
|
@ -67,7 +67,7 @@ namespace {
|
||||
unsigned OpNo) const;
|
||||
unsigned getAbsCondBrEncoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
|
||||
unsigned getS16ImmEncoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
unsigned getImm16Encoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
unsigned getMemRIEncoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
unsigned getMemRIXEncoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
unsigned getTLSRegEncoding(const MachineInstr &MI, unsigned OpNo) const;
|
||||
@ -209,8 +209,8 @@ unsigned PPCCodeEmitter::getAbsCondBrEncoding(const MachineInstr &MI,
|
||||
llvm_unreachable("Absolute branch relocations unsupported on the old JIT.");
|
||||
}
|
||||
|
||||
unsigned PPCCodeEmitter::getS16ImmEncoding(const MachineInstr &MI,
|
||||
unsigned OpNo) const {
|
||||
unsigned PPCCodeEmitter::getImm16Encoding(const MachineInstr &MI,
|
||||
unsigned OpNo) const {
|
||||
const MachineOperand &MO = MI.getOperand(OpNo);
|
||||
if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO);
|
||||
|
||||
|
@ -17,11 +17,12 @@
|
||||
//
|
||||
def s16imm64 : Operand<i64> {
|
||||
let PrintMethod = "printS16ImmOperand";
|
||||
let EncoderMethod = "getS16ImmEncoding";
|
||||
let EncoderMethod = "getImm16Encoding";
|
||||
let ParserMatchClass = PPCS16ImmAsmOperand;
|
||||
}
|
||||
def u16imm64 : Operand<i64> {
|
||||
let PrintMethod = "printU16ImmOperand";
|
||||
let EncoderMethod = "getImm16Encoding";
|
||||
let ParserMatchClass = PPCU16ImmAsmOperand;
|
||||
}
|
||||
def tocentry : Operand<iPTR> {
|
||||
|
@ -434,7 +434,7 @@ def PPCS16ImmAsmOperand : AsmOperandClass {
|
||||
}
|
||||
def s16imm : Operand<i32> {
|
||||
let PrintMethod = "printS16ImmOperand";
|
||||
let EncoderMethod = "getS16ImmEncoding";
|
||||
let EncoderMethod = "getImm16Encoding";
|
||||
let ParserMatchClass = PPCS16ImmAsmOperand;
|
||||
}
|
||||
def PPCU16ImmAsmOperand : AsmOperandClass {
|
||||
@ -443,6 +443,7 @@ def PPCU16ImmAsmOperand : AsmOperandClass {
|
||||
}
|
||||
def u16imm : Operand<i32> {
|
||||
let PrintMethod = "printU16ImmOperand";
|
||||
let EncoderMethod = "getImm16Encoding";
|
||||
let ParserMatchClass = PPCU16ImmAsmOperand;
|
||||
}
|
||||
def PPCDirectBrAsmOperand : AsmOperandClass {
|
||||
|
@ -133,6 +133,16 @@ base:
|
||||
# CHECK-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_REL16_HA target 0xE
|
||||
li 3, target-base@ha
|
||||
|
||||
# CHECK: ori 3, 3, target@l # encoding: [0x60,0x63,A,A]
|
||||
# CHECK-NEXT: # fixup A - offset: 2, value: target@l, kind: fixup_ppc_half16
|
||||
# CHECK-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_ADDR16_LO target 0x0
|
||||
ori 3, 3, target@l
|
||||
|
||||
# CHECK: oris 3, 3, target@h # encoding: [0x64,0x63,A,A]
|
||||
# CHECK-NEXT: # fixup A - offset: 2, value: target@h, kind: fixup_ppc_half16
|
||||
# CHECK-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_ADDR16_HI target 0x0
|
||||
oris 3, 3, target@h
|
||||
|
||||
# CHECK: ld 1, target@toc(2) # encoding: [0xe8,0x22,A,0bAAAAAA00]
|
||||
# CHECK-NEXT: # fixup A - offset: 2, value: target@toc, kind: fixup_ppc_half16ds
|
||||
# CHECK-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_TOC16_DS target 0x0
|
||||
|
Loading…
x
Reference in New Issue
Block a user