📄 arm-codegen.h
字号:
arminstr_t wb : 1;
arminstr_t type : 1; /* imm(1) / reg(0) */
arminstr_t u : 1; /* +- */
arminstr_t p : 1; /* pre/post-index */
arminstr_t tag : 3;
arminstr_t cond : 4;
} ARMInstrHXfer;
#define ARM_HXFER_ID 0
#define ARM_HXFER_ID2 1
#define ARM_HXFER_ID3 1
#define ARM_HXFER_MASK ((0x7 << 25) | (0x9 << 4))
#define ARM_HXFER_TAG ((ARM_HXFER_ID << 25) | (ARM_HXFER_ID2 << 7) | (ARM_HXFER_ID3 << 4))
#define ARM_DEF_HXFER_IMM_COND(imm, h, s, rd, rn, ls, wb, p, cond) \
((imm) < 0?(-(imm)) & 0xF:(imm) & 0xF) | \
((h) << 5) | \
((s) << 6) | \
((imm) < 0?((-(imm)) << 4) & 0xF00:((imm) << 4) & 0xF00) | \
((rd) << 12) | \
((rn) << 16) | \
((ls) << 20) | \
((wb) << 21) | \
(1 << 22) | \
(((int)(imm) >= 0) << 23) | \
((p) << 24) | \
ARM_HXFER_TAG | \
ARM_DEF_COND(cond)
#define ARM_LDRH_IMM_COND(p, rd, rn, imm, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 0, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRH_IMM(p, rd, rn, imm) \
ARM_LDRH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)
#define ARM_LDRSH_IMM_COND(p, rd, rn, imm, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 1, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRSH_IMM(p, rd, rn, imm) \
ARM_LDRSH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)
#define ARM_LDRSB_IMM_COND(p, rd, rn, imm, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 0, 1, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRSB_IMM(p, rd, rn, imm) \
ARM_LDRSB_IMM_COND(p, rd, rn, imm, ARMCOND_AL)
#define ARM_STRH_IMM_COND(p, rd, rn, imm, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 0, rd, rn, ARMOP_STR, 0, 1, cond))
#define ARM_STRH_IMM(p, rd, rn, imm) \
ARM_STRH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)
#define ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, u, p, cond) \
((rm) & 0xF) | \
((h) << 5) | \
((s) << 6) | \
((rd) << 12) | \
((rn) << 16) | \
((ls) << 20) | \
((wb) << 21) | \
(0 << 22) | \
((u) << 23) | \
((p) << 24) | \
ARM_HXFER_TAG | \
ARM_DEF_COND(cond)
#define ARM_DEF_HXFER_REG_REG_COND(rm, h, s, rd, rn, ls, wb, p, cond) \
ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, ARM_UP, p, cond)
#define ARM_DEF_HXFER_REG_MINUS_REG_COND(rm, h, s, rd, rn, ls, wb, p, cond) \
ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, ARM_DOWN, p, cond)
#define ARM_LDRH_REG_REG_COND(p, rm, rd, rn, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 0, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRH_REG_REG(p, rm, rd, rn) \
ARM_LDRH_REG_REG_COND(p, rm, rd, rn, ARMCOND_AL)
#define ARM_LDRSH_REG_REG_COND(p, rm, rd, rn, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 1, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRSH_REG_REG(p, rm, rd, rn) \
ARM_LDRSH_REG_REG_COND(p, rm, rd, rn, ARMCOND_AL)
#define ARM_LDRSB_REG_REG_COND(p, rm, rd, rn, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 0, 1, rd, rn, ARMOP_LDR, 0, 1, cond))
#define ARM_LDRSB_REG_REG(p, rm, rd, rn) ARM_LDRSB_REG_REG_COND(p, rm, rd, rn, ARMCOND_AL)
#define ARM_STRH_REG_REG_COND(p, rm, rd, rn, cond) \
ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 0, rd, rn, ARMOP_STR, 0, 1, cond))
#define ARM_STRH_REG_REG(p, rm, rd, rn) \
ARM_STRH_REG_REG_COND(p, rm, rd, rn, ARMCOND_AL)
/* Swap */
typedef struct {
arminstr_t rm : 4;
arminstr_t tag3 : 8; /* 0x9 */
arminstr_t rd : 4;
arminstr_t rn : 4;
arminstr_t tag2 : 2;
arminstr_t b : 1;
arminstr_t tag : 5; /* 0x2 */
arminstr_t cond : 4;
} ARMInstrSwap;
#define ARM_SWP_ID 2
#define ARM_SWP_ID2 9
#define ARM_SWP_MASK ((0x1F << 23) | (3 << 20) | (0xFF << 4))
#define ARM_SWP_TAG ((ARM_SWP_ID << 23) | (ARM_SWP_ID2 << 4))
/* Software interrupt */
typedef struct {
arminstr_t num : 24;
arminstr_t tag : 4;
arminstr_t cond : 4;
} ARMInstrSWI;
#define ARM_SWI_ID 0xF
#define ARM_SWI_MASK (0xF << 24)
#define ARM_SWI_TAG (ARM_SWI_ID << 24)
/* Co-processor Data Processing */
typedef struct {
arminstr_t crm : 4;
arminstr_t tag2 : 1; /* 0 */
arminstr_t op2 : 3;
arminstr_t cpn : 4; /* CP number */
arminstr_t crd : 4;
arminstr_t crn : 4;
arminstr_t op : 4;
arminstr_t tag : 4; /* 0xE */
arminstr_t cond : 4;
} ARMInstrCDP;
#define ARM_CDP_ID 0xE
#define ARM_CDP_ID2 0
#define ARM_CDP_MASK ((0xF << 24) | (1 << 4))
#define ARM_CDP_TAG ((ARM_CDP_ID << 24) | (ARM_CDP_ID2 << 4))
/* Co-processor Data Transfer (ldc/stc) */
typedef struct {
arminstr_t offs : 8;
arminstr_t cpn : 4;
arminstr_t crd : 4;
arminstr_t rn : 4;
arminstr_t ls : 1;
arminstr_t wb : 1;
arminstr_t n : 1;
arminstr_t u : 1;
arminstr_t p : 1;
arminstr_t tag : 3;
arminstr_t cond : 4;
} ARMInstrCDT;
#define ARM_CDT_ID 6
#define ARM_CDT_MASK (7 << 25)
#define ARM_CDT_TAG (ARM_CDT_ID << 25)
/* Co-processor Register Transfer (mcr/mrc) */
typedef struct {
arminstr_t crm : 4;
arminstr_t tag2 : 1;
arminstr_t op2 : 3;
arminstr_t cpn : 4;
arminstr_t rd : 4;
arminstr_t crn : 4;
arminstr_t ls : 1;
arminstr_t op1 : 3;
arminstr_t tag : 4;
arminstr_t cond : 4;
} ARMInstrCRT;
#define ARM_CRT_ID 0xE
#define ARM_CRT_ID2 0x1
#define ARM_CRT_MASK ((0xF << 24) | (1 << 4))
#define ARM_CRT_TAG ((ARM_CRT_ID << 24) | (ARM_CRT_ID2 << 4))
/* Move register to PSR. */
typedef union {
ARMDPI_op2_imm op2_imm;
struct {
arminstr_t rm : 4;
arminstr_t pad : 8; /* 0 */
arminstr_t tag4 : 4; /* 0xF */
arminstr_t fld : 4;
arminstr_t tag3 : 2; /* 0x2 */
arminstr_t sel : 1;
arminstr_t tag2 : 2; /* 0x2 */
arminstr_t type : 1;
arminstr_t tag : 2; /* 0 */
arminstr_t cond : 4;
} all;
} ARMInstrMSR;
#define ARM_MSR_ID 0
#define ARM_MSR_ID2 2
#define ARM_MSR_ID3 2
#define ARM_MSR_ID4 0xF
#define ARM_MSR_MASK ((3 << 26) | \
(3 << 23) | \
(3 << 20) | \
(0xF << 12))
#define ARM_MSR_TAG ((ARM_MSR_ID << 26) | \
(ARM_MSR_ID2 << 23) | \
(ARM_MSR_ID3 << 20) | \
(ARM_MSR_ID4 << 12))
/* Move PSR to register. */
typedef struct {
arminstr_t tag3 : 12;
arminstr_t rd : 4;
arminstr_t tag2 : 6;
arminstr_t sel : 1; /* CPSR | SPSR */
arminstr_t tag : 5;
arminstr_t cond : 4;
} ARMInstrMRS;
#define ARM_MRS_ID 2
#define ARM_MRS_ID2 0xF
#define ARM_MRS_ID3 0
#define ARM_MRS_MASK ((0x1F << 23) | (0x3F << 16) | 0xFFF)
#define ARM_MRS_TAG ((ARM_MRS_ID << 23) | (ARM_MRS_ID2 << 16) | ARM_MRS_ID3)
#include "arm_dpimacros.h"
#define ARM_NOP(p) ARM_MOV_REG_REG(p, ARMREG_R0, ARMREG_R0)
#define ARM_SHL_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, imm, cond)
#define ARM_SHL_IMM(p, rd, rm, imm) \
ARM_SHL_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SHLS_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, imm, cond)
#define ARM_SHLS_IMM(p, rd, rm, imm) \
ARM_SHLS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SHR_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, imm, cond)
#define ARM_SHR_IMM(p, rd, rm, imm) \
ARM_SHR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SHRS_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, imm, cond)
#define ARM_SHRS_IMM(p, rd, rm, imm) \
ARM_SHRS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SAR_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, imm, cond)
#define ARM_SAR_IMM(p, rd, rm, imm) \
ARM_SAR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SARS_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, imm, cond)
#define ARM_SARS_IMM(p, rd, rm, imm) \
ARM_SARS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_ROR_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, imm, cond)
#define ARM_ROR_IMM(p, rd, rm, imm) \
ARM_ROR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_RORS_IMM_COND(p, rd, rm, imm, cond) \
ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, imm, cond)
#define ARM_RORS_IMM(p, rd, rm, imm) \
ARM_RORS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)
#define ARM_SHL_REG_COND(p, rd, rm, rs, cond) \
ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, rs, cond)
#define ARM_SHL_REG(p, rd, rm, rs) \
ARM_SHL_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SHLS_REG_COND(p, rd, rm, rs, cond) \
ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, rs, cond)
#define ARM_SHLS_REG(p, rd, rm, rs) \
ARM_SHLS_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SHLS_REG_REG(p, rd, rm, rs) ARM_SHLS_REG(p, rd, rm, rs)
#define ARM_SHR_REG_COND(p, rd, rm, rs, cond) \
ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, rs, cond)
#define ARM_SHR_REG(p, rd, rm, rs) \
ARM_SHR_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SHRS_REG_COND(p, rd, rm, rs, cond) \
ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, rs, cond)
#define ARM_SHRS_REG(p, rd, rm, rs) \
ARM_SHRS_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SHRS_REG_REG(p, rd, rm, rs) ARM_SHRS_REG(p, rd, rm, rs)
#define ARM_SAR_REG_COND(p, rd, rm, rs, cond) \
ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, rs, cond)
#define ARM_SAR_REG(p, rd, rm, rs) \
ARM_SAR_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SARS_REG_COND(p, rd, rm, rs, cond) \
ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, rs, cond)
#define ARM_SARS_REG(p, rd, rm, rs) \
ARM_SARS_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_SARS_REG_REG(p, rd, rm, rs) ARM_SARS_REG(p, rd, rm, rs)
#define ARM_ROR_REG_COND(p, rd, rm, rs, cond) \
ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, rs, cond)
#define ARM_ROR_REG(p, rd, rm, rs) \
ARM_ROR_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_RORS_REG_COND(p, rd, rm, rs, cond) \
ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, rs, cond)
#define ARM_RORS_REG(p, rd, rm, rs) \
ARM_RORS_REG_COND(p, rd, rm, rs, ARMCOND_AL)
#define ARM_RORS_REG_REG(p, rd, rm, rs) ARM_RORS_REG(p, rd, rm, rs)
#define ARM_DBRK(p) ARM_EMIT(p, 0xE6000010)
#define ARM_IASM_DBRK() ARM_IASM_EMIT(0xE6000010)
#define ARM_INC(p, reg) ARM_ADD_REG_IMM8(p, reg, reg, 1)
#define ARM_DEC(p, reg) ARM_SUB_REG_IMM8(p, reg, reg, 1)
/* ARM V5 */
/* Count leading zeros, CLZ{cond} Rd, Rm */
typedef struct {
arminstr_t rm : 4;
arminstr_t tag2 : 8;
arminstr_t rd : 4;
arminstr_t tag : 12;
arminstr_t cond : 4;
} ARMInstrCLZ;
#define ARM_CLZ_ID 0x16F
#define ARM_CLZ_ID2 0xF1
#define ARM_CLZ_MASK ((0xFFF << 16) | (0xFF < 4))
#define ARM_CLZ_TAG ((ARM_CLZ_ID << 16) | (ARM_CLZ_ID2 << 4))
typedef union {
ARMInstrBR br;
ARMInstrDPI dpi;
ARMInstrMRT mrt;
ARMInstrMul mul;
ARMInstrWXfer wxfer;
ARMInstrHXfer hxfer;
ARMInstrSwap swp;
ARMInstrCDP cdp;
ARMInstrCDT cdt;
ARMInstrCRT crt;
ARMInstrSWI swi;
ARMInstrMSR msr;
ARMInstrMRS mrs;
ARMInstrCLZ clz;
ARMInstrGeneric generic;
arminstr_t raw;
} ARMInstr;
#ifdef __cplusplus
}
#endif
#endif /* ARM_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -