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