#include "arch.h"
#include "md-abi.h"
-#include "mm/memory.h"
+#include "mm/memory.hpp"
#include "vm/jit/builtin.hpp"
#include "vm/exceptions.hpp"
-#include "vm/method.h"
+#include "vm/method.hpp"
#include "vm/options.h"
-#include "vm/resolve.h"
+#include "vm/resolve.hpp"
#include "vm/string.hpp"
#include "vm/jit/abi.h"
/* size of a stackslot used by the internal ABI */
-#if defined(HAS_4BYTE_STACKSLOT)
-# define SIZE_OF_STACKSLOT 4
-#else
-# define SIZE_OF_STACKSLOT 8
-#endif
+#define SIZE_OF_STACKSLOT 8
/* total number of registers */
#define NEW_MEM_SLOT(r) \
do { \
(r) = rd->memuse * SIZE_OF_STACKSLOT; \
- rd->memuse += memneeded + 1; \
- } while (0)
-
-#define NEW_MEM_SLOT_ALIGNED(r) \
- do { \
- if ( (memneeded) && (rd->memuse & 1)) \
- rd->memuse++; \
- (r) = rd->memuse * SIZE_OF_STACKSLOT; \
- rd->memuse += memneeded + 1; \
+ rd->memuse += 1; \
} while (0)
-#define NEW_MEM_SLOT_ALIGNED_REUSE_PADDING(r) \
- do { \
- if ( (memneeded) && (rd->memuse & 1)) { \
- PUSH_BACK(rd->freemem, rd->freememtop, rd->memuse); \
- rd->memuse++; \
- } \
- (r) = rd->memuse * SIZE_OF_STACKSLOT; \
- rd->memuse += memneeded + 1; \
- } while (0)
-
-#if defined(ALIGN_LONGS_IN_MEMORY)
-#define NEW_MEM_SLOT_INT_LNG(r) NEW_MEM_SLOT_ALIGNED(r)
-#else
#define NEW_MEM_SLOT_INT_LNG(r) NEW_MEM_SLOT(r)
-#endif
-
-#if defined(ALIGN_DOUBLES_IN_MEMORY)
-#define NEW_MEM_SLOT_FLT_DBL(r) NEW_MEM_SLOT_ALIGNED(r)
-#else
#define NEW_MEM_SLOT_FLT_DBL(r) NEW_MEM_SLOT(r)
-#endif
-
-#if defined(ALIGN_LONGS_IN_MEMORY) || defined(ALIGN_DOUBLES_IN_MEMORY)
-#define NEW_MEM_SLOT_REUSE_PADDING(r) NEW_MEM_SLOT_ALIGNED_REUSE_PADDING(r)
-#else
#define NEW_MEM_SLOT_REUSE_PADDING(r) NEW_MEM_SLOT(r)
-#endif
/* macros for creating/freeing temporary variables ***************************/
/* regalloc ********************************************************************
Does a simple register allocation.
-
+
*******************************************************************************/
-
+
bool regalloc(jitdata *jd)
{
/* There is a problem with the use of unused float argument
/* simplereg_allocate_interfaces ***********************************************
Allocates registers for all interface variables.
-
+
*******************************************************************************/
-
+
static void simplereg_allocate_interfaces(jitdata *jd)
{
methodinfo *m;
int s, t, tt, saved;
int intalloc, fltalloc; /* Remember allocated Register/Memory offset */
/* in case more vars are packed into this interface slot */
- int memneeded = 0;
- /* Allocate LNG and DBL types first to ensure 2 memory slots or */
- /* registers on HAS_4BYTE_STACKSLOT architectures. */
+ /* Allocate LNG and DBL types first to ensure 2 registers */
+ /* on some architectures. */
int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
int flags, regoff;
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-
if (!saved) {
#if defined(HAS_ADDRESS_REGISTER_FILE)
if (IS_ADR_TYPE(t)) {
/* simplereg_allocate_locals_leafmethod ****************************************
Allocates registers for all local variables of a leafmethod.
-
+
*******************************************************************************/
-
+
static void simplereg_allocate_locals_leafmethod(jitdata *jd)
{
methodinfo *m;
int intalloc, fltalloc;
varinfo *v;
int intregsneeded = 0;
- int memneeded = 0;
int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
int fargcnt, iargcnt;
#ifdef HAS_ADDRESS_REGISTER_FILE
#if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
/*
* The order of
/* simplereg_allocate_locals ***************************************************
Allocates registers for all local variables.
-
+
*******************************************************************************/
-
+
static void simplereg_allocate_locals(jitdata *jd)
{
codeinfo *code;
int s, t, tt, varindex;
int intalloc, fltalloc;
varinfo *v;
- int memneeded = 0;
int typeloop[] = { TYPE_LNG, TYPE_DBL, TYPE_INT, TYPE_FLT, TYPE_ADR };
#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
s4 intregsneeded;
intregsneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(t)) ? 1 : 0;
-#endif
-
#ifdef HAS_ADDRESS_REGISTER_FILE
if (IS_ADR_TYPE(t)) {
if (AVAIL_SAV_ADR) {
int i;
rd->freememtop = 0;
-#if defined(HAS_4BYTE_STACKSLOT)
- rd->freememtop_2 = 0;
-#endif
rd->freetmpinttop = 0;
rd->freesavinttop = 0;
#ifdef SUPPORT_COMBINE_INTEGER_REGISTERS
s4 intregsneeded;
#endif
- s4 memneeded;
s4 tryagain;
registerdata *rd;
varinfo *v;
intregsneeded = (IS_2_WORD_TYPE(v->type)) ? 1 : 0;
#endif
-#if defined(HAS_4BYTE_STACKSLOT)
- memneeded = (IS_2_WORD_TYPE(v->type)) ? 1 : 0;
-#else
- memneeded = 0;
-#endif
-
for(; tryagain; --tryagain) {
if (tryagain == 1) {
if (!(v->flags & SAVEDVAR))
v->flags |= INMEMORY;
-#if defined(HAS_4BYTE_STACKSLOT)
- if ((memneeded == 1) && (rd->freememtop_2 > 0))
- POP_BACK(rd->freemem_2, rd->freememtop_2, v->vv.regoff);
+ if (rd->freememtop > 0)
+ POP_BACK(rd->freemem, rd->freememtop, v->vv.regoff);
else
-#endif /*defined(HAS_4BYTE_STACKSLOT) */
- if ((memneeded == 0) && (rd->freememtop > 0))
- POP_BACK(rd->freemem, rd->freememtop, v->vv.regoff);
- else
- NEW_MEM_SLOT_REUSE_PADDING(v->vv.regoff);
+ NEW_MEM_SLOT_REUSE_PADDING(v->vv.regoff);
}
}
if (flags & INMEMORY) {
-#if defined(HAS_4BYTE_STACKSLOT)
- if (IS_2_WORD_TYPE(type))
- PUSH_BACK(rd->freemem_2, rd->freememtop_2, regoff);
- else
-#endif
- PUSH_BACK(rd->freemem, rd->freememtop, regoff);
-
+ PUSH_BACK(rd->freemem, rd->freememtop, regoff);
return;
}