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, s2 imm) { emit_ldr_imm32(cd, xt, xn, imm); }
108  void lld(u1 xt, u1 xn, s2 imm) { emit_ldr_imm(cd, xt, xn, imm); }
109  void ald(u1 xt, u1 xn, s2 imm) { emit_ldr_imm(cd, xt, xn, imm); }
110 
111  void fld(u1 xt, u1 xn, s2 imm) { emit_fp_ldr_imm32(cd, xt, xn, imm); }
112  void dld(u1 xt, u1 xn, s2 imm) { emit_fp_ldr_imm(cd, xt, xn, imm); }
113 
114  void ldrh(u1 wt, u1 xn, s2 imm) { emit_ldrh_imm(cd, wt, xn, imm); }
115  void ldrb(u1 wt, u1 xn, s2 imm) { emit_ldrb_imm(cd, wt, xn, imm); }
116 
117  void ldrsb32(u1 wt, u1 xn, s2 imm) { emit_ldrsb_imm32(cd, wt, xn, imm); }
118  void ldrsh32(u1 wt, u1 xn, s2 imm) { emit_ldrsh_imm32(cd, wt, xn, imm); }
119 
120  void ist(u1 xt, u1 xn, s2 imm) { emit_str_imm32(cd, xt, xn, imm); }
121  void lst(u1 xt, u1 xn, s2 imm) { emit_str_imm(cd, xt, xn, imm); }
122  void ast(u1 xt, u1 xn, s2 imm) { emit_str_imm(cd, xt, xn, imm); }
123 
124  void fst(u1 xt, u1 xn, s2 imm) { emit_fp_str_imm32(cd, xt, xn, imm); }
125  void dst(u1 xt, u1 xn, s2 imm) { emit_fp_str_imm(cd, xt, xn, imm); }
126 
127  void strh(u1 wt, u1 xn, s2 imm) { emit_strh_imm(cd, wt, xn, imm); }
128  void strb(u1 wt, u1 xn, s2 imm) { emit_strb_imm(cd, wt, xn, imm); }
129 
130  void iconst(u1 xt, s4 value) {
131  // For small negative immediates, use MOVN
132  if (value < 0 && -value-1 < 0xffff) {
133  emit_movn_imm32(cd, xt, -value - 1);
134  return;
135  }
136 
137  emit_mov_imm32(cd, xt, value & 0xffff);
138 
139  u4 v = (u4) value;
140  if (v > 0xffff) {
141  u2 imm = (value >> 16) & 0xffff;
142  emit_movk_imm32(cd, xt, imm, 1);
143  }
144  }
145 
146  void lconst(u1 xt, s8 value) {
147  // For small negative immediates, use MOVN
148  if (value < 0 && -value-1 < 0xffff) {
149  emit_movn_imm(cd, xt, -value - 1);
150  return;
151  }
152 
153  emit_mov_imm(cd, xt, value & 0xffff);
154 
155  u8 v = (u8) value;
156  if (v > 0xffff) {
157  u2 imm = (value >> 16) & 0xffff;
158  emit_movk_imm(cd, xt, imm, 1);
159  }
160 
161  if (v > 0xffffffff) {
162  u2 imm = (value >> 32) & 0xffff;
163  emit_movk_imm(cd, xt, imm, 2);
164  }
165 
166  if (v > 0xffffffffffff) {
167  u2 imm = (value >> 48) & 0xffff;
168  emit_movk_imm(cd, xt, imm, 3);
169  }
170  }
171 
172  void lda(u1 xd, u1 xn, s4 imm) { emit_lda(xd, xn, imm); }
173 
174  void adr(u1 xd, s4 imm) { emit_adr(cd, xd, imm); }
175 
176  /* Branch *************************************************************/
177  void b(s4 imm) { emit_br_imm(cd, imm); }
178  void b_eq(s4 imm) { emit_br_eq(cd, imm); }
179  void b_ne(s4 imm) { emit_br_ne(cd, imm); }
180  void b_cs(s4 imm) { emit_br_cs(cd, imm); }
181  void b_cc(s4 imm) { emit_br_cc(cd, imm); }
182  void b_mi(s4 imm) { emit_br_mi(cd, imm); }
183  void b_pl(s4 imm) { emit_br_pl(cd, imm); }
184  void b_vs(s4 imm) { emit_br_vs(cd, imm); }
185  void b_vc(s4 imm) { emit_br_vc(cd, imm); }
186  void b_hi(s4 imm) { emit_br_hi(cd, imm); }
187  void b_ls(s4 imm) { emit_br_ls(cd, imm); }
188  void b_ge(s4 imm) { emit_br_ge(cd, imm); }
189  void b_lt(s4 imm) { emit_br_lt(cd, imm); }
190  void b_gt(s4 imm) { emit_br_gt(cd, imm); }
191  void b_le(s4 imm) { emit_br_le(cd, imm); }
192 
193  void blr(u1 xn) { emit_blr_reg(cd, xn); }
194  void br(u1 xn) { emit_br_reg(cd, xn); }
195  void ret() { emit_ret(cd); }
196 
197  void cbnz(u1 xn, s4 imm) { emit_cbnz(cd, xn, imm); }
198 
199  /* Integer arithemtic *************************************************/
200  void iadd_imm(u1 xd, u1 xn, u4 imm) { emit_add_imm32(cd, xd, xn, imm); }
201  void ladd_imm(u1 xd, u1 xn, u4 imm) { emit_add_imm(cd, xd, xn, imm); }
202 
203  void iadd(u1 xd, u1 xn, u1 xm) { emit_add_reg32(cd, xd, xn, xm); }
204  void ladd(u1 xd, u1 xn, u1 xm) { emit_add_reg(cd, xd, xn, xm); }
205 
206  /** Xd = Xn + shift(Xm, amount); */
207  void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount) {
208  emit_add_reg_shift(cd, xd, xn, xm, shift, amount);
209  }
210 
211  void isub_imm(u1 xd, u1 xn, u4 imm) { emit_sub_imm32(cd, xd, xn, imm); }
212  void lsub_imm(u1 xd, u1 xn, u4 imm) { emit_sub_imm(cd, xd, xn, imm); }
213 
214  void isub(u1 xd, u1 xn, u1 xm) { emit_sub_reg32(cd, xd, xn, xm); }
215  void lsub(u1 xd, u1 xn, u1 xm) { emit_sub_reg(cd, xd, xn, xm); }
216 
217  /* wd = wn / wm */
218  void idiv(u1 wd, u1 wn, u1 wm) { emit_sdiv32(cd, wd, wn, wm); }
219  void ldiv(u1 xd, u1 xn, u1 xm) { emit_sdiv(cd, xd, xn, xm); }
220 
221  void imul(u1 wd, u1 wn, u1 wm) { emit_mul32(cd, wd, wn, wm); }
222  void lmul(u1 xd, u1 xn, u1 xm) { emit_mul(cd, xd, xn, xm); }
223 
224  /* wd = wa - wn * wm */
225  void imsub(u1 wd, u1 wn, u1 wm, u1 wa) { emit_msub32(cd, wd, wn, wm, wa); }
226  void lmsub(u1 xd, u1 xn, u1 xm, u1 xa) { emit_msub(cd, xd, xn, xm, xa); }
227 
228  /* wd = lsl(wn, shift) */
229  void ilsl_imm(u1 wd, u1 wn, u1 shift) { emit_lsl_imm32(cd, wd, wn, shift); }
230  void llsl_imm(u1 xd, u1 xn, u1 shift) { emit_lsl_imm(cd, xd, xn, shift); }
231 
232  void ilsr_imm(u1 wd, u1 wn, u1 shift) { emit_lsr_imm32(cd, wd, wn, shift); }
233  void llsr_imm(u1 xd, u1 xn, u1 shift) { emit_lsr_imm(cd, xd, xn, shift); }
234 
235  void iasr_imm(u1 wd, u1 wn, u1 shift) { emit_asr_imm32(cd, wd, wn, shift); }
236  void lasr_imm(u1 xd, u1 xn, u1 shift) { emit_asr_imm(cd, xd, xn, shift); }
237 
238  void iasr(u1 wd, u1 wn, u1 wm) { emit_asr32(cd, wd, wn, wm); }
239  void lasr(u1 xd, u1 xn, u1 xm) { emit_asr(cd, xd, xn, xm); }
240 
241  void ilsr(u1 wd, u1 wn, u1 wm) { emit_lsr32(cd, wd, wn, wm); }
242  void llsr(u1 xd, u1 xn, u1 xm) { emit_lsr(cd, xd, xn, xm); }
243 
244  void ilsl(u1 wd, u1 wn, u1 wm) { emit_lsl32(cd, wd, wn, wm); }
245  void llsl(u1 xd, u1 xn, u1 xm) { emit_lsl(cd, xd, xn, xm); }
246 
247  void uxtb(u1 wd, u1 wn) { emit_uxtb(cd, wd, wn); }
248  void uxth(u1 wd, u1 wn) { emit_uxth(cd, wd, wn); }
249  void sxtb(u1 wd, u1 wn) { emit_sxtb(cd, wd, wn); }
250  void sxth(u1 wd, u1 wn) { emit_sxth(cd, wd, wn); }
251  void sxtw(u1 xd, u1 wn) { emit_sxtw(cd, xd, wn); }
252  void ubfx(u1 wd, u1 xn) { emit_ubfm32(cd, wd, xn, 0, 31); }
253 
254  void ltst(u1 xn, u1 xm) { emit_tst_sreg(cd, xn, xm); }
255  void itst(u1 wn, u1 wm) { emit_tst_sreg32(cd, wn, wm); }
256 
257  // TODO: implement these correctly
258  // void iand_imm(u1 wd, u1 wn, u2 imm) { emit_and_imm32(cd, wd, wn, imm); }
259  // void land_imm(u1 xd, u1 xn, u2 imm) { emit_and_imm(cd, xd, xn, imm); }
260 
261  void iand(u1 wd, u1 wn, u1 wm) { emit_and_sreg32(cd, wd, wn, wm); }
262  void land(u1 xd, u1 xn, u1 xm) { emit_and_sreg(cd, xd, xn, xm); }
263 
264  void ior(u1 wd, u1 wn, u1 wm) { emit_orr_sreg32(cd, wd, wn, wm); }
265  void lor(u1 xd, u1 xn, u1 xm) { emit_orr_sreg(cd, xd, xn, xm); }
266 
267  void ixor(u1 wd, u1 wn, u1 wm) { emit_eor_sreg32(cd, wd, wn, wm); }
268  void lxor(u1 xd, u1 xn, u1 xm) { emit_eor_sreg(cd, xd, xn, xm); }
269 
270  void clr(u1 xd) { lxor(xd, xd, xd); }
271 
272  /* xt = if cond then xn else xm */
273  void csel(u1 xt, u1 xn, u1 xm, u1 cond) { emit_csel(cd, xt, xn, xm, cond); }
274  void icsel(u1 wt, u1 wn, u1 wm, u1 cond) { emit_csel32(cd, wt, wn, wm, cond); }
275 
276  void cset(u1 xt, u1 cond) { emit_cset(cd, xt, cond); } /* Xd = if cond then 1 else 0 */
277  void csetm(u1 xt, u1 cond) { emit_csetm(cd, xt, cond); } /* Xd = if cond then -1 else 0 */
278 
279  /* xt = if cond then xn else -xm */
280  void icsneg(u1 wd, u1 wn, u1 wm, u1 cond) { emit_csneg32(cd, wd, wn, wm, cond); }
281 
282  /* Floating point *****************************************************/
283 
284  void fmov(u1 sd, u1 sn) { emit_fmovs(cd, sd, sn); }
285  void dmov(u1 dd, u1 dn) { emit_fmovd(cd, dd, dn); }
286 
287  void fneg(u1 sd, u1 sn) { emit_fnegs(cd, sd, sn); }
288  void dneg(u1 dd, u1 dn) { emit_fnegd(cd, dd, dn); }
289 
290  void fcmp(u1 sn, u1 sm) { emit_fp_cmp(cd, 0, sm, sn, 0); }
291  void fcmp(u1 sn) { emit_fp_cmp(cd, 0, 0, sn, 1); } /* fcmp Sn, #0.0 */
292  void dcmp(u1 xn, u1 xm) { emit_fp_cmp(cd, 1, xm, xn, 0); }
293 
294  void fmul(u1 st, u1 sn, u1 sm) { emit_fmuls(cd, st, sn, sm); }
295  void dmul(u1 dt, u1 dn, u1 dm) { emit_fmuld(cd, dt, dn, dm); }
296 
297  void fdiv(u1 st, u1 sn, u1 sm) { emit_fdivs(cd, st, sn, sm); }
298  void ddiv(u1 dt, u1 dn, u1 dm) { emit_fdivd(cd, dt, dn, dm); }
299 
300  void fadd(u1 st, u1 sn, u1 sm) { emit_fadds(cd, st, sn, sm); }
301  void dadd(u1 dt, u1 dn, u1 dm) { emit_faddd(cd, dt, dn, dm); }
302 
303  void fsub(u1 st, u1 sn, u1 sm) { emit_fsubs(cd, st, sn, sm); }
304  void dsub(u1 dt, u1 dn, u1 dm) { emit_fsubd(cd, dt, dn, dm); }
305 
306  void i2f(u1 st, u1 wn) { emit_scvtf(cd, 0, 0, wn, st); }
307  void l2f(u1 st, u1 xn) { emit_scvtf(cd, 1, 0, xn, st); }
308  void i2d(u1 dt, u1 wn) { emit_scvtf(cd, 0, 1, wn, dt); }
309  void l2d(u1 dt, u1 xn) { emit_scvtf(cd, 1, 1, xn, dt); }
310 
311  void f2i(u1 wd, u1 sn) { emit_fcvtzs(cd, 0, 0, sn, wd); }
312  void f2l(u1 xd, u1 sn) { emit_fcvtzs(cd, 1, 0, sn, xd); }
313  void d2i(u1 wd, u1 dn) { emit_fcvtzs(cd, 0, 1, dn, wd); }
314  void d2l(u1 xd, u1 dn) { emit_fcvtzs(cd, 1, 1, dn, xd); }
315 
316  void f2d(u1 dd, u1 sn) { emit_fcvt(cd, 0, 1, sn, dd); }
317  void d2f(u1 sd, u1 dn) { emit_fcvt(cd, 1, 0, dn, sd); }
318 
319  void dmb() { emit_dmb(cd, 0xf); }
320  void dsb() { emit_dsb(cd, 0xf); }
321  void dmb(u1 option) { emit_dmb(cd, option); }
322  void dsb(u1 option) { emit_dsb(cd, option); }
323 
324  private:
326 
327  void emit_lda(u1 xd, u1 xn, s4 imm) {
328  if (imm >= 0)
329  emit_add_imm(cd, xd, xn, imm);
330  else
331  emit_sub_imm(cd, xd, xn, -imm);
332  }
333 };
334 
335 
336 /* compatiblity macros ********************************************************/
337 
338 #define M_NOP emit_nop(cd)
339 
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)
343 
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)
348 
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)
352 
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)
355 
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)
358 
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)
362 
363 #endif // CODEGEN_HPP_
364 
365 
366 /*
367  * These are local overrides for various environment variables in Emacs.
368  * Please do not remove this and leave it at the end of the file, where
369  * Emacs will automagically detect them.
370  * ---------------------------------------------------------------------
371  * Local variables:
372  * mode: c++
373  * indent-tabs-mode: t
374  * c-basic-offset: 4
375  * tab-width: 4
376  * End:
377  * vim:noexpandtab:sw=4:ts=4:
378  */
void ladd(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:204
void ald(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:109
void fcmp(u1 sn)
Definition: codegen.hpp:291
#define emit_fp_str_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:223
void f2d(u1 dd, u1 sn)
Definition: codegen.hpp:316
void fdiv(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:297
#define emit_br_gt(cd, imm)
Definition: emit-asm.hpp:100
#define emit_fsubs(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:527
void lmsub(u1 xd, u1 xn, u1 xm, u1 xa)
Definition: codegen.hpp:226
#define emit_fmuls(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:518
#define emit_eor_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:463
#define emit_fmuld(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:519
#define emit_blr_reg(cd, Xn)
Definition: emit-asm.hpp:127
void lcmp_imm(u1 xd, u2 imm)
Definition: codegen.hpp:96
#define emit_fp_str_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:229
void icmp(u1 wn, u1 wm)
Definition: codegen.hpp:100
void llsl_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:230
#define emit_mul(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:439
void i2d(u1 dt, u1 wn)
Definition: codegen.hpp:308
void emit_fp_cmp(codegendata *cd, u1 type, u1 Rm, u1 Rn, u1 opc)
Definition: emit-asm.hpp:484
void acmp(u1 xn, u1 xm)
Definition: codegen.hpp:102
void fmov(u1 sd, u1 sn)
Definition: codegen.hpp:284
void uxth(u1 wd, u1 wn)
Definition: codegen.hpp:248
#define emit_br_hi(cd, imm)
Definition: emit-asm.hpp:96
#define emit_movn_imm(cd, Xd, imm)
Definition: emit-asm.hpp:144
void fneg(u1 sd, u1 sn)
Definition: codegen.hpp:287
void land(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:262
#define emit_cset(cd, Xd, cond)
Definition: emit-asm.hpp:394
void ior(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:264
#define emit_lsr(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:420
void llsl(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:245
#define emit_csneg32(cd, Wd, Wn, Wm, cond)
Definition: emit-asm.hpp:399
#define emit_br_reg(cd, Xn)
Definition: emit-asm.hpp:129
void csel(u1 xt, u1 xn, u1 xm, u1 cond)
Definition: codegen.hpp:273
void ilsl(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:244
#define emit_tst_sreg(cd, Xn, Xm)
Definition: emit-asm.hpp:469
#define emit_movk_imm(cd, Xd, imm, hw)
Definition: emit-asm.hpp:146
#define emit_cmn_imm32(cd, Wn, imm)
Definition: emit-asm.hpp:274
#define emit_br_eq(cd, imm)
Definition: emit-asm.hpp:88
#define emit_lsl_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:292
void dst(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:125
void lxor(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:268
void lcmn_imm(u1 xd, u2 imm)
Definition: codegen.hpp:98
#define emit_fsubd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:528
void lconst(u1 xt, s8 value)
Definition: codegen.hpp:146
#define emit_fnegd(cd, Dd, Dn)
Definition: emit-asm.hpp:506
void ldrsh32(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:118
void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount)
Xd = Xn + shift(Xm, amount);.
Definition: codegen.hpp:207
void dmb()
Definition: codegen.hpp:319
#define emit_mov_imm32(cd, Xd, imm)
Definition: emit-asm.hpp:143
void lmul(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:222
void b(s4 imm)
Definition: codegen.hpp:177
void icmp_imm(u1 wd, u2 imm)
Definition: codegen.hpp:95
void ixor(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:267
void idiv(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:218
#define emit_add_reg_shift(cd, Xd, Xn, Xm, s, a)
Definition: emit-asm.hpp:363
#define emit_sxtw(cd, Xd, Wn)
Definition: emit-asm.hpp:310
void b_eq(s4 imm)
Definition: codegen.hpp:178
#define emit_msub(cd, Xd, Xn, Xm, Xa)
Definition: emit-asm.hpp:436
#define emit_sxtb(cd, Wd, Wn)
Definition: emit-asm.hpp:304
void dsb(u1 option)
Definition: codegen.hpp:322
void itst(u1 wn, u1 wm)
Definition: codegen.hpp:255
#define emit_fmovd(cd, Dd, Dn)
Definition: emit-asm.hpp:503
#define emit_br_ne(cd, imm)
Definition: emit-asm.hpp:89
#define emit_csetm(cd, Xd, cond)
Definition: emit-asm.hpp:397
#define emit_lsr_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:295
void sxtw(u1 xd, u1 wn)
Definition: codegen.hpp:251
uint8_t u1
Definition: types.hpp:40
void cbnz(u1 xn, s4 imm)
Definition: codegen.hpp:197
#define emit_uxtb(cd, Wd, Wn)
Definition: emit-asm.hpp:298
#define emit_br_lt(cd, imm)
Definition: emit-asm.hpp:99
#define emit_cmp_reg(cd, Xn, Xm)
Definition: emit-asm.hpp:360
void i2f(u1 st, u1 wn)
Definition: codegen.hpp:306
void fst(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:124
AsmEmitter(codegendata *cd)
Definition: codegen.hpp:90
void llsr_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:233
void blr(u1 xn)
Definition: codegen.hpp:193
#define emit_br_vs(cd, imm)
Definition: emit-asm.hpp:94
void dmov(u1 dd, u1 dn)
Definition: codegen.hpp:285
void dmul(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:295
int64_t s8
Definition: types.hpp:48
void b_ne(s4 imm)
Definition: codegen.hpp:179
void dcmp(u1 xn, u1 xm)
Definition: codegen.hpp:292
#define emit_ret(cd)
Definition: emit-asm.hpp:126
void dadd(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:301
void d2l(u1 xd, u1 dn)
Definition: codegen.hpp:314
void emit_fcvt(codegendata *cd, u1 type, u1 opc, u1 Rn, u1 Rd)
Definition: emit-asm.hpp:533
void b_gt(s4 imm)
Definition: codegen.hpp:190
void b_ls(s4 imm)
Definition: codegen.hpp:187
#define emit_br_imm(cd, imm)
Definition: emit-asm.hpp:113
void emit_mov(codegendata *cd, u1 Xd, u1 Xm)
Definition: emit-asm.hpp:474
#define emit_cmn_imm(cd, Xn, imm)
Definition: emit-asm.hpp:273
#define emit_sub_reg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:355
void ist(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:120
void iadd_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:200
#define emit_asr_imm(cd, Xd, Xn, shift)
Definition: emit-asm.hpp:307
#define emit_ldrsh_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:217
void b_lt(s4 imm)
Definition: codegen.hpp:189
void ubfx(u1 wd, u1 xn)
Definition: codegen.hpp:252
#define emit_br_cs(cd, imm)
Definition: emit-asm.hpp:90
#define emit_faddd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:525
void ild(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:107
#define emit_sdiv32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:412
void b_vs(s4 imm)
Definition: codegen.hpp:184
#define emit_br_vc(cd, imm)
Definition: emit-asm.hpp:95
#define emit_sub_imm32(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:260
#define emit_orr_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:454
void l2d(u1 dt, u1 xn)
Definition: codegen.hpp:309
void ast(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:122
void sxtb(u1 wd, u1 wn)
Definition: codegen.hpp:249
void ilsl_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:229
#define emit_br_cc(cd, imm)
Definition: emit-asm.hpp:91
#define emit_ldr_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:219
void ladd_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:201
void fcmp(u1 sn, u1 sm)
Definition: codegen.hpp:290
#define emit_add_reg32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:366
void cset(u1 xt, u1 cond)
Definition: codegen.hpp:276
#define emit_cmp_imm(cd, Xn, imm)
Definition: emit-asm.hpp:270
void ilsr(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:241
void llsr(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:242
#define emit_and_sreg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:460
void icsneg(u1 wd, u1 wn, u1 wm, u1 cond)
Definition: codegen.hpp:280
void dneg(u1 dd, u1 dn)
Definition: codegen.hpp:288
#define emit_str_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:226
#define emit_br_pl(cd, imm)
Definition: emit-asm.hpp:93
void f2i(u1 wd, u1 sn)
Definition: codegen.hpp:311
void imul(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:221
#define emit_dsb(cd, option)
Definition: emit-asm.hpp:579
uint16_t u2
Definition: types.hpp:43
#define emit_ldr_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:225
#define emit_strh_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:211
#define emit_add_imm(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:256
uint64_t u8
Definition: types.hpp:49
void b_ge(s4 imm)
Definition: codegen.hpp:188
void b_le(s4 imm)
Definition: codegen.hpp:191
#define emit_msub32(cd, Xd, Xn, Xm, Xa)
Definition: emit-asm.hpp:437
void ilsr_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:232
void l2f(u1 st, u1 xn)
Definition: codegen.hpp:307
#define emit_mov_reg32(cd, Wd, Wm)
Definition: emit-asm.hpp:467
#define emit_ubfm32(cd, Wd, Wn, immr, imms)
Definition: emit-asm.hpp:290
void lst(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:121
void lsub_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:212
void imsub(u1 wd, u1 wn, u1 wm, u1 wa)
Definition: codegen.hpp:225
void ldrb(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:115
#define emit_ldrb_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:213
#define emit_sub_reg32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:367
#define emit_sub_imm(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:259
void b_vc(s4 imm)
Definition: codegen.hpp:185
#define emit_orr_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:455
#define emit_cmp_reg32(cd, Xn, Xm)
Definition: emit-asm.hpp:361
#define emit_fp_ldr_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:222
int32_t s4
Definition: types.hpp:45
#define emit_add_reg(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:354
void csetm(u1 xt, u1 cond)
Definition: codegen.hpp:277
#define emit_sxth(cd, Wd, Wn)
Definition: emit-asm.hpp:305
void b_cc(s4 imm)
Definition: codegen.hpp:181
#define emit_lsl32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:418
void isub_imm(u1 xd, u1 xn, u4 imm)
Definition: codegen.hpp:211
#define emit_fadds(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:524
void fsub(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:303
void dld(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:112
void fmul(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:294
void emit_lda(u1 xd, u1 xn, s4 imm)
Definition: codegen.hpp:327
#define emit_lsl(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:417
#define emit_sdiv(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:411
#define emit_lsr32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:421
void ldrsb32(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:117
#define emit_ldrsb_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:216
void b_pl(s4 imm)
Definition: codegen.hpp:183
void ldiv(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:219
void iadd(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:203
#define emit_fp_ldr_imm32(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:228
#define emit_lsl_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:293
#define emit_fcvtzs(cd, sf, type, Rn, Rd)
Definition: emit-asm.hpp:552
#define emit_movk_imm32(cd, Xd, imm, hw)
Definition: emit-asm.hpp:147
void lor(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:265
#define emit_movn_imm32(cd, Xd, imm)
Definition: emit-asm.hpp:145
void lld(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:108
uint32_t u4
Definition: types.hpp:46
#define emit_and_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:461
#define emit_br_ge(cd, imm)
Definition: emit-asm.hpp:98
void b_hi(s4 imm)
Definition: codegen.hpp:186
#define emit_str_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:220
void lda(u1 xd, u1 xn, s4 imm)
Definition: codegen.hpp:172
void icmn_imm(u1 wd, u2 imm)
Definition: codegen.hpp:97
#define emit_scvtf(cd, sf, type, Rn, Rd)
Definition: emit-asm.hpp:551
#define emit_fdivd(cd, Dd, Dn, Dm)
Definition: emit-asm.hpp:522
#define emit_tst_sreg32(cd, Wn, Wm)
Definition: emit-asm.hpp:470
void f2l(u1 xd, u1 sn)
Definition: codegen.hpp:312
#define emit_asr(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:414
#define emit_asr_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:308
void emit_nop(codegendata *cd)
Definition: emit-asm.hpp:584
void imov(u1 wd, u1 wn)
Definition: codegen.hpp:92
void fadd(u1 st, u1 sn, u1 sm)
Definition: codegen.hpp:300
void dsub(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:304
#define emit_mul32(cd, Xd, Xn, Xm)
Definition: emit-asm.hpp:440
void dsb()
Definition: codegen.hpp:320
void iasr_imm(u1 wd, u1 wn, u1 shift)
Definition: codegen.hpp:235
codegendata * cd
Definition: codegen.hpp:325
void nop()
Definition: codegen.hpp:104
#define emit_fnegs(cd, Sd, Sn)
Definition: emit-asm.hpp:505
void b_cs(s4 imm)
Definition: codegen.hpp:180
#define emit_mov_imm(cd, Xd, imm)
Definition: emit-asm.hpp:142
void mov(u1 xt, u1 xn)
Definition: codegen.hpp:93
void iconst(u1 xt, s4 value)
Definition: codegen.hpp:130
void dmb(u1 option)
Definition: codegen.hpp:321
#define emit_asr32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:415
void lasr_imm(u1 xd, u1 xn, u1 shift)
Definition: codegen.hpp:236
#define emit_csel32(cd, Xd, Xn, Xm, cond)
Definition: emit-asm.hpp:392
int16_t s2
Definition: types.hpp:42
void strb(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:128
void isub(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:214
void iasr(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:238
void uxtb(u1 wd, u1 wn)
Definition: codegen.hpp:247
void ltst(u1 xn, u1 xm)
Definition: codegen.hpp:254
#define emit_dmb(cd, option)
Definition: emit-asm.hpp:578
void clr(u1 xd)
Definition: codegen.hpp:270
void ret()
Definition: codegen.hpp:195
#define emit_fmovs(cd, Sd, Sn)
Definition: emit-asm.hpp:502
void iand(u1 wd, u1 wn, u1 wm)
Definition: codegen.hpp:261
void lsub(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:215
#define emit_fdivs(cd, Sd, Sn, Sm)
Definition: emit-asm.hpp:521
void strh(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:127
#define emit_br_le(cd, imm)
Definition: emit-asm.hpp:101
#define emit_eor_sreg32(cd, Wd, Wn, Wm)
Definition: emit-asm.hpp:464
void lcmp(u1 xn, u1 xm)
Definition: codegen.hpp:101
void br(u1 xn)
Definition: codegen.hpp:194
void adr(u1 xd, s4 imm)
Definition: codegen.hpp:174
void fld(u1 xt, u1 xn, s2 imm)
Definition: codegen.hpp:111
void lasr(u1 xd, u1 xn, u1 xm)
Definition: codegen.hpp:239
void icsel(u1 wt, u1 wn, u1 wm, u1 cond)
Definition: codegen.hpp:274
void ldrh(u1 wt, u1 xn, s2 imm)
Definition: codegen.hpp:114
void d2i(u1 wd, u1 dn)
Definition: codegen.hpp:313
#define emit_csel(cd, Xd, Xn, Xm, cond)
Definition: emit-asm.hpp:391
#define emit_adr(cd, Xd, immhi)
Definition: emit-asm.hpp:341
#define emit_ldrh_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:210
#define emit_br_ls(cd, imm)
Definition: emit-asm.hpp:97
#define emit_br_mi(cd, imm)
Definition: emit-asm.hpp:92
#define emit_cmp_imm32(cd, Xn, imm)
Definition: emit-asm.hpp:271
#define emit_add_imm32(cd, Xd, Xn, imm)
Definition: emit-asm.hpp:257
void b_mi(s4 imm)
Definition: codegen.hpp:182
#define emit_cbnz(cd, Xt, imm)
Definition: emit-asm.hpp:77
void sxth(u1 wd, u1 wn)
Definition: codegen.hpp:250
void ddiv(u1 dt, u1 dn, u1 dm)
Definition: codegen.hpp:298
#define emit_lsr_imm32(cd, Wd, Wn, shift)
Definition: emit-asm.hpp:296
void d2f(u1 sd, u1 dn)
Definition: codegen.hpp:317
#define emit_uxth(cd, Wd, Wn)
Definition: emit-asm.hpp:299
#define emit_strb_imm(cd, Xt, Xn, imm)
Definition: emit-asm.hpp:214