51 #include "codegen.hpp"
94 #if defined(ENABLE_SSA)
97 #elif defined(ENABLE_LSRA)
101 #if defined(ENABLE_INTRP)
106 STAT_REGISTER_VAR(
int,count_branches_unresolved,0,
"unresolved branches",
"unresolved branches")
108 STAT_REGISTER_GROUP_VAR(
u8,count_calls_java_to_native,0,"calls java to native","java-to-native calls",function_call_stat)
117 using namespace cacao;
167 #if defined(ENABLE_INTRP)
176 cd->ncodeptr = cd->ncodebase;
178 cd->lastinstwithoutdispatch = ~0;
179 cd->superstarts = NULL;
188 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
189 cd->datareferences = NULL;
229 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
230 cd->datareferences = NULL;
249 #if defined(ENABLE_REPLACEMENT)
250 code->rplpoints = NULL;
251 code->rplpointcount = 0;
252 code->regalloc = NULL;
253 code->regalloccount = 0;
254 code->globalcount = 0;
302 os::abort(
"codegen_generate: unknown error occurred during codegen_emit: flags=%x\n", cd->
flags);
359 #if defined(__I386__) || defined(__MIPS__) || defined(__X86_64__) || defined(ENABLE_INTRP) \
360 || defined(__SPARC_64__)
375 #if defined(ENABLE_INTRP)
382 oldncodebase = cd->ncodebase;
394 return (cd->ncodebase + (ncodeptr - oldncodebase));
447 assert(bptr->
mpc >= 0);
496 #if defined(ENABLE_REPLACEMENT)
498 void codegen_set_replacement_point_notrap(
codegendata *cd,
s4 type)
500 void codegen_set_replacement_point_notrap(
codegendata *cd)
503 assert(cd->replacementpoint);
504 assert(cd->replacementpoint->type == type);
505 assert(cd->replacementpoint->
flags & rplpoint::FLAG_NOTRAP);
509 cd->replacementpoint++;
520 #if defined(ENABLE_REPLACEMENT)
524 void codegen_set_replacement_point(
codegendata *cd)
527 assert(cd->replacementpoint);
528 assert(cd->replacementpoint->type == type);
529 assert(!(cd->replacementpoint->
flags & rplpoint::FLAG_NOTRAP));
533 cd->replacementpoint++;
537 if (opt_TestReplacement)
559 #if defined(ENABLE_INTRP)
575 #if defined(ENABLE_INTRP)
588 #if defined(ENABLE_INTRP)
590 ncodelen = cd->ncodeptr - cd->ncodebase;
597 alignedlen = alignedmcodelen + cd->
dseglen;
599 #if defined(ENABLE_INTRP)
601 alignedlen += ncodelen;
623 #if defined(ENABLE_INTRP)
632 MCOPY((
void *) ncodebase, cd->ncodebase,
u1, ncodelen);
640 cd->ncodebase = ncodebase;
643 cd->ncodebase = NULL;
675 #if defined(ENABLE_REPLACEMENT)
681 rp = code->rplpoints;
682 for (i=0; i<code->rplpointcount; ++
i, ++rp) {
692 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
695 dseg_resolve_datareferences(jd);
709 #if defined(__AARCH64__)
713 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
714 uint8_t *get_datasp()
const {
return sp + framesize - SIZEOF_VOID_P; }
715 uint8_t *get_javasp()
const {
return sp + framesize; }
716 uint64_t *get_arg_regs()
const {
return (uint64_t *)
sp; }
717 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
718 uint64_t *get_ret_regs()
const {
return (uint64_t *)
sp; }
720 #elif defined(__ALPHA__)
724 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
725 uint8_t *get_datasp()
const {
return sp + framesize - SIZEOF_VOID_P; }
726 uint8_t *get_javasp()
const {
return sp + framesize; }
727 uint64_t *get_arg_regs()
const {
return (uint64_t *)
sp; }
728 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
729 uint64_t *get_ret_regs()
const {
return (uint64_t *)
sp; }
731 #elif defined(__ARM__)
735 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
736 uint8_t *get_datasp()
const {
return sp + framesize - SIZEOF_VOID_P; }
737 uint8_t *get_javasp()
const {
return sp + framesize; }
738 uint64_t *get_arg_regs()
const {
return (uint64_t *)
sp; }
739 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
740 uint64_t *get_ret_regs()
const {
return (uint64_t *)
sp; }
742 #elif defined(__I386__)
746 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
747 uint8_t *get_datasp()
const {
return sp + framesize; }
748 uint8_t *get_javasp()
const {
return sp + framesize + SIZEOF_VOID_P; }
749 uint64_t *get_arg_regs()
const {
return (uint64_t *)
sp; }
750 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
751 uint64_t *get_ret_regs()
const {
return (uint64_t *) (
sp + 2 * SIZEOF_VOID_P); }
753 #elif defined(__MIPS__)
757 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
759 uint8_t *get_datasp()
const {
return sp + framesize - 8; }
760 uint8_t *get_javasp()
const {
return sp + framesize; }
761 uint64_t *get_arg_regs()
const {
762 # if SIZEOF_VOID_P == 8
763 return (uint64_t *)
sp;
765 return (uint64_t *) (
sp + 5 * 8);
768 uint64_t *get_ret_regs()
const {
769 # if SIZEOF_VOID_P == 8
770 return (uint64_t *)
sp;
772 return (uint64_t *) (
sp + 1 * 8);
775 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
777 #elif defined(__S390__)
781 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
782 uint8_t *get_datasp()
const {
return sp + framesize - 8; }
783 uint8_t *get_javasp()
const {
return sp + framesize; }
784 uint64_t *get_arg_regs()
const {
return (uint64_t *) (
sp + 96); }
785 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
786 uint64_t *get_ret_regs()
const {
return (uint64_t *) (
sp + 96); }
788 #elif defined(__POWERPC__)
792 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
793 uint8_t *get_datasp()
const {
return sp + framesize; }
794 uint8_t *get_javasp()
const {
return sp + framesize; }
795 uint64_t *get_arg_regs()
const {
796 return (uint64_t *) (
sp +
LA_SIZE + 4 * SIZEOF_VOID_P);
798 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
799 uint64_t *get_ret_regs()
const {
800 return (uint64_t *) (
sp +
LA_SIZE + 2 * SIZEOF_VOID_P);
803 #elif defined(__POWERPC64__)
807 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
808 uint8_t *get_datasp()
const {
return sp + framesize; }
809 uint8_t *get_javasp()
const {
return sp + framesize; }
810 uint64_t *get_arg_regs()
const {
813 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
814 uint64_t *get_ret_regs()
const {
818 #elif defined(__X86_64__)
822 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {}
823 uint8_t *get_datasp()
const {
return sp + framesize; }
824 uint8_t *get_javasp()
const {
return sp + framesize + SIZEOF_VOID_P; }
825 uint64_t *get_arg_regs()
const {
return (uint64_t *)
sp; }
826 uint64_t *get_arg_stack()
const {
return (uint64_t *) get_javasp(); }
827 uint64_t *get_ret_regs()
const {
return (uint64_t *)
sp; }
834 FrameInfo(
u1 *
sp, int32_t framesize) : sp(sp), framesize(framesize) {
837 os::abort(
"codegen_start_native_call: unsupported architecture");
839 uint8_t *get_datasp()
const {
return NULL; }
840 uint8_t *get_javasp()
const {
return NULL; }
841 uint64_t *get_arg_regs()
const {
return NULL; }
842 uint64_t *get_arg_stack()
const {
return NULL; }
843 uint64_t *get_ret_regs()
const {
return NULL; }
895 assert(code != NULL);
906 FrameInfo FI(sp,framesize);
908 uint8_t *datasp = FI.get_datasp();
910 #if defined(ENABLE_HANDLES) || ( !defined(NDEBUG) && !defined(__ARM__) )
911 uint64_t *arg_regs = FI.get_arg_regs();
912 uint64_t *arg_stack = FI.get_arg_stack();
921 #if defined(ENABLE_JNI)
928 # if defined(__AARCH64__) || defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__)
937 #if defined(ENABLE_HANDLES)
981 assert(code != NULL);
986 #if defined(ENABLE_HANDLES) || !defined(NDEBUG)
993 FrameInfo FI(sp,framesize);
995 uint8_t *datasp = FI.get_datasp();
996 #if defined(ENABLE_HANDLES) || ( !defined(NDEBUG) && !defined(__ARM__) )
997 uint64_t *ret_regs = FI.get_ret_regs();
1008 #if defined(ENABLE_HANDLES)
1023 #if defined(ENABLE_JNI)
1030 #if !defined(NDEBUG)
1031 # if defined(__AARCH64__) || defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__)
1105 #if !defined(__I386__)
1116 #if defined(ENABLE_SSA)
1118 bool last_cmd_was_goto =
false;
1122 int32_t savedregs_num = 0;
1130 #if STACKFRAME_RA_TOP_OF_FRAME
1131 # if STACKFRAME_LEAFMETHODS_RA_REGISTER
1157 #if defined(SPECIALMEMUSE)
1178 #if defined(__I386__)
1192 #if defined(ENABLE_PROFILING)
1197 emit_profile_method(cd, code);
1200 emit_profile_cycle_start(cd, code);
1211 #if !defined(NDEBUG)
1217 #if defined(ENABLE_SSA)
1245 #if defined(ENABLE_REPLACEMENT) && defined(__I386__)
1249 if (cd->replacementpoint[-1].
flags & rplpoint::FLAG_COUNTDOWN) {
1256 #if defined(ENABLE_PROFILING)
1261 emit_profile_basicblock(cd, code, bptr);
1265 emit_profile_cycle_start(cd, code);
1270 int32_t indepth = bptr->indepth;
1275 #if defined(ENABLE_SSA)
1278 last_cmd_was_goto =
false;
1280 #elif defined(ENABLE_LSRA)
1282 while (indepth > 0) {
1284 var =
VAR(bptr->invars[indepth]);
1298 while (indepth > 0) {
1300 var =
VAR(bptr->invars[indepth]);
1312 #if defined(ENABLE_SSA) || defined(ENABLE_LSRA)
1317 int32_t len = bptr->icount;
1318 uint16_t currentline = 0;
1319 for (
instruction* iptr = bptr->iinstr; len > 0; len--, iptr++) {
1322 if (iptr->line != currentline) {
1324 currentline = iptr->line;
1334 switch (iptr->opc) {
1354 #if defined(ENABLE_SSA)
1389 ICONST(d, iptr->sx.val.i);
1396 LCONST(d, iptr->sx.val.l);
1516 #if !defined(ENABLE_SOFTFLOAT)
1601 #if defined(__I386__)
1620 fi = iptr->sx.s23.s3.fmiref->p.field;
1621 fieldtype = fi->
type;
1639 switch (fieldtype) {
1645 #if defined(ENABLE_SOFTFLOAT)
1652 #if defined(ENABLE_SOFTFLOAT)
1658 #if !defined(ENABLE_SOFTFLOAT)
1679 #if defined(__I386__)
1686 #if defined(USES_PATCHABLE_MEMORY_BARRIER)
1695 #if defined(USES_PATCHABLE_MEMORY_BARRIER)
1703 fi = iptr->sx.s23.s3.fmiref->p.field;
1704 fieldtype = fi->
type;
1720 switch (fieldtype) {
1726 #if defined(ENABLE_SOFTFLOAT)
1733 #if defined(ENABLE_SOFTFLOAT)
1739 #if !defined(ENABLE_SOFTFLOAT)
1750 #if defined(USES_PATCHABLE_MEMORY_BARRIER)
1768 #ifdef ENABLE_VERIFIER
1783 #if defined(ENABLE_SSA)
1787 last_cmd_was_goto =
true;
1788 codegen_emit_phi_moves(jd, bptr);
1800 emit_br(cd, iptr->sx.s23.s3.jsrtarget.block);
1809 #if SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
1811 #elif SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
1815 # error Unable to generate code for this configuration!
1832 #if SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
1833 if (iptr->sx.val.i == 0) {
1840 #elif SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
1845 # error Unable to generate code for this configuration!
1869 #if SUPPORT_BRANCH_CONDITIONAL_TWO_INTEGER_REGISTERS
1870 switch (iptr->opc) {
1872 emit_beq(cd, iptr->dst.block, s1, s2);
1875 emit_bne(cd, iptr->dst.block, s1, s2);
1880 #elif SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
1883 #elif SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
1885 switch (iptr->opc) {
1887 emit_bnez(cd, iptr->dst.block,
REG_ITMP1);
1890 emit_beqz(cd, iptr->dst.block,
REG_ITMP1);
1896 # error Unable to generate code for this configuration!
1905 #if SUPPORT_BRANCH_CONDITIONAL_TWO_INTEGER_REGISTERS
1908 switch (iptr->opc) {
1910 emit_beq(cd, iptr->dst.block, s1, s2);
1913 emit_bne(cd, iptr->dst.block, s1, s2);
1930 #if SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
1931 # if defined(__I386__) || defined(__X86_64__)
1938 #elif SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
1942 # error Unable to generate code for this configuration!
1962 goto nowperformreturn;
1971 #ifdef ENABLE_VERIFIER
1979 goto nowperformreturn;
1982 #if defined(ENABLE_SOFTFLOAT)
1990 goto nowperformreturn;
1993 #if defined(ENABLE_SOFTFLOAT)
2001 goto nowperformreturn;
2003 #if !defined(ENABLE_SOFTFLOAT)
2008 #if defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2013 goto nowperformreturn;
2019 #if defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2024 goto nowperformreturn;
2028 #if !defined(NDEBUG)
2051 bte = iptr->sx.s23.s3.bte;
2054 #if defined(ENABLE_ESCAPE_REASON) && defined(__I386__)
2055 if (bte->
fp == BUILTIN_escape_reason_new) {
2056 void set_escape_reasons(
void *);
2077 emit_fastpath(jd, iptr, d);
2084 #if SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
2085 os::abort(
"codegen_emit: Implement jump over slow-path for this configuration.");
2086 #elif SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
2090 # error Unable to generate code for this configuration!
2108 methodinfo* lm = iptr->sx.s23.s3.fmiref->p.method;
2119 for (i = i - 1; i >= 0; i--) {
2120 var =
VAR(iptr->sx.s23.s2.args[i]);
2128 switch (var->
type) {
2131 #if defined(ENABLE_SOFTFLOAT)
2139 #if defined(ENABLE_SOFTFLOAT)
2146 #if !defined(ENABLE_SOFTFLOAT)
2148 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2158 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2173 switch (var->
type) {
2182 #if defined(ENABLE_SOFTFLOAT)
2185 #if SIZEOF_VOID_P == 4
2194 #if defined(ENABLE_SOFTFLOAT)
2203 #if !defined(ENABLE_SOFTFLOAT)
2240 #if defined(ENABLE_SSA)
2248 #if defined(ENABLE_SOFTFLOAT)
2258 #if defined(ENABLE_SOFTFLOAT)
2267 #if !defined(ENABLE_SOFTFLOAT)
2269 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2280 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
2315 i = iptr->sx.s23.s2.lookupcount;
2323 for (
lookup_target_t* lookup = iptr->dst.lookup; i > 0; ++lookup, --i) {
2324 #if SUPPORT_BRANCH_CONDITIONAL_CONDITION_REGISTER
2326 emit_beq(cd, lookup->target.block);
2327 #elif SUPPORT_BRANCH_CONDITIONAL_TWO_INTEGER_REGISTERS
2329 emit_beq(cd, lookup->target.block, s1,
REG_ITMP2);
2330 #elif SUPPORT_BRANCH_CONDITIONAL_ONE_INTEGER_REGISTER
2332 emit_bnez(cd, lookup->target.block,
REG_ITMP2);
2334 # error Unable to generate code for this configuration!
2339 emit_br(cd, iptr->sx.s23.s3.lookupdefault.block);
2360 #if defined(ENABLE_SSA)
2364 if (!last_cmd_was_goto)
2365 codegen_emit_phi_moves(jd, bptr);
2369 #if defined(__I386__) || defined(__MIPS__) || defined(__S390__) || defined(__SPARC_64__) || defined(__X86_64__)
2409 #if defined(ENABLE_SSA)
2430 #if defined(SSA_DEBUG_VERBOSE)
2432 printf(
"BB %3i Move %3i <- %3i ", bptr->
nr, lt_d, lt_s);
2435 #if defined(SSA_DEBUG_VERBOSE)
2437 printf(
" ... not processed \n");
2447 #if defined(SSA_DEBUG_VERBOSE)
2449 printf(
"...returning - phi lifetimes where joined\n");
2455 #if defined(SSA_DEBUG_VERBOSE)
2457 printf(
"...returning - phi lifetimes where joined\n");
2467 #if defined(SSA_DEBUG_VERBOSE)
void codegen_emit_instruction(jitdata *jd, instruction *iptr)
Generates machine code for one ICMD.
#define CODEGENDATA_FLAG_ERROR
s4 emit_load_s1(jitdata *jd, instruction *iptr, s4 tempreg)
static void codegen_reset(jitdata *jd)
#define M_ALD(a, b, disp)
void localref_native_exit(methodinfo *m, uint64_t *return_regs)
#define STATISTICS(x)
Wrapper for statistics only code.
DumpList< Linenumber > * linenumbers
List of line numbers.
#define REPLACEMENT_POINT_FORGC_BUILTIN(cd, iptr)
#define REPLACEMENT_POINTS_INIT(cd, jd)
#define STACKFRAME_SYNC_NEEDS_TWO_SLOTS
void emit_monitor_exit(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to leave a monitor.
#define M_LST(a, b, disp)
#define STAT_REGISTER_SUM_SUBGROUP(var, name, description, group)
Register a statistics summary group.
void linenumbertable_list_entry_add(codegendata *cd, int32_t linenumber)
#define JITDATA_HAS_FLAG_VERBOSECALL(jd)
#define M_ILD(a, b, disp)
methodinfo * code_get_methodinfo_for_pv(void *pv)
s4 dseg_add_unique_address(codegendata *cd, void *value)
#define M_IST(a, b, disp)
Linenumber table of a Java method.
void dynamic_super_rewrite(codegendata *cd)
#define DMREALLOC(ptr, type, num1, num2)
#define PATCHER_CALL_SIZE
void emit_monitor_enter(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to enter a monitor.
void log_message_method(const char *msg, methodinfo *m)
#define REPLACEMENT_POINT_INLINE_START(cd, iptr)
#define M_AADD_IMM(a, b, c)
#define M_CAST_L2D(a, Fb)
static void fixup_exc_handler_interface(jitdata *jd, basicblock *bptr)
Fix up register locations in the case where control is transferred to an exception handler block via ...
s4 dseg_add_address(codegendata *cd, void *value)
s4 codegen_reg_of_var(u2 opcode, varinfo *v, s4 tempregnum)
void emit_bcc(codegendata *cd, basicblock *target, s4 condition, u4 options)
void localref_table_remove()
#define JITDATA_HAS_FLAG_INSTRUMENT(jd)
#define PATCHER_resolve_class
static void emit_lmove(codegendata *cd, int s, int d)
Generates a long-move from register s to d.
#define M_CAST_D2L(Fa, b)
typedef void(JNICALL *jvmtiEventSingleStep)(jvmtiEnv *jvmti_env
struct lifetime * lifetime
#define REPLACEMENT_POINT_BLOCK_START(cd, bptr)
#define M_FST(a, b, disp)
void localref_native_enter(methodinfo *m, uint64_t *argument_regs, uint64_t *argument_stack)
patchref_t * patcher_add_patch_ref(jitdata *jd, functionptr patcher, void *ref, s4 disp)
#define BBFLAG_REPLACEMENT
void patcher_resolve(codeinfo *code)
Resolve all patchers in the current JIT run.
#define M_FLD(a, b, disp)
void trace_java_call_exit(methodinfo *m, uint64_t *return_regs)
void codegen_increase(codegendata *cd)
#define PATCHER_breakpoint
java_object_t * codegen_finish_native_call(u1 *sp, u1 *pv)
#define CODEGENDATA_HAS_FLAG_LONGBRANCHES(cd)
#define CODEGENDATA_FLAG_LONGBRANCHES
JNIEnv jthread jobject jclass jlong size
void emit_recompute_pv(codegendata *cd)
Emit code to recompute the procedure vector.
#define PATCHER_get_putstatic
static int code_is_leafmethod(codeinfo *code)
void md_cacheflush(u1 *addr, s4 nbytes)
void(* functionptr)(void)
void emit_verbosecall_enter(jitdata *jd)
java_handle_t * codegen_start_native_call(u1 *sp, u1 *pv)
int opt_TraceBuiltinCalls
#define CODEGENDATA_HAS_FLAG_ERROR(cd)
#define STACKFRAME_RA_BETWEEN_FRAMES
#define LLNI_classinfo_wrap(classinfo)
s4 codegen_reg_of_dst(jitdata *jd, instruction *iptr, s4 tempregnum)
void trace_java_call_enter(methodinfo *m, uint64_t *arg_regs, uint64_t *stack)
void codegen_resolve_branchrefs(codegendata *cd, basicblock *bptr)
#define PROFILE_CYCLE_STOP
void emit_patcher_traps(jitdata *jd)
constant_FMIref * fieldref
void localref_frame_pop_all(void)
This file contains the statistics framework.
s4 emit_load_s2(jitdata *jd, instruction *iptr, s4 tempreg)
static codeinfo * code_get_codeinfo_for_pv(void *pv)
#define STAT_REGISTER_GROUP_VAR(type, var, init, name, description, group)
Register an statistics variable and add it to a group.
static void * reallocate(void *src, size_t len1, size_t len2)
Stupid realloc implementation for dump memory.
Type
Types used internally by JITTED code.
void exceptions_throw_internalerror(const char *message,...)
void linenumbertable_list_entry_add_inline_start(codegendata *cd, instruction *iptr)
void dseg_finish(jitdata *jd)
void patcher_list_reset(codeinfo *code)
#define M_ASUB_IMM(a, b, c)
#define exceptions_get_and_clear_exception
#define STAT_REGISTER_GROUP(var, name, description)
Register a statistics group.
#define REPLACEMENT_POINT_FORGC_BUILTIN_RETURN(cd, iptr)
s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
basicblock ** basicblocks
void stacktrace_stackframeinfo_add(stackframeinfo_t *sfi, void *pv, void *sp, void *ra, void *xpc)
s4 dseg_add_unique_s4(codegendata *cd, s4 value)
void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
DumpList< branch_label_ref_t * > * brancheslabel
void codegen_branch_label_add(codegendata *cd, s4 label, s4 condition, s4 reg, u4 options)
#define M_AST(a, b, disp)
struct localref_table localref_table
#define REPLACEMENT_POINT_INLINE_BODY(cd, iptr)
#define M_CAST_I2F(a, Fb)
#define REPLACEMENT_POINT_RETURN(cd, iptr)
#define REPLACEMENT_POINT_INVOKE(cd, iptr)
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)
functionptr emit_fastpath
void emit_copy(jitdata *jd, instruction *iptr)
void codegen_setup(jitdata *jd)
void exceptiontable_create(jitdata *jd)
constant_FMIref * methodref
void emit_icmpeq_imm(codegendata *cd, int reg, int32_t value, int d)
Emits code comparing one integer register to an immediate value.
int32_t synchronizedoffset
void stacktrace_stackframeinfo_remove(stackframeinfo_t *sfi)
static bool IS_INMEMORY(s4 flags)
void codegen_emit_epilog(jitdata *jd)
Generates machine code for the method epilog.
LinenumberTable * linenumbertable
#define REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr)
#define STAT_DECLARE_GROUP(var)
Declare an external group (or subgroup).
void codegen_add_branch_ref(codegendata *cd, basicblock *target, s4 condition, s4 reg, u4 options)
#define M_ALD_DSEG(a, disp)
static void * allocate(size_t size)
#define MEMORY_ALIGN(pos, size)
void methodtree_insert(void *startpc, void *endpc)
static bool class_is_or_almost_initialized(classinfo *c)
static int code_is_synchronized(codeinfo *code)
#define PATCHER_initialize_class
#define M_DST(a, b, disp)
#define INSTRUCTION_IS_UNRESOLVED(iptr)
#define M_CAST_F2I(Fa, b)
void codegen_emit_prolog(jitdata *jd)
Generates machine code for the method prolog.
#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.
bool codegen_generate(jitdata *jd)
#define MCOPY(dest, src, type, num)
void emit_label(codegendata *cd, s4 label)
void linenumbertable_list_entry_add_inline_end(codegendata *cd, instruction *iptr)
void emit_bccz(codegendata *cd, basicblock *target, s4 condition, s4 reg, u4 options)
static void emit_dmove(codegendata *cd, int s, int d)
Generates an double-move from register s to d.
static void emit_imove(codegendata *cd, int s, int d)
Generates an integer-move from register s to d.
void localref_table_add(localref_table *lrt)
#define M_DLD(a, b, disp)
#define STAT_REGISTER_VAR(type, var, init, name, description)
Register an external statistics variable.
void emit_verbosecall_exit(jitdata *jd)
void emit_br(codegendata *cd, basicblock *target)
void emit_trap_countdown(codegendata *cd, s4 *counter)
const char const void jint length
bool opt_AlwaysEmitLongBranches
void codegen_emit_patchable_barrier(instruction *iptr, codegendata *cd, patchref_t *pr, fieldinfo *fi)
Generates a memory barrier to be used after volatile writes.
#define LA_SIZE_IN_POINTERS
bool codegen_emit(jitdata *jd)
Generates machine code.
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
static int32_t md_stacktrace_get_framesize(codeinfo *code)
Returns the size (in bytes) of the current stackframe, specified by the passed codeinfo structure...
#define PROFILE_CYCLE_START
void codegen_finish(jitdata *jd)