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