⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jit-alpha.def

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 DEF
📖 第 1 页 / 共 5 页
字号:
		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 + -