[kaffe] patch for kaffe1.0.7jit3 code runing on MIPS
Dalibor Topic
robilad at kaffe.org
Thu Jul 8 07:00:32 PDT 2004
Dalibor Topic wrote:
> Yoshiharu Oba wrote:
>
>> Hi Dalibor
>>
>> I appreciate your advice very much. Now I'm writing a changelog and
>> remake a new patch, It's also included.
>
>
> Hi Yoshiharu,
>
> thanks for the updated patch and the ChangeLog. I've started to merge
> parts of it in. Since Dylan Schell's port to PS2Linux is already in the
> CVS, it would be nice if you could try to see if the CVS head builds for
> you, too, on ps2linux, and adapt yout patch accordingly. I'll comment to
> the changelog on what I've checked in & how it has been adapated.
Actually, I went ahead and adapated the patch myself ;) I've attached
the adapted patch that can applied against CVS head. It'd be nice if you
could give it a try with a fresh CVS check out, too see if it still
works. I don't have a ps2-linux cross-toolchain (nor do I have a PS2 :)
atm, so I can't test it myself.
cheers,
dalibor topic
-------------- next part --------------
? po/fr.gmo
? po/zh_TW.gmo
Index: config/mips/jit.h
===================================================================
RCS file: /cvs/kaffe/kaffe/config/mips/jit.h,v
retrieving revision 1.12
diff -u -r1.12 jit.h
--- config/mips/jit.h 7 Jul 2004 19:34:25 -0000 1.12
+++ config/mips/jit.h 8 Jul 2004 13:34:07 -0000
@@ -35,12 +35,13 @@
typedef struct _exceptionFrame {
char* return_frame;
char* return_pc;
+ char* return_sp;
} exceptionFrame;
extern void __mipsGetNextFrame(struct _exceptionFrame*);
#define STACK_NEXT_FRAME(F) __mipsGetNextFrame(F)
-#define FIRSTFRAME(F,O) (F).return_frame = 0; \
+#define FIRSTFRAME(F,O) (F).return_frame = (F).return_sp = 0; \
__mipsGetNextFrame(&F)
#define NEXTFRAME(F) ((F)->return_frame)
#define PCFRAME(F) ((F)->return_pc)
Index: config/mips/jit3-icode.h
===================================================================
RCS file: /cvs/kaffe/kaffe/config/mips/jit3-icode.h,v
retrieving revision 1.4
diff -u -r1.4 jit3-icode.h
--- config/mips/jit3-icode.h 17 Jun 2001 16:39:11 -0000 1.4
+++ config/mips/jit3-icode.h 8 Jul 2004 13:34:07 -0000
@@ -50,7 +50,11 @@
#define HAVE_move_int_const move_RxC
#define HAVE_move_int move_RxR
#define HAVE_move_float fmove_RxR
+#ifdef PS2LINUX
+#undef HAVE_move_double
+#else
#define HAVE_move_double fmovel_RxR
+#endif
#define HAVE_move_label_const move_RxL
#define HAVE_move_ref move_RxR
#define HAVE_move_any move_RxR
@@ -79,9 +83,15 @@
#define HAVE_mul_float fmul_RRR
#undef HAVE_div_float
+#ifdef PS2LINUX
+#undef HAVE_add_double
+#undef HAVE_sub_double
+#undef HAVE_mul_double
+#else
#define HAVE_add_double faddl_RRR
#define HAVE_sub_double fsubl_RRR
#define HAVE_mul_double fmull_RRR
+#endif
#undef HAVE_div_double
#define HAVE_add_ref addu_RRR /* new */
@@ -94,12 +104,21 @@
#define HAVE_load_float fload_RRx
#define HAVE_store_float fstore_RRx
+#ifdef PS2LINUX
+#undef HAVE_load_double
+#undef HAVE_store_double
+#else
#define HAVE_load_double floadl_RRx
#define HAVE_store_double fstorel_RRx
+#endif
#define HAVE_pusharg_int push_xRC
#define HAVE_pusharg_float fpush_xRC
+#ifdef PS2LINUX
+#undef HAVE_pusharg_double
+#else
#define HAVE_pusharg_double fpushl_xRC
+#endif
#define HAVE_pusharg_ref push_xRC
#define HAVE_pusharg_long pushl_xRC
#define HAVE_popargs popargs_xxC
@@ -119,12 +138,20 @@
#define HAVE_return_int return_Rxx
#define HAVE_return_long returnl_Rxx
#define HAVE_return_float freturn_Rxx
+#ifdef PS2LINUX
+#undef HAVE_return_double
+#else
#define HAVE_return_double freturnl_Rxx
+#endif
#define HAVE_return_ref return_Rxx
#define HAVE_returnarg_int returnarg_xxR
#define HAVE_returnarg_long returnargl_xxR
#define HAVE_returnarg_float freturnarg_xxR
+#ifdef PS2LINUX
+#undef HAVE_returnarg_double
+#else
#define HAVE_returnarg_double freturnargl_xxR
+#endif
#define HAVE_returnarg_ref returnarg_xxR
#define HAVE_set_label set_label_xxC
@@ -251,7 +278,11 @@
#undef HAVE_cmp_long /* no */
#define HAVE_neg_float fneg_RRR
+#ifdef PS2LINUX
+#undef HAVE_neg_double
+#else
#define HAVE_neg_double fnegl_RRR
+#endif
#undef HAVE_rem_float /* no */
#undef HAVE_rem_double /* no */
Index: config/mips/jit3-mips.def
===================================================================
RCS file: /cvs/kaffe/kaffe/config/mips/jit3-mips.def,v
retrieving revision 1.12
diff -u -r1.12 jit3-mips.def
--- config/mips/jit3-mips.def 9 Mar 2004 15:15:35 -0000 1.12
+++ config/mips/jit3-mips.def 8 Jul 2004 13:34:07 -0000
@@ -27,7 +27,6 @@
#endif
#ifdef KAFFE_VMDEBUG
-extern uint pc;
int jit_debug = 0;
/* int dbmsg = 0; */
#define debug_name(x) debug(x)
@@ -337,6 +336,7 @@
}
switch (ch) {
case 'D':
+#ifndef PS2LINUX
if (haveint == 0 && fi < 2) {
preloadRegister(slot_data(localinfo[i]), Rdouble, REG_f12+2*fi);
i += 2;
@@ -344,6 +344,7 @@
fi++;
break;
}
+#endif
/* Fall through ... */
case 'J':
/* dbmsg = 1; */
@@ -1950,8 +1951,8 @@
/* Else we actually put the value in a float point register f12-f14.
*/
else {
- r = rreg_ideal_float(1, REG_f12+2*fp_idx);
- assert(r == 12+2*fp_idx);
+ r = rreg_ideal_float(1, REG_f12+2*fp_idx) + REG_f0;
+ assert(r == REG_f12+2*fp_idx);
register_reserve(r);
resreg[res_idx++] = r;
}
@@ -2004,8 +2005,8 @@
/* Else we actually put the value in a float point register f12-f14.
*/
else {
- r = rreg_ideal_double(1, REG_f12+2*fp_idx);
- assert(r == 12+2*fp_idx);
+ r = rreg_ideal_double(1, REG_f12+2*fp_idx) + REG_f0;
+ assert(r == REG_f12+2*fp_idx);
register_reserve(r);
register_reserve(r+1);
resreg[res_idx++] = r;
Index: config/mips/mips.c
===================================================================
RCS file: /cvs/kaffe/kaffe/config/mips/mips.c,v
retrieving revision 1.12
diff -u -r1.12 mips.c
--- config/mips/mips.c 23 Jun 2004 16:35:29 -0000 1.12
+++ config/mips/mips.c 8 Jul 2004 13:34:07 -0000
@@ -50,6 +50,7 @@
int* fp;
int* ppc;
int* pfp;
+ int* stackp = 0;
if (fm->return_frame == 0) {
here:;
@@ -57,8 +58,9 @@
asm("move %0,$fp" : "=r" (fp));
}
else {
- fp = (int*)fm->return_frame;
- spc = (int*)fm->return_pc;
+ spc = (int*)fm->return_pc;
+ fp = (int*)fm->return_frame;
+ stackp = (int*)fm->return_sp;
}
#if 0
@@ -96,12 +98,15 @@
/* Walk backwards down the code looking for where the return
* pc is stored.
*/
- TDBG(kprintf("starting search at %p\n", spc);)
+ TDBG(kprintf("[1] starting search at %p\n", spc);)
for (pc = spc;; pc--) {
unsigned short high = (unsigned short)((*pc) >> 16);
short low = (short)*pc;
switch (high) {
case 0xafbf: /* sw $ra,i($sp) */
+ if( stackp != (int*)0) {
+ fp = stackp;
+ }
TDBG(kprintf(" &ra = %p\n", pc);)
ppc = (int*)fp[low / sizeof(int)];
TDBG(kprintf(" prev pc = %p\n", ppc);)
@@ -141,7 +146,7 @@
/* Walk backwards down the code looking for where we stored the
* previous frame pointer.
*/
- TDBG(kprintf("starting search at %p\n", spc);)
+ TDBG(kprintf("[2] starting search at %p\n", spc);)
for (pc = spc;; pc--) {
unsigned short high = (unsigned short)((*pc) >> 16);
short low = (short)*pc;
@@ -172,6 +177,7 @@
else {
fm->return_pc = (char*)ppc;
fm->return_frame = (char*)pfp;
+ fm->return_sp = (char*)0;
}
}
Index: config/mips/linux/jit-md.h
===================================================================
RCS file: /cvs/kaffe/kaffe/config/mips/linux/jit-md.h,v
retrieving revision 1.3
diff -u -r1.3 jit-md.h
--- config/mips/linux/jit-md.h 13 Dec 2003 18:03:53 -0000 1.3
+++ config/mips/linux/jit-md.h 8 Jul 2004 13:34:07 -0000
@@ -30,9 +30,11 @@
#define EXCEPTIONPROTO int sig, int cause, struct sigcontext *ctx
/* Get the first exception frame from a signal handler */
+#define MIPS_SP 29
#define MIPS_FP 30
#define EXCEPTIONFRAME(f, c) \
(f).return_frame = (void *)(unsigned long)(c)->sc_regs[MIPS_FP]; \
+ (f).return_sp = (void *)(unsigned long)(c)->sc_regs[MIPS_SP]; \
(f).return_pc = (void *)(unsigned long)(c)->sc_pc
#endif
Index: kaffe/kaffevm/jit3/icode.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/jit3/icode.c,v
retrieving revision 1.42
diff -u -r1.42 icode.c
--- kaffe/kaffevm/jit3/icode.c 6 Jul 2004 15:57:15 -0000 1.42
+++ kaffe/kaffevm/jit3/icode.c 8 Jul 2004 13:34:08 -0000
@@ -907,7 +907,7 @@
else if (isGlobal(dst->slot)) {
#if defined(HAVE_move_double)
lslot_lslot_lslot(dst, 0, src, HAVE_move_double, Tcopy);
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
move_long(dst, src);
#else
ABORT();
@@ -2325,7 +2325,7 @@
{
#if defined(HAVE_load_double)
lslot_lslot_slot(dst, 0, src, HAVE_load_double, Tload);
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
load_long(dst, src);
#else
ABORT();
@@ -2934,7 +2934,7 @@
{
#if defined(HAVE_store_double)
slot_slot_lslot(0, dst, src, HAVE_store_double, Tstore);
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
store_long(dst, src);
#else
ABORT();
@@ -3498,7 +3498,7 @@
#if defined(HAVE_pusharg_double)
lslot_lslot_const(0, src, idx, HAVE_pusharg_double, Tnull);
argcount += pusharg_long_idx_inc;
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
pusharg_long(src, idx);
#else
ABORT();
@@ -3800,7 +3800,7 @@
begin_sync();
end_sync();
#endif
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
return_long(dst);
#else
ABORT();
@@ -3868,7 +3868,7 @@
#if defined(HAVE_returnarg_double)
lslot_lslot_lslot(0, 0, src, HAVE_returnarg_double, Tcopy);
-#elif defined(HAVE_NO_FLOATING_POINT)
+#elif defined(HAVE_NO_FLOATING_POINT) || defined(PS2LINUX)
returnarg_long(src);
#else
ABORT();
More information about the kaffe
mailing list