* configure.ac [ENABLE_STATICVM] (AC_CHECK_LIB(dl)): Only perform the
[cacao.git] / src / vm / jit / arm / md-abi.h
diff --git a/src/vm/jit/arm/md-abi.h b/src/vm/jit/arm/md-abi.h
new file mode 100644 (file)
index 0000000..960965c
--- /dev/null
@@ -0,0 +1,148 @@
+/* src/vm/jit/arm/md-abi.h - defines for arm ABI
+
+   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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Contact: cacao@cacaojvm.org
+
+   Authors: Michael Starzinger
+
+   $Id: md-abi.h 6545 2006-09-06 21:42:42Z twisti $
+
+*/
+
+
+#ifndef _MD_ABI_H
+#define _MD_ABI_H
+
+
+/* preallocated registers *****************************************************/
+
+/* integer registers */
+
+#define REG_RESULT      0    /* to deliver method results                     */
+#define REG_RESULT2     1    /* to deliver long method results                */
+
+#define REG_IP          12   /* intra-procedure-call scratch register         */
+#define REG_SP          13   /* stack pointer                                 */
+#define REG_LR          14   /* link register                                 */
+#define REG_PC          15   /* program counter                               */
+
+#define REG_METHODPTR   11   /* special register to fetch procedure vector    */
+
+#define REG_ITMP1       10   /* temporary register                            */
+#define REG_ITMP2       11   /* temporary register and method pointer         */
+#define REG_ITMP3       9    /* temporary register                            */
+
+#define REG_ITMP1_XPTR  10   /* exception pointer = temporary register 1      */
+#define REG_ITMP2_XPC   11   /* exception pc = temporary register 2           */
+
+#define REG_A0           0   /* define some argument registers                */
+#define REG_A1           1
+#define REG_A2           2
+#define REG_A3           3
+
+#define REG_SPLIT       16   /* dummy register to mark a split of longs and   */
+                             /* doubles across register/stack barrier         */
+                             /* set LOW_REG = ARG4 and HIGH_REG = REG_SPLIT   */
+
+#define BITMASK_ARGS    0x0f /* bitmask for LDM/STM to save method arguments  */
+#define BITMASK_RESULT  0x03 /* bitmask for LDM/STM to save method results    */
+
+#if !defined(ENABLE_SOFTFLOAT)
+/* floating point registers */
+
+#define REG_FRESULT     0    /* to deliver floating point method results      */
+#define REG_FTMP1       6    /* temporary floating point register             */
+#define REG_FTMP2       7    /* temporary floating point register             */
+
+#endif /* !defined(ENABLE_SOFTFLOAT) */
+
+
+/* register count *************************************************************/
+#define INT_REG_CNT     16   /* number of integer registers                   */
+#define INT_TMP_CNT     0    /* number of integer registers                   */
+#define INT_SAV_CNT     5    /* number of int callee saved registers          */
+#define INT_ARG_CNT     4    /* number of int argument registers              */
+#define INT_RES_CNT     7    /* number of reserved integer registers          */
+
+#define FLT_REG_CNT     8    /* number of float registers                     */
+#if defined(ENABLE_SOFTFLOAT)
+# define FLT_TMP_CNT    0    /* number of flt temp registers                  */
+# define FLT_SAV_CNT    0    /* number of flt callee saved registers          */
+# define FLT_ARG_CNT    0    /* number of flt argument registers              */
+# define FLT_RES_CNT    8    /* number of reserved float registers            */
+#else
+# define FLT_TMP_CNT    6    /* number of flt temp registers                  */
+# define FLT_SAV_CNT    0    /* number of flt callee saved registers          */
+# define FLT_ARG_CNT    0    /* number of flt argument registers              */
+# define FLT_RES_CNT    2    /* number of reserved float registers            */
+#endif /* defined(ENABLE_SOFTFLOAT) */
+
+#define TRACE_ARGS_NUM  4
+
+
+/* Register Pack/Unpack Macros ************************************************/
+
+#if defined(__ARMEL__)
+
+# define REG_ITMP12_PACKED    PACK_REGS(REG_ITMP1, REG_ITMP2)
+# define REG_ITMP23_PACKED    PACK_REGS(REG_ITMP2, REG_ITMP3)
+# define REG_RESULT_PACKED    PACK_REGS(REG_RESULT, REG_RESULT2)
+
+# define REG_A0_A1_PACKED     PACK_REGS(REG_A0, REG_A1)
+# define REG_A2_A3_PACKED     PACK_REGS(REG_A2, REG_A3)
+
+#else /* defined(__ARMEB__) */
+
+# define REG_ITMP12_PACKED    PACK_REGS(REG_ITMP2, REG_ITMP1)
+# define REG_ITMP23_PACKED    PACK_REGS(REG_ITMP3, REG_ITMP2)
+# define REG_RESULT_PACKED    PACK_REGS(REG_RESULT2, REG_RESULT)
+
+# define REG_A0_A1_PACKED     PACK_REGS(REG_A1, REG_A0)
+# define REG_A2_A3_PACKED     PACK_REGS(REG_A3, REG_A2)
+
+#endif
+
+#define REG_ITMP12_TYPED(t) ((IS_2_WORD_TYPE(t)) ? REG_ITMP12_PACKED : REG_ITMP1)
+#define REG_RESULT_TYPED(t) ((IS_2_WORD_TYPE(t)) ? REG_RESULT_PACKED : REG_RESULT)
+#define ARGUMENT_REGS(t,a)  ((IS_2_WORD_TYPE(t)) ? \
+          (PACK_REGS(rd->argintregs[GET_LOW_REG(a)],rd->argintregs[GET_HIGH_REG(a)])) : \
+          (rd->argintregs[(a)]) \
+       )
+
+
+#endif /* _MD_ABI_H */
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */