📄 icode.c
字号:
#if defined(HAVE_load_constpool_ref) slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_ref, Tnull);#else { SlotInfo* tmp; slot_alloctmp(tmp); move_label_const(tmp, l); load_ref(dst, tmp); slot_freetmp(tmp); }#endif }}voidmove_string_const(SlotInfo* dst, void *val){#if 1 move_ref_const(dst, val);#else label* l; constpool *c; SlotInfo* tmp; c = KaffeJIT3_newConstant(CPstring, val); l = KaffeJIT3_newLabel(); l->type = Lconstant; l->at = 0; l->to = (uintp)c; l->from = 0;#if defined(HAVE_load_constpool_ref) slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_ref, Tnull);#else slot_alloctmp(tmp); move_label_const(tmp, l); load_ref(dst, tmp); slot_freetmp(tmp);#endif#endif}voidmove_long_const(SlotInfo* dst, jlong val){#if defined(HAVE_move_long_const) if (HAVE_move_long_const_rangecheck(val)) { lslot_slot_lconst(dst, 0, val, HAVE_move_long_const, Tconst); } else { constpool *c; label* l; SlotInfo* tmp; c = KaffeJIT3_newConstant(CPlong, val); l = KaffeJIT3_newLabel(); l->type = Lconstant; l->at = 0; l->to = (uintp)c; l->from = 0;#if defined(HAVE_load_constpool_long) slot_slot_const(dst, 0, (jword)l, HAVE_load_constpool_long, Tnull);#else slot_alloctmp(tmp); move_label_const(tmp, l); load_long(dst, tmp); slot_freetmp(tmp);#endif }#else#if defined(WORDS_BIGENDIAN) /* * Switch the ordering so that we get a better register allocation * ordering and don't have to swap immediately afterwards. (sigh) */ move_int_const(HSLOT(dst), (jint)((val >> 32) & 0xFFFFFFFF)); move_int_const(LSLOT(dst), (jint)(val & 0xFFFFFFFF));#else move_int_const(LSLOT(dst), (jint)(val & 0xFFFFFFFF)); move_int_const(HSLOT(dst), (jint)((val >> 32) & 0xFFFFFFFF));#endif #endif}voidmove_float_const(SlotInfo* dst, float val){#if defined(HAVE_move_float_const) if (HAVE_move_float_const_rangecheck(val)) { slot_slot_fconst(dst, NULL, val, HAVE_move_float_const, Tconst); } else#endif { constpool *c; label* l; c = KaffeJIT3_newConstant(CPfloat, val); l = KaffeJIT3_newLabel(); l->type = Lconstant; l->at = 0; l->to = (uintp)c; l->from = 0;#if defined(HAVE_load_constpool_float) slot_slot_const(dst, NULL, (jword)l, HAVE_load_constpool_float, Tnull);#else { SlotInfo* tmp; slot_alloctmp(tmp); move_label_const(tmp, l); load_float(dst, tmp); slot_freetmp(tmp); }#endif }}voidmove_double_const(SlotInfo* dst, jdouble val){#if defined(HAVE_move_double_const) if (HAVE_move_double_const_rangecheck(val)) { lslot_slot_fconst(dst, NULL, val, HAVE_move_double_const, Tconst); } else#endif { constpool *c; label* l; c = KaffeJIT3_newConstant(CPdouble, val); l = KaffeJIT3_newLabel(); l->type = Lconstant; l->at = 0; l->to = (uintp)c; l->from = 0;#if defined(HAVE_load_constpool_double) lslot_lslot_const(dst, 0, (jword)l, HAVE_load_constpool_double, Tnull);#else { SlotInfo* tmp; slot_alloctmp(tmp); move_label_const(tmp, l); load_double(dst, tmp); slot_freetmp(tmp); }#endif }}#if defined(HAVE_move_any)voidmove_any(SlotInfo* dst, SlotInfo* src){ if (dst == src) { } else if (isGlobal(dst->slot)) { slot_slot_slot(dst, NULL, src, HAVE_move_any, Tcopy); } else { copyslots(dst, src, Rref); }}#endif#if defined(HAVE_move_int)voidmove_int(SlotInfo* dst, SlotInfo* src){ if (dst == src) { }#if defined(HAVE_move_int_const) else if (slot_type(src) == Tconst) { move_int_const(dst, slot_value(src)->i); }#endif else if (isGlobal(dst->slot)) { slot_slot_slot(dst, NULL, src, HAVE_move_int, Tcopy); } else { copyslots(dst, src, Rint); }}#endifvoidmove_ref(SlotInfo* dst, SlotInfo* src){ if (dst == src) { }#if defined(HAVE_move_ref_const) else if (slot_type(src) == Tconst) { move_ref_const(dst, slot_value(src)->l); }#endif else if (isGlobal(dst->slot)) { slot_slot_slot(dst, NULL, src, HAVE_move_ref, Tcopy); } else { copyslots(dst, src, Rref); }}voidmove_anylong(SlotInfo* dst, SlotInfo* src){#if defined(HAVE_move_anylong) lslot_lslot_lslot(dst, 0, src, HAVE_move_anylong, Tcopy);#else assert(LSLOT(dst) != HSLOT(src)); move_any(LSLOT(dst), LSLOT(src)); move_any(HSLOT(dst), HSLOT(src));#endif}voidmove_long(SlotInfo* dst, SlotInfo* src){#if defined(HAVE_move_long) lslot_lslot_lslot(dst, 0, src, HAVE_move_long, Tcopy);#else assert(LSLOT(dst) != HSLOT(src)); move_int(LSLOT(dst), LSLOT(src)); move_int(HSLOT(dst), HSLOT(src));#endif}voidmove_float(SlotInfo* dst, SlotInfo* src){ if (dst == src) { }#if defined(HAVE_move_float_const) else if (slot_type(src) == Tconst) { move_float_const(dst, slot_value(src)->f); }#endif else if (isGlobal(dst->slot)) {#if defined(HAVE_move_float) slot_slot_slot(dst, NULL, src, HAVE_move_float, Tcopy);#elif defined(HAVE_NO_FLOATING_POINT) move_int(dst, src);#else KAFFEVM_ABORT();#endif } else { copyslots(dst, src, Rfloat); }}voidmove_double(SlotInfo* dst, SlotInfo* src){ if (dst == src) { }#if defined(HAVE_move_double_const) else if (slot_type(src) == Tconst) { move_double_const(dst, slot_value(src)->d); }#endif else if (isGlobal(dst->slot)) {#if defined(HAVE_move_double) lslot_lslot_lslot(dst, NULL, src, HAVE_move_double, Tcopy);#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX) move_long(dst, src);#else KAFFEVM_ABORT();#endif } else { copylslots(dst, src, Rdouble); }}#if defined(HAVE_move_label_const)voidmove_label_const(SlotInfo* dst, label* lab){ slot_slot_const(dst, NULL, (jword)lab, HAVE_move_label_const, Tnull);}#endifvoidswap_any(SlotInfo* src, SlotInfo* src2){#if defined(HAVE_swap_any) slot_slot_slot(src, 0, src2, HAVE_swap_any, Tcomplex);#else SlotInfo* tmp; slot_alloctmp(tmp); move_ref(tmp, src); move_ref(src, src2); move_ref(src2, tmp); slot_freetmp(tmp);#endif}/* ----------------------------------------------------------------------- *//* Arithmetic operators - add, sub, etc. *//* */#if defined(HAVE_adc_int)voidadc_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_adc_int, Tcomplex);}#endif#if defined(HAVE_add_int)void_add_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_add_int, Tcomm);}voidadd_int_const(SlotInfo* dst, SlotInfo* src, jint val){#if defined(HAVE_add_int_const) if (HAVE_add_int_const_rangecheck(val)) { slot_slot_const(dst, src, val, HAVE_add_int_const, Tcomplex); } else#endif { SlotInfo* tmp; slot_alloctmp(tmp); move_int_const(tmp, val); _add_int(dst, src, tmp); slot_freetmp(tmp); }}voidadd_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_add_int_const) if (slot_type(src) == Tconst) {#if 0 /* Disabled as it does not clear Carry and breaks add_long() on ARM */ if (slot_type(src2) == Tconst) { move_int_const(dst, slot_value(src)->i + slot_value(src2)->i); } else#endif { add_int_const(dst, src2, slot_value(src)->i); } } else if (slot_type(src2) == Tconst) { add_int_const(dst, src, slot_value(src2)->i); } else#endif _add_int(dst, src, src2);}#endif#if defined(HAVE_add_ref)void_add_ref(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_add_ref, Tcomm);}voidadd_ref_const(SlotInfo* dst, SlotInfo* src, jint val){#if defined(HAVE_add_ref_const) if (HAVE_add_ref_const_rangecheck(val)) { slot_slot_const(dst, src, val, HAVE_add_ref_const, Tcomplex); } else#endif { SlotInfo* tmp; slot_alloctmp(tmp); move_int_const(tmp, val); _add_ref(dst, src, tmp); slot_freetmp(tmp); }}voidadd_ref(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ _add_ref(dst, src, src2);}#endif#if defined(HAVE_set_lt_int)voidset_lt_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_set_lt_int, Tcomplex);}#endif#if defined(HAVE_set_lt_int_const)voidset_lt_int_const(SlotInfo* dst, SlotInfo* src, jint val){ slot_slot_const(dst, src, val, HAVE_set_lt_int_const, Tcomplex);}#endifvoidadd_long(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_add_long) lslot_lslot_lslot(dst, src, src2, HAVE_add_long, Tcomplex);#elif defined(HAVE_adc_int) add_int(LSLOT(dst), LSLOT(src), LSLOT(src2)); adc_int(HSLOT(dst), HSLOT(src), HSLOT(src2));#elif defined(HAVE_set_lt_int) SlotInfo* res,*carry; slot_alloctmp(res); slot_alloctmp(carry); add_int(res, LSLOT(src), LSLOT(src2)); set_lt_int(carry, res, LSLOT(src2)); add_int(carry, HSLOT(src), carry); add_int(HSLOT(dst), carry, HSLOT(src2)); move_int(LSLOT(dst),res); slot_freetmp(res); slot_freetmp(carry);#else KAFFEVM_ABORT();#endif}#if defined(HAVE_add_long_const)voidadd_long_const(SlotInfo* dst, SlotInfo* src, jlong val){ if (HAVE_add_long_const_rangecheck(val)) { lslot_lslot_lconst(dst, src, val, HAVE_add_long_const, Tcomplex); } else { SlotInfo* tmp; slot_alloctmp(tmp); move_long_const(tmp, val); add_long(dst, src, tmp); slot_freetmp(tmp); }}#endifvoidadd_float(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_add_float) slot_slot_slot(dst, src, src2, HAVE_add_float, Tcomplex);#else begin_func_sync();#if defined(PUSHARG_FORWARDS) pusharg_float(src, 0); pusharg_float(src2, 1);#else pusharg_float(src2, 1); pusharg_float(src, 0);#endif call_soft(soft_fadd); popargs(); end_func_sync(); return_float(dst);#endif}voidadd_double(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_add_double) lslot_lslot_lslot(dst, src, src2, HAVE_add_double, Tcomplex);#else begin_func_sync();#if defined(PUSHARG_FORWARDS) pusharg_double(src, 0); pusharg_double(src2, pusharg_long_idx_inc);#else pusharg_double(src2, pusharg_long_idx_inc); pusharg_double(src, 0);#endif call_soft(soft_faddl); popargs(); end_func_sync(); return_double(dst);#endif}#if defined(HAVE_sbc_int)voidsbc_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_sbc_int, Tcomplex);}#endif#if defined(HAVE_sub_int)void_sub_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){ slot_slot_slot(dst, src, src2, HAVE_sub_int, Tcomplex);}voidsub_int_const(SlotInfo* dst, SlotInfo* src, jint val){#if defined(HAVE_sub_int_const) if (HAVE_sub_int_const_rangecheck(val)) { slot_slot_const(dst, src, val, HAVE_sub_int_const, Tcomplex); } else#endif { SlotInfo* tmp; slot_alloctmp(tmp); move_int_const(tmp, val); _sub_int(dst, src, tmp); slot_freetmp(tmp); }}voidsub_int(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_sub_int_const) if (slot_type(src2) == Tconst) { sub_int_const(dst, src, slot_value(src2)->i); } else#endif _sub_int(dst, src, src2);}#endifvoidsub_long(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_sub_long) lslot_lslot_lslot(dst, src, src2, HAVE_sub_long, Tcomplex);#elif defined(HAVE_sbc_int) sub_int(LSLOT(dst), LSLOT(src), LSLOT(src2)); sbc_int(HSLOT(dst), HSLOT(src), HSLOT(src2));#elif defined(HAVE_set_lt_int) SlotInfo* carry; slot_alloctmp(carry); set_lt_int(carry, LSLOT(src), LSLOT(src2)); sub_int(carry, HSLOT(src), carry); sub_int(HSLOT(dst), carry, HSLOT(src2)); sub_int(LSLOT(dst), LSLOT(src), LSLOT(src2)); slot_freetmp(carry);#else KAFFEVM_ABORT();#endif}#if defined(HAVE_sub_long_const)voidsub_long_const(SlotInfo* dst, SlotInfo* src, jlong val){ if (HAVE_sub_long_const_rangecheck(val)) { lslot_lslot_lconst(dst, src, val, HAVE_sub_long_const, Tcomplex); } else { SlotInfo* tmp; slot_alloctmp(tmp); move_long_const(tmp, val); sub_long(dst, src, tmp); slot_freetmp(tmp); }}#endifvoidsub_float(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_sub_float) slot_slot_slot(dst, src, src2, HAVE_sub_float, Tcomplex);#else begin_func_sync();#if defined(PUSHARG_FORWARDS) pusharg_float(src, 0); pusharg_float(src2, 1);#else pusharg_float(src2, 1); pusharg_float(src, 0);#endif call_soft(soft_fsub); popargs(); end_func_sync(); return_float(dst);#endif}voidsub_double(SlotInfo* dst, SlotInfo* src, SlotInfo* src2){#if defined(HAVE_sub_double) lslot_lslot_lslot(dst, src, src2, HAVE_sub_double, Tcomplex);#else begin_func_sync();#if defined(PUSHARG_FORWARDS) pusharg_double(src, 0); pusharg_double(src2, pusharg_long_idx_inc);#else pusharg_double(src2, pusharg_long_idx_inc); pusharg_double(src, 0);#endif call_soft(soft_fsubl); popargs(); end_func_sync(); return_double(dst);#endif}intmul_int_const_optimize(SlotInfo* dst, SlotInfo* src, jint val){ switch (val) { case 2: lshl_int_const(dst, src, 1); break; case 4: lshl_int_const(dst, src, 2); break; case 8: lshl_int_const(dst, src, 3); break; case 16:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -