From b77d7a33d3dc7e72dac4c1ed7fe91143c8377531 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Wed, 20 Aug 2008 15:01:36 +0200 Subject: [PATCH] Fix ostack manipulation for floating numbers, fix IS_JAM_ARRAY Also some minor code reorganisation, debug and comments. --- src/arch/avr32_jem.h | 31 ++++++++++++++--- src/execute.c | 76 +++++++++++++++++++++--------------------- src/interp/engine/interp_jem.c | 10 +----- 3 files changed, 65 insertions(+), 52 deletions(-) diff --git a/src/arch/avr32_jem.h b/src/arch/avr32_jem.h index 568093a..b0f1713 100644 --- a/src/arch/avr32_jem.h +++ b/src/arch/avr32_jem.h @@ -50,11 +50,32 @@ struct jem_state { union ins_operand operand; //point to operands used by next opcode }; +#define JEM_DEBUG + +#ifdef JEM_DEBUG +#define jam_dprintf(arg...) jam_printf(arg) +#else +#define jam_dprintf(arg...) do {} while (0) +#endif + #define JAM_ARRAY(ptr) ((Object*)((uintptr_t*)(ptr) - 1) - 1) #define JAM_OBJECT(ptr) ((Object*)(ptr) - 1) -#define IS_JAM_OBJECT(ptr) ((ptr) && (*((uintptr_t*)(ptr) - 1) & 1)) -#define IS_JAM_ARRAY(ptr) ((ptr) && (*(uintptr_t*)(ptr) - 1) & 1 && \ - !((uintptr_t)(ptr) & 7)) + +#define __jam_obj(p) (*((uintptr_t*)(p) - 1)) +#define __is_jam_obj(p) (__jam_obj(p) & 1) + +#define IS_JAM_OBJECT(ptr) ({ \ + if (ptr) \ + jam_dprintf("test-jem-object: %p\n", \ + __jam_obj(ptr)); \ + (ptr) && __is_jam_obj(ptr); }) + +#define IS_JAM_ARRAY(ptr) ({ \ + if (ptr) \ + jam_dprintf("test-jem-array: %p\n", \ + __jam_obj(ptr)); \ + (ptr) && __is_jam_obj(ptr) && \ + !((uintptr_t)(ptr) & 7); }) #define ostack_push_f32 ostack_push_u32 #define ostack_pop_f32 ostack_pop_u32 @@ -68,12 +89,12 @@ struct jem_state { #ifndef OSTACK_DEBUG #define ostack_push_u32(base, size, top, data) ({ \ - *(top)++ = (data); \ + *(typeof(data) *)(top)++ = (data); \ 0; \ }) #define ostack_pop_u32(base, size, top, data) ({ \ - (data) = (typeof(data))*--(top); \ + (data) = *(typeof(data) *)--(top); \ 0; \ }) diff --git a/src/execute.c b/src/execute.c index 0b63fbb..4530c89 100644 --- a/src/execute.c +++ b/src/execute.c @@ -29,52 +29,52 @@ #define VA_DOUBLE(args, sp) *(u8*)sp = va_arg(args, u8); sp+=2 -#ifdef JEM +#define VA_SINGLE(args, sp) \ + if(*sig == 'L' || *sig == '[') \ + *sp = va_arg(args, uintptr_t); \ + else if(*sig == 'F') \ + *(u4*)sp = va_arg(args, u4); \ + else \ + *sp = va_arg(args, u4); \ + sp++ +#ifdef JEM #define VA_DOUBLE_JEM(args, sp, fp_jem) do { \ fp_jem -= 2; \ *(u8*)sp = va_arg(args, u8); \ *(u8*)fp_jem = *(u8*)sp; \ sp += 2; \ } while (0) -#endif -#define VA_SINGLE(args, sp) \ - if(*sig == 'L' || *sig == '[') \ - *sp = va_arg(args, uintptr_t); \ - else if(*sig == 'F') { \ - *(u4*)sp = va_arg(args, u4); \ - } else \ - *sp = va_arg(args, u4); \ - sp++ - -#ifdef JEM -#define VA_SINGLE_JEM(args, sp, fp_jem) do { \ - fp_jem--; \ - switch (*sig) { \ - case 'L': \ - *sp = va_arg(args, uintptr_t); \ - if (IS_JAM_OBJECT(*sp)) \ - *fp_jem = (uint32_t)INST_DATA((Object*)(*sp));\ - else \ - *fp_jem = *sp; \ - break; \ - case '[': \ - *sp = va_arg(args, uintptr_t); \ - if(IS_JAM_ARRAY(*sp)) \ - *fp_jem = (uint32_t)ARRAY_DATA((Object*)(*sp));\ - else \ - *fp_jem = *sp; \ - break; \ - case 'F': \ - *(u4*)sp = va_arg(args, u4); \ - *(u4*)fp_jem = *(u4*)sp; \ - break; \ - default: \ - *sp = va_arg(args, u4); \ - *fp_jem = *sp; \ - } \ - sp++; \ +#define VA_SINGLE_JEM(args, sp, fp_jem) do { \ + fp_jem--; \ + switch (*sig) { \ + case 'L': \ + *sp = va_arg(args, uintptr_t); \ + if (IS_JAM_OBJECT(*sp)) \ + /* If this is an object, we have to calculate a */ \ + /* pointer to its data for JEM */ \ + *fp_jem = (uint32_t)INST_DATA((Object*)(*sp)); \ + else \ + *fp_jem = *sp; \ + break; \ + case '[': \ + *sp = va_arg(args, uintptr_t); \ + if(IS_JAM_ARRAY(*sp)) \ + /* Array - similar to object above */ \ + *fp_jem = (uint32_t)ARRAY_DATA((Object*)(*sp)); \ + else \ + *fp_jem = *sp; \ + break; \ + case 'F': \ + *(u4*)sp = va_arg(args, u4); \ + *(u4*)fp_jem = *(u4*)sp; \ + break; \ + default: \ + *sp = va_arg(args, u4); \ + *fp_jem = *sp; \ + } \ + sp++; \ } while (0) #endif diff --git a/src/interp/engine/interp_jem.c b/src/interp/engine/interp_jem.c index 5b25c49..830321c 100644 --- a/src/interp/engine/interp_jem.c +++ b/src/interp/engine/interp_jem.c @@ -41,13 +41,6 @@ #include "arch/avr32_jem.h" #include "interp_jem.h" -#define JEM_DEBUG -#ifdef JEM_DEBUG -#define jam_dprintf(arg...) jam_printf(arg) -#else -#define jam_dprintf(arg...) do {} while (0) -#endif - union jecr { struct { uint8_t dummy; @@ -278,7 +271,6 @@ static int invokeMethod(struct intrp_ctx *ctx) } jam_dprintf("[invokeMethod] finish native method invoke, return to loop\n"); - return 0; } else { ctx->frame = new_frame; ctx->mb = ctx->new_mb; @@ -290,8 +282,8 @@ static int invokeMethod(struct intrp_ctx *ctx) jam_dprintf("[invokeMethod] invoke virtual method: frame %x mb %x " "lvars %x jpc %x cp %x \n", ctx->frame, ctx->mb, ctx->lvars_jem, ctx->jem.jpc, ctx->cp); + jam_dprintf("[invokeMethod] finish virtual method invoke, return to loop\n"); } - jam_dprintf("[invokeMethod] finish virtual method invoke, return to loop\n"); return 0; } -- 2.11.4.GIT