registers.h revision 1.6 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