src/vm/cycles-stats.h: Switched from asm_get_cycle_count to md_get_cycle_count.
[cacao.git] / src / vm / jit / x86_64 / md.h
index aeb4bb74c3e976b27a6a773e9f543d17d300490c..68f99e57e88d3529630bfa20cc65e20c29f151ef 100644 (file)
@@ -1,9 +1,7 @@
-/* src/vm/jit/x86_64/md.h - machine dependent x86_64 Linux functions
+/* src/vm/jit/x86_64/md.h - machine dependent x86_64 functions
 
-   Copyright (C) 1996-2005, 2006 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
+   Copyright (C) 1996-2005, 2006, 2007, 2008, 2009
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
+*/
 
-   Authors: Christian Thalinger
 
-   Changes:
+#ifndef _VM_JIT_X86_64_MD_H
+#define _VM_JIT_X86_64_MD_H
 
-   $Id: md.h 4357 2006-01-22 23:33:38Z twisti $
+#include "config.h"
 
-*/
+#include <assert.h>
+#include <stdint.h>
+
+#include "vm/jit/codegen-common.hpp"
+#include "vm/jit/methodtree.h"
+
+
+/* inline functions ***********************************************************/
+
+/**
+ * Returns the size (in bytes) of the current stackframe, specified by
+ * the passed codeinfo structure.
+ */
+inline static int32_t md_stacktrace_get_framesize(codeinfo* code)
+{
+       // Check for the asm_vm_call_method special case.
+       if (code == NULL)
+               return 0;
+
+       // On x86_64 we use 8-byte stackslots.
+       return code->stackframesize * 8;
+}
+
+
+/* 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 x86_64 the return address is above the current stack
+          frame. */
+
+       ra = *((void **) (((uintptr_t) sp) + stackframesize));
+
+       return ra;
+}
+
+
+/* md_codegen_get_pv_from_pc ***************************************************
+
+   On this architecture this is just a wrapper to methodtree_find.
+
+*******************************************************************************/
+
+inline static void *md_codegen_get_pv_from_pc(void *ra)
+{
+       void *pv;
+
+       /* Get the start address of the function which contains this
+       address from the method tree. */
+
+       pv = methodtree_find(ra);
+
+       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)
+{
+       // Compiler optimization barrier (see PR97).
+       __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_icacheflush **************************************************************
+
+   Calls the system's function to flush the instruction cache.
+
+*******************************************************************************/
+
+inline static void md_icacheflush(void* addr, int nbytes)
+{
+       // Compiler optimization barrier (see PR97).
+       __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_dcacheflush **************************************************************
+
+   Calls the system's function to flush the data cache.
+
+*******************************************************************************/
+
+inline static void md_dcacheflush(void* addr, int nbytes)
+{
+       // Compiler optimization barrier (see PR97).
+       __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_get_cycle_count **********************************************************
+
+   Get the current time-stamp counter from the CPU.
+
+*******************************************************************************/
 
+inline static uint64_t md_get_cycle_count()
+{
+       uint64_t cycles;
 
-#ifndef _MD_H
-#define _MD_H
+       // Get current cycles count from the CPU.
+       __asm__ __volatile__ ("rdtsc" : "=A" (cycles));
 
-/* function prototypes ********************************************************/
+       return cycles;
+}
 
-#endif /* _MD_H_ */
+#endif /* _VM_JIT_X86_64_MD_H */
 
 
 /*
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */