sparc: recover autogen code in arch/Sparc/SparcGenDisassemblerTables.inc
This commit is contained in:
parent
bb0744df5d
commit
abffe02a46
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue