1 1.1 christos /* This file is part of the program psim. 2 1.1 christos 3 1.1 christos Copyright 1994, 1997, 2003 Andrew Cagney 4 1.1 christos 5 1.1 christos This program is free software; you can redistribute it and/or modify 6 1.1 christos it under the terms of the GNU General Public License as published by 7 1.1 christos the Free Software Foundation; either version 3 of the License, or 8 1.1 christos (at your option) any later version. 9 1.1 christos 10 1.1 christos This program is distributed in the hope that it will be useful, 11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1 christos GNU General Public License for more details. 14 1.1 christos 15 1.1 christos You should have received a copy of the GNU General Public License 16 1.1 christos along with this program; if not, see <http://www.gnu.org/licenses/>. 17 1.1 christos 18 1.1 christos */ 19 1.1 christos 20 1.1 christos 21 1.1 christos #ifndef _REGISTERS_H_ 22 1.1 christos #define _REGISTERS_H_ 23 1.1 christos 24 1.1 christos 25 1.1 christos /* 26 1.1 christos * The PowerPC registers 27 1.1 christos * 28 1.1 christos */ 29 1.1 christos 30 1.1 christos /* FIXME: 31 1.1 christos 32 1.1 christos For the moment use macro's to determine if the E500 or Altivec 33 1.1 christos registers should be included. IGEN should instead of a :register: 34 1.1 christos field to facilitate the specification and generation of per ISA 35 1.1 christos registers. */ 36 1.1 christos 37 1.1 christos #ifdef WITH_E500 38 1.1 christos #include "e500_registers.h" 39 1.1 christos #endif 40 1.1 christos #if WITH_ALTIVEC 41 1.1 christos #include "altivec_registers.h" 42 1.1 christos #endif 43 1.1 christos 44 1.1 christos /** 45 1.1 christos ** General Purpose Registers 46 1.1 christos **/ 47 1.1 christos 48 1.1 christos typedef signed_word gpreg; 49 1.1 christos 50 1.1 christos 51 1.1 christos 52 1.1 christos /** 53 1.1 christos ** Floating Point Registers 54 1.1 christos **/ 55 1.1 christos 56 1.6 christos typedef uint64_t fpreg; 57 1.1 christos 58 1.1 christos 59 1.1 christos 60 1.1 christos /** 61 1.1 christos ** The condition register 62 1.1 christos ** 63 1.1 christos **/ 64 1.1 christos 65 1.6 christos typedef uint32_t creg; 66 1.1 christos 67 1.1 christos /* The following sub bits are defined for the condition register */ 68 1.1 christos enum { 69 1.1 christos cr_i_negative = BIT4(0), 70 1.1 christos cr_i_positive = BIT4(1), 71 1.1 christos cr_i_zero = BIT4(2), 72 1.1 christos cr_i_summary_overflow = BIT4(3), 73 1.1 christos #if 0 74 1.1 christos /* cr0 - integer status */ 75 1.1 christos cr0_i_summary_overflow_bit = 3, 76 1.1 christos cr0_i_negative = BIT32(0), 77 1.1 christos cr0_i_positive = BIT32(1), 78 1.1 christos cr0_i_zero = BIT32(2), 79 1.1 christos cr0_i_summary_overflow = BIT32(3), 80 1.1 christos cr0_i_mask = MASK32(0,3), 81 1.1 christos #endif 82 1.1 christos /* cr1 - floating-point status */ 83 1.1 christos cr1_i_floating_point_exception_summary_bit = 4, 84 1.1 christos cr1_i_floating_point_enabled_exception_summary_bit = 5, 85 1.1 christos cr1_i_floating_point_invalid_operation_exception_summary_bit = 6, 86 1.1 christos cr1_i_floating_point_overflow_exception_bit = 7, 87 1.1 christos cr1_i_floating_point_exception_summary = BIT32(4), 88 1.1 christos cr1_i_floating_point_enabled_exception_summary = BIT32(5), 89 1.1 christos cr1_i_floating_point_invalid_operation_exception_summary = BIT32(6), 90 1.1 christos cr1_i_floating_point_overflow_exception = BIT32(7), 91 1.1 christos cr1_i_mask = MASK32(4,7), 92 1.1 christos }; 93 1.1 christos 94 1.1 christos 95 1.1 christos /* Condition register 1 contains the result of floating point arithmetic */ 96 1.1 christos enum { 97 1.1 christos cr_fp_exception = BIT4(0), 98 1.1 christos cr_fp_enabled_exception = BIT4(1), 99 1.1 christos cr_fp_invalid_exception = BIT4(2), 100 1.1 christos cr_fp_overflow_exception = BIT4(3), 101 1.1 christos }; 102 1.1 christos 103 1.1 christos 104 1.1 christos 105 1.1 christos /** 106 1.1 christos ** Floating-Point Status and Control Register 107 1.1 christos **/ 108 1.1 christos 109 1.6 christos typedef uint32_t fpscreg; 110 1.1 christos enum { 111 1.1 christos fpscr_fx_bit = 0, 112 1.1 christos fpscr_fx = BIT32(0), 113 1.1 christos fpscr_fex_bit = 1, 114 1.1 christos fpscr_fex = BIT32(1), 115 1.1 christos fpscr_vx_bit = 2, 116 1.1 christos fpscr_vx = BIT32(2), 117 1.1 christos fpscr_ox_bit = 3, 118 1.1 christos fpscr_ox = BIT32(3), 119 1.1 christos fpscr_ux = BIT32(4), 120 1.1 christos fpscr_zx = BIT32(5), 121 1.1 christos fpscr_xx = BIT32(6), 122 1.1 christos fpscr_vxsnan = BIT32(7), /* SNAN */ 123 1.1 christos fpscr_vxisi = BIT32(8), /* INF - INF */ 124 1.1 christos fpscr_vxidi = BIT32(9), /* INF / INF */ 125 1.1 christos fpscr_vxzdz = BIT32(10), /* 0 / 0 */ 126 1.1 christos fpscr_vximz = BIT32(11), /* INF * 0 */ 127 1.1 christos fpscr_vxvc = BIT32(12), 128 1.1 christos fpscr_fr = BIT32(13), 129 1.1 christos fpscr_fi = BIT32(14), 130 1.1 christos fpscr_fprf = MASK32(15, 19), 131 1.1 christos fpscr_c = BIT32(15), 132 1.1 christos fpscr_fpcc_bit = 16, /* well sort of */ 133 1.1 christos fpscr_fpcc = MASK32(16, 19), 134 1.1 christos fpscr_fl = BIT32(16), 135 1.1 christos fpscr_fg = BIT32(17), 136 1.1 christos fpscr_fe = BIT32(18), 137 1.1 christos fpscr_fu = BIT32(19), 138 1.1 christos fpscr_rf_quiet_nan = fpscr_c | fpscr_fu, 139 1.1 christos fpscr_rf_neg_infinity = fpscr_fl | fpscr_fu, 140 1.1 christos fpscr_rf_neg_normal_number = fpscr_fl, 141 1.1 christos fpscr_rf_neg_denormalized_number = fpscr_c | fpscr_fl, 142 1.1 christos fpscr_rf_neg_zero = fpscr_c | fpscr_fe, 143 1.1 christos fpscr_rf_pos_zero = fpscr_fe, 144 1.1 christos fpscr_rf_pos_denormalized_number = fpscr_c | fpscr_fg, 145 1.1 christos fpscr_rf_pos_normal_number = fpscr_fg, 146 1.1 christos fpscr_rf_pos_infinity = fpscr_fg | fpscr_fu, 147 1.1 christos fpscr_reserved_20 = BIT32(20), 148 1.1 christos fpscr_vxsoft = BIT32(21), 149 1.1 christos fpscr_vxsqrt = BIT32(22), 150 1.1 christos fpscr_vxcvi = BIT32(23), 151 1.1 christos fpscr_ve = BIT32(24), 152 1.1 christos fpscr_oe = BIT32(25), 153 1.1 christos fpscr_ue = BIT32(26), 154 1.1 christos fpscr_ze = BIT32(27), 155 1.1 christos fpscr_xe = BIT32(28), 156 1.1 christos fpscr_ni = BIT32(29), 157 1.1 christos fpscr_rn = MASK32(30, 31), 158 1.1 christos fpscr_rn_round_to_nearest = 0, 159 1.1 christos fpscr_rn_round_towards_zero = MASK32(31,31), 160 1.1 christos fpscr_rn_round_towards_pos_infinity = MASK32(30,30), 161 1.1 christos fpscr_rn_round_towards_neg_infinity = MASK32(30,31), 162 1.1 christos fpscr_vx_bits = (fpscr_vxsnan | fpscr_vxisi | fpscr_vxidi 163 1.1 christos | fpscr_vxzdz | fpscr_vximz | fpscr_vxvc 164 1.1 christos | fpscr_vxsoft | fpscr_vxsqrt | fpscr_vxcvi), 165 1.1 christos }; 166 1.1 christos 167 1.1 christos 168 1.1 christos 169 1.1 christos /** 170 1.1 christos ** XER Register 171 1.1 christos **/ 172 1.1 christos 173 1.6 christos typedef uint32_t xereg; 174 1.1 christos 175 1.1 christos enum { 176 1.1 christos xer_summary_overflow = BIT32(0), xer_summary_overflow_bit = 0, 177 1.1 christos xer_carry = BIT32(2), xer_carry_bit = 2, 178 1.1 christos xer_overflow = BIT32(1), 179 1.1 christos xer_reserved_3_24 = MASK32(3,24), 180 1.1 christos xer_byte_count_mask = MASK32(25,31) 181 1.1 christos }; 182 1.1 christos 183 1.1 christos 184 1.1 christos /** 185 1.1 christos ** SPR's 186 1.1 christos **/ 187 1.1 christos 188 1.1 christos #include "spreg.h" 189 1.1 christos 190 1.1 christos 191 1.1 christos /** 192 1.1 christos ** Segment Registers 193 1.1 christos **/ 194 1.1 christos 195 1.6 christos typedef uint32_t sreg; 196 1.1 christos enum { 197 1.1 christos nr_of_srs = 16 198 1.1 christos }; 199 1.1 christos 200 1.1 christos 201 1.1 christos /** 202 1.1 christos ** Machine state register 203 1.1 christos **/ 204 1.1 christos typedef unsigned_word msreg; /* 32 or 64 bits */ 205 1.1 christos 206 1.1 christos enum { 207 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 208 1.1 christos msr_64bit_mode = BIT(0), 209 1.1 christos #endif 210 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 211 1.1 christos msr_64bit_mode = 0, 212 1.1 christos #endif 213 1.1 christos msr_power_management_enable = BIT(45), 214 1.1 christos msr_tempoary_gpr_remapping = BIT(46), /* 603 specific */ 215 1.1 christos msr_interrupt_little_endian_mode = BIT(47), 216 1.1 christos msr_external_interrupt_enable = BIT(48), 217 1.1 christos msr_problem_state = BIT(49), 218 1.1 christos msr_floating_point_available = BIT(50), 219 1.1 christos msr_machine_check_enable = BIT(51), 220 1.1 christos msr_floating_point_exception_mode_0 = BIT(52), 221 1.1 christos msr_single_step_trace_enable = BIT(53), 222 1.1 christos msr_branch_trace_enable = BIT(54), 223 1.1 christos msr_floating_point_exception_mode_1 = BIT(55), 224 1.1 christos msr_interrupt_prefix = BIT(57), 225 1.1 christos msr_instruction_relocate = BIT(58), 226 1.1 christos msr_data_relocate = BIT(59), 227 1.1 christos msr_recoverable_interrupt = BIT(62), 228 1.1 christos msr_little_endian_mode = BIT(63) 229 1.1 christos }; 230 1.1 christos 231 1.1 christos enum { 232 1.1 christos srr1_hash_table_or_ibat_miss = BIT(33), 233 1.1 christos srr1_direct_store_error_exception = BIT(35), 234 1.1 christos srr1_protection_violation = BIT(36), 235 1.1 christos srr1_segment_table_miss = BIT(42), 236 1.1 christos srr1_floating_point_enabled = BIT(43), 237 1.1 christos srr1_illegal_instruction = BIT(44), 238 1.1 christos srr1_priviliged_instruction = BIT(45), 239 1.1 christos srr1_trap = BIT(46), 240 1.1 christos srr1_subsequent_instruction = BIT(47) 241 1.1 christos }; 242 1.1 christos 243 1.1 christos /** 244 1.1 christos ** storage interrupt registers 245 1.1 christos **/ 246 1.1 christos 247 1.1 christos typedef enum { 248 1.1 christos dsisr_direct_store_error_exception = BIT32(0), 249 1.1 christos dsisr_hash_table_or_dbat_miss = BIT32(1), 250 1.1 christos dsisr_protection_violation = BIT32(4), 251 1.1 christos dsisr_earwax_violation = BIT32(5), 252 1.1 christos dsisr_store_operation = BIT32(6), 253 1.1 christos dsisr_segment_table_miss = BIT32(10), 254 1.1 christos dsisr_earwax_disabled = BIT32(11) 255 1.1 christos } dsisr_status; 256 1.1 christos 257 1.1 christos 258 1.1 christos 259 1.1 christos /** 260 1.1 christos ** And the registers proper 261 1.1 christos **/ 262 1.1 christos typedef struct _registers { 263 1.1 christos 264 1.1 christos gpreg gpr[32]; 265 1.1 christos fpreg fpr[32]; 266 1.1 christos creg cr; 267 1.1 christos fpscreg fpscr; 268 1.1 christos 269 1.1 christos /* Machine state register */ 270 1.1 christos msreg msr; 271 1.1 christos 272 1.1 christos /* Spr's */ 273 1.1 christos spreg spr[nr_of_sprs]; 274 1.1 christos 275 1.1 christos /* Segment Registers */ 276 1.1 christos sreg sr[nr_of_srs]; 277 1.1 christos 278 1.1 christos #if WITH_ALTIVEC 279 1.1 christos struct altivec_regs altivec; 280 1.1 christos #endif 281 1.1 christos #if WITH_E500 282 1.1 christos struct e500_regs e500; 283 1.1 christos #endif 284 1.1 christos 285 1.1 christos } registers; 286 1.1 christos 287 1.1 christos /* dump out all the registers */ 288 1.1 christos 289 1.1 christos INLINE_REGISTERS\ 290 1.1 christos (void) registers_dump 291 1.1 christos (registers *regs); 292 1.1 christos 293 1.1 christos 294 1.1 christos /* return information on a register based on name */ 295 1.1 christos 296 1.1 christos typedef enum { 297 1.1 christos reg_invalid, 298 1.1 christos reg_gpr, reg_fpr, reg_spr, reg_msr, 299 1.1 christos reg_cr, reg_fpscr, reg_pc, reg_sr, 300 1.1 christos reg_insns, reg_stalls, reg_cycles, 301 1.1 christos #ifdef WITH_ALTIVEC 302 1.1 christos reg_vr, reg_vscr, 303 1.1 christos #endif 304 1.1 christos #ifdef WITH_E500 305 1.1 christos reg_acc, reg_gprh, reg_evr, 306 1.1 christos #endif 307 1.1 christos nr_register_types 308 1.1 christos } register_types; 309 1.1 christos 310 1.1 christos typedef struct { 311 1.1 christos register_types type; 312 1.1 christos int index; 313 1.1 christos int size; 314 1.1 christos } register_descriptions; 315 1.1 christos 316 1.1 christos INLINE_REGISTERS\ 317 1.1 christos (register_descriptions) register_description 318 1.1 christos (const char reg[]); 319 1.1 christos 320 1.1 christos 321 1.1 christos /* Special purpose registers by their more common names */ 322 1.1 christos 323 1.1 christos #define SPREG(N) cpu_registers(processor)->spr[N] 324 1.1 christos #define XER SPREG(spr_xer) 325 1.1 christos #define LR SPREG(spr_lr) 326 1.1 christos #define CTR SPREG(spr_ctr) 327 1.1 christos #define SRR0 SPREG(spr_srr0) 328 1.1 christos #define SRR1 SPREG(spr_srr1) 329 1.1 christos #define DAR SPREG(spr_dar) 330 1.1 christos #define DSISR SPREG(spr_dsisr) 331 1.1 christos 332 1.1 christos /* general purpose registers - indexed access */ 333 1.1 christos #define GPR(N) cpu_registers(processor)->gpr[N] 334 1.1 christos 335 1.1 christos /* segment registers */ 336 1.1 christos #define SEGREG(N) cpu_registers(processor)->sr[N] 337 1.1 christos 338 1.1 christos /* condition register */ 339 1.1 christos #define CR cpu_registers(processor)->cr 340 1.1 christos 341 1.1 christos /* machine status register */ 342 1.1 christos #define MSR cpu_registers(processor)->msr 343 1.1 christos 344 1.1 christos /* floating-point status condition register */ 345 1.1 christos #define FPSCR cpu_registers(processor)->fpscr 346 1.1 christos 347 1.1 christos #endif /* _REGISTERS_H_ */ 348