* src/vm/jit/md.h: Removed.
[cacao.git] / src / vm / jit / alpha / md.h
index 40908469833aab177e6788f5ecafe88c1bafb65f..4899d8f9ffd15d347773cd52eb5a4575ff4f8d57 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/alpha/md.h - machine dependent Alpha functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
+*/
 
-   Authors: Christian Thalinger
 
-   Changes:
+#ifndef _VM_JIT_ALPHA_MD_H
+#define _VM_JIT_ALPHA_MD_H
 
-*/
+#include "config.h"
 
+#include <assert.h>
+#include <stdint.h>
 
-#ifndef _MD_H
-#define _MD_H
+#include "vm/jit/alpha/codegen.h"
 
-#include "config.h"
 #include "vm/global.h"
+#include "vm/vm.h"
+
+#include "vm/jit/asmpart.h"
+#include "vm/jit/codegen-common.h"
 
 
 /* global variables ***********************************************************/
 
 extern bool has_ext_instr_set;
 
-/* function prototypes ********************************************************/
 
-#endif /* _MD_H_ */
+/* inline functions ***********************************************************/
+
+/* md_stacktrace_get_returnaddress *********************************************
+
+   Returns the return address of the current stackframe, specified by
+   the passed stack pointer and the stack frame size.
+
+*******************************************************************************/
+
+inline static void *md_stacktrace_get_returnaddress(void *sp, int32_t stackframesize)
+{
+       void *ra;
+
+       /* On Alpha the return address is located on the top of the
+          stackframe. */
+
+       ra = *((void **) (((uintptr_t) sp) + stackframesize - SIZEOF_VOID_P));
+
+       return ra;
+}
+
+
+/* md_codegen_get_pv_from_pc ***************************************************
+
+   Machine code:
+
+   6b5b4000    jsr     (pv)
+   277afffe    ldah    pv,-2(ra)
+   237ba61c    lda     pv,-23012(pv)
+
+*******************************************************************************/
+
+inline static void *md_codegen_get_pv_from_pc(void *ra)
+{
+       uint32_t *pc;
+       uint32_t  mcode;
+       int       opcode;
+       int32_t   disp;
+       void     *pv;
+
+       pc = (uint32_t *) ra;
+
+       /* Get first instruction word after jump. */
+
+       mcode = pc[0];
+
+       /* Get opcode and displacement. */
+
+       opcode = M_MEM_GET_Opcode(mcode);
+       disp   = M_MEM_GET_Memory_disp(mcode);
+
+       /* Check for short or long load (2 instructions). */
+
+       switch (opcode) {
+       case 0x08: /* LDA: TODO use define */
+               assert((mcode >> 16) == 0x237a);
+
+               pv = ((uint8_t *) pc) + disp;
+               break;
+
+       case 0x09: /* LDAH: TODO use define */
+               pv = ((uint8_t *) pc) + (disp << 16);
+
+               /* Get displacement of second instruction (LDA). */
+
+               mcode = pc[1];
+
+               assert((mcode >> 16) == 0x237b);
+
+               disp = M_MEM_GET_Memory_disp(mcode);
+
+               pv = ((uint8_t *) pv) + disp;
+               break;
+
+       default:
+               vm_abort_disassemble(pc, 2, "md_codegen_get_pv_from_pc: unknown instruction %x", mcode);
+               return NULL;
+       }
+
+       return pv;
+}
+
+
+/* md_cacheflush ***************************************************************
+
+   Calls the system's function to flush the instruction and data
+   cache.
+
+*******************************************************************************/
+
+inline static void md_cacheflush(void *addr, int nbytes)
+{
+       asm_cacheflush(addr, nbytes);
+}
+
+
+/* md_icacheflush **************************************************************
+
+   Calls the system's function to flush the instruction cache.
+
+*******************************************************************************/
+
+inline static void md_icacheflush(void *addr, int nbytes)
+{
+       asm_cacheflush(addr, nbytes);
+}
+
+
+/* md_dcacheflush **************************************************************
+
+   Calls the system's function to flush the data cache.
+
+*******************************************************************************/
+
+inline static void md_dcacheflush(void *addr, int nbytes)
+{
+       /* do nothing */
+}
+
+#endif /* _VM_JIT_ALPHA_MD_H */
 
 
 /*