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

📄 md.c

📁 kaffe是一个java虚拟机的源代码。里面包含了一些java例程和标准的java包。
💻 C
字号:
/* * mips/netbsd1/md.c * NetBSD1 MIPS specific functions. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "jtypes.h"#include "object.h"#include "support.h"voidmips32CallMethod (callMethodInfo *CALL){    register int	iret	__asm__("$2");    register int64	jret	__asm__("$2");    register float	fret	__asm__("$f0");    register double	dret	__asm__("$f0");    register int	i0	__asm__("$4");    register int	i1	__asm__("$5");    register int	i2	__asm__("$6");    register int	i3	__asm__("$7");    register int*	sp	__asm__("sp");    register int*	gp	__asm__("gp");    register int*	ra	__asm__("ra");    register int64	(*t9)(void) __asm__("$25");    int* curr_sp = sp;    int* curr_gp = gp;    int* curr_ra = ra;    {      int nrargs = CALL->nrargs;      uintp *argframe = __builtin_alloca((nrargs > 4 ? nrargs : 4) * sizeof(int64));      int argidx;      int idx = 0;      for (argidx = 0; argidx < nrargs; ++argidx) {	switch (CALL->callsize[argidx]) {	case 2:	  if ((idx & 1) != 0) {	/* Align */	    idx += 1;	  }	  *(jlong*)&argframe[idx] = CALL->args[argidx].j;	  idx += 2;	  break;	case 1:	  *(jint*)&argframe[idx] = CALL->args[argidx].i;	  idx += 1;	  break;	default:	  break;	}      }      /* Load the register up - alot of this is done speculatively       * since sometime we need values in float registers, sometimes       * in integers.       */      if (CALL->callsize[0] == 1) {	asm volatile ("l.s $f12,%0" : : "m" (*(jfloat*)&argframe[0]));	if (CALL->callsize[1] == 1) {	  asm volatile ("l.s $f14,%0" : : "m" (*(jfloat*)&argframe[1]));	}	else if (CALL->callsize[1] == 2) {	  asm volatile ("l.d $f14,%0" : : "m" (*(jdouble*)&argframe[2]));	}      }      else if (CALL->callsize[0] == 2) {	asm volatile ("l.d $f12,%0" : : "m" (*(jdouble*)&argframe[0]));	if (CALL->callsize[2] == 1) {	  asm volatile ("l.s $f14,%0" : : "m" (*(jfloat*)&argframe[2]));	}	else if (CALL->callsize[2] == 2) {	  asm volatile ("l.d $f14,%0" : : "m" (*(jdouble*)&argframe[2]));	}      }      i0 = argframe[0];      i1 = argframe[1];      i2 = argframe[2];      i3 = argframe[3];      sp = argframe;      asm ("" : : "r" (i0), "r" (i1), "r" (i2), "r" (i3));      (*(t9 = CALL->function))();      asm ("lw $31,%0" : : "m" (curr_ra));      asm ("lw $gp,%0" : : "m" (curr_gp));      asm ("lw $sp,%0" : : "m" (curr_sp));      if (CALL->retsize != 0) {	switch(CALL->retsize) {	case 2:	  if (CALL->rettype == 'D')	    CALL->ret->d = dret;	  else {	    CALL->ret->j = jret;	  }	  break;	case 1:	  if (CALL->rettype == 'F')	    CALL->ret->f = fret;	  else	    CALL->ret->i = iret;	  break;	default:	  ABORT();	  break;	}      }    }}#include "mips/mips.c"

⌨️ 快捷键说明

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