// Copyright 2006 The Android Open Source Project
#include <stdio.h>
#include <inttypes.h>
#include "opcode.h"
// Note: this array depends on the Opcode enum defined in opcode.h
uint32_t opcode_flags[] = {
0, // OP_INVALID
0, // OP_UNDEFINED
kCatAlu, // OP_ADC
kCatAlu, // OP_ADD
kCatAlu, // OP_AND
kCatBranch, // OP_B
kCatBranch | kCatBranchLink, // OP_BL
kCatAlu, // OP_BIC
0, // OP_BKPT
kCatBranch | kCatBranchLink | kCatBranchExch, // OP_BLX
kCatBranch | kCatBranchExch, // OP_BX
kCatCoproc, // OP_CDP
kCatAlu, // OP_CLZ
kCatAlu, // OP_CMN
kCatAlu, // OP_CMP
kCatAlu, // OP_EOR
kCatCoproc | kCatLoad, // OP_LDC
kCatLoad | kCatMultiple, // OP_LDM
kCatLoad | kCatWord, // OP_LDR
kCatLoad | kCatByte, // OP_LDRB
kCatLoad | kCatByte, // OP_LDRBT
kCatLoad | kCatHalf, // OP_LDRH
kCatLoad | kCatByte | kCatSigned, // OP_LDRSB
kCatLoad | kCatHalf | kCatSigned, // OP_LDRSH
kCatLoad | kCatWord, // OP_LDRT
kCatCoproc, // OP_MCR
kCatAlu, // OP_MLA
kCatAlu, // OP_MOV
kCatCoproc, // OP_MRC
0, // OP_MRS
0, // OP_MSR
kCatAlu, // OP_MUL
kCatAlu, // OP_MVN
kCatAlu, // OP_ORR
0, // OP_PLD
kCatAlu, // OP_RSB
kCatAlu, // OP_RSC
kCatAlu, // OP_SBC
kCatAlu, // OP_SMLAL
kCatAlu, // OP_SMULL
kCatCoproc | kCatStore, // OP_STC
kCatStore | kCatMultiple, // OP_STM
kCatStore | kCatWord, // OP_STR
kCatStore | kCatByte, // OP_STRB
kCatStore | kCatByte, // OP_STRBT
kCatStore | kCatHalf, // OP_STRH
kCatStore | kCatWord, // OP_STRT
kCatAlu, // OP_SUB
0, // OP_SWI
kCatLoad | kCatStore, // OP_SWP
kCatLoad | kCatStore | kCatByte, // OP_SWPB
kCatAlu, // OP_TEQ
kCatAlu, // OP_TST
kCatAlu, // OP_UMLAL
kCatAlu, // OP_UMULL
0, // OP_THUMB_UNDEFINED,
kCatAlu, // OP_THUMB_ADC,
kCatAlu, // OP_THUMB_ADD,
kCatAlu, // OP_THUMB_AND,
kCatAlu, // OP_THUMB_ASR,
kCatBranch, // OP_THUMB_B,
kCatAlu, // OP_THUMB_BIC,
0, // OP_THUMB_BKPT,
kCatBranch | kCatBranchLink, // OP_THUMB_BL,
kCatBranch | kCatBranchLink | kCatBranchExch, // OP_THUMB_BLX,
kCatBranch | kCatBranchExch, // OP_THUMB_BX,
kCatAlu, // OP_THUMB_CMN,
kCatAlu, // OP_THUMB_CMP,
kCatAlu, // OP_THUMB_EOR,
kCatLoad | kCatMultiple, // OP_THUMB_LDMIA,
kCatLoad | kCatWord, // OP_THUMB_LDR,
kCatLoad | kCatByte, // OP_THUMB_LDRB,
kCatLoad | kCatHalf, // OP_THUMB_LDRH,
kCatLoad | kCatByte | kCatSigned, // OP_THUMB_LDRSB,
kCatLoad | kCatHalf | kCatSigned, // OP_THUMB_LDRSH,
kCatAlu, // OP_THUMB_LSL,
kCatAlu, // OP_THUMB_LSR,
kCatAlu, // OP_THUMB_MOV,
kCatAlu, // OP_THUMB_MUL,
kCatAlu, // OP_THUMB_MVN,
kCatAlu, // OP_THUMB_NEG,
kCatAlu, // OP_THUMB_ORR,
kCatLoad | kCatMultiple, // OP_THUMB_POP,
kCatStore | kCatMultiple, // OP_THUMB_PUSH,
kCatAlu, // OP_THUMB_ROR,
kCatAlu, // OP_THUMB_SBC,
kCatStore | kCatMultiple, // OP_THUMB_STMIA,
kCatStore | kCatWord, // OP_THUMB_STR,
kCatStore | kCatByte, // OP_THUMB_STRB,
kCatStore | kCatHalf, // OP_THUMB_STRH,
kCatAlu, // OP_THUMB_SUB,
0, // OP_THUMB_SWI,
kCatAlu, // OP_THUMB_TST,
0, // OP_END
};
const char *opcode_names[] = {
"invalid",
"undefined",
"adc",
"add",
"and",
"b",
"bl",
"bic",
"bkpt",
"blx",
"bx",
"cdp",
"clz",
"cmn",
"cmp",
"eor",
"ldc",
"ldm",
"ldr",
"ldrb",
"ldrbt",
"ldrh",
"ldrsb",
"ldrsh",
"ldrt",
"mcr",
"mla",
"mov",
"mrc",
"mrs",
"msr",
"mul",
"mvn",
"orr",
"pld",
"rsb",
"rsc",
"sbc",
"smlal",
"smull",
"stc",
"stm",
"str",
"strb",
"strbt",
"strh",
"strt",
"sub",
"swi",
"swp",
"swpb",
"teq",
"tst",
"umlal",
"umull",
"undefined",
"adc",
"add",
"and",
"asr",
"b",
"bic",
"bkpt",
"bl",
"blx",
"bx",
"cmn",
"cmp",
"eor",
"ldmia",
"ldr",
"ldrb",
"ldrh",
"ldrsb",
"ldrsh",
"lsl",
"lsr",
"mov",
"mul",
"mvn",
"neg",
"orr",
"pop",
"push",
"ror",
"sbc",
"stmia",
"str",
"strb",
"strh",
"sub",
"swi",
"tst",
NULL
};