92 offset += (offset % 16);
186 offset += (offset % 16);
227 int32_t
s1,
s2,
s3, d = 0;
348 asme.
iadd(d, s1, s2);
357 asme.
ladd(d, s1, s2);
368 if ((iptr->
sx.
val.
i >= 0) && (iptr->
sx.
val.
i <= 0xffffff)) {
370 }
else if ((-iptr->
sx.
val.
i >= 0) && (-iptr->
sx.
val.
i <= 0xffffff)) {
387 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffffff)) {
389 }
else if ((-iptr->
sx.
val.
l >= 0) && (-iptr->
sx.
val.
l <= 0xffffff)) {
403 asme.
isub(d, s1, s2);
412 asme.
lsub(d, s1, s2);
422 if ((iptr->
sx.
val.
i >= 0) && (iptr->
sx.
val.
i <= 0xffffff)) {
424 }
else if ((-iptr->
sx.
val.
i >= 0) && (-iptr->
sx.
val.
i <= 0xffffff)) {
440 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffffff)) {
442 }
else if ((-iptr->
sx.
val.
l >= 0) && (-iptr->
sx.
val.
l <= 0xffffff)) {
457 asme.
imul(d, s1, s2);
476 asme.
lmul(d, s1, s2);
542 asme.
idiv(d, s1, s2);
554 asme.
ldiv(d, s1, s2);
741 asme.
iand(d, s1, s2);
752 asme.
land(d, s1, s2);
837 asme.
ixor(d, s1, s2);
848 asme.
lxor(d, s1, s2);
902 asme.
fadd(d, s1, s2);
911 asme.
dadd(d, s1, s2);
920 asme.
fsub(d, s1, s2);
929 asme.
dsub(d, s1, s2);
938 if (d == s1 || d == s2) {
942 asme.
fmul(d, s1, s2);
952 if (d == s1 || d == s2) {
956 asme.
dmul(d, s1, s2);
966 asme.
fdiv(d, s1, s2);
975 asme.
ddiv(d, s1, s2);
1016 switch (iptr->
opc) {
1328 uf = iptr->
sx.
s23.s3.uf;
1335 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1336 fieldtype = fi->
type;
1346 switch (fieldtype) {
1348 asme.
ild(d, s1, disp);
1351 asme.
lld(d, s1, disp);
1354 asme.
ald(d, s1, disp);
1357 asme.
fld(d, s1, disp);
1360 asme.
dld(d, s1, disp);
1372 uf = iptr->
sx.
s23.s3.uf;
1378 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1379 fieldtype = fi->
type;
1392 switch (fieldtype) {
1394 asme.
ist(s2, s1, disp);
1397 asme.
lst(s2, s1, disp);
1400 asme.
ast(s2, s1, disp);
1403 asme.
fst(s2, s1, disp);
1406 asme.
dst(s2, s1, disp);
1425 }
else if ((-iptr->
sx.
val.
l) >= 0 && (-iptr->
sx.
val.
l) <= 0xfff) {
1457 bte = iptr->
sx.
s23.s3.bte;
1458 if (bte->
stub == NULL)
1475 um = iptr->
sx.
s23.s3.um;
1482 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1494 um = iptr->
sx.
s23.s3.um;
1500 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1515 um = iptr->
sx.
s23.s3.um;
1522 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1533 assert(
abs(s1) <= 0xffff);
1534 assert(
abs(s2) <= 0xffff);
1552 l = iptr->
sx.
s23.s2.tablelow;
1553 i = iptr->
sx.
s23.s3.tablehigh;
1558 }
else if (
abs(l) <= 32768) {
1606 super = iptr->
sx.
s23.s3.c.cls;
1607 superindex = super->
index;
1614 if (super == NULL) {
1621 iptr->
sx.
s23.s3.c.ref, disp);
1635 if (super != NULL) {
1642 if (super == NULL) {
1644 iptr->
sx.
s23.s3.c.ref, 0);
1650 assert(
abs(superindex) <= 0xfff);
1657 assert(
abs(offset) <= 0xffff);
1672 if (super == NULL) {
1678 iptr->
sx.
s23.s3.c.ref, disp);
1690 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
1698 if (super == NULL) {
1742 if (super == NULL) {
1760 iptr->
sx.
s23.s3.c.ref,
1797 super = iptr->
sx.
s23.s3.c.cls;
1798 superindex = super->
index;
1799 supervftbl = super->
vftbl;
1812 if (super == NULL) {
1820 iptr->
sx.
s23.s3.c.ref, disp);
1832 if (super == NULL) {
1840 iptr->
sx.
s23.s3.c.ref, 0);
1849 assert(
abs(superindex) <= 0xfff);
1855 assert(
abs(offset) <= 0xffff);
1871 if (super == NULL) {
1877 iptr->
sx.
s23.s3.c.ref,
1891 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
1902 if (super == NULL) {
1947 if (super == NULL) {
1964 var =
VAR(iptr->
sx.
s23.s2.args[s1]);
1986 iptr->
sx.
s23.s3.c.ref,
2016 os::abort(
"ICMD (%s, %d) not implemented yet on Aarch64!",
2064 stackoffset += stackoffset % 16;
2077 #if defined(ENABLE_GC_CACAO)
2155 for (i = md->
paramcount - 1, j = i + skipparams; i >= 0; i--, j--) {
2282 #if defined(ENABLE_GC_CACAO)
void ladd(u1 xd, u1 xn, u1 xm)
void strh(u1 wt, u1 xn, s4 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
void ast(u1 xt, u1 xn, s4 imm)
#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 strb(u1 wt, u1 xn, s4 imm)
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 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)
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 llsr_imm(u1 xd, u1 xn, u1 shift)
java_object_t * codegen_finish_native_call(u1 *sp, u1 *pv)
void fld(u1 xt, u1 xn, s4 imm)
void lst(u1 xt, u1 xn, s4 imm)
void dmul(u1 dt, u1 dn, u1 dm)
void ald(u1 xt, u1 xn, s4 imm)
void ist(u1 xt, u1 xn, s4 imm)
void dadd(u1 dt, u1 dn, u1 dm)
const s4 abi_registers_integer_saved[]
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 emit_exception_check(codegendata *cd, instruction *iptr)
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 ldrsb32(u1 wt, u1 xn, s4 imm)
void dld(u1 xt, u1 xn, s4 imm)
void imul(u1 wd, u1 wn, u1 wm)
constant_FMIref * fieldref
void emit_label_br(codegendata *cd, s4 label)
void ldrsh32(u1 wt, u1 xn, s4 imm)
s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
void ilsr_imm(u1 wd, u1 wn, u1 shift)
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)
union instruction::@12 sx
void fmul(u1 st, u1 sn, u1 sm)
void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
#define PATCHER_checkcast_interface
void ldiv(u1 xd, u1 xn, u1 xm)
void ldrh(u1 wt, u1 xn, s4 imm)
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)
#define PATCHER_invokestatic_special
void ild(u1 xt, u1 xn, s4 imm)
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)
#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.
void lld(u1 xt, u1 xn, s4 imm)
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 emit_label(codegendata *cd, s4 label)
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)
s4 dseg_add_float(codegendata *cd, float value)
void fst(u1 xt, u1 xn, s4 imm)
void ddiv(u1 dt, u1 dn, u1 dm)
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
static VM * get_current()
void dst(u1 xt, u1 xn, s4 imm)