/*
 *  ARM micro operations (templates for various register related
 *  operations)
 * 
 *  Copyright (c) 2003 Fabrice Bellard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#ifndef SET_REG
#define SET_REG(x) REG = x
#endif

void OPPROTO glue(op_movl_T0_, REGNAME)(void)
{
    T0 = REG;
}

void OPPROTO glue(op_movl_T1_, REGNAME)(void)
{
    T1 = REG;
}

void OPPROTO glue(op_movl_T2_, REGNAME)(void)
{
    T2 = REG;
}

void OPPROTO glue(glue(op_movl_, REGNAME), _T0)(void)
{
    SET_REG (T0);
}

void OPPROTO glue(glue(op_movl_, REGNAME), _T1)(void)
{
    SET_REG (T1);
}

#undef REG
#undef REGNAME
#undef SET_REG
