X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fi386%2Fmd.h;h=0756bb26a1db78dbc07a19eb7538b34116e9b38e;hb=d62d56aa9150bb2156dac82966795fdcbd7562e0;hp=568f8e934d0115ac9bb15754eedc4e32cbb2346e;hpb=3b23931d1826144ec30695d9c0ba8b147a21191d;p=cacao.git diff --git a/src/vm/jit/i386/md.h b/src/vm/jit/i386/md.h index 568f8e934..0756bb26a 100644 --- a/src/vm/jit/i386/md.h +++ b/src/vm/jit/i386/md.h @@ -1,6 +1,6 @@ /* src/vm/jit/i386/md.h - machine dependent i386 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. @@ -31,12 +31,36 @@ #include #include -#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) +{ + int32_t stackframesize; + + // Check for the asm_vm_call_method special case. + if (code == NULL) + return 0; + + // On i386 we use 8-byte stackslots. + stackframesize = code->stackframesize * 8; + + // If there is a stackframe present, we need to take the alignment + // compensation for the stored return address into account. + if (stackframesize != 0) + stackframesize += 4; + + return stackframesize; +} + + /* md_stacktrace_get_returnaddress ********************************************* Returns the return address of the current stackframe, specified by @@ -85,7 +109,8 @@ inline static void *md_codegen_get_pv_from_pc(void *ra) inline static void md_cacheflush(void *addr, int nbytes) { - /* do nothing */ + // Compiler optimization barrier (see PR97). + __asm__ __volatile__ ("" : : : "memory"); } @@ -97,7 +122,8 @@ inline static void md_cacheflush(void *addr, int nbytes) inline static void md_icacheflush(void *addr, int nbytes) { - /* do nothing */ + // Compiler optimization barrier (see PR97). + __asm__ __volatile__ ("" : : : "memory"); } @@ -109,7 +135,25 @@ inline static void md_icacheflush(void *addr, int nbytes) inline static void md_dcacheflush(void *addr, int nbytes) { - /* do nothing */ + // 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; + + // Get current cycles count from the CPU. + __asm__ __volatile__ ("rdtsc" : "=A" (cycles)); + + return cycles; } #endif /* _VM_JIT_I386_MD_H */