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 \
137 if (value < 0 && -value-1 < 0xffff) {
146 u2 imm = (value >> 16) & 0xffff;
153 if (value < 0 && -value-1 < 0xffff) {
162 u2 imm = (value >> 16) & 0xffff;
166 if (v > 0xffffffff) {
167 u2 imm = (value >> 32) & 0xffff;
171 if (v > 0xffffffffffff) {
172 u2 imm = (value >> 48) & 0xffff;
344 #define M_NOP emit_nop(cd)
346 #define M_MOV(a,b) emit_mov(cd, b, a)
347 #define M_FMOV(b,c) emit_fmovs(cd, c, b)
348 #define M_DMOV(b,c) emit_fmovd(cd, c, b)
350 #define M_LLD(a, b, disp) emit_ldr_imm(cd, a, b, disp)
351 #define M_ALD(a, b, disp) emit_ldr_imm(cd, a, b, disp)
352 #define M_ALD_DSEG(a, disp) M_LLD(a, REG_PV, disp)
353 #define M_ILD(a, b, disp) emit_ldr_imm32(cd, a, b, disp)
355 #define M_LST(a, b, disp) emit_str_imm(cd, a, b, disp)
356 #define M_AST(a, b, disp) emit_str_imm(cd, a, b, disp)
357 #define M_IST(a, b, disp) emit_str_imm32(cd, a, b, disp)
359 #define M_DLD(a, b, disp) emit_fp_ldr_imm(cd, a, b, disp)
360 #define M_FLD(a, b, disp) emit_fp_ldr_imm32(cd, a, b, disp)
362 #define M_DST(a, b, disp) emit_fp_str_imm(cd, a, b, disp)
363 #define M_FST(a, b, disp) emit_fp_str_imm32(cd, a, b, disp)
365 #define M_TEST(a) emit_tst_sreg(cd, a, a)
366 #define M_ACMP(a, b) emit_cmp_reg(cd, a, b)
367 #define M_ICMP(a, b) emit_cmp_reg32(cd, a, b)
369 #endif // CODEGEN_HPP_
void ladd(u1 xd, u1 xn, u1 xm)
void strh(u1 wt, u1 xn, s4 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 icbnz(u1 wn, s4 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)
void ast(u1 xt, u1 xn, s4 imm)
#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 strb(u1 wt, u1 xn, s4 imm)
void ior(u1 wd, u1 wn, u1 wm)
#define emit_stxr32(cd, Ws, Wt, Xn)
#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 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 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)
AsmEmitter(codegendata *cd)
void llsr_imm(u1 xd, u1 xn, u1 shift)
void ldrb(u1 wt, u1 xn, s4 imm)
void fld(u1 xt, u1 xn, s4 imm)
#define emit_br_vs(cd, imm)
void lst(u1 xt, u1 xn, s4 imm)
void dmul(u1 dt, u1 dn, u1 dm)
void ald(u1 xt, u1 xn, s4 imm)
void ist(u1 xt, u1 xn, s4 imm)
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)
#define emit_ldxr32(cd, Wt, Xn)
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)
#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 ilsl_imm(u1 wd, u1 wn, u1 shift)
#define emit_br_cc(cd, imm)
#define emit_ldr_imm(cd, Xt, Xn, imm)
#define emit_cbnz32(cd, Wt, 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)
void ldrsb32(u1 wt, u1 xn, s4 imm)
#define emit_str_imm32(cd, Xt, Xn, imm)
#define emit_br_pl(cd, imm)
void dld(u1 xt, u1 xn, s4 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)
void ldrsh32(u1 wt, u1 xn, s4 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 lsub_imm(u1 xd, u1 xn, u4 imm)
void imsub(u1 wd, u1 wn, u1 wm, u1 wa)
#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 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)
#define emit_ldrsb_imm32(cd, Xt, Xn, imm)
void ldiv(u1 xd, u1 xn, u1 xm)
void ldrh(u1 wt, u1 xn, s4 imm)
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)
#define emit_and_sreg32(cd, Wd, Wn, Wm)
#define emit_br_ge(cd, imm)
#define emit_str_imm(cd, Xt, Xn, imm)
void ild(u1 xt, u1 xn, s4 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 isub(u1 xd, u1 xn, u1 xm)
void iasr(u1 wd, u1 wn, u1 wm)
void lld(u1 xt, u1 xn, s4 imm)
#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)
#define emit_br_le(cd, imm)
#define emit_eor_sreg32(cd, Wd, Wn, Wm)
void lasr(u1 xd, u1 xn, u1 xm)
void istxr(u1 ws, u1 wt, u1 xn)
void icsel(u1 wt, u1 wn, u1 wm, u1 cond)
#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 fst(u1 xt, u1 xn, s4 imm)
void ddiv(u1 dt, u1 dn, u1 dm)
#define emit_lsr_imm32(cd, Wd, Wn, shift)
#define emit_uxth(cd, Wd, Wn)
void dst(u1 xt, u1 xn, s4 imm)
#define emit_strb_imm(cd, Xt, Xn, imm)