/* src/vm/jit/x86_64/md.h - machine dependent x86_64 functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2009
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#include <assert.h>
#include <stdint.h>
-#include "vm/jit/codegen-common.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
*******************************************************************************/
-inline static void md_cacheflush(u1 *addr, s4 nbytes)
+inline static void md_cacheflush(void* addr, int nbytes)
{
- /* do nothing */
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
}
*******************************************************************************/
-inline static void md_icacheflush(u1 *addr, s4 nbytes)
+inline static void md_icacheflush(void* addr, int nbytes)
{
- /* do nothing */
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
}
*******************************************************************************/
-inline static void md_dcacheflush(u1 *addr, s4 nbytes)
+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()
{
- /* do nothing */
+ uint64_t cycles;
+
+ // Get current cycles count from the CPU.
+ __asm__ __volatile__ ("rdtsc" : "=A" (cycles));
+
+ return cycles;
}
#endif /* _VM_JIT_X86_64_MD_H */