323 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP2);
370 if ((iptr->
sx.
val.
i >= -32768) && (iptr->
sx.
val.
i <= 32767)) {
392 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
393 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
396 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
397 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP3);
405 s3 = iptr->
sx.
val.
l & 0xffffffff;
406 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
408 if ((s3 >= -32768) && (s3 <= 32767))
414 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
415 s3 = iptr->
sx.
val.
l >> 32;
441 if ((iptr->
sx.
val.
i >= -32767) && (iptr->
sx.
val.
i <= 32768))
452 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
453 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
456 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
457 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP3);
465 s3 = (-iptr->
sx.
val.
l) & 0xffffffff;
466 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
468 if ((s3 >= -32768) && (s3 <= 32767)) {
474 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
475 s3 = (-iptr->
sx.
val.
l) >> 32;
495 M_BNE(3 + (s1 != d));
497 M_BNE(1 + (s1 != d));
534 bte = iptr->
sx.
s23.s3.bte;
563 if ((iptr->
sx.
val.
i >= -32768) && (iptr->
sx.
val.
i <= 32767))
634 if (iptr->
sx.
val.
i & 0x1f)
672 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
673 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
676 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
677 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP3);
685 s3 = iptr->
sx.
val.
l & 0xffffffff;
686 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
688 if ((s3 >= 0) && (s3 <= 65535))
694 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
695 s3 = iptr->
sx.
val.
l >> 32;
696 if ((s3 >= 0) && (s3 <= 65535))
713 if (iptr->
sx.
val.
i >= 32768) {
722 int b=0, m = iptr->
sx.
val.
i;
756 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
757 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
760 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
761 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP3);
769 s3 = iptr->
sx.
val.
l & 0xffffffff;
770 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
772 if ((s3 >= 0) && (s3 <= 65535))
778 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
779 s3 = iptr->
sx.
val.
l >> 32;
780 if ((s3 >= 0) && (s3 <= 65535))
814 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
815 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
818 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
819 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP3);
827 s3 = iptr->
sx.
val.
l & 0xffffffff;
828 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
830 if ((s3 >= 0) && (s3 <= 65535))
836 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
837 s3 = iptr->
sx.
val.
l >> 32;
838 if ((s3 >= 0) && (s3 <= 65535))
849 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP3);
850 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
852 vm_abort(
"codegen: implement ICMD_LCMP!");
1173 s3 = emit_load_s3_high(jd, iptr,
REG_ITMP3);
1179 s3 = emit_load_s3_low(jd, iptr,
REG_ITMP3);
1250 uf = iptr->
sx.
s23.s3.uf;
1257 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1258 fieldtype = fi->
type;
1263 switch (fieldtype) {
1303 uf = iptr->
sx.
s23.s3.uf;
1308 fi = iptr->
sx.
s23.s3.fmiref->p.field;
1309 fieldtype = fi->
type;
1326 switch (fieldtype) {
1328 M_IST(s2, s1, disp);
1335 M_AST(s2, s1, disp);
1338 M_FST(s2, s1, disp);
1341 M_DST(s2, s1, disp);
1367 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1368 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1369 if (iptr->
sx.
val.
l == 0) {
1372 else if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1389 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1390 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1391 if (iptr->
sx.
val.
l == 0) {
1396 else if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1418 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1419 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1425 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1445 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1446 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1447 if (iptr->
sx.
val.
l == 0) {
1450 else if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1467 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1468 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1474 if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1494 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1495 s2 = emit_load_s1_high(jd, iptr,
REG_ITMP2);
1496 if (iptr->
sx.
val.
l == 0) {
1501 else if ((iptr->
sx.
val.
l >= 0) && (iptr->
sx.
val.
l <= 0xffff)) {
1523 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1524 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1527 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1528 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1536 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1537 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1540 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1541 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1548 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1549 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1553 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1554 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1562 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1563 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1567 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1568 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1576 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1577 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1581 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1582 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1590 s1 = emit_load_s1_high(jd, iptr,
REG_ITMP1);
1591 s2 = emit_load_s2_high(jd, iptr,
REG_ITMP2);
1595 s1 = emit_load_s1_low(jd, iptr,
REG_ITMP1);
1596 s2 = emit_load_s2_low(jd, iptr,
REG_ITMP2);
1609 l = iptr->
sx.
s23.s2.tablelow;
1610 i = iptr->
sx.
s23.s3.tablehigh;
1615 else if (l <= 32768)
1627 emit_bgt(cd, table[0].
block);
1651 bte = iptr->
sx.
s23.s3.bte;
1652 if (bte->
stub == NULL)
1671 um = iptr->
sx.
s23.s3.um;
1678 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1692 um = iptr->
sx.
s23.s3.um;
1698 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1715 um = iptr->
sx.
s23.s3.um;
1722 lm = iptr->
sx.
s23.s3.fmiref->p.method;
1753 super = iptr->
sx.
s23.s3.c.cls;
1754 superindex = super->
index;
1761 if (super == NULL) {
1769 iptr->
sx.
s23.s3.c.ref,
1780 if (super == NULL) {
1783 iptr->
sx.
s23.s3.c.ref,
1811 if (super == NULL) {
1817 iptr->
sx.
s23.s3.c.ref,
1830 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
1837 if (super == NULL) {
1880 if (super == NULL) {
1897 iptr->
sx.
s23.s3.c.ref,
1929 super = iptr->
sx.
s23.s3.c.cls;
1930 superindex = super->
index;
1943 if (super == NULL) {
1951 iptr->
sx.
s23.s3.c.ref, disp);
1961 if (super == NULL) {
1969 iptr->
sx.
s23.s3.c.ref, 0);
1997 if (super == NULL) {
2003 iptr->
sx.
s23.s3.c.ref,
2017 if (super == NULL || super->
vftbl->subtype_depth >= DISPLAY_SIZE) {
2027 if (super == NULL) {
2074 if (super == NULL) {
2090 var =
VAR(iptr->
sx.
s23.s2.args[s1]);
2097 #if defined(__DARWIN__)
2115 iptr->
sx.
s23.s3.c.ref, disp);
2126 #if defined(__DARWIN__)
2147 vm_abort(
"Unknown ICMD %d during code generation", iptr->
opc);
2211 #if defined(ENABLE_GC_CACAO)
2288 for (i = md->
paramcount - 1, j = i + skipparams; i >= 0; i--, j--) {
2428 #if defined(ENABLE_GC_CACAO)
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
#define PATCHER_resolve_classref_to_flags
s4 emit_load_s3(jitdata *jd, instruction *iptr, s4 tempreg)
s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg)
#define M_ALD(a, b, disp)
#define PATCHER_invokeinterface
#define M_LST(a, b, disp)
#define M_RLWINM(a, b, c, d, e)
#define M_ILD(a, b, disp)
s4 dseg_add_unique_address(codegendata *cd, void *value)
#define PATCHER_resolve_classref_to_vftbl
#define BUILTIN_multianewarray
#define IS_INT_LNG_TYPE(a)
#define M_IST(a, b, disp)
#define M_LDA(a, b, disp)
#define PATCHER_get_putfield
#define M_IOR_TST(a, b, d)
s4 dseg_add_address(codegendata *cd, void *value)
#define REG_ITMP12_PACKED
void emit_bcc(codegendata *cd, basicblock *target, s4 condition, u4 options)
#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
#define M_SUBFIC(a, b, c)
#define M_LDATST(a, b, c)
#define M_STFIWX(a, b, c)
void emit_arraystore_check(codegendata *cd, instruction *iptr)
#define M_FST(a, b, disp)
patchref_t * patcher_add_patch_ref(jitdata *jd, functionptr patcher, void *ref, s4 disp)
#define M_FLD(a, b, disp)
void dseg_add_target(codegendata *cd, basicblock *target)
java_object_t * codegen_finish_native_call(u1 *sp, u1 *pv)
const s4 abi_registers_integer_saved[]
static int code_is_leafmethod(codeinfo *code)
#define BUILTIN_arraycheckcast
void vm_abort(const char *text,...)
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)
#define M_XOR_IMM(a, b, c)
constant_FMIref * fieldref
void emit_label_br(codegendata *cd, s4 label)
s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
#define M_STWU(a, b, disp)
#define REG_ITMP23_PACKED
#define M_ALD_INTERN(a, b, disp)
#define M_SRL_IMM(a, b, c)
s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
s4 dseg_add_unique_s4(codegendata *cd, s4 value)
#define M_AST(a, b, disp)
union instruction::@12 sx
void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
#define PATCHER_checkcast_interface
void emit_store_dst(jitdata *jd, instruction *iptr, s4 d)
#define PATCHER_invokestatic_special
#define M_SRA_IMM(a, b, c)
#define PATCHER_invokevirtual
#define M_SLL_IMM(a, b, c)
#define M_IMUL_IMM(a, b, c)
static bool IS_INMEMORY(s4 flags)
void codegen_emit_epilog(jitdata *jd)
Generates machine code for the method epilog.
#define M_LLD_INTERN(a, b, disp)
#define M_AST_INTERN(a, b, c)
void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
#define M_DST(a, b, disp)
#define INSTRUCTION_IS_UNRESOLVED(iptr)
struct instruction::@12::@13 s23
void codegen_emit_prolog(jitdata *jd)
Generates machine code for the method prolog.
#define M_IAND_IMM(a, b, d)
#define M_LLD(a, b, disp)
const parseddesc_t parseddesc
static void emit_fmove(codegendata *cd, int s, int d)
Generates a float-move from register s to d.
#define M_IOR_IMM(a, b, d)
#define PATCHER_resolve_classref_to_classinfo
void emit_label(codegendata *cd, s4 label)
#define M_IADD_IMM(a, b, c)
void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
#define M_DLD(a, b, disp)
#define M_LDAH(a, b, disp)
s4 dseg_add_float(codegendata *cd, float value)
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
static VM * get_current()
#define REG_RESULT_PACKED
#define M_ILD_INTERN(a, b, disp)