* config.if: Remove unused libc_interface determination.
[deliverable/binutils-gdb.git] / gdb / sh-tdep.c
CommitLineData
c906108c 1/* Target-dependent code for Hitachi Super-H, for GDB.
1e698235 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3116c80a 3 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b
JM
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22/*
c5aa993b
JM
23 Contributed by Steve Chamberlain
24 sac@cygnus.com
c906108c
SS
25 */
26
27#include "defs.h"
28#include "frame.h"
c906108c
SS
29#include "symtab.h"
30#include "symfile.h"
31#include "gdbtypes.h"
32#include "gdbcmd.h"
33#include "gdbcore.h"
34#include "value.h"
35#include "dis-asm.h"
73c1f219 36#include "inferior.h"
c906108c 37#include "gdb_string.h"
b4a20239 38#include "arch-utils.h"
fb409745 39#include "floatformat.h"
4e052eda 40#include "regcache.h"
d16aafd8 41#include "doublest.h"
4be87837 42#include "osabi.h"
c906108c 43
ab3b8126
JT
44#include "sh-tdep.h"
45
d658f924 46#include "elf-bfd.h"
1a8629c7
MS
47#include "solib-svr4.h"
48
283150cd
EZ
49/* sh64 flags */
50#include "elf/sh.h"
51/* registers numbers shared with the simulator */
1c922164 52#include "gdb/sim-sh.h"
283150cd 53
53116e27 54void (*sh_show_regs) (void);
3bbfbb92
EZ
55CORE_ADDR (*skip_prologue_hard_way) (CORE_ADDR);
56void (*do_pseudo_register) (int);
cc17453a 57
88e04cc1
EZ
58#define SH_DEFAULT_NUM_REGS 59
59
cc17453a
EZ
60/* Define other aspects of the stack frame.
61 we keep a copy of the worked out return pc lying around, since it
62 is a useful bit of info */
63
64struct frame_extra_info
65{
66 CORE_ADDR return_pc;
67 int leaf_function;
68 int f_offset;
63978407 69};
c906108c 70
fa88f677 71static const char *
cc17453a 72sh_generic_register_name (int reg_nr)
c5aa993b 73{
cc17453a 74 static char *register_names[] =
c5aa993b 75 {
cc17453a
EZ
76 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
77 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
78 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
79 "fpul", "fpscr",
80 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
81 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
82 "ssr", "spc",
83 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
84 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
85 };
86 if (reg_nr < 0)
87 return NULL;
88 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
89 return NULL;
90 return register_names[reg_nr];
91}
92
fa88f677 93static const char *
cc17453a
EZ
94sh_sh_register_name (int reg_nr)
95{
96 static char *register_names[] =
63978407 97 {
cc17453a
EZ
98 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
99 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
100 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
101 "", "",
102 "", "", "", "", "", "", "", "",
103 "", "", "", "", "", "", "", "",
104 "", "",
105 "", "", "", "", "", "", "", "",
106 "", "", "", "", "", "", "", "",
107 };
108 if (reg_nr < 0)
109 return NULL;
110 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
111 return NULL;
112 return register_names[reg_nr];
113}
114
fa88f677 115static const char *
cc17453a
EZ
116sh_sh3_register_name (int reg_nr)
117{
118 static char *register_names[] =
c5aa993b 119 {
cc17453a
EZ
120 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
121 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
122 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
123 "", "",
124 "", "", "", "", "", "", "", "",
125 "", "", "", "", "", "", "", "",
126 "ssr", "spc",
127 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
128 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1"
129 };
130 if (reg_nr < 0)
131 return NULL;
132 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
133 return NULL;
134 return register_names[reg_nr];
135}
136
fa88f677 137static const char *
cc17453a
EZ
138sh_sh3e_register_name (int reg_nr)
139{
140 static char *register_names[] =
63978407 141 {
cc17453a
EZ
142 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
143 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
144 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
145 "fpul", "fpscr",
146 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
147 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
148 "ssr", "spc",
149 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
150 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
151 };
152 if (reg_nr < 0)
153 return NULL;
154 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
155 return NULL;
156 return register_names[reg_nr];
157}
158
2d188dd3
NC
159static const char *
160sh_sh2e_register_name (int reg_nr)
161{
162 static char *register_names[] =
163 {
164 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
165 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
166 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
167 "fpul", "fpscr",
168 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
169 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
170 "", "",
171 "", "", "", "", "", "", "", "",
172 "", "", "", "", "", "", "", "",
173 };
174 if (reg_nr < 0)
175 return NULL;
176 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
177 return NULL;
178 return register_names[reg_nr];
179}
180
fa88f677 181static const char *
cc17453a
EZ
182sh_sh_dsp_register_name (int reg_nr)
183{
184 static char *register_names[] =
c5aa993b 185 {
cc17453a
EZ
186 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
187 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
188 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
189 "", "dsr",
190 "a0g", "a0", "a1g", "a1", "m0", "m1", "x0", "x1",
191 "y0", "y1", "", "", "", "", "", "mod",
192 "", "",
193 "rs", "re", "", "", "", "", "", "",
194 "", "", "", "", "", "", "", "",
195 };
196 if (reg_nr < 0)
197 return NULL;
198 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
199 return NULL;
200 return register_names[reg_nr];
201}
202
fa88f677 203static const char *
cc17453a
EZ
204sh_sh3_dsp_register_name (int reg_nr)
205{
206 static char *register_names[] =
c5aa993b 207 {
cc17453a
EZ
208 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
209 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
210 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
211 "", "dsr",
212 "a0g", "a0", "a1g", "a1", "m0", "m1", "x0", "x1",
213 "y0", "y1", "", "", "", "", "", "mod",
214 "ssr", "spc",
215 "rs", "re", "", "", "", "", "", "",
216 "r0b", "r1b", "r2b", "r3b", "r4b", "r5b", "r6b", "r7b"
217 "", "", "", "", "", "", "", "",
218 };
219 if (reg_nr < 0)
220 return NULL;
221 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
222 return NULL;
223 return register_names[reg_nr];
224}
225
fa88f677 226static const char *
53116e27
EZ
227sh_sh4_register_name (int reg_nr)
228{
229 static char *register_names[] =
230 {
a38d2a54 231 /* general registers 0-15 */
53116e27
EZ
232 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
233 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
a38d2a54 234 /* 16 - 22 */
53116e27 235 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
a38d2a54 236 /* 23, 24 */
53116e27 237 "fpul", "fpscr",
a38d2a54 238 /* floating point registers 25 - 40 */
53116e27
EZ
239 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
240 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
a38d2a54 241 /* 41, 42 */
53116e27 242 "ssr", "spc",
a38d2a54 243 /* bank 0 43 - 50 */
53116e27 244 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
a38d2a54 245 /* bank 1 51 - 58 */
53116e27 246 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
a38d2a54 247 /* double precision (pseudo) 59 - 66 */
fe9f384f 248 "dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14",
a38d2a54 249 /* vectors (pseudo) 67 - 70 */
fe9f384f 250 "fv0", "fv4", "fv8", "fv12",
a38d2a54
EZ
251 /* FIXME: missing XF 71 - 86 */
252 /* FIXME: missing XD 87 - 94 */
53116e27
EZ
253 };
254 if (reg_nr < 0)
255 return NULL;
256 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
257 return NULL;
258 return register_names[reg_nr];
259}
260
fa88f677 261static const char *
283150cd
EZ
262sh_sh64_register_name (int reg_nr)
263{
264 static char *register_names[] =
265 {
266 /* SH MEDIA MODE (ISA 32) */
267 /* general registers (64-bit) 0-63 */
268 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
269 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
270 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
271 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
272 "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
273 "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
274 "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
275 "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
276
277 /* pc (64-bit) 64 */
278 "pc",
279
280 /* status reg., saved status reg., saved pc reg. (64-bit) 65-67 */
281 "sr", "ssr", "spc",
282
283 /* target registers (64-bit) 68-75*/
284 "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7",
285
286 /* floating point state control register (32-bit) 76 */
287 "fpscr",
288
289 /* single precision floating point registers (32-bit) 77-140*/
290 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
291 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
292 "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
293 "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",
294 "fr32", "fr33", "fr34", "fr35", "fr36", "fr37", "fr38", "fr39",
295 "fr40", "fr41", "fr42", "fr43", "fr44", "fr45", "fr46", "fr47",
296 "fr48", "fr49", "fr50", "fr51", "fr52", "fr53", "fr54", "fr55",
297 "fr56", "fr57", "fr58", "fr59", "fr60", "fr61", "fr62", "fr63",
298
299 /* double precision registers (pseudo) 141-172 */
300 "dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14",
301 "dr16", "dr18", "dr20", "dr22", "dr24", "dr26", "dr28", "dr30",
302 "dr32", "dr34", "dr36", "dr38", "dr40", "dr42", "dr44", "dr46",
303 "dr48", "dr50", "dr52", "dr54", "dr56", "dr58", "dr60", "dr62",
304
305 /* floating point pairs (pseudo) 173-204*/
306 "fp0", "fp2", "fp4", "fp6", "fp8", "fp10", "fp12", "fp14",
307 "fp16", "fp18", "fp20", "fp22", "fp24", "fp26", "fp28", "fp30",
308 "fp32", "fp34", "fp36", "fp38", "fp40", "fp42", "fp44", "fp46",
309 "fp48", "fp50", "fp52", "fp54", "fp56", "fp58", "fp60", "fp62",
310
311 /* floating point vectors (4 floating point regs) (pseudo) 205-220*/
312 "fv0", "fv4", "fv8", "fv12", "fv16", "fv20", "fv24", "fv28",
313 "fv32", "fv36", "fv40", "fv44", "fv48", "fv52", "fv56", "fv60",
314
315 /* SH COMPACT MODE (ISA 16) (all pseudo) 221-272*/
316 "r0_c", "r1_c", "r2_c", "r3_c", "r4_c", "r5_c", "r6_c", "r7_c",
317 "r8_c", "r9_c", "r10_c", "r11_c", "r12_c", "r13_c", "r14_c", "r15_c",
318 "pc_c",
319 "gbr_c", "mach_c", "macl_c", "pr_c", "t_c",
320 "fpscr_c", "fpul_c",
321 "fr0_c", "fr1_c", "fr2_c", "fr3_c", "fr4_c", "fr5_c", "fr6_c", "fr7_c",
322 "fr8_c", "fr9_c", "fr10_c", "fr11_c", "fr12_c", "fr13_c", "fr14_c", "fr15_c",
323 "dr0_c", "dr2_c", "dr4_c", "dr6_c", "dr8_c", "dr10_c", "dr12_c", "dr14_c",
324 "fv0_c", "fv4_c", "fv8_c", "fv12_c",
325 /* FIXME!!!! XF0 XF15, XD0 XD14 ?????*/
326 };
327
328 if (reg_nr < 0)
329 return NULL;
330 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
331 return NULL;
332 return register_names[reg_nr];
333}
334
335#define NUM_PSEUDO_REGS_SH_MEDIA 80
336#define NUM_PSEUDO_REGS_SH_COMPACT 51
337
3117ed25 338static const unsigned char *
fba45db2 339sh_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
cc17453a
EZ
340{
341 /* 0xc3c3 is trapa #c3, and it works in big and little endian modes */
342 static unsigned char breakpoint[] = {0xc3, 0xc3};
343
344 *lenptr = sizeof (breakpoint);
345 return breakpoint;
346}
c906108c 347
283150cd
EZ
348/* Macros and functions for setting and testing a bit in a minimal
349 symbol that marks it as 32-bit function. The MSB of the minimal
350 symbol's "info" field is used for this purpose. This field is
351 already being used to store the symbol size, so the assumption is
352 that the symbol size cannot exceed 2^31.
353
354 ELF_MAKE_MSYMBOL_SPECIAL
355 tests whether an ELF symbol is "special", i.e. refers
356 to a 32-bit function, and sets a "special" bit in a
357 minimal symbol to mark it as a 32-bit function
358 MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol
359 MSYMBOL_SIZE returns the size of the minimal symbol, i.e.
360 the "info" field with the "special" bit masked out */
361
362#define MSYMBOL_IS_SPECIAL(msym) \
363 (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
364
a78f21af 365static void
283150cd
EZ
366sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
367{
368 if (msym == NULL)
369 return;
370
371 if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
372 {
373 MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000);
374 SYMBOL_VALUE_ADDRESS (msym) |= 1;
375 }
376}
377
378/* ISA32 (shmedia) function addresses are odd (bit 0 is set). Here
379 are some macros to test, set, or clear bit 0 of addresses. */
380#define IS_ISA32_ADDR(addr) ((addr) & 1)
381#define MAKE_ISA32_ADDR(addr) ((addr) | 1)
382#define UNMAKE_ISA32_ADDR(addr) ((addr) & ~1)
383
384static int
385pc_is_isa32 (bfd_vma memaddr)
386{
387 struct minimal_symbol *sym;
388
389 /* If bit 0 of the address is set, assume this is a
390 ISA32 (shmedia) address. */
391 if (IS_ISA32_ADDR (memaddr))
392 return 1;
393
394 /* A flag indicating that this is a ISA32 function is stored by elfread.c in
395 the high bit of the info field. Use this to decide if the function is
396 ISA16 or ISA32. */
397 sym = lookup_minimal_symbol_by_pc (memaddr);
398 if (sym)
399 return MSYMBOL_IS_SPECIAL (sym);
400 else
401 return 0;
402}
403
404static const unsigned char *
405sh_sh64_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
406{
407 /* The BRK instruction for shmedia is
408 01101111 11110101 11111111 11110000
409 which translates in big endian mode to 0x6f, 0xf5, 0xff, 0xf0
410 and in little endian mode to 0xf0, 0xff, 0xf5, 0x6f */
411
412 /* The BRK instruction for shcompact is
413 00000000 00111011
414 which translates in big endian mode to 0x0, 0x3b
415 and in little endian mode to 0x3b, 0x0*/
416
417 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
418 {
419 if (pc_is_isa32 (*pcptr))
420 {
421 static unsigned char big_breakpoint_media[] = {0x6f, 0xf5, 0xff, 0xf0};
422 *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
423 *lenptr = sizeof (big_breakpoint_media);
424 return big_breakpoint_media;
425 }
426 else
427 {
428 static unsigned char big_breakpoint_compact[] = {0x0, 0x3b};
429 *lenptr = sizeof (big_breakpoint_compact);
430 return big_breakpoint_compact;
431 }
432 }
433 else
434 {
435 if (pc_is_isa32 (*pcptr))
436 {
437 static unsigned char little_breakpoint_media[] = {0xf0, 0xff, 0xf5, 0x6f};
438 *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
439 *lenptr = sizeof (little_breakpoint_media);
440 return little_breakpoint_media;
441 }
442 else
443 {
444 static unsigned char little_breakpoint_compact[] = {0x3b, 0x0};
445 *lenptr = sizeof (little_breakpoint_compact);
446 return little_breakpoint_compact;
447 }
448 }
449}
450
c906108c 451/* Prologue looks like
c5aa993b
JM
452 [mov.l <regs>,@-r15]...
453 [sts.l pr,@-r15]
454 [mov.l r14,@-r15]
455 [mov r15,r14]
8db62801
EZ
456
457 Actually it can be more complicated than this. For instance, with
458 newer gcc's:
459
460 mov.l r14,@-r15
461 add #-12,r15
462 mov r15,r14
463 mov r4,r1
464 mov r5,r2
465 mov.l r6,@(4,r14)
466 mov.l r7,@(8,r14)
467 mov.b r1,@r14
468 mov r14,r1
469 mov r14,r1
470 add #2,r1
471 mov.w r2,@r1
472
c5aa993b 473 */
c906108c 474
283150cd
EZ
475/* PTABS/L Rn, TRa 0110101111110001nnnnnnl00aaa0000
476 with l=1 and n = 18 0110101111110001010010100aaa0000 */
477#define IS_PTABSL_R18(x) (((x) & 0xffffff8f) == 0x6bf14a00)
478
479/* STS.L PR,@-r0 0100000000100010
480 r0-4-->r0, PR-->(r0) */
481#define IS_STS_R0(x) ((x) == 0x4022)
482
483/* STS PR, Rm 0000mmmm00101010
484 PR-->Rm */
485#define IS_STS_PR(x) (((x) & 0xf0ff) == 0x2a)
486
487/* MOV.L Rm,@(disp,r15) 00011111mmmmdddd
488 Rm-->(dispx4+r15) */
489#define IS_MOV_TO_R15(x) (((x) & 0xff00) == 0x1f00)
490
491/* MOV.L R14,@(disp,r15) 000111111110dddd
492 R14-->(dispx4+r15) */
493#define IS_MOV_R14(x) (((x) & 0xfff0) == 0x1fe0)
494
495/* ST.Q R14, disp, R18 101011001110dddddddddd0100100000
496 R18-->(dispx8+R14) */
497#define IS_STQ_R18_R14(x) (((x) & 0xfff003ff) == 0xace00120)
498
499/* ST.Q R15, disp, R18 101011001111dddddddddd0100100000
500 R18-->(dispx8+R15) */
501#define IS_STQ_R18_R15(x) (((x) & 0xfff003ff) == 0xacf00120)
502
503/* ST.L R15, disp, R18 101010001111dddddddddd0100100000
504 R18-->(dispx4+R15) */
505#define IS_STL_R18_R15(x) (((x) & 0xfff003ff) == 0xa8f00120)
506
507/* ST.Q R15, disp, R14 1010 1100 1111 dddd dddd dd00 1110 0000
508 R14-->(dispx8+R15) */
509#define IS_STQ_R14_R15(x) (((x) & 0xfff003ff) == 0xacf000e0)
510
511/* ST.L R15, disp, R14 1010 1000 1111 dddd dddd dd00 1110 0000
512 R14-->(dispx4+R15) */
513#define IS_STL_R14_R15(x) (((x) & 0xfff003ff) == 0xa8f000e0)
514
515/* ADDI.L R15,imm,R15 1101 0100 1111 ssss ssss ss00 1111 0000
516 R15 + imm --> R15 */
517#define IS_ADDIL_SP_MEDIA(x) (((x) & 0xfff003ff) == 0xd4f000f0)
518
519/* ADDI R15,imm,R15 1101 0000 1111 ssss ssss ss00 1111 0000
520 R15 + imm --> R15 */
521#define IS_ADDI_SP_MEDIA(x) (((x) & 0xfff003ff) == 0xd0f000f0)
522
523/* ADD.L R15,R63,R14 0000 0000 1111 1000 1111 1100 1110 0000
524 R15 + R63 --> R14 */
525#define IS_ADDL_SP_FP_MEDIA(x) ((x) == 0x00f8fce0)
526
527/* ADD R15,R63,R14 0000 0000 1111 1001 1111 1100 1110 0000
528 R15 + R63 --> R14 */
529#define IS_ADD_SP_FP_MEDIA(x) ((x) == 0x00f9fce0)
530
531#define IS_MOV_SP_FP_MEDIA(x) (IS_ADDL_SP_FP_MEDIA(x) || IS_ADD_SP_FP_MEDIA(x))
532
533/* MOV #imm, R0 1110 0000 ssss ssss
534 #imm-->R0 */
535#define IS_MOV_R0(x) (((x) & 0xff00) == 0xe000)
536
537/* MOV.L @(disp,PC), R0 1101 0000 iiii iiii */
538#define IS_MOVL_R0(x) (((x) & 0xff00) == 0xd000)
539
540/* ADD r15,r0 0011 0000 1111 1100
541 r15+r0-->r0 */
542#define IS_ADD_SP_R0(x) ((x) == 0x30fc)
543
544/* MOV.L R14 @-R0 0010 0000 1110 0110
545 R14-->(R0-4), R0-4-->R0 */
546#define IS_MOV_R14_R0(x) ((x) == 0x20e6)
547
548/* ADD Rm,R63,Rn Rm+R63-->Rn 0000 00mm mmmm 1001 1111 11nn nnnn 0000
549 where Rm is one of r2-r9 which are the argument registers. */
550/* FIXME: Recognize the float and double register moves too! */
551#define IS_MEDIA_IND_ARG_MOV(x) \
552((((x) & 0xfc0ffc0f) == 0x0009fc00) && (((x) & 0x03f00000) >= 0x00200000 && ((x) & 0x03f00000) <= 0x00900000))
553
554/* ST.Q Rn,0,Rm Rm-->Rn+0 1010 11nn nnnn 0000 0000 00mm mmmm 0000
555 or ST.L Rn,0,Rm Rm-->Rn+0 1010 10nn nnnn 0000 0000 00mm mmmm 0000
556 where Rm is one of r2-r9 which are the argument registers. */
557#define IS_MEDIA_ARG_MOV(x) \
558(((((x) & 0xfc0ffc0f) == 0xac000000) || (((x) & 0xfc0ffc0f) == 0xa8000000)) \
559 && (((x) & 0x000003f0) >= 0x00000020 && ((x) & 0x000003f0) <= 0x00000090))
560
561/* ST.B R14,0,Rn Rn-->(R14+0) 1010 0000 1110 0000 0000 00nn nnnn 0000*/
562/* ST.W R14,0,Rn Rn-->(R14+0) 1010 0100 1110 0000 0000 00nn nnnn 0000*/
563/* ST.L R14,0,Rn Rn-->(R14+0) 1010 1000 1110 0000 0000 00nn nnnn 0000*/
564/* FST.S R14,0,FRn Rn-->(R14+0) 1011 0100 1110 0000 0000 00nn nnnn 0000*/
565/* FST.D R14,0,DRn Rn-->(R14+0) 1011 1100 1110 0000 0000 00nn nnnn 0000*/
566#define IS_MEDIA_MOV_TO_R14(x) \
567((((x) & 0xfffffc0f) == 0xa0e00000) \
568|| (((x) & 0xfffffc0f) == 0xa4e00000) \
569|| (((x) & 0xfffffc0f) == 0xa8e00000) \
570|| (((x) & 0xfffffc0f) == 0xb4e00000) \
571|| (((x) & 0xfffffc0f) == 0xbce00000))
572
573/* MOV Rm, Rn Rm-->Rn 0110 nnnn mmmm 0011
574 where Rm is r2-r9 */
575#define IS_COMPACT_IND_ARG_MOV(x) \
576((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0020) && (((x) & 0x00f0) <= 0x0090))
577
578/* compact direct arg move!
579 MOV.L Rn, @r14 0010 1110 mmmm 0010 */
580#define IS_COMPACT_ARG_MOV(x) \
581(((((x) & 0xff0f) == 0x2e02) && (((x) & 0x00f0) >= 0x0020) && ((x) & 0x00f0) <= 0x0090))
582
583/* MOV.B Rm, @R14 0010 1110 mmmm 0000
584 MOV.W Rm, @R14 0010 1110 mmmm 0001 */
585#define IS_COMPACT_MOV_TO_R14(x) \
586((((x) & 0xff0f) == 0x2e00) || (((x) & 0xff0f) == 0x2e01))
587
588#define IS_JSR_R0(x) ((x) == 0x400b)
589#define IS_NOP(x) ((x) == 0x0009)
590
591
8db62801
EZ
592/* STS.L PR,@-r15 0100111100100010
593 r15-4-->r15, PR-->(r15) */
c906108c 594#define IS_STS(x) ((x) == 0x4f22)
8db62801
EZ
595
596/* MOV.L Rm,@-r15 00101111mmmm0110
597 r15-4-->r15, Rm-->(R15) */
c906108c 598#define IS_PUSH(x) (((x) & 0xff0f) == 0x2f06)
8db62801 599
c906108c 600#define GET_PUSHED_REG(x) (((x) >> 4) & 0xf)
8db62801
EZ
601
602/* MOV r15,r14 0110111011110011
603 r15-->r14 */
c906108c 604#define IS_MOV_SP_FP(x) ((x) == 0x6ef3)
8db62801
EZ
605
606/* ADD #imm,r15 01111111iiiiiiii
607 r15+imm-->r15 */
c906108c 608#define IS_ADD_SP(x) (((x) & 0xff00) == 0x7f00)
8db62801 609
c906108c
SS
610#define IS_MOV_R3(x) (((x) & 0xff00) == 0x1a00)
611#define IS_SHLL_R3(x) ((x) == 0x4300)
8db62801
EZ
612
613/* ADD r3,r15 0011111100111100
614 r15+r3-->r15 */
c906108c 615#define IS_ADD_R3SP(x) ((x) == 0x3f3c)
8db62801
EZ
616
617/* FMOV.S FRm,@-Rn Rn-4-->Rn, FRm-->(Rn) 1111nnnnmmmm1011
8db62801 618 FMOV DRm,@-Rn Rn-8-->Rn, DRm-->(Rn) 1111nnnnmmm01011
8db62801 619 FMOV XDm,@-Rn Rn-8-->Rn, XDm-->(Rn) 1111nnnnmmm11011 */
c906108c 620#define IS_FMOV(x) (((x) & 0xf00f) == 0xf00b)
c906108c 621
8db62801 622/* MOV Rm,Rn Rm-->Rn 0110nnnnmmmm0011
8db62801 623 MOV.L Rm,@(disp,Rn) Rm-->(dispx4+Rn) 0001nnnnmmmmdddd
8db62801
EZ
624 MOV.L Rm,@Rn Rm-->(Rn) 0010nnnnmmmm0010
625 where Rm is one of r4,r5,r6,r7 which are the argument registers. */
626#define IS_ARG_MOV(x) \
627(((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)) \
cc17453a
EZ
628 || ((((x) & 0xf000) == 0x1000) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)) \
629 || ((((x) & 0xf00f) == 0x2002) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)))
8db62801
EZ
630
631/* MOV.L Rm,@(disp,r14) 00011110mmmmdddd
632 Rm-->(dispx4+r14) where Rm is one of r4,r5,r6,r7 */
3bbfbb92 633#define IS_MOV_TO_R14(x) \
cc17453a 634 ((((x) & 0xff00) == 0x1e) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070))
8db62801
EZ
635
636#define FPSCR_SZ (1 << 20)
c906108c 637
c906108c
SS
638/* Skip any prologue before the guts of a function */
639
8db62801
EZ
640/* Skip the prologue using the debug information. If this fails we'll
641 fall back on the 'guess' method below. */
642static CORE_ADDR
fba45db2 643after_prologue (CORE_ADDR pc)
8db62801
EZ
644{
645 struct symtab_and_line sal;
646 CORE_ADDR func_addr, func_end;
647
648 /* If we can not find the symbol in the partial symbol table, then
649 there is no hope we can determine the function's start address
650 with this code. */
651 if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
652 return 0;
653
654 /* Get the line associated with FUNC_ADDR. */
655 sal = find_pc_line (func_addr, 0);
656
657 /* There are only two cases to consider. First, the end of the source line
658 is within the function bounds. In that case we return the end of the
659 source line. Second is the end of the source line extends beyond the
660 bounds of the current function. We need to use the slow code to
661 examine instructions in that case. */
662 if (sal.end < func_end)
663 return sal.end;
664 else
665 return 0;
666}
667
668/* Here we look at each instruction in the function, and try to guess
669 where the prologue ends. Unfortunately this is not always
670 accurate. */
671static CORE_ADDR
3bbfbb92 672sh_skip_prologue_hard_way (CORE_ADDR start_pc)
c906108c 673{
2bfa91ee 674 CORE_ADDR here, end;
8db62801 675 int updated_fp = 0;
2bfa91ee
EZ
676
677 if (!start_pc)
678 return 0;
679
680 for (here = start_pc, end = start_pc + (2 * 28); here < end;)
c906108c 681 {
2bfa91ee
EZ
682 int w = read_memory_integer (here, 2);
683 here += 2;
684 if (IS_FMOV (w) || IS_PUSH (w) || IS_STS (w) || IS_MOV_R3 (w)
8db62801 685 || IS_ADD_R3SP (w) || IS_ADD_SP (w) || IS_SHLL_R3 (w)
3bbfbb92 686 || IS_ARG_MOV (w) || IS_MOV_TO_R14 (w))
2bfa91ee
EZ
687 {
688 start_pc = here;
2bfa91ee 689 }
8db62801
EZ
690 else if (IS_MOV_SP_FP (w))
691 {
692 start_pc = here;
693 updated_fp = 1;
694 }
695 else
696 /* Don't bail out yet, if we are before the copy of sp. */
697 if (updated_fp)
698 break;
c906108c
SS
699 }
700
701 return start_pc;
702}
703
283150cd
EZ
704static CORE_ADDR
705look_for_args_moves (CORE_ADDR start_pc, int media_mode)
706{
707 CORE_ADDR here, end;
708 int w;
709 int insn_size = (media_mode ? 4 : 2);
710
711 for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
712 {
713 if (media_mode)
714 {
715 w = read_memory_integer (UNMAKE_ISA32_ADDR (here), insn_size);
716 here += insn_size;
717 if (IS_MEDIA_IND_ARG_MOV (w))
718 {
719 /* This must be followed by a store to r14, so the argument
720 is where the debug info says it is. This can happen after
721 the SP has been saved, unfortunately. */
722
723 int next_insn = read_memory_integer (UNMAKE_ISA32_ADDR (here),
724 insn_size);
725 here += insn_size;
726 if (IS_MEDIA_MOV_TO_R14 (next_insn))
727 start_pc = here;
728 }
729 else if (IS_MEDIA_ARG_MOV (w))
730 {
731 /* These instructions store directly the argument in r14. */
732 start_pc = here;
733 }
734 else
735 break;
736 }
737 else
738 {
739 w = read_memory_integer (here, insn_size);
740 w = w & 0xffff;
741 here += insn_size;
742 if (IS_COMPACT_IND_ARG_MOV (w))
743 {
744 /* This must be followed by a store to r14, so the argument
745 is where the debug info says it is. This can happen after
746 the SP has been saved, unfortunately. */
747
748 int next_insn = 0xffff & read_memory_integer (here, insn_size);
749 here += insn_size;
750 if (IS_COMPACT_MOV_TO_R14 (next_insn))
751 start_pc = here;
752 }
753 else if (IS_COMPACT_ARG_MOV (w))
754 {
755 /* These instructions store directly the argument in r14. */
756 start_pc = here;
757 }
758 else if (IS_MOVL_R0 (w))
759 {
760 /* There is a function that gcc calls to get the arguments
761 passed correctly to the function. Only after this
762 function call the arguments will be found at the place
763 where they are supposed to be. This happens in case the
764 argument has to be stored into a 64-bit register (for
765 instance doubles, long longs). SHcompact doesn't have
766 access to the full 64-bits, so we store the register in
767 stack slot and store the address of the stack slot in
768 the register, then do a call through a wrapper that
769 loads the memory value into the register. A SHcompact
770 callee calls an argument decoder
771 (GCC_shcompact_incoming_args) that stores the 64-bit
772 value in a stack slot and stores the address of the
773 stack slot in the register. GCC thinks the argument is
774 just passed by transparent reference, but this is only
775 true after the argument decoder is called. Such a call
776 needs to be considered part of the prologue. */
777
778 /* This must be followed by a JSR @r0 instruction and by
779 a NOP instruction. After these, the prologue is over! */
780
781 int next_insn = 0xffff & read_memory_integer (here, insn_size);
782 here += insn_size;
783 if (IS_JSR_R0 (next_insn))
784 {
785 next_insn = 0xffff & read_memory_integer (here, insn_size);
786 here += insn_size;
787
788 if (IS_NOP (next_insn))
789 start_pc = here;
790 }
791 }
792 else
793 break;
794 }
795 }
796
797 return start_pc;
798}
799
800static CORE_ADDR
801sh64_skip_prologue_hard_way (CORE_ADDR start_pc)
802{
803 CORE_ADDR here, end;
804 int updated_fp = 0;
805 int insn_size = 4;
806 int media_mode = 1;
807
808 if (!start_pc)
809 return 0;
810
811 if (pc_is_isa32 (start_pc) == 0)
812 {
813 insn_size = 2;
814 media_mode = 0;
815 }
816
817 for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
818 {
819
820 if (media_mode)
821 {
822 int w = read_memory_integer (UNMAKE_ISA32_ADDR (here), insn_size);
823 here += insn_size;
824 if (IS_STQ_R18_R14 (w) || IS_STQ_R18_R15 (w) || IS_STQ_R14_R15 (w)
825 || IS_STL_R14_R15 (w) || IS_STL_R18_R15 (w)
826 || IS_ADDIL_SP_MEDIA (w) || IS_ADDI_SP_MEDIA (w) || IS_PTABSL_R18 (w))
827 {
828 start_pc = here;
829 }
830 else if (IS_MOV_SP_FP (w) || IS_MOV_SP_FP_MEDIA(w))
831 {
832 start_pc = here;
833 updated_fp = 1;
834 }
835 else
836 if (updated_fp)
837 {
838 /* Don't bail out yet, we may have arguments stored in
839 registers here, according to the debug info, so that
840 gdb can print the frames correctly. */
841 start_pc = look_for_args_moves (here - insn_size, media_mode);
842 break;
843 }
844 }
845 else
846 {
847 int w = 0xffff & read_memory_integer (here, insn_size);
848 here += insn_size;
849
850 if (IS_STS_R0 (w) || IS_STS_PR (w)
851 || IS_MOV_TO_R15 (w) || IS_MOV_R14 (w)
852 || IS_MOV_R0 (w) || IS_ADD_SP_R0 (w) || IS_MOV_R14_R0 (w))
853 {
854 start_pc = here;
855 }
856 else if (IS_MOV_SP_FP (w))
857 {
858 start_pc = here;
859 updated_fp = 1;
860 }
861 else
862 if (updated_fp)
863 {
864 /* Don't bail out yet, we may have arguments stored in
865 registers here, according to the debug info, so that
866 gdb can print the frames correctly. */
867 start_pc = look_for_args_moves (here - insn_size, media_mode);
868 break;
869 }
870 }
871 }
872
873 return start_pc;
874}
875
cc17453a 876static CORE_ADDR
fba45db2 877sh_skip_prologue (CORE_ADDR pc)
8db62801
EZ
878{
879 CORE_ADDR post_prologue_pc;
880
881 /* See if we can determine the end of the prologue via the symbol table.
882 If so, then return either PC, or the PC after the prologue, whichever
883 is greater. */
8db62801
EZ
884 post_prologue_pc = after_prologue (pc);
885
886 /* If after_prologue returned a useful address, then use it. Else
887 fall back on the instruction skipping code. */
888 if (post_prologue_pc != 0)
889 return max (pc, post_prologue_pc);
890 else
891 return (skip_prologue_hard_way (pc));
892}
893
cc17453a
EZ
894/* Immediately after a function call, return the saved pc.
895 Can't always go through the frames for this because on some machines
896 the new frame is not set up until the new function executes
897 some instructions.
898
899 The return address is the value saved in the PR register + 4 */
900static CORE_ADDR
fba45db2 901sh_saved_pc_after_call (struct frame_info *frame)
cc17453a 902{
3bbfbb92 903 return (ADDR_BITS_REMOVE (read_register (gdbarch_tdep (current_gdbarch)->PR_REGNUM)));
cc17453a
EZ
904}
905
906/* Should call_function allocate stack space for a struct return? */
907static int
fba45db2 908sh_use_struct_convention (int gcc_p, struct type *type)
cc17453a 909{
7079c36c 910#if 0
cc17453a 911 return (TYPE_LENGTH (type) > 1);
7079c36c
CV
912#else
913 int len = TYPE_LENGTH (type);
914 int nelem = TYPE_NFIELDS (type);
915 return ((len != 1 && len != 2 && len != 4 && len != 8) || nelem != 1) &&
916 (len != 8 || TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) != 4);
917#endif
cc17453a
EZ
918}
919
283150cd
EZ
920static int
921sh64_use_struct_convention (int gcc_p, struct type *type)
922{
923 return (TYPE_LENGTH (type) > 8);
924}
925
cc17453a
EZ
926/* Store the address of the place in which to copy the structure the
927 subroutine will return. This is called from call_function.
928
3bbfbb92 929 We store structs through a pointer passed in R2 */
cc17453a 930static void
fba45db2 931sh_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
cc17453a
EZ
932{
933 write_register (STRUCT_RETURN_REGNUM, (addr));
934}
c906108c 935
cc17453a
EZ
936/* Disassemble an instruction. */
937static int
fba45db2 938gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info)
c906108c 939{
1c509ca8
JR
940 info->endian = TARGET_BYTE_ORDER;
941 return print_insn_sh (memaddr, info);
283150cd
EZ
942}
943
a5afb99f
AC
944/* Given a GDB frame, determine the address of the calling function's
945 frame. This will be used to create a new GDB frame struct, and
e9582e71
AC
946 then DEPRECATED_INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC
947 will be called for the new frame.
c906108c
SS
948
949 For us, the frame address is its stack pointer value, so we look up
950 the function prologue to determine the caller's sp value, and return it. */
cc17453a 951static CORE_ADDR
fba45db2 952sh_frame_chain (struct frame_info *frame)
c906108c 953{
1e2330ba
AC
954 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
955 get_frame_base (frame),
956 get_frame_base (frame)))
957 return get_frame_base (frame); /* dummy frame same as caller's frame */
50abf9e5 958 if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
da50a4b7
AC
959 return read_memory_integer (get_frame_base (frame)
960 + get_frame_extra_info (frame)->f_offset, 4);
c906108c
SS
961 else
962 return 0;
963}
964
283150cd
EZ
965/* Given a register number RN as it appears in an assembly
966 instruction, find the corresponding register number in the GDB
967 scheme. */
968static int
969translate_insn_rn (int rn, int media_mode)
970{
971 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
972
973 /* FIXME: this assumes that the number rn is for a not pseudo
974 register only. */
975 if (media_mode)
976 return rn;
977 else
978 {
979 /* These registers don't have a corresponding compact one. */
980 /* FIXME: This is probably not enough. */
981#if 0
982 if ((rn >= 16 && rn <= 63) || (rn >= 93 && rn <= 140))
983 return rn;
984#endif
985 if (rn >= 0 && rn <= tdep->R0_C_REGNUM)
986 return tdep->R0_C_REGNUM + rn;
987 else
988 return rn;
989 }
990}
991
992static CORE_ADDR
993sh64_frame_chain (struct frame_info *frame)
994{
1e2330ba
AC
995 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
996 get_frame_base (frame),
997 get_frame_base (frame)))
998 return get_frame_base (frame); /* dummy frame same as caller's frame */
50abf9e5 999 if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
283150cd 1000 {
50abf9e5 1001 int media_mode = pc_is_isa32 (get_frame_pc (frame));
283150cd
EZ
1002 int size;
1003 if (gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32)
1004 size = 4;
1005 else
0ba6dca9 1006 size = REGISTER_RAW_SIZE (translate_insn_rn (DEPRECATED_FP_REGNUM, media_mode));
da50a4b7
AC
1007 return read_memory_integer (get_frame_base (frame)
1008 + get_frame_extra_info (frame)->f_offset,
1009 size);
283150cd
EZ
1010 }
1011 else
1012 return 0;
1013}
1014
c906108c
SS
1015/* Find REGNUM on the stack. Otherwise, it's in an active register. One thing
1016 we might want to do here is to check REGNUM against the clobber mask, and
1017 somehow flag it as invalid if it isn't saved on the stack somewhere. This
1018 would provide a graceful failure mode when trying to get the value of
1019 caller-saves registers for an inner frame. */
cc17453a 1020static CORE_ADDR
fba45db2 1021sh_find_callers_reg (struct frame_info *fi, int regnum)
c906108c 1022{
11c02a10 1023 for (; fi; fi = get_next_frame (fi))
1e2330ba
AC
1024 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1025 get_frame_base (fi)))
c906108c 1026 /* When the caller requests PR from the dummy frame, we return PC because
c5aa993b 1027 that's where the previous routine appears to have done a call from. */
1e2330ba
AC
1028 return deprecated_read_register_dummy (get_frame_pc (fi),
1029 get_frame_base (fi), regnum);
c5aa993b 1030 else
c906108c 1031 {
f30ee0bc 1032 DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
50abf9e5 1033 if (!get_frame_pc (fi))
2bfa91ee 1034 return 0;
b2fb4676
AC
1035 if (get_frame_saved_regs (fi)[regnum] != 0)
1036 return read_memory_integer (get_frame_saved_regs (fi)[regnum],
c5aa993b 1037 REGISTER_RAW_SIZE (regnum));
c906108c
SS
1038 }
1039 return read_register (regnum);
1040}
1041
283150cd
EZ
1042static CORE_ADDR
1043sh64_get_saved_pr (struct frame_info *fi, int pr_regnum)
1044{
1045 int media_mode = 0;
1046
11c02a10 1047 for (; fi; fi = get_next_frame (fi))
1e2330ba
AC
1048 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1049 get_frame_base (fi)))
283150cd
EZ
1050 /* When the caller requests PR from the dummy frame, we return PC because
1051 that's where the previous routine appears to have done a call from. */
1e2330ba
AC
1052 return deprecated_read_register_dummy (get_frame_pc (fi),
1053 get_frame_base (fi), pr_regnum);
283150cd
EZ
1054 else
1055 {
f30ee0bc 1056 DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
50abf9e5 1057 if (!get_frame_pc (fi))
283150cd
EZ
1058 return 0;
1059
50abf9e5 1060 media_mode = pc_is_isa32 (get_frame_pc (fi));
283150cd 1061
b2fb4676 1062 if (get_frame_saved_regs (fi)[pr_regnum] != 0)
283150cd
EZ
1063 {
1064 int gdb_reg_num = translate_insn_rn (pr_regnum, media_mode);
1065 int size = ((gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32)
1066 ? 4
1067 : REGISTER_RAW_SIZE (gdb_reg_num));
b2fb4676 1068 return read_memory_integer (get_frame_saved_regs (fi)[pr_regnum], size);
283150cd
EZ
1069 }
1070 }
1071 return read_register (pr_regnum);
1072}
1073
c906108c
SS
1074/* Put here the code to store, into a struct frame_saved_regs, the
1075 addresses of the saved registers of frame described by FRAME_INFO.
1076 This includes special registers such as pc and fp saved in special
1077 ways in the stack frame. sp is even more special: the address we
1078 return for it IS the sp for the next frame. */
cc17453a 1079static void
fba45db2 1080sh_nofp_frame_init_saved_regs (struct frame_info *fi)
c906108c 1081{
e7d717c0 1082 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof(int));
c906108c
SS
1083 int rn;
1084 int have_fp = 0;
1085 int depth;
1086 int pc;
1087 int opc;
1088 int insn;
1089 int r3_val = 0;
1e2330ba
AC
1090 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi),
1091 get_frame_base (fi));
cc17453a 1092
b2fb4676 1093 if (get_frame_saved_regs (fi) == NULL)
cc17453a
EZ
1094 frame_saved_regs_zalloc (fi);
1095 else
b2fb4676 1096 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
cc17453a
EZ
1097
1098 if (dummy_regs)
1099 {
1100 /* DANGER! This is ONLY going to work if the char buffer format of
1101 the saved registers is byte-for-byte identical to the
1102 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
7b5849cc 1103 memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS);
cc17453a
EZ
1104 return;
1105 }
1106
da50a4b7
AC
1107 get_frame_extra_info (fi)->leaf_function = 1;
1108 get_frame_extra_info (fi)->f_offset = 0;
cc17453a 1109
cd4bffcf 1110 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
cc17453a
EZ
1111 where[rn] = -1;
1112
1113 depth = 0;
1114
1115 /* Loop around examining the prologue insns until we find something
1116 that does not appear to be part of the prologue. But give up
1117 after 20 of them, since we're getting silly then. */
1118
be41e9f4 1119 pc = get_frame_func (fi);
cc17453a
EZ
1120 if (!pc)
1121 {
50abf9e5 1122 deprecated_update_frame_pc_hack (fi, 0);
cc17453a
EZ
1123 return;
1124 }
1125
1126 for (opc = pc + (2 * 28); pc < opc; pc += 2)
1127 {
1128 insn = read_memory_integer (pc, 2);
1129 /* See where the registers will be saved to */
1130 if (IS_PUSH (insn))
1131 {
1132 rn = GET_PUSHED_REG (insn);
1133 where[rn] = depth;
1134 depth += 4;
1135 }
1136 else if (IS_STS (insn))
1137 {
3bbfbb92 1138 where[gdbarch_tdep (current_gdbarch)->PR_REGNUM] = depth;
cc17453a 1139 /* If we're storing the pr then this isn't a leaf */
da50a4b7 1140 get_frame_extra_info (fi)->leaf_function = 0;
cc17453a
EZ
1141 depth += 4;
1142 }
1143 else if (IS_MOV_R3 (insn))
1144 {
1145 r3_val = ((insn & 0xff) ^ 0x80) - 0x80;
1146 }
1147 else if (IS_SHLL_R3 (insn))
1148 {
1149 r3_val <<= 1;
1150 }
1151 else if (IS_ADD_R3SP (insn))
1152 {
1153 depth += -r3_val;
1154 }
1155 else if (IS_ADD_SP (insn))
1156 {
1157 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
1158 }
1159 else if (IS_MOV_SP_FP (insn))
1160 break;
1161#if 0 /* This used to just stop when it found an instruction that
1162 was not considered part of the prologue. Now, we just
1163 keep going looking for likely instructions. */
1164 else
1165 break;
1166#endif
1167 }
1168
1169 /* Now we know how deep things are, we can work out their addresses */
1170
cd4bffcf 1171 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
cc17453a
EZ
1172 {
1173 if (where[rn] >= 0)
1174 {
0ba6dca9 1175 if (rn == DEPRECATED_FP_REGNUM)
cc17453a 1176 have_fp = 1;
c906108c 1177
1e2330ba 1178 get_frame_saved_regs (fi)[rn] = get_frame_base (fi) - where[rn] + depth - 4;
cc17453a
EZ
1179 }
1180 else
1181 {
b2fb4676 1182 get_frame_saved_regs (fi)[rn] = 0;
cc17453a
EZ
1183 }
1184 }
1185
1186 if (have_fp)
1187 {
0ba6dca9 1188 get_frame_saved_regs (fi)[SP_REGNUM] = read_memory_integer (get_frame_saved_regs (fi)[DEPRECATED_FP_REGNUM], 4);
cc17453a
EZ
1189 }
1190 else
1191 {
1e2330ba 1192 get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
cc17453a
EZ
1193 }
1194
0ba6dca9 1195 get_frame_extra_info (fi)->f_offset = depth - where[DEPRECATED_FP_REGNUM] - 4;
cc17453a
EZ
1196 /* Work out the return pc - either from the saved pr or the pr
1197 value */
1198}
1199
3bbfbb92
EZ
1200/* For vectors of 4 floating point registers. */
1201static int
1202fv_reg_base_num (int fv_regnum)
1203{
1204 int fp_regnum;
1205
1206 fp_regnum = FP0_REGNUM +
1207 (fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_REGNUM) * 4;
1208 return fp_regnum;
1209}
1210
1211/* For double precision floating point registers, i.e 2 fp regs.*/
1212static int
1213dr_reg_base_num (int dr_regnum)
1214{
1215 int fp_regnum;
1216
1217 fp_regnum = FP0_REGNUM +
1218 (dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_REGNUM) * 2;
1219 return fp_regnum;
1220}
1221
283150cd
EZ
1222/* For pairs of floating point registers */
1223static int
1224fpp_reg_base_num (int fpp_regnum)
1225{
1226 int fp_regnum;
1227
1228 fp_regnum = FP0_REGNUM +
1229 (fpp_regnum - gdbarch_tdep (current_gdbarch)->FPP0_REGNUM) * 2;
1230 return fp_regnum;
1231}
1232
1233static int
1234is_media_pseudo (int rn)
1235{
1236 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1237
1238 return (rn >= tdep->DR0_REGNUM
1239 && rn <= tdep->FV_LAST_REGNUM);
1240}
1241
a78f21af 1242static int
283150cd
EZ
1243sh64_get_gdb_regnum (int gcc_regnum, CORE_ADDR pc)
1244{
1245 return translate_insn_rn (gcc_regnum, pc_is_isa32 (pc));
1246}
1247
1248static int
1249sh64_media_reg_base_num (int reg_nr)
1250{
1251 int base_regnum = -1;
1252 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1253
1254 if (reg_nr >= tdep->DR0_REGNUM
1255 && reg_nr <= tdep->DR_LAST_REGNUM)
1256 base_regnum = dr_reg_base_num (reg_nr);
1257
1258 else if (reg_nr >= tdep->FPP0_REGNUM
1259 && reg_nr <= tdep->FPP_LAST_REGNUM)
1260 base_regnum = fpp_reg_base_num (reg_nr);
1261
1262 else if (reg_nr >= tdep->FV0_REGNUM
1263 && reg_nr <= tdep->FV_LAST_REGNUM)
1264 base_regnum = fv_reg_base_num (reg_nr);
1265
1266 return base_regnum;
1267}
1268
1269/* *INDENT-OFF* */
1270/*
1271 SH COMPACT MODE (ISA 16) (all pseudo) 221-272
1272 GDB_REGNUM BASE_REGNUM
1273 r0_c 221 0
1274 r1_c 222 1
1275 r2_c 223 2
1276 r3_c 224 3
1277 r4_c 225 4
1278 r5_c 226 5
1279 r6_c 227 6
1280 r7_c 228 7
1281 r8_c 229 8
1282 r9_c 230 9
1283 r10_c 231 10
1284 r11_c 232 11
1285 r12_c 233 12
1286 r13_c 234 13
1287 r14_c 235 14
1288 r15_c 236 15
1289
1290 pc_c 237 64
1291 gbr_c 238 16
1292 mach_c 239 17
1293 macl_c 240 17
1294 pr_c 241 18
1295 t_c 242 19
1296 fpscr_c 243 76
1297 fpul_c 244 109
1298
1299 fr0_c 245 77
1300 fr1_c 246 78
1301 fr2_c 247 79
1302 fr3_c 248 80
1303 fr4_c 249 81
1304 fr5_c 250 82
1305 fr6_c 251 83
1306 fr7_c 252 84
1307 fr8_c 253 85
1308 fr9_c 254 86
1309 fr10_c 255 87
1310 fr11_c 256 88
1311 fr12_c 257 89
1312 fr13_c 258 90
1313 fr14_c 259 91
1314 fr15_c 260 92
1315
1316 dr0_c 261 77
1317 dr2_c 262 79
1318 dr4_c 263 81
1319 dr6_c 264 83
1320 dr8_c 265 85
1321 dr10_c 266 87
1322 dr12_c 267 89
1323 dr14_c 268 91
1324
1325 fv0_c 269 77
1326 fv4_c 270 81
1327 fv8_c 271 85
1328 fv12_c 272 91
1329*/
1330/* *INDENT-ON* */
1331static int
1332sh64_compact_reg_base_num (int reg_nr)
1333{
1334 int base_regnum = -1;
1335 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1336
1337 /* general register N maps to general register N */
1338 if (reg_nr >= tdep->R0_C_REGNUM
1339 && reg_nr <= tdep->R_LAST_C_REGNUM)
1340 base_regnum = reg_nr - tdep->R0_C_REGNUM;
1341
1342 /* floating point register N maps to floating point register N */
1343 else if (reg_nr >= tdep->FP0_C_REGNUM
1344 && reg_nr <= tdep->FP_LAST_C_REGNUM)
1345 base_regnum = reg_nr - tdep->FP0_C_REGNUM + FP0_REGNUM;
1346
1347 /* double prec register N maps to base regnum for double prec register N */
1348 else if (reg_nr >= tdep->DR0_C_REGNUM
1349 && reg_nr <= tdep->DR_LAST_C_REGNUM)
1350 base_regnum = dr_reg_base_num (tdep->DR0_REGNUM
1351 + reg_nr - tdep->DR0_C_REGNUM);
1352
1353 /* vector N maps to base regnum for vector register N */
1354 else if (reg_nr >= tdep->FV0_C_REGNUM
1355 && reg_nr <= tdep->FV_LAST_C_REGNUM)
1356 base_regnum = fv_reg_base_num (tdep->FV0_REGNUM
1357 + reg_nr - tdep->FV0_C_REGNUM);
1358
1359 else if (reg_nr == tdep->PC_C_REGNUM)
1360 base_regnum = PC_REGNUM;
1361
1362 else if (reg_nr == tdep->GBR_C_REGNUM)
1363 base_regnum = 16;
1364
1365 else if (reg_nr == tdep->MACH_C_REGNUM
1366 || reg_nr == tdep->MACL_C_REGNUM)
1367 base_regnum = 17;
1368
1369 else if (reg_nr == tdep->PR_C_REGNUM)
1370 base_regnum = 18;
1371
1372 else if (reg_nr == tdep->T_C_REGNUM)
1373 base_regnum = 19;
1374
1375 else if (reg_nr == tdep->FPSCR_C_REGNUM)
1376 base_regnum = tdep->FPSCR_REGNUM; /*???? this register is a mess. */
1377
1378 else if (reg_nr == tdep->FPUL_C_REGNUM)
1379 base_regnum = FP0_REGNUM + 32;
1380
1381 return base_regnum;
1382}
1383
1384/* Given a register number RN (according to the gdb scheme) , return
1385 its corresponding architectural register. In media mode, only a
1386 subset of the registers is pseudo registers. For compact mode, all
1387 the registers are pseudo. */
1388static int
1389translate_rn_to_arch_reg_num (int rn, int media_mode)
1390{
1391
1392 if (media_mode)
1393 {
1394 if (!is_media_pseudo (rn))
1395 return rn;
1396 else
1397 return sh64_media_reg_base_num (rn);
1398 }
1399 else
1400 /* All compact registers are pseudo. */
1401 return sh64_compact_reg_base_num (rn);
1402}
1403
1404static int
1405sign_extend (int value, int bits)
1406{
1407 value = value & ((1 << bits) - 1);
1408 return (value & (1 << (bits - 1))
1409 ? value | (~((1 << bits) - 1))
1410 : value);
1411}
1412
cc17453a 1413static void
283150cd 1414sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
cc17453a 1415{
ddde02bd 1416 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof (int));
cc17453a
EZ
1417 int rn;
1418 int have_fp = 0;
283150cd
EZ
1419 int fp_regnum;
1420 int sp_regnum;
1421 int depth;
1422 int pc;
1423 int opc;
1424 int insn;
1425 int r0_val = 0;
1426 int media_mode = 0;
1427 int insn_size;
1428 int gdb_register_number;
1429 int register_number;
1e2330ba 1430 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), get_frame_base (fi));
283150cd
EZ
1431 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1432
b2fb4676 1433 if (get_frame_saved_regs (fi) == NULL)
283150cd
EZ
1434 frame_saved_regs_zalloc (fi);
1435 else
b2fb4676 1436 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
283150cd
EZ
1437
1438 if (dummy_regs)
1439 {
1440 /* DANGER! This is ONLY going to work if the char buffer format of
1441 the saved registers is byte-for-byte identical to the
1442 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
7b5849cc 1443 memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS);
283150cd
EZ
1444 return;
1445 }
1446
da50a4b7
AC
1447 get_frame_extra_info (fi)->leaf_function = 1;
1448 get_frame_extra_info (fi)->f_offset = 0;
283150cd
EZ
1449
1450 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1451 where[rn] = -1;
1452
1453 depth = 0;
1454
1455 /* Loop around examining the prologue insns until we find something
1456 that does not appear to be part of the prologue. But give up
1457 after 20 of them, since we're getting silly then. */
1458
be41e9f4 1459 pc = get_frame_func (fi);
283150cd
EZ
1460 if (!pc)
1461 {
50abf9e5 1462 deprecated_update_frame_pc_hack (fi, 0);
283150cd
EZ
1463 return;
1464 }
1465
1466 if (pc_is_isa32 (pc))
1467 {
1468 media_mode = 1;
1469 insn_size = 4;
1470 }
1471 else
1472 {
1473 media_mode = 0;
1474 insn_size = 2;
1475 }
1476
1477 /* The frame pointer register is general register 14 in shmedia and
1478 shcompact modes. In sh compact it is a pseudo register. Same goes
1479 for the stack pointer register, which is register 15. */
0ba6dca9 1480 fp_regnum = translate_insn_rn (DEPRECATED_FP_REGNUM, media_mode);
283150cd
EZ
1481 sp_regnum = translate_insn_rn (SP_REGNUM, media_mode);
1482
1483 for (opc = pc + (insn_size * 28); pc < opc; pc += insn_size)
1484 {
1485 insn = read_memory_integer (media_mode ? UNMAKE_ISA32_ADDR (pc) : pc,
1486 insn_size);
1487
1488 if (media_mode == 0)
1489 {
1490 if (IS_STS_PR (insn))
1491 {
1492 int next_insn = read_memory_integer (pc + insn_size, insn_size);
1493 if (IS_MOV_TO_R15 (next_insn))
1494 {
1495 int reg_nr = tdep->PR_C_REGNUM;
1496
1497 where[reg_nr] = depth - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2);
da50a4b7 1498 get_frame_extra_info (fi)->leaf_function = 0;
283150cd
EZ
1499 pc += insn_size;
1500 }
1501 }
1502 else if (IS_MOV_R14 (insn))
1503 {
1504 where[fp_regnum] = depth - ((((insn & 0xf) ^ 0x8) - 0x8) << 2);
1505 }
1506
1507 else if (IS_MOV_R0 (insn))
1508 {
1509 /* Put in R0 the offset from SP at which to store some
1510 registers. We are interested in this value, because it
1511 will tell us where the given registers are stored within
1512 the frame. */
1513 r0_val = ((insn & 0xff) ^ 0x80) - 0x80;
1514 }
1515 else if (IS_ADD_SP_R0 (insn))
1516 {
1517 /* This instruction still prepares r0, but we don't care.
1518 We already have the offset in r0_val. */
1519 }
1520 else if (IS_STS_R0 (insn))
1521 {
1522 /* Store PR at r0_val-4 from SP. Decrement r0 by 4*/
1523 int reg_nr = tdep->PR_C_REGNUM;
1524 where[reg_nr] = depth - (r0_val - 4);
1525 r0_val -= 4;
da50a4b7 1526 get_frame_extra_info (fi)->leaf_function = 0;
283150cd
EZ
1527 }
1528 else if (IS_MOV_R14_R0 (insn))
1529 {
1530 /* Store R14 at r0_val-4 from SP. Decrement r0 by 4 */
1531 where[fp_regnum] = depth - (r0_val - 4);
1532 r0_val -= 4;
1533 }
1534
1535 else if (IS_ADD_SP (insn))
1536 {
1537 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
1538 }
1539 else if (IS_MOV_SP_FP (insn))
1540 break;
1541 }
1542 else
1543 {
1544 if (IS_ADDIL_SP_MEDIA (insn)
1545 || IS_ADDI_SP_MEDIA (insn))
1546 {
1547 depth -= sign_extend ((((insn & 0xffc00) ^ 0x80000) - 0x80000) >> 10, 9);
1548 }
1549
1550 else if (IS_STQ_R18_R15 (insn))
1551 {
1552 where[tdep->PR_REGNUM] =
1553 depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
da50a4b7 1554 get_frame_extra_info (fi)->leaf_function = 0;
283150cd
EZ
1555 }
1556
1557 else if (IS_STL_R18_R15 (insn))
1558 {
1559 where[tdep->PR_REGNUM] =
1560 depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
da50a4b7 1561 get_frame_extra_info (fi)->leaf_function = 0;
283150cd
EZ
1562 }
1563
1564 else if (IS_STQ_R14_R15 (insn))
1565 {
1566 where[fp_regnum] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
1567 }
1568
1569 else if (IS_STL_R14_R15 (insn))
1570 {
1571 where[fp_regnum] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
1572 }
1573
1574 else if (IS_MOV_SP_FP_MEDIA (insn))
1575 break;
1576 }
1577 }
1578
1579 /* Now we know how deep things are, we can work out their addresses. */
1580 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1581 {
1582 register_number = translate_rn_to_arch_reg_num (rn, media_mode);
1583
1584 if (where[rn] >= 0)
1585 {
1586 if (rn == fp_regnum)
1587 have_fp = 1;
1588
1589 /* Watch out! saved_regs is only for the real registers, and
1590 doesn't include space for the pseudo registers. */
1e2330ba 1591 get_frame_saved_regs (fi)[register_number]= get_frame_base (fi) - where[rn] + depth;
283150cd
EZ
1592
1593 }
1594 else
b2fb4676 1595 get_frame_saved_regs (fi)[register_number] = 0;
283150cd
EZ
1596 }
1597
1598 if (have_fp)
1599 {
1600 /* SP_REGNUM is 15. For shmedia 15 is the real register. For
1601 shcompact 15 is the arch register corresponding to the pseudo
1602 register r15 which still is the SP register. */
1603 /* The place on the stack where fp is stored contains the sp of
1604 the caller. */
0ba6dca9
AC
1605 /* Again, saved_registers contains only space for the real
1606 registers, so we store in DEPRECATED_FP_REGNUM position. */
283150cd
EZ
1607 int size;
1608 if (tdep->sh_abi == SH_ABI_32)
1609 size = 4;
1610 else
1611 size = REGISTER_RAW_SIZE (fp_regnum);
b2fb4676 1612 get_frame_saved_regs (fi)[sp_regnum] = read_memory_integer (get_frame_saved_regs (fi)[fp_regnum], size);
283150cd
EZ
1613 }
1614 else
1e2330ba 1615 get_frame_saved_regs (fi)[sp_regnum] = get_frame_base (fi);
283150cd 1616
da50a4b7 1617 get_frame_extra_info (fi)->f_offset = depth - where[fp_regnum];
283150cd
EZ
1618}
1619
1620static void
1621sh_fp_frame_init_saved_regs (struct frame_info *fi)
1622{
ddde02bd 1623 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof (int));
283150cd
EZ
1624 int rn;
1625 int have_fp = 0;
cc17453a
EZ
1626 int depth;
1627 int pc;
1628 int opc;
1629 int insn;
1630 int r3_val = 0;
1e2330ba 1631 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), get_frame_base (fi));
f81353e4 1632 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
cc17453a 1633
b2fb4676 1634 if (get_frame_saved_regs (fi) == NULL)
cc17453a
EZ
1635 frame_saved_regs_zalloc (fi);
1636 else
b2fb4676 1637 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
cc17453a 1638
c906108c
SS
1639 if (dummy_regs)
1640 {
1641 /* DANGER! This is ONLY going to work if the char buffer format of
c5aa993b
JM
1642 the saved registers is byte-for-byte identical to the
1643 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
7b5849cc 1644 memcpy (get_frame_saved_regs (fi), dummy_regs, SIZEOF_FRAME_SAVED_REGS);
c906108c
SS
1645 return;
1646 }
1647
da50a4b7
AC
1648 get_frame_extra_info (fi)->leaf_function = 1;
1649 get_frame_extra_info (fi)->f_offset = 0;
c906108c 1650
cd4bffcf 1651 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
c906108c
SS
1652 where[rn] = -1;
1653
1654 depth = 0;
1655
1656 /* Loop around examining the prologue insns until we find something
1657 that does not appear to be part of the prologue. But give up
1658 after 20 of them, since we're getting silly then. */
1659
be41e9f4 1660 pc = get_frame_func (fi);
2bfa91ee 1661 if (!pc)
c906108c 1662 {
50abf9e5 1663 deprecated_update_frame_pc_hack (fi, 0);
2bfa91ee
EZ
1664 return;
1665 }
1666
1667 for (opc = pc + (2 * 28); pc < opc; pc += 2)
1668 {
1669 insn = read_memory_integer (pc, 2);
c906108c
SS
1670 /* See where the registers will be saved to */
1671 if (IS_PUSH (insn))
1672 {
c906108c
SS
1673 rn = GET_PUSHED_REG (insn);
1674 where[rn] = depth;
c906108c
SS
1675 depth += 4;
1676 }
1677 else if (IS_STS (insn))
1678 {
f81353e4 1679 where[tdep->PR_REGNUM] = depth;
c906108c 1680 /* If we're storing the pr then this isn't a leaf */
da50a4b7 1681 get_frame_extra_info (fi)->leaf_function = 0;
c906108c
SS
1682 depth += 4;
1683 }
1684 else if (IS_MOV_R3 (insn))
1685 {
1686 r3_val = ((insn & 0xff) ^ 0x80) - 0x80;
c906108c
SS
1687 }
1688 else if (IS_SHLL_R3 (insn))
1689 {
1690 r3_val <<= 1;
c906108c
SS
1691 }
1692 else if (IS_ADD_R3SP (insn))
1693 {
1694 depth += -r3_val;
c906108c
SS
1695 }
1696 else if (IS_ADD_SP (insn))
1697 {
c906108c 1698 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
c906108c
SS
1699 }
1700 else if (IS_FMOV (insn))
1701 {
f81353e4 1702 if (read_register (tdep->FPSCR_REGNUM) & FPSCR_SZ)
c906108c
SS
1703 {
1704 depth += 8;
1705 }
1706 else
1707 {
1708 depth += 4;
1709 }
1710 }
2bfa91ee
EZ
1711 else if (IS_MOV_SP_FP (insn))
1712 break;
1713#if 0 /* This used to just stop when it found an instruction that
1714 was not considered part of the prologue. Now, we just
1715 keep going looking for likely instructions. */
c906108c
SS
1716 else
1717 break;
2bfa91ee 1718#endif
c906108c
SS
1719 }
1720
1721 /* Now we know how deep things are, we can work out their addresses */
1722
cd4bffcf 1723 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
c906108c
SS
1724 {
1725 if (where[rn] >= 0)
1726 {
0ba6dca9 1727 if (rn == DEPRECATED_FP_REGNUM)
c906108c
SS
1728 have_fp = 1;
1729
1e2330ba 1730 get_frame_saved_regs (fi)[rn] = get_frame_base (fi) - where[rn] + depth - 4;
c906108c
SS
1731 }
1732 else
1733 {
b2fb4676 1734 get_frame_saved_regs (fi)[rn] = 0;
c906108c
SS
1735 }
1736 }
1737
1738 if (have_fp)
1739 {
b2fb4676 1740 get_frame_saved_regs (fi)[SP_REGNUM] =
0ba6dca9 1741 read_memory_integer (get_frame_saved_regs (fi)[DEPRECATED_FP_REGNUM], 4);
c906108c
SS
1742 }
1743 else
1744 {
1e2330ba 1745 get_frame_saved_regs (fi)[SP_REGNUM] = get_frame_base (fi) - 4;
c906108c
SS
1746 }
1747
0ba6dca9 1748 get_frame_extra_info (fi)->f_offset = depth - where[DEPRECATED_FP_REGNUM] - 4;
c906108c
SS
1749 /* Work out the return pc - either from the saved pr or the pr
1750 value */
1751}
1752
cc17453a
EZ
1753/* Initialize the extra info saved in a FRAME */
1754static void
fba45db2 1755sh_init_extra_frame_info (int fromleaf, struct frame_info *fi)
c906108c 1756{
cc17453a 1757
a00a19e9 1758 frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
c906108c 1759
11c02a10 1760 if (get_next_frame (fi))
8bedc050 1761 deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
c906108c 1762
1e2330ba
AC
1763 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1764 get_frame_base (fi)))
c906108c 1765 {
04714b91
AC
1766 /* We need to setup fi->frame here because call_function_by_hand
1767 gets it wrong by assuming it's always FP. */
1e2330ba 1768 deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi),
8ccd593b 1769 SP_REGNUM));
da50a4b7 1770 get_frame_extra_info (fi)->return_pc = deprecated_read_register_dummy (get_frame_pc (fi),
1e2330ba 1771 get_frame_base (fi),
135c175f 1772 PC_REGNUM);
b1e29e33 1773 get_frame_extra_info (fi)->f_offset = -(DEPRECATED_CALL_DUMMY_LENGTH + 4);
da50a4b7 1774 get_frame_extra_info (fi)->leaf_function = 0;
c906108c
SS
1775 return;
1776 }
1777 else
1778 {
f30ee0bc 1779 DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
da50a4b7 1780 get_frame_extra_info (fi)->return_pc =
cd4bffcf 1781 sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
c906108c
SS
1782 }
1783}
1784
283150cd
EZ
1785static void
1786sh64_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1787{
50abf9e5 1788 int media_mode = pc_is_isa32 (get_frame_pc (fi));
283150cd 1789
a00a19e9 1790 frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
283150cd 1791
11c02a10 1792 if (get_next_frame (fi))
8bedc050 1793 deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
283150cd 1794
1e2330ba
AC
1795 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
1796 get_frame_base (fi)))
283150cd 1797 {
04714b91
AC
1798 /* We need to setup fi->frame here because call_function_by_hand
1799 gets it wrong by assuming it's always FP. */
1e2330ba 1800 deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
da50a4b7 1801 get_frame_extra_info (fi)->return_pc =
1e2330ba
AC
1802 deprecated_read_register_dummy (get_frame_pc (fi),
1803 get_frame_base (fi), PC_REGNUM);
b1e29e33 1804 get_frame_extra_info (fi)->f_offset = -(DEPRECATED_CALL_DUMMY_LENGTH + 4);
da50a4b7 1805 get_frame_extra_info (fi)->leaf_function = 0;
283150cd
EZ
1806 return;
1807 }
1808 else
1809 {
f30ee0bc 1810 DEPRECATED_FRAME_INIT_SAVED_REGS (fi);
da50a4b7 1811 get_frame_extra_info (fi)->return_pc =
283150cd
EZ
1812 sh64_get_saved_pr (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
1813 }
1814}
1815
a78f21af 1816static void
283150cd
EZ
1817sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
1818 struct frame_info *frame, int regnum,
1819 enum lval_type *lval)
1820{
1821 int media_mode;
1822 int live_regnum = regnum;
1823 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1824
1825 if (!target_has_registers)
1826 error ("No registers.");
1827
1828 /* Normal systems don't optimize out things with register numbers. */
1829 if (optimized != NULL)
1830 *optimized = 0;
1831
1832 if (addrp) /* default assumption: not found in memory */
1833 *addrp = 0;
1834
1835 if (raw_buffer)
1836 memset (raw_buffer, 0, sizeof (raw_buffer));
1837
1838 /* We must do this here, before the following while loop changes
1839 frame, and makes it NULL. If this is a media register number,
1840 but we are in compact mode, it will become the corresponding
1841 compact pseudo register. If there is no corresponding compact
1842 pseudo-register what do we do?*/
50abf9e5 1843 media_mode = pc_is_isa32 (get_frame_pc (frame));
283150cd
EZ
1844 live_regnum = translate_insn_rn (regnum, media_mode);
1845
1846 /* Note: since the current frame's registers could only have been
1847 saved by frames INTERIOR TO the current frame, we skip examining
1848 the current frame itself: otherwise, we would be getting the
1849 previous frame's registers which were saved by the current frame. */
1850
11c02a10 1851 while (frame && ((frame = get_next_frame (frame)) != NULL))
283150cd 1852 {
1e2330ba
AC
1853 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
1854 get_frame_base (frame),
1855 get_frame_base (frame)))
283150cd
EZ
1856 {
1857 if (lval) /* found it in a CALL_DUMMY frame */
1858 *lval = not_lval;
1859 if (raw_buffer)
1860 memcpy (raw_buffer,
1e2330ba 1861 (deprecated_generic_find_dummy_frame (get_frame_pc (frame), get_frame_base (frame))
da130f98 1862 + REGISTER_BYTE (regnum)),
283150cd
EZ
1863 REGISTER_RAW_SIZE (regnum));
1864 return;
1865 }
1866
f30ee0bc 1867 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676
AC
1868 if (get_frame_saved_regs (frame) != NULL
1869 && get_frame_saved_regs (frame)[regnum] != 0)
283150cd
EZ
1870 {
1871 if (lval) /* found it saved on the stack */
1872 *lval = lval_memory;
1873 if (regnum == SP_REGNUM)
1874 {
1875 if (raw_buffer) /* SP register treated specially */
fbd9dcd3
AC
1876 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1877 get_frame_saved_regs (frame)[regnum]);
283150cd
EZ
1878 }
1879 else
1880 { /* any other register */
1881
1882 if (addrp)
b2fb4676 1883 *addrp = get_frame_saved_regs (frame)[regnum];
283150cd
EZ
1884 if (raw_buffer)
1885 {
1886 int size;
1887 if (tdep->sh_abi == SH_ABI_32
0ba6dca9 1888 && (live_regnum == DEPRECATED_FP_REGNUM
283150cd
EZ
1889 || live_regnum == tdep->PR_REGNUM))
1890 size = 4;
1891 else
1892 size = REGISTER_RAW_SIZE (live_regnum);
1893 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
b2fb4676 1894 read_memory (get_frame_saved_regs (frame)[regnum], raw_buffer, size);
283150cd 1895 else
b2fb4676 1896 read_memory (get_frame_saved_regs (frame)[regnum],
283150cd
EZ
1897 raw_buffer
1898 + REGISTER_RAW_SIZE (live_regnum)
1899 - size,
1900 size);
1901 }
1902 }
1903 return;
1904 }
1905 }
1906
1907 /* If we get thru the loop to this point, it means the register was
1908 not saved in any frame. Return the actual live-register value. */
1909
1910 if (lval) /* found it in a live register */
1911 *lval = lval_register;
1912 if (addrp)
1913 *addrp = REGISTER_BYTE (live_regnum);
1914 if (raw_buffer)
4caf0990 1915 deprecated_read_register_gen (live_regnum, raw_buffer);
283150cd
EZ
1916}
1917
cc17453a
EZ
1918/* Extract from an array REGBUF containing the (raw) register state
1919 the address in which a function should return its structure value,
1920 as a CORE_ADDR (or an expression that can be used as one). */
b3df3fff 1921static CORE_ADDR
0c8053b6 1922sh_extract_struct_value_address (char *regbuf)
cc17453a 1923{
7c0b4a20 1924 return (extract_unsigned_integer ((regbuf), REGISTER_RAW_SIZE (0)));
cc17453a
EZ
1925}
1926
283150cd
EZ
1927static CORE_ADDR
1928sh64_extract_struct_value_address (char *regbuf)
1929{
7c0b4a20
AC
1930 return (extract_unsigned_integer ((regbuf + REGISTER_BYTE (STRUCT_RETURN_REGNUM)),
1931 REGISTER_RAW_SIZE (STRUCT_RETURN_REGNUM)));
283150cd
EZ
1932}
1933
cc17453a 1934static CORE_ADDR
fba45db2 1935sh_frame_saved_pc (struct frame_info *frame)
cc17453a 1936{
da50a4b7 1937 return (get_frame_extra_info (frame)->return_pc);
cc17453a
EZ
1938}
1939
c906108c
SS
1940/* Discard from the stack the innermost frame,
1941 restoring all saved registers. */
cc17453a 1942static void
fba45db2 1943sh_pop_frame (void)
c906108c
SS
1944{
1945 register struct frame_info *frame = get_current_frame ();
1946 register CORE_ADDR fp;
1947 register int regnum;
c906108c 1948
1e2330ba
AC
1949 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
1950 get_frame_base (frame),
1951 get_frame_base (frame)))
c906108c
SS
1952 generic_pop_dummy_frame ();
1953 else
c5aa993b 1954 {
c193f6ac 1955 fp = get_frame_base (frame);
f30ee0bc 1956 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
c906108c 1957
c5aa993b 1958 /* Copy regs from where they were saved in the frame */
cd4bffcf 1959 for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
b2fb4676 1960 if (get_frame_saved_regs (frame)[regnum])
cd4bffcf 1961 write_register (regnum,
b2fb4676 1962 read_memory_integer (get_frame_saved_regs (frame)[regnum], 4));
c906108c 1963
da50a4b7 1964 write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc);
c5aa993b
JM
1965 write_register (SP_REGNUM, fp + 4);
1966 }
c906108c
SS
1967 flush_cached_frames ();
1968}
1969
283150cd
EZ
1970/* Used in the 'return' command. */
1971static void
1972sh64_pop_frame (void)
1973{
1974 register struct frame_info *frame = get_current_frame ();
1975 register CORE_ADDR fp;
1976 register int regnum;
1977 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1978
50abf9e5 1979 int media_mode = pc_is_isa32 (get_frame_pc (frame));
283150cd 1980
1e2330ba
AC
1981 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
1982 get_frame_base (frame),
1983 get_frame_base (frame)))
283150cd
EZ
1984 generic_pop_dummy_frame ();
1985 else
1986 {
c193f6ac 1987 fp = get_frame_base (frame);
f30ee0bc 1988 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
283150cd
EZ
1989
1990 /* Copy regs from where they were saved in the frame */
1991 for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
b2fb4676 1992 if (get_frame_saved_regs (frame)[regnum])
283150cd
EZ
1993 {
1994 int size;
1995 if (tdep->sh_abi == SH_ABI_32
0ba6dca9 1996 && (regnum == DEPRECATED_FP_REGNUM
283150cd
EZ
1997 || regnum == tdep->PR_REGNUM))
1998 size = 4;
1999 else
2000 size = REGISTER_RAW_SIZE (translate_insn_rn (regnum,
2001 media_mode));
2002 write_register (regnum,
b2fb4676 2003 read_memory_integer (get_frame_saved_regs (frame)[regnum],
283150cd
EZ
2004 size));
2005 }
2006
da50a4b7 2007 write_register (PC_REGNUM, get_frame_extra_info (frame)->return_pc);
283150cd
EZ
2008 write_register (SP_REGNUM, fp + 8);
2009 }
2010 flush_cached_frames ();
2011}
2012
c906108c
SS
2013/* Function: push_arguments
2014 Setup the function arguments for calling a function in the inferior.
2015
2016 On the Hitachi SH architecture, there are four registers (R4 to R7)
2017 which are dedicated for passing function arguments. Up to the first
2018 four arguments (depending on size) may go into these registers.
2019 The rest go on the stack.
2020
2021 Arguments that are smaller than 4 bytes will still take up a whole
2022 register or a whole 32-bit word on the stack, and will be
2023 right-justified in the register or the stack word. This includes
2024 chars, shorts, and small aggregate types.
2025
2026 Arguments that are larger than 4 bytes may be split between two or
2027 more registers. If there are not enough registers free, an argument
2028 may be passed partly in a register (or registers), and partly on the
2029 stack. This includes doubles, long longs, and larger aggregates.
2030 As far as I know, there is no upper limit to the size of aggregates
2031 that will be passed in this way; in other words, the convention of
2032 passing a pointer to a large aggregate instead of a copy is not used.
2033
2034 An exceptional case exists for struct arguments (and possibly other
2035 aggregates such as arrays) if the size is larger than 4 bytes but
2036 not a multiple of 4 bytes. In this case the argument is never split
2037 between the registers and the stack, but instead is copied in its
2038 entirety onto the stack, AND also copied into as many registers as
2039 there is room for. In other words, space in registers permitting,
2040 two copies of the same argument are passed in. As far as I can tell,
2041 only the one on the stack is used, although that may be a function
2042 of the level of compiler optimization. I suspect this is a compiler
2043 bug. Arguments of these odd sizes are left-justified within the
2044 word (as opposed to arguments smaller than 4 bytes, which are
2045 right-justified).
c5aa993b 2046
c906108c
SS
2047 If the function is to return an aggregate type such as a struct, it
2048 is either returned in the normal return value register R0 (if its
2049 size is no greater than one byte), or else the caller must allocate
2050 space into which the callee will copy the return value (if the size
2051 is greater than one byte). In this case, a pointer to the return
2052 value location is passed into the callee in register R2, which does
2053 not displace any of the other arguments passed in via registers R4
2054 to R7. */
2055
cc17453a 2056static CORE_ADDR
34e9d9bb 2057sh_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
3bbfbb92 2058 int struct_return, CORE_ADDR struct_addr)
c906108c
SS
2059{
2060 int stack_offset, stack_alloc;
2061 int argreg;
2062 int argnum;
2063 struct type *type;
2064 CORE_ADDR regval;
2065 char *val;
2066 char valbuf[4];
2067 int len;
2068 int odd_sized_struct;
f81353e4 2069 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
c906108c
SS
2070
2071 /* first force sp to a 4-byte alignment */
2072 sp = sp & ~3;
2073
2074 /* The "struct return pointer" pseudo-argument has its own dedicated
2075 register */
2076 if (struct_return)
c5aa993b 2077 write_register (STRUCT_RETURN_REGNUM, struct_addr);
c906108c
SS
2078
2079 /* Now make sure there's space on the stack */
cc17453a 2080 for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
c5aa993b
JM
2081 stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
2082 sp -= stack_alloc; /* make room on stack for args */
c906108c 2083
c906108c
SS
2084 /* Now load as many as possible of the first arguments into
2085 registers, and push the rest onto the stack. There are 16 bytes
2086 in four registers available. Loop thru args from first to last. */
2087
f81353e4 2088 argreg = tdep->ARG0_REGNUM;
c906108c
SS
2089 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2090 {
2091 type = VALUE_TYPE (args[argnum]);
c5aa993b
JM
2092 len = TYPE_LENGTH (type);
2093 memset (valbuf, 0, sizeof (valbuf));
c906108c 2094 if (len < 4)
cc17453a
EZ
2095 {
2096 /* value gets right-justified in the register or stack word */
7079c36c
CV
2097 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2098 memcpy (valbuf + (4 - len),
2099 (char *) VALUE_CONTENTS (args[argnum]), len);
2100 else
2101 memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
c5aa993b
JM
2102 val = valbuf;
2103 }
c906108c 2104 else
c5aa993b 2105 val = (char *) VALUE_CONTENTS (args[argnum]);
c906108c
SS
2106
2107 if (len > 4 && (len & 3) != 0)
c5aa993b
JM
2108 odd_sized_struct = 1; /* such structs go entirely on stack */
2109 else
c906108c
SS
2110 odd_sized_struct = 0;
2111 while (len > 0)
2112 {
f81353e4 2113 if (argreg > tdep->ARGLAST_REGNUM
3bbfbb92
EZ
2114 || odd_sized_struct)
2115 {
2116 /* must go on the stack */
c906108c
SS
2117 write_memory (sp + stack_offset, val, 4);
2118 stack_offset += 4;
2119 }
2120 /* NOTE WELL!!!!! This is not an "else if" clause!!!
2121 That's because some *&^%$ things get passed on the stack
2122 AND in the registers! */
f81353e4 2123 if (argreg <= tdep->ARGLAST_REGNUM)
3bbfbb92
EZ
2124 {
2125 /* there's room in a register */
7c0b4a20 2126 regval = extract_unsigned_integer (val, REGISTER_RAW_SIZE (argreg));
c906108c
SS
2127 write_register (argreg++, regval);
2128 }
2129 /* Store the value 4 bytes at a time. This means that things
2130 larger than 4 bytes may go partly in registers and partly
2131 on the stack. */
c5aa993b
JM
2132 len -= REGISTER_RAW_SIZE (argreg);
2133 val += REGISTER_RAW_SIZE (argreg);
c906108c
SS
2134 }
2135 }
2136 return sp;
2137}
2138
283150cd
EZ
2139/* R2-R9 for integer types and integer equivalent (char, pointers) and
2140 non-scalar (struct, union) elements (even if the elements are
2141 floats).
2142 FR0-FR11 for single precision floating point (float)
2143 DR0-DR10 for double precision floating point (double)
2144
2145 If a float is argument number 3 (for instance) and arguments number
2146 1,2, and 4 are integer, the mapping will be:
2147 arg1 -->R2, arg2 --> R3, arg3 -->FR0, arg4 --> R5. I.e. R4 is not used.
2148
2149 If a float is argument number 10 (for instance) and arguments number
2150 1 through 10 are integer, the mapping will be:
2151 arg1->R2, arg2->R3, arg3->R4, arg4->R5, arg5->R6, arg6->R7, arg7->R8,
2152 arg8->R9, arg9->(0,SP)stack(8-byte aligned), arg10->FR0, arg11->stack(16,SP).
2153 I.e. there is hole in the stack.
2154
2155 Different rules apply for variable arguments functions, and for functions
2156 for which the prototype is not known. */
2157
2158static CORE_ADDR
2159sh64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2160 int struct_return, CORE_ADDR struct_addr)
2161{
2162 int stack_offset, stack_alloc;
2163 int int_argreg;
2164 int float_argreg;
2165 int double_argreg;
2166 int float_arg_index = 0;
2167 int double_arg_index = 0;
2168 int argnum;
2169 struct type *type;
2170 CORE_ADDR regval;
2171 char *val;
2172 char valbuf[8];
2173 char valbuf_tmp[8];
2174 int len;
2175 int argreg_size;
2176 int fp_args[12];
2177 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2178
2179 memset (fp_args, 0, sizeof (fp_args));
2180
2181 /* first force sp to a 8-byte alignment */
2182 sp = sp & ~7;
2183
2184 /* The "struct return pointer" pseudo-argument has its own dedicated
2185 register */
2186
2187 if (struct_return)
2188 write_register (STRUCT_RETURN_REGNUM, struct_addr);
2189
2190 /* Now make sure there's space on the stack */
2191 for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
2192 stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 7) & ~7);
2193 sp -= stack_alloc; /* make room on stack for args */
2194
2195 /* Now load as many as possible of the first arguments into
2196 registers, and push the rest onto the stack. There are 64 bytes
2197 in eight registers available. Loop thru args from first to last. */
2198
2199 int_argreg = tdep->ARG0_REGNUM;
2200 float_argreg = FP0_REGNUM;
2201 double_argreg = tdep->DR0_REGNUM;
2202
2203 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2204 {
2205 type = VALUE_TYPE (args[argnum]);
2206 len = TYPE_LENGTH (type);
2207 memset (valbuf, 0, sizeof (valbuf));
2208
2209 if (TYPE_CODE (type) != TYPE_CODE_FLT)
2210 {
2211 argreg_size = REGISTER_RAW_SIZE (int_argreg);
2212
2213 if (len < argreg_size)
2214 {
2215 /* value gets right-justified in the register or stack word */
2216 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2217 memcpy (valbuf + argreg_size - len,
2218 (char *) VALUE_CONTENTS (args[argnum]), len);
2219 else
2220 memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
2221
2222 val = valbuf;
2223 }
2224 else
2225 val = (char *) VALUE_CONTENTS (args[argnum]);
2226
2227 while (len > 0)
2228 {
2229 if (int_argreg > tdep->ARGLAST_REGNUM)
2230 {
2231 /* must go on the stack */
2232 write_memory (sp + stack_offset, val, argreg_size);
2233 stack_offset += 8;/*argreg_size;*/
2234 }
2235 /* NOTE WELL!!!!! This is not an "else if" clause!!!
2236 That's because some *&^%$ things get passed on the stack
2237 AND in the registers! */
2238 if (int_argreg <= tdep->ARGLAST_REGNUM)
2239 {
2240 /* there's room in a register */
7c0b4a20 2241 regval = extract_unsigned_integer (val, argreg_size);
283150cd
EZ
2242 write_register (int_argreg, regval);
2243 }
2244 /* Store the value 8 bytes at a time. This means that
2245 things larger than 8 bytes may go partly in registers
2246 and partly on the stack. FIXME: argreg is incremented
2247 before we use its size. */
2248 len -= argreg_size;
2249 val += argreg_size;
2250 int_argreg++;
2251 }
2252 }
2253 else
2254 {
2255 val = (char *) VALUE_CONTENTS (args[argnum]);
2256 if (len == 4)
2257 {
2258 /* Where is it going to be stored? */
2259 while (fp_args[float_arg_index])
2260 float_arg_index ++;
2261
2262 /* Now float_argreg points to the register where it
2263 should be stored. Are we still within the allowed
2264 register set? */
2265 if (float_arg_index <= tdep->FLOAT_ARGLAST_REGNUM)
2266 {
2267 /* Goes in FR0...FR11 */
4caf0990
AC
2268 deprecated_write_register_gen (FP0_REGNUM + float_arg_index,
2269 val);
283150cd
EZ
2270 fp_args[float_arg_index] = 1;
2271 /* Skip the corresponding general argument register. */
2272 int_argreg ++;
2273 }
2274 else
2275 ;
2276 /* Store it as the integers, 8 bytes at the time, if
2277 necessary spilling on the stack. */
2278
2279 }
2280 else if (len == 8)
2281 {
2282 /* Where is it going to be stored? */
2283 while (fp_args[double_arg_index])
2284 double_arg_index += 2;
2285 /* Now double_argreg points to the register
2286 where it should be stored.
2287 Are we still within the allowed register set? */
2288 if (double_arg_index < tdep->FLOAT_ARGLAST_REGNUM)
2289 {
2290 /* Goes in DR0...DR10 */
2291 /* The numbering of the DRi registers is consecutive,
2292 i.e. includes odd numbers. */
2293 int double_register_offset = double_arg_index / 2;
2294 int regnum = tdep->DR0_REGNUM +
2295 double_register_offset;
2296#if 0
2297 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2298 {
2299 memset (valbuf_tmp, 0, sizeof (valbuf_tmp));
781a750d
AC
2300 DEPRECATED_REGISTER_CONVERT_TO_VIRTUAL (regnum,
2301 type, val,
2302 valbuf_tmp);
283150cd
EZ
2303 val = valbuf_tmp;
2304 }
2305#endif
2306 /* Note: must use write_register_gen here instead
0818c12a
AC
2307 of regcache_raw_write, because
2308 regcache_raw_write works only for real
2309 registers, not pseudo. write_register_gen will
2310 call the gdbarch function to do register
2311 writes, and that will properly know how to deal
2312 with pseudoregs. */
4caf0990 2313 deprecated_write_register_gen (regnum, val);
283150cd
EZ
2314 fp_args[double_arg_index] = 1;
2315 fp_args[double_arg_index + 1] = 1;
2316 /* Skip the corresponding general argument register. */
2317 int_argreg ++;
2318 }
2319 else
2320 ;
2321 /* Store it as the integers, 8 bytes at the time, if
2322 necessary spilling on the stack. */
2323 }
2324 }
2325 }
2326 return sp;
2327}
2328
c906108c
SS
2329/* Function: push_return_address (pc)
2330 Set up the return address for the inferior function call.
2331 Needed for targets where we don't actually execute a JSR/BSR instruction */
2332
cc17453a 2333static CORE_ADDR
fba45db2 2334sh_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
c906108c 2335{
283150cd
EZ
2336 write_register (gdbarch_tdep (current_gdbarch)->PR_REGNUM,
2337 CALL_DUMMY_ADDRESS ());
c906108c
SS
2338 return sp;
2339}
2340
2341/* Function: fix_call_dummy
2342 Poke the callee function's address into the destination part of
2343 the CALL_DUMMY. The address is actually stored in a data word
2344 following the actualy CALL_DUMMY instructions, which will load
2345 it into a register using PC-relative addressing. This function
2346 expects the CALL_DUMMY to look like this:
2347
c5aa993b
JM
2348 mov.w @(2,PC), R8
2349 jsr @R8
2350 nop
2351 trap
2352 <destination>
2353 */
c906108c
SS
2354
2355#if 0
2356void
fba45db2 2357sh_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
ea7c478f 2358 struct value **args, struct type *type, int gcc_p)
c906108c
SS
2359{
2360 *(unsigned long *) (dummy + 8) = fun;
2361}
2362#endif
2363
cc17453a
EZ
2364/* Find a function's return value in the appropriate registers (in
2365 regbuf), and copy it into valbuf. Extract from an array REGBUF
2366 containing the (raw) register state a function return value of type
2367 TYPE, and copy that, in virtual format, into VALBUF. */
2368static void
fba45db2 2369sh_extract_return_value (struct type *type, char *regbuf, char *valbuf)
c906108c 2370{
cc17453a 2371 int len = TYPE_LENGTH (type);
3116c80a
EZ
2372 int return_register = R0_REGNUM;
2373 int offset;
2374
cc17453a 2375 if (len <= 4)
3116c80a 2376 {
d7449b42 2377 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3116c80a
EZ
2378 offset = REGISTER_BYTE (return_register) + 4 - len;
2379 else
2380 offset = REGISTER_BYTE (return_register);
2381 memcpy (valbuf, regbuf + offset, len);
2382 }
cc17453a 2383 else if (len <= 8)
3116c80a 2384 {
d7449b42 2385 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3116c80a
EZ
2386 offset = REGISTER_BYTE (return_register) + 8 - len;
2387 else
2388 offset = REGISTER_BYTE (return_register);
2389 memcpy (valbuf, regbuf + offset, len);
2390 }
2391 else
2392 error ("bad size for return value");
2393}
2394
2395static void
2396sh3e_sh4_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2397{
2398 int return_register;
2399 int offset;
2400 int len = TYPE_LENGTH (type);
2401
2402 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2403 return_register = FP0_REGNUM;
2404 else
2405 return_register = R0_REGNUM;
2406
2407 if (len == 8 && TYPE_CODE (type) == TYPE_CODE_FLT)
2408 {
2409 DOUBLEST val;
778eb05e 2410 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
3116c80a
EZ
2411 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
2412 (char *) regbuf + REGISTER_BYTE (return_register),
2413 &val);
2414 else
2415 floatformat_to_doublest (&floatformat_ieee_double_big,
2416 (char *) regbuf + REGISTER_BYTE (return_register),
2417 &val);
f1908289 2418 deprecated_store_floating (valbuf, len, val);
3116c80a
EZ
2419 }
2420 else if (len <= 4)
2421 {
d7449b42 2422 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3116c80a
EZ
2423 offset = REGISTER_BYTE (return_register) + 4 - len;
2424 else
2425 offset = REGISTER_BYTE (return_register);
2426 memcpy (valbuf, regbuf + offset, len);
2427 }
2428 else if (len <= 8)
2429 {
d7449b42 2430 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3116c80a
EZ
2431 offset = REGISTER_BYTE (return_register) + 8 - len;
2432 else
2433 offset = REGISTER_BYTE (return_register);
2434 memcpy (valbuf, regbuf + offset, len);
2435 }
cc17453a
EZ
2436 else
2437 error ("bad size for return value");
2438}
c906108c 2439
283150cd
EZ
2440static void
2441sh64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2442{
2443 int offset;
2444 int return_register;
2445 int len = TYPE_LENGTH (type);
2446 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2447
2448 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2449 {
2450 if (len == 4)
2451 {
2452 /* Return value stored in FP0_REGNUM */
2453 return_register = FP0_REGNUM;
2454 offset = REGISTER_BYTE (return_register);
2455 memcpy (valbuf, (char *) regbuf + offset, len);
2456 }
2457 else if (len == 8)
2458 {
2459 /* return value stored in DR0_REGNUM */
2460 DOUBLEST val;
2461
2462 return_register = tdep->DR0_REGNUM;
2463 offset = REGISTER_BYTE (return_register);
2464
2465 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2466 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
2467 (char *) regbuf + offset, &val);
2468 else
2469 floatformat_to_doublest (&floatformat_ieee_double_big,
2470 (char *) regbuf + offset, &val);
f1908289 2471 deprecated_store_floating (valbuf, len, val);
283150cd
EZ
2472 }
2473 }
2474 else
2475 {
2476 if (len <= 8)
2477 {
2478 /* Result is in register 2. If smaller than 8 bytes, it is padded
2479 at the most significant end. */
2480 return_register = tdep->RETURN_REGNUM;
2481 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2482 offset = REGISTER_BYTE (return_register) +
2483 REGISTER_RAW_SIZE (return_register) - len;
2484 else
2485 offset = REGISTER_BYTE (return_register);
2486 memcpy (valbuf, (char *) regbuf + offset, len);
2487 }
2488 else
2489 error ("bad size for return value");
2490 }
2491}
2492
cc17453a
EZ
2493/* Write into appropriate registers a function return value
2494 of type TYPE, given in virtual format.
2495 If the architecture is sh4 or sh3e, store a function's return value
2496 in the R0 general register or in the FP0 floating point register,
2497 depending on the type of the return value. In all the other cases
3bbfbb92 2498 the result is stored in r0, left-justified. */
cc17453a
EZ
2499static void
2500sh_default_store_return_value (struct type *type, char *valbuf)
2501{
d19b71be
MS
2502 char buf[32]; /* more than enough... */
2503
2504 if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (R0_REGNUM))
2505 {
2506 /* Add leading zeros to the value. */
2507 memset (buf, 0, REGISTER_RAW_SIZE (R0_REGNUM));
7079c36c
CV
2508 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2509 memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type),
2510 valbuf, TYPE_LENGTH (type));
2511 else
2512 memcpy (buf, valbuf, TYPE_LENGTH (type));
73937e03
AC
2513 deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf,
2514 REGISTER_RAW_SIZE (R0_REGNUM));
d19b71be
MS
2515 }
2516 else
73937e03
AC
2517 deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf,
2518 TYPE_LENGTH (type));
cc17453a 2519}
c906108c 2520
cc17453a
EZ
2521static void
2522sh3e_sh4_store_return_value (struct type *type, char *valbuf)
2523{
2524 if (TYPE_CODE (type) == TYPE_CODE_FLT)
73937e03
AC
2525 deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
2526 valbuf, TYPE_LENGTH (type));
cc17453a 2527 else
d19b71be 2528 sh_default_store_return_value (type, valbuf);
c906108c
SS
2529}
2530
283150cd
EZ
2531static void
2532sh64_store_return_value (struct type *type, char *valbuf)
2533{
2534 char buf[64]; /* more than enough... */
2535 int len = TYPE_LENGTH (type);
2536
2537 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2538 {
2539 if (len == 4)
2540 {
2541 /* Return value stored in FP0_REGNUM */
4caf0990 2542 deprecated_write_register_gen (FP0_REGNUM, valbuf);
283150cd
EZ
2543 }
2544 if (len == 8)
2545 {
2546 /* return value stored in DR0_REGNUM */
2547 /* FIXME: Implement */
2548 }
2549 }
2550 else
2551 {
2552 int return_register = gdbarch_tdep (current_gdbarch)->RETURN_REGNUM;
2553 int offset = 0;
2554
2555 if (len <= REGISTER_RAW_SIZE (return_register))
2556 {
2557 /* Pad with zeros. */
2558 memset (buf, 0, REGISTER_RAW_SIZE (return_register));
2559 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2560 offset = 0; /*REGISTER_RAW_SIZE (return_register) - len;*/
2561 else
2562 offset = REGISTER_RAW_SIZE (return_register) - len;
2563
2564 memcpy (buf + offset, valbuf, len);
4caf0990 2565 deprecated_write_register_gen (return_register, buf);
283150cd
EZ
2566 }
2567 else
4caf0990 2568 deprecated_write_register_gen (return_register, valbuf);
283150cd
EZ
2569 }
2570}
2571
c906108c
SS
2572/* Print the registers in a form similar to the E7000 */
2573
2574static void
fba45db2 2575sh_generic_show_regs (void)
c906108c 2576{
f81353e4
EZ
2577 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2578
cc17453a
EZ
2579 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2580 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2581 (long) read_register (tdep->SR_REGNUM),
2582 (long) read_register (tdep->PR_REGNUM),
cc17453a
EZ
2583 (long) read_register (MACH_REGNUM),
2584 (long) read_register (MACL_REGNUM));
2585
2586 printf_filtered ("GBR=%08lx VBR=%08lx",
2587 (long) read_register (GBR_REGNUM),
2588 (long) read_register (VBR_REGNUM));
2589
2590 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2591 (long) read_register (0),
2592 (long) read_register (1),
2593 (long) read_register (2),
2594 (long) read_register (3),
2595 (long) read_register (4),
2596 (long) read_register (5),
2597 (long) read_register (6),
2598 (long) read_register (7));
2599 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2600 (long) read_register (8),
2601 (long) read_register (9),
2602 (long) read_register (10),
2603 (long) read_register (11),
2604 (long) read_register (12),
2605 (long) read_register (13),
2606 (long) read_register (14),
2607 (long) read_register (15));
2608}
c906108c 2609
cc17453a 2610static void
fba45db2 2611sh3_show_regs (void)
cc17453a 2612{
f81353e4
EZ
2613 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2614
d4f3574e
SS
2615 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2616 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2617 (long) read_register (tdep->SR_REGNUM),
2618 (long) read_register (tdep->PR_REGNUM),
d4f3574e
SS
2619 (long) read_register (MACH_REGNUM),
2620 (long) read_register (MACL_REGNUM));
2621
2622 printf_filtered ("GBR=%08lx VBR=%08lx",
2623 (long) read_register (GBR_REGNUM),
2624 (long) read_register (VBR_REGNUM));
cc17453a 2625 printf_filtered (" SSR=%08lx SPC=%08lx",
f81353e4
EZ
2626 (long) read_register (tdep->SSR_REGNUM),
2627 (long) read_register (tdep->SPC_REGNUM));
c906108c 2628
d4f3574e
SS
2629 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2630 (long) read_register (0),
2631 (long) read_register (1),
2632 (long) read_register (2),
2633 (long) read_register (3),
2634 (long) read_register (4),
2635 (long) read_register (5),
2636 (long) read_register (6),
2637 (long) read_register (7));
2638 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2639 (long) read_register (8),
2640 (long) read_register (9),
2641 (long) read_register (10),
2642 (long) read_register (11),
2643 (long) read_register (12),
2644 (long) read_register (13),
2645 (long) read_register (14),
2646 (long) read_register (15));
c906108c
SS
2647}
2648
53116e27 2649
2d188dd3
NC
2650static void
2651sh2e_show_regs (void)
2652{
2653 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2654 paddr (read_register (PC_REGNUM)),
2655 (long) read_register (SR_REGNUM),
2656 (long) read_register (PR_REGNUM),
2657 (long) read_register (MACH_REGNUM),
2658 (long) read_register (MACL_REGNUM));
2659
2660 printf_filtered ("GBR=%08lx VBR=%08lx",
2661 (long) read_register (GBR_REGNUM),
2662 (long) read_register (VBR_REGNUM));
2663 printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2664 (long) read_register (gdbarch_tdep (current_gdbarch)->FPUL_REGNUM),
2665 (long) read_register (gdbarch_tdep (current_gdbarch)->FPSCR_REGNUM));
2666
2667 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2668 (long) read_register (0),
2669 (long) read_register (1),
2670 (long) read_register (2),
2671 (long) read_register (3),
2672 (long) read_register (4),
2673 (long) read_register (5),
2674 (long) read_register (6),
2675 (long) read_register (7));
2676 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2677 (long) read_register (8),
2678 (long) read_register (9),
2679 (long) read_register (10),
2680 (long) read_register (11),
2681 (long) read_register (12),
2682 (long) read_register (13),
2683 (long) read_register (14),
2684 (long) read_register (15));
2685
2686 printf_filtered (("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2687 (long) read_register (FP0_REGNUM + 0),
2688 (long) read_register (FP0_REGNUM + 1),
2689 (long) read_register (FP0_REGNUM + 2),
2690 (long) read_register (FP0_REGNUM + 3),
2691 (long) read_register (FP0_REGNUM + 4),
2692 (long) read_register (FP0_REGNUM + 5),
2693 (long) read_register (FP0_REGNUM + 6),
2694 (long) read_register (FP0_REGNUM + 7));
2695 printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2696 (long) read_register (FP0_REGNUM + 8),
2697 (long) read_register (FP0_REGNUM + 9),
2698 (long) read_register (FP0_REGNUM + 10),
2699 (long) read_register (FP0_REGNUM + 11),
2700 (long) read_register (FP0_REGNUM + 12),
2701 (long) read_register (FP0_REGNUM + 13),
2702 (long) read_register (FP0_REGNUM + 14),
2703 (long) read_register (FP0_REGNUM + 15));
2704}
2705
cc17453a 2706static void
fba45db2 2707sh3e_show_regs (void)
cc17453a 2708{
f81353e4
EZ
2709 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2710
cc17453a
EZ
2711 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2712 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2713 (long) read_register (tdep->SR_REGNUM),
2714 (long) read_register (tdep->PR_REGNUM),
cc17453a
EZ
2715 (long) read_register (MACH_REGNUM),
2716 (long) read_register (MACL_REGNUM));
2717
2718 printf_filtered ("GBR=%08lx VBR=%08lx",
2719 (long) read_register (GBR_REGNUM),
2720 (long) read_register (VBR_REGNUM));
2721 printf_filtered (" SSR=%08lx SPC=%08lx",
f81353e4
EZ
2722 (long) read_register (tdep->SSR_REGNUM),
2723 (long) read_register (tdep->SPC_REGNUM));
cc17453a 2724 printf_filtered (" FPUL=%08lx FPSCR=%08lx",
f81353e4
EZ
2725 (long) read_register (tdep->FPUL_REGNUM),
2726 (long) read_register (tdep->FPSCR_REGNUM));
c906108c 2727
cc17453a
EZ
2728 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2729 (long) read_register (0),
2730 (long) read_register (1),
2731 (long) read_register (2),
2732 (long) read_register (3),
2733 (long) read_register (4),
2734 (long) read_register (5),
2735 (long) read_register (6),
2736 (long) read_register (7));
2737 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2738 (long) read_register (8),
2739 (long) read_register (9),
2740 (long) read_register (10),
2741 (long) read_register (11),
2742 (long) read_register (12),
2743 (long) read_register (13),
2744 (long) read_register (14),
2745 (long) read_register (15));
2746
2747 printf_filtered (("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2748 (long) read_register (FP0_REGNUM + 0),
2749 (long) read_register (FP0_REGNUM + 1),
2750 (long) read_register (FP0_REGNUM + 2),
2751 (long) read_register (FP0_REGNUM + 3),
2752 (long) read_register (FP0_REGNUM + 4),
2753 (long) read_register (FP0_REGNUM + 5),
2754 (long) read_register (FP0_REGNUM + 6),
2755 (long) read_register (FP0_REGNUM + 7));
2756 printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2757 (long) read_register (FP0_REGNUM + 8),
2758 (long) read_register (FP0_REGNUM + 9),
2759 (long) read_register (FP0_REGNUM + 10),
2760 (long) read_register (FP0_REGNUM + 11),
2761 (long) read_register (FP0_REGNUM + 12),
2762 (long) read_register (FP0_REGNUM + 13),
2763 (long) read_register (FP0_REGNUM + 14),
2764 (long) read_register (FP0_REGNUM + 15));
2765}
2766
2767static void
fba45db2 2768sh3_dsp_show_regs (void)
c906108c 2769{
f81353e4
EZ
2770 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2771
cc17453a
EZ
2772 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2773 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2774 (long) read_register (tdep->SR_REGNUM),
2775 (long) read_register (tdep->PR_REGNUM),
cc17453a
EZ
2776 (long) read_register (MACH_REGNUM),
2777 (long) read_register (MACL_REGNUM));
c906108c 2778
cc17453a
EZ
2779 printf_filtered ("GBR=%08lx VBR=%08lx",
2780 (long) read_register (GBR_REGNUM),
2781 (long) read_register (VBR_REGNUM));
2782
2783 printf_filtered (" SSR=%08lx SPC=%08lx",
f81353e4
EZ
2784 (long) read_register (tdep->SSR_REGNUM),
2785 (long) read_register (tdep->SPC_REGNUM));
cc17453a
EZ
2786
2787 printf_filtered (" DSR=%08lx",
f81353e4 2788 (long) read_register (tdep->DSR_REGNUM));
cc17453a
EZ
2789
2790 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2791 (long) read_register (0),
2792 (long) read_register (1),
2793 (long) read_register (2),
2794 (long) read_register (3),
2795 (long) read_register (4),
2796 (long) read_register (5),
2797 (long) read_register (6),
2798 (long) read_register (7));
2799 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2800 (long) read_register (8),
2801 (long) read_register (9),
2802 (long) read_register (10),
2803 (long) read_register (11),
2804 (long) read_register (12),
2805 (long) read_register (13),
2806 (long) read_register (14),
2807 (long) read_register (15));
2808
2809 printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
f81353e4
EZ
2810 (long) read_register (tdep->A0G_REGNUM) & 0xff,
2811 (long) read_register (tdep->A0_REGNUM),
2812 (long) read_register (tdep->M0_REGNUM),
2813 (long) read_register (tdep->X0_REGNUM),
2814 (long) read_register (tdep->Y0_REGNUM),
2815 (long) read_register (tdep->RS_REGNUM),
2816 (long) read_register (tdep->MOD_REGNUM));
cc17453a 2817 printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
f81353e4
EZ
2818 (long) read_register (tdep->A1G_REGNUM) & 0xff,
2819 (long) read_register (tdep->A1_REGNUM),
2820 (long) read_register (tdep->M1_REGNUM),
2821 (long) read_register (tdep->X1_REGNUM),
2822 (long) read_register (tdep->Y1_REGNUM),
2823 (long) read_register (tdep->RE_REGNUM));
c906108c
SS
2824}
2825
cc17453a 2826static void
fba45db2 2827sh4_show_regs (void)
cc17453a 2828{
f81353e4
EZ
2829 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2830
2831 int pr = read_register (tdep->FPSCR_REGNUM) & 0x80000;
cc17453a
EZ
2832 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2833 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2834 (long) read_register (tdep->SR_REGNUM),
2835 (long) read_register (tdep->PR_REGNUM),
cc17453a
EZ
2836 (long) read_register (MACH_REGNUM),
2837 (long) read_register (MACL_REGNUM));
2838
2839 printf_filtered ("GBR=%08lx VBR=%08lx",
2840 (long) read_register (GBR_REGNUM),
2841 (long) read_register (VBR_REGNUM));
2842 printf_filtered (" SSR=%08lx SPC=%08lx",
f81353e4
EZ
2843 (long) read_register (tdep->SSR_REGNUM),
2844 (long) read_register (tdep->SPC_REGNUM));
cc17453a 2845 printf_filtered (" FPUL=%08lx FPSCR=%08lx",
f81353e4
EZ
2846 (long) read_register (tdep->FPUL_REGNUM),
2847 (long) read_register (tdep->FPSCR_REGNUM));
cc17453a
EZ
2848
2849 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2850 (long) read_register (0),
2851 (long) read_register (1),
2852 (long) read_register (2),
2853 (long) read_register (3),
2854 (long) read_register (4),
2855 (long) read_register (5),
2856 (long) read_register (6),
2857 (long) read_register (7));
2858 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2859 (long) read_register (8),
2860 (long) read_register (9),
2861 (long) read_register (10),
2862 (long) read_register (11),
2863 (long) read_register (12),
2864 (long) read_register (13),
2865 (long) read_register (14),
2866 (long) read_register (15));
2867
2868 printf_filtered ((pr
2869 ? "DR0-DR6 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2870 : "FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2871 (long) read_register (FP0_REGNUM + 0),
2872 (long) read_register (FP0_REGNUM + 1),
2873 (long) read_register (FP0_REGNUM + 2),
2874 (long) read_register (FP0_REGNUM + 3),
2875 (long) read_register (FP0_REGNUM + 4),
2876 (long) read_register (FP0_REGNUM + 5),
2877 (long) read_register (FP0_REGNUM + 6),
2878 (long) read_register (FP0_REGNUM + 7));
2879 printf_filtered ((pr
2880 ? "DR8-DR14 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2881 : "FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2882 (long) read_register (FP0_REGNUM + 8),
2883 (long) read_register (FP0_REGNUM + 9),
2884 (long) read_register (FP0_REGNUM + 10),
2885 (long) read_register (FP0_REGNUM + 11),
2886 (long) read_register (FP0_REGNUM + 12),
2887 (long) read_register (FP0_REGNUM + 13),
2888 (long) read_register (FP0_REGNUM + 14),
2889 (long) read_register (FP0_REGNUM + 15));
2890}
2891
2892static void
fba45db2 2893sh_dsp_show_regs (void)
cc17453a 2894{
f81353e4
EZ
2895 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2896
cc17453a
EZ
2897 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2898 paddr (read_register (PC_REGNUM)),
f81353e4
EZ
2899 (long) read_register (tdep->SR_REGNUM),
2900 (long) read_register (tdep->PR_REGNUM),
cc17453a
EZ
2901 (long) read_register (MACH_REGNUM),
2902 (long) read_register (MACL_REGNUM));
2903
2904 printf_filtered ("GBR=%08lx VBR=%08lx",
2905 (long) read_register (GBR_REGNUM),
2906 (long) read_register (VBR_REGNUM));
2907
2908 printf_filtered (" DSR=%08lx",
f81353e4 2909 (long) read_register (tdep->DSR_REGNUM));
cc17453a
EZ
2910
2911 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2912 (long) read_register (0),
2913 (long) read_register (1),
2914 (long) read_register (2),
2915 (long) read_register (3),
2916 (long) read_register (4),
2917 (long) read_register (5),
2918 (long) read_register (6),
2919 (long) read_register (7));
2920 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2921 (long) read_register (8),
2922 (long) read_register (9),
2923 (long) read_register (10),
2924 (long) read_register (11),
2925 (long) read_register (12),
2926 (long) read_register (13),
2927 (long) read_register (14),
2928 (long) read_register (15));
2929
2930 printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
f81353e4
EZ
2931 (long) read_register (tdep->A0G_REGNUM) & 0xff,
2932 (long) read_register (tdep->A0_REGNUM),
2933 (long) read_register (tdep->M0_REGNUM),
2934 (long) read_register (tdep->X0_REGNUM),
2935 (long) read_register (tdep->Y0_REGNUM),
2936 (long) read_register (tdep->RS_REGNUM),
2937 (long) read_register (tdep->MOD_REGNUM));
cc17453a 2938 printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
f81353e4
EZ
2939 (long) read_register (tdep->A1G_REGNUM) & 0xff,
2940 (long) read_register (tdep->A1_REGNUM),
2941 (long) read_register (tdep->M1_REGNUM),
2942 (long) read_register (tdep->X1_REGNUM),
2943 (long) read_register (tdep->Y1_REGNUM),
2944 (long) read_register (tdep->RE_REGNUM));
cc17453a
EZ
2945}
2946
283150cd
EZ
2947static void
2948sh64_show_media_regs (void)
2949{
2950 int i;
2951 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2952
2953 printf_filtered ("PC=%s SR=%016llx \n",
2954 paddr (read_register (PC_REGNUM)),
2955 (long long) read_register (tdep->SR_REGNUM));
2956
2957 printf_filtered ("SSR=%016llx SPC=%016llx \n",
2958 (long long) read_register (tdep->SSR_REGNUM),
2959 (long long) read_register (tdep->SPC_REGNUM));
2960 printf_filtered ("FPSCR=%016lx\n ",
2961 (long) read_register (tdep->FPSCR_REGNUM));
2962
2963 for (i = 0; i < 64; i = i + 4)
2964 printf_filtered ("\nR%d-R%d %016llx %016llx %016llx %016llx\n",
2965 i, i + 3,
2966 (long long) read_register (i + 0),
2967 (long long) read_register (i + 1),
2968 (long long) read_register (i + 2),
2969 (long long) read_register (i + 3));
2970
2971 printf_filtered ("\n");
2972
2973 for (i = 0; i < 64; i = i + 8)
2974 printf_filtered ("FR%d-FR%d %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2975 i, i + 7,
2976 (long) read_register (FP0_REGNUM + i + 0),
2977 (long) read_register (FP0_REGNUM + i + 1),
2978 (long) read_register (FP0_REGNUM + i + 2),
2979 (long) read_register (FP0_REGNUM + i + 3),
2980 (long) read_register (FP0_REGNUM + i + 4),
2981 (long) read_register (FP0_REGNUM + i + 5),
2982 (long) read_register (FP0_REGNUM + i + 6),
2983 (long) read_register (FP0_REGNUM + i + 7));
2984}
2985
2986static void
2987sh64_show_compact_regs (void)
2988{
2989 int i;
2990 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2991
2992 printf_filtered ("PC=%s \n",
2993 paddr (read_register (tdep->PC_C_REGNUM)));
2994
2995 printf_filtered ("GBR=%08lx MACH=%08lx MACL=%08lx PR=%08lx T=%08lx\n",
2996 (long) read_register (tdep->GBR_C_REGNUM),
2997 (long) read_register (tdep->MACH_C_REGNUM),
2998 (long) read_register (tdep->MACL_C_REGNUM),
2999 (long) read_register (tdep->PR_C_REGNUM),
3000 (long) read_register (tdep->T_C_REGNUM));
3001 printf_filtered ("FPSCR=%08lx FPUL=%08lx\n",
3002 (long) read_register (tdep->FPSCR_REGNUM),
3003 (long) read_register (tdep->FPUL_REGNUM));
3004
3005 for (i = 0; i < 16; i = i + 4)
3006 printf_filtered ("\nR%d-R%d %08lx %08lx %08lx %08lx\n",
3007 i, i + 3,
3008 (long) read_register (i + 0),
3009 (long) read_register (i + 1),
3010 (long) read_register (i + 2),
3011 (long) read_register (i + 3));
3012
3013 printf_filtered ("\n");
3014
3015 for (i = 0; i < 16; i = i + 8)
3016 printf_filtered ("FR%d-FR%d %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
3017 i, i + 7,
3018 (long) read_register (FP0_REGNUM + i + 0),
3019 (long) read_register (FP0_REGNUM + i + 1),
3020 (long) read_register (FP0_REGNUM + i + 2),
3021 (long) read_register (FP0_REGNUM + i + 3),
3022 (long) read_register (FP0_REGNUM + i + 4),
3023 (long) read_register (FP0_REGNUM + i + 5),
3024 (long) read_register (FP0_REGNUM + i + 6),
3025 (long) read_register (FP0_REGNUM + i + 7));
3026}
3027
3028/*FIXME!!! This only shows the registers for shmedia, excluding the
3029 pseudo registers. */
3030static void
3031sh64_show_regs (void)
3032{
50abf9e5 3033 if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
283150cd
EZ
3034 sh64_show_media_regs ();
3035 else
3036 sh64_show_compact_regs ();
3037}
3038
a78f21af
AC
3039static void
3040sh_show_regs_command (char *args, int from_tty)
53116e27
EZ
3041{
3042 if (sh_show_regs)
3043 (*sh_show_regs)();
3044}
3045
cc17453a
EZ
3046/* Index within `registers' of the first byte of the space for
3047 register N. */
3048static int
fba45db2 3049sh_default_register_byte (int reg_nr)
8db62801 3050{
cc17453a
EZ
3051 return (reg_nr * 4);
3052}
3053
53116e27 3054static int
fba45db2 3055sh_sh4_register_byte (int reg_nr)
53116e27 3056{
f81353e4
EZ
3057 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3058
3059 if (reg_nr >= tdep->DR0_REGNUM
3060 && reg_nr <= tdep->DR_LAST_REGNUM)
53116e27 3061 return (dr_reg_base_num (reg_nr) * 4);
f81353e4
EZ
3062 else if (reg_nr >= tdep->FV0_REGNUM
3063 && reg_nr <= tdep->FV_LAST_REGNUM)
53116e27
EZ
3064 return (fv_reg_base_num (reg_nr) * 4);
3065 else
3066 return (reg_nr * 4);
3067}
3068
283150cd
EZ
3069/* *INDENT-OFF* */
3070/*
3071 SH MEDIA MODE (ISA 32)
3072 general registers (64-bit) 0-63
30730 r0, r1, r2, r3, r4, r5, r6, r7,
307464 r8, r9, r10, r11, r12, r13, r14, r15,
3075128 r16, r17, r18, r19, r20, r21, r22, r23,
3076192 r24, r25, r26, r27, r28, r29, r30, r31,
3077256 r32, r33, r34, r35, r36, r37, r38, r39,
3078320 r40, r41, r42, r43, r44, r45, r46, r47,
3079384 r48, r49, r50, r51, r52, r53, r54, r55,
3080448 r56, r57, r58, r59, r60, r61, r62, r63,
3081
3082 pc (64-bit) 64
3083512 pc,
3084
3085 status reg., saved status reg., saved pc reg. (64-bit) 65-67
3086520 sr, ssr, spc,
3087
3088 target registers (64-bit) 68-75
3089544 tr0, tr1, tr2, tr3, tr4, tr5, tr6, tr7,
3090
3091 floating point state control register (32-bit) 76
3092608 fpscr,
3093
3094 single precision floating point registers (32-bit) 77-140
3095612 fr0, fr1, fr2, fr3, fr4, fr5, fr6, fr7,
3096644 fr8, fr9, fr10, fr11, fr12, fr13, fr14, fr15,
3097676 fr16, fr17, fr18, fr19, fr20, fr21, fr22, fr23,
3098708 fr24, fr25, fr26, fr27, fr28, fr29, fr30, fr31,
3099740 fr32, fr33, fr34, fr35, fr36, fr37, fr38, fr39,
3100772 fr40, fr41, fr42, fr43, fr44, fr45, fr46, fr47,
3101804 fr48, fr49, fr50, fr51, fr52, fr53, fr54, fr55,
3102836 fr56, fr57, fr58, fr59, fr60, fr61, fr62, fr63,
3103
3104TOTAL SPACE FOR REGISTERS: 868 bytes
3105
3106From here on they are all pseudo registers: no memory allocated.
3107REGISTER_BYTE returns the register byte for the base register.
3108
3109 double precision registers (pseudo) 141-172
3110 dr0, dr2, dr4, dr6, dr8, dr10, dr12, dr14,
3111 dr16, dr18, dr20, dr22, dr24, dr26, dr28, dr30,
3112 dr32, dr34, dr36, dr38, dr40, dr42, dr44, dr46,
3113 dr48, dr50, dr52, dr54, dr56, dr58, dr60, dr62,
3114
3115 floating point pairs (pseudo) 173-204
3116 fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14,
3117 fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30,
3118 fp32, fp34, fp36, fp38, fp40, fp42, fp44, fp46,
3119 fp48, fp50, fp52, fp54, fp56, fp58, fp60, fp62,
3120
3121 floating point vectors (4 floating point regs) (pseudo) 205-220
3122 fv0, fv4, fv8, fv12, fv16, fv20, fv24, fv28,
3123 fv32, fv36, fv40, fv44, fv48, fv52, fv56, fv60,
3124
3125 SH COMPACT MODE (ISA 16) (all pseudo) 221-272
3126 r0_c, r1_c, r2_c, r3_c, r4_c, r5_c, r6_c, r7_c,
3127 r8_c, r9_c, r10_c, r11_c, r12_c, r13_c, r14_c, r15_c,
3128 pc_c,
3129 gbr_c, mach_c, macl_c, pr_c, t_c,
3130 fpscr_c, fpul_c,
3131 fr0_c, fr1_c, fr2_c, fr3_c, fr4_c, fr5_c, fr6_c, fr7_c,
3132 fr8_c, fr9_c, fr10_c, fr11_c, fr12_c, fr13_c, fr14_c, fr15_c
3133 dr0_c, dr2_c, dr4_c, dr6_c, dr8_c, dr10_c, dr12_c, dr14_c
3134 fv0_c, fv4_c, fv8_c, fv12_c
3135*/
3136/* *INDENT-ON* */
3137static int
3138sh_sh64_register_byte (int reg_nr)
3139{
3140 int base_regnum = -1;
3141 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3142
3143 /* If it is a pseudo register, get the number of the first floating
3144 point register that is part of it. */
3145 if (reg_nr >= tdep->DR0_REGNUM
3146 && reg_nr <= tdep->DR_LAST_REGNUM)
3147 base_regnum = dr_reg_base_num (reg_nr);
3148
3149 else if (reg_nr >= tdep->FPP0_REGNUM
3150 && reg_nr <= tdep->FPP_LAST_REGNUM)
3151 base_regnum = fpp_reg_base_num (reg_nr);
3152
3153 else if (reg_nr >= tdep->FV0_REGNUM
3154 && reg_nr <= tdep->FV_LAST_REGNUM)
3155 base_regnum = fv_reg_base_num (reg_nr);
3156
3157 /* sh compact pseudo register. FPSCR is a pathological case, need to
3158 treat it as special. */
3159 else if ((reg_nr >= tdep->R0_C_REGNUM
3160 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3161 && reg_nr != tdep->FPSCR_C_REGNUM)
3162 base_regnum = sh64_compact_reg_base_num (reg_nr);
3163
3164 /* Now return the offset in bytes within the register cache. */
3165 /* sh media pseudo register, i.e. any of DR, FFP, FV registers. */
3166 if (reg_nr >= tdep->DR0_REGNUM
3167 && reg_nr <= tdep->FV_LAST_REGNUM)
3168 return (base_regnum - FP0_REGNUM + 1) * 4
3169 + (tdep->TR7_REGNUM + 1) * 8;
3170
3171 /* sh compact pseudo register: general register */
3172 if ((reg_nr >= tdep->R0_C_REGNUM
3173 && reg_nr <= tdep->R_LAST_C_REGNUM))
3174 return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3175 ? base_regnum * 8 + 4
3176 : base_regnum * 8);
3177
3178 /* sh compact pseudo register: */
3179 if (reg_nr == tdep->PC_C_REGNUM
3180 || reg_nr == tdep->GBR_C_REGNUM
3181 || reg_nr == tdep->MACL_C_REGNUM
3182 || reg_nr == tdep->PR_C_REGNUM)
3183 return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3184 ? base_regnum * 8 + 4
3185 : base_regnum * 8);
3186
3187 if (reg_nr == tdep->MACH_C_REGNUM)
3188 return base_regnum * 8;
3189
3190 if (reg_nr == tdep->T_C_REGNUM)
3191 return base_regnum * 8; /* FIXME??? how do we get bit 0? Do we have to? */
3192
3193 /* sh compact pseudo register: floating point register */
3194 else if (reg_nr >=tdep->FP0_C_REGNUM
3195 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3196 return (base_regnum - FP0_REGNUM) * 4
3197 + (tdep->TR7_REGNUM + 1) * 8 + 4;
3198
3199 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3200 /* This is complicated, for now return the beginning of the
3201 architectural FPSCR register. */
3202 return (tdep->TR7_REGNUM + 1) * 8;
3203
3204 else if (reg_nr == tdep->FPUL_C_REGNUM)
3205 return ((base_regnum - FP0_REGNUM) * 4 +
3206 (tdep->TR7_REGNUM + 1) * 8 + 4);
3207
3208 /* It is not a pseudo register. */
3209 /* It is a 64 bit register. */
3210 else if (reg_nr <= tdep->TR7_REGNUM)
3211 return reg_nr * 8;
3212
3213 /* It is a 32 bit register. */
3214 else
3215 if (reg_nr == tdep->FPSCR_REGNUM)
3216 return (tdep->FPSCR_REGNUM * 8);
3217
3218 /* It is floating point 32-bit register */
3219 else
3220 return ((tdep->TR7_REGNUM + 1) * 8
3221 + (reg_nr - FP0_REGNUM + 1) * 4);
3222}
3223
cc17453a
EZ
3224/* Number of bytes of storage in the actual machine representation for
3225 register REG_NR. */
3226static int
fba45db2 3227sh_default_register_raw_size (int reg_nr)
cc17453a
EZ
3228{
3229 return 4;
3230}
3231
53116e27 3232static int
fba45db2 3233sh_sh4_register_raw_size (int reg_nr)
53116e27 3234{
f81353e4
EZ
3235 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3236
3237 if (reg_nr >= tdep->DR0_REGNUM
3238 && reg_nr <= tdep->DR_LAST_REGNUM)
53116e27 3239 return 8;
f81353e4
EZ
3240 else if (reg_nr >= tdep->FV0_REGNUM
3241 && reg_nr <= tdep->FV_LAST_REGNUM)
53116e27
EZ
3242 return 16;
3243 else
3244 return 4;
3245}
3246
283150cd
EZ
3247static int
3248sh_sh64_register_raw_size (int reg_nr)
3249{
3250 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3251
3252 if ((reg_nr >= tdep->DR0_REGNUM
3253 && reg_nr <= tdep->DR_LAST_REGNUM)
3254 || (reg_nr >= tdep->FPP0_REGNUM
3255 && reg_nr <= tdep->FPP_LAST_REGNUM)
3256 || (reg_nr >= tdep->DR0_C_REGNUM
3257 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3258 || (reg_nr <= tdep->TR7_REGNUM))
3259 return 8;
3260
3261 else if ((reg_nr >= tdep->FV0_REGNUM
3262 && reg_nr <= tdep->FV_LAST_REGNUM)
3263 || (reg_nr >= tdep->FV0_C_REGNUM
3264 && reg_nr <= tdep->FV_LAST_C_REGNUM))
3265 return 16;
3266
3267 else /* this covers also the 32-bit SH compact registers. */
3268 return 4;
3269}
3270
cc17453a
EZ
3271/* Number of bytes of storage in the program's representation
3272 for register N. */
3273static int
fba45db2 3274sh_register_virtual_size (int reg_nr)
cc17453a
EZ
3275{
3276 return 4;
3277}
3278
283150cd
EZ
3279/* ??????? FIXME */
3280static int
3281sh_sh64_register_virtual_size (int reg_nr)
3282{
3283 if (reg_nr >= FP0_REGNUM
3284 && reg_nr <= gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM)
3285 return 4;
3286 else
3287 return 8;
3288}
3289
cc17453a
EZ
3290/* Return the GDB type object for the "standard" data type
3291 of data in register N. */
cc17453a 3292static struct type *
fba45db2 3293sh_sh3e_register_virtual_type (int reg_nr)
cc17453a 3294{
f81353e4
EZ
3295 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3296
cc17453a 3297 if ((reg_nr >= FP0_REGNUM
f81353e4
EZ
3298 && (reg_nr <= tdep->FP_LAST_REGNUM))
3299 || (reg_nr == tdep->FPUL_REGNUM))
cc17453a 3300 return builtin_type_float;
8db62801 3301 else
cc17453a
EZ
3302 return builtin_type_int;
3303}
3304
7f4dbe94
EZ
3305static struct type *
3306sh_sh4_build_float_register_type (int high)
3307{
3308 struct type *temp;
3309
3310 temp = create_range_type (NULL, builtin_type_int, 0, high);
3311 return create_array_type (NULL, builtin_type_float, temp);
3312}
3313
53116e27 3314static struct type *
fba45db2 3315sh_sh4_register_virtual_type (int reg_nr)
53116e27 3316{
f81353e4
EZ
3317 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3318
53116e27 3319 if ((reg_nr >= FP0_REGNUM
f81353e4
EZ
3320 && (reg_nr <= tdep->FP_LAST_REGNUM))
3321 || (reg_nr == tdep->FPUL_REGNUM))
53116e27 3322 return builtin_type_float;
f81353e4
EZ
3323 else if (reg_nr >= tdep->DR0_REGNUM
3324 && reg_nr <= tdep->DR_LAST_REGNUM)
53116e27 3325 return builtin_type_double;
f81353e4
EZ
3326 else if (reg_nr >= tdep->FV0_REGNUM
3327 && reg_nr <= tdep->FV_LAST_REGNUM)
53116e27
EZ
3328 return sh_sh4_build_float_register_type (3);
3329 else
3330 return builtin_type_int;
3331}
3332
283150cd
EZ
3333static struct type *
3334sh_sh64_register_virtual_type (int reg_nr)
3335{
3336 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3337
3338 if ((reg_nr >= FP0_REGNUM
3339 && reg_nr <= tdep->FP_LAST_REGNUM)
3340 || (reg_nr >= tdep->FP0_C_REGNUM
3341 && reg_nr <= tdep->FP_LAST_C_REGNUM))
3342 return builtin_type_float;
3343 else if ((reg_nr >= tdep->DR0_REGNUM
3344 && reg_nr <= tdep->DR_LAST_REGNUM)
3345 || (reg_nr >= tdep->DR0_C_REGNUM
3346 && reg_nr <= tdep->DR_LAST_C_REGNUM))
3347 return builtin_type_double;
3348 else if (reg_nr >= tdep->FPP0_REGNUM
3349 && reg_nr <= tdep->FPP_LAST_REGNUM)
3350 return sh_sh4_build_float_register_type (1);
3351 else if ((reg_nr >= tdep->FV0_REGNUM
3352 && reg_nr <= tdep->FV_LAST_REGNUM)
3353 ||(reg_nr >= tdep->FV0_C_REGNUM
3354 && reg_nr <= tdep->FV_LAST_C_REGNUM))
3355 return sh_sh4_build_float_register_type (3);
3356 else if (reg_nr == tdep->FPSCR_REGNUM)
3357 return builtin_type_int;
3358 else if (reg_nr >= tdep->R0_C_REGNUM
3359 && reg_nr < tdep->FP0_C_REGNUM)
3360 return builtin_type_int;
3361 else
3362 return builtin_type_long_long;
3363}
3364
cc17453a 3365static struct type *
fba45db2 3366sh_default_register_virtual_type (int reg_nr)
cc17453a
EZ
3367{
3368 return builtin_type_int;
3369}
3370
fb409745
EZ
3371/* On the sh4, the DRi pseudo registers are problematic if the target
3372 is little endian. When the user writes one of those registers, for
3373 instance with 'ser var $dr0=1', we want the double to be stored
3374 like this:
3375 fr0 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f
3376 fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3377
3378 This corresponds to little endian byte order & big endian word
3379 order. However if we let gdb write the register w/o conversion, it
3380 will write fr0 and fr1 this way:
3381 fr0 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3382 fr1 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f
3383 because it will consider fr0 and fr1 as a single LE stretch of memory.
3384
3385 To achieve what we want we must force gdb to store things in
3386 floatformat_ieee_double_littlebyte_bigword (which is defined in
3387 include/floatformat.h and libiberty/floatformat.c.
3388
3389 In case the target is big endian, there is no problem, the
3390 raw bytes will look like:
3391 fr0 = 0x3f 0xf0 0x00 0x00 0x00 0x00 0x00
3392 fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3393
3394 The other pseudo registers (the FVs) also don't pose a problem
3395 because they are stored as 4 individual FP elements. */
3396
7bd872fe 3397static void
fb409745
EZ
3398sh_sh4_register_convert_to_virtual (int regnum, struct type *type,
3399 char *from, char *to)
3400{
f81353e4
EZ
3401 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3402
3403 if (regnum >= tdep->DR0_REGNUM
3404 && regnum <= tdep->DR_LAST_REGNUM)
fb409745
EZ
3405 {
3406 DOUBLEST val;
3407 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
f1908289 3408 deprecated_store_floating (to, TYPE_LENGTH (type), val);
fb409745
EZ
3409 }
3410 else
3bbfbb92 3411 error ("sh_register_convert_to_virtual called with non DR register number");
fb409745
EZ
3412}
3413
a78f21af 3414static void
283150cd
EZ
3415sh_sh64_register_convert_to_virtual (int regnum, struct type *type,
3416 char *from, char *to)
3417{
3418 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3419
3420 if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3421 {
3422 /* It is a no-op. */
3423 memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3424 return;
3425 }
3426
3427 if ((regnum >= tdep->DR0_REGNUM
3428 && regnum <= tdep->DR_LAST_REGNUM)
3429 || (regnum >= tdep->DR0_C_REGNUM
3430 && regnum <= tdep->DR_LAST_C_REGNUM))
3431 {
3432 DOUBLEST val;
3433 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
f1908289 3434 deprecated_store_floating(to, TYPE_LENGTH(type), val);
283150cd
EZ
3435 }
3436 else
3437 error("sh_register_convert_to_virtual called with non DR register number");
3438}
3439
3440static void
3441sh_sh4_register_convert_to_raw (struct type *type, int regnum,
d8124050 3442 const void *from, void *to)
283150cd
EZ
3443{
3444 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3445
3446 if (regnum >= tdep->DR0_REGNUM
3447 && regnum <= tdep->DR_LAST_REGNUM)
3448 {
f1908289 3449 DOUBLEST val = deprecated_extract_floating (from, TYPE_LENGTH(type));
283150cd
EZ
3450 floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3451 }
3452 else
3453 error("sh_register_convert_to_raw called with non DR register number");
3454}
3455
a78f21af 3456static void
283150cd 3457sh_sh64_register_convert_to_raw (struct type *type, int regnum,
d8124050 3458 const void *from, void *to)
fb409745 3459{
f81353e4
EZ
3460 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3461
283150cd
EZ
3462 if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3463 {
3464 /* It is a no-op. */
3465 memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3466 return;
3467 }
3468
3469 if ((regnum >= tdep->DR0_REGNUM
3470 && regnum <= tdep->DR_LAST_REGNUM)
3471 || (regnum >= tdep->DR0_C_REGNUM
3472 && regnum <= tdep->DR_LAST_C_REGNUM))
fb409745 3473 {
f1908289 3474 DOUBLEST val = deprecated_extract_floating (from, TYPE_LENGTH(type));
fb409745
EZ
3475 floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3476 }
3477 else
3478 error("sh_register_convert_to_raw called with non DR register number");
3479}
3480
a78f21af 3481static void
d8124050
AC
3482sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3483 int reg_nr, void *buffer)
53116e27
EZ
3484{
3485 int base_regnum, portion;
d9d9c31f 3486 char temp_buffer[MAX_REGISTER_SIZE];
d8124050 3487 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
53116e27 3488
7bd872fe
EZ
3489 if (reg_nr >= tdep->DR0_REGNUM
3490 && reg_nr <= tdep->DR_LAST_REGNUM)
3491 {
3492 base_regnum = dr_reg_base_num (reg_nr);
3493
3494 /* Build the value in the provided buffer. */
3495 /* Read the real regs for which this one is an alias. */
3496 for (portion = 0; portion < 2; portion++)
d8124050 3497 regcache_raw_read (regcache, base_regnum + portion,
0818c12a
AC
3498 (temp_buffer
3499 + REGISTER_RAW_SIZE (base_regnum) * portion));
7bd872fe
EZ
3500 /* We must pay attention to the endiannes. */
3501 sh_sh4_register_convert_to_virtual (reg_nr,
3502 REGISTER_VIRTUAL_TYPE (reg_nr),
3503 temp_buffer, buffer);
3504 }
3505 else if (reg_nr >= tdep->FV0_REGNUM
3506 && reg_nr <= tdep->FV_LAST_REGNUM)
53116e27 3507 {
7bd872fe
EZ
3508 base_regnum = fv_reg_base_num (reg_nr);
3509
3510 /* Read the real regs for which this one is an alias. */
3511 for (portion = 0; portion < 4; portion++)
d8124050
AC
3512 regcache_raw_read (regcache, base_regnum + portion,
3513 ((char *) buffer
3514 + REGISTER_RAW_SIZE (base_regnum) * portion));
53116e27
EZ
3515 }
3516}
3517
7bd872fe 3518static void
d8124050
AC
3519sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3520 int reg_nr, void *buffer)
283150cd
EZ
3521{
3522 int base_regnum;
3523 int portion;
3524 int offset = 0;
d9d9c31f 3525 char temp_buffer[MAX_REGISTER_SIZE];
d8124050 3526 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
283150cd
EZ
3527
3528 if (reg_nr >= tdep->DR0_REGNUM
3529 && reg_nr <= tdep->DR_LAST_REGNUM)
3530 {
3531 base_regnum = dr_reg_base_num (reg_nr);
3532
3533 /* Build the value in the provided buffer. */
3534 /* DR regs are double precision registers obtained by
3535 concatenating 2 single precision floating point registers. */
3536 for (portion = 0; portion < 2; portion++)
d8124050 3537 regcache_raw_read (regcache, base_regnum + portion,
0818c12a
AC
3538 (temp_buffer
3539 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3540
3541 /* We must pay attention to the endiannes. */
3542 sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3543 temp_buffer, buffer);
3544
3545 }
3546
3547 else if (reg_nr >= tdep->FPP0_REGNUM
3548 && reg_nr <= tdep->FPP_LAST_REGNUM)
3549 {
3550 base_regnum = fpp_reg_base_num (reg_nr);
3551
3552 /* Build the value in the provided buffer. */
3553 /* FPP regs are pairs of single precision registers obtained by
3554 concatenating 2 single precision floating point registers. */
3555 for (portion = 0; portion < 2; portion++)
d8124050
AC
3556 regcache_raw_read (regcache, base_regnum + portion,
3557 ((char *) buffer
0818c12a 3558 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3559 }
3560
3561 else if (reg_nr >= tdep->FV0_REGNUM
3562 && reg_nr <= tdep->FV_LAST_REGNUM)
3563 {
3564 base_regnum = fv_reg_base_num (reg_nr);
3565
3566 /* Build the value in the provided buffer. */
3567 /* FV regs are vectors of single precision registers obtained by
3568 concatenating 4 single precision floating point registers. */
3569 for (portion = 0; portion < 4; portion++)
d8124050
AC
3570 regcache_raw_read (regcache, base_regnum + portion,
3571 ((char *) buffer
0818c12a 3572 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3573 }
3574
3575 /* sh compact pseudo registers. 1-to-1 with a shmedia register */
3576 else if (reg_nr >= tdep->R0_C_REGNUM
3577 && reg_nr <= tdep->T_C_REGNUM)
3578 {
3579 base_regnum = sh64_compact_reg_base_num (reg_nr);
3580
3581 /* Build the value in the provided buffer. */
d8124050 3582 regcache_raw_read (regcache, base_regnum, temp_buffer);
283150cd
EZ
3583 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3584 offset = 4;
3585 memcpy (buffer, temp_buffer + offset, 4); /* get LOWER 32 bits only????*/
3586 }
3587
3588 else if (reg_nr >= tdep->FP0_C_REGNUM
3589 && reg_nr <= tdep->FP_LAST_C_REGNUM)
3590 {
3591 base_regnum = sh64_compact_reg_base_num (reg_nr);
3592
3593 /* Build the value in the provided buffer. */
3594 /* Floating point registers map 1-1 to the media fp regs,
3595 they have the same size and endienness. */
d8124050 3596 regcache_raw_read (regcache, base_regnum, buffer);
283150cd
EZ
3597 }
3598
3599 else if (reg_nr >= tdep->DR0_C_REGNUM
3600 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3601 {
3602 base_regnum = sh64_compact_reg_base_num (reg_nr);
3603
3604 /* DR_C regs are double precision registers obtained by
3605 concatenating 2 single precision floating point registers. */
3606 for (portion = 0; portion < 2; portion++)
d8124050 3607 regcache_raw_read (regcache, base_regnum + portion,
0818c12a
AC
3608 (temp_buffer
3609 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3610
3611 /* We must pay attention to the endiannes. */
3612 sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3613 temp_buffer, buffer);
3614 }
3615
3616 else if (reg_nr >= tdep->FV0_C_REGNUM
3617 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3618 {
3619 base_regnum = sh64_compact_reg_base_num (reg_nr);
3620
3621 /* Build the value in the provided buffer. */
3622 /* FV_C regs are vectors of single precision registers obtained by
3623 concatenating 4 single precision floating point registers. */
3624 for (portion = 0; portion < 4; portion++)
d8124050
AC
3625 regcache_raw_read (regcache, base_regnum + portion,
3626 ((char *) buffer
0818c12a 3627 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3628 }
3629
3630 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3631 {
3632 int fpscr_base_regnum;
3633 int sr_base_regnum;
3634 unsigned int fpscr_value;
3635 unsigned int sr_value;
3636 unsigned int fpscr_c_value;
3637 unsigned int fpscr_c_part1_value;
3638 unsigned int fpscr_c_part2_value;
3639
3640 fpscr_base_regnum = tdep->FPSCR_REGNUM;
3641 sr_base_regnum = tdep->SR_REGNUM;
3642
3643 /* Build the value in the provided buffer. */
3644 /* FPSCR_C is a very weird register that contains sparse bits
3645 from the FPSCR and the SR architectural registers.
3646 Specifically: */
3647 /* *INDENT-OFF* */
3648 /*
3649 FPSRC_C bit
3650 0 Bit 0 of FPSCR
3651 1 reserved
3652 2-17 Bit 2-18 of FPSCR
3653 18-20 Bits 12,13,14 of SR
3654 21-31 reserved
3655 */
3656 /* *INDENT-ON* */
3657 /* Get FPSCR into a local buffer */
d8124050 3658 regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
283150cd
EZ
3659 /* Get value as an int. */
3660 fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3661 /* Get SR into a local buffer */
d8124050 3662 regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
283150cd
EZ
3663 /* Get value as an int. */
3664 sr_value = extract_unsigned_integer (temp_buffer, 4);
3665 /* Build the new value. */
3666 fpscr_c_part1_value = fpscr_value & 0x3fffd;
3667 fpscr_c_part2_value = (sr_value & 0x7000) << 6;
3668 fpscr_c_value = fpscr_c_part1_value | fpscr_c_part2_value;
3669 /* Store that in out buffer!!! */
3670 store_unsigned_integer (buffer, 4, fpscr_c_value);
3671 /* FIXME There is surely an endianness gotcha here. */
3672 }
3673
3674 else if (reg_nr == tdep->FPUL_C_REGNUM)
3675 {
3676 base_regnum = sh64_compact_reg_base_num (reg_nr);
3677
3678 /* FPUL_C register is floating point register 32,
3679 same size, same endianness. */
d8124050 3680 regcache_raw_read (regcache, base_regnum, buffer);
283150cd
EZ
3681 }
3682}
3683
a78f21af 3684static void
d8124050
AC
3685sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3686 int reg_nr, const void *buffer)
53116e27
EZ
3687{
3688 int base_regnum, portion;
d9d9c31f 3689 char temp_buffer[MAX_REGISTER_SIZE];
d8124050 3690 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
53116e27 3691
f81353e4
EZ
3692 if (reg_nr >= tdep->DR0_REGNUM
3693 && reg_nr <= tdep->DR_LAST_REGNUM)
53116e27
EZ
3694 {
3695 base_regnum = dr_reg_base_num (reg_nr);
3696
7bd872fe
EZ
3697 /* We must pay attention to the endiannes. */
3698 sh_sh4_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3699 buffer, temp_buffer);
3700
53116e27
EZ
3701 /* Write the real regs for which this one is an alias. */
3702 for (portion = 0; portion < 2; portion++)
d8124050 3703 regcache_raw_write (regcache, base_regnum + portion,
0818c12a
AC
3704 (temp_buffer
3705 + REGISTER_RAW_SIZE (base_regnum) * portion));
53116e27 3706 }
f81353e4
EZ
3707 else if (reg_nr >= tdep->FV0_REGNUM
3708 && reg_nr <= tdep->FV_LAST_REGNUM)
53116e27
EZ
3709 {
3710 base_regnum = fv_reg_base_num (reg_nr);
3711
3712 /* Write the real regs for which this one is an alias. */
3713 for (portion = 0; portion < 4; portion++)
d8124050
AC
3714 regcache_raw_write (regcache, base_regnum + portion,
3715 ((char *) buffer
0818c12a 3716 + REGISTER_RAW_SIZE (base_regnum) * portion));
53116e27
EZ
3717 }
3718}
3719
a78f21af 3720static void
d8124050
AC
3721sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3722 int reg_nr, const void *buffer)
283150cd
EZ
3723{
3724 int base_regnum, portion;
3725 int offset;
d9d9c31f 3726 char temp_buffer[MAX_REGISTER_SIZE];
d8124050 3727 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
283150cd
EZ
3728
3729 if (reg_nr >= tdep->DR0_REGNUM
3730 && reg_nr <= tdep->DR_LAST_REGNUM)
3731 {
3732 base_regnum = dr_reg_base_num (reg_nr);
3733 /* We must pay attention to the endiannes. */
3734 sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3735 buffer, temp_buffer);
3736
3737
3738 /* Write the real regs for which this one is an alias. */
3739 for (portion = 0; portion < 2; portion++)
d8124050 3740 regcache_raw_write (regcache, base_regnum + portion,
0818c12a
AC
3741 (temp_buffer
3742 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3743 }
3744
3745 else if (reg_nr >= tdep->FPP0_REGNUM
3746 && reg_nr <= tdep->FPP_LAST_REGNUM)
3747 {
3748 base_regnum = fpp_reg_base_num (reg_nr);
3749
3750 /* Write the real regs for which this one is an alias. */
3751 for (portion = 0; portion < 2; portion++)
d8124050
AC
3752 regcache_raw_write (regcache, base_regnum + portion,
3753 ((char *) buffer
0818c12a 3754 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3755 }
3756
3757 else if (reg_nr >= tdep->FV0_REGNUM
3758 && reg_nr <= tdep->FV_LAST_REGNUM)
3759 {
3760 base_regnum = fv_reg_base_num (reg_nr);
3761
3762 /* Write the real regs for which this one is an alias. */
3763 for (portion = 0; portion < 4; portion++)
d8124050
AC
3764 regcache_raw_write (regcache, base_regnum + portion,
3765 ((char *) buffer
0818c12a 3766 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3767 }
3768
3769 /* sh compact general pseudo registers. 1-to-1 with a shmedia
3770 register but only 4 bytes of it. */
3771 else if (reg_nr >= tdep->R0_C_REGNUM
3772 && reg_nr <= tdep->T_C_REGNUM)
3773 {
3774 base_regnum = sh64_compact_reg_base_num (reg_nr);
3775 /* reg_nr is 32 bit here, and base_regnum is 64 bits. */
3776 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3777 offset = 4;
3778 else
3779 offset = 0;
3780 /* Let's read the value of the base register into a temporary
3781 buffer, so that overwriting the last four bytes with the new
3782 value of the pseudo will leave the upper 4 bytes unchanged. */
d8124050 3783 regcache_raw_read (regcache, base_regnum, temp_buffer);
283150cd
EZ
3784 /* Write as an 8 byte quantity */
3785 memcpy (temp_buffer + offset, buffer, 4);
d8124050 3786 regcache_raw_write (regcache, base_regnum, temp_buffer);
283150cd
EZ
3787 }
3788
3789 /* sh floating point compact pseudo registers. 1-to-1 with a shmedia
3790 registers. Both are 4 bytes. */
3791 else if (reg_nr >= tdep->FP0_C_REGNUM
3792 && reg_nr <= tdep->FP_LAST_C_REGNUM)
3793 {
3794 base_regnum = sh64_compact_reg_base_num (reg_nr);
d8124050 3795 regcache_raw_write (regcache, base_regnum, buffer);
283150cd
EZ
3796 }
3797
3798 else if (reg_nr >= tdep->DR0_C_REGNUM
3799 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3800 {
3801 base_regnum = sh64_compact_reg_base_num (reg_nr);
3802 for (portion = 0; portion < 2; portion++)
3803 {
3804 /* We must pay attention to the endiannes. */
3805 sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3806 buffer, temp_buffer);
3807
d8124050 3808 regcache_raw_write (regcache, base_regnum + portion,
0818c12a
AC
3809 (temp_buffer
3810 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3811 }
3812 }
3813
3814 else if (reg_nr >= tdep->FV0_C_REGNUM
3815 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3816 {
3817 base_regnum = sh64_compact_reg_base_num (reg_nr);
3818
3819 for (portion = 0; portion < 4; portion++)
3820 {
d8124050
AC
3821 regcache_raw_write (regcache, base_regnum + portion,
3822 ((char *) buffer
0818c12a 3823 + REGISTER_RAW_SIZE (base_regnum) * portion));
283150cd
EZ
3824 }
3825 }
3826
3827 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3828 {
3829 int fpscr_base_regnum;
3830 int sr_base_regnum;
3831 unsigned int fpscr_value;
3832 unsigned int sr_value;
3833 unsigned int old_fpscr_value;
3834 unsigned int old_sr_value;
3835 unsigned int fpscr_c_value;
3836 unsigned int fpscr_mask;
3837 unsigned int sr_mask;
3838
3839 fpscr_base_regnum = tdep->FPSCR_REGNUM;
3840 sr_base_regnum = tdep->SR_REGNUM;
3841
3842 /* FPSCR_C is a very weird register that contains sparse bits
3843 from the FPSCR and the SR architectural registers.
3844 Specifically: */
3845 /* *INDENT-OFF* */
3846 /*
3847 FPSRC_C bit
3848 0 Bit 0 of FPSCR
3849 1 reserved
3850 2-17 Bit 2-18 of FPSCR
3851 18-20 Bits 12,13,14 of SR
3852 21-31 reserved
3853 */
3854 /* *INDENT-ON* */
3855 /* Get value as an int. */
3856 fpscr_c_value = extract_unsigned_integer (buffer, 4);
3857
3858 /* Build the new values. */
3859 fpscr_mask = 0x0003fffd;
3860 sr_mask = 0x001c0000;
3861
3862 fpscr_value = fpscr_c_value & fpscr_mask;
3863 sr_value = (fpscr_value & sr_mask) >> 6;
3864
d8124050 3865 regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
283150cd
EZ
3866 old_fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3867 old_fpscr_value &= 0xfffc0002;
3868 fpscr_value |= old_fpscr_value;
3869 store_unsigned_integer (temp_buffer, 4, fpscr_value);
d8124050 3870 regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer);
283150cd 3871
d8124050 3872 regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
283150cd
EZ
3873 old_sr_value = extract_unsigned_integer (temp_buffer, 4);
3874 old_sr_value &= 0xffff8fff;
3875 sr_value |= old_sr_value;
3876 store_unsigned_integer (temp_buffer, 4, sr_value);
d8124050 3877 regcache_raw_write (regcache, sr_base_regnum, temp_buffer);
283150cd
EZ
3878 }
3879
3880 else if (reg_nr == tdep->FPUL_C_REGNUM)
3881 {
3882 base_regnum = sh64_compact_reg_base_num (reg_nr);
d8124050 3883 regcache_raw_write (regcache, base_regnum, buffer);
283150cd
EZ
3884 }
3885}
3886
3bbfbb92 3887/* Floating point vector of 4 float registers. */
53116e27
EZ
3888static void
3889do_fv_register_info (int fv_regnum)
3890{
3891 int first_fp_reg_num = fv_reg_base_num (fv_regnum);
3892 printf_filtered ("fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
3893 fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_REGNUM,
3894 (int) read_register (first_fp_reg_num),
3895 (int) read_register (first_fp_reg_num + 1),
3896 (int) read_register (first_fp_reg_num + 2),
3897 (int) read_register (first_fp_reg_num + 3));
3898}
3899
283150cd
EZ
3900/* Floating point vector of 4 float registers, compact mode. */
3901static void
3902do_fv_c_register_info (int fv_regnum)
3903{
3904 int first_fp_reg_num = sh64_compact_reg_base_num (fv_regnum);
3905 printf_filtered ("fv%d_c\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
3906 fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_C_REGNUM,
3907 (int) read_register (first_fp_reg_num),
3908 (int) read_register (first_fp_reg_num + 1),
3909 (int) read_register (first_fp_reg_num + 2),
3910 (int) read_register (first_fp_reg_num + 3));
3911}
3912
3913/* Pairs of single regs. The DR are instead double precision
3914 registers. */
3915static void
3916do_fpp_register_info (int fpp_regnum)
3917{
3918 int first_fp_reg_num = fpp_reg_base_num (fpp_regnum);
3919
3920 printf_filtered ("fpp%d\t0x%08x\t0x%08x\n",
3921 fpp_regnum - gdbarch_tdep (current_gdbarch)->FPP0_REGNUM,
3922 (int) read_register (first_fp_reg_num),
3923 (int) read_register (first_fp_reg_num + 1));
3924}
3925
3bbfbb92 3926/* Double precision registers. */
53116e27
EZ
3927static void
3928do_dr_register_info (int dr_regnum)
3929{
3930 int first_fp_reg_num = dr_reg_base_num (dr_regnum);
3931
3932 printf_filtered ("dr%d\t0x%08x%08x\n",
3933 dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_REGNUM,
3934 (int) read_register (first_fp_reg_num),
3935 (int) read_register (first_fp_reg_num + 1));
3936}
3937
283150cd
EZ
3938/* Double precision registers, compact mode. */
3939static void
3940do_dr_c_register_info (int dr_regnum)
3941{
3942 int first_fp_reg_num = sh64_compact_reg_base_num (dr_regnum);
3943
3944 printf_filtered ("dr%d_c\t0x%08x%08x\n",
3945 dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_C_REGNUM,
3946 (int) read_register (first_fp_reg_num),
3947 (int) read_register (first_fp_reg_num +1));
3948}
3949
3950/* General register in compact mode. */
3951static void
3952do_r_c_register_info (int r_c_regnum)
3953{
3954 int regnum = sh64_compact_reg_base_num (r_c_regnum);
3955
3956 printf_filtered ("r%d_c\t0x%08x\n",
3957 r_c_regnum - gdbarch_tdep (current_gdbarch)->R0_C_REGNUM,
3958 /*FIXME!!!*/ (int) read_register (regnum));
3959}
3960
3961/* FIXME:!! THIS SHOULD TAKE CARE OF GETTING THE RIGHT PORTION OF THE
3962 shmedia REGISTERS. */
3963/* Control registers, compact mode. */
3964static void
3965do_cr_c_register_info (int cr_c_regnum)
3966{
3967 switch (cr_c_regnum)
3968 {
3969 case 237: printf_filtered ("pc_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3970 break;
3971 case 238: printf_filtered ("gbr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3972 break;
3973 case 239: printf_filtered ("mach_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3974 break;
3975 case 240: printf_filtered ("macl_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3976 break;
3977 case 241: printf_filtered ("pr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3978 break;
3979 case 242: printf_filtered ("t_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3980 break;
3981 case 243: printf_filtered ("fpscr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3982 break;
3983 case 244: printf_filtered ("fpul_c\t0x%08x\n", (int)read_register (cr_c_regnum));
3984 break;
3985 }
3986}
3987
53116e27
EZ
3988static void
3989sh_do_pseudo_register (int regnum)
3990{
f81353e4
EZ
3991 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3992
53116e27 3993 if (regnum < NUM_REGS || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
8e65ff28
AC
3994 internal_error (__FILE__, __LINE__,
3995 "Invalid pseudo register number %d\n", regnum);
f81353e4
EZ
3996 else if (regnum >= tdep->DR0_REGNUM
3997 && regnum < tdep->DR_LAST_REGNUM)
53116e27 3998 do_dr_register_info (regnum);
f81353e4
EZ
3999 else if (regnum >= tdep->FV0_REGNUM
4000 && regnum <= tdep->FV_LAST_REGNUM)
53116e27
EZ
4001 do_fv_register_info (regnum);
4002}
4003
53116e27
EZ
4004static void
4005sh_do_fp_register (int regnum)
4006{ /* do values for FP (float) regs */
4007 char *raw_buffer;
4008 double flt; /* double extracted from raw hex data */
4009 int inv;
4010 int j;
4011
4012 /* Allocate space for the float. */
4013 raw_buffer = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
4014
4015 /* Get the data in raw format. */
6e7f8b9c 4016 if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
53116e27
EZ
4017 error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
4018
4019 /* Get the register as a number */
4020 flt = unpack_double (builtin_type_float, raw_buffer, &inv);
4021
4022 /* Print the name and some spaces. */
4023 fputs_filtered (REGISTER_NAME (regnum), gdb_stdout);
4024 print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), gdb_stdout);
4025
4026 /* Print the value. */
93d56215
AC
4027 if (inv)
4028 printf_filtered ("<invalid float>");
4029 else
4030 printf_filtered ("%-10.9g", flt);
53116e27
EZ
4031
4032 /* Print the fp register as hex. */
4033 printf_filtered ("\t(raw 0x");
4034 for (j = 0; j < REGISTER_RAW_SIZE (regnum); j++)
4035 {
d7449b42 4036 register int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
53116e27
EZ
4037 : REGISTER_RAW_SIZE (regnum) - 1 - j;
4038 printf_filtered ("%02x", (unsigned char) raw_buffer[idx]);
4039 }
4040 printf_filtered (")");
4041 printf_filtered ("\n");
4042}
4043
283150cd
EZ
4044static void
4045sh64_do_pseudo_register (int regnum)
4046{
4047 /* All the sh64-compact mode registers are pseudo registers. */
4048 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4049
4050 if (regnum < NUM_REGS
4051 || regnum >= NUM_REGS + NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT)
4052 internal_error (__FILE__, __LINE__,
4053 "Invalid pseudo register number %d\n", regnum);
4054
4055 else if ((regnum >= tdep->DR0_REGNUM
4056 && regnum <= tdep->DR_LAST_REGNUM))
4057 do_dr_register_info (regnum);
4058
4059 else if ((regnum >= tdep->DR0_C_REGNUM
4060 && regnum <= tdep->DR_LAST_C_REGNUM))
4061 do_dr_c_register_info (regnum);
4062
4063 else if ((regnum >= tdep->FV0_REGNUM
4064 && regnum <= tdep->FV_LAST_REGNUM))
4065 do_fv_register_info (regnum);
4066
4067 else if ((regnum >= tdep->FV0_C_REGNUM
4068 && regnum <= tdep->FV_LAST_C_REGNUM))
4069 do_fv_c_register_info (regnum);
4070
4071 else if (regnum >= tdep->FPP0_REGNUM
4072 && regnum <= tdep->FPP_LAST_REGNUM)
4073 do_fpp_register_info (regnum);
4074
4075 else if (regnum >= tdep->R0_C_REGNUM
4076 && regnum <= tdep->R_LAST_C_REGNUM)
4077 do_r_c_register_info (regnum); /* FIXME, this function will not print the right format */
4078
4079 else if (regnum >= tdep->FP0_C_REGNUM
4080 && regnum <= tdep->FP_LAST_C_REGNUM)
4081 sh_do_fp_register (regnum); /* this should work also for pseudoregs */
4082
4083 else if (regnum >= tdep->PC_C_REGNUM
4084 && regnum <= tdep->FPUL_C_REGNUM)
4085 do_cr_c_register_info (regnum);
4086
4087}
4088
53116e27
EZ
4089static void
4090sh_do_register (int regnum)
4091{
123a958e 4092 char raw_buffer[MAX_REGISTER_SIZE];
53116e27
EZ
4093
4094 fputs_filtered (REGISTER_NAME (regnum), gdb_stdout);
4095 print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), gdb_stdout);
4096
4097 /* Get the data in raw format. */
6e7f8b9c 4098 if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
53116e27
EZ
4099 printf_filtered ("*value not available*\n");
4100
4101 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0, 0,
4102 gdb_stdout, 'x', 1, 0, Val_pretty_default);
4103 printf_filtered ("\t");
4104 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0, 0,
4105 gdb_stdout, 0, 1, 0, Val_pretty_default);
4106 printf_filtered ("\n");
4107}
4108
4109static void
4110sh_print_register (int regnum)
4111{
4112 if (regnum < 0 || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
8e65ff28
AC
4113 internal_error (__FILE__, __LINE__,
4114 "Invalid register number %d\n", regnum);
53116e27 4115
e30839fe 4116 else if (regnum >= 0 && regnum < NUM_REGS)
53116e27
EZ
4117 {
4118 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
4119 sh_do_fp_register (regnum); /* FP regs */
4120 else
4121 sh_do_register (regnum); /* All other regs */
4122 }
4123
4124 else if (regnum < NUM_REGS + NUM_PSEUDO_REGS)
3bbfbb92 4125 do_pseudo_register (regnum);
53116e27
EZ
4126}
4127
a78f21af 4128static void
53116e27
EZ
4129sh_do_registers_info (int regnum, int fpregs)
4130{
4131 if (regnum != -1) /* do one specified register */
4132 {
4133 if (*(REGISTER_NAME (regnum)) == '\0')
4134 error ("Not a valid register for the current processor type");
4135
4136 sh_print_register (regnum);
4137 }
4138 else
4139 /* do all (or most) registers */
4140 {
4141 regnum = 0;
4142 while (regnum < NUM_REGS)
4143 {
4144 /* If the register name is empty, it is undefined for this
4145 processor, so don't display anything. */
4146 if (REGISTER_NAME (regnum) == NULL
4147 || *(REGISTER_NAME (regnum)) == '\0')
4148 {
4149 regnum++;
4150 continue;
4151 }
4152
4153 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
4154 {
4155 if (fpregs)
4156 {
4157 /* true for "INFO ALL-REGISTERS" command */
4158 sh_do_fp_register (regnum); /* FP regs */
4159 regnum ++;
4160 }
4161 else
e6c42fda 4162 regnum += (gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM - FP0_REGNUM); /* skip FP regs */
53116e27
EZ
4163 }
4164 else
4165 {
4166 sh_do_register (regnum); /* All other regs */
4167 regnum++;
4168 }
4169 }
4170
4171 if (fpregs)
4172 while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4173 {
3bbfbb92 4174 do_pseudo_register (regnum);
53116e27
EZ
4175 regnum++;
4176 }
4177 }
4178}
4179
a78f21af 4180static void
283150cd
EZ
4181sh_compact_do_registers_info (int regnum, int fpregs)
4182{
4183 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4184 if (regnum != -1) /* do one specified register */
4185 {
4186 if (*(REGISTER_NAME (regnum)) == '\0')
4187 error ("Not a valid register for the current processor type");
4188
4189 if (regnum >= 0 && regnum < tdep->R0_C_REGNUM)
4190 error ("Not a valid register for the current processor mode.");
4191
4192 sh_print_register (regnum);
4193 }
4194 else
4195 /* do all compact registers */
4196 {
4197 regnum = tdep->R0_C_REGNUM;
4198 while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4199 {
4200 do_pseudo_register (regnum);
4201 regnum++;
4202 }
4203 }
4204}
4205
a78f21af 4206static void
283150cd
EZ
4207sh64_do_registers_info (int regnum, int fpregs)
4208{
50abf9e5 4209 if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
283150cd
EZ
4210 sh_do_registers_info (regnum, fpregs);
4211 else
4212 sh_compact_do_registers_info (regnum, fpregs);
4213}
4214
1a8629c7
MS
4215#ifdef SVR4_SHARED_LIBS
4216
4217/* Fetch (and possibly build) an appropriate link_map_offsets structure
4218 for native i386 linux targets using the struct offsets defined in
4219 link.h (but without actual reference to that file).
4220
4221 This makes it possible to access i386-linux shared libraries from
4222 a gdb that was not built on an i386-linux host (for cross debugging).
4223 */
4224
4225struct link_map_offsets *
4226sh_linux_svr4_fetch_link_map_offsets (void)
4227{
4228 static struct link_map_offsets lmo;
4229 static struct link_map_offsets *lmp = 0;
4230
4231 if (lmp == 0)
4232 {
4233 lmp = &lmo;
4234
4235 lmo.r_debug_size = 8; /* 20 not actual size but all we need */
4236
4237 lmo.r_map_offset = 4;
4238 lmo.r_map_size = 4;
4239
4240 lmo.link_map_size = 20; /* 552 not actual size but all we need */
4241
4242 lmo.l_addr_offset = 0;
4243 lmo.l_addr_size = 4;
4244
4245 lmo.l_name_offset = 4;
4246 lmo.l_name_size = 4;
4247
4248 lmo.l_next_offset = 12;
4249 lmo.l_next_size = 4;
4250
4251 lmo.l_prev_offset = 16;
4252 lmo.l_prev_size = 4;
4253 }
4254
4255 return lmp;
4256}
4257#endif /* SVR4_SHARED_LIBS */
4258
2f14585c
JR
4259\f
4260enum
4261{
4262 DSP_DSR_REGNUM = 24,
4263 DSP_A0G_REGNUM,
4264 DSP_A0_REGNUM,
4265 DSP_A1G_REGNUM,
4266 DSP_A1_REGNUM,
4267 DSP_M0_REGNUM,
4268 DSP_M1_REGNUM,
4269 DSP_X0_REGNUM,
4270 DSP_X1_REGNUM,
4271 DSP_Y0_REGNUM,
4272 DSP_Y1_REGNUM,
4273
4274 DSP_MOD_REGNUM = 40,
4275
4276 DSP_RS_REGNUM = 43,
4277 DSP_RE_REGNUM,
4278
4279 DSP_R0_BANK_REGNUM = 51,
4280 DSP_R7_BANK_REGNUM = DSP_R0_BANK_REGNUM + 7
4281};
4282
4283static int
4284sh_dsp_register_sim_regno (int nr)
4285{
4286 if (legacy_register_sim_regno (nr) < 0)
4287 return legacy_register_sim_regno (nr);
32f63c4b 4288 if (nr >= DSP_DSR_REGNUM && nr <= DSP_Y1_REGNUM)
2f14585c
JR
4289 return nr - DSP_DSR_REGNUM + SIM_SH_DSR_REGNUM;
4290 if (nr == DSP_MOD_REGNUM)
4291 return SIM_SH_MOD_REGNUM;
4292 if (nr == DSP_RS_REGNUM)
4293 return SIM_SH_RS_REGNUM;
4294 if (nr == DSP_RE_REGNUM)
4295 return SIM_SH_RE_REGNUM;
4296 if (nr >= DSP_R0_BANK_REGNUM && nr <= DSP_R7_BANK_REGNUM)
4297 return nr - DSP_R0_BANK_REGNUM + SIM_SH_R0_BANK_REGNUM;
4298 return nr;
4299}
d658f924 4300\f
cc17453a
EZ
4301static gdbarch_init_ftype sh_gdbarch_init;
4302
4303static struct gdbarch *
fba45db2 4304sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
cc17453a
EZ
4305{
4306 static LONGEST sh_call_dummy_words[] = {0};
4307 struct gdbarch *gdbarch;
4308 struct gdbarch_tdep *tdep;
4309 gdbarch_register_name_ftype *sh_register_name;
ebba8386 4310 gdbarch_deprecated_store_return_value_ftype *sh_store_return_value;
9c04cab7 4311 gdbarch_deprecated_register_virtual_type_ftype *sh_register_virtual_type;
d658f924 4312
4be87837
DJ
4313 /* If there is already a candidate, use it. */
4314 arches = gdbarch_list_lookup_by_info (arches, &info);
4315 if (arches != NULL)
4316 return arches->gdbarch;
cc17453a
EZ
4317
4318 /* None found, create a new architecture from the information
4319 provided. */
4320 tdep = XMALLOC (struct gdbarch_tdep);
4321 gdbarch = gdbarch_alloc (&info, tdep);
4322
a5afb99f
AC
4323 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
4324 ready to unwind the PC first (see frame.c:get_prev_frame()). */
4325 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
4326
cc17453a
EZ
4327 /* Initialize the register numbers that are not common to all the
4328 variants to -1, if necessary thse will be overwritten in the case
4329 statement below. */
4330 tdep->FPUL_REGNUM = -1;
4331 tdep->FPSCR_REGNUM = -1;
3bbfbb92 4332 tdep->PR_REGNUM = 17;
c62a7c7b 4333 tdep->SR_REGNUM = 22;
cc17453a 4334 tdep->DSR_REGNUM = -1;
e6c42fda 4335 tdep->FP_LAST_REGNUM = -1;
cc17453a
EZ
4336 tdep->A0G_REGNUM = -1;
4337 tdep->A0_REGNUM = -1;
4338 tdep->A1G_REGNUM = -1;
4339 tdep->A1_REGNUM = -1;
4340 tdep->M0_REGNUM = -1;
4341 tdep->M1_REGNUM = -1;
4342 tdep->X0_REGNUM = -1;
4343 tdep->X1_REGNUM = -1;
4344 tdep->Y0_REGNUM = -1;
4345 tdep->Y1_REGNUM = -1;
4346 tdep->MOD_REGNUM = -1;
4347 tdep->RS_REGNUM = -1;
4348 tdep->RE_REGNUM = -1;
4349 tdep->SSR_REGNUM = -1;
4350 tdep->SPC_REGNUM = -1;
53116e27 4351 tdep->DR0_REGNUM = -1;
e6c42fda 4352 tdep->DR_LAST_REGNUM = -1;
53116e27 4353 tdep->FV0_REGNUM = -1;
e6c42fda 4354 tdep->FV_LAST_REGNUM = -1;
3bbfbb92
EZ
4355 tdep->ARG0_REGNUM = 4;
4356 tdep->ARGLAST_REGNUM = 7;
4357 tdep->RETURN_REGNUM = 0;
4358 tdep->FLOAT_ARGLAST_REGNUM = -1;
a38d2a54 4359
283150cd
EZ
4360 tdep->sh_abi = SH_ABI_UNKNOWN;
4361
cc17453a 4362 set_gdbarch_fp0_regnum (gdbarch, -1);
53116e27 4363 set_gdbarch_num_pseudo_regs (gdbarch, 0);
a0ed5532
AC
4364 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 4);
4365 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 4);
ec920329 4366 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
a38d2a54 4367 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
88e04cc1 4368 set_gdbarch_num_regs (gdbarch, SH_DEFAULT_NUM_REGS);
a38d2a54 4369 set_gdbarch_sp_regnum (gdbarch, 15);
0ba6dca9 4370 set_gdbarch_deprecated_fp_regnum (gdbarch, 14);
a38d2a54 4371 set_gdbarch_pc_regnum (gdbarch, 16);
b1e29e33 4372 set_gdbarch_deprecated_register_size (gdbarch, 4);
b8b527c5 4373 set_gdbarch_deprecated_register_bytes (gdbarch, SH_DEFAULT_NUM_REGS * 4);
903ad3a6 4374 set_gdbarch_deprecated_do_registers_info (gdbarch, sh_do_registers_info);
eaf90c5d 4375 set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
618ce49f 4376 set_gdbarch_deprecated_frame_chain (gdbarch, sh_frame_chain);
129c1cd6 4377 set_gdbarch_deprecated_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
e9582e71 4378 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sh_init_extra_frame_info);
26e9b323 4379 set_gdbarch_deprecated_extract_return_value (gdbarch, sh_extract_return_value);
b81774d8 4380 set_gdbarch_deprecated_push_arguments (gdbarch, sh_push_arguments);
4183d812 4381 set_gdbarch_deprecated_store_struct_return (gdbarch, sh_store_struct_return);
3bbfbb92 4382 set_gdbarch_use_struct_convention (gdbarch, sh_use_struct_convention);
26e9b323 4383 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
749b82f6 4384 set_gdbarch_deprecated_pop_frame (gdbarch, sh_pop_frame);
2bf0cb65 4385 set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh);
2f14585c 4386 set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno);
3bbfbb92
EZ
4387 skip_prologue_hard_way = sh_skip_prologue_hard_way;
4388 do_pseudo_register = sh_do_pseudo_register;
cc17453a
EZ
4389
4390 switch (info.bfd_arch_info->mach)
8db62801 4391 {
cc17453a
EZ
4392 case bfd_mach_sh:
4393 sh_register_name = sh_sh_register_name;
4394 sh_show_regs = sh_generic_show_regs;
4395 sh_store_return_value = sh_default_store_return_value;
4396 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4397 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4398 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4399 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4400 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
cc17453a
EZ
4401 break;
4402 case bfd_mach_sh2:
4403 sh_register_name = sh_sh_register_name;
4404 sh_show_regs = sh_generic_show_regs;
4405 sh_store_return_value = sh_default_store_return_value;
4406 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4407 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4408 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4409 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4410 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
cc17453a 4411 break;
2d188dd3
NC
4412 case bfd_mach_sh2e:
4413 sh_register_name = sh_sh2e_register_name;
4414 sh_show_regs = sh2e_show_regs;
4415 sh_store_return_value = sh3e_sh4_store_return_value;
4416 sh_register_virtual_type = sh_sh3e_register_virtual_type;
f30ee0bc 4417 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4418 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4419 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4420 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
2d188dd3
NC
4421 set_gdbarch_fp0_regnum (gdbarch, 25);
4422 tdep->FPUL_REGNUM = 23;
4423 tdep->FPSCR_REGNUM = 24;
4424 tdep->FP_LAST_REGNUM = 40;
4425 break;
cc17453a
EZ
4426 case bfd_mach_sh_dsp:
4427 sh_register_name = sh_sh_dsp_register_name;
4428 sh_show_regs = sh_dsp_show_regs;
4429 sh_store_return_value = sh_default_store_return_value;
4430 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4431 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4432 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4433 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4434 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
2f14585c 4435 set_gdbarch_register_sim_regno (gdbarch, sh_dsp_register_sim_regno);
cc17453a
EZ
4436 tdep->DSR_REGNUM = 24;
4437 tdep->A0G_REGNUM = 25;
4438 tdep->A0_REGNUM = 26;
4439 tdep->A1G_REGNUM = 27;
4440 tdep->A1_REGNUM = 28;
4441 tdep->M0_REGNUM = 29;
4442 tdep->M1_REGNUM = 30;
4443 tdep->X0_REGNUM = 31;
4444 tdep->X1_REGNUM = 32;
4445 tdep->Y0_REGNUM = 33;
4446 tdep->Y1_REGNUM = 34;
4447 tdep->MOD_REGNUM = 40;
4448 tdep->RS_REGNUM = 43;
4449 tdep->RE_REGNUM = 44;
4450 break;
4451 case bfd_mach_sh3:
4452 sh_register_name = sh_sh3_register_name;
4453 sh_show_regs = sh3_show_regs;
4454 sh_store_return_value = sh_default_store_return_value;
4455 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4456 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4457 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4458 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4459 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
cc17453a
EZ
4460 tdep->SSR_REGNUM = 41;
4461 tdep->SPC_REGNUM = 42;
4462 break;
4463 case bfd_mach_sh3e:
4464 sh_register_name = sh_sh3e_register_name;
4465 sh_show_regs = sh3e_show_regs;
4466 sh_store_return_value = sh3e_sh4_store_return_value;
4467 sh_register_virtual_type = sh_sh3e_register_virtual_type;
f30ee0bc 4468 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
9c04cab7
AC
4469 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4470 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4471 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
26e9b323 4472 set_gdbarch_deprecated_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
cc17453a
EZ
4473 set_gdbarch_fp0_regnum (gdbarch, 25);
4474 tdep->FPUL_REGNUM = 23;
4475 tdep->FPSCR_REGNUM = 24;
e6c42fda 4476 tdep->FP_LAST_REGNUM = 40;
cc17453a
EZ
4477 tdep->SSR_REGNUM = 41;
4478 tdep->SPC_REGNUM = 42;
4479 break;
4480 case bfd_mach_sh3_dsp:
4481 sh_register_name = sh_sh3_dsp_register_name;
4482 sh_show_regs = sh3_dsp_show_regs;
4483 sh_store_return_value = sh_default_store_return_value;
4484 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4485 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4486 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4487 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4488 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
cc17453a
EZ
4489 tdep->DSR_REGNUM = 24;
4490 tdep->A0G_REGNUM = 25;
4491 tdep->A0_REGNUM = 26;
4492 tdep->A1G_REGNUM = 27;
4493 tdep->A1_REGNUM = 28;
4494 tdep->M0_REGNUM = 29;
4495 tdep->M1_REGNUM = 30;
4496 tdep->X0_REGNUM = 31;
4497 tdep->X1_REGNUM = 32;
4498 tdep->Y0_REGNUM = 33;
4499 tdep->Y1_REGNUM = 34;
4500 tdep->MOD_REGNUM = 40;
4501 tdep->RS_REGNUM = 43;
4502 tdep->RE_REGNUM = 44;
4503 tdep->SSR_REGNUM = 41;
4504 tdep->SPC_REGNUM = 42;
4505 break;
4506 case bfd_mach_sh4:
53116e27
EZ
4507 sh_register_name = sh_sh4_register_name;
4508 sh_show_regs = sh4_show_regs;
cc17453a 4509 sh_store_return_value = sh3e_sh4_store_return_value;
53116e27 4510 sh_register_virtual_type = sh_sh4_register_virtual_type;
f30ee0bc 4511 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
26e9b323 4512 set_gdbarch_deprecated_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
cc17453a 4513 set_gdbarch_fp0_regnum (gdbarch, 25);
9c04cab7
AC
4514 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_sh4_register_raw_size);
4515 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_sh4_register_raw_size);
4516 set_gdbarch_deprecated_register_byte (gdbarch, sh_sh4_register_byte);
53116e27 4517 set_gdbarch_num_pseudo_regs (gdbarch, 12);
a0ed5532
AC
4518 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 4 * 4);
4519 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 4 * 4);
d8124050
AC
4520 set_gdbarch_pseudo_register_read (gdbarch, sh_pseudo_register_read);
4521 set_gdbarch_pseudo_register_write (gdbarch, sh_pseudo_register_write);
cc17453a
EZ
4522 tdep->FPUL_REGNUM = 23;
4523 tdep->FPSCR_REGNUM = 24;
e6c42fda 4524 tdep->FP_LAST_REGNUM = 40;
cc17453a
EZ
4525 tdep->SSR_REGNUM = 41;
4526 tdep->SPC_REGNUM = 42;
53116e27 4527 tdep->DR0_REGNUM = 59;
e6c42fda 4528 tdep->DR_LAST_REGNUM = 66;
53116e27 4529 tdep->FV0_REGNUM = 67;
e6c42fda 4530 tdep->FV_LAST_REGNUM = 70;
cc17453a 4531 break;
283150cd
EZ
4532 case bfd_mach_sh5:
4533 tdep->PR_REGNUM = 18;
4534 tdep->SR_REGNUM = 65;
4535 tdep->FPSCR_REGNUM = SIM_SH64_FPCSR_REGNUM;
4536 tdep->FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1;
4537 tdep->SSR_REGNUM = SIM_SH64_SSR_REGNUM;
4538 tdep->SPC_REGNUM = SIM_SH64_SPC_REGNUM;
4539 tdep->TR7_REGNUM = SIM_SH64_TR0_REGNUM + 7;
4540 tdep->FPP0_REGNUM = 173;
4541 tdep->FPP_LAST_REGNUM = 204;
4542 tdep->DR0_REGNUM = 141;
4543 tdep->DR_LAST_REGNUM = 172;
4544 tdep->FV0_REGNUM = 205;
4545 tdep->FV_LAST_REGNUM = 220;
4546 tdep->R0_C_REGNUM = 221;
4547 tdep->R_LAST_C_REGNUM = 236;
4548 tdep->PC_C_REGNUM = 237;
4549 tdep->GBR_C_REGNUM = 238;
4550 tdep->MACH_C_REGNUM = 239;
4551 tdep->MACL_C_REGNUM = 240;
4552 tdep->PR_C_REGNUM = 241;
4553 tdep->T_C_REGNUM = 242;
4554 tdep->FPSCR_C_REGNUM = 243;
4555 tdep->FPUL_C_REGNUM = 244;
4556 tdep->FP0_C_REGNUM = 245;
4557 tdep->FP_LAST_C_REGNUM = 260;
4558 tdep->DR0_C_REGNUM = 261;
4559 tdep->DR_LAST_C_REGNUM = 268;
4560 tdep->FV0_C_REGNUM = 269;
4561 tdep->FV_LAST_C_REGNUM = 272;
4562 tdep->ARG0_REGNUM = 2;
4563 tdep->ARGLAST_REGNUM = 9;
4564 tdep->RETURN_REGNUM = 2;
4565 tdep->FLOAT_ARGLAST_REGNUM = 11;
4566
4567 set_gdbarch_num_pseudo_regs (gdbarch, NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT);
4568 set_gdbarch_fp0_regnum (gdbarch, SIM_SH64_FR0_REGNUM);
4569 set_gdbarch_pc_regnum (gdbarch, 64);
4570
4571 /* Determine the ABI */
4572 if (bfd_get_arch_size (info.abfd) == 64)
4573 {
4574 /* If the ABI is the 64-bit one, it can only be sh-media. */
4575 tdep->sh_abi = SH_ABI_64;
4576 set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4577 set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4578 }
4579 else
4580 {
4581 /* If the ABI is the 32-bit one it could be either media or
4582 compact. */
4583 tdep->sh_abi = SH_ABI_32;
4584 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4585 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4586 }
4587
4588 /* the number of real registers is the same whether we are in
4589 ISA16(compact) or ISA32(media). */
4590 set_gdbarch_num_regs (gdbarch, SIM_SH64_NR_REGS);
b1e29e33 4591 set_gdbarch_deprecated_register_size (gdbarch, 8); /*????*/
b8b527c5
AC
4592 set_gdbarch_deprecated_register_bytes (gdbarch,
4593 ((SIM_SH64_NR_FP_REGS + 1) * 4)
4594 + (SIM_SH64_NR_REGS - SIM_SH64_NR_FP_REGS -1) * 8);
283150cd
EZ
4595
4596 sh_register_name = sh_sh64_register_name;
4597 sh_show_regs = sh64_show_regs;
4598 sh_register_virtual_type = sh_sh64_register_virtual_type;
4599 sh_store_return_value = sh64_store_return_value;
4600 skip_prologue_hard_way = sh64_skip_prologue_hard_way;
4601 do_pseudo_register = sh64_do_pseudo_register;
9c04cab7
AC
4602 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_sh64_register_raw_size);
4603 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_sh64_register_raw_size);
4604 set_gdbarch_deprecated_register_byte (gdbarch, sh_sh64_register_byte);
283150cd 4605 /* This seems awfully wrong!*/
a0ed5532 4606 /*set_gdbarch_deprecated_max_register_raw_size (gdbarch, 8);*/
283150cd 4607 /* should include the size of the pseudo regs. */
a0ed5532 4608 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 4 * 4);
283150cd 4609 /* Or should that go in the virtual_size? */
a0ed5532
AC
4610 /*set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);*/
4611 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 4 * 4);
d8124050
AC
4612 set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read);
4613 set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write);
283150cd 4614
903ad3a6 4615 set_gdbarch_deprecated_do_registers_info (gdbarch, sh64_do_registers_info);
f30ee0bc 4616 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh64_nofp_frame_init_saved_regs);
283150cd 4617 set_gdbarch_breakpoint_from_pc (gdbarch, sh_sh64_breakpoint_from_pc);
e9582e71 4618 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sh64_init_extra_frame_info);
618ce49f 4619 set_gdbarch_deprecated_frame_chain (gdbarch, sh64_frame_chain);
129c1cd6 4620 set_gdbarch_deprecated_get_saved_register (gdbarch, sh64_get_saved_register);
26e9b323 4621 set_gdbarch_deprecated_extract_return_value (gdbarch, sh64_extract_return_value);
b81774d8 4622 set_gdbarch_deprecated_push_arguments (gdbarch, sh64_push_arguments);
4183d812 4623 /*set_gdbarch_deprecated_store_struct_return (gdbarch, sh64_store_struct_return);*/
26e9b323 4624 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sh64_extract_struct_value_address);
283150cd 4625 set_gdbarch_use_struct_convention (gdbarch, sh64_use_struct_convention);
749b82f6 4626 set_gdbarch_deprecated_pop_frame (gdbarch, sh64_pop_frame);
283150cd
EZ
4627 set_gdbarch_elf_make_msymbol_special (gdbarch,
4628 sh64_elf_make_msymbol_special);
4629 break;
cc17453a
EZ
4630 default:
4631 sh_register_name = sh_generic_register_name;
4632 sh_show_regs = sh_generic_show_regs;
4633 sh_store_return_value = sh_default_store_return_value;
4634 sh_register_virtual_type = sh_default_register_virtual_type;
f30ee0bc 4635 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
9c04cab7
AC
4636 set_gdbarch_deprecated_register_raw_size (gdbarch, sh_default_register_raw_size);
4637 set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_default_register_raw_size);
4638 set_gdbarch_deprecated_register_byte (gdbarch, sh_default_register_byte);
cc17453a 4639 break;
8db62801 4640 }
cc17453a 4641
cc17453a 4642 set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
b46e02f6 4643 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
cc17453a 4644
cc17453a 4645 set_gdbarch_register_name (gdbarch, sh_register_name);
9c04cab7 4646 set_gdbarch_deprecated_register_virtual_type (gdbarch, sh_register_virtual_type);
cc17453a 4647
cc17453a
EZ
4648 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
4649 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
cc17453a
EZ
4650 set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4651 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4652 set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
7079c36c 4653 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
cc17453a 4654
b1e29e33
AC
4655 set_gdbarch_deprecated_call_dummy_words (gdbarch, sh_call_dummy_words);
4656 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (sh_call_dummy_words));
cc17453a 4657
28f617b3 4658 set_gdbarch_deprecated_push_return_address (gdbarch, sh_push_return_address);
cc17453a 4659
ebba8386 4660 set_gdbarch_deprecated_store_return_value (gdbarch, sh_store_return_value);
cc17453a
EZ
4661 set_gdbarch_skip_prologue (gdbarch, sh_skip_prologue);
4662 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
4663 set_gdbarch_decr_pc_after_break (gdbarch, 0);
4664 set_gdbarch_function_start_offset (gdbarch, 0);
cc17453a
EZ
4665
4666 set_gdbarch_frame_args_skip (gdbarch, 0);
4667 set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue);
8bedc050 4668 set_gdbarch_deprecated_frame_saved_pc (gdbarch, sh_frame_saved_pc);
6913c89a 4669 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, sh_saved_pc_after_call);
cc17453a 4670 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
cc17453a 4671
4be87837
DJ
4672 /* Hook in ABI-specific overrides, if they have been registered. */
4673 gdbarch_init_osabi (info, gdbarch);
d658f924 4674
cc17453a 4675 return gdbarch;
8db62801
EZ
4676}
4677
d658f924
JT
4678static void
4679sh_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
4680{
4681 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4682
4683 if (tdep == NULL)
4684 return;
4685
4be87837 4686 /* FIXME: dump the rest of gdbarch_tdep. */
d658f924
JT
4687}
4688
a78f21af
AC
4689extern initialize_file_ftype _initialize_sh_tdep; /* -Wmissing-prototypes */
4690
c906108c 4691void
fba45db2 4692_initialize_sh_tdep (void)
c906108c
SS
4693{
4694 struct cmd_list_element *c;
cc17453a 4695
d658f924 4696 gdbarch_register (bfd_arch_sh, sh_gdbarch_init, sh_dump_tdep);
c906108c 4697
53116e27 4698 add_com ("regs", class_vars, sh_show_regs_command, "Print all registers");
c906108c 4699}
This page took 0.729159 seconds and 4 git commands to generate.