93 offset += (offset % 16);
206 offset += (offset % 16);
226 int32_t
s1,
s2,
s3, d = 0;
347 asme.
iadd(d, s1, s2);
356 asme.
ladd(d, s1, s2);
367 if ((iptr->
sx.
val.
i >= 0) && (iptr->
sx.
val.
i <= 0xffffff)) {
369 }
else if ((-iptr->
sx.
val.
i >= 0) && (-iptr->
sx.
val.
i <= 0xffffff)) {
386 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffffff)) {
388 }
else if ((-iptr->
sx.
val.
l >= 0) && (-iptr->
sx.
val.
l <= 0xffffff)) {
402 asme.
isub(d, s1, s2);
411 asme.
lsub(d, s1, s2);
421 if ((iptr->
sx.
val.
i >= 0) && (iptr->
sx.
val.
i <= 0xffffff)) {
423 }
else if ((-iptr->
sx.
val.
i >= 0) && (-iptr->
sx.
val.
i <= 0xffffff)) {
439 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffffff)) {
441 }
else if ((-iptr->
sx.
val.
l >= 0) && (-iptr->
sx.
val.
l <= 0xffffff)) {
456 asme.
imul(d, s1, s2);
466 asme.
lmul(d, s1, s2);
522 asme.
idiv(d, s1, s2);
534 asme.
ldiv(d, s1, s2);
721 asme.
iand(d, s1, s2);
732 asme.
land(d, s1, s2);
817 asme.
ixor(d, s1, s2);
828 asme.
lxor(d, s1, s2);
882 asme.
fadd(d, s1, s2);
891 asme.
dadd(d, s1, s2);
900 asme.
fsub(d, s1, s2);
909 asme.
dsub(d, s1, s2);
918 if (d == s1 || d == s2) {
922 asme.
fmul(d, s1, s2);
932 if (d == s1 || d == s2) {
936 asme.
dmul(d, s1, s2);
946 asme.
fdiv(d, s1, s2);
955 asme.
ddiv(d, s1, s2);
1308 uf = iptr->
sx.
s23.s3.uf;
1315 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1316 fieldtype = fi->
type;
1326 switch (fieldtype) {
1328 asme.
ild(d, s1, disp);
1331 asme.
lld(d, s1, disp);
1334 asme.
ald(d, s1, disp);
1337 asme.
fld(d, s1, disp);
1340 asme.
dld(d, s1, disp);
1352 uf = iptr->
sx.
s23.s3.uf;
1358 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1359 fieldtype = fi->
type;
1372 switch (fieldtype) {
1374 asme.
ist(s2, s1, disp);
1377 asme.
lst(s2, s1, disp);
1380 asme.
ast(s2, s1, disp);
1383 asme.
fst(s2, s1, disp);
1386 asme.
dst(s2, s1, disp);
1405 }
else if ((-iptr->
sx.
val.
l) >= 0 && (-iptr->
sx.
val.
l) <= 0xfff) {
1437 bte = iptr->
sx.
s23.s3.bte;
1438 if (bte->
stub == NULL)
1455 um = iptr->
sx.
s23.s3.um;
1462 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1474 um = iptr->
sx.
s23.s3.um;
1480 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1495 um = iptr->
sx.
s23.s3.um;
1502 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1513 assert(
abs(s1) <= 0xffff);
1514 assert(
abs(s2) <= 0xffff);
1532 l = iptr->
sx.
s23.s2.tablelow;
1533 i = iptr->
sx.
s23.s3.tablehigh;
1538 }
else if (
abs(l) <= 32768) {
1586 super = iptr->
sx.
s23.s3.c.cls;
1587 superindex = super->
index;
1594 if (super == NULL) {
1601 iptr->
sx.
s23.s3.c.ref, disp);
1615 if (super != NULL) {
1622 if (super == NULL) {
1624 iptr->
sx.
s23.s3.c.ref, 0);
1630 assert(
abs(superindex) <= 0xfff);
1637 assert(
abs(offset) <= 0xffff);
1652 if (super == NULL) {
1658 iptr->
sx.
s23.s3.c.ref, disp);
1670 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
1678 if (super == NULL) {
1722 if (super == NULL) {
1740 iptr->
sx.
s23.s3.c.ref,
1777 super = iptr->
sx.
s23.s3.c.cls;
1778 superindex = super->
index;
1779 supervftbl = super->
vftbl;
1792 if (super == NULL) {
1800 iptr->
sx.
s23.s3.c.ref, disp);
1812 if (super == NULL) {
1820 iptr->
sx.
s23.s3.c.ref, 0);
1829 assert(
abs(superindex) <= 0xfff);
1835 assert(
abs(offset) <= 0xffff);
1851 if (super == NULL) {
1857 iptr->
sx.
s23.s3.c.ref,
1871 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
1882 if (super == NULL) {
1927 if (super == NULL) {
1944 var =
VAR(iptr->
sx.
s23.s2.args[s1]);
1966 iptr->
sx.
s23.s3.c.ref,
1996 os::abort(
"ICMD (%s, %d) not implemented yet on Aarch64!",
2044 stackoffset += stackoffset % 16;
2057 #if defined(ENABLE_GC_CACAO)
2135 for (i = md->
paramcount - 1, j = i + skipparams; i >= 0; i--, j--) {
2262 #if defined(ENABLE_GC_CACAO)
void ladd(u1 xd, u1 xn, u1 xm)
void ald(u1 xt, u1 xn, s2 imm)
void codegen_emit_instruction(jitdata *jd, instruction *iptr)
Generates machine code for one ICMD.
s4 dseg_add_double(codegendata *cd, double value)
#define BUILTIN_FAST_canstore
void fdiv(u1 st, u1 sn, u1 sm)
#define PATCHER_resolve_classref_to_flags
s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg)
void lmsub(u1 xd, u1 xn, u1 xm, u1 xa)
s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg)
void lcmp_imm(u1 xd, u2 imm)
void llsl_imm(u1 xd, u1 xn, u1 shift)
#define PATCHER_invokeinterface
#define emit_ldr_reg(cd, Xt, Xn, Xm)
s4 dseg_add_unique_address(codegendata *cd, void *value)
#define PATCHER_resolve_classref_to_vftbl
#define BUILTIN_multianewarray
#define IS_INT_LNG_TYPE(a)
void land(u1 xd, u1 xn, u1 xm)
void ior(u1 wd, u1 wn, u1 wm)
void llsl(u1 xd, u1 xn, u1 xm)
#define PATCHER_get_putfield
void ilsl(u1 wd, u1 wn, u1 wm)
s4 dseg_add_address(codegendata *cd, void *value)
void dst(u1 xt, u1 xn, s2 imm)
void lxor(u1 xd, u1 xn, u1 xm)
void emit_bcc(codegendata *cd, basicblock *target, s4 condition, u4 options)
void lcmn_imm(u1 xd, u2 imm)
void lconst(u1 xt, s8 value)
#define dseg_add_functionptr(cd, value)
void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int skipparams)
void ldrsh32(u1 wt, u1 xn, s2 imm)
typedef void(JNICALL *jvmtiEventSingleStep)(jvmtiEnv *jvmti_env
void ladd_shift(u1 xd, u1 xn, u1 xm, u1 shift, u1 amount)
Xd = Xn + shift(Xm, amount);.
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)
void emit_arraystore_check(codegendata *cd, instruction *iptr)
patchref_t * patcher_add_patch_ref(jitdata *jd, functionptr patcher, void *ref, s4 disp)
void dseg_add_target(codegendata *cd, basicblock *target)
void fst(u1 xt, u1 xn, s2 imm)
void llsr_imm(u1 xd, u1 xn, u1 shift)
java_object_t * codegen_finish_native_call(u1 *sp, u1 *pv)
void dmul(u1 dt, u1 dn, u1 dm)
void dadd(u1 dt, u1 dn, u1 dm)
const s4 abi_registers_integer_saved[]
void ist(u1 xt, u1 xn, s2 imm)
static int code_is_leafmethod(codeinfo *code)
#define BUILTIN_arraycheckcast
void iadd_imm(u1 xd, u1 xn, u4 imm)
s4 dseg_add_s4(codegendata *cd, s4 value)
void(* functionptr)(void)
java_handle_t * codegen_start_native_call(u1 *sp, u1 *pv)
#define PATCHER_instanceof_interface
#define IS_2_WORD_TYPE(a)
void ild(u1 xt, u1 xn, s2 imm)
void emit_exception_check(codegendata *cd, instruction *iptr)
void ast(u1 xt, u1 xn, s2 imm)
s4 codegen_reg_of_dst(jitdata *jd, instruction *iptr, s4 tempregnum)
void ilsl_imm(u1 wd, u1 wn, u1 shift)
void ladd_imm(u1 xd, u1 xn, u4 imm)
void cset(u1 xt, u1 cond)
void ilsr(u1 wd, u1 wn, u1 wm)
void llsr(u1 xd, u1 xn, u1 xm)
void icsneg(u1 wd, u1 wn, u1 wm, u1 cond)
void imul(u1 wd, u1 wn, u1 wm)
constant_FMIref * fieldref
void emit_label_br(codegendata *cd, s4 label)
s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
void ilsr_imm(u1 wd, u1 wn, u1 shift)
void lst(u1 xt, u1 xn, s2 imm)
void lsub_imm(u1 xd, u1 xn, u4 imm)
void imsub(u1 wd, u1 wn, u1 wm, u1 wa)
void emit_trap(codegendata *cd, u1 Xd, int type)
s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
s4 dseg_add_unique_s4(codegendata *cd, s4 value)
void isub_imm(u1 xd, u1 xn, u4 imm)
void fsub(u1 st, u1 sn, u1 sm)
void dld(u1 xt, u1 xn, s2 imm)
union instruction::@12 sx
void fmul(u1 st, u1 sn, u1 sm)
void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
void ldrsb32(u1 wt, u1 xn, s2 imm)
#define PATCHER_checkcast_interface
void ldiv(u1 xd, u1 xn, u1 xm)
void iadd(u1 xd, u1 xn, u1 xm)
icmdtable_entry_t icmd_table[256]
void emit_icmp_imm(codegendata *cd, int reg, int32_t value)
Emits code comparing a single register.
void emit_store_dst(jitdata *jd, instruction *iptr, s4 d)
void lor(u1 xd, u1 xn, u1 xm)
void lld(u1 xt, u1 xn, s2 imm)
#define PATCHER_invokestatic_special
void lda(u1 xd, u1 xn, s4 imm)
#define PATCHER_invokevirtual
void fadd(u1 st, u1 sn, u1 sm)
void dsub(u1 dt, u1 dn, u1 dm)
static bool IS_INMEMORY(s4 flags)
void codegen_emit_epilog(jitdata *jd)
Generates machine code for the method epilog.
void iasr_imm(u1 wd, u1 wn, u1 shift)
void iconst(u1 xt, s4 value)
void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
void lasr_imm(u1 xd, u1 xn, u1 shift)
void strb(u1 wt, u1 xn, s2 imm)
#define INSTRUCTION_IS_UNRESOLVED(iptr)
void isub(u1 xd, u1 xn, u1 xm)
void iasr(u1 wd, u1 wn, u1 wm)
struct instruction::@12::@13 s23
void codegen_emit_prolog(jitdata *jd)
Generates machine code for the method prolog.
const parseddesc_t parseddesc
#define PATCHER_resolve_classref_to_classinfo
void iand(u1 wd, u1 wn, u1 wm)
void lsub(u1 xd, u1 xn, u1 xm)
void strh(u1 wt, u1 xn, s2 imm)
void emit_label(codegendata *cd, s4 label)
void fld(u1 xt, u1 xn, s2 imm)
void lasr(u1 xd, u1 xn, u1 xm)
void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
void icsel(u1 wt, u1 wn, u1 wm, u1 cond)
void ldrh(u1 wt, u1 xn, s2 imm)
s4 dseg_add_float(codegendata *cd, float value)
void ddiv(u1 dt, u1 dn, u1 dm)
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
static VM * get_current()