From abffe02a460393e7823ad019f764bfbbea8f1982 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Mon, 12 May 2014 13:48:22 +0800 Subject: [PATCH] sparc: recover autogen code in arch/Sparc/SparcGenDisassemblerTables.inc --- arch/Sparc/SparcGenDisassemblerTables.inc | 158 +++++++++++----------- 1 file changed, 80 insertions(+), 78 deletions(-) diff --git a/arch/Sparc/SparcGenDisassemblerTables.inc b/arch/Sparc/SparcGenDisassemblerTables.inc index 9e4e55d7..72df6044 100644 --- a/arch/Sparc/SparcGenDisassemblerTables.inc +++ b/arch/Sparc/SparcGenDisassemblerTables.inc @@ -1934,83 +1934,85 @@ static DecodeStatus fname(DecodeStatus S, unsigned Idx, InsnType insn, MCInst *M } \ } +#define DecodeInstruction(fname, fieldname, decoder, InsnType) \ +static DecodeStatus fname(uint8_t DecodeTable[], MCInst *MI, \ + InsnType insn, uint64_t Address, MCRegisterInfo *MRI, int feature) \ +{ \ + uint64_t Bits = getFeatureBits(feature); \ + uint8_t *Ptr = DecodeTable; \ + uint32_t CurFieldValue = 0, ExpectedValue; \ + DecodeStatus S = MCDisassembler_Success; \ + unsigned Start, Len, NumToSkip, PIdx, Opc, DecodeIdx; \ + InsnType Val, FieldValue, PositiveMask, NegativeMask; \ + bool Pred, Fail; \ + for (;;) { \ + switch (*Ptr) { \ + default: \ + return MCDisassembler_Fail; \ + case MCD_OPC_ExtractField: { \ + Start = *++Ptr; \ + Len = *++Ptr; \ + ++Ptr; \ + CurFieldValue = fieldname(insn, Start, Len); \ + break; \ + } \ + case MCD_OPC_FilterValue: { \ + Val = (InsnType)decodeULEB128(++Ptr, &Len); \ + Ptr += Len; \ + NumToSkip = *Ptr++; \ + NumToSkip |= (*Ptr++) << 8; \ + if (Val != CurFieldValue) \ + Ptr += NumToSkip; \ + break; \ + } \ + case MCD_OPC_CheckField: { \ + Start = *++Ptr; \ + Len = *++Ptr; \ + FieldValue = fieldname(insn, Start, Len); \ + ExpectedValue = (uint32_t)decodeULEB128(++Ptr, &Len); \ + Ptr += Len; \ + NumToSkip = *Ptr++; \ + NumToSkip |= (*Ptr++) << 8; \ + if (ExpectedValue != FieldValue) \ + Ptr += NumToSkip; \ + break; \ + } \ + case MCD_OPC_CheckPredicate: { \ + PIdx = decodeULEB128(++Ptr, &Len); \ + Ptr += Len; \ + NumToSkip = *Ptr++; \ + NumToSkip |= (*Ptr++) << 8; \ + Pred = checkDecoderPredicate(PIdx, Bits); \ + if (!Pred) \ + Ptr += NumToSkip; \ + (void)Pred; \ + break; \ + } \ + case MCD_OPC_Decode: { \ + Opc = (unsigned)decodeULEB128(++Ptr, &Len); \ + Ptr += Len; \ + DecodeIdx = (unsigned)decodeULEB128(Ptr, &Len); \ + Ptr += Len; \ + MCInst_setOpcode(MI, Opc); \ + return decoder(S, DecodeIdx, insn, MI, Address, MRI); \ + } \ + case MCD_OPC_SoftFail: { \ + PositiveMask = (InsnType)decodeULEB128(++Ptr, &Len); \ + Ptr += Len; \ + NegativeMask = (InsnType)decodeULEB128(Ptr, &Len); \ + Ptr += Len; \ + Fail = (insn & PositiveMask) || (~insn & NegativeMask); \ + if (Fail) \ + S = MCDisassembler_SoftFail; \ + break; \ + } \ + case MCD_OPC_Fail: { \ + return MCDisassembler_Fail; \ + } \ + } \ + } \ +} + FieldFromInstruction(fieldFromInstruction_4, uint32_t) DecodeToMCInst(decodeToMCInst_4, fieldFromInstruction_4, uint32_t) -//DecodeInstruction(decodeInstruction_4, fieldFromInstruction_4, decodeToMCInst_4, uint32_t) -static DecodeStatus decodeInstruction_4(uint8_t DecodeTable[], MCInst *MI, - uint32_t insn, uint64_t Address, MCRegisterInfo *MRI, int feature) -{ - uint64_t Bits = getFeatureBits(feature); - uint8_t *Ptr = DecodeTable; - uint32_t CurFieldValue = 0, ExpectedValue; - DecodeStatus S = MCDisassembler_Success; - unsigned Start, Len, NumToSkip, PIdx, Opc, DecodeIdx; - uint32_t Val, FieldValue, PositiveMask, NegativeMask; - bool Pred, Fail; - for (;;) { - switch (*Ptr) { - default: - return MCDisassembler_Fail; - case MCD_OPC_ExtractField: { - Start = *++Ptr; - Len = *++Ptr; - ++Ptr; - CurFieldValue = fieldFromInstruction_4(insn, Start, Len); - break; - } - case MCD_OPC_FilterValue: { - Val = (uint32_t)decodeULEB128(++Ptr, &Len); - Ptr += Len; - NumToSkip = *Ptr++; - NumToSkip |= (*Ptr++) << 8; - if (Val != CurFieldValue) - Ptr += NumToSkip; - break; - } - case MCD_OPC_CheckField: { - Start = *++Ptr; - Len = *++Ptr; - FieldValue = fieldFromInstruction_4(insn, Start, Len); - ExpectedValue = (uint32_t)decodeULEB128(++Ptr, &Len); - Ptr += Len; - NumToSkip = *Ptr++; - NumToSkip |= (*Ptr++) << 8; - if (ExpectedValue != FieldValue) - Ptr += NumToSkip; - break; - } - case MCD_OPC_CheckPredicate: { - PIdx = decodeULEB128(++Ptr, &Len); - Ptr += Len; - NumToSkip = *Ptr++; - NumToSkip |= (*Ptr++) << 8; - Pred = checkDecoderPredicate(PIdx, Bits); - if (!Pred) - Ptr += NumToSkip; - (void)Pred; - break; - } - case MCD_OPC_Decode: { - Opc = (unsigned)decodeULEB128(++Ptr, &Len); - Ptr += Len; - DecodeIdx = (unsigned)decodeULEB128(Ptr, &Len); - Ptr += Len; - MCInst_setOpcode(MI, Opc); - return decodeToMCInst_4(S, DecodeIdx, insn, MI, Address, MRI); - } - case MCD_OPC_SoftFail: { - PositiveMask = (uint32_t)decodeULEB128(++Ptr, &Len); - Ptr += Len; - NegativeMask = (uint32_t)decodeULEB128(Ptr, &Len); - Ptr += Len; - Fail = (insn & PositiveMask) || (~insn & NegativeMask); - if (Fail) - S = MCDisassembler_SoftFail; - break; - } - case MCD_OPC_Fail: { - return MCDisassembler_Fail; - } - } - } -} +DecodeInstruction(decodeInstruction_4, fieldFromInstruction_4, decodeToMCInst_4, uint32_t)