/*  This file is part of the program psim.

    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>

    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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
 
    */


/* Instruction field macros:

   The macro's below greatly simplify the process of translating the
   pseudo code found in the PowerPC manual into C.

   In addition to the below, more will be found in the gen program's
   cache table */

#include "symcat.h"

/* map some statements and variables directly across */

#define is_64bit_implementation (WITH_TARGET_WORD_BITSIZE == 64)
#define is_64bit_mode           IS_64BIT_MODE(processor)

#define NIA nia
#define CIA cia


/* reservation */

#define RESERVE        cpu_reservation(processor)->valid
#define RESERVE_ADDR   cpu_reservation(processor)->addr
#define RESERVE_DATA   cpu_reservation(processor)->data

#define real_addr(EA, IS_READ)  vm_real_data_addr(cpu_data_map(processor), \
						  EA, \
						  IS_READ, \
						  processor, \
						  cia)


/* depending on mode return a 32 or 64bit number */

#define IEA(X)       (is_64bit_mode \
		      ? (X) \
		      : MASKED((X), 32, 63))

/* Expand argument to current architecture size */

#define EXTS(X)		EXTS_##X


/* Gen translates text of the form A{XX:YY} into A_XX_YY_ the macro's
   below define such translated text into real expressions */

/* the spr field as it normally is used */

#define SPR_5_9_ (SPR & 0x1f)
#define SPR_0_4_ (SPR >> 5)
#define SPR_0_ ((SPR & BIT10(0)) != 0)

#define tbr_5_9_ (tbr & 0x1f)
#define tbr_0_4_ (tbr >> 5)


#define TB cpu_get_time_base(processor)


/* various registers with important masks */

#define LR_0b00		(LR & ~3)
#define CTR_0b00	(CTR & ~3)

#define CR_BI_  ((CR & BIT32_BI) != 0)
#define CR_BA_	((CR & BIT32_BA) != 0)
#define CR_BB_	((CR & BIT32_BB) != 0)


/* extended extracted fields */

#define TO_0_ ((TO & BIT5(0)) != 0)
#define TO_1_ ((TO & BIT5(1)) != 0)
#define TO_2_ ((TO & BIT5(2)) != 0)
#define TO_3_ ((TO & BIT5(3)) != 0)
#define TO_4_ ((TO & BIT5(4)) != 0)

#define BO_0_ ((BO & BIT5(0)) != 0)
#define BO_1_ ((BO & BIT5(1)) != 0)
#define BO_2_ ((BO & BIT5(2)) != 0)
#define BO_3_ ((BO & BIT5(3)) != 0)
#define BO_4_ ((BO & BIT5(4)) != 0)

#define GOTO(dest)   goto XCONCAT4(label__,dest,__,MY_PREFIX)
#define LABEL(dest)  XCONCAT4(label__,dest,__,MY_PREFIX)
