📄 jit-alpha.def
字号:
break; }}define_insn(lshl_int, lshli_RRR){ int r2 = rreg_int(2); int r1 = rreg_int(1); int w = wreg_int(0); op_sll(r1, r2, w); op_addl(w, REG_zero, w); /* care for proper overflow. */}define_insn(lshl_long, lshll_RRR){ int r2 = rreg_long(2); int r1 = rreg_long(1); int w = wreg_long(0); op_sll(r1, r2, w);}/* --------------------------------------------------------------------- */define_insn(load_int, loadi_RxR){ int r = rreg_ref(2); int w = wreg_int(0); op_ldl(w, r, 0);}define_insn(load_offset_int, loadi_RRC){ int o = const_int(2); int r = rreg_ref(1); int w = wreg_int(0); assert(o >= -0x8000 && o < 0x8000); op_ldl(w, r, o);}define_insn(load_ref, loadr_RxR){ int r = rreg_ref(2); int w = wreg_ref(0); op_ldq(w, r, 0);}define_insn(load_offset_ref, loadr_RRC){ int o = const_int(2); int r = rreg_ref(1); int w = wreg_ref(0); assert(o >= -0x8000 && o < 0x8000); op_ldq(w, r, o);}define_insn(load_long, loadl_RxR){ int r = rreg_ref(2); int w = wreg_long(0); op_ldq(w, r, 0);}define_insn(load_offset_long, loadl_RRC){ int o = const_int(2); int r = rreg_ref(1); int w = wreg_long(0); assert(o >= -0x8000 && o < 0x8000); op_ldq(w, r, o);}define_insn(load_float, loadf_RxR){ int r = rreg_ref(2); int w = wreg_float(0); op_lds(w, r, 0);}define_insn(load_double, loadd_RxR){ int r = rreg_ref(2); int w = wreg_double(0); op_ldt(w, r, 0);}define_insn(load_byte, loadb_RxR){ int r = rreg_ref(2); int w = wreg_int(0); if (alpha_have_bwx()) { op_ldbu(w, r, 0); op_sextb(w, w); } else {#if 0 op_ldq_u(w, r, 0); op_addq_i(r, 1, REG_at); op_extqh(w, REG_at, w); op_sra_i(w, 56, w);#endif op_mov(r, REG_at); op_ldq_u(w, r, 0); op_extbl(w, REG_at, w); op_sll_i(w, 56, w); op_sra_i(w, 56, w); }}define_insn(load_char, loadc_RxR){ int r = rreg_ref(2); int w = wreg_int(0); if (alpha_have_bwx()) { op_ldwu(w, r, 0); } else { /* Note that an aligned pointer is assumed here. */ op_ldq_u(w, r, 0); op_extwl(w, r, w); }}define_insn(load_short, loads_RxR){ int r = rreg_ref(2); int w = wreg_int(0); if (alpha_have_bwx()) { op_ldwu(w, r, 0); op_sextw(w, w); } else { /* Note that an aligned pointer is assumed here. */ op_ldq_u(w, r, 0); op_addq_i(r, 2, REG_at); op_extqh(w, REG_at, w); op_sra_i(w, 48, w); }}define_insn(store_int, storei_xRR){ int r = rreg_int(2); int w = rreg_ref(1); op_stl(r, w, 0);}define_insn(store_offset_int, storei_xRRC){ int o = const_int(2); int w = rreg_ref(1); int r = rreg_int(0); assert(o >= -0x8000 && o < 0x8000); op_stl(r, w, o);}define_insn(store_ref, storer_xRR){ int r = rreg_ref(2); int w = rreg_ref(1); op_stq(r, w, 0);}define_insn(store_offset_ref, storer_xRRC){ int o = const_int(2); int w = rreg_ref(1); int r = rreg_ref(0); assert(o >= -0x8000 && o < 0x8000); op_stq(r, w, o);}define_insn(store_long, storel_xRR){ int w = rreg_ref(1); int r = rreg_long(2); op_stq(r, w, 0);}define_insn(store_offset_long, storel_xRRC){ int o = const_int(2); int w = rreg_ref(1); int r = rreg_long(0); assert(o >= -0x8000 && o < 0x8000); op_stq(r, w, o);}define_insn(store_float, storef_xRR){ int r = rreg_float(2); int w = rreg_ref(1); op_sts(r, w, 0);}define_insn(store_double, stored_xRR){ int r = rreg_double(2); int w = rreg_ref(1); op_stt(r, w, 0);}define_insn(store_byte, storeb_xRR){ int r = rreg_int(2); int w = rreg_ref(1); if (alpha_have_bwx()) { op_stb(r, w, 0); } else { op_ldq_u(REG_at, w, 0); clobberRegister(r); op_insbl(r, w, r); op_mskbl(REG_at, w, REG_at); op_or(r, REG_at, r); op_stq_u(r, w, 0); }}define_insn(store_short, stores_xRR){ int r = rreg_int(2); int w = rreg_ref(1); if (alpha_have_bwx()) { op_stw(r, w, 0); } else { /* Note that an aligned pointer is assumed here. */ op_ldq_u(REG_at, w, 0); clobberRegister(r); op_inswl(r, w, r); op_mskwl(REG_at, w, REG_at); op_or(r, REG_at, r); op_stq_u(r, w, 0); }}/* --------------------------------------------------------------------- */define_insn(cvt_int_byte, cvtib_RxR){ int r = rreg_int(2); int w = wreg_int(0); if (alpha_have_bwx()) { op_sextb(r, w); } else { op_sll_i(r, 56, w); op_sra_i(w, 56, w); }}define_insn(cvt_int_short, cvtis_RxR){ int r = rreg_int(2); int w = wreg_int(0); if (alpha_have_bwx()) { op_sextw(r, w); } else { op_sll_i(r, 48, w); op_sra_i(w, 48, w); }}define_insn(cvt_int_long, cvtil_RxR){ int r = rreg_int(2); int w = wreg_long(0); op_addl(r, REG_zero, w);}define_insn(cvt_long_int, cvtli_RxR){ int r = rreg_long(2); int w = wreg_int(0); op_addl(r, REG_zero, w);}define_insn(cvt_int_float, cvtif_RxR){ int r = rreg_float(2); int w = wreg_float(0); alpha_jit_info.ieee = 1; op_cvtlq(r, REG_ft); op_cvtqs(REG_ft, w); op_trapb();}define_insn(cvt_long_float, cvtlf_RxR){ int r = rreg_double(2); int w = wreg_float(0); int t = (r == w) ? REG_ft : w; alpha_jit_info.ieee = 1; op_cvtqs(r, t); op_trapb(); if (t == REG_ft) { op_fmov(t, w); }}define_insn(cvt_int_double, cvtid_RxR){ int r = rreg_float(2); int w = wreg_double(0); alpha_jit_info.ieee = 1; op_cvtlq(r, REG_ft); op_cvtqt(REG_ft, w); op_trapb();}define_insn(cvt_long_double, cvtld_RxR){ int r = rreg_double(2); int w = wreg_double(0); int t = (r == w) ? REG_ft : w; alpha_jit_info.ieee = 1; op_cvtqt(r, t); op_trapb(); if (t == REG_ft) { op_fmov(t, w); }}#if 0/* These functions does not work correctly, use soft_cvtXX */define_insn(cvt_float_int, cvtfi_RxR){ int r = rreg_float(2); int w = wreg_float(0); alpha_jit_info.ieee = 1; if (r == w) { /* XXX allocate three temp registers ? */ op_cvtst_s(r, REG_ft); op_trapb(); op_cvttq_svc(REG_ft, w); op_trapb(); op_cvtql_sv(w, REG_ft); op_trapb(); op_fmov(REG_ft, w); } else { op_cvtst_s(r, w); op_cvttq_svc(w, REG_ft); /* XXX allocate another temp register ? */ op_trapb(); op_cvtql_sv(REG_ft, w); op_trapb(); }}define_insn(cvt_float_long, cvtfl_RxR){ int r = rreg_float(2); int w = wreg_double(0); alpha_jit_info.ieee = 1; op_cvtst_s(r, REG_ft); if (r == w) { /* XXX allocate another temp register ? */ op_trapb(); } op_cvttq_svc(REG_ft, w); op_trapb();}define_insn(cvt_double_int, cvtdi_RxR){ int r = rreg_double(2); int w = wreg_float(0); alpha_jit_info.ieee = 1; op_cvttq_svc(r, REG_ft); if (r == w) { /* XXX allocate another temp register ? */ op_trapb(); } op_cvtql_sv(REG_ft, w); op_trapb();}define_insn(cvt_double_long, cvtdl_RxR){ int r = rreg_double(2); int w = wreg_double(0); int t = (r == w) ? REG_ft : w; alpha_jit_info.ieee = 1; op_cvttq_svc(r, t); op_trapb(); if (t == REG_ft) { op_fmov(t, w); }}#endifdefine_insn(cvt_float_double, cvtfd_RxR){ int r = rreg_float(2); int w = wreg_double(0); int t = (r == w) ? REG_ft : w; alpha_jit_info.ieee = 1; op_cvtst_s(r, t); op_trapb(); if (t == REG_ft) { op_fmov(t, w); }}define_insn(cvt_double_float, cvtdf_RxR){ int r = rreg_double(2); int w = wreg_float(0); int t = (r == w) ? REG_ft : w; alpha_jit_info.ieee = 1;#ifndef AXP_FULL_IEEE_FP op_cvtts(r, t);#else op_cvtts_su(r, t); op_trapb();#endif if (t == REG_ft) { op_fmov(t, w); }}/* --------------------------------------------------------------------- */define_insn(lcmp, lcmp_RRR){ int r2 = rreg_long(2); int r1 = rreg_long(1); int w = wreg_int(0); op_cmplt(r1, r2, w); op_cmplt(r2, r1, REG_at); op_subl(w, REG_at, w);}/* --------------------------------------------------------------------- */define_insn(build_key, set_word_xxC){ jint val = const_int(2); debug((".long %08x\n", val)); LOUT = val;}define_insn(build_code_ref, set_wordpc_xxC){ label* l = const_label(2); l->type |= Lrelative | Llong | Lrangecheck; l->at = CODEPC; l->from = 0; debug((".gprel ?\n")); LOUT = 0;}define_insn(load_code_ref, loadpc_RxR){ int r = rreg_long(2); int w = wreg_long(0); op_ldl(w, r, 0); op_addq(w, REG_gp, w);}/* --------------------------------------------------------------------- */define_insn(set_label, set_label_xxC){ label* l = const_label(2); l->to = CODEPC;}define_insn(branch, branch_xCC){ label* l = const_label(1); int bt = const_int(2); l->type |= Llong21 | Lrelative | Lrangecheck; l->at = CODEPC; switch (bt) { case ba: op_br(REG_zero, 0); break; default: ABORT(); } l->from = CODEPC;}static inline voidalpha_cbranch(int r1, int r2, label *l, int bt){ int ne; /* Do the compare and branch with cmp{eq,le,lt} and b{ne,eq} because that slots better on the ev5 than a sub and b*. */ switch (bt) { case beq: op_cmpeq(r1, r2, REG_at); ne = 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -