26 #ifndef VM_JIT_AARCH64_EMIT_ASM_HPP_
27 #define VM_JIT_AARCH64_EMIT_ASM_HPP_
38 #define LSL(x,a) ((x) << a)
39 #define LSR(x,a) ((x) >> a)
47 #define INVERT(x) ((x) ^ 1)
73 |
LSL(imm, 5) | Rt | 0x34000000;
77 #define emit_cbnz(cd, Xt, imm) emit_cmp_branch_imm(cd, 1, 1, imm, Xt)
84 *((
u4 *) cd->
mcodeptr) =
LSL((imm19 & 0x7ffff), 5) | cond | 0x54000000;
88 #define emit_br_eq(cd, imm) emit_cond_branch_imm(cd, imm, COND_EQ)
89 #define emit_br_ne(cd, imm) emit_cond_branch_imm(cd, imm, COND_NE)
90 #define emit_br_cs(cd, imm) emit_cond_branch_imm(cd, imm, COND_CS)
91 #define emit_br_cc(cd, imm) emit_cond_branch_imm(cd, imm, COND_CC)
92 #define emit_br_mi(cd, imm) emit_cond_branch_imm(cd, imm, COND_MI)
93 #define emit_br_pl(cd, imm) emit_cond_branch_imm(cd, imm, COND_PL)
94 #define emit_br_vs(cd, imm) emit_cond_branch_imm(cd, imm, COND_VS)
95 #define emit_br_vc(cd, imm) emit_cond_branch_imm(cd, imm, COND_VC)
96 #define emit_br_hi(cd, imm) emit_cond_branch_imm(cd, imm, COND_HI)
97 #define emit_br_ls(cd, imm) emit_cond_branch_imm(cd, imm, COND_LS)
98 #define emit_br_ge(cd, imm) emit_cond_branch_imm(cd, imm, COND_GE)
99 #define emit_br_lt(cd, imm) emit_cond_branch_imm(cd, imm, COND_LT)
100 #define emit_br_gt(cd, imm) emit_cond_branch_imm(cd, imm, COND_GT)
101 #define emit_br_le(cd, imm) emit_cond_branch_imm(cd, imm, COND_LE)
109 *((
u4 *) cd->
mcodeptr) =
LSL(op, 31) | (imm26 & 0x3ffffff) | 0x14000000;
113 #define emit_br_imm(cd, imm) emit_unc_branch_imm(cd, 0, imm)
114 #define emit_blr_imm(cd, imm) emit_unc_branch_imm(cd, 1, imm)
122 |
LSL(Rn, 5) | op4 | 0xD6000000;
126 #define emit_ret(cd) emit_unc_branch_reg(cd, 2, 31, 0, 30, 0)
127 #define emit_blr_reg(cd, Xn) emit_unc_branch_reg(cd, 1, 31, 0, Xn, 0)
129 #define emit_br_reg(cd, Xn) emit_unc_branch_reg(cd, 0, 31, 0, Xn, 0)
136 assert(imm16 >= 0 && imm16 <= 65535);
138 |
LSL(imm16, 5) | Rd | 0x12800000;
142 #define emit_mov_imm(cd, Xd, imm) emit_mov_wide_imm(cd, 1, 2, 0, imm, Xd)
143 #define emit_mov_imm32(cd, Xd, imm) emit_mov_wide_imm(cd, 0, 2, 0, imm, Xd)
144 #define emit_movn_imm(cd, Xd, imm) emit_mov_wide_imm(cd, 1, 0, 0, imm, Xd)
145 #define emit_movn_imm32(cd, Xd, imm) emit_mov_wide_imm(cd, 0, 0, 0, imm, Xd)
146 #define emit_movk_imm(cd, Xd, imm, hw) emit_mov_wide_imm(cd, 1, 3, hw, imm, Xd)
147 #define emit_movk_imm32(cd, Xd, imm, hw) emit_mov_wide_imm(cd, 0, 3, hw, imm, Xd)
155 |
LSL(imm9 & 0x1ff, 12) |
LSL(Rn, 5) | Rt | 0x38400000;
165 |
LSL(Rm, 16) |
LSL(option, 13) |
LSL(S, 12)
166 |
LSL(Rn, 5) | Rt | 0x38200800;
170 #define emit_ldr_reg(cd, Xt, Xn, Xm) emit_ldstr_reg_reg(cd, 3, 0, 1, Xm, 3, 0, Xn, Xt)
177 u2 imm =
LSR(imm12, size);
180 |
LSL(imm, 10) |
LSL(Rn, 5) | Rt | 0x39000000;
190 u1 sz =
LSL(1, size);
193 if (imm >= 0 && imm <= 255 && (imm % sz == 0))
195 else if (imm >= -256 && imm <= 255)
197 else if (imm < 0 && (-imm) < 0xffff) {
204 assert(imm % sz == 0);
205 assert(imm / sz <= 0xfff);
210 #define emit_ldrh_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 1, 0, 1, imm, Xt, Xn)
211 #define emit_strh_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 1, 0, 0, imm, Xt, Xn)
213 #define emit_ldrb_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 0, 0, 1, imm, Xt, Xn)
214 #define emit_strb_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 0, 0, 0, imm, Xt, Xn)
216 #define emit_ldrsb_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 0, 0, 3, imm, Xt, Xn)
217 #define emit_ldrsh_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 1, 0, 3, imm, Xt, Xn)
219 #define emit_ldr_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 3, 0, 1, imm, Xt, Xn)
220 #define emit_str_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 3, 0, 0, imm, Xt, Xn)
222 #define emit_fp_ldr_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 3, 1, 1, imm, Xt, Xn)
223 #define emit_fp_str_imm(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 3, 1, 0, imm, Xt, Xn)
225 #define emit_ldr_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 2, 0, 1, imm, Xt, Xn)
226 #define emit_str_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 2, 0, 0, imm, Xt, Xn)
228 #define emit_fp_ldr_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 2, 1, 1, imm, Xt, Xn)
229 #define emit_fp_str_imm32(cd, Xt, Xn, imm) emit_ldstr_ambigous(cd, 2, 1, 0, imm, Xt, Xn)
236 assert(imm12 >= 0 && imm12 <= 0xfff);
238 |
LSL(shift, 22) |
LSL(imm12, 10) |
LSL(Rn, 5)
245 assert(imm >= 0 && imm <= 0xffffff);
247 u2 hi = (imm & 0xfff000) >> 12;
256 #define emit_add_imm(cd, Xd, Xn, imm) emit_addsub_imm(cd, 1, 0, Xd, Xn, imm)
257 #define emit_add_imm32(cd, Xd, Xn, imm) emit_addsub_imm(cd, 0, 0, Xd, Xn, imm)
259 #define emit_sub_imm(cd, Xd, Xn, imm) emit_addsub_imm(cd, 1, 1, Xd, Xn, imm)
260 #define emit_sub_imm32(cd, Xd, Xn, imm) emit_addsub_imm(cd, 0, 1, Xd, Xn, imm)
262 #define emit_subs_imm(cd, Xd, Xn, imm) emit_addsub_imm(cd, 1, 1, 1, 0, imm, Xn, Xd)
263 #define emit_subs_imm32(cd, Xd, Xn, imm) emit_addsub_imm(cd, 0, 1, 1, 0, imm, Xn, Xd)
265 #define emit_adds_imm(cd, Xd, Xn, imm) emit_addsub_imm(cd, 1, 0, 1, 0, imm, Xn, Xd)
266 #define emit_adds_imm32(cd, Xd, Xn, imm) emit_addsub_imm(cd, 0, 0, 1, 0, imm, Xn, Xd)
268 #define emit_mov_sp(cd, Xd, Xn) emit_add_imm(cd, Xd, Xn, 0)
270 #define emit_cmp_imm(cd, Xn, imm) emit_subs_imm(cd, 31, Xn, imm)
271 #define emit_cmp_imm32(cd, Xn, imm) emit_subs_imm32(cd, 31, Xn, imm)
273 #define emit_cmn_imm(cd, Xn, imm) emit_adds_imm(cd, 31, Xn, imm)
274 #define emit_cmn_imm32(cd, Wn, imm) emit_adds_imm32(cd, 31, Wn, imm)
281 assert(immr >= 0 && immr <= 0x3f);
282 assert(imms >= 0 && imms <= 0x3f);
284 |
LSL(immr, 16) |
LSL(imms, 10) |
LSL(Rn, 5)
289 #define emit_ubfm(cd, Xd, Xn, immr, imms) emit_bitfield(cd, 1, 2, 1, immr, imms, Xn, Xd)
290 #define emit_ubfm32(cd, Wd, Wn, immr, imms) emit_bitfield(cd, 0, 2, 0, immr, imms, Wn, Wd)
292 #define emit_lsl_imm(cd, Xd, Xn, shift) emit_ubfm(cd, Xd, Xn, ((u1)(-(shift))) % 64, 63 - (shift))
293 #define emit_lsl_imm32(cd, Wd, Wn, shift) emit_ubfm32(cd, Wd, Wn, ((u1)(-(shift))) % 32, 31 - (shift))
295 #define emit_lsr_imm(cd, Xd, Xn, shift) emit_ubfm(cd, Xd, Xn, shift, 63)
296 #define emit_lsr_imm32(cd, Wd, Wn, shift) emit_ubfm32(cd, Wd, Wn, shift, 31)
298 #define emit_uxtb(cd, Wd, Wn) emit_ubfm32(cd, Wd, Wn, 0, 7)
299 #define emit_uxth(cd, Wd, Wn) emit_ubfm32(cd, Wd, Wn, 0, 15)
301 #define emit_sbfm(cd, Xd, Xn, immr, imms) emit_bitfield(cd, 1, 0, 1, immr, imms, Xn, Xd)
302 #define emit_sbfm32(cd, Wd, Wn, immr, imms) emit_bitfield(cd, 0, 0, 0, immr, imms, Wn, Wd)
304 #define emit_sxtb(cd, Wd, Wn) emit_sbfm32(cd, Wd, Wn, 0, 7)
305 #define emit_sxth(cd, Wd, Wn) emit_sbfm32(cd, Wd, Wn, 0, 15)
307 #define emit_asr_imm(cd, Xd, Xn, shift) emit_sbfm(cd, Xd, Xn, shift, 63)
308 #define emit_asr_imm32(cd, Wd, Wn, shift) emit_sbfm32(cd, Wd, Wn, shift, 31)
310 #define emit_sxtw(cd, Xd, Wn) emit_sbfm(cd, Xd, Wn, 0, 31)
318 os::abort(
"emit_logical_imm not supported atm.");
319 assert(imm >= 0 && imm <= 0xfff);
320 u1 immr = imm & 0x3f;
321 u1 imms = (imm >> 6) & 0x3f;
324 |
LSL(imms, 10) |
LSL(Rn, 5) | Rd | 0x12000000;
328 #define emit_and_imm(cd, Xd, Xn, imm) emit_logical_imm(cd, 1, 0, imm, Xn, Xd)
329 #define emit_and_imm32(cd, Wd, Wn, imm) emit_logical_imm(cd, 0, 0, imm, Wn, Wd)
341 #define emit_adr(cd, Xd, immhi) emit_pcrel(cd, 0, 0, immhi, Xd)
347 assert(imm6 >= 0 && imm6 <= 0x3f);
349 |
LSL(shift, 22) |
LSL(Rm, 16) |
LSL(imm6, 10)
350 |
LSL(Rn, 5) | Rd | 0xB000000;
354 #define emit_add_reg(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 1, 0, 0, 0, Xm, 0, Xn, Xd)
355 #define emit_sub_reg(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 1, 1, 0, 0, Xm, 0, Xn, Xd)
357 #define emit_subs_reg(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 1, 1, 1, 0, Xm, 0, Xn, Xd)
358 #define emit_subs_reg32(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 0, 1, 1, 0, Xm, 0, Xn, Xd)
360 #define emit_cmp_reg(cd, Xn, Xm) emit_subs_reg(cd, 31, Xn, Xm)
361 #define emit_cmp_reg32(cd, Xn, Xm) emit_subs_reg32(cd, 31, Xn, Xm)
363 #define emit_add_reg_shift(cd, Xd, Xn, Xm, s, a) emit_addsub_reg(cd, 1, 0, 0, s, Xm, a, Xn, Xd)
364 #define emit_sub_reg_shift(cd, Xd, Xn, Xm, s, a) emit_addsub_reg(cd, 1, 1, 0, s, Xm, a, Xn, Xd)
366 #define emit_add_reg32(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 0, 0, 0, 0, Xm, 0, Xn, Xd)
367 #define emit_sub_reg32(cd, Xd, Xn, Xm) emit_addsub_reg(cd, 0, 1, 0, 0, Xm, 0, Xn, Xd)
386 |
LSL(Rm, 16) |
LSL(cond, 12) |
LSL(op2, 10) |
LSL(Rn, 5)
391 #define emit_csel(cd, Xd, Xn, Xm, cond) emit_cond_select(cd, 1, 0, 0, Xm, cond, 0, Xn, Xd)
392 #define emit_csel32(cd, Xd, Xn, Xm, cond) emit_cond_select(cd, 0, 0, 0, Xm, cond, 0, Xn, Xd)
393 #define emit_csinc(cd, Xd, Xn, Xm, cond) emit_cond_select(cd, 1, 0, 0, Xm, cond, 1, Xn, Xd)
394 #define emit_cset(cd, Xd, cond) emit_csinc(cd, Xd, 31, 31, INVERT(cond))
396 #define emit_csinv(cd, Xd, Xn, Xm, cond) emit_cond_select(cd, 1, 1, 0, Xm, cond, 0, Xn, Xd)
397 #define emit_csetm(cd, Xd, cond) emit_csinv(cd, Xd, 31, 31, INVERT(cond))
399 #define emit_csneg32(cd, Wd, Wn, Wm, cond) emit_cond_select(cd, 0, 1, 0, Wm, cond, 1, Wn, Wd)
406 |
LSL(opc, 10) |
LSL(Rn, 5) | Rd
411 #define emit_sdiv(cd, Xd, Xn, Xm) emit_dp2(cd, 1, 0, Xm, 3, Xn, Xd)
412 #define emit_sdiv32(cd, Wd, Wn, Wm) emit_dp2(cd, 0, 0, Wm, 3, Wn, Wd)
414 #define emit_asr(cd, Xd, Xn, Xm) emit_dp2(cd, 1, 0, Xm, 10, Xn, Xd)
415 #define emit_asr32(cd, Wd, Wn, Wm) emit_dp2(cd, 0, 0, Wm, 10, Wn, Wd)
417 #define emit_lsl(cd, Xd, Xn, Xm) emit_dp2(cd, 1, 0, Xm, 8, Xn, Xd)
418 #define emit_lsl32(cd, Wd, Wn, Wm) emit_dp2(cd, 0, 0, Wm, 8, Wn, Wd)
420 #define emit_lsr(cd, Xd, Xn, Xm) emit_dp2(cd, 1, 0, Xm, 9, Xn, Xd)
421 #define emit_lsr32(cd, Wd, Wn, Wm) emit_dp2(cd, 0, 0, Wm, 9, Wn, Wd)
433 #define emit_madd(cd, Xd, Xn, Xm, Xa) emit_dp3(cd, 1, 0, Xm, 0, Xa, Xn, Xd)
434 #define emit_madd32(cd, Xd, Xn, Xm, Xa) emit_dp3(cd, 0, 0, Xm, 0, Xa, Xn, Xd)
436 #define emit_msub(cd, Xd, Xn, Xm, Xa) emit_dp3(cd, 1, 0, Xm, 1, Xa, Xn, Xd)
437 #define emit_msub32(cd, Xd, Xn, Xm, Xa) emit_dp3(cd, 0, 0, Xm, 1, Xa, Xn, Xd)
439 #define emit_mul(cd, Xd, Xn, Xm) emit_madd(cd, Xd, Xn, Xm, 31)
440 #define emit_mul32(cd, Xd, Xn, Xm) emit_madd32(cd, Xd, Xn, Xm, 31)
447 assert(imm6 >= 0 && imm6 <= 0x3f);
454 #define emit_orr_sreg(cd, Xd, Xn, Xm) emit_logical_sreg(cd, 1, 1, 0, 0, Xm, 0, Xn, Xd)
455 #define emit_orr_sreg32(cd, Wd, Wn, Wm) emit_logical_sreg(cd, 0, 1, 0, 0, Wm, 0, Wn, Wd)
457 #define emit_ands_sreg(cd, Xd, Xn, Xm) emit_logical_sreg(cd, 1, 3, 0, 0, Xm, 0, Xn, Xd)
458 #define emit_ands_sreg32(cd, Wd, Wn, Wm) emit_logical_sreg(cd, 0, 3, 0, 0, Wm, 0, Wn, Wd)
460 #define emit_and_sreg(cd, Xd, Xn, Xm) emit_logical_sreg(cd, 1, 0, 0, 0, Xm, 0, Xn, Xd)
461 #define emit_and_sreg32(cd, Wd, Wn, Wm) emit_logical_sreg(cd, 0, 0, 0, 0, Wm, 0, Wn, Wd)
463 #define emit_eor_sreg(cd, Xd, Xn, Xm) emit_logical_sreg(cd, 1, 2, 0, 0, Xm, 0, Xn, Xd)
464 #define emit_eor_sreg32(cd, Wd, Wn, Wm) emit_logical_sreg(cd, 0, 2, 0, 0, Wm, 0, Wn, Wd)
466 #define emit_mov_reg(cd, Xd, Xm) emit_orr_sreg(cd, Xd, 31, Xm)
467 #define emit_mov_reg32(cd, Wd, Wm) emit_orr_sreg32(cd, Wd, 31, Wm)
469 #define emit_tst_sreg(cd, Xn, Xm) emit_ands_sreg(cd, 31, Xn, Xm)
470 #define emit_tst_sreg32(cd, Wn, Wm) emit_ands_sreg32(cd, 31, Wn, Wm)
472 #define emit_clr(cd, Xd) emit_eor_sreg(cd, Xd, Xd, Xd)
475 if (Xd == 31 || Xm == 31)
487 |
LSL(opc, 3) | 0x1E202000;
497 |
LSL(opc, 15) |
LSL(Rn, 5)
502 #define emit_fmovs(cd, Sd, Sn) emit_fp_dp1(cd, 0, 0, 0, 0, Sn, Sd)
503 #define emit_fmovd(cd, Dd, Dn) emit_fp_dp1(cd, 0, 0, 1, 0, Dn, Dd)
505 #define emit_fnegs(cd, Sd, Sn) emit_fp_dp1(cd, 0, 0, 0, 2, Sn, Sd)
506 #define emit_fnegd(cd, Dd, Dn) emit_fp_dp1(cd, 0, 0, 1, 2, Dn, Dd)
513 |
LSL(Rm, 16) |
LSL(opc, 12) |
LSL(Rn, 5)
518 #define emit_fmuls(cd, Sd, Sn, Sm) emit_fp_dp2(cd, 0, 0, 0, Sm, 0, Sn, Sd)
519 #define emit_fmuld(cd, Dd, Dn, Dm) emit_fp_dp2(cd, 0, 0, 1, Dm, 0, Dn, Dd)
521 #define emit_fdivs(cd, Sd, Sn, Sm) emit_fp_dp2(cd, 0, 0, 0, Sm, 1, Sn, Sd)
522 #define emit_fdivd(cd, Dd, Dn, Dm) emit_fp_dp2(cd, 0, 0, 1, Dm, 1, Dn, Dd)
524 #define emit_fadds(cd, Sd, Sn, Sm) emit_fp_dp2(cd, 0, 0, 0, Sm, 2, Sn, Sd)
525 #define emit_faddd(cd, Dd, Dn, Dm) emit_fp_dp2(cd, 0, 0, 1, Dm, 2, Dn, Dd)
527 #define emit_fsubs(cd, Sd, Sn, Sm) emit_fp_dp2(cd, 0, 0, 0, Sm, 3, Sn, Sd)
528 #define emit_fsubd(cd, Dd, Dn, Dm) emit_fp_dp2(cd, 0, 0, 1, Dm, 3, Dn, Dd)
546 |
LSL(rmode, 19) |
LSL(opc, 16) |
LSL(Rn, 5)
551 #define emit_scvtf(cd, sf, type, Rn, Rd) emit_conversion_fp(cd, sf, 0, type, 0, 2, Rn, Rd)
552 #define emit_fcvtzs(cd, sf, type, Rn, Rd) emit_conversion_fp(cd, sf, 0, type, 3, 0, Rn, Rd)
565 *((
u4 *) cd->
mcodeptr) = Xd |
LSL(type & 0xff, 8) | 0xE7000000;
574 *((
u4 *) cd->
mcodeptr) =
LSL(option & 0xf, 8) |
LSL(opc & 0x3, 5) | 0xD503309F;
578 #define emit_dmb(cd, option) emit_sync(cd, option, 1);
579 #define emit_dsb(cd, option) emit_sync(cd, option, 0);
590 #endif // VM_JIT_AARCH64_EMIT_ASM_HPP_
void emit_dp2(codegendata *cd, u1 sf, u1 S, u1 Rm, u1 opc, u1 Rn, u1 Rd)
void emit_fp_cmp(codegendata *cd, u1 type, u1 Rm, u1 Rn, u1 opc)
#define emit_movn_imm(cd, Xd, imm)
void emit_unc_branch_reg(codegendata *cd, u1 opc, u1 op2, u1 op3, u1 Rn, u1 op4)
void emit_addsub_imm(codegendata *cd, u1 sf, u1 op, u1 S, u1 shift, u2 imm12, u1 Rn, u1 Rd)
void emit_lda(codegendata *cd, u1 Xd, u1 Xn, s4 imm)
void emit_sync(codegendata *cd, u1 option, u1 opc)
void emit_fcvt(codegendata *cd, u1 type, u1 opc, u1 Rn, u1 Rd)
JNIEnv jthread jobject jclass jlong size
void emit_mov(codegendata *cd, u1 Xd, u1 Xm)
void emit_fp_dp2(codegendata *cd, u1 M, u1 S, u1 type, u1 Rm, u1 opc, u1 Rn, u1 Rd)
void emit_ldstr_reg_reg(codegendata *cd, u1 size, u1 v, u1 opc, u1 Rm, u1 option, u1 S, u1 Rn, u1 Rt)
void emit_unc_branch_imm(codegendata *cd, u1 op, s4 imm26)
void emit_addsub_reg(codegendata *cd, u1 sf, u1 op, u1 S, u1 shift, u1 Rm, u1 imm6, u1 Rn, u1 Rd)
#define emit_add_imm(cd, Xd, Xn, imm)
#define emit_sub_imm(cd, Xd, Xn, imm)
void emit_mov_wide_imm(codegendata *cd, u1 sf, u1 opc, u1 hw, u2 imm16, u1 Rd)
void emit_trap(codegendata *cd, u1 Xd, int type)
void emit_logical_imm(codegendata *cd, u1 sf, u1 opc, u2 imm, u1 Rn, u1 Rd)
void emit_ldstr_reg_usc(codegendata *cd, u1 size, u1 v, u1 opc, s2 imm9, u1 Rt, u1 Rn)
void emit_conversion_fp(codegendata *cd, u1 sf, u1 S, u1 type, u1 rmode, u1 opc, u1 Rn, u1 Rd)
void emit_bitfield(codegendata *cd, u1 sf, u1 opc, u1 N, u1 immr, u1 imms, u1 Rn, u1 Rd)
void emit_ldstr_ambigous(codegendata *cd, u1 size, u1 v, u1 opc, s2 imm, u1 Rt, u1 Rn)
void emit_cond_select(codegendata *cd, u1 sf, u1 op, u1 S, u1 Rm, u1 cond, u1 op2, u1 Rn, u1 Rd)
void emit_logical_sreg(codegendata *cd, u1 sf, u1 opc, u1 shift, u1 N, u1 Rm, u1 imm6, u1 Rn, u1 Rd)
void emit_fp_dp1(codegendata *cd, u1 M, u1 S, u1 type, u1 opc, u1 Rn, u1 Rd)
void emit_nop(codegendata *cd)
void emit_dp3(codegendata *cd, u1 sf, u1 op31, u1 Rm, u1 o0, u1 Ra, u1 Rn, u1 Rd)
#define emit_mov_sp(cd, Xd, Xn)
void emit_cond_branch_imm(codegendata *cd, s4 imm19, u1 cond)
void emit_ldstr_reg_us(codegendata *cd, u1 size, u1 v, u1 opc, u2 imm12, u1 Rt, u1 Rn)
void emit_cmp_branch_imm(codegendata *cd, u1 sf, u1 op, s4 imm, u1 Rt)
#define emit_mov_reg(cd, Xd, Xm)
void emit_pcrel(codegendata *cd, u1 op, u1 immlo, u4 immhi, u1 Rd)