CACAO
codegen.hpp
Go to the documentation of this file.
1 /* src/vm/jit/aarch64/codegen.hpp - code generation macros and definitions for Aarch64
2 
3  Copyright (C) 1996-2013
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5  Copyright (C) 2008 Theobroma Systems Ltd.
6 
7  This file is part of CACAO.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2, or (at
12  your option) any later version.
13 
14  This program is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  02110-1301, USA.
23 
24 */
25 
26 
27 #ifndef CODEGEN_HPP_
28 #define CODEGEN_HPP_ 1
29 
30 #include "config.h"
31 #include "emit-asm.hpp"
32 #include "vm/types.hpp"
33 
34 #include "vm/jit/jit.hpp"
35 #include "vm/jit/dseg.hpp"
36 
37 
38 /* additional functions and macros to generate code ***************************/
39 
40 #define MCODECHECK(icnt) \
41  do { \
42  if ((cd->mcodeptr + (icnt) * 4) > cd->mcodeend) \
43  codegen_increase(cd); \
44  } while (0)
45 
46 
47 #define ALIGNCODENOP \
48  if ((s4) ((ptrint) cd->mcodeptr & 7)) { \
49  M_NOP; \
50  }
51 
52 
53 #define ICONST(d,c) emit_iconst(cd, (d), (c))
54 #define LCONST(d,c) emit_lconst(cd, (d), (c))
55 
56 #define SHIFT(x,s) ((x) << s)
57 
58 /* branch defines *************************************************************/
59 
60 #define BRANCH_NOPS \
61  do { \
62  M_NOP; \
63  } while (0)
64 
65 
66 /* patcher defines ************************************************************/
67 
68 #define PATCHER_CALL_SIZE 1 * 4 /* an instruction is 4-bytes long */
69 
70 #define PATCHER_NOPS \
71  do { \
72  M_NOP; \
73  } while (0)
74 
75 
76 /* AsmEmitter ******************************************************************
77  *
78  * Small wrapper around codegendata.
79  *
80  * Prefix indicate whether the instruction operates on the first 32-bit (i)
81  * or on the whole register (l). Same goes for FP operations.
82  *
83  * Provides also some convinient methods, mainly 'lda', 'iconst' and 'lconst'
84  *
85  ******************************************************************************/
86 
87 class AsmEmitter {
88 
89  public:
90  explicit AsmEmitter(codegendata *cd) : cd(cd) {}
91 
92  void imov(u1 wd, u1 wn) { emit_mov_reg32(cd, wd, wn); }
93  void mov(u1 xt, u1 xn) { emit_mov(cd, xt, xn); }
94 
95  void icmp_imm(u1 wd, u2 imm) { emit_cmp_imm32(cd, wd, imm); }
96  void lcmp_imm(u1 xd, u2 imm) { emit_cmp_imm(cd, xd, imm); }
97  void icmn_imm(u1 wd, u2 imm) { emit_cmn_imm32(cd, wd, imm); }
98  void lcmn_imm(u1 xd, u2 imm) { emit_cmn_imm(cd, xd, imm); }
99 
100  void icmp(u1 wn, u1 wm) { emit_cmp_reg32(cd, wn, wm); }
101  void lcmp(u1 xn, u1 xm) { emit_cmp_reg(cd, xn, xm); }
102  void acmp(u1 xn, u1 xm) { emit_cmp_reg(cd, xn, xm); }
103 
104  void nop() { emit_nop(cd); }
105 
106  /* Load / store ********************************************************/
107  void ild(u1 xt, u1 xn, s4 imm) { emit_ldr_imm32(cd, xt, xn, imm); }
108  void lld(u1 xt, u1 xn, s4 imm) { emit_ldr_imm(cd, xt, xn, imm); }
109  void ald(u1 xt, u1 xn, s4 imm) { emit_ldr_imm(cd, xt, xn, imm); }
110 
111  void fld(u1 xt, u1 xn, s4 imm) { emit_fp_ldr_imm32(cd, xt, xn, imm); }
112  void dld(u1 xt, u1 xn, s4 imm) { emit_fp_ldr_imm(cd, xt, xn, imm); }
113 
114  void ldrh(u1 wt, u1 xn, s4 imm) { emit_ldrh_imm(cd, wt, xn, imm); }
115  void ldrb(u1 wt, u1 xn, s4 imm) { emit_ldrb_imm(cd, wt, xn, imm); }
116 
117  void ldrsb32(u1 wt, u1 xn, s4 imm) { emit_ldrsb_imm32(cd, wt, xn, imm); }
118  void ldrsh32(u1 wt, u1 xn, s4 imm) { emit_ldrsh_imm32(cd, wt, xn, imm); }
119 
120  void ist(u1 xt, u1 xn, s4 imm) { emit_str_imm32(cd, xt, xn, imm); }
121  void lst(u1 xt, u1 xn, s4 imm) { emit_str_imm(cd, xt, xn, imm); }
122  void ast(u1 xt, u1 xn, s4 imm) { emit_str_imm(cd, xt, xn, imm); }
123 
124  void fst(u1 xt, u1 xn, s4 imm) { emit_fp_str_imm32(cd, xt, xn, imm); }
125  void dst(u1 xt, u1 xn, s4 imm) { emit_fp_str_imm(cd, xt, xn, imm); }
126 
127  void strh(u1 wt, u1 xn, s4 imm) { emit_strh_imm(cd, wt, xn, imm); }
128  void strb(u1 wt, u1 xn, s4 imm) { emit_strb_imm(cd, wt, xn, imm); }
129 
130  /* Load / store exclusive */
131 
132  void ildxr(u1 wt, u1 xn) { emit_ldxr32(cd, wt, xn); }
133  void istxr(u1 ws, u1 wt, u1 xn) { emit_stxr32(cd, ws, wt, xn); }
134 
135  void iconst(u1 xt, s4 value) {
136  // For small negative immediates, use MOVN
137  if (value < 0 && -value-1 < 0xffff) {
138  emit_movn_imm32(cd, xt, -value - 1);
139  return;
140  }
141 
142  emit_mov_imm32(cd, xt, value & 0xffff);
143 
144  u4 v = (u4) value;
145  if (v > 0xffff) {
146  u2 imm = (value >> 16) & 0xffff;
147  emit_movk_imm32(cd, xt, imm, 1);
148  }
149  }
150 
151  void lconst(u1 xt, s8 value) {
152  // For small negative immediates, use MOVN
153  if (value < 0 && -value-1 < 0xffff) {
154  emit_movn_imm(cd, xt, -value - 1);
155  return;
156  }
157 
158  emit_mov_imm(cd, xt, value & 0xffff);
159 
160  u8 v = (u8) value;
161  if (v > 0xffff) {
162  u2 imm = (value >> 16) & 0xffff;
163  emit_movk_imm(cd, xt, imm, 1);
164  }
165 
166  if (v > 0xffffffff) {
167  u2 imm = (value >> 32) & 0xffff;
168  emit_movk_imm(cd, xt, imm, 2);
169  }
170 
171  if (v > 0xffffffffffff) {
172  u2 imm = (value >> 48) & 0xffff;
173  emit_movk_imm(cd, xt, imm, 3);
174  }
175  }
176 
177  void lda(u1 xd, u1 xn, s4 imm) { emit_lda(xd, xn, imm); }
178 
179  void adr(u1 xd, s4 imm) { emit_adr(cd, xd, imm); }
180 
181  /* Branch *************************************************************/
182  void b(s4 imm) { emit_br_imm(cd, imm); }
183  void b_eq(s4 imm) { emit_br_eq(cd, imm); }
184  void b_ne(s4 imm) { emit_br_ne(cd, imm); }
185  void b_cs(s4 imm) { emit_br_cs(cd, imm); }
186  void b_cc(s4 imm) { emit_br_cc(cd, imm); }
187  void b_mi(s4 imm) { emit_br_mi(cd, imm); }
188  void b_pl(s4 imm) { emit_br_pl(cd, imm); }
189  void b_vs(s4 imm) { emit_br_vs(cd, imm); }
190  void b_vc(s4 imm) { emit_br_vc(cd, imm); }
191  void b_hi(s4 imm) { emit_br_hi(cd, imm); }
192  void b_ls(s4 imm) { emit_br_ls(cd, imm); }
193  void b_ge(s4 imm) { emit_br_ge(cd, imm); }
194  void b_lt(s4 imm) { emit_br_lt(cd, imm); }
195  void b_gt(s4 imm) { emit_br_gt(cd, imm); }
196  void b_le(s4 imm) { emit_br_le(cd, imm); }
197 
198  void blr(u1 xn) { emit_blr_reg(cd, xn); }
199  void br(u1 xn) { emit_br_reg(cd, xn); }
200  void ret() { emit_ret(cd); }
201 
202  void cbnz(u1 xn, s4 imm) { emit_cbnz(cd, xn, imm); }
203  void icbnz(u1 wn, s4 imm) { emit_cbnz32(cd, wn, imm); }
204 
205  /* Integer arithemtic *************************************************/
206  void iadd_imm(u1 xd, u1 xn, u4 imm) { emit_add_imm32(cd, xd, xn, imm); }
207  void ladd_imm(u1 xd, u1 xn, u4 imm) { emit_add_imm(cd, xd, xn, imm); }
208 
209  void iadd(u1 xd, u1 xn, u1 xm) { emit_add_reg32(cd, xd, xn, xm); }
210  void ladd(u1 xd, u1 xn, u1 xm) { emit_add_reg(cd, xd, xn, xm); }
211 
212  /** Xd = Xn + shift(Xm, amount); */
213  void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount) {
214  emit_add_reg_shift(cd, xd, xn, xm, shift, amount);
215  }
216 
217  void isub_imm(u1 xd, u1 xn, u4 imm) { emit_sub_imm32(cd, xd, xn, imm); }
218  void lsub_imm(u1 xd, u1 xn, u4 imm) { emit_sub_imm(cd, xd, xn, imm); }
219 
220  void isub(u1 xd, u1 xn, u1 xm) { emit_sub_reg32(cd, xd, xn, xm); }
221  void lsub(u1 xd, u1 xn, u1 xm) { emit_sub_reg(cd, xd, xn, xm); }
222 
223  /* wd = wn / wm */
224  void idiv(u1 wd, u1 wn, u1 wm) { emit_sdiv32(cd, wd, wn, wm); }
225  void ldiv(u1 xd, u1 xn, u1 xm) { emit_sdiv(cd, xd, xn, xm); }
226 
227  void imul(u1 wd, u1 wn, u1 wm) { emit_mul32(cd, wd, wn, wm); }
228  void lmul(u1 xd, u1 xn, u1 xm) { emit_mul(cd, xd, xn, xm); }
229 
230  /* wd = wa - wn * wm */
231  void imsub(u1 wd, u1 wn, u1 wm, u1 wa) { emit_msub32(cd, wd, wn, wm, wa); }
232  void lmsub(u1 xd, u1 xn, u1 xm, u1 xa) { emit_msub(cd, xd, xn, xm, xa); }
233 
234  /* wd = lsl(wn, shift) */
235  void ilsl_imm(u1 wd, u1 wn, u1 shift) { emit_lsl_imm32(cd, wd, wn, shift); }
236  void llsl_imm(u1 xd, u1 xn, u1 shift) { emit_lsl_imm(cd, xd, xn, shift); }
237 
238  void ilsr_imm(u1 wd, u1 wn, u1 shift) { emit_lsr_imm32(cd, wd, wn, shift); }
239  void llsr_imm(u1 xd, u1 xn, u1 shift) { emit_lsr_imm(cd, xd, xn, shift); }
240 
241  void iasr_imm(u1 wd, u1 wn, u1 shift) { emit_asr_imm32(cd, wd, wn, shift); }
242  void lasr_imm(u1 xd, u1 xn, u1 shift) { emit_asr_imm(cd, xd, xn, shift); }
243 
244  void iasr(u1 wd, u1 wn, u1 wm) { emit_asr32(cd, wd, wn, wm); }
245  void lasr(u1 xd, u1 xn, u1 xm) { emit_asr(cd, xd, xn, xm); }
246 
247  void ilsr(u1 wd, u1 wn, u1 wm) { emit_lsr32(cd, wd, wn, wm); }
248  void llsr(u1 xd, u1 xn, u1 xm) { emit_lsr(cd, xd, xn, xm); }
249 
250  void ilsl(u1 wd, u1 wn, u1 wm) { emit_lsl32(cd, wd, wn, wm); }
251  void llsl(u1 xd, u1 xn, u1 xm) { emit_lsl(cd, xd, xn, xm); }
252 
253  void uxtb(u1 wd, u1 wn) { emit_uxtb(cd, wd, wn); }
254  void uxth(u1 wd, u1 wn) { emit_uxth(cd, wd, wn); }
255  void sxtb(u1 wd, u1 wn) { emit_sxtb(cd, wd, wn); }
256  void sxth(u1 wd, u1 wn) { emit_sxth(cd, wd, wn); }
257  void sxtw(u1 xd, u1 wn) { emit_sxtw(cd, xd, wn); }
258  void ubfx(u1 wd, u1 xn) { emit_ubfm32(cd, wd, xn, 0, 31); }
259 
260  void ltst(u1 xn, u1 xm) { emit_tst_sreg(cd, xn, xm); }
261  void itst(u1 wn, u1 wm) { emit_tst_sreg32(cd, wn, wm); }
262 
263  // TODO: implement these correctly
264  // void iand_imm(u1 wd, u1 wn, u2 imm) { emit_and_imm32(cd, wd, wn, imm); }
265  // void land_imm(u1 xd, u1 xn, u2 imm) { emit_and_imm(cd, xd, xn, imm); }
266 
267  void iand(u1 wd, u1 wn, u1 wm) { emit_and_sreg32(cd, wd, wn, wm); }
268  void land(u1 xd, u1 xn, u1 xm) { emit_and_sreg(cd, xd, xn, xm); }
269 
270  void ior(u1 wd, u1 wn, u1 wm) { emit_orr_sreg32(cd, wd, wn, wm); }
271  void lor(u1 xd, u1 xn, u1 xm) { emit_orr_sreg(cd, xd, xn, xm); }
272 
273  void ixor(u1 wd, u1 wn, u1 wm) { emit_eor_sreg32(cd, wd, wn, wm); }
274  void lxor(u1 xd, u1 xn, u1 xm) { emit_eor_sreg(cd, xd, xn, xm); }
275 
276  void clr(u1 xd) { lxor(xd, xd, xd); }
277 
278  /* xt = if cond then xn else xm */
279  void csel(u1 xt, u1 xn, u1 xm, u1 cond) { emit_csel(cd, xt, xn, xm, cond); }
280  void icsel(u1 wt, u1 wn, u1 wm, u1 cond) { emit_csel32(cd, wt, wn, wm, cond); }
281 
282  void cset(u1 xt, u1 cond) { emit_cset(cd, xt, cond); } /* Xd = if cond then 1 else 0 */
283  void csetm(u1 xt, u1 cond) { emit_csetm(cd, xt, cond); } /* Xd = if cond then -1 else 0 */
284 
285  /* xt = if cond then xn else -xm */
286  void icsneg(u1 wd, u1 wn, u1 wm, u1 cond) { emit_csneg32(cd, wd, wn, wm, cond); }
287 
288  /* Floating point *****************************************************/
289 
290  void fmov(u1 sd, u1 sn) { emit_fmovs(cd, sd, sn); }
291  void dmov(u1 dd, u1 dn) { emit_fmovd(cd, dd, dn); }
292 
293  void fneg(u1 sd, u1 sn) { emit_fnegs(cd, sd, sn); }
294  void dneg(u1 dd, u1 dn) { emit_fnegd(cd, dd, dn); }
295 
296  void fcmp(u1 sn, u1 sm) { emit_fp_cmp(cd, 0, sm, sn, 0); }
297  void fcmp(u1 sn) { emit_fp_cmp(cd, 0, 0, sn, 1); } /* fcmp Sn, #0.0 */
298  void dcmp(u1 xn, u1 xm) { emit_fp_cmp(cd, 1, xm, xn, 0); }
299 
300  void fmul(u1 st, u1 sn, u1 sm) { emit_fmuls(cd, st, sn, sm); }
301  void dmul(u1 dt, u1 dn, u1 dm) { emit_fmuld(cd, dt, dn, dm); }
302 
303  void fdiv(u1 st, u1 sn, u1 sm) { emit_fdivs(cd, st, sn, sm); }
304  void ddiv(u1 dt, u1 dn, u1 dm) { emit_fdivd(cd, dt, dn, dm); }
305 
306  void fadd(u1 st, u1 sn, u1 sm) { emit_fadds(cd, st, sn, sm); }
307  void dadd(u1 dt, u1 dn, u1 dm) { emit_faddd(cd, dt, dn, dm); }
308 
309  void fsub(u1 st, u1 sn, u1 sm) { emit_fsubs(cd, st, sn, sm); }
310  void dsub(u1 dt, u1 dn, u1 dm) { emit_fsubd(cd, dt, dn, dm); }
311 
312  void i2f(u1 st, u1 wn) { emit_scvtf(cd, 0, 0, wn, st); }
313  void l2f(u1 st, u1 xn) { emit_scvtf(cd, 1, 0, xn, st); }
314  void i2d(u1 dt, u1 wn) { emit_scvtf(cd, 0, 1, wn, dt); }
315  void l2d(u1 dt, u1 xn) { emit_scvtf(cd, 1, 1, xn, dt); }
316 
317  void f2i(u1 wd, u1 sn) { emit_fcvtzs(cd, 0, 0, sn, wd); }
318  void f2l(u1 xd, u1 sn) { emit_fcvtzs(cd, 1, 0, sn, xd); }
319  void d2i(u1 wd, u1 dn) { emit_fcvtzs(cd, 0, 1, dn, wd); }
320  void d2l(u1 xd, u1 dn) { emit_fcvtzs(cd, 1, 1, dn, xd); }
321 
322  void f2d(u1 dd, u1 sn) { emit_fcvt(cd, 0, 1, sn, dd); }
323  void d2f(u1 sd, u1 dn) { emit_fcvt(cd, 1, 0, dn, sd); }
324 
325  void dmb() { emit_dmb(cd, 0xf); }
326  void dsb() { emit_dsb(cd, 0xf); }
327  void dmb(u1 option) { emit_dmb(cd, option); }
328  void dsb(u1 option) { emit_dsb(cd, option); }
329 
330  private:
332 
333  void emit_lda(u1 xd, u1 xn, s4 imm) {
334  if (imm >= 0)
335  emit_add_imm(cd, xd, xn, imm);
336  else
337  emit_sub_imm(cd, xd, xn, -imm);
338  }
339 };
340 
341 
342 /* compatiblity macros ********************************************************/
343 
344 #define M_NOP emit_nop(cd)
345 
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)
349 
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)
354 
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)
358 
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)
361 
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)
364 
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)
368 
369 #endif // CODEGEN_HPP_
370 
371 
372 /*
373  * These are local overrides for various environment variables in Emacs.
374  * Please do not remove this and leave it at the end of the file, where
375  * Emacs will automagically detect them.
376  * ---------------------------------------------------------------------
377  * Local variables:
378  * mode: c++
379  * indent-tabs-mode: t
380  * c-basic-offset: 4
381  * tab-width: 4
382  * End:
383  * vim:noexpandtab:sw=4:ts=4:
384  */
void ladd(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:210
void strh(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:127
void fcmp(u1 sn)
Definition: codegen.hpp:297
#define emit_fp_str_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:242
void f2d(u1 dd, u1 sn)
Definition: codegen.hpp:322
void fdiv(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:303
#define emit_br_gt(cd, imm)
Definition: emit-asm.hpp:102
#define emit_fsubs(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:546
void lmsub(u1 xd, u1 xn, u1 xm, u1 xa)
Definition: codegen.hpp:232
#define emit_fmuls(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:537
#define emit_eor_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:482
#define emit_fmuld(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:538
#define emit_blr_reg(cd, Xn)
Definition: emit-asm.hpp:129
void lcmp_imm(u1 xd, u2 imm)
Definition: codegen.hpp:96
#define emit_fp_str_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:248
void icmp(u1 wn, u1 wm)
Definition: codegen.hpp:100
void icbnz(u1 wn, s4 imm)
Definition: codegen.hpp:203
void llsl_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:236
#define emit_mul(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:458
void i2d(u1 dt, u1 wn)
Definition: codegen.hpp:314
void emit_fp_cmp(codegendata *cd, u1 type, u1 Rm, u1 Rn, u1 opc)
Definition: emit-asm.hpp:503
void acmp(u1 xn, u1 xm)
Definition: codegen.hpp:102
void ast(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:122
void fmov(u1 sd, u1 sn)
Definition: codegen.hpp:290
void uxth(u1 wd, u1 wn)
Definition: codegen.hpp:254
#define emit_br_hi(cd, imm)
Definition: emit-asm.hpp:98
#define emit_movn_imm(cd, Xd, imm)
Definition: emit-asm.hpp:146
void fneg(u1 sd, u1 sn)
Definition: codegen.hpp:293
void land(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:268
#define emit_cset(cd, Xd, cond)
Definition: emit-asm.hpp:413
void strb(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:128
void ior(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:270
#define emit_stxr32(cd, Ws, Wt, Xn)
Definition: emit-asm.hpp:163
#define emit_lsr(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:439
void llsl(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:251
#define emit_csneg32(cd, Wd, Wn, Wm, cond)
Definition: emit-asm.hpp:418
#define emit_br_reg(cd, Xn)
Definition: emit-asm.hpp:131
void csel(u1 xt, u1 xn, u1 xm, u1 cond)
Definition: codegen.hpp:279
void ilsl(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:250
#define emit_tst_sreg(cd, Xn, Xm)
Definition: emit-asm.hpp:488
#define emit_movk_imm(cd, Xd, imm, hw)
Definition: emit-asm.hpp:148
#define emit_cmn_imm32(cd, Wn, imm)
Definition: emit-asm.hpp:293
#define emit_br_eq(cd, imm)
Definition: emit-asm.hpp:90
#define emit_lsl_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:311
void lxor(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:274
void lcmn_imm(u1 xd, u2 imm)
Definition: codegen.hpp:98
#define emit_fsubd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:547
void lconst(u1 xt, s8 value)
Definition: codegen.hpp:151
#define emit_fnegd(cd, Dd, Dn)
Definition: emit-asm.hpp:525
void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount)
Xd = Xn + shift(Xm, amount);.
Definition: codegen.hpp:213
void dmb()
Definition: codegen.hpp:325
#define emit_mov_imm32(cd, Xd, imm)
Definition: emit-asm.hpp:145
void lmul(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:228
void b(s4 imm)
Definition: codegen.hpp:182
void icmp_imm(u1 wd, u2 imm)
Definition: codegen.hpp:95
void ixor(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:273
void idiv(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:224
#define emit_add_reg_shift(cd, Xd, Xn, Xm, s, a)
Definition: emit-asm.hpp:382
#define emit_sxtw(cd, Xd, Wn)
Definition: emit-asm.hpp:329
void b_eq(s4 imm)
Definition: codegen.hpp:183
#define emit_msub(cd, Xd, Xn, Xm, Xa)
Definition: emit-asm.hpp:455
#define emit_sxtb(cd, Wd, Wn)
Definition: emit-asm.hpp:323
void dsb(u1 option)
Definition: codegen.hpp:328
void itst(u1 wn, u1 wm)
Definition: codegen.hpp:261
#define emit_fmovd(cd, Dd, Dn)
Definition: emit-asm.hpp:522
#define emit_br_ne(cd, imm)
Definition: emit-asm.hpp:91
#define emit_csetm(cd, Xd, cond)
Definition: emit-asm.hpp:416
#define emit_lsr_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:314
void sxtw(u1 xd, u1 wn)
Definition: codegen.hpp:257
uint8_t u1
Definition: types.hpp:40
void cbnz(u1 xn, s4 imm)
Definition: codegen.hpp:202
#define emit_uxtb(cd, Wd, Wn)
Definition: emit-asm.hpp:317
#define emit_br_lt(cd, imm)
Definition: emit-asm.hpp:101
#define emit_cmp_reg(cd, Xn, Xm)
Definition: emit-asm.hpp:379
void i2f(u1 st, u1 wn)
Definition: codegen.hpp:312
AsmEmitter(codegendata *cd)
Definition: codegen.hpp:90
void llsr_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:239
void ldrb(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:115
void fld(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:111
void blr(u1 xn)
Definition: codegen.hpp:198
#define emit_br_vs(cd, imm)
Definition: emit-asm.hpp:96
void lst(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:121
void dmov(u1 dd, u1 dn)
Definition: codegen.hpp:291
void dmul(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:301
void ald(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:109
int64_t s8
Definition: types.hpp:48
void b_ne(s4 imm)
Definition: codegen.hpp:184
void ist(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:120
void dcmp(u1 xn, u1 xm)
Definition: codegen.hpp:298
#define emit_ret(cd)
Definition: emit-asm.hpp:128
void dadd(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:307
void d2l(u1 xd, u1 dn)
Definition: codegen.hpp:320
void emit_fcvt(codegendata *cd, u1 type, u1 opc, u1 Rn, u1 Rd)
Definition: emit-asm.hpp:552
void b_gt(s4 imm)
Definition: codegen.hpp:195
void b_ls(s4 imm)
Definition: codegen.hpp:192
#define emit_br_imm(cd, imm)
Definition: emit-asm.hpp:115
void emit_mov(codegendata *cd, u1 Xd, u1 Xm)
Definition: emit-asm.hpp:493
#define emit_cmn_imm(cd, Xn, imm)
Definition: emit-asm.hpp:292
#define emit_sub_reg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:374
#define emit_ldxr32(cd, Wt, Xn)
Definition: emit-asm.hpp:162
void iadd_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:206
#define emit_asr_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:326
#define emit_ldrsh_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:236
void b_lt(s4 imm)
Definition: codegen.hpp:194
void ubfx(u1 wd, u1 xn)
Definition: codegen.hpp:258
#define emit_br_cs(cd, imm)
Definition: emit-asm.hpp:92
#define emit_faddd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:544
#define emit_sdiv32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:431
void b_vs(s4 imm)
Definition: codegen.hpp:189
#define emit_br_vc(cd, imm)
Definition: emit-asm.hpp:97
#define emit_sub_imm32(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:279
#define emit_orr_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:473
void l2d(u1 dt, u1 xn)
Definition: codegen.hpp:315
void sxtb(u1 wd, u1 wn)
Definition: codegen.hpp:255
void ilsl_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:235
#define emit_br_cc(cd, imm)
Definition: emit-asm.hpp:93
#define emit_ldr_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:238
#define emit_cbnz32(cd, Wt, imm)
Definition: emit-asm.hpp:79
void ladd_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:207
void fcmp(u1 sn, u1 sm)
Definition: codegen.hpp:296
#define emit_add_reg32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:385
void cset(u1 xt, u1 cond)
Definition: codegen.hpp:282
#define emit_cmp_imm(cd, Xn, imm)
Definition: emit-asm.hpp:289
void ilsr(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:247
void llsr(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:248
#define emit_and_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:479
void icsneg(u1 wd, u1 wn, u1 wm, u1 cond)
Definition: codegen.hpp:286
void dneg(u1 dd, u1 dn)
Definition: codegen.hpp:294
void ldrsb32(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:117
#define emit_str_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:245
#define emit_br_pl(cd, imm)
Definition: emit-asm.hpp:95
void dld(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:112
void f2i(u1 wd, u1 sn)
Definition: codegen.hpp:317
void imul(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:227
#define emit_dsb(cd, option)
Definition: emit-asm.hpp:598
uint16_t u2
Definition: types.hpp:43
#define emit_ldr_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:244
#define emit_strh_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:230
#define emit_add_imm(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:275
uint64_t u8
Definition: types.hpp:49
void ldrsh32(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:118
void b_ge(s4 imm)
Definition: codegen.hpp:193
void b_le(s4 imm)
Definition: codegen.hpp:196
#define emit_msub32(cd, Xd, Xn, Xm, Xa)
Definition: emit-asm.hpp:456
void ilsr_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:238
void l2f(u1 st, u1 xn)
Definition: codegen.hpp:313
#define emit_mov_reg32(cd, Wd, Wm)
Definition: emit-asm.hpp:486
#define emit_ubfm32(cd, Wd, Wn, immr, imms)
Definition: emit-asm.hpp:309
void lsub_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:218
void imsub(u1 wd, u1 wn, u1 wm, u1 wa)
Definition: codegen.hpp:231
#define emit_ldrb_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:232
#define emit_sub_reg32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:386
#define emit_sub_imm(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:278
void b_vc(s4 imm)
Definition: codegen.hpp:190
#define emit_orr_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:474
#define emit_cmp_reg32(cd, Xn, Xm)
Definition: emit-asm.hpp:380
#define emit_fp_ldr_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:241
int32_t s4
Definition: types.hpp:45
#define emit_add_reg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:373
void csetm(u1 xt, u1 cond)
Definition: codegen.hpp:283
#define emit_sxth(cd, Wd, Wn)
Definition: emit-asm.hpp:324
void b_cc(s4 imm)
Definition: codegen.hpp:186
#define emit_lsl32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:437
void isub_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:217
#define emit_fadds(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:543
void fsub(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:309
void fmul(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:300
void emit_lda(u1 xd, u1 xn, s4 imm)
Definition: codegen.hpp:333
#define emit_lsl(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:436
#define emit_sdiv(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:430
#define emit_lsr32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:440
#define emit_ldrsb_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:235
void b_pl(s4 imm)
Definition: codegen.hpp:188
void ldiv(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:225
void ldrh(u1 wt, u1 xn, s4 imm)
Definition: codegen.hpp:114
void iadd(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:209
#define emit_fp_ldr_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:247
#define emit_lsl_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:312
#define emit_fcvtzs(cd, sf, type, Rn, Rd)
Definition: emit-asm.hpp:571
#define emit_movk_imm32(cd, Xd, imm, hw)
Definition: emit-asm.hpp:149
void lor(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:271
#define emit_movn_imm32(cd, Xd, imm)
Definition: emit-asm.hpp:147
uint32_t u4
Definition: types.hpp:46
#define emit_and_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:480
#define emit_br_ge(cd, imm)
Definition: emit-asm.hpp:100
void b_hi(s4 imm)
Definition: codegen.hpp:191
#define emit_str_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:239
void ild(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:107
void lda(u1 xd, u1 xn, s4 imm)
Definition: codegen.hpp:177
void icmn_imm(u1 wd, u2 imm)
Definition: codegen.hpp:97
#define emit_scvtf(cd, sf, type, Rn, Rd)
Definition: emit-asm.hpp:570
#define emit_fdivd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:541
#define emit_tst_sreg32(cd, Wn, Wm)
Definition: emit-asm.hpp:489
void f2l(u1 xd, u1 sn)
Definition: codegen.hpp:318
#define emit_asr(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:433
#define emit_asr_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:327
void emit_nop(codegendata *cd)
Definition: emit-asm.hpp:603
void imov(u1 wd, u1 wn)
Definition: codegen.hpp:92
void fadd(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:306
void ildxr(u1 wt, u1 xn)
Definition: codegen.hpp:132
void dsub(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:310
#define emit_mul32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:459
void dsb()
Definition: codegen.hpp:326
void iasr_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:241
codegendata * cd
Definition: codegen.hpp:331
void nop()
Definition: codegen.hpp:104
#define emit_fnegs(cd, Sd, Sn)
Definition: emit-asm.hpp:524
void b_cs(s4 imm)
Definition: codegen.hpp:185
#define emit_mov_imm(cd, Xd, imm)
Definition: emit-asm.hpp:144
void mov(u1 xt, u1 xn)
Definition: codegen.hpp:93
void iconst(u1 xt, s4 value)
Definition: codegen.hpp:135
void dmb(u1 option)
Definition: codegen.hpp:327
#define emit_asr32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:434
void lasr_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:242
#define emit_csel32(cd, Xd, Xn, Xm, cond)
Definition: emit-asm.hpp:411
void isub(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:220
void iasr(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:244
void uxtb(u1 wd, u1 wn)
Definition: codegen.hpp:253
void lld(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:108
void ltst(u1 xn, u1 xm)
Definition: codegen.hpp:260
#define emit_dmb(cd, option)
Definition: emit-asm.hpp:597
void clr(u1 xd)
Definition: codegen.hpp:276
void ret()
Definition: codegen.hpp:200
#define emit_fmovs(cd, Sd, Sn)
Definition: emit-asm.hpp:521
void iand(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:267
void lsub(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:221
#define emit_fdivs(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:540
#define emit_br_le(cd, imm)
Definition: emit-asm.hpp:103
#define emit_eor_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:483
void lcmp(u1 xn, u1 xm)
Definition: codegen.hpp:101
void br(u1 xn)
Definition: codegen.hpp:199
void adr(u1 xd, s4 imm)
Definition: codegen.hpp:179
void lasr(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:245
void istxr(u1 ws, u1 wt, u1 xn)
Definition: codegen.hpp:133
void icsel(u1 wt, u1 wn, u1 wm, u1 cond)
Definition: codegen.hpp:280
void d2i(u1 wd, u1 dn)
Definition: codegen.hpp:319
#define emit_csel(cd, Xd, Xn, Xm, cond)
Definition: emit-asm.hpp:410
#define emit_adr(cd, Xd, immhi)
Definition: emit-asm.hpp:360
#define emit_ldrh_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:229
#define emit_br_ls(cd, imm)
Definition: emit-asm.hpp:99
#define emit_br_mi(cd, imm)
Definition: emit-asm.hpp:94
#define emit_cmp_imm32(cd, Xn, imm)
Definition: emit-asm.hpp:290
#define emit_add_imm32(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:276
void b_mi(s4 imm)
Definition: codegen.hpp:187
#define emit_cbnz(cd, Xt, imm)
Definition: emit-asm.hpp:78
void fst(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:124
void sxth(u1 wd, u1 wn)
Definition: codegen.hpp:256
void ddiv(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:304
#define emit_lsr_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:315
void d2f(u1 sd, u1 dn)
Definition: codegen.hpp:323
#define emit_uxth(cd, Wd, Wn)
Definition: emit-asm.hpp:318
void dst(u1 xt, u1 xn, s4 imm)
Definition: codegen.hpp:125
#define emit_strb_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:233