[Sparc] Add return/rett instruction to Sparc backend.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202666 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Venkatraman Govindaraju
2014-03-02 22:55:53 +00:00
parent 361542afd6
commit 75bff895e4
7 changed files with 54 additions and 0 deletions

View File

@@ -446,6 +446,9 @@ ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc)
return Error(StartLoc, "invalid register name"); return Error(StartLoc, "invalid register name");
} }
static void applyMnemonicAliases(StringRef &Mnemonic, unsigned Features,
unsigned VariantID);
bool SparcAsmParser:: bool SparcAsmParser::
ParseInstruction(ParseInstructionInfo &Info, StringRef Name, ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
SMLoc NameLoc, SMLoc NameLoc,
@@ -455,6 +458,9 @@ ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
// First operand in MCInst is instruction mnemonic. // First operand in MCInst is instruction mnemonic.
Operands.push_back(SparcOperand::CreateToken(Name, NameLoc)); Operands.push_back(SparcOperand::CreateToken(Name, NameLoc));
// apply mnemonic aliases, if any, so that we can parse operands correctly.
applyMnemonicAliases(Name, getAvailableFeatures(), 0);
if (getLexer().isNot(AsmToken::EndOfStatement)) { if (getLexer().isNot(AsmToken::EndOfStatement)) {
// Read the first operand. // Read the first operand.
if (getLexer().is(AsmToken::Comma)) { if (getLexer().is(AsmToken::Comma)) {

View File

@@ -209,6 +209,8 @@ static DecodeStatus DecodeSIMM13(MCInst &Inst, unsigned insn,
uint64_t Address, const void *Decoder); uint64_t Address, const void *Decoder);
static DecodeStatus DecodeJMPL(MCInst &Inst, unsigned insn, uint64_t Address, static DecodeStatus DecodeJMPL(MCInst &Inst, unsigned insn, uint64_t Address,
const void *Decoder); const void *Decoder);
static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address,
const void *Decoder);
#include "SparcGenDisassemblerTables.inc" #include "SparcGenDisassemblerTables.inc"
@@ -415,3 +417,31 @@ static DecodeStatus DecodeJMPL(MCInst &MI, unsigned insn, uint64_t Address,
} }
return MCDisassembler::Success; return MCDisassembler::Success;
} }
static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address,
const void *Decoder) {
unsigned rs1 = fieldFromInstruction(insn, 14, 5);
unsigned isImm = fieldFromInstruction(insn, 13, 1);
unsigned rs2 = 0;
unsigned simm13 = 0;
if (isImm)
simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
else
rs2 = fieldFromInstruction(insn, 0, 5);
// Decode RS1.
DecodeStatus status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
if (status != MCDisassembler::Success)
return status;
// Decode RS2 | SIMM13.
if (isImm)
MI.addOperand(MCOperand::CreateImm(simm13));
else {
status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
if (status != MCDisassembler::Success)
return status;
}
return MCDisassembler::Success;
}

View File

@@ -249,6 +249,8 @@ def : InstAlias<"mov $simm13, $rd", (ORri IntRegs:$rd, G0, i32imm:$simm13)>;
// restore -> restore %g0, %g0, %g0 // restore -> restore %g0, %g0, %g0
def : InstAlias<"restore", (RESTORErr G0, G0, G0)>; def : InstAlias<"restore", (RESTORErr G0, G0, G0)>;
def : MnemonicAlias<"return", "rett">, Requires<[HasV9]>;
def : MnemonicAlias<"addc", "addx">, Requires<[HasV9]>; def : MnemonicAlias<"addc", "addx">, Requires<[HasV9]>;
def : MnemonicAlias<"addccc", "addxcc">, Requires<[HasV9]>; def : MnemonicAlias<"addccc", "addxcc">, Requires<[HasV9]>;

View File

@@ -406,6 +406,14 @@ let isReturn = 1, isTerminator = 1, hasDelaySlot = 1, isBarrier = 1,
"jmp %i7+$val", []>; "jmp %i7+$val", []>;
} }
let isReturn = 1, isTerminator = 1, hasDelaySlot = 1,
isBarrier = 1, rd = 0, DecoderMethod = "DecodeReturn" in {
def RETTrr : F3_1<2, 0b111001, (outs), (ins MEMrr:$addr),
"rett $addr", []>;
def RETTri : F3_2<2, 0b111001, (outs), (ins MEMri:$addr),
"rett $addr", []>;
}
// Section B.1 - Load Integer Instructions, p. 90 // Section B.1 - Load Integer Instructions, p. 90
let DecoderMethod = "DecodeLoadInt" in { let DecoderMethod = "DecodeLoadInt" in {
defm LDSB : Load<"ldsb", 0b001001, sextloadi8, IntRegs, i32>; defm LDSB : Load<"ldsb", 0b001001, sextloadi8, IntRegs, i32>;

View File

@@ -197,3 +197,6 @@
# CHECK: ret # CHECK: ret
0x81,0xc7,0xe0,0x08 0x81,0xc7,0xe0,0x08
# CHECK: rett %i7+8
0x81 0xcf 0xe0 0x08

View File

@@ -274,3 +274,5 @@
! CHECK-NEXT: ! fixup A - offset: 0, value: .BB0, kind: fixup_sparc_br22 ! CHECK-NEXT: ! fixup A - offset: 0, value: .BB0, kind: fixup_sparc_br22
fbo,a .BB0 fbo,a .BB0
! CHECK: rett %i7+8 ! encoding: [0x81,0xcf,0xe0,0x08]
rett %i7 + 8

View File

@@ -1214,3 +1214,6 @@
fmovrsnz %g1, %f2, %f3 fmovrsnz %g1, %f2, %f3
fmovrsgz %g1, %f2, %f3 fmovrsgz %g1, %f2, %f3
fmovrsgez %g1, %f2, %f3 fmovrsgez %g1, %f2, %f3
! CHECK: rett %i7+8 ! encoding: [0x81,0xcf,0xe0,0x08]
return %i7 + 8