2003-08-01 Michael Snyder <msnyder@redhat.com>
[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 static CORE_ADDR
2032 sh_frame_align (struct gdbarch *ignore, CORE_ADDR sp)
2033 {
2034   return sp & ~3;
2035 }
2036
2037 /* Function: push_arguments
2038    Setup the function arguments for calling a function in the inferior.
2039
2040    On the Hitachi SH architecture, there are four registers (R4 to R7)
2041    which are dedicated for passing function arguments.  Up to the first
2042    four arguments (depending on size) may go into these registers.
2043    The rest go on the stack.
2044
2045    Arguments that are smaller than 4 bytes will still take up a whole
2046    register or a whole 32-bit word on the stack, and will be 
2047    right-justified in the register or the stack word.  This includes
2048    chars, shorts, and small aggregate types.
2049
2050    Arguments that are larger than 4 bytes may be split between two or 
2051    more registers.  If there are not enough registers free, an argument
2052    may be passed partly in a register (or registers), and partly on the
2053    stack.  This includes doubles, long longs, and larger aggregates. 
2054    As far as I know, there is no upper limit to the size of aggregates 
2055    that will be passed in this way; in other words, the convention of 
2056    passing a pointer to a large aggregate instead of a copy is not used.
2057
2058    An exceptional case exists for struct arguments (and possibly other
2059    aggregates such as arrays) if the size is larger than 4 bytes but 
2060    not a multiple of 4 bytes.  In this case the argument is never split 
2061    between the registers and the stack, but instead is copied in its
2062    entirety onto the stack, AND also copied into as many registers as 
2063    there is room for.  In other words, space in registers permitting, 
2064    two copies of the same argument are passed in.  As far as I can tell,
2065    only the one on the stack is used, although that may be a function 
2066    of the level of compiler optimization.  I suspect this is a compiler
2067    bug.  Arguments of these odd sizes are left-justified within the 
2068    word (as opposed to arguments smaller than 4 bytes, which are 
2069    right-justified).
2070
2071    If the function is to return an aggregate type such as a struct, it 
2072    is either returned in the normal return value register R0 (if its 
2073    size is no greater than one byte), or else the caller must allocate
2074    space into which the callee will copy the return value (if the size
2075    is greater than one byte).  In this case, a pointer to the return 
2076    value location is passed into the callee in register R2, which does 
2077    not displace any of the other arguments passed in via registers R4
2078    to R7.   */
2079
2080 static CORE_ADDR
2081 sh_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
2082                     struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
2083                     struct value **args, CORE_ADDR sp, int struct_return,
2084                     CORE_ADDR struct_addr)
2085
2086 {
2087   int stack_offset, stack_alloc;
2088   int argreg;
2089   int argnum;
2090   struct type *type;
2091   CORE_ADDR regval;
2092   char *val;
2093   char valbuf[4];
2094   int len;
2095   int odd_sized_struct;
2096   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
2097
2098   /* first force sp to a 4-byte alignment */
2099   sp = sh_frame_align (gdbarch, sp);
2100
2101   /* The "struct return pointer" pseudo-argument has its own dedicated 
2102      register */
2103   if (struct_return)
2104     regcache_cooked_write_unsigned (regcache, STRUCT_RETURN_REGNUM, struct_addr);
2105
2106   /* Now make sure there's space on the stack */
2107   for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
2108     stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
2109   sp -= stack_alloc;            /* make room on stack for args */
2110
2111   /* Now load as many as possible of the first arguments into
2112      registers, and push the rest onto the stack.  There are 16 bytes
2113      in four registers available.  Loop thru args from first to last.  */
2114
2115   argreg = tdep->ARG0_REGNUM;
2116   for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2117     {
2118       type = VALUE_TYPE (args[argnum]);
2119       len = TYPE_LENGTH (type);
2120       memset (valbuf, 0, sizeof (valbuf));
2121       if (len < 4)
2122         {
2123           /* value gets right-justified in the register or stack word */
2124           if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2125             memcpy (valbuf + (4 - len),
2126                     (char *) VALUE_CONTENTS (args[argnum]), len);
2127           else
2128             memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
2129           val = valbuf;
2130         }
2131       else
2132         val = (char *) VALUE_CONTENTS (args[argnum]);
2133
2134       if (len > 4 && (len & 3) != 0)
2135         odd_sized_struct = 1;   /* such structs go entirely on stack */
2136       else
2137         odd_sized_struct = 0;
2138       while (len > 0)
2139         {
2140           if (argreg > tdep->ARGLAST_REGNUM
2141               || odd_sized_struct)
2142             {                   
2143               /* must go on the stack */
2144               write_memory (sp + stack_offset, val, 4);
2145               stack_offset += 4;
2146             }
2147           /* NOTE WELL!!!!!  This is not an "else if" clause!!!
2148              That's because some *&^%$ things get passed on the stack
2149              AND in the registers!   */
2150           if (argreg <= tdep->ARGLAST_REGNUM)
2151             {                   
2152               /* there's room in a register */
2153               regval = extract_unsigned_integer (val, register_size (gdbarch,
2154                                                                      argreg));
2155               regcache_cooked_write_unsigned (regcache, argreg++, regval);
2156             }
2157           /* Store the value 4 bytes at a time.  This means that things
2158              larger than 4 bytes may go partly in registers and partly
2159              on the stack.  */
2160           len -= register_size (gdbarch, argreg);
2161           val += register_size (gdbarch, argreg);
2162         }
2163     }
2164
2165   /* Store return address. */
2166   regcache_cooked_write_unsigned (regcache, tdep->PR_REGNUM, bp_addr);
2167
2168   /* Update stack pointer.  */
2169   regcache_cooked_write_unsigned (regcache, SP_REGNUM, sp);
2170
2171   return sp;
2172 }
2173
2174 /* R2-R9 for integer types and integer equivalent (char, pointers) and
2175    non-scalar (struct, union) elements (even if the elements are
2176    floats).  
2177    FR0-FR11 for single precision floating point (float)
2178    DR0-DR10 for double precision floating point (double) 
2179    
2180    If a float is argument number 3 (for instance) and arguments number
2181    1,2, and 4 are integer, the mapping will be:
2182    arg1 -->R2, arg2 --> R3, arg3 -->FR0, arg4 --> R5. I.e. R4 is not used.
2183    
2184    If a float is argument number 10 (for instance) and arguments number
2185    1 through 10 are integer, the mapping will be:
2186    arg1->R2, arg2->R3, arg3->R4, arg4->R5, arg5->R6, arg6->R7, arg7->R8,
2187    arg8->R9, arg9->(0,SP)stack(8-byte aligned), arg10->FR0, arg11->stack(16,SP).
2188    I.e. there is hole in the stack.
2189
2190    Different rules apply for variable arguments functions, and for functions
2191    for which the prototype is not known. */
2192
2193 static CORE_ADDR
2194 sh64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2195                      int struct_return, CORE_ADDR struct_addr)
2196 {
2197   int stack_offset, stack_alloc;
2198   int int_argreg;
2199   int float_argreg;
2200   int double_argreg;
2201   int float_arg_index = 0;
2202   int double_arg_index = 0;
2203   int argnum;
2204   struct type *type;
2205   CORE_ADDR regval;
2206   char *val;
2207   char valbuf[8];
2208   char valbuf_tmp[8];
2209   int len;
2210   int argreg_size;
2211   int fp_args[12];
2212   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2213
2214   memset (fp_args, 0, sizeof (fp_args));
2215
2216   /* first force sp to a 8-byte alignment */
2217   sp = sp & ~7;
2218
2219   /* The "struct return pointer" pseudo-argument has its own dedicated 
2220      register */
2221
2222   if (struct_return)
2223     write_register (STRUCT_RETURN_REGNUM, struct_addr);
2224
2225   /* Now make sure there's space on the stack */
2226   for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
2227     stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 7) & ~7);
2228   sp -= stack_alloc;            /* make room on stack for args */
2229
2230   /* Now load as many as possible of the first arguments into
2231      registers, and push the rest onto the stack.  There are 64 bytes
2232      in eight registers available.  Loop thru args from first to last.  */
2233
2234   int_argreg = tdep->ARG0_REGNUM;
2235   float_argreg = FP0_REGNUM;
2236   double_argreg = tdep->DR0_REGNUM;
2237
2238   for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2239     {
2240       type = VALUE_TYPE (args[argnum]);
2241       len = TYPE_LENGTH (type);
2242       memset (valbuf, 0, sizeof (valbuf));
2243       
2244       if (TYPE_CODE (type) != TYPE_CODE_FLT)
2245         {
2246           argreg_size = REGISTER_RAW_SIZE (int_argreg);
2247
2248           if (len < argreg_size)
2249             {
2250               /* value gets right-justified in the register or stack word */
2251               if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2252                 memcpy (valbuf + argreg_size - len,
2253                         (char *) VALUE_CONTENTS (args[argnum]), len);
2254               else
2255                 memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
2256
2257               val = valbuf;
2258             }
2259           else
2260             val = (char *) VALUE_CONTENTS (args[argnum]);
2261
2262           while (len > 0)
2263             {
2264               if (int_argreg > tdep->ARGLAST_REGNUM)
2265                 {                       
2266                   /* must go on the stack */
2267                   write_memory (sp + stack_offset, val, argreg_size);
2268                   stack_offset += 8;/*argreg_size;*/
2269                 }
2270               /* NOTE WELL!!!!!  This is not an "else if" clause!!!
2271                  That's because some *&^%$ things get passed on the stack
2272                  AND in the registers!   */
2273               if (int_argreg <= tdep->ARGLAST_REGNUM)
2274                 {                       
2275                   /* there's room in a register */
2276                   regval = extract_unsigned_integer (val, argreg_size);
2277                   write_register (int_argreg, regval);
2278                 }
2279               /* Store the value 8 bytes at a time.  This means that
2280                  things larger than 8 bytes may go partly in registers
2281                  and partly on the stack. FIXME: argreg is incremented
2282                  before we use its size. */
2283               len -= argreg_size;
2284               val += argreg_size;
2285               int_argreg++;
2286             }
2287         }
2288       else
2289         {
2290           val = (char *) VALUE_CONTENTS (args[argnum]);
2291           if (len == 4)
2292             {
2293               /* Where is it going to be stored? */
2294               while (fp_args[float_arg_index])
2295                 float_arg_index ++;
2296
2297               /* Now float_argreg points to the register where it
2298                  should be stored.  Are we still within the allowed
2299                  register set? */
2300               if (float_arg_index <= tdep->FLOAT_ARGLAST_REGNUM)
2301                 {
2302                   /* Goes in FR0...FR11 */
2303                   deprecated_write_register_gen (FP0_REGNUM + float_arg_index,
2304                                                  val);
2305                   fp_args[float_arg_index] = 1;
2306                   /* Skip the corresponding general argument register. */
2307                   int_argreg ++;
2308                 }
2309               else 
2310                 ;
2311                 /* Store it as the integers, 8 bytes at the time, if
2312                    necessary spilling on the stack. */
2313               
2314             }
2315             else if (len == 8)
2316               {
2317                 /* Where is it going to be stored? */
2318                 while (fp_args[double_arg_index])
2319                   double_arg_index += 2;
2320                 /* Now double_argreg points to the register
2321                    where it should be stored.
2322                    Are we still within the allowed register set? */
2323                 if (double_arg_index < tdep->FLOAT_ARGLAST_REGNUM)
2324                   {
2325                     /* Goes in DR0...DR10 */
2326                     /* The numbering of the DRi registers is consecutive,
2327                        i.e. includes odd numbers. */
2328                     int double_register_offset = double_arg_index / 2;
2329                     int regnum = tdep->DR0_REGNUM +
2330                                  double_register_offset;
2331 #if 0
2332                     if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2333                       {
2334                         memset (valbuf_tmp, 0, sizeof (valbuf_tmp));
2335                         DEPRECATED_REGISTER_CONVERT_TO_VIRTUAL (regnum,
2336                                                                 type, val,
2337                                                                 valbuf_tmp);
2338                         val = valbuf_tmp;
2339                       }
2340 #endif
2341                     /* Note: must use write_register_gen here instead
2342                        of regcache_raw_write, because
2343                        regcache_raw_write works only for real
2344                        registers, not pseudo.  write_register_gen will
2345                        call the gdbarch function to do register
2346                        writes, and that will properly know how to deal
2347                        with pseudoregs. */
2348                     deprecated_write_register_gen (regnum, val);
2349                     fp_args[double_arg_index] = 1;
2350                     fp_args[double_arg_index + 1] = 1;
2351                     /* Skip the corresponding general argument register. */
2352                     int_argreg ++;
2353                   }
2354                 else
2355                   ;
2356                   /* Store it as the integers, 8 bytes at the time, if
2357                      necessary spilling on the stack. */
2358               }
2359         }
2360     }
2361   return sp;
2362 }
2363
2364 /* Function: push_return_address (pc)
2365    Set up the return address for the inferior function call.
2366    Needed for targets where we don't actually execute a JSR/BSR instruction */
2367
2368 static CORE_ADDR
2369 sh64_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
2370 {
2371   write_register (gdbarch_tdep (current_gdbarch)->PR_REGNUM,
2372                   CALL_DUMMY_ADDRESS ());
2373   return sp;
2374 }
2375
2376 /* Function: fix_call_dummy
2377    Poke the callee function's address into the destination part of 
2378    the CALL_DUMMY.  The address is actually stored in a data word 
2379    following the actualy CALL_DUMMY instructions, which will load
2380    it into a register using PC-relative addressing.  This function
2381    expects the CALL_DUMMY to look like this:
2382
2383    mov.w @(2,PC), R8
2384    jsr   @R8
2385    nop
2386    trap
2387    <destination>
2388  */
2389
2390 #if 0
2391 void
2392 sh_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
2393                    struct value **args, struct type *type, int gcc_p)
2394 {
2395   *(unsigned long *) (dummy + 8) = fun;
2396 }
2397 #endif
2398
2399 /* Find a function's return value in the appropriate registers (in
2400    regbuf), and copy it into valbuf.  Extract from an array REGBUF
2401    containing the (raw) register state a function return value of type
2402    TYPE, and copy that, in virtual format, into VALBUF.  */
2403 static void
2404 sh_default_extract_return_value (struct type *type, struct regcache *regcache,
2405                                  void *valbuf)
2406 {
2407   int len = TYPE_LENGTH (type);
2408   int return_register = R0_REGNUM;
2409   int offset;
2410   
2411   if (len <= 4)
2412     {
2413       ULONGEST c;
2414
2415       regcache_cooked_read_unsigned (regcache, R0_REGNUM, &c);
2416       store_unsigned_integer (valbuf, len, c);
2417     }
2418   else if (len == 8)
2419     {
2420       int i, regnum = R0_REGNUM;
2421       for (i = 0; i < len; i += 4)
2422         regcache_raw_read (regcache, regnum++, (char *)valbuf + i);
2423     }
2424   else
2425     error ("bad size for return value");
2426 }
2427
2428 static void
2429 sh3e_sh4_extract_return_value (struct type *type, struct regcache *regcache,
2430                                void *valbuf)
2431 {
2432   if (TYPE_CODE (type) == TYPE_CODE_FLT)
2433     {
2434       int len = TYPE_LENGTH (type);
2435       int i, regnum = FP0_REGNUM;
2436       for (i = 0; i < len; i += 4)
2437         regcache_raw_read (regcache, regnum++, (char *)valbuf + i);
2438     }
2439   else
2440     sh_default_extract_return_value (type, regcache, valbuf);
2441 }
2442
2443 static void
2444 sh64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2445 {
2446   int offset;
2447   int return_register;
2448   int len = TYPE_LENGTH (type);
2449   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2450   
2451   if (TYPE_CODE (type) == TYPE_CODE_FLT)
2452     {
2453       if (len == 4)
2454         {
2455           /* Return value stored in FP0_REGNUM */
2456           return_register = FP0_REGNUM;
2457           offset = REGISTER_BYTE (return_register);
2458           memcpy (valbuf, (char *) regbuf + offset, len); 
2459         }
2460       else if (len == 8)
2461         {
2462           /* return value stored in DR0_REGNUM */
2463           DOUBLEST val;
2464
2465           return_register = tdep->DR0_REGNUM;
2466           offset = REGISTER_BYTE (return_register);
2467           
2468           if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2469             floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
2470                                      (char *) regbuf + offset, &val);
2471           else
2472             floatformat_to_doublest (&floatformat_ieee_double_big,
2473                                      (char *) regbuf + offset, &val);
2474           deprecated_store_floating (valbuf, len, val);
2475         }
2476     }
2477   else
2478     { 
2479       if (len <= 8)
2480         {
2481           /* Result is in register 2. If smaller than 8 bytes, it is padded 
2482              at the most significant end. */
2483           return_register = tdep->RETURN_REGNUM;
2484           if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2485             offset = REGISTER_BYTE (return_register) +
2486               REGISTER_RAW_SIZE (return_register) - len;
2487           else
2488             offset = REGISTER_BYTE (return_register);
2489           memcpy (valbuf, (char *) regbuf + offset, len);
2490         }
2491       else
2492         error ("bad size for return value");
2493     }
2494 }
2495
2496 /* Write into appropriate registers a function return value
2497    of type TYPE, given in virtual format.
2498    If the architecture is sh4 or sh3e, store a function's return value
2499    in the R0 general register or in the FP0 floating point register,
2500    depending on the type of the return value. In all the other cases
2501    the result is stored in r0, left-justified. */
2502 static void
2503 sh_default_store_return_value (struct type *type, struct regcache *regcache,
2504                                const void *valbuf)
2505 {
2506   ULONGEST val;
2507   int len = TYPE_LENGTH (type);
2508
2509   if (len <= 4)
2510     {
2511       val = extract_unsigned_integer (valbuf, len);
2512       regcache_cooked_write_unsigned (regcache, R0_REGNUM, val);
2513     }
2514   else
2515     {
2516       int i, regnum = R0_REGNUM;
2517       for (i = 0; i < len; i += 4)
2518         regcache_raw_write (regcache, regnum++, (char *)valbuf + i);
2519     }
2520 }
2521
2522 static void
2523 sh3e_sh4_store_return_value (struct type *type, struct regcache *regcache,
2524                              const void *valbuf)
2525 {
2526   if (TYPE_CODE (type) == TYPE_CODE_FLT) 
2527     {
2528       int len = TYPE_LENGTH (type);
2529       int i, regnum = FP0_REGNUM;
2530       for (i = 0; i < len; i += 4)
2531         regcache_raw_write (regcache, regnum++, (char *)valbuf + i);
2532     }
2533   else
2534     sh_default_store_return_value (type, regcache, valbuf);
2535 }
2536
2537 static void
2538 sh64_store_return_value (struct type *type, char *valbuf)
2539 {
2540   char buf[64]; /* more than enough... */
2541   int len = TYPE_LENGTH (type);
2542
2543   if (TYPE_CODE (type) == TYPE_CODE_FLT)
2544     {
2545       if (len == 4)
2546         {
2547           /* Return value stored in FP0_REGNUM */
2548           deprecated_write_register_gen (FP0_REGNUM, valbuf);
2549         }
2550       if (len == 8)
2551         {
2552           /* return value stored in DR0_REGNUM */
2553           /* FIXME: Implement */
2554         }
2555     }
2556   else
2557     {
2558       int return_register = gdbarch_tdep (current_gdbarch)->RETURN_REGNUM;
2559       int offset = 0;
2560
2561       if (len <= REGISTER_RAW_SIZE (return_register))
2562         {
2563           /* Pad with zeros. */
2564           memset (buf, 0, REGISTER_RAW_SIZE (return_register));
2565           if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2566             offset = 0; /*REGISTER_RAW_SIZE (return_register) - len;*/
2567           else
2568             offset = REGISTER_RAW_SIZE (return_register) - len;
2569
2570           memcpy (buf + offset, valbuf, len);
2571           deprecated_write_register_gen (return_register, buf);
2572         }
2573       else
2574         deprecated_write_register_gen (return_register, valbuf);
2575     }
2576 }
2577
2578 /* Print the registers in a form similar to the E7000 */
2579
2580 static void
2581 sh_generic_show_regs (void)
2582 {
2583   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2584
2585   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2586                    paddr (read_register (PC_REGNUM)),
2587                    (long) read_register (tdep->SR_REGNUM),
2588                    (long) read_register (tdep->PR_REGNUM),
2589                    (long) read_register (MACH_REGNUM),
2590                    (long) read_register (MACL_REGNUM));
2591
2592   printf_filtered ("GBR=%08lx VBR=%08lx",
2593                    (long) read_register (GBR_REGNUM),
2594                    (long) read_register (VBR_REGNUM));
2595
2596   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2597                    (long) read_register (0),
2598                    (long) read_register (1),
2599                    (long) read_register (2),
2600                    (long) read_register (3),
2601                    (long) read_register (4),
2602                    (long) read_register (5),
2603                    (long) read_register (6),
2604                    (long) read_register (7));
2605   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2606                    (long) read_register (8),
2607                    (long) read_register (9),
2608                    (long) read_register (10),
2609                    (long) read_register (11),
2610                    (long) read_register (12),
2611                    (long) read_register (13),
2612                    (long) read_register (14),
2613                    (long) read_register (15));
2614 }
2615
2616 static void
2617 sh3_show_regs (void)
2618 {
2619   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2620
2621   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2622                    paddr (read_register (PC_REGNUM)),
2623                    (long) read_register (tdep->SR_REGNUM),
2624                    (long) read_register (tdep->PR_REGNUM),
2625                    (long) read_register (MACH_REGNUM),
2626                    (long) read_register (MACL_REGNUM));
2627
2628   printf_filtered ("GBR=%08lx VBR=%08lx",
2629                    (long) read_register (GBR_REGNUM),
2630                    (long) read_register (VBR_REGNUM));
2631   printf_filtered (" SSR=%08lx SPC=%08lx",
2632                    (long) read_register (tdep->SSR_REGNUM),
2633                    (long) read_register (tdep->SPC_REGNUM));
2634
2635   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2636                    (long) read_register (0),
2637                    (long) read_register (1),
2638                    (long) read_register (2),
2639                    (long) read_register (3),
2640                    (long) read_register (4),
2641                    (long) read_register (5),
2642                    (long) read_register (6),
2643                    (long) read_register (7));
2644   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2645                    (long) read_register (8),
2646                    (long) read_register (9),
2647                    (long) read_register (10),
2648                    (long) read_register (11),
2649                    (long) read_register (12),
2650                    (long) read_register (13),
2651                    (long) read_register (14),
2652                    (long) read_register (15));
2653 }
2654
2655
2656 static void
2657 sh2e_show_regs (void)
2658 {
2659   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2660                    paddr (read_register (PC_REGNUM)),
2661                    (long) read_register (SR_REGNUM),
2662                    (long) read_register (PR_REGNUM),
2663                    (long) read_register (MACH_REGNUM),
2664                    (long) read_register (MACL_REGNUM));
2665
2666   printf_filtered ("GBR=%08lx VBR=%08lx",
2667                    (long) read_register (GBR_REGNUM),
2668                    (long) read_register (VBR_REGNUM));
2669   printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2670                    (long) read_register (gdbarch_tdep (current_gdbarch)->FPUL_REGNUM),
2671                    (long) read_register (gdbarch_tdep (current_gdbarch)->FPSCR_REGNUM));
2672
2673   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2674                    (long) read_register (0),
2675                    (long) read_register (1),
2676                    (long) read_register (2),
2677                    (long) read_register (3),
2678                    (long) read_register (4),
2679                    (long) read_register (5),
2680                    (long) read_register (6),
2681                    (long) read_register (7));
2682   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2683                    (long) read_register (8),
2684                    (long) read_register (9),
2685                    (long) read_register (10),
2686                    (long) read_register (11),
2687                    (long) read_register (12),
2688                    (long) read_register (13),
2689                    (long) read_register (14),
2690                    (long) read_register (15));
2691
2692   printf_filtered (("FP0-FP7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2693                    (long) read_register (FP0_REGNUM + 0),
2694                    (long) read_register (FP0_REGNUM + 1),
2695                    (long) read_register (FP0_REGNUM + 2),
2696                    (long) read_register (FP0_REGNUM + 3),
2697                    (long) read_register (FP0_REGNUM + 4),
2698                    (long) read_register (FP0_REGNUM + 5),
2699                    (long) read_register (FP0_REGNUM + 6),
2700                    (long) read_register (FP0_REGNUM + 7));
2701   printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2702                    (long) read_register (FP0_REGNUM + 8),
2703                    (long) read_register (FP0_REGNUM + 9),
2704                    (long) read_register (FP0_REGNUM + 10),
2705                    (long) read_register (FP0_REGNUM + 11),
2706                    (long) read_register (FP0_REGNUM + 12),
2707                    (long) read_register (FP0_REGNUM + 13),
2708                    (long) read_register (FP0_REGNUM + 14),
2709                    (long) read_register (FP0_REGNUM + 15));
2710 }
2711
2712 static void
2713 sh3e_show_regs (void)
2714 {
2715   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2716
2717   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2718                    paddr (read_register (PC_REGNUM)),
2719                    (long) read_register (tdep->SR_REGNUM),
2720                    (long) read_register (tdep->PR_REGNUM),
2721                    (long) read_register (MACH_REGNUM),
2722                    (long) read_register (MACL_REGNUM));
2723
2724   printf_filtered ("GBR=%08lx VBR=%08lx",
2725                    (long) read_register (GBR_REGNUM),
2726                    (long) read_register (VBR_REGNUM));
2727   printf_filtered (" SSR=%08lx SPC=%08lx",
2728                    (long) read_register (tdep->SSR_REGNUM),
2729                    (long) read_register (tdep->SPC_REGNUM));
2730   printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2731                    (long) read_register (tdep->FPUL_REGNUM),
2732                    (long) read_register (tdep->FPSCR_REGNUM));
2733
2734   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2735                    (long) read_register (0),
2736                    (long) read_register (1),
2737                    (long) read_register (2),
2738                    (long) read_register (3),
2739                    (long) read_register (4),
2740                    (long) read_register (5),
2741                    (long) read_register (6),
2742                    (long) read_register (7));
2743   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2744                    (long) read_register (8),
2745                    (long) read_register (9),
2746                    (long) read_register (10),
2747                    (long) read_register (11),
2748                    (long) read_register (12),
2749                    (long) read_register (13),
2750                    (long) read_register (14),
2751                    (long) read_register (15));
2752
2753   printf_filtered (("FP0-FP7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2754                    (long) read_register (FP0_REGNUM + 0),
2755                    (long) read_register (FP0_REGNUM + 1),
2756                    (long) read_register (FP0_REGNUM + 2),
2757                    (long) read_register (FP0_REGNUM + 3),
2758                    (long) read_register (FP0_REGNUM + 4),
2759                    (long) read_register (FP0_REGNUM + 5),
2760                    (long) read_register (FP0_REGNUM + 6),
2761                    (long) read_register (FP0_REGNUM + 7));
2762   printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2763                    (long) read_register (FP0_REGNUM + 8),
2764                    (long) read_register (FP0_REGNUM + 9),
2765                    (long) read_register (FP0_REGNUM + 10),
2766                    (long) read_register (FP0_REGNUM + 11),
2767                    (long) read_register (FP0_REGNUM + 12),
2768                    (long) read_register (FP0_REGNUM + 13),
2769                    (long) read_register (FP0_REGNUM + 14),
2770                    (long) read_register (FP0_REGNUM + 15));
2771 }
2772
2773 static void
2774 sh3_dsp_show_regs (void)
2775 {
2776   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2777
2778   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2779                    paddr (read_register (PC_REGNUM)),
2780                    (long) read_register (tdep->SR_REGNUM),
2781                    (long) read_register (tdep->PR_REGNUM),
2782                    (long) read_register (MACH_REGNUM),
2783                    (long) read_register (MACL_REGNUM));
2784
2785   printf_filtered ("GBR=%08lx VBR=%08lx",
2786                    (long) read_register (GBR_REGNUM),
2787                    (long) read_register (VBR_REGNUM));
2788
2789   printf_filtered (" SSR=%08lx SPC=%08lx",
2790                    (long) read_register (tdep->SSR_REGNUM),
2791                    (long) read_register (tdep->SPC_REGNUM));
2792
2793   printf_filtered (" DSR=%08lx", 
2794                    (long) read_register (tdep->DSR_REGNUM));
2795
2796   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2797                    (long) read_register (0),
2798                    (long) read_register (1),
2799                    (long) read_register (2),
2800                    (long) read_register (3),
2801                    (long) read_register (4),
2802                    (long) read_register (5),
2803                    (long) read_register (6),
2804                    (long) read_register (7));
2805   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2806                    (long) read_register (8),
2807                    (long) read_register (9),
2808                    (long) read_register (10),
2809                    (long) read_register (11),
2810                    (long) read_register (12),
2811                    (long) read_register (13),
2812                    (long) read_register (14),
2813                    (long) read_register (15));
2814
2815   printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
2816                    (long) read_register (tdep->A0G_REGNUM) & 0xff,
2817                    (long) read_register (tdep->A0_REGNUM),
2818                    (long) read_register (tdep->M0_REGNUM),
2819                    (long) read_register (tdep->X0_REGNUM),
2820                    (long) read_register (tdep->Y0_REGNUM),
2821                    (long) read_register (tdep->RS_REGNUM),
2822                    (long) read_register (tdep->MOD_REGNUM));
2823   printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
2824                    (long) read_register (tdep->A1G_REGNUM) & 0xff,
2825                    (long) read_register (tdep->A1_REGNUM),
2826                    (long) read_register (tdep->M1_REGNUM),
2827                    (long) read_register (tdep->X1_REGNUM),
2828                    (long) read_register (tdep->Y1_REGNUM),
2829                    (long) read_register (tdep->RE_REGNUM));
2830 }
2831
2832 static void
2833 sh4_show_regs (void)
2834 {
2835   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2836
2837   int pr = read_register (tdep->FPSCR_REGNUM) & 0x80000;
2838   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2839                    paddr (read_register (PC_REGNUM)),
2840                    (long) read_register (tdep->SR_REGNUM),
2841                    (long) read_register (tdep->PR_REGNUM),
2842                    (long) read_register (MACH_REGNUM),
2843                    (long) read_register (MACL_REGNUM));
2844
2845   printf_filtered ("GBR=%08lx VBR=%08lx",
2846                    (long) read_register (GBR_REGNUM),
2847                    (long) read_register (VBR_REGNUM));
2848   printf_filtered (" SSR=%08lx SPC=%08lx",
2849                    (long) read_register (tdep->SSR_REGNUM),
2850                    (long) read_register (tdep->SPC_REGNUM));
2851   printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2852                    (long) read_register (tdep->FPUL_REGNUM),
2853                    (long) read_register (tdep->FPSCR_REGNUM));
2854
2855   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2856                    (long) read_register (0),
2857                    (long) read_register (1),
2858                    (long) read_register (2),
2859                    (long) read_register (3),
2860                    (long) read_register (4),
2861                    (long) read_register (5),
2862                    (long) read_register (6),
2863                    (long) read_register (7));
2864   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2865                    (long) read_register (8),
2866                    (long) read_register (9),
2867                    (long) read_register (10),
2868                    (long) read_register (11),
2869                    (long) read_register (12),
2870                    (long) read_register (13),
2871                    (long) read_register (14),
2872                    (long) read_register (15));
2873
2874   printf_filtered ((pr
2875                     ? "DR0-DR6  %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2876                     : "FP0-FP7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2877                    (long) read_register (FP0_REGNUM + 0),
2878                    (long) read_register (FP0_REGNUM + 1),
2879                    (long) read_register (FP0_REGNUM + 2),
2880                    (long) read_register (FP0_REGNUM + 3),
2881                    (long) read_register (FP0_REGNUM + 4),
2882                    (long) read_register (FP0_REGNUM + 5),
2883                    (long) read_register (FP0_REGNUM + 6),
2884                    (long) read_register (FP0_REGNUM + 7));
2885   printf_filtered ((pr
2886                     ? "DR8-DR14 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2887                     : "FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2888                    (long) read_register (FP0_REGNUM + 8),
2889                    (long) read_register (FP0_REGNUM + 9),
2890                    (long) read_register (FP0_REGNUM + 10),
2891                    (long) read_register (FP0_REGNUM + 11),
2892                    (long) read_register (FP0_REGNUM + 12),
2893                    (long) read_register (FP0_REGNUM + 13),
2894                    (long) read_register (FP0_REGNUM + 14),
2895                    (long) read_register (FP0_REGNUM + 15));
2896 }
2897
2898 static void
2899 sh_dsp_show_regs (void)
2900 {
2901   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2902
2903   printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2904                    paddr (read_register (PC_REGNUM)),
2905                    (long) read_register (tdep->SR_REGNUM),
2906                    (long) read_register (tdep->PR_REGNUM),
2907                    (long) read_register (MACH_REGNUM),
2908                    (long) read_register (MACL_REGNUM));
2909
2910   printf_filtered ("GBR=%08lx VBR=%08lx",
2911                    (long) read_register (GBR_REGNUM),
2912                    (long) read_register (VBR_REGNUM));
2913
2914   printf_filtered (" DSR=%08lx", 
2915                    (long) read_register (tdep->DSR_REGNUM));
2916
2917   printf_filtered ("\nR0-R7  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2918                    (long) read_register (0),
2919                    (long) read_register (1),
2920                    (long) read_register (2),
2921                    (long) read_register (3),
2922                    (long) read_register (4),
2923                    (long) read_register (5),
2924                    (long) read_register (6),
2925                    (long) read_register (7));
2926   printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2927                    (long) read_register (8),
2928                    (long) read_register (9),
2929                    (long) read_register (10),
2930                    (long) read_register (11),
2931                    (long) read_register (12),
2932                    (long) read_register (13),
2933                    (long) read_register (14),
2934                    (long) read_register (15));
2935
2936   printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
2937                    (long) read_register (tdep->A0G_REGNUM) & 0xff,
2938                    (long) read_register (tdep->A0_REGNUM),
2939                    (long) read_register (tdep->M0_REGNUM),
2940                    (long) read_register (tdep->X0_REGNUM),
2941                    (long) read_register (tdep->Y0_REGNUM),
2942                    (long) read_register (tdep->RS_REGNUM),
2943                    (long) read_register (tdep->MOD_REGNUM));
2944   printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
2945                    (long) read_register (tdep->A1G_REGNUM) & 0xff,
2946                    (long) read_register (tdep->A1_REGNUM),
2947                    (long) read_register (tdep->M1_REGNUM),
2948                    (long) read_register (tdep->X1_REGNUM),
2949                    (long) read_register (tdep->Y1_REGNUM),
2950                    (long) read_register (tdep->RE_REGNUM));
2951 }
2952
2953 static void
2954 sh64_show_media_regs (void)
2955 {
2956   int i;
2957   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2958
2959   printf_filtered ("PC=%s SR=%016llx \n",
2960                    paddr (read_register (PC_REGNUM)),
2961                    (long long) read_register (tdep->SR_REGNUM));
2962
2963   printf_filtered ("SSR=%016llx SPC=%016llx \n",
2964                    (long long) read_register (tdep->SSR_REGNUM),
2965                    (long long) read_register (tdep->SPC_REGNUM));
2966   printf_filtered ("FPSCR=%016lx\n ",
2967                    (long) read_register (tdep->FPSCR_REGNUM));
2968
2969   for (i = 0; i < 64; i = i + 4)
2970     printf_filtered ("\nR%d-R%d  %016llx %016llx %016llx %016llx\n",
2971                      i, i + 3,
2972                      (long long) read_register (i + 0),
2973                      (long long) read_register (i + 1),
2974                      (long long) read_register (i + 2),
2975                      (long long) read_register (i + 3));
2976
2977   printf_filtered ("\n");
2978   
2979   for (i = 0; i < 64; i = i + 8)
2980     printf_filtered ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2981                      i, i + 7,
2982                      (long) read_register (FP0_REGNUM + i + 0),
2983                      (long) read_register (FP0_REGNUM + i + 1),
2984                      (long) read_register (FP0_REGNUM + i + 2),
2985                      (long) read_register (FP0_REGNUM + i + 3),
2986                      (long) read_register (FP0_REGNUM + i + 4),
2987                      (long) read_register (FP0_REGNUM + i + 5),
2988                      (long) read_register (FP0_REGNUM + i + 6),
2989                      (long) read_register (FP0_REGNUM + i + 7));
2990 }
2991
2992 static void
2993 sh64_show_compact_regs (void)
2994 {
2995   int i;
2996   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
2997
2998   printf_filtered ("PC=%s \n",
2999                    paddr (read_register (tdep->PC_C_REGNUM)));
3000
3001   printf_filtered ("GBR=%08lx MACH=%08lx MACL=%08lx PR=%08lx T=%08lx\n",
3002                    (long) read_register (tdep->GBR_C_REGNUM),
3003                    (long) read_register (tdep->MACH_C_REGNUM),
3004                    (long) read_register (tdep->MACL_C_REGNUM),
3005                    (long) read_register (tdep->PR_C_REGNUM),
3006                    (long) read_register (tdep->T_C_REGNUM));
3007   printf_filtered ("FPSCR=%08lx FPUL=%08lx\n",
3008                    (long) read_register (tdep->FPSCR_REGNUM),
3009                    (long) read_register (tdep->FPUL_REGNUM));
3010
3011   for (i = 0; i < 16; i = i + 4)
3012     printf_filtered ("\nR%d-R%d  %08lx %08lx %08lx %08lx\n",
3013                      i, i + 3,
3014                      (long) read_register (i + 0),
3015                      (long) read_register (i + 1),
3016                      (long) read_register (i + 2),
3017                      (long) read_register (i + 3));
3018
3019   printf_filtered ("\n");
3020   
3021   for (i = 0; i < 16; i = i + 8)
3022     printf_filtered ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
3023                      i, i + 7,
3024                      (long) read_register (FP0_REGNUM + i + 0),
3025                      (long) read_register (FP0_REGNUM + i + 1),
3026                      (long) read_register (FP0_REGNUM + i + 2),
3027                      (long) read_register (FP0_REGNUM + i + 3),
3028                      (long) read_register (FP0_REGNUM + i + 4),
3029                      (long) read_register (FP0_REGNUM + i + 5),
3030                      (long) read_register (FP0_REGNUM + i + 6),
3031                      (long) read_register (FP0_REGNUM + i + 7));
3032 }
3033
3034 /*FIXME!!! This only shows the registers for shmedia, excluding the
3035   pseudo registers. */
3036 static void
3037 sh64_show_regs (void)
3038 {
3039   if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
3040     sh64_show_media_regs ();
3041   else
3042     sh64_show_compact_regs ();
3043 }
3044
3045 static void
3046 sh_show_regs_command (char *args, int from_tty)
3047 {
3048   if (sh_show_regs)
3049     (*sh_show_regs)();
3050 }
3051
3052 /* *INDENT-OFF* */
3053 /*
3054     SH MEDIA MODE (ISA 32)
3055     general registers (64-bit) 0-63
3056 0    r0,   r1,   r2,   r3,   r4,   r5,   r6,   r7,
3057 64   r8,   r9,   r10,  r11,  r12,  r13,  r14,  r15,
3058 128  r16,  r17,  r18,  r19,  r20,  r21,  r22,  r23,
3059 192  r24,  r25,  r26,  r27,  r28,  r29,  r30,  r31,
3060 256  r32,  r33,  r34,  r35,  r36,  r37,  r38,  r39,
3061 320  r40,  r41,  r42,  r43,  r44,  r45,  r46,  r47,
3062 384  r48,  r49,  r50,  r51,  r52,  r53,  r54,  r55,
3063 448  r56,  r57,  r58,  r59,  r60,  r61,  r62,  r63,
3064
3065     pc (64-bit) 64
3066 512  pc,
3067
3068     status reg., saved status reg., saved pc reg. (64-bit) 65-67
3069 520  sr,  ssr,  spc,
3070
3071     target registers (64-bit) 68-75
3072 544  tr0,  tr1,  tr2,  tr3,  tr4,  tr5,  tr6,  tr7,
3073
3074     floating point state control register (32-bit) 76
3075 608  fpscr,
3076
3077     single precision floating point registers (32-bit) 77-140
3078 612  fr0,  fr1,  fr2,  fr3,  fr4,  fr5,  fr6,  fr7,
3079 644  fr8,  fr9,  fr10, fr11, fr12, fr13, fr14, fr15,
3080 676  fr16, fr17, fr18, fr19, fr20, fr21, fr22, fr23,
3081 708  fr24, fr25, fr26, fr27, fr28, fr29, fr30, fr31,
3082 740  fr32, fr33, fr34, fr35, fr36, fr37, fr38, fr39,
3083 772  fr40, fr41, fr42, fr43, fr44, fr45, fr46, fr47,
3084 804  fr48, fr49, fr50, fr51, fr52, fr53, fr54, fr55,
3085 836  fr56, fr57, fr58, fr59, fr60, fr61, fr62, fr63,
3086
3087 TOTAL SPACE FOR REGISTERS: 868 bytes
3088
3089 From here on they are all pseudo registers: no memory allocated.
3090 REGISTER_BYTE returns the register byte for the base register.
3091
3092     double precision registers (pseudo) 141-172
3093      dr0,  dr2,  dr4,  dr6,  dr8,  dr10, dr12, dr14,
3094      dr16, dr18, dr20, dr22, dr24, dr26, dr28, dr30,
3095      dr32, dr34, dr36, dr38, dr40, dr42, dr44, dr46,
3096      dr48, dr50, dr52, dr54, dr56, dr58, dr60, dr62,
3097  
3098     floating point pairs (pseudo) 173-204
3099      fp0,  fp2,  fp4,  fp6,  fp8,  fp10, fp12, fp14,
3100      fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30,
3101      fp32, fp34, fp36, fp38, fp40, fp42, fp44, fp46,
3102      fp48, fp50, fp52, fp54, fp56, fp58, fp60, fp62,
3103  
3104     floating point vectors (4 floating point regs) (pseudo) 205-220
3105      fv0,  fv4,  fv8,  fv12, fv16, fv20, fv24, fv28,
3106      fv32, fv36, fv40, fv44, fv48, fv52, fv56, fv60,
3107  
3108     SH COMPACT MODE (ISA 16) (all pseudo) 221-272
3109      r0_c, r1_c, r2_c,  r3_c,  r4_c,  r5_c,  r6_c,  r7_c,
3110      r8_c, r9_c, r10_c, r11_c, r12_c, r13_c, r14_c, r15_c,
3111      pc_c,
3112      gbr_c, mach_c, macl_c, pr_c, t_c,
3113      fpscr_c, fpul_c,
3114      fr0_c, fr1_c, fr2_c,  fr3_c,  fr4_c,  fr5_c,  fr6_c,  fr7_c,
3115      fr8_c, fr9_c, fr10_c, fr11_c, fr12_c, fr13_c, fr14_c, fr15_c
3116      dr0_c, dr2_c, dr4_c,  dr6_c,  dr8_c,  dr10_c, dr12_c, dr14_c
3117      fv0_c, fv4_c, fv8_c,  fv12_c
3118 */
3119 /* *INDENT-ON* */
3120 static int
3121 sh_sh64_register_byte (int reg_nr)
3122 {
3123   int base_regnum = -1;
3124   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3125
3126   /* If it is a pseudo register, get the number of the first floating
3127      point register that is part of it. */
3128   if (reg_nr >= tdep->DR0_REGNUM 
3129       && reg_nr <= tdep->DR_LAST_REGNUM)
3130     base_regnum = dr_reg_base_num (reg_nr);
3131
3132   else if (reg_nr >= tdep->FPP0_REGNUM 
3133             && reg_nr <= tdep->FPP_LAST_REGNUM)
3134     base_regnum = fpp_reg_base_num (reg_nr);
3135
3136   else if (reg_nr >= tdep->FV0_REGNUM 
3137             && reg_nr <= tdep->FV_LAST_REGNUM)
3138     base_regnum = fv_reg_base_num (reg_nr);
3139
3140   /* sh compact pseudo register. FPSCR is a pathological case, need to
3141      treat it as special. */
3142   else if ((reg_nr >= tdep->R0_C_REGNUM 
3143             && reg_nr <= tdep->FV_LAST_C_REGNUM) 
3144            && reg_nr != tdep->FPSCR_C_REGNUM)
3145     base_regnum = sh64_compact_reg_base_num (reg_nr);
3146
3147   /* Now return the offset in bytes within the register cache. */
3148   /* sh media pseudo register, i.e. any of DR, FFP, FV registers. */
3149   if (reg_nr >= tdep->DR0_REGNUM 
3150       && reg_nr <= tdep->FV_LAST_REGNUM)
3151     return (base_regnum - FP0_REGNUM + 1) * 4 
3152       + (tdep->TR7_REGNUM + 1) * 8;
3153
3154   /* sh compact pseudo register: general register */
3155   if ((reg_nr >= tdep->R0_C_REGNUM 
3156        && reg_nr <= tdep->R_LAST_C_REGNUM))
3157     return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3158             ? base_regnum * 8 + 4
3159             : base_regnum * 8);
3160
3161   /* sh compact pseudo register: */
3162   if (reg_nr == tdep->PC_C_REGNUM 
3163        || reg_nr == tdep->GBR_C_REGNUM
3164        || reg_nr == tdep->MACL_C_REGNUM
3165        || reg_nr == tdep->PR_C_REGNUM)
3166     return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3167             ? base_regnum * 8 + 4
3168             : base_regnum * 8);
3169
3170   if (reg_nr == tdep->MACH_C_REGNUM) 
3171     return base_regnum * 8;
3172
3173   if (reg_nr == tdep->T_C_REGNUM) 
3174     return base_regnum * 8; /* FIXME??? how do we get bit 0? Do we have to? */
3175
3176   /* sh compact pseudo register: floating point register */
3177   else if (reg_nr >=tdep->FP0_C_REGNUM
3178            && reg_nr <= tdep->FV_LAST_C_REGNUM)
3179     return (base_regnum  - FP0_REGNUM) * 4
3180       + (tdep->TR7_REGNUM + 1) * 8 + 4;
3181
3182   else if (reg_nr == tdep->FPSCR_C_REGNUM)
3183     /* This is complicated, for now return the beginning of the
3184        architectural FPSCR register. */
3185     return (tdep->TR7_REGNUM + 1) * 8;
3186
3187   else if (reg_nr == tdep->FPUL_C_REGNUM)
3188     return ((base_regnum - FP0_REGNUM) * 4 + 
3189             (tdep->TR7_REGNUM + 1) * 8 + 4);
3190
3191   /* It is not a pseudo register. */
3192   /* It is a 64 bit register. */
3193   else if (reg_nr <= tdep->TR7_REGNUM)
3194     return reg_nr * 8;
3195
3196   /* It is a 32 bit register. */
3197   else
3198     if (reg_nr == tdep->FPSCR_REGNUM)
3199       return (tdep->FPSCR_REGNUM * 8);
3200
3201   /* It is floating point 32-bit register */
3202   else
3203     return ((tdep->TR7_REGNUM + 1) * 8 
3204       + (reg_nr - FP0_REGNUM + 1) * 4);
3205 }
3206
3207 static int
3208 sh_sh64_register_raw_size (int reg_nr)
3209 {
3210   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3211
3212   if ((reg_nr >= tdep->DR0_REGNUM 
3213        && reg_nr <= tdep->DR_LAST_REGNUM)
3214       || (reg_nr >= tdep->FPP0_REGNUM 
3215           && reg_nr <= tdep->FPP_LAST_REGNUM)
3216       || (reg_nr >= tdep->DR0_C_REGNUM 
3217           && reg_nr <= tdep->DR_LAST_C_REGNUM)
3218       || (reg_nr <= tdep->TR7_REGNUM))
3219     return 8;
3220
3221   else if ((reg_nr >= tdep->FV0_REGNUM 
3222             && reg_nr <= tdep->FV_LAST_REGNUM)
3223            || (reg_nr >= tdep->FV0_C_REGNUM 
3224                && reg_nr <= tdep->FV_LAST_C_REGNUM))
3225     return 16;
3226
3227   else /* this covers also the 32-bit SH compact registers. */
3228     return 4;
3229 }
3230
3231 /* ??????? FIXME */
3232 static int
3233 sh_sh64_register_virtual_size (int reg_nr)
3234 {
3235   if (reg_nr >= FP0_REGNUM
3236       && reg_nr <= gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM)
3237     return 4;
3238   else
3239     return 8;
3240 }
3241
3242 /* Return the GDB type object for the "standard" data type
3243    of data in register N.  */
3244 static struct type *
3245 sh_sh3e_register_type (struct gdbarch *gdbarch, int reg_nr)
3246 {
3247   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3248
3249   if ((reg_nr >= FP0_REGNUM
3250        && (reg_nr <= tdep->FP_LAST_REGNUM)) 
3251       || (reg_nr == tdep->FPUL_REGNUM))
3252     return builtin_type_float;
3253   else
3254     return builtin_type_int;
3255 }
3256
3257 static struct type *
3258 sh_sh4_build_float_register_type (int high)
3259 {
3260   struct type *temp;
3261
3262   temp = create_range_type (NULL, builtin_type_int, 0, high);
3263   return create_array_type (NULL, builtin_type_float, temp);
3264 }
3265
3266 static struct type *
3267 sh_sh4_register_type (struct gdbarch *gdbarch, int reg_nr)
3268 {
3269   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
3270
3271   if ((reg_nr >= FP0_REGNUM
3272        && (reg_nr <= tdep->FP_LAST_REGNUM)) 
3273       || (reg_nr == tdep->FPUL_REGNUM))
3274     return builtin_type_float;
3275   else if (reg_nr >= tdep->DR0_REGNUM 
3276            && reg_nr <= tdep->DR_LAST_REGNUM)
3277     return builtin_type_double;
3278   else if  (reg_nr >= tdep->FV0_REGNUM 
3279            && reg_nr <= tdep->FV_LAST_REGNUM)
3280     return sh_sh4_build_float_register_type (3);
3281   else
3282     return builtin_type_int;
3283 }
3284
3285 static struct type *
3286 sh_sh64_register_virtual_type (int reg_nr)
3287 {
3288   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3289
3290   if ((reg_nr >= FP0_REGNUM
3291        && reg_nr <= tdep->FP_LAST_REGNUM)
3292       || (reg_nr >= tdep->FP0_C_REGNUM
3293           && reg_nr <= tdep->FP_LAST_C_REGNUM))
3294     return builtin_type_float;
3295   else if ((reg_nr >= tdep->DR0_REGNUM 
3296             && reg_nr <= tdep->DR_LAST_REGNUM)
3297            || (reg_nr >= tdep->DR0_C_REGNUM 
3298                && reg_nr <= tdep->DR_LAST_C_REGNUM))
3299     return builtin_type_double;
3300   else if  (reg_nr >= tdep->FPP0_REGNUM 
3301             && reg_nr <= tdep->FPP_LAST_REGNUM)
3302     return sh_sh4_build_float_register_type (1);
3303   else if ((reg_nr >= tdep->FV0_REGNUM
3304             && reg_nr <= tdep->FV_LAST_REGNUM)
3305            ||(reg_nr >= tdep->FV0_C_REGNUM 
3306               && reg_nr <= tdep->FV_LAST_C_REGNUM))
3307     return sh_sh4_build_float_register_type (3);
3308   else if (reg_nr == tdep->FPSCR_REGNUM)
3309     return builtin_type_int;
3310   else if (reg_nr >= tdep->R0_C_REGNUM
3311            && reg_nr < tdep->FP0_C_REGNUM)
3312     return builtin_type_int;
3313   else
3314     return builtin_type_long_long;
3315 }
3316
3317 static struct type *
3318 sh_default_register_type (struct gdbarch *gdbarch, int reg_nr)
3319 {
3320   return builtin_type_int;
3321 }
3322
3323 /* On the sh4, the DRi pseudo registers are problematic if the target
3324    is little endian. When the user writes one of those registers, for
3325    instance with 'ser var $dr0=1', we want the double to be stored
3326    like this: 
3327    fr0 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f 
3328    fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
3329
3330    This corresponds to little endian byte order & big endian word
3331    order.  However if we let gdb write the register w/o conversion, it
3332    will write fr0 and fr1 this way:
3333    fr0 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3334    fr1 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f
3335    because it will consider fr0 and fr1 as a single LE stretch of memory.
3336    
3337    To achieve what we want we must force gdb to store things in
3338    floatformat_ieee_double_littlebyte_bigword (which is defined in
3339    include/floatformat.h and libiberty/floatformat.c.
3340
3341    In case the target is big endian, there is no problem, the
3342    raw bytes will look like:
3343    fr0 = 0x3f 0xf0 0x00 0x00 0x00 0x00 0x00
3344    fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
3345
3346    The other pseudo registers (the FVs) also don't pose a problem
3347    because they are stored as 4 individual FP elements. */
3348
3349 static void
3350 sh_sh4_register_convert_to_virtual (int regnum, struct type *type,
3351                                   char *from, char *to)
3352 {
3353   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3354
3355   if (regnum >= tdep->DR0_REGNUM 
3356       && regnum <= tdep->DR_LAST_REGNUM)
3357     {
3358       DOUBLEST val;
3359       floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
3360       store_typed_floating (to, type, val);
3361     }
3362   else
3363     error ("sh_register_convert_to_virtual called with non DR register number");
3364 }
3365
3366 static void
3367 sh_sh64_register_convert_to_virtual (int regnum, struct type *type,
3368                                      char *from, char *to)
3369 {
3370   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3371
3372   if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3373     {
3374       /* It is a no-op. */
3375       memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3376       return;
3377     }
3378
3379   if ((regnum >= tdep->DR0_REGNUM 
3380        && regnum <= tdep->DR_LAST_REGNUM)
3381       || (regnum >= tdep->DR0_C_REGNUM 
3382           && regnum <= tdep->DR_LAST_C_REGNUM))
3383     {
3384       DOUBLEST val;
3385       floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
3386       deprecated_store_floating(to, TYPE_LENGTH(type), val);
3387     }
3388   else
3389     error("sh_register_convert_to_virtual called with non DR register number");
3390 }
3391
3392 static void
3393 sh_sh4_register_convert_to_raw (struct type *type, int regnum,
3394                                 const void *from, void *to)
3395 {
3396   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3397
3398   if (regnum >= tdep->DR0_REGNUM 
3399       && regnum <= tdep->DR_LAST_REGNUM)
3400     {
3401       DOUBLEST val = extract_typed_floating (from, type);
3402       floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3403     }
3404   else
3405     error("sh_register_convert_to_raw called with non DR register number");
3406 }
3407
3408 static void
3409 sh_sh64_register_convert_to_raw (struct type *type, int regnum,
3410                                  const void *from, void *to)
3411 {
3412   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
3413
3414   if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3415     {
3416       /* It is a no-op. */
3417       memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3418       return;
3419     }
3420
3421   if ((regnum >= tdep->DR0_REGNUM 
3422        && regnum <= tdep->DR_LAST_REGNUM)
3423       || (regnum >= tdep->DR0_C_REGNUM 
3424           && regnum <= tdep->DR_LAST_C_REGNUM))
3425     {
3426       DOUBLEST val = deprecated_extract_floating (from, TYPE_LENGTH(type));
3427       floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3428     }
3429   else
3430     error("sh_register_convert_to_raw called with non DR register number");
3431 }
3432
3433 static void
3434 sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3435                          int reg_nr, void *buffer)
3436 {
3437   int base_regnum, portion;
3438   char temp_buffer[MAX_REGISTER_SIZE];
3439   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
3440
3441   if (reg_nr >= tdep->DR0_REGNUM 
3442       && reg_nr <= tdep->DR_LAST_REGNUM)
3443     {
3444       base_regnum = dr_reg_base_num (reg_nr);
3445
3446       /* Build the value in the provided buffer. */ 
3447       /* Read the real regs for which this one is an alias.  */
3448       for (portion = 0; portion < 2; portion++)
3449         regcache_raw_read (regcache, base_regnum + portion, 
3450                            (temp_buffer
3451                             + register_size (gdbarch, base_regnum) * portion));
3452       /* We must pay attention to the endiannes. */
3453       sh_sh4_register_convert_to_virtual (reg_nr,
3454                                           gdbarch_register_type (gdbarch, reg_nr),
3455                                           temp_buffer, buffer);
3456     }
3457   else if (reg_nr >= tdep->FV0_REGNUM 
3458            && reg_nr <= tdep->FV_LAST_REGNUM)
3459     {
3460       base_regnum = fv_reg_base_num (reg_nr);
3461
3462       /* Read the real regs for which this one is an alias.  */
3463       for (portion = 0; portion < 4; portion++)
3464         regcache_raw_read (regcache, base_regnum + portion, 
3465                            ((char *) buffer
3466                             + register_size (gdbarch, base_regnum) * portion));
3467     }
3468 }
3469
3470 static void
3471 sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3472                            int reg_nr, void *buffer)
3473 {
3474   int base_regnum;
3475   int portion;
3476   int offset = 0;
3477   char temp_buffer[MAX_REGISTER_SIZE];
3478   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
3479
3480   if (reg_nr >= tdep->DR0_REGNUM 
3481       && reg_nr <= tdep->DR_LAST_REGNUM)
3482     {
3483       base_regnum = dr_reg_base_num (reg_nr);
3484
3485       /* Build the value in the provided buffer. */ 
3486       /* DR regs are double precision registers obtained by
3487          concatenating 2 single precision floating point registers. */
3488       for (portion = 0; portion < 2; portion++)
3489         regcache_raw_read (regcache, base_regnum + portion, 
3490                            (temp_buffer
3491                             + REGISTER_RAW_SIZE (base_regnum) * portion));
3492
3493       /* We must pay attention to the endiannes. */
3494       sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3495                                            temp_buffer, buffer);
3496
3497     }
3498
3499   else if (reg_nr >= tdep->FPP0_REGNUM 
3500            && reg_nr <= tdep->FPP_LAST_REGNUM)
3501     {
3502       base_regnum = fpp_reg_base_num (reg_nr);
3503
3504       /* Build the value in the provided buffer. */ 
3505       /* FPP regs are pairs of single precision registers obtained by
3506          concatenating 2 single precision floating point registers. */
3507       for (portion = 0; portion < 2; portion++)
3508         regcache_raw_read (regcache, base_regnum + portion, 
3509                            ((char *) buffer
3510                             + REGISTER_RAW_SIZE (base_regnum) * portion));
3511     }
3512
3513   else if (reg_nr >= tdep->FV0_REGNUM 
3514            && reg_nr <= tdep->FV_LAST_REGNUM)
3515     {
3516       base_regnum = fv_reg_base_num (reg_nr);
3517
3518       /* Build the value in the provided buffer. */ 
3519       /* FV regs are vectors of single precision registers obtained by
3520          concatenating 4 single precision floating point registers. */
3521       for (portion = 0; portion < 4; portion++)
3522         regcache_raw_read (regcache, base_regnum + portion, 
3523                            ((char *) buffer
3524                             + REGISTER_RAW_SIZE (base_regnum) * portion));
3525     }
3526
3527   /* sh compact pseudo registers. 1-to-1 with a shmedia register */
3528   else if (reg_nr >= tdep->R0_C_REGNUM 
3529            && reg_nr <= tdep->T_C_REGNUM)
3530     {
3531       base_regnum = sh64_compact_reg_base_num (reg_nr);
3532
3533       /* Build the value in the provided buffer. */ 
3534       regcache_raw_read (regcache, base_regnum, temp_buffer);
3535       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3536         offset = 4;
3537       memcpy (buffer, temp_buffer + offset, 4); /* get LOWER 32 bits only????*/
3538     }
3539
3540   else if (reg_nr >= tdep->FP0_C_REGNUM
3541            && reg_nr <= tdep->FP_LAST_C_REGNUM)
3542     {
3543       base_regnum = sh64_compact_reg_base_num (reg_nr);
3544
3545       /* Build the value in the provided buffer. */ 
3546       /* Floating point registers map 1-1 to the media fp regs,
3547          they have the same size and endienness. */
3548       regcache_raw_read (regcache, base_regnum, buffer);
3549     }
3550
3551   else if (reg_nr >= tdep->DR0_C_REGNUM 
3552            && reg_nr <= tdep->DR_LAST_C_REGNUM)
3553     {
3554       base_regnum = sh64_compact_reg_base_num (reg_nr);
3555
3556       /* DR_C regs are double precision registers obtained by
3557          concatenating 2 single precision floating point registers. */
3558       for (portion = 0; portion < 2; portion++)
3559         regcache_raw_read (regcache, base_regnum + portion, 
3560                            (temp_buffer
3561                             + REGISTER_RAW_SIZE (base_regnum) * portion));
3562
3563       /* We must pay attention to the endiannes. */
3564       sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3565                                            temp_buffer, buffer);
3566     }
3567
3568   else if (reg_nr >= tdep->FV0_C_REGNUM 
3569            && reg_nr <= tdep->FV_LAST_C_REGNUM)
3570     {
3571       base_regnum = sh64_compact_reg_base_num (reg_nr);
3572
3573       /* Build the value in the provided buffer. */ 
3574       /* FV_C regs are vectors of single precision registers obtained by
3575          concatenating 4 single precision floating point registers. */
3576       for (portion = 0; portion < 4; portion++)
3577         regcache_raw_read (regcache, base_regnum + portion, 
3578                            ((char *) buffer
3579                             + REGISTER_RAW_SIZE (base_regnum) * portion));
3580     }
3581
3582   else if (reg_nr == tdep->FPSCR_C_REGNUM)
3583     {
3584       int fpscr_base_regnum;
3585       int sr_base_regnum;
3586       unsigned int fpscr_value;
3587       unsigned int sr_value;
3588       unsigned int fpscr_c_value;
3589       unsigned int fpscr_c_part1_value;
3590       unsigned int fpscr_c_part2_value;
3591
3592       fpscr_base_regnum = tdep->FPSCR_REGNUM;
3593       sr_base_regnum = tdep->SR_REGNUM;
3594
3595       /* Build the value in the provided buffer. */ 
3596       /* FPSCR_C is a very weird register that contains sparse bits
3597          from the FPSCR and the SR architectural registers.
3598          Specifically: */
3599       /* *INDENT-OFF* */
3600       /*
3601          FPSRC_C bit
3602             0         Bit 0 of FPSCR
3603             1         reserved
3604             2-17      Bit 2-18 of FPSCR
3605             18-20     Bits 12,13,14 of SR
3606             21-31     reserved
3607        */
3608       /* *INDENT-ON* */
3609       /* Get FPSCR into a local buffer */
3610       regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
3611       /* Get value as an int. */
3612       fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3613       /* Get SR into a local buffer */
3614       regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
3615       /* Get value as an int. */
3616       sr_value = extract_unsigned_integer (temp_buffer, 4);
3617       /* Build the new value. */
3618       fpscr_c_part1_value = fpscr_value & 0x3fffd;
3619       fpscr_c_part2_value = (sr_value & 0x7000) << 6;
3620       fpscr_c_value = fpscr_c_part1_value | fpscr_c_part2_value;
3621       /* Store that in out buffer!!! */
3622       store_unsigned_integer (buffer, 4, fpscr_c_value);
3623       /* FIXME There is surely an endianness gotcha here. */
3624     }
3625
3626   else if (reg_nr == tdep->FPUL_C_REGNUM)
3627     {
3628       base_regnum = sh64_compact_reg_base_num (reg_nr);
3629
3630       /* FPUL_C register is floating point register 32,
3631          same size, same endianness. */
3632       regcache_raw_read (regcache, base_regnum, buffer);
3633     }
3634 }
3635
3636 static void
3637 sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3638                           int reg_nr, const void *buffer)
3639 {
3640   int base_regnum, portion;
3641   char temp_buffer[MAX_REGISTER_SIZE];
3642   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
3643
3644   if (reg_nr >= tdep->DR0_REGNUM
3645       && reg_nr <= tdep->DR_LAST_REGNUM)
3646     {
3647       base_regnum = dr_reg_base_num (reg_nr);
3648
3649       /* We must pay attention to the endiannes. */
3650       sh_sh4_register_convert_to_raw (gdbarch_register_type (gdbarch, reg_nr), reg_nr,
3651                                       buffer, temp_buffer);
3652
3653       /* Write the real regs for which this one is an alias.  */
3654       for (portion = 0; portion < 2; portion++)
3655         regcache_raw_write (regcache, base_regnum + portion, 
3656                             (temp_buffer
3657                              + register_size (gdbarch, base_regnum) * portion));
3658     }
3659   else if (reg_nr >= tdep->FV0_REGNUM
3660            && reg_nr <= tdep->FV_LAST_REGNUM)
3661     {
3662       base_regnum = fv_reg_base_num (reg_nr);
3663
3664       /* Write the real regs for which this one is an alias.  */
3665       for (portion = 0; portion < 4; portion++)
3666         regcache_raw_write (regcache, base_regnum + portion,
3667                             ((char *) buffer
3668                              + register_size (gdbarch, base_regnum) * portion));
3669     }
3670 }
3671
3672 static void
3673 sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3674                             int reg_nr, const void *buffer)
3675 {
3676   int base_regnum, portion;
3677   int offset;
3678   char temp_buffer[MAX_REGISTER_SIZE];
3679   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3680
3681   if (reg_nr >= tdep->DR0_REGNUM
3682       && reg_nr <= tdep->DR_LAST_REGNUM)
3683     {
3684       base_regnum = dr_reg_base_num (reg_nr);
3685       /* We must pay attention to the endiannes. */
3686       sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3687                                        buffer, temp_buffer);
3688           
3689
3690       /* Write the real regs for which this one is an alias.  */
3691       for (portion = 0; portion < 2; portion++)
3692         regcache_raw_write (regcache, base_regnum + portion, 
3693                             (temp_buffer
3694                              + REGISTER_RAW_SIZE (base_regnum) * portion));
3695     }
3696
3697   else if (reg_nr >= tdep->FPP0_REGNUM 
3698            && reg_nr <= tdep->FPP_LAST_REGNUM)
3699     {
3700       base_regnum = fpp_reg_base_num (reg_nr);
3701
3702       /* Write the real regs for which this one is an alias.  */
3703       for (portion = 0; portion < 2; portion++)
3704         regcache_raw_write (regcache, base_regnum + portion,
3705                             ((char *) buffer
3706                              + REGISTER_RAW_SIZE (base_regnum) * portion));
3707     }
3708
3709   else if (reg_nr >= tdep->FV0_REGNUM
3710            && reg_nr <= tdep->FV_LAST_REGNUM)
3711     {
3712       base_regnum = fv_reg_base_num (reg_nr);
3713
3714       /* Write the real regs for which this one is an alias.  */
3715       for (portion = 0; portion < 4; portion++)
3716         regcache_raw_write (regcache, base_regnum + portion,
3717                             ((char *) buffer
3718                              + REGISTER_RAW_SIZE (base_regnum) * portion));
3719     }
3720
3721   /* sh compact general pseudo registers. 1-to-1 with a shmedia
3722      register but only 4 bytes of it.  */
3723   else if (reg_nr >= tdep->R0_C_REGNUM 
3724            && reg_nr <= tdep->T_C_REGNUM)
3725     {
3726       base_regnum = sh64_compact_reg_base_num (reg_nr);
3727       /* reg_nr is 32 bit here, and base_regnum is 64 bits. */
3728       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3729         offset = 4;
3730       else 
3731         offset = 0;
3732       /* Let's read the value of the base register into a temporary
3733          buffer, so that overwriting the last four bytes with the new
3734          value of the pseudo will leave the upper 4 bytes unchanged. */
3735       regcache_raw_read (regcache, base_regnum, temp_buffer);
3736       /* Write as an 8 byte quantity */
3737       memcpy (temp_buffer + offset, buffer, 4);
3738       regcache_raw_write (regcache, base_regnum, temp_buffer);
3739     }
3740
3741   /* sh floating point compact pseudo registers. 1-to-1 with a shmedia
3742      registers. Both are 4 bytes. */
3743   else if (reg_nr >= tdep->FP0_C_REGNUM
3744                && reg_nr <= tdep->FP_LAST_C_REGNUM)
3745     {
3746       base_regnum = sh64_compact_reg_base_num (reg_nr);
3747       regcache_raw_write (regcache, base_regnum, buffer);
3748     }
3749
3750   else if (reg_nr >= tdep->DR0_C_REGNUM 
3751            && reg_nr <= tdep->DR_LAST_C_REGNUM)
3752     {
3753       base_regnum = sh64_compact_reg_base_num (reg_nr);
3754       for (portion = 0; portion < 2; portion++)
3755         {
3756           /* We must pay attention to the endiannes. */
3757           sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3758                                            buffer, temp_buffer);
3759
3760           regcache_raw_write (regcache, base_regnum + portion,
3761                               (temp_buffer
3762                                + REGISTER_RAW_SIZE (base_regnum) * portion));
3763         }
3764     }
3765
3766   else if (reg_nr >= tdep->FV0_C_REGNUM 
3767            && reg_nr <= tdep->FV_LAST_C_REGNUM)
3768     {
3769       base_regnum = sh64_compact_reg_base_num (reg_nr);
3770      
3771       for (portion = 0; portion < 4; portion++)
3772         {
3773           regcache_raw_write (regcache, base_regnum + portion,
3774                               ((char *) buffer
3775                                + REGISTER_RAW_SIZE (base_regnum) * portion));
3776         }
3777     }
3778
3779   else if (reg_nr == tdep->FPSCR_C_REGNUM)
3780     {      
3781       int fpscr_base_regnum;
3782       int sr_base_regnum;
3783       unsigned int fpscr_value;
3784       unsigned int sr_value;
3785       unsigned int old_fpscr_value;
3786       unsigned int old_sr_value;
3787       unsigned int fpscr_c_value;
3788       unsigned int fpscr_mask;
3789       unsigned int sr_mask;
3790
3791       fpscr_base_regnum = tdep->FPSCR_REGNUM;
3792       sr_base_regnum = tdep->SR_REGNUM;
3793
3794       /* FPSCR_C is a very weird register that contains sparse bits
3795          from the FPSCR and the SR architectural registers.
3796          Specifically: */
3797       /* *INDENT-OFF* */
3798       /*
3799          FPSRC_C bit
3800             0         Bit 0 of FPSCR
3801             1         reserved
3802             2-17      Bit 2-18 of FPSCR
3803             18-20     Bits 12,13,14 of SR
3804             21-31     reserved
3805        */
3806       /* *INDENT-ON* */
3807       /* Get value as an int. */
3808       fpscr_c_value = extract_unsigned_integer (buffer, 4);
3809
3810       /* Build the new values. */
3811       fpscr_mask = 0x0003fffd;
3812       sr_mask = 0x001c0000;
3813        
3814       fpscr_value = fpscr_c_value & fpscr_mask;
3815       sr_value = (fpscr_value & sr_mask) >> 6;
3816       
3817       regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
3818       old_fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3819       old_fpscr_value &= 0xfffc0002;
3820       fpscr_value |= old_fpscr_value;
3821       store_unsigned_integer (temp_buffer, 4, fpscr_value);
3822       regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer);
3823       
3824       regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
3825       old_sr_value = extract_unsigned_integer (temp_buffer, 4);
3826       old_sr_value &= 0xffff8fff;
3827       sr_value |= old_sr_value;
3828       store_unsigned_integer (temp_buffer, 4, sr_value);
3829       regcache_raw_write (regcache, sr_base_regnum, temp_buffer);
3830     }
3831
3832   else if (reg_nr == tdep->FPUL_C_REGNUM)
3833     {
3834       base_regnum = sh64_compact_reg_base_num (reg_nr);
3835       regcache_raw_write (regcache, base_regnum, buffer);
3836     }
3837 }
3838
3839 /* Floating point vector of 4 float registers. */
3840 static void
3841 do_fv_register_info (struct gdbarch *gdbarch, struct ui_file *file,
3842                      int fv_regnum)
3843 {
3844   int first_fp_reg_num = fv_reg_base_num (fv_regnum);
3845   fprintf_filtered (file, "fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n", 
3846                      fv_regnum - gdbarch_tdep (gdbarch)->FV0_REGNUM, 
3847                      (int) read_register (first_fp_reg_num),
3848                      (int) read_register (first_fp_reg_num + 1),
3849                      (int) read_register (first_fp_reg_num + 2),
3850                      (int) read_register (first_fp_reg_num + 3));
3851 }
3852
3853 /* Floating point vector of 4 float registers, compact mode. */
3854 static void
3855 do_fv_c_register_info (int fv_regnum)
3856 {
3857   int first_fp_reg_num = sh64_compact_reg_base_num (fv_regnum);
3858   printf_filtered ("fv%d_c\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n", 
3859                      fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_C_REGNUM, 
3860                      (int) read_register (first_fp_reg_num),
3861                      (int) read_register (first_fp_reg_num + 1),
3862                      (int) read_register (first_fp_reg_num + 2),
3863                      (int) read_register (first_fp_reg_num + 3));
3864 }
3865
3866 /* Pairs of single regs. The DR are instead double precision
3867    registers. */
3868 static void
3869 do_fpp_register_info (int fpp_regnum)
3870 {
3871   int first_fp_reg_num = fpp_reg_base_num (fpp_regnum);
3872
3873   printf_filtered ("fpp%d\t0x%08x\t0x%08x\n", 
3874                     fpp_regnum - gdbarch_tdep (current_gdbarch)->FPP0_REGNUM, 
3875                     (int) read_register (first_fp_reg_num),
3876                     (int) read_register (first_fp_reg_num + 1));
3877 }
3878
3879 /* Double precision registers. */
3880 static void
3881 do_dr_register_info (struct gdbarch *gdbarch, struct ui_file *file,
3882                      int dr_regnum)
3883 {
3884   int first_fp_reg_num = dr_reg_base_num (dr_regnum);
3885
3886   fprintf_filtered (file, "dr%d\t0x%08x%08x\n", 
3887                     dr_regnum - gdbarch_tdep (gdbarch)->DR0_REGNUM, 
3888                     (int) read_register (first_fp_reg_num),
3889                     (int) read_register (first_fp_reg_num + 1));
3890 }
3891
3892 /* Double precision registers, compact mode. */
3893 static void
3894 do_dr_c_register_info (int dr_regnum)
3895 {
3896  int first_fp_reg_num = sh64_compact_reg_base_num (dr_regnum);
3897
3898  printf_filtered ("dr%d_c\t0x%08x%08x\n",
3899                   dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_C_REGNUM,
3900                   (int) read_register (first_fp_reg_num),
3901                   (int) read_register (first_fp_reg_num +1));
3902 }
3903
3904 /* General register in compact mode. */
3905 static void
3906 do_r_c_register_info (int r_c_regnum)
3907 {
3908   int regnum =  sh64_compact_reg_base_num (r_c_regnum);
3909
3910   printf_filtered ("r%d_c\t0x%08x\n", 
3911                     r_c_regnum - gdbarch_tdep (current_gdbarch)->R0_C_REGNUM, 
3912                    /*FIXME!!!*/  (int) read_register (regnum));
3913 }
3914
3915 /* FIXME:!! THIS SHOULD TAKE CARE OF GETTING THE RIGHT PORTION OF THE
3916    shmedia REGISTERS. */
3917 /* Control registers, compact mode. */
3918 static void
3919 do_cr_c_register_info (int cr_c_regnum)
3920 {
3921   switch (cr_c_regnum)
3922     {
3923     case 237: printf_filtered ("pc_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3924       break;
3925     case 238: printf_filtered ("gbr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3926       break;
3927     case 239: printf_filtered ("mach_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3928       break;
3929     case 240: printf_filtered ("macl_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3930       break;
3931     case 241: printf_filtered ("pr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3932       break;
3933     case 242: printf_filtered ("t_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3934       break;
3935     case 243: printf_filtered ("fpscr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3936       break;
3937     case 244: printf_filtered ("fpul_c\t0x%08x\n", (int)read_register (cr_c_regnum));
3938       break;
3939     }
3940 }
3941
3942 static void
3943 sh_print_pseudo_register (struct gdbarch *gdbarch, struct ui_file *file,
3944                           int regnum)
3945 {
3946   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 
3947
3948   if (regnum < NUM_REGS || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
3949     internal_error (__FILE__, __LINE__,
3950                     "Invalid pseudo register number %d\n", regnum);
3951   else if (regnum >= tdep->DR0_REGNUM
3952            && regnum <= tdep->DR_LAST_REGNUM)
3953     do_dr_register_info (gdbarch, file, regnum);
3954   else if (regnum >= tdep->FV0_REGNUM
3955            && regnum <= tdep->FV_LAST_REGNUM)
3956     do_fv_register_info (gdbarch, file, regnum);
3957 }
3958
3959 static void
3960 sh_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum)
3961 {                               /* do values for FP (float) regs */
3962   char *raw_buffer;
3963   double flt;   /* double extracted from raw hex data */
3964   int inv;
3965   int j;
3966
3967   /* Allocate space for the float. */
3968   raw_buffer = (char *) alloca (register_size (gdbarch, FP0_REGNUM));
3969
3970   /* Get the data in raw format.  */
3971   if (!frame_register_read (get_selected_frame (), regnum, raw_buffer))
3972     error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
3973
3974   /* Get the register as a number */ 
3975   flt = unpack_double (builtin_type_float, raw_buffer, &inv);
3976
3977   /* Print the name and some spaces. */
3978   fputs_filtered (REGISTER_NAME (regnum), file);
3979   print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), file);
3980
3981   /* Print the value. */
3982   if (inv)
3983     fprintf_filtered (file, "<invalid float>");
3984   else
3985     fprintf_filtered (file, "%-10.9g", flt);
3986
3987   /* Print the fp register as hex. */
3988   fprintf_filtered (file, "\t(raw 0x");
3989   for (j = 0; j < register_size (gdbarch, regnum); j++)
3990     {
3991       register int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
3992         : register_size (gdbarch, regnum) - 1 - j;
3993       fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
3994     }
3995   fprintf_filtered (file, ")");
3996   fprintf_filtered (file, "\n");
3997 }
3998
3999 static void
4000 sh64_do_pseudo_register (int regnum)
4001 {
4002   /* All the sh64-compact mode registers are pseudo registers. */
4003   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
4004
4005   if (regnum < NUM_REGS 
4006       || regnum >= NUM_REGS + NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT)
4007     internal_error (__FILE__, __LINE__,
4008                     "Invalid pseudo register number %d\n", regnum);
4009
4010   else if ((regnum >= tdep->DR0_REGNUM
4011             && regnum <= tdep->DR_LAST_REGNUM))
4012     do_dr_register_info (current_gdbarch, gdb_stdout, regnum);
4013
4014   else if ((regnum >= tdep->DR0_C_REGNUM
4015             && regnum <= tdep->DR_LAST_C_REGNUM))
4016     do_dr_c_register_info (regnum);
4017
4018   else if ((regnum >= tdep->FV0_REGNUM
4019             && regnum <= tdep->FV_LAST_REGNUM))
4020     do_fv_register_info (current_gdbarch, gdb_stdout, regnum);
4021            
4022   else if ((regnum >= tdep->FV0_C_REGNUM
4023             && regnum <= tdep->FV_LAST_C_REGNUM))
4024     do_fv_c_register_info (regnum);
4025
4026   else if (regnum >= tdep->FPP0_REGNUM
4027            && regnum <= tdep->FPP_LAST_REGNUM)
4028     do_fpp_register_info (regnum);
4029
4030   else if (regnum >= tdep->R0_C_REGNUM
4031            && regnum <= tdep->R_LAST_C_REGNUM)
4032     do_r_c_register_info (regnum); /* FIXME, this function will not print the right format */
4033
4034   else if (regnum >= tdep->FP0_C_REGNUM
4035            && regnum <= tdep->FP_LAST_C_REGNUM)
4036     sh_do_fp_register (current_gdbarch, gdb_stdout, regnum); /* this should work also for pseudoregs */
4037
4038   else if (regnum >= tdep->PC_C_REGNUM
4039            && regnum <= tdep->FPUL_C_REGNUM)
4040     do_cr_c_register_info (regnum);
4041
4042 }
4043
4044 static void
4045 sh_do_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum)
4046 {
4047   char raw_buffer[MAX_REGISTER_SIZE];
4048
4049   fputs_filtered (REGISTER_NAME (regnum), file);
4050   print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), file);
4051
4052   /* Get the data in raw format.  */
4053   if (!frame_register_read (get_selected_frame (), regnum, raw_buffer))
4054     fprintf_filtered (file, "*value not available*\n");
4055       
4056   val_print (gdbarch_register_type (gdbarch, regnum), raw_buffer, 0, 0,
4057              file, 'x', 1, 0, Val_pretty_default);
4058   fprintf_filtered (file, "\t");
4059   val_print (gdbarch_register_type (gdbarch, regnum), raw_buffer, 0, 0,
4060              file, 0, 1, 0, Val_pretty_default);
4061   fprintf_filtered (file, "\n");
4062 }
4063
4064 static void
4065 sh_print_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum)
4066 {
4067   if (regnum < 0 || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
4068     internal_error (__FILE__, __LINE__,
4069                     "Invalid register number %d\n", regnum);
4070
4071   else if (regnum >= 0 && regnum < NUM_REGS)
4072     {
4073       if (TYPE_CODE (gdbarch_register_type (gdbarch, regnum)) == TYPE_CODE_FLT)
4074         sh_do_fp_register (gdbarch, file, regnum);      /* FP regs */
4075       else
4076         sh_do_register (gdbarch, file, regnum); /* All other regs */
4077     }
4078
4079   else if (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4080     {
4081       if (gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_sh5)
4082         sh64_do_pseudo_register (regnum);
4083       else
4084         sh_print_pseudo_register (gdbarch, file, regnum);
4085     }
4086 }
4087
4088 static void
4089 sh_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
4090                          struct frame_info *frame, int regnum, int fpregs)
4091 {
4092   if (regnum != -1)             /* do one specified register */
4093     {
4094       if (*(REGISTER_NAME (regnum)) == '\0')
4095         error ("Not a valid register for the current processor type");
4096
4097       sh_print_register (gdbarch, file, regnum);
4098     }
4099   else
4100     /* do all (or most) registers */
4101     {
4102       regnum = 0;
4103       while (regnum < NUM_REGS)
4104         {
4105           /* If the register name is empty, it is undefined for this
4106              processor, so don't display anything.  */
4107           if (REGISTER_NAME (regnum) == NULL
4108               || *(REGISTER_NAME (regnum)) == '\0')
4109             { 
4110               regnum++;
4111               continue;
4112             }
4113
4114           if (TYPE_CODE (gdbarch_register_type (gdbarch, regnum)) == TYPE_CODE_FLT)
4115             {
4116               if (fpregs)
4117                 {
4118                   /* true for "INFO ALL-REGISTERS" command */
4119                   sh_do_fp_register (gdbarch, file, regnum);    /* FP regs */
4120                   regnum ++;
4121                 }
4122               else
4123                 regnum += (gdbarch_tdep (gdbarch)->FP_LAST_REGNUM - FP0_REGNUM);        /* skip FP regs */
4124             }
4125           else
4126             {
4127               sh_do_register (gdbarch, file, regnum);   /* All other regs */
4128               regnum++;
4129             }
4130         }
4131
4132       if (fpregs)
4133         while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4134           {
4135             if (gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_sh5)
4136               sh64_do_pseudo_register (regnum);
4137             else
4138               sh_print_pseudo_register (gdbarch, file, regnum);
4139             regnum++;
4140           }
4141     }
4142 }
4143
4144 static void
4145 sh_compact_do_registers_info (int regnum, int fpregs)
4146 {
4147   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
4148   if (regnum != -1)             /* do one specified register */
4149     {
4150       if (*(REGISTER_NAME (regnum)) == '\0')
4151         error ("Not a valid register for the current processor type");
4152
4153       if (regnum >= 0 && regnum < tdep->R0_C_REGNUM)
4154         error ("Not a valid register for the current processor mode.");
4155
4156       sh_print_register (current_gdbarch, gdb_stdout, regnum);
4157     }
4158   else
4159     /* do all compact registers */
4160     {
4161       regnum = tdep->R0_C_REGNUM;
4162       while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4163         {
4164           sh64_do_pseudo_register (regnum);
4165           regnum++;
4166         }
4167     }
4168 }
4169
4170 static void
4171 sh64_do_registers_info (int regnum, int fpregs)
4172 {
4173   if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
4174    sh_print_registers_info (current_gdbarch, gdb_stdout,
4175                             deprecated_selected_frame, regnum, fpregs);
4176   else
4177    sh_compact_do_registers_info (regnum, fpregs); 
4178 }
4179
4180 #ifdef SVR4_SHARED_LIBS
4181
4182 /* Fetch (and possibly build) an appropriate link_map_offsets structure
4183    for native i386 linux targets using the struct offsets defined in
4184    link.h (but without actual reference to that file).
4185
4186    This makes it possible to access i386-linux shared libraries from
4187    a gdb that was not built on an i386-linux host (for cross debugging).
4188    */
4189
4190 struct link_map_offsets *
4191 sh_linux_svr4_fetch_link_map_offsets (void)
4192 {
4193   static struct link_map_offsets lmo;
4194   static struct link_map_offsets *lmp = 0;
4195
4196   if (lmp == 0)
4197     {
4198       lmp = &lmo;
4199
4200       lmo.r_debug_size = 8;     /* 20 not actual size but all we need */
4201
4202       lmo.r_map_offset = 4;
4203       lmo.r_map_size   = 4;
4204
4205       lmo.link_map_size = 20;   /* 552 not actual size but all we need */
4206
4207       lmo.l_addr_offset = 0;
4208       lmo.l_addr_size   = 4;
4209
4210       lmo.l_name_offset = 4;
4211       lmo.l_name_size   = 4;
4212
4213       lmo.l_next_offset = 12;
4214       lmo.l_next_size   = 4;
4215
4216       lmo.l_prev_offset = 16;
4217       lmo.l_prev_size   = 4;
4218     }
4219
4220     return lmp;
4221 }
4222 #endif /* SVR4_SHARED_LIBS */
4223
4224 \f
4225 enum
4226 {
4227    DSP_DSR_REGNUM = 24,
4228    DSP_A0G_REGNUM,
4229    DSP_A0_REGNUM,
4230    DSP_A1G_REGNUM,
4231    DSP_A1_REGNUM,
4232    DSP_M0_REGNUM,
4233    DSP_M1_REGNUM,
4234    DSP_X0_REGNUM,
4235    DSP_X1_REGNUM,
4236    DSP_Y0_REGNUM,
4237    DSP_Y1_REGNUM,
4238  
4239    DSP_MOD_REGNUM = 40,
4240  
4241    DSP_RS_REGNUM = 43,
4242    DSP_RE_REGNUM,
4243  
4244    DSP_R0_BANK_REGNUM = 51,
4245    DSP_R7_BANK_REGNUM = DSP_R0_BANK_REGNUM + 7
4246 };
4247
4248 static int
4249 sh_dsp_register_sim_regno (int nr)
4250 {
4251   if (legacy_register_sim_regno (nr) < 0)
4252     return legacy_register_sim_regno (nr);
4253   if (nr >= DSP_DSR_REGNUM && nr <= DSP_Y1_REGNUM)
4254     return nr - DSP_DSR_REGNUM + SIM_SH_DSR_REGNUM;
4255   if (nr == DSP_MOD_REGNUM)
4256     return SIM_SH_MOD_REGNUM;
4257   if (nr == DSP_RS_REGNUM)
4258     return SIM_SH_RS_REGNUM;
4259   if (nr == DSP_RE_REGNUM)
4260     return SIM_SH_RE_REGNUM;
4261   if (nr >= DSP_R0_BANK_REGNUM && nr <= DSP_R7_BANK_REGNUM)
4262     return nr - DSP_R0_BANK_REGNUM + SIM_SH_R0_BANK_REGNUM;
4263   return nr;
4264 }
4265 \f
4266 static gdbarch_init_ftype sh_gdbarch_init;
4267
4268 static struct gdbarch *
4269 sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
4270 {
4271   static LONGEST sh64_call_dummy_words[] = {0};
4272   struct gdbarch *gdbarch;
4273   struct gdbarch_tdep *tdep;
4274
4275   /* If there is already a candidate, use it.  */
4276   arches = gdbarch_list_lookup_by_info (arches, &info);
4277   if (arches != NULL)
4278     return arches->gdbarch;
4279
4280   /* None found, create a new architecture from the information
4281      provided. */
4282   tdep = XMALLOC (struct gdbarch_tdep);
4283   gdbarch = gdbarch_alloc (&info, tdep);
4284
4285   /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
4286      ready to unwind the PC first (see frame.c:get_prev_frame()).  */
4287   set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
4288
4289   /* Initialize the register numbers that are not common to all the
4290      variants to -1, if necessary thse will be overwritten in the case
4291      statement below. */
4292   tdep->FPUL_REGNUM = -1;
4293   tdep->FPSCR_REGNUM = -1;
4294   tdep->PR_REGNUM = 17;
4295   tdep->SR_REGNUM = 22;
4296   tdep->DSR_REGNUM = -1;
4297   tdep->FP_LAST_REGNUM = -1;
4298   tdep->A0G_REGNUM = -1;
4299   tdep->A0_REGNUM = -1;
4300   tdep->A1G_REGNUM = -1;
4301   tdep->A1_REGNUM = -1;
4302   tdep->M0_REGNUM = -1;
4303   tdep->M1_REGNUM = -1;
4304   tdep->X0_REGNUM = -1;
4305   tdep->X1_REGNUM = -1;
4306   tdep->Y0_REGNUM = -1;
4307   tdep->Y1_REGNUM = -1;
4308   tdep->MOD_REGNUM = -1;
4309   tdep->RS_REGNUM = -1;
4310   tdep->RE_REGNUM = -1;
4311   tdep->SSR_REGNUM = -1;
4312   tdep->SPC_REGNUM = -1;
4313   tdep->DR0_REGNUM = -1;
4314   tdep->DR_LAST_REGNUM = -1;
4315   tdep->FV0_REGNUM = -1;
4316   tdep->FV_LAST_REGNUM = -1;
4317   tdep->ARG0_REGNUM = 4;
4318   tdep->ARGLAST_REGNUM = 7;
4319   tdep->RETURN_REGNUM = 0;
4320   tdep->FLOAT_ARGLAST_REGNUM = -1;
4321
4322   tdep->sh_abi = SH_ABI_UNKNOWN;
4323
4324   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
4325   set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4326   set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4327   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4328   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4329   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4330   set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4331   set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4332
4333   set_gdbarch_num_regs (gdbarch, SH_DEFAULT_NUM_REGS);
4334   set_gdbarch_sp_regnum (gdbarch, 15);
4335   set_gdbarch_deprecated_fp_regnum (gdbarch, 14);
4336   set_gdbarch_pc_regnum (gdbarch, 16);
4337   set_gdbarch_fp0_regnum (gdbarch, -1);
4338   set_gdbarch_num_pseudo_regs (gdbarch, 0);
4339
4340   set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
4341   set_gdbarch_use_struct_convention (gdbarch, sh_use_struct_convention);
4342
4343   set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh);
4344   set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno);
4345
4346   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
4347
4348   set_gdbarch_skip_prologue (gdbarch, sh_skip_prologue);
4349   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
4350   set_gdbarch_decr_pc_after_break (gdbarch, 0);
4351   set_gdbarch_function_start_offset (gdbarch, 0);
4352
4353   set_gdbarch_frame_args_skip (gdbarch, 0);
4354   set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue);
4355   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
4356
4357   skip_prologue_hard_way = sh_skip_prologue_hard_way;
4358
4359   set_gdbarch_deprecated_frame_chain (gdbarch, sh_frame_chain);
4360   set_gdbarch_deprecated_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
4361   set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sh_init_extra_frame_info);
4362   set_gdbarch_deprecated_pop_frame (gdbarch, sh_pop_frame);
4363   set_gdbarch_deprecated_frame_saved_pc (gdbarch, sh_frame_saved_pc);
4364   set_gdbarch_deprecated_saved_pc_after_call (gdbarch, sh_saved_pc_after_call);
4365   set_gdbarch_frame_align (gdbarch, sh_frame_align);
4366
4367   switch (info.bfd_arch_info->mach)
4368     {
4369     case bfd_mach_sh:
4370       set_gdbarch_register_name (gdbarch, sh_sh_register_name);
4371       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4372       sh_show_regs = sh_generic_show_regs;
4373       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4374       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4375       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4376       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4377       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4378       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4379
4380       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4381       break;
4382     case bfd_mach_sh2:
4383       set_gdbarch_register_name (gdbarch, sh_sh_register_name);
4384       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4385       sh_show_regs = sh_generic_show_regs;
4386       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4387       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4388       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4389       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4390       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4391       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4392
4393       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4394       break;      
4395     case bfd_mach_sh2e:
4396       /* doubles on sh2e and sh3e are actually 4 byte. */
4397       set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4398
4399       set_gdbarch_register_name (gdbarch, sh_sh2e_register_name);
4400       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4401       sh_show_regs = sh2e_show_regs;
4402       set_gdbarch_register_type (gdbarch, sh_sh3e_register_type);
4403       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4404       set_gdbarch_fp0_regnum (gdbarch, 25);
4405       set_gdbarch_store_return_value (gdbarch, sh3e_sh4_store_return_value);
4406       set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
4407       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4408       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4409       tdep->FPUL_REGNUM = 23;
4410       tdep->FPSCR_REGNUM = 24;
4411       tdep->FP_LAST_REGNUM = 40;
4412
4413       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4414       break;
4415     case bfd_mach_sh_dsp:
4416       set_gdbarch_register_name (gdbarch, sh_sh_dsp_register_name);
4417       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4418       sh_show_regs = sh_dsp_show_regs;
4419       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4420       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4421       set_gdbarch_register_sim_regno (gdbarch, sh_dsp_register_sim_regno);
4422       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4423       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4424       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4425       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4426       tdep->DSR_REGNUM = 24;
4427       tdep->A0G_REGNUM = 25;
4428       tdep->A0_REGNUM = 26;
4429       tdep->A1G_REGNUM = 27;
4430       tdep->A1_REGNUM = 28;
4431       tdep->M0_REGNUM = 29;
4432       tdep->M1_REGNUM = 30;
4433       tdep->X0_REGNUM = 31;
4434       tdep->X1_REGNUM = 32;
4435       tdep->Y0_REGNUM = 33;
4436       tdep->Y1_REGNUM = 34;
4437       tdep->MOD_REGNUM = 40;
4438       tdep->RS_REGNUM = 43;
4439       tdep->RE_REGNUM = 44;
4440
4441       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4442       break;
4443     case bfd_mach_sh3:
4444       set_gdbarch_register_name (gdbarch, sh_sh3_register_name);
4445       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4446       sh_show_regs = sh3_show_regs;
4447       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4448       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4449       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4450       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4451       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4452       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4453       tdep->SSR_REGNUM = 41;
4454       tdep->SPC_REGNUM = 42;
4455
4456       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4457       break;
4458     case bfd_mach_sh3e:
4459       /* doubles on sh2e and sh3e are actually 4 byte. */
4460       set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4461
4462       set_gdbarch_register_name (gdbarch, sh_sh3e_register_name);
4463       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4464       sh_show_regs = sh3e_show_regs;
4465       set_gdbarch_register_type (gdbarch, sh_sh3e_register_type);
4466       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4467       set_gdbarch_fp0_regnum (gdbarch, 25);
4468       set_gdbarch_store_return_value (gdbarch, sh3e_sh4_store_return_value);
4469       set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
4470       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4471       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4472       tdep->FPUL_REGNUM = 23;
4473       tdep->FPSCR_REGNUM = 24;
4474       tdep->FP_LAST_REGNUM = 40;
4475       tdep->SSR_REGNUM = 41;
4476       tdep->SPC_REGNUM = 42;
4477
4478       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
4479       break;
4480     case bfd_mach_sh3_dsp:
4481       set_gdbarch_register_name (gdbarch, sh_sh3_dsp_register_name);
4482       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4483       sh_show_regs = sh3_dsp_show_regs;
4484       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4485       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4486       set_gdbarch_register_sim_regno (gdbarch, sh_dsp_register_sim_regno);
4487       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4488       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4489       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4490       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4491       tdep->DSR_REGNUM = 24;
4492       tdep->A0G_REGNUM = 25;
4493       tdep->A0_REGNUM = 26;
4494       tdep->A1G_REGNUM = 27;
4495       tdep->A1_REGNUM = 28;
4496       tdep->M0_REGNUM = 29;
4497       tdep->M1_REGNUM = 30;
4498       tdep->X0_REGNUM = 31;
4499       tdep->X1_REGNUM = 32;
4500       tdep->Y0_REGNUM = 33;
4501       tdep->Y1_REGNUM = 34;
4502       tdep->MOD_REGNUM = 40;
4503       tdep->RS_REGNUM = 43;
4504       tdep->RE_REGNUM = 44;
4505       tdep->SSR_REGNUM = 41;
4506       tdep->SPC_REGNUM = 42;
4507
4508       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4509       break;
4510     case bfd_mach_sh4:
4511       set_gdbarch_register_name (gdbarch, sh_sh4_register_name);
4512       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4513       sh_show_regs = sh4_show_regs;
4514       set_gdbarch_register_type (gdbarch, sh_sh4_register_type);
4515       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4516       set_gdbarch_fp0_regnum (gdbarch, 25);
4517       set_gdbarch_num_pseudo_regs (gdbarch, 12);
4518       set_gdbarch_pseudo_register_read (gdbarch, sh_pseudo_register_read);
4519       set_gdbarch_pseudo_register_write (gdbarch, sh_pseudo_register_write);
4520       set_gdbarch_store_return_value (gdbarch, sh3e_sh4_store_return_value);
4521       set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
4522       set_gdbarch_push_dummy_call (gdbarch, sh_push_dummy_call);
4523       set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4524       tdep->FPUL_REGNUM = 23;
4525       tdep->FPSCR_REGNUM = 24;
4526       tdep->FP_LAST_REGNUM = 40;
4527       tdep->SSR_REGNUM = 41;
4528       tdep->SPC_REGNUM = 42;
4529       tdep->DR0_REGNUM = 59;
4530       tdep->DR_LAST_REGNUM = 66;
4531       tdep->FV0_REGNUM = 67;
4532       tdep->FV_LAST_REGNUM = 70;
4533
4534       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
4535       break;
4536     case bfd_mach_sh5:
4537       tdep->PR_REGNUM = 18;
4538       tdep->SR_REGNUM = 65;
4539       tdep->FPSCR_REGNUM = SIM_SH64_FPCSR_REGNUM;
4540       tdep->FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1;
4541       tdep->SSR_REGNUM = SIM_SH64_SSR_REGNUM;
4542       tdep->SPC_REGNUM = SIM_SH64_SPC_REGNUM;
4543       tdep->TR7_REGNUM = SIM_SH64_TR0_REGNUM + 7;
4544       tdep->FPP0_REGNUM = 173;
4545       tdep->FPP_LAST_REGNUM = 204;
4546       tdep->DR0_REGNUM = 141;
4547       tdep->DR_LAST_REGNUM = 172;
4548       tdep->FV0_REGNUM = 205;
4549       tdep->FV_LAST_REGNUM = 220;
4550       tdep->R0_C_REGNUM = 221;
4551       tdep->R_LAST_C_REGNUM = 236;
4552       tdep->PC_C_REGNUM = 237; 
4553       tdep->GBR_C_REGNUM = 238;
4554       tdep->MACH_C_REGNUM = 239;
4555       tdep->MACL_C_REGNUM = 240;
4556       tdep->PR_C_REGNUM = 241;
4557       tdep->T_C_REGNUM = 242;
4558       tdep->FPSCR_C_REGNUM = 243;
4559       tdep->FPUL_C_REGNUM = 244;
4560       tdep->FP0_C_REGNUM = 245;
4561       tdep->FP_LAST_C_REGNUM = 260;
4562       tdep->DR0_C_REGNUM = 261;
4563       tdep->DR_LAST_C_REGNUM = 268;
4564       tdep->FV0_C_REGNUM = 269;
4565       tdep->FV_LAST_C_REGNUM = 272;
4566       tdep->ARG0_REGNUM = 2;
4567       tdep->ARGLAST_REGNUM = 9;
4568       tdep->RETURN_REGNUM = 2;
4569       tdep->FLOAT_ARGLAST_REGNUM = 11;
4570
4571       set_gdbarch_num_pseudo_regs (gdbarch, NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT);
4572       set_gdbarch_fp0_regnum (gdbarch, SIM_SH64_FR0_REGNUM);
4573       set_gdbarch_pc_regnum (gdbarch, 64);
4574
4575       /* Determine the ABI */
4576       if (bfd_get_arch_size (info.abfd) == 64)
4577         {
4578           /* If the ABI is the 64-bit one, it can only be sh-media. */
4579           tdep->sh_abi = SH_ABI_64;
4580           set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4581           set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4582         }
4583       else
4584         {
4585           /* If the ABI is the 32-bit one it could be either media or
4586              compact. */
4587           tdep->sh_abi = SH_ABI_32;
4588           set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4589           set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4590         }
4591
4592       /* the number of real registers is the same whether we are in 
4593          ISA16(compact) or ISA32(media). */
4594       set_gdbarch_num_regs (gdbarch, SIM_SH64_NR_REGS);
4595       set_gdbarch_deprecated_register_size (gdbarch, 8); /*????*/
4596       set_gdbarch_deprecated_register_bytes (gdbarch,
4597                                              ((SIM_SH64_NR_FP_REGS + 1) * 4)
4598                                              + (SIM_SH64_NR_REGS - SIM_SH64_NR_FP_REGS -1) * 8);
4599
4600       set_gdbarch_register_name (gdbarch, sh_sh64_register_name);
4601       sh_show_regs = sh64_show_regs;
4602       set_gdbarch_deprecated_register_virtual_type (gdbarch, sh_sh64_register_virtual_type);
4603       set_gdbarch_deprecated_store_return_value (gdbarch, sh64_store_return_value);
4604       skip_prologue_hard_way = sh64_skip_prologue_hard_way;
4605       set_gdbarch_deprecated_register_raw_size (gdbarch, sh_sh64_register_raw_size);
4606       set_gdbarch_deprecated_register_virtual_size (gdbarch, sh_sh64_register_raw_size);
4607       set_gdbarch_deprecated_register_byte (gdbarch, sh_sh64_register_byte);
4608       /* This seems awfully wrong!*/
4609       /*set_gdbarch_deprecated_max_register_raw_size (gdbarch, 8);*/
4610       /* should include the size of the pseudo regs. */
4611       set_gdbarch_deprecated_max_register_raw_size (gdbarch, 4 * 4);
4612       /* Or should that go in the virtual_size? */
4613       /*set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);*/
4614       set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 4 * 4);
4615       set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read);
4616       set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write);
4617
4618       set_gdbarch_deprecated_do_registers_info (gdbarch, sh64_do_registers_info);
4619       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh64_nofp_frame_init_saved_regs);
4620       set_gdbarch_breakpoint_from_pc (gdbarch, sh_sh64_breakpoint_from_pc);
4621       set_gdbarch_deprecated_call_dummy_words (gdbarch, sh64_call_dummy_words);
4622       set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (sh64_call_dummy_words));
4623
4624       set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sh64_init_extra_frame_info);
4625       set_gdbarch_deprecated_frame_chain (gdbarch, sh64_frame_chain);
4626       set_gdbarch_deprecated_get_saved_register (gdbarch, sh64_get_saved_register);
4627       set_gdbarch_deprecated_extract_return_value (gdbarch, sh64_extract_return_value);
4628       set_gdbarch_deprecated_push_arguments (gdbarch, sh64_push_arguments);
4629       set_gdbarch_deprecated_push_return_address (gdbarch, sh64_push_return_address);
4630       set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
4631       set_gdbarch_deprecated_store_struct_return (gdbarch, sh64_store_struct_return);
4632       set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sh64_extract_struct_value_address);
4633       set_gdbarch_use_struct_convention (gdbarch, sh64_use_struct_convention);
4634       set_gdbarch_deprecated_pop_frame (gdbarch, sh64_pop_frame);
4635       set_gdbarch_elf_make_msymbol_special (gdbarch,
4636                                             sh64_elf_make_msymbol_special);
4637       break;
4638     default:
4639       set_gdbarch_register_name (gdbarch, sh_generic_register_name);
4640       set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info);
4641       sh_show_regs = sh_generic_show_regs;
4642       set_gdbarch_register_type (gdbarch, sh_default_register_type);
4643       set_gdbarch_push_dummy_code (gdbarch, sh_push_dummy_code);
4644       set_gdbarch_store_return_value (gdbarch, sh_default_store_return_value);
4645       set_gdbarch_extract_return_value (gdbarch, sh_default_extract_return_value);
4646
4647       set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4648       break;
4649     }
4650
4651   /* Hook in ABI-specific overrides, if they have been registered.  */
4652   gdbarch_init_osabi (info, gdbarch);
4653
4654   return gdbarch;
4655 }
4656
4657 static void
4658 sh_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
4659 {
4660   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4661
4662   if (tdep == NULL)
4663     return;
4664
4665   /* FIXME: dump the rest of gdbarch_tdep.  */
4666 }
4667
4668 extern initialize_file_ftype _initialize_sh_tdep; /* -Wmissing-prototypes */
4669
4670 void
4671 _initialize_sh_tdep (void)
4672 {
4673   struct cmd_list_element *c;
4674   
4675   gdbarch_register (bfd_arch_sh, sh_gdbarch_init, sh_dump_tdep);
4676
4677   add_com ("regs", class_vars, sh_show_regs_command, "Print all registers");
4678 }