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

📄 jit-sparc.def

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 DEF
📖 第 1 页 / 共 2 页
字号:
/* jit-sparc.def * SPARC instruction definition. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#ifdef KAFFE_VMDEBUGint jit_debug;#define debug(x)        (jit_debug ? dprintf("%x:\t", CODEPC), dprintf x : 0)#else#define debug(x)#endif#include "classMethod.h"#include "access.h"#include "gtypes.h"#define	REG_g0			0#define	REG_o0			8#define	REG_o1			9#define	REG_sp			14#define	REG_o7			15#define	REG_i0			24#define	REG_i1			25#define	REG_fp			30#define	REG_i7			31#define	REG_f0			32#define	REG_f1			33#ifdef KAFFE_VMDEBUGstatic char* rnames[] = {	"g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",	"o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7",	"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",	"i0", "i1", "i2", "i3", "i4", "i5", "i6", "i7",	"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",	"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",	"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24",	"f25", "f26", "f27", "f28", "f29", "f30", "f31"			};#define	regname(n)	rnames[n]#define	fregname(n)	rnames[(n)+32]#endifstatic int argcount = 0;/* --------------------------------------------------------------------- *//* Instruction formats							 */#define	insn_call(disp)					\	LOUT = 0x40000000 | ((disp) & 0x3FFFFFFF)#define	insn_offset(op, dst, imm)			\	LOUT = 0x01000000 | ((dst) << 25) | 		\		((op) << 22) | ((imm) & 0x3FFFFF)#define	insn_branch(cond, anull, dest)			\	LOUT = 0x00800000 | ((anull) << 29) |		\		((cond) << 25) | ((dest) & 0x3FFFFF)#define	insn_RRR(op, dst, rs1, rs2)			\	LOUT = 0x80000000 | ((dst) << 25) |		\		((op) << 19) | ((rs1) << 14) | (rs2)#define	ldst_RRR(op, dst, rs1, rs2)			\	LOUT = 0xC0000000 | ((dst) << 25) |		\		((op) << 19) | ((rs1) << 14) | (rs2)#define	ldst_RRC(op, dst, rs1, cnst)			\	LOUT = 0xC0002000 | ((dst) << 25) |		\		((op) << 19) | ((rs1) << 14) |		\		((cnst) & MASKL13BITS)#define	insn_RRC(op, op2, dst, rs1, cnst)		\	LOUT = 0x00002000 | ((op) << 30) |		\		((dst) << 25) | ((op2) << 19) |		\		((rs1) << 14) | ((cnst) & MASKL13BITS)#define	finsn_RRR(op, dst, rs1, rs2)			\	LOUT = 0x81A00000 | ((dst) << 25) |	\		((rs1) << 14) | ((op) << 5) |	\		(rs2)/* --------------------------------------------------------------------- *//* Various masks							 */#define	MASKL12BITS	0x00000FFF#define	MASKL13BITS	0x00001FFF#define	MASKU20BITS	0xFFFFFC00#define	NMASKL12BITS	(~MASKL12BITS)#define	NMASKL13BITS	(~MASKL13BITS)#define	NMASKU20BITS	(~MASKU20BITS)/* --------------------------------------------------------------------- */#define	NOP()	insn_offset(4, REG_g0, 0);		\		debug(("nop\n"));define_insn(unimplemented, unimplemented){	ABORT();}define_insn(nop, nop){	NOP();}/* --------------------------------------------------------------------- */define_insn(prologue, prologue_xLC){	int i;	int limit;	label* l;	/* Remember where the framesize should go */	l = (label*)const_int(1);	l->type = Lframe|Labsolute|Lgeneral;	l->at = (uintp)CODEPC;	insn_RRC(2, 0x3c, REG_sp, REG_sp, 0);	debug(("save sp,?,sp\n"));	limit = 6;	if (maxArgs < limit) {		limit = maxArgs;	}	/* Force the first 6 arguments to the corresponding registers */	for (i = 0; i < limit; i++) {		forceRegister(&localinfo[i], REG_i0 + i, Rint /* ? */);	}}define_insn(epilogue, epilogue_xxx){	setEpilogueLabel ((uintp)CODEPC);	insn_RRC(2, 0x38, REG_g0, REG_i7, 8);	insn_RRR(0x3D, REG_g0, REG_g0, REG_g0);	debug(("ret\n"));	debug(("restore\n"));}define_insn(eprologue, eprologue_xxx){}/* --------------------------------------------------------------------- */define_insn(spill_int, spill_Rxx){	int r = sreg_int(0);	int o = const_int(1);	ldst_RRC(0x04, r, REG_fp, o);	debug(("st %s,[fp+%d]\n", regname(r), o));}define_insn(spill_float, fspill_Rxx){	int r = sreg_float(0);	int o = const_int(1);	ldst_RRC(0x24, r, REG_fp, o);	debug(("stf %s,[fp+%d]\n", fregname(r), o));}define_insn(spill_double, fspilll_Rxx){	int r = sreg_double(0);	int o = const_int(1);	ldst_RRC(0x24, r, REG_fp, o);	debug(("stf %s,[fp+%d]\n", fregname(r), o));	ldst_RRC(0x24, r+1, REG_fp, o+4);	debug(("stf %s,[fp+%d]\n", fregname(r+1), o+4));}define_insn(reload_int, reload_Rxx){	int r = lreg_int(0);	int o = const_int(1);	ldst_RRC(0, r, REG_fp, o);	debug(("ld %s,[fp+%d]\n", regname(r), o));}define_insn(reload_float, freload_Rxx){	int r = lreg_float(0);	int o = const_int(1);	ldst_RRC(0x20, r, REG_fp, o);	debug(("ldf %s,[fp+%d]\n", fregname(r), o));}define_insn(reload_double, freloadl_Rxx){	int r = lreg_double(0);	int o = const_int(1);	ldst_RRC(0x20, r, REG_fp, o);	debug(("ldf %s,[fp+%d]\n", fregname(r), o));	ldst_RRC(0x20, r+1, REG_fp, o+4);	debug(("ldf %s,%d[fp]\n", fregname(r+1), o+4));}/* --------------------------------------------------------------------- */define_insn(move_int_const, move_RxC){	int val = const_int(2);	int w = wreg_int(0);	if ((val & NMASKL12BITS) == 0 || (val & NMASKL12BITS) == NMASKL12BITS) {		insn_RRC(2, 2, w, REG_g0, val & MASKL13BITS);		debug(("mov %d,%s\n", val & MASKL13BITS, regname(w)));	}	else {		insn_offset(4, w, val >> 10);		debug(("sethi 0x%x,%s ; 0x%x\n", val & MASKU20BITS, regname(w), val));		if ((val & NMASKU20BITS) != 0) {			insn_RRC(2, 2, w, w, val & NMASKU20BITS);			debug(("or 0x%x,%s,%s\n", val & NMASKU20BITS, regname(w), regname(w)));		}	}}define_insn(move_label_const, move_RxL){	label* l = (label*)const_int(2);	int w = wreg_int(0);	l->type |= Llong22x10|Labsolute;	l->at = (uintp)CODEPC;	insn_offset(4, w, 0);		/* upper 22 bits */	insn_RRC(2, 2, w, w, 0);	/* lower 10 bits */	debug(("sethi ?,%s\n", regname(w)));	debug(("or ?,%s,%s\n", regname(w), regname(w)));}define_insn(move_int, move_RxR){	int r = rreg_int(2);	int w = wreg_int(0);	if (r != w) {		insn_RRR(2, w, r, REG_g0);		debug(("mov %s,%s\n", regname(r), regname(w)));	}}define_insn(move_float, fmove_RxR){	int r = rreg_float(2);	int w = wreg_float(0);	if (r != w) {		finsn_RRR(1, w, 0, r);		debug(("fmovs %s,%s\n", fregname(r), fregname(w)));	}}define_insn(move_double, fmovel_RxR){	int r = rreg_double(2);	int w = wreg_double(0);	if (r != w) {		finsn_RRR(1, w, 0, r);		finsn_RRR(1, w+1, 0, r+1);		debug(("fmovs %s,%s\n", fregname(r), fregname(w)));		debug(("fmovs %s,%s\n", fregname(r+1), fregname(w+1)));	}}/* --------------------------------------------------------------------- */define_insn(add_int, add_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0x10, w, r1, r2);	debug(("addcc %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(add_int_const, add_RRC){	int o;	int r;	int w;	o = const_int(2);	r = rreg_int(1);	w = wreg_int(0);	insn_RRC(2, 0x10, w, r, o);	debug(("addcc %s,%d,%s\n", regname(r), o, regname(w)));}define_insn(adc_int, adc_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0x08, w, r1, r2);	debug(("addx %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(add_float, fadd_RRR){	int r1;	int r2;	int w;	r2 = rreg_float(2);	r1 = rreg_float(1);	w = wreg_float(0);	finsn_RRR(0x41, w, r1, r2);	debug(("fadds %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(add_double, faddl_RRR){	int r1;	int r2;	int w;	r2 = rreg_double(2);	r1 = rreg_double(1);	w = wreg_double(0);	finsn_RRR(0x42, w, r1, r2);	debug(("faddd %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(sub_int, sub_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0x14, w, r1, r2);	debug(("subcc %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(sub_int_const, sub_RRC){	int o;	int r;	int w;	o = const_int(2);	r = rreg_int(1);	w = wreg_int(0);	insn_RRC(2, 0x14, w, r, o);	debug(("subcc %s,%d,%s\n", regname(r), o, regname(w)));}define_insn(sbc_int, sbc_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0xC, w, r1, r2);	debug(("subx %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(sub_float, fsub_RRR){	int r1;	int r2;	int w;	r2 = rreg_float(2);	r1 = rreg_float(1);	w = wreg_float(0);	finsn_RRR(0x45, w, r1, r2);	debug(("fsubs %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(sub_double, fsubl_RRR){	int r1;	int r2;	int w;	r2 = rreg_double(2);	r1 = rreg_double(1);	w = wreg_double(0);	finsn_RRR(0x46, w, r1, r2);	debug(("fsubd %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(mul_float, fmul_RRR){	int r1;	int r2;	int w;	r2 = rreg_float(2);	r1 = rreg_float(1);	w = wreg_float(0);	finsn_RRR(0x49, w, r1, r2);	debug(("fmuls %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(mul_double, fmull_RRR){	int r1;	int r2;	int w;	r2 = rreg_double(2);	r1 = rreg_double(1);	w = wreg_double(0);	finsn_RRR(0x4A, w, r1, r2);	debug(("fmuld %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(div_float, fdiv_RRR){	int r1;	int r2;	int w;	r2 = rreg_float(2);	r1 = rreg_float(1);	w = wreg_float(0);	finsn_RRR(0x4D, w, r1, r2);	debug(("fdivs %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(div_double, fdivl_RRR){	int r1;	int r2;	int w;	r2 = rreg_double(2);	r1 = rreg_double(1);	w = wreg_double(0);	finsn_RRR(0x4E, w, r1, r2);	debug(("fdivd %s,%s,%s\n", fregname(r1), fregname(r2), fregname(w)));}define_insn(neg_float, fneg_RxR){	int r = rreg_float(2);	int w = wreg_float(0);	finsn_RRR(5, w, 0, r);	debug(("fnegs %s,%s\n", fregname(r), fregname(w)));}define_insn(neg_double, fnegl_RxR){	int r = rreg_double(2);	int w = wreg_double(0);	finsn_RRR(5, w, 0, r);	debug(("fnegs %s,%s\n", fregname(r), fregname(w)));	if (r != w) {		finsn_RRR(1, w+1, 0, r+1);		debug(("fmovs %s,%s\n", fregname(r+1), fregname(w+1)));	}}/* --------------------------------------------------------------------- */define_insn(and_int, and_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(1, w, r1, r2);	debug(("and %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(or_int, or_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(2, w, r1, r2);	debug(("or %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(xor_int, xor_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(3, w, r1, r2);	debug(("xor %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(ashr_int, ashr_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0x27, w, r1, r2);	debug(("sra %s,%s,%s\n", regname(r1), regname(r2), regname(w)));}define_insn(lshr_int, lshr_RRR){	int r1;	int r2;	int w;	r2 = rreg_int(2);	r1 = rreg_int(1);	w = wreg_int(0);	insn_RRR(0x26, w, r1, r2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -