From 50815dfe4d8183c744366a0bf9a95616bb0c1362 Mon Sep 17 00:00:00 2001 From: tbfg Date: Mon, 7 May 2007 14:26:41 +0000 Subject: [PATCH] * src/vm/jit/m68k/codegen.c (ICMD_FNEG): Implemented. (ICMD_DNEG): Implemented. * src/vm/jit/m68k/asmpart.S (asm_call_jit_compiler): Store volatile floatregisters. (asm_patcher_wrapper): Likewise. (asm_handle_exception): Restore float registers. * src/vm/jit/m68k/codegen.h (M_FNEG): Added. (M_DNEG): Added. --- src/vm/jit/m68k/asmpart.S | 43 +++++++++++++++++++++++++++++++-------- src/vm/jit/m68k/codegen.c | 13 ++++++++++++ src/vm/jit/m68k/codegen.h | 7 +++++-- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/vm/jit/m68k/asmpart.S b/src/vm/jit/m68k/asmpart.S index 0aad747e0..f4799827d 100644 --- a/src/vm/jit/m68k/asmpart.S +++ b/src/vm/jit/m68k/asmpart.S @@ -146,9 +146,15 @@ asm_vm_call_method_exception_handler: asm_call_jit_compiler: addal #(-4*4),%sp /* create stackframe to save registers */ moveml %a0/%a1/%d0/%d1,%sp@ /* save volatile registers */ - - movel %sp@(4*4),%sp@- /* push arguments onto stack (ra)*/ +#if !defined(ENABLE_SOFTFLOAT) + fmoved %fp0, %sp@- + fmoved %fp1, %sp@- + movel %sp@(8*4), %sp@- + pea %sp@(8*4+8) +#else + movel %sp@(4*4), %sp@- /* push arguments onto stack (ra)*/ pea %sp@(4*4+8) /* the old stack pointer*/ +#endif movel %a3,%sp@- /* mptr */ movel %a2,%sp@- /* methodinfo */ @@ -157,6 +163,11 @@ asm_call_jit_compiler: addal #(4*4),%sp /* pop arguments off stack */ moveal %d0, %a2 /* to tmp register */ +#if !defined(ENABLE_SOFTFLOAT) + fdmoved %sp@+, %fp1 + fdmoved %sp@+, %fp0 +#endif + moveml %sp@,%a0/%a1/%d0/%d1 /* restore volatile registers */ addal #(4*4),%sp /* remove stackframe */ @@ -195,13 +206,16 @@ asm_patcher_wrapper: movel %d0, %sp@- movel %d1, %sp@- +#if defined(ENABLE_SOFTFLOAT) /* calculate original value of sp */ movel %sp, %d0 addil #4*4, %d0 +#else + fmoved %fp0, %sp@- + fmoved %fp1, %sp@- -#if !defined(ENABLE_SOFTFLOAT) - movel %f0, %sp@- - movel %f1, %sp@- + movel %sp, %d0 + addil #8*4, %d0 #endif clrl %sp@- /* pass ra */ @@ -214,8 +228,8 @@ asm_patcher_wrapper: bne L_asm_patcher_wrapper_exception #if !defined(ENABLE_SOFTFLOAT) - movel %sp@+, %f0 - movel %sp@+, %f1 + fdmoved %sp@+, %fp1 + fdmoved %sp@+, %fp0 #endif movel %sp@+, %d1 movel %sp@+, %d0 @@ -353,7 +367,20 @@ L_asm_handle_ex_int_done: L_handle_exception_nat_catched_no_adr: #if !defined(ENABLE_SOFTFLOAT) - FIXME + movel %a3@(FltSave), %d0 + cmpb #0,%d0 + beq L_asm_handle_ex_flt_done + fdmoved -(%a0), %fp7 + + cmpb #1,%d0 + beq L_asm_handle_ex_flt_done + fdmoved -(%a0), %fp6 + + cmpb #2,%d0 + beq L_asm_handle_ex_flt_done + fdmoved -(%a0), %fp5 + +L_asm_handle_ex_flt_done: #else /* nothing to do */ #endif diff --git a/src/vm/jit/m68k/codegen.c b/src/vm/jit/m68k/codegen.c index 36d01bb24..81c403026 100644 --- a/src/vm/jit/m68k/codegen.c +++ b/src/vm/jit/m68k/codegen.c @@ -897,6 +897,7 @@ bool codegen_emit(jitdata *jd) M_F2D(s1, d); emit_store_dst(jd, iptr, d); break; + case ICMD_D2F: /* ..., value ==> ..., (float) value */ s1 = emit_load_s1(jd, iptr, REG_FTMP1); d = codegen_reg_of_dst(jd, iptr, REG_FTMP2); @@ -904,7 +905,19 @@ bool codegen_emit(jitdata *jd) emit_store_dst(jd, iptr, d); break; + case ICMD_FNEG: /* ..., value ==> ..., - value */ + s1 = emit_load_s1(jd, iptr, REG_FTMP1); + d = codegen_reg_of_dst(jd, iptr, REG_FTMP2); + M_FNEG(s1, d); + emit_store_dst(jd, iptr, d); + break; + case ICMD_DNEG: /* ..., value ==> ..., - value */ + s1 = emit_load_s1(jd, iptr, REG_FTMP1); + d = codegen_reg_of_dst(jd, iptr, REG_FTMP2); + M_DNEG(s1, d); + emit_store_dst(jd, iptr, d); + break; #endif diff --git a/src/vm/jit/m68k/codegen.h b/src/vm/jit/m68k/codegen.h index cb606db9f..f4a06ac61 100644 --- a/src/vm/jit/m68k/codegen.h +++ b/src/vm/jit/m68k/codegen.h @@ -427,8 +427,11 @@ #define M_FDIV(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x60 ) /* fsdiv */ #define M_DDIV(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x64 ) /* fddiv */ - #define M_D2F(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) <<7 ) | 0x40 ) /* fmove.s */ - #define M_F2D(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) <<7 ) | 0x44 ) /* fmove.d */ + #define M_D2F(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x40 ) /* fmove.s */ + #define M_F2D(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x44 ) /* fmove.d */ + + #define M_FNEG(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x5a ) /* fneg.s */ + #define M_DNEG(a,b) OPWORD_IMM16(0x3c8, 0, 0, ((a) << 10) | ((b) << 7) | 0x5e ) /* fneg.d */ #endif #endif /* _CODEGEN_H */ -- 2.25.1