sparc: recover autogen code in arch/Sparc/SparcGenDisassemblerTables.inc

This commit is contained in:
Nguyen Anh Quynh 2014-05-12 13:48:22 +08:00
parent bb0744df5d
commit abffe02a46
1 changed files with 80 additions and 78 deletions

View File

@ -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)