28 #define CODEGEN_HPP_ 1
40 #define MCODECHECK(icnt) \
42 if ((cd->mcodeptr + (icnt) * 4) > cd->mcodeend) \
43 codegen_increase(cd); \
47 #define ALIGNCODENOP \
48 if ((s4) ((ptrint) cd->mcodeptr & 7)) { \
53 #define ICONST(d,c) emit_iconst(cd, (d), (c))
54 #define LCONST(d,c) emit_lconst(cd, (d), (c))
56 #define SHIFT(x,s) ((x) << s)
68 #define PATCHER_CALL_SIZE 1 * 4
70 #define PATCHER_NOPS \
132 if (value < 0 && -value-1 < 0xffff) {
141 u2 imm = (value >> 16) & 0xffff;
148 if (value < 0 && -value-1 < 0xffff) {
157 u2 imm = (value >> 16) & 0xffff;
161 if (v > 0xffffffff) {
162 u2 imm = (value >> 32) & 0xffff;
166 if (v > 0xffffffffffff) {
167 u2 imm = (value >> 48) & 0xffff;
338 #define M_NOP emit_nop(cd)
340 #define M_MOV(a,b) emit_mov(cd, b, a)
341 #define M_FMOV(b,c) emit_fmovs(cd, c, b)
342 #define M_DMOV(b,c) emit_fmovd(cd, c, b)
344 #define M_LLD(a, b, disp) emit_ldr_imm(cd, a, b, disp)
345 #define M_ALD(a, b, disp) emit_ldr_imm(cd, a, b, disp)
346 #define M_ALD_DSEG(a, disp) M_LLD(a, REG_PV, disp)
347 #define M_ILD(a, b, disp) emit_ldr_imm32(cd, a, b, disp)
349 #define M_LST(a, b, disp) emit_str_imm(cd, a, b, disp)
350 #define M_AST(a, b, disp) emit_str_imm(cd, a, b, disp)
351 #define M_IST(a, b, disp) emit_str_imm32(cd, a, b, disp)
353 #define M_DLD(a, b, disp) emit_fp_ldr_imm(cd, a, b, disp)
354 #define M_FLD(a, b, disp) emit_fp_ldr_imm32(cd, a, b, disp)
356 #define M_DST(a, b, disp) emit_fp_str_imm(cd, a, b, disp)
357 #define M_FST(a, b, disp) emit_fp_str_imm32(cd, a, b, disp)
359 #define M_TEST(a) emit_tst_sreg(cd, a, a)
360 #define M_ACMP(a, b) emit_cmp_reg(cd, a, b)
361 #define M_ICMP(a, b) emit_cmp_reg32(cd, a, b)
363 #endif // CODEGEN_HPP_
void ladd(u1 xd, u1 xn, u1 xm)
void ald(u1 xt, u1 xn, s2 imm)
#define emit_fp_str_imm(cd, Xt, Xn, imm)
void fdiv(u1 st, u1 sn, u1 sm)
#define emit_br_gt(cd, imm)
#define emit_fsubs(cd, Sd, Sn, Sm)
void lmsub(u1 xd, u1 xn, u1 xm, u1 xa)
#define emit_fmuls(cd, Sd, Sn, Sm)
#define emit_eor_sreg(cd, Xd, Xn, Xm)
#define emit_fmuld(cd, Dd, Dn, Dm)
#define emit_blr_reg(cd, Xn)
void lcmp_imm(u1 xd, u2 imm)
#define emit_fp_str_imm32(cd, Xt, Xn, imm)
void llsl_imm(u1 xd, u1 xn, u1 shift)
#define emit_mul(cd, Xd, Xn, Xm)
void emit_fp_cmp(codegendata *cd, u1 type, u1 Rm, u1 Rn, u1 opc)
#define emit_br_hi(cd, imm)
#define emit_movn_imm(cd, Xd, imm)
void land(u1 xd, u1 xn, u1 xm)
#define emit_cset(cd, Xd, cond)
void ior(u1 wd, u1 wn, u1 wm)
#define emit_lsr(cd, Xd, Xn, Xm)
void llsl(u1 xd, u1 xn, u1 xm)
#define emit_csneg32(cd, Wd, Wn, Wm, cond)
#define emit_br_reg(cd, Xn)
void csel(u1 xt, u1 xn, u1 xm, u1 cond)
void ilsl(u1 wd, u1 wn, u1 wm)
#define emit_tst_sreg(cd, Xn, Xm)
#define emit_movk_imm(cd, Xd, imm, hw)
#define emit_cmn_imm32(cd, Wn, imm)
#define emit_br_eq(cd, imm)
#define emit_lsl_imm(cd, Xd, Xn, shift)
void dst(u1 xt, u1 xn, s2 imm)
void lxor(u1 xd, u1 xn, u1 xm)
void lcmn_imm(u1 xd, u2 imm)
#define emit_fsubd(cd, Dd, Dn, Dm)
void lconst(u1 xt, s8 value)
#define emit_fnegd(cd, Dd, Dn)
void ldrsh32(u1 wt, u1 xn, s2 imm)
void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount)
Xd = Xn + shift(Xm, amount);.
#define emit_mov_imm32(cd, Xd, imm)
void lmul(u1 xd, u1 xn, u1 xm)
void icmp_imm(u1 wd, u2 imm)
void ixor(u1 wd, u1 wn, u1 wm)
void idiv(u1 wd, u1 wn, u1 wm)
#define emit_add_reg_shift(cd, Xd, Xn, Xm, s, a)
#define emit_sxtw(cd, Xd, Wn)
#define emit_msub(cd, Xd, Xn, Xm, Xa)
#define emit_sxtb(cd, Wd, Wn)
#define emit_fmovd(cd, Dd, Dn)
#define emit_br_ne(cd, imm)
#define emit_csetm(cd, Xd, cond)
#define emit_lsr_imm(cd, Xd, Xn, shift)
#define emit_uxtb(cd, Wd, Wn)
#define emit_br_lt(cd, imm)
#define emit_cmp_reg(cd, Xn, Xm)
void fst(u1 xt, u1 xn, s2 imm)
AsmEmitter(codegendata *cd)
void llsr_imm(u1 xd, u1 xn, u1 shift)
#define emit_br_vs(cd, imm)
void dmul(u1 dt, u1 dn, u1 dm)
void dadd(u1 dt, u1 dn, u1 dm)
void emit_fcvt(codegendata *cd, u1 type, u1 opc, u1 Rn, u1 Rd)
#define emit_br_imm(cd, imm)
void emit_mov(codegendata *cd, u1 Xd, u1 Xm)
#define emit_cmn_imm(cd, Xn, imm)
#define emit_sub_reg(cd, Xd, Xn, Xm)
void ist(u1 xt, u1 xn, s2 imm)
void iadd_imm(u1 xd, u1 xn, u4 imm)
#define emit_asr_imm(cd, Xd, Xn, shift)
#define emit_ldrsh_imm32(cd, Xt, Xn, imm)
#define emit_br_cs(cd, imm)
#define emit_faddd(cd, Dd, Dn, Dm)
void ild(u1 xt, u1 xn, s2 imm)
#define emit_sdiv32(cd, Wd, Wn, Wm)
#define emit_br_vc(cd, imm)
#define emit_sub_imm32(cd, Xd, Xn, imm)
#define emit_orr_sreg(cd, Xd, Xn, Xm)
void ast(u1 xt, u1 xn, s2 imm)
void ilsl_imm(u1 wd, u1 wn, u1 shift)
#define emit_br_cc(cd, imm)
#define emit_ldr_imm(cd, Xt, Xn, imm)
void ladd_imm(u1 xd, u1 xn, u4 imm)
#define emit_add_reg32(cd, Xd, Xn, Xm)
void cset(u1 xt, u1 cond)
#define emit_cmp_imm(cd, Xn, imm)
void ilsr(u1 wd, u1 wn, u1 wm)
void llsr(u1 xd, u1 xn, u1 xm)
#define emit_and_sreg(cd, Xd, Xn, Xm)
void icsneg(u1 wd, u1 wn, u1 wm, u1 cond)
#define emit_str_imm32(cd, Xt, Xn, imm)
#define emit_br_pl(cd, imm)
void imul(u1 wd, u1 wn, u1 wm)
#define emit_dsb(cd, option)
#define emit_ldr_imm32(cd, Xt, Xn, imm)
#define emit_strh_imm(cd, Xt, Xn, imm)
#define emit_add_imm(cd, Xd, Xn, imm)
#define emit_msub32(cd, Xd, Xn, Xm, Xa)
void ilsr_imm(u1 wd, u1 wn, u1 shift)
#define emit_mov_reg32(cd, Wd, Wm)
#define emit_ubfm32(cd, Wd, Wn, immr, imms)
void lst(u1 xt, u1 xn, s2 imm)
void lsub_imm(u1 xd, u1 xn, u4 imm)
void imsub(u1 wd, u1 wn, u1 wm, u1 wa)
void ldrb(u1 wt, u1 xn, s2 imm)
#define emit_ldrb_imm(cd, Xt, Xn, imm)
#define emit_sub_reg32(cd, Xd, Xn, Xm)
#define emit_sub_imm(cd, Xd, Xn, imm)
#define emit_orr_sreg32(cd, Wd, Wn, Wm)
#define emit_cmp_reg32(cd, Xn, Xm)
#define emit_fp_ldr_imm(cd, Xt, Xn, imm)
#define emit_add_reg(cd, Xd, Xn, Xm)
void csetm(u1 xt, u1 cond)
#define emit_sxth(cd, Wd, Wn)
#define emit_lsl32(cd, Wd, Wn, Wm)
void isub_imm(u1 xd, u1 xn, u4 imm)
#define emit_fadds(cd, Sd, Sn, Sm)
void fsub(u1 st, u1 sn, u1 sm)
void dld(u1 xt, u1 xn, s2 imm)
void fmul(u1 st, u1 sn, u1 sm)
void emit_lda(u1 xd, u1 xn, s4 imm)
#define emit_lsl(cd, Xd, Xn, Xm)
#define emit_sdiv(cd, Xd, Xn, Xm)
#define emit_lsr32(cd, Wd, Wn, Wm)
void ldrsb32(u1 wt, u1 xn, s2 imm)
#define emit_ldrsb_imm32(cd, Xt, Xn, imm)
void ldiv(u1 xd, u1 xn, u1 xm)
void iadd(u1 xd, u1 xn, u1 xm)
#define emit_fp_ldr_imm32(cd, Xt, Xn, imm)
#define emit_lsl_imm32(cd, Wd, Wn, shift)
#define emit_fcvtzs(cd, sf, type, Rn, Rd)
#define emit_movk_imm32(cd, Xd, imm, hw)
void lor(u1 xd, u1 xn, u1 xm)
#define emit_movn_imm32(cd, Xd, imm)
void lld(u1 xt, u1 xn, s2 imm)
#define emit_and_sreg32(cd, Wd, Wn, Wm)
#define emit_br_ge(cd, imm)
#define emit_str_imm(cd, Xt, Xn, imm)
void lda(u1 xd, u1 xn, s4 imm)
void icmn_imm(u1 wd, u2 imm)
#define emit_scvtf(cd, sf, type, Rn, Rd)
#define emit_fdivd(cd, Dd, Dn, Dm)
#define emit_tst_sreg32(cd, Wn, Wm)
#define emit_asr(cd, Xd, Xn, Xm)
#define emit_asr_imm32(cd, Wd, Wn, shift)
void emit_nop(codegendata *cd)
void fadd(u1 st, u1 sn, u1 sm)
void dsub(u1 dt, u1 dn, u1 dm)
#define emit_mul32(cd, Xd, Xn, Xm)
void iasr_imm(u1 wd, u1 wn, u1 shift)
#define emit_fnegs(cd, Sd, Sn)
#define emit_mov_imm(cd, Xd, imm)
void iconst(u1 xt, s4 value)
#define emit_asr32(cd, Wd, Wn, Wm)
void lasr_imm(u1 xd, u1 xn, u1 shift)
#define emit_csel32(cd, Xd, Xn, Xm, cond)
void strb(u1 wt, u1 xn, s2 imm)
void isub(u1 xd, u1 xn, u1 xm)
void iasr(u1 wd, u1 wn, u1 wm)
#define emit_dmb(cd, option)
#define emit_fmovs(cd, Sd, Sn)
void iand(u1 wd, u1 wn, u1 wm)
void lsub(u1 xd, u1 xn, u1 xm)
#define emit_fdivs(cd, Sd, Sn, Sm)
void strh(u1 wt, u1 xn, s2 imm)
#define emit_br_le(cd, imm)
#define emit_eor_sreg32(cd, Wd, Wn, Wm)
void fld(u1 xt, u1 xn, s2 imm)
void lasr(u1 xd, u1 xn, u1 xm)
void icsel(u1 wt, u1 wn, u1 wm, u1 cond)
void ldrh(u1 wt, u1 xn, s2 imm)
#define emit_csel(cd, Xd, Xn, Xm, cond)
#define emit_adr(cd, Xd, immhi)
#define emit_ldrh_imm(cd, Xt, Xn, imm)
#define emit_br_ls(cd, imm)
#define emit_br_mi(cd, imm)
#define emit_cmp_imm32(cd, Xn, imm)
#define emit_add_imm32(cd, Xd, Xn, imm)
#define emit_cbnz(cd, Xt, imm)
void ddiv(u1 dt, u1 dn, u1 dm)
#define emit_lsr_imm32(cd, Wd, Wn, shift)
#define emit_uxth(cd, Wd, Wn)
#define emit_strb_imm(cd, Xt, Xn, imm)