hostregs_helper.h revision 4af48bf7c72ef1e201c64bd475377b5af9d8e8a1
2N/A/*
2N/A * Save/restore host registrs.
2N/A *
2N/A * Copyright (c) 2007 CodeSourcery
2N/A *
2N/A * This library is free software; you can redistribute it and/or
2N/A * modify it under the terms of the GNU Lesser General Public
2N/A * License as published by the Free Software Foundation; either
2N/A * version 2 of the License, or (at your option) any later version.
2N/A *
2N/A * This library is distributed in the hope that it will be useful,
2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2N/A * Lesser General Public License for more details.
2N/A *
2N/A * You should have received a copy of the GNU Lesser General Public
2N/A * License along with this library; if not, write to the Free Software
2N/A * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
2N/A */
2N/A
2N/A/*
2N/A * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
2N/A * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
2N/A * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
2N/A * a choice of LGPL license versions is made available with the language indicating
2N/A * that LGPLv2 or any later version may be used, or where a choice of which version
2N/A * of the LGPL is applied is otherwise unspecified.
2N/A */
2N/A
2N/A/* The GCC global register variable extension is used to reserve some
2N/A host registers for use by generated code. However only the core parts of
2N/A the translation engine are compiled with these settings. We must manually
2N/A save/restore these registers when called from regular code.
It is not sufficient to save/restore T0 et. al. as these may be declared
with a datatype smaller than the actual register. */
#if defined(DECLARE_HOST_REGS)
#define DO_REG(REG) \
register host_reg_t reg_AREG##REG asm(AREG##REG); \
volatile host_reg_t saved_AREG##REG;
#elif defined(SAVE_HOST_REGS)
#define DO_REG(REG) \
__asm__ __volatile__ ("" : "=r" (reg_AREG##REG)); \
saved_AREG##REG = reg_AREG##REG;
#else
#define DO_REG(REG) \
reg_AREG##REG = saved_AREG##REG; \
__asm__ __volatile__ ("" : : "r" (reg_AREG##REG));
#endif
#ifdef AREG0
DO_REG(0)
#endif
#ifdef AREG1
DO_REG(1)
#endif
#ifdef AREG2
DO_REG(2)
#endif
#ifdef AREG3
DO_REG(3)
#endif
#ifdef AREG4
DO_REG(4)
#endif
#ifdef AREG5
DO_REG(5)
#endif
#ifdef AREG6
DO_REG(6)
#endif
#ifdef AREG7
DO_REG(7)
#endif
#ifdef AREG8
DO_REG(8)
#endif
#ifdef AREG9
DO_REG(9)
#endif
#ifdef AREG10
DO_REG(10)
#endif
#ifdef AREG11
DO_REG(11)
#endif
#undef SAVE_HOST_REGS
#undef DECLARE_HOST_REGS
#undef DO_REG