| /*  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) |