25 #ifndef _JIT_COMPILER2_AARCH64_EMITTER
26 #define _JIT_COMPILER2_AARCH64_EMITTER
76 : reg(reg), conf(conf) {}
133 s4 off = offset >> 2;
135 u4 instr = 0x54000000 |
lsl(off, 5) | cond;
140 s4 off = offset >> 2;
142 u4 instr = 0x14000000 | (off & 0x3ffffff);
147 u4 instr = 0xd63f0000 |
lsl(rd.
r(), 5);
156 void ldr(
const Reg& rt,
const Reg& rn,
s2 imm = 0);
157 void str(
const Reg& rt,
const Reg& rn,
s2 imm = 0);
194 void trap(
const Reg& rd,
int type);
202 u4 lsl(T a,
u1 amount) {
return a << amount; }
206 assert(imm >= 0 && imm <= 4095);
207 u4 instr = 0x11000000 |
lsl(sf, 31) |
lsl(op, 30) |
lsl(s, 29)
208 |
lsl(shift, 22) |
lsl(imm, 10) |
lsl(rn, 5) | rd;
213 u4 instr = 0x13000000 |
lsl(sf, 31) |
lsl(opc, 29) |
lsl(n, 22)
214 |
lsl(immr, 16) |
lsl(imms, 10) |
lsl(rn, 5) | rd;
219 u4 instr = 0x12800000 |
lsl(sf, 31) |
lsl(opc, 29) |
lsl(hw, 21)
226 s4 off = (imm / 4) & 0x7ffff;
228 u4 instr = 0x18000000 |
lsl(opc, 30) |
lsl(v, 26) |
lsl(off, 5) | rt;
233 assert(imm >= -256 && imm <= 255);
234 u4 instr = 0x38000000 |
lsl(size, 30) |
lsl(v, 26) |
lsl(opc, 22)
235 |
lsl(imm & 0x1ff, 12) |
lsl(rn, 5) | rt;
241 u4 instr = 0x38200800 |
lsl(size, 30) |
lsl(v, 26) |
lsl(opc, 22)
242 |
lsl(rm, 16) |
lsl(option, 13) |
lsl(s, 12)
248 imm = imm / std::pow(2, size);
249 assert(imm >= 0 && imm <= 4096);
250 u4 instr = 0x39000000 |
lsl(size, 30) |
lsl(v, 26) |
lsl(opc, 22)
251 |
lsl(imm, 10) |
lsl(rn, 5) | rt;
257 u4 instr = 0x0b000000 |
lsl(sf, 31) |
lsl(opc, 30) |
lsl(s, 29)
258 |
lsl(shift, 22) |
lsl(rm, 16) |
lsl(imm, 10) |
lsl(rn, 5)
265 u4 instr = 0x1a800000 |
lsl(sf, 31) |
lsl(op, 30) |
lsl(s, 29)
266 |
lsl(rm, 16) |
lsl(cond, 12) |
lsl(op2, 10)
272 u4 instr = 0x1ac00000 |
lsl(sf, 31) |
lsl(s, 29) |
lsl(rm, 16)
273 |
lsl(op, 10) |
lsl(rn, 5) | rd;
279 u4 instr = 0x1b000000 |
lsl(sf, 31) |
lsl(op54, 29) |
lsl(op31, 21)
280 |
lsl(rm, 16) |
lsl(o0, 15) |
lsl(ra, 10) |
lsl(rn, 5) | rd;
285 u4 instr = 0x0a000000 |
lsl(sf, 31) |
lsl(opc, 29) |
lsl(n, 21)
286 |
lsl(rm, 16) |
lsl(rn, 5) | rd;
291 u4 instr = 0x1e202000 |
lsl(m, 31) |
lsl(s, 29) |
lsl(type, 22)
292 |
lsl(rm, 16) |
lsl(op, 14) |
lsl(rn, 5) | op2;
297 u4 instr = 0x1e204000 |
lsl(m, 31) |
lsl(s, 29) |
lsl(type, 22)
298 |
lsl(op, 15) |
lsl(rn, 5) | rd;
303 u4 instr = 0x1e200800 |
lsl(m, 31) |
lsl(s, 29) |
lsl(type, 22)
304 |
lsl(rm, 16) |
lsl(op, 12) |
lsl(rn, 5) | rd;
310 u4 instr = 0x1e200000 |
lsl(sf, 31) |
lsl(s, 29) |
lsl(type, 22)
311 |
lsl(rmode, 19) |
lsl(op, 16) |
lsl(rn, 5) | rd;
316 u4 instr = 0xe7000000 |
lsl(type & 0xff, 8) | rd;
327 #endif // JIT_COMPILER2_AARCH64_EMITTER
void cmp(const Reg &rn, s2 imm)
void movk(const Reg &rd, u2 imm, u1 shift=0)
static RegConfiguration XConf
void move_wide_immediate(u1 sf, u1 opc, u1 hw, u2 imm, u1 rd)
static RegConfiguration DConf
void emit(CodeMemory *cm)
void fneg(const Reg &rd, const Reg &rn)
void add_subtract_shifted_register(u1 sf, u1 opc, u1 s, u1 shift, u1 rm, u1 imm, u1 rn, u1 rd)
void load_store_register(u1 size, u1 v, u1 opc, u1 rm, u1 option, u1 s, u1 rn, u1 rt)
void fp_data_processing_2(u1 m, u1 s, u1 type, u1 rm, u1 op, u1 rn, u1 rd)
void ldur(const Reg &rt, const Reg &rn, s2 imm=0)
void fmul(const Reg &rd, const Reg &rn, const Reg &rm)
void csel(const Reg &rd, const Reg &rn, const Reg &rm, Cond::COND cond)
void fadd(const Reg &rd, const Reg &rn, const Reg &rm)
void movz(const Reg &rd, u2 imm)
void sxth(const Reg &rd, const Reg &rn)
void fcvt(const Reg &rd, const Reg &rn)
instruction_list instructions
void add(const Reg &rd, const Reg &rn, s2 imm)
void msub(const Reg &rd, const Reg &rn, const Reg &rm, const Reg &ra)
void neg(const Reg &rd, const Reg &rm)
void str(const Reg &rt, const Reg &rn, s2 imm=0)
void orr(const Reg &rd, const Reg &rn, const Reg &rm)
JNIEnv jthread jobject jclass jlong size
void bcond(u1 cond, s4 offset)
void bitfield(u1 sf, u1 opc, u1 n, u1 immr, u1 imms, u1 rn, u1 rd)
const RegConfiguration *const conf
void sdiv(const Reg &rd, const Reg &rn, const Reg &rm)
void load_store_unscaled(u1 size, u1 v, u1 opc, s2 imm, u1 rn, u1 rt)
void andd(const Reg &rd, const Reg &rn, const Reg &rm)
void fdiv(const Reg &rd, const Reg &rn, const Reg &rm)
void data_processing_3_source(u1 sf, u1 op54, u1 op31, u1 rm, u1 o0, u1 ra, u1 rn, u1 rd)
std::vector< T, Allocator< T > > type
void sub(const Reg &rd, const Reg &rn, s2 imm)
void scvtf(const Reg &rd, const Reg &rn)
void movn(const Reg &rd, u2 imm)
static RegConfiguration WConf
void trap_encode(u1 rd, s4 type)
void ubfm(const Reg &rd, const Reg &rn, u1 immr, u1 imms)
static RegConfiguration HConf
void stur(const Reg &rt, const Reg &rn, s2 imm=0)
void subs(const Reg &rd, const Reg &rn, s2 imm)
void fmov(const Reg &rd, const Reg &rn)
void conditional_select(u1 sf, u1 op, u1 s, u1 rm, u1 cond, u1 op2, u1 rn, u1 rd)
void mul(const Reg &rd, const Reg &rn, const Reg &rm)
void madd(const Reg &rd, const Reg &rn, const Reg &rm, const Reg &ra)
void sxtb(const Reg &rd, const Reg &rn)
void sxtw(const Reg &xd, const Reg &wn)
void fcmp(const Reg &rn, const Reg &rm)
alloc::vector< u4 >::type instruction_list
void logical_shifted_register(u1 sf, u1 opc, u1 n, u1 rm, u1 rn, u1 rd)
void fsub(const Reg &rd, const Reg &rn, const Reg &rm)
void fp_data_processing_1(u1 m, u1 s, u1 type, u1 op, u1 rn, u1 rd)
void mov(const Reg &rd, const Reg &rm)
void ldr(const Reg &rt, s4 offset)
void trap(const Reg &rd, int type)
void add_subtract_immediate(u1 sf, u1 op, u1 s, u1 shift, s2 imm, u1 rn, u1 rd)
void fp_compare(u1 m, u1 s, u1 type, u1 rm, u1 op, u1 rn, u1 op2)
void data_processing_2_source(u1 sf, u1 s, u1 rm, u1 op, u1 rn, u1 rd)
Reg(u1 reg, const RegConfiguration *const conf)
void load_literal(u1 opc, u1 v, s4 imm, u1 rt)
void sbfm(const Reg &rd, const Reg &rn, u1 immr, u1 imms)
void uxth(const Reg &wd, const Reg &wn)
static RegConfiguration SConf
void load_store_unsigned(u1 size, u1 v, u1 opc, s2 imm, u1 rn, u1 rt)
void ubfx(const Reg &wd, const Reg &wn)
static RegConfiguration BConf
void conversion_fp_integer(u1 sf, u1 s, u1 type, u1 rmode, u1 op, u1 rn, u1 rd)