Skip to content

Commit

Permalink
[Sparc] Add support for decoding call instructions in the sparc disas…
Browse files Browse the repository at this point in the history
…sembler.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202577 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
vegovin committed Mar 1, 2014
1 parent abad354 commit 830156c
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
21 changes: 21 additions & 0 deletions lib/Target/Sparc/Disassembler/SparcDisassembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ static DecodeStatus DecodeStoreDFP(MCInst &Inst, unsigned insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeCall(MCInst &Inst, unsigned insn,
uint64_t Address, const void *Decoder);

#include "SparcGenDisassemblerTables.inc"

Expand Down Expand Up @@ -336,3 +338,22 @@ static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn,
return DecodeMem(Inst, insn, Address, Decoder, false,
DecodeQFPRegsRegisterClass);
}

static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
uint64_t Address, uint64_t Offset,
uint64_t Width, MCInst &MI,
const void *Decoder) {
const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch,
Offset, Width);
}

static DecodeStatus DecodeCall(MCInst &MI, unsigned insn,
uint64_t Address, const void *Decoder) {
unsigned tgt = fieldFromInstruction(insn, 0, 30);
tgt <<= 2;
if (!tryAddingSymbolicOperand(tgt+Address, false, Address,
0, 30, MI, Decoder))
MI.addOperand(MCOperand::CreateImm(tgt));
return MCDisassembler::Success;
}
5 changes: 3 additions & 2 deletions lib/Target/Sparc/SparcInstrInfo.td
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ def brtarget : Operand<OtherVT> {

def calltarget : Operand<i32> {
let EncoderMethod = "getCallTargetOpValue";
let DecoderMethod = "DecodeCall";
}

// Operand for printing out a condition code.
Expand Down Expand Up @@ -577,8 +578,8 @@ let Uses = [FCC] in
// This is the only Format 1 instruction
let Uses = [O6],
hasDelaySlot = 1, isCall = 1 in {
def CALL : InstSP<(outs), (ins calltarget:$dst, variable_ops),
"call $dst", []> {
def CALL : InstSP<(outs), (ins calltarget:$disp, variable_ops),
"call $disp", []> {
bits<30> disp;
let op = 1;
let Inst{29-0} = disp;
Expand Down
3 changes: 3 additions & 0 deletions test/MC/Disassembler/Sparc/sparc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,6 @@

# CHECK: restore
0x81 0xe8 0x00 0x00

# CHECK: call 16
0x40 0x00 0x00 0x04

0 comments on commit 830156c

Please sign in to comment.