OSDN Git Service

2011-03-04 Michael Snyder <msnyder@msnyder-server.eng.vmware.com>
[pf3gnuchains/sourceware.git] / gdb / sh64-tdep.c
1 /* Target-dependent code for Renesas Super-H, for GDB.
2
3    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
4    2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
5    Free Software Foundation, Inc.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 /* Contributed by Steve Chamberlain
23    sac@cygnus.com.  */
24
25 #include "defs.h"
26 #include "frame.h"
27 #include "frame-base.h"
28 #include "frame-unwind.h"
29 #include "dwarf2-frame.h"
30 #include "symtab.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 "gdb_assert.h"
39 #include "arch-utils.h"
40 #include "regcache.h"
41 #include "osabi.h"
42 #include "valprint.h"
43
44 #include "elf-bfd.h"
45
46 /* sh flags */
47 #include "elf/sh.h"
48 /* Register numbers shared with the simulator.  */
49 #include "gdb/sim-sh.h"
50 #include "language.h"
51
52 /* Information that is dependent on the processor variant.  */
53 enum sh_abi
54   {
55     SH_ABI_UNKNOWN,
56     SH_ABI_32,
57     SH_ABI_64
58   };
59
60 struct gdbarch_tdep
61   {
62     enum sh_abi sh_abi;
63   };
64
65 struct sh64_frame_cache
66 {
67   /* Base address.  */
68   CORE_ADDR base;
69   LONGEST sp_offset;
70   CORE_ADDR pc;
71
72   /* Flag showing that a frame has been created in the prologue code.  */
73   int uses_fp;
74
75   int media_mode;
76
77   /* Saved registers.  */
78   CORE_ADDR saved_regs[SIM_SH64_NR_REGS];
79   CORE_ADDR saved_sp;
80 };
81
82 /* Registers of SH5 */
83 enum
84   {
85     R0_REGNUM = 0,
86     DEFAULT_RETURN_REGNUM = 2,
87     STRUCT_RETURN_REGNUM = 2,
88     ARG0_REGNUM = 2,
89     ARGLAST_REGNUM = 9,
90     FLOAT_ARGLAST_REGNUM = 11,
91     MEDIA_FP_REGNUM = 14,
92     PR_REGNUM = 18,
93     SR_REGNUM = 65,
94     DR0_REGNUM = 141,
95     DR_LAST_REGNUM = 172,
96     /* FPP stands for Floating Point Pair, to avoid confusion with
97        GDB's gdbarch_fp0_regnum, which is the number of the first Floating
98        point register.  Unfortunately on the sh5, the floating point
99        registers are called FR, and the floating point pairs are called FP.  */
100     FPP0_REGNUM = 173,
101     FPP_LAST_REGNUM = 204,
102     FV0_REGNUM = 205,
103     FV_LAST_REGNUM = 220,
104     R0_C_REGNUM = 221,
105     R_LAST_C_REGNUM = 236,
106     PC_C_REGNUM = 237,
107     GBR_C_REGNUM = 238,
108     MACH_C_REGNUM = 239,
109     MACL_C_REGNUM = 240,
110     PR_C_REGNUM = 241,
111     T_C_REGNUM = 242,
112     FPSCR_C_REGNUM = 243,
113     FPUL_C_REGNUM = 244,
114     FP0_C_REGNUM = 245,
115     FP_LAST_C_REGNUM = 260,
116     DR0_C_REGNUM = 261,
117     DR_LAST_C_REGNUM = 268,
118     FV0_C_REGNUM = 269,
119     FV_LAST_C_REGNUM = 272,
120     FPSCR_REGNUM = SIM_SH64_FPCSR_REGNUM,
121     SSR_REGNUM = SIM_SH64_SSR_REGNUM,
122     SPC_REGNUM = SIM_SH64_SPC_REGNUM,
123     TR7_REGNUM = SIM_SH64_TR0_REGNUM + 7,
124     FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1
125   };
126
127 static const char *
128 sh64_register_name (struct gdbarch *gdbarch, int reg_nr)
129 {
130   static char *register_names[] =
131   {
132     /* SH MEDIA MODE (ISA 32) */
133     /* general registers (64-bit) 0-63 */
134     "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
135     "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
136     "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
137     "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
138     "r32",  "r33",  "r34",  "r35",  "r36",  "r37",  "r38",  "r39",
139     "r40",  "r41",  "r42",  "r43",  "r44",  "r45",  "r46",  "r47",
140     "r48",  "r49",  "r50",  "r51",  "r52",  "r53",  "r54",  "r55",
141     "r56",  "r57",  "r58",  "r59",  "r60",  "r61",  "r62",  "r63",
142
143     /* pc (64-bit) 64 */
144     "pc",   
145
146     /* status reg., saved status reg., saved pc reg. (64-bit) 65-67 */
147     "sr",  "ssr",  "spc", 
148
149     /* target registers (64-bit) 68-75 */
150     "tr0",  "tr1",  "tr2",  "tr3",  "tr4",  "tr5",  "tr6",  "tr7",
151
152     /* floating point state control register (32-bit) 76 */
153     "fpscr",
154
155     /* single precision floating point registers (32-bit) 77-140 */
156     "fr0",  "fr1",  "fr2",  "fr3",  "fr4",  "fr5",  "fr6",  "fr7",
157     "fr8",  "fr9",  "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
158     "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
159     "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",
160     "fr32", "fr33", "fr34", "fr35", "fr36", "fr37", "fr38", "fr39",
161     "fr40", "fr41", "fr42", "fr43", "fr44", "fr45", "fr46", "fr47",
162     "fr48", "fr49", "fr50", "fr51", "fr52", "fr53", "fr54", "fr55",
163     "fr56", "fr57", "fr58", "fr59", "fr60", "fr61", "fr62", "fr63",
164
165     /* double precision registers (pseudo) 141-172 */
166     "dr0",  "dr2",  "dr4",  "dr6",  "dr8",  "dr10", "dr12", "dr14",
167     "dr16", "dr18", "dr20", "dr22", "dr24", "dr26", "dr28", "dr30",
168     "dr32", "dr34", "dr36", "dr38", "dr40", "dr42", "dr44", "dr46",
169     "dr48", "dr50", "dr52", "dr54", "dr56", "dr58", "dr60", "dr62",
170
171     /* floating point pairs (pseudo) 173-204 */
172     "fp0",  "fp2",  "fp4",  "fp6",  "fp8",  "fp10", "fp12", "fp14",
173     "fp16", "fp18", "fp20", "fp22", "fp24", "fp26", "fp28", "fp30",
174     "fp32", "fp34", "fp36", "fp38", "fp40", "fp42", "fp44", "fp46",
175     "fp48", "fp50", "fp52", "fp54", "fp56", "fp58", "fp60", "fp62",
176
177     /* floating point vectors (4 floating point regs) (pseudo) 205-220 */
178     "fv0",  "fv4",  "fv8",  "fv12", "fv16", "fv20", "fv24", "fv28",
179     "fv32", "fv36", "fv40", "fv44", "fv48", "fv52", "fv56", "fv60",
180
181     /* SH COMPACT MODE (ISA 16) (all pseudo) 221-272 */
182     "r0_c", "r1_c", "r2_c",  "r3_c",  "r4_c",  "r5_c",  "r6_c",  "r7_c",
183     "r8_c", "r9_c", "r10_c", "r11_c", "r12_c", "r13_c", "r14_c", "r15_c",
184     "pc_c",
185     "gbr_c", "mach_c", "macl_c", "pr_c", "t_c",
186     "fpscr_c", "fpul_c",
187     "fr0_c",  "fr1_c",  "fr2_c",  "fr3_c",
188     "fr4_c",  "fr5_c",  "fr6_c",  "fr7_c",
189     "fr8_c",  "fr9_c",  "fr10_c", "fr11_c",
190     "fr12_c", "fr13_c", "fr14_c", "fr15_c",
191     "dr0_c",  "dr2_c",  "dr4_c",  "dr6_c",
192     "dr8_c",  "dr10_c", "dr12_c", "dr14_c",
193     "fv0_c", "fv4_c", "fv8_c",  "fv12_c",
194     /* FIXME!!!! XF0 XF15, XD0 XD14 ?????  */
195   };
196
197   if (reg_nr < 0)
198     return NULL;
199   if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
200     return NULL;
201   return register_names[reg_nr];
202 }
203
204 #define NUM_PSEUDO_REGS_SH_MEDIA 80
205 #define NUM_PSEUDO_REGS_SH_COMPACT 51
206
207 /* Macros and functions for setting and testing a bit in a minimal
208    symbol that marks it as 32-bit function.  The MSB of the minimal
209    symbol's "info" field is used for this purpose.
210
211    gdbarch_elf_make_msymbol_special tests whether an ELF symbol is "special",
212    i.e. refers to a 32-bit function, and sets a "special" bit in a
213    minimal symbol to mark it as a 32-bit function
214    MSYMBOL_IS_SPECIAL   tests the "special" bit in a minimal symbol  */
215
216 #define MSYMBOL_IS_SPECIAL(msym) \
217   MSYMBOL_TARGET_FLAG_1 (msym)
218
219 static void
220 sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
221 {
222   if (msym == NULL)
223     return;
224
225   if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
226     {
227       MSYMBOL_TARGET_FLAG_1 (msym) = 1;
228       SYMBOL_VALUE_ADDRESS (msym) |= 1;
229     }
230 }
231
232 /* ISA32 (shmedia) function addresses are odd (bit 0 is set).  Here
233    are some macros to test, set, or clear bit 0 of addresses.  */
234 #define IS_ISA32_ADDR(addr)      ((addr) & 1)
235 #define MAKE_ISA32_ADDR(addr)    ((addr) | 1)
236 #define UNMAKE_ISA32_ADDR(addr)  ((addr) & ~1)
237
238 static int
239 pc_is_isa32 (bfd_vma memaddr)
240 {
241   struct minimal_symbol *sym;
242
243   /* If bit 0 of the address is set, assume this is a
244      ISA32 (shmedia) address.  */
245   if (IS_ISA32_ADDR (memaddr))
246     return 1;
247
248   /* A flag indicating that this is a ISA32 function is stored by elfread.c in
249      the high bit of the info field.  Use this to decide if the function is
250      ISA16 or ISA32.  */
251   sym = lookup_minimal_symbol_by_pc (memaddr);
252   if (sym)
253     return MSYMBOL_IS_SPECIAL (sym);
254   else
255     return 0;
256 }
257
258 static const unsigned char *
259 sh64_breakpoint_from_pc (struct gdbarch *gdbarch,
260                          CORE_ADDR *pcptr, int *lenptr)
261 {
262   /* The BRK instruction for shmedia is 
263      01101111 11110101 11111111 11110000
264      which translates in big endian mode to 0x6f, 0xf5, 0xff, 0xf0
265      and in little endian mode to 0xf0, 0xff, 0xf5, 0x6f */
266
267   /* The BRK instruction for shcompact is
268      00000000 00111011
269      which translates in big endian mode to 0x0, 0x3b
270      and in little endian mode to 0x3b, 0x0 */
271
272   if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
273     {
274       if (pc_is_isa32 (*pcptr))
275         {
276           static unsigned char big_breakpoint_media[] = {
277             0x6f, 0xf5, 0xff, 0xf0
278           };
279           *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
280           *lenptr = sizeof (big_breakpoint_media);
281           return big_breakpoint_media;
282         }
283       else
284         {
285           static unsigned char big_breakpoint_compact[] = {0x0, 0x3b};
286           *lenptr = sizeof (big_breakpoint_compact);
287           return big_breakpoint_compact;
288         }
289     }
290   else
291     {
292       if (pc_is_isa32 (*pcptr))
293         {
294           static unsigned char little_breakpoint_media[] = {
295             0xf0, 0xff, 0xf5, 0x6f
296           };
297           *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
298           *lenptr = sizeof (little_breakpoint_media);
299           return little_breakpoint_media;
300         }
301       else
302         {
303           static unsigned char little_breakpoint_compact[] = {0x3b, 0x0};
304           *lenptr = sizeof (little_breakpoint_compact);
305           return little_breakpoint_compact;
306         }
307     }
308 }
309
310 /* Prologue looks like
311    [mov.l       <regs>,@-r15]...
312    [sts.l       pr,@-r15]
313    [mov.l       r14,@-r15]
314    [mov         r15,r14]
315
316    Actually it can be more complicated than this.  For instance, with
317    newer gcc's:
318
319    mov.l   r14,@-r15
320    add     #-12,r15
321    mov     r15,r14
322    mov     r4,r1
323    mov     r5,r2
324    mov.l   r6,@(4,r14)
325    mov.l   r7,@(8,r14)
326    mov.b   r1,@r14
327    mov     r14,r1
328    mov     r14,r1
329    add     #2,r1
330    mov.w   r2,@r1
331
332  */
333
334 /* PTABS/L Rn, TRa       0110101111110001nnnnnnl00aaa0000 
335    with l=1 and n = 18   0110101111110001010010100aaa0000 */
336 #define IS_PTABSL_R18(x)  (((x) & 0xffffff8f) == 0x6bf14a00)
337
338 /* STS.L PR,@-r0   0100000000100010
339    r0-4-->r0, PR-->(r0) */
340 #define IS_STS_R0(x)            ((x) == 0x4022)
341
342 /* STS PR, Rm      0000mmmm00101010
343    PR-->Rm */
344 #define IS_STS_PR(x)            (((x) & 0xf0ff) == 0x2a)
345
346 /* MOV.L Rm,@(disp,r15)  00011111mmmmdddd
347    Rm-->(dispx4+r15) */
348 #define IS_MOV_TO_R15(x)              (((x) & 0xff00) == 0x1f00)
349
350 /* MOV.L R14,@(disp,r15)  000111111110dddd
351    R14-->(dispx4+r15) */
352 #define IS_MOV_R14(x)              (((x) & 0xfff0) == 0x1fe0)
353
354 /* ST.Q R14, disp, R18    101011001110dddddddddd0100100000
355    R18-->(dispx8+R14) */
356 #define IS_STQ_R18_R14(x)          (((x) & 0xfff003ff) == 0xace00120)
357
358 /* ST.Q R15, disp, R18    101011001111dddddddddd0100100000
359    R18-->(dispx8+R15) */
360 #define IS_STQ_R18_R15(x)          (((x) & 0xfff003ff) == 0xacf00120)
361
362 /* ST.L R15, disp, R18    101010001111dddddddddd0100100000
363    R18-->(dispx4+R15) */
364 #define IS_STL_R18_R15(x)          (((x) & 0xfff003ff) == 0xa8f00120)
365
366 /* ST.Q R15, disp, R14    1010 1100 1111 dddd dddd dd00 1110 0000
367    R14-->(dispx8+R15) */
368 #define IS_STQ_R14_R15(x)          (((x) & 0xfff003ff) == 0xacf000e0)
369
370 /* ST.L R15, disp, R14    1010 1000 1111 dddd dddd dd00 1110 0000
371    R14-->(dispx4+R15) */
372 #define IS_STL_R14_R15(x)          (((x) & 0xfff003ff) == 0xa8f000e0)
373
374 /* ADDI.L R15,imm,R15     1101 0100 1111 ssss ssss ss00 1111 0000
375    R15 + imm --> R15 */
376 #define IS_ADDIL_SP_MEDIA(x)         (((x) & 0xfff003ff) == 0xd4f000f0)
377
378 /* ADDI R15,imm,R15     1101 0000 1111 ssss ssss ss00 1111 0000
379    R15 + imm --> R15 */
380 #define IS_ADDI_SP_MEDIA(x)         (((x) & 0xfff003ff) == 0xd0f000f0)
381
382 /* ADD.L R15,R63,R14    0000 0000 1111 1000 1111 1100 1110 0000 
383    R15 + R63 --> R14 */
384 #define IS_ADDL_SP_FP_MEDIA(x)          ((x) == 0x00f8fce0)
385
386 /* ADD R15,R63,R14    0000 0000 1111 1001 1111 1100 1110 0000 
387    R15 + R63 --> R14 */
388 #define IS_ADD_SP_FP_MEDIA(x)   ((x) == 0x00f9fce0)
389
390 #define IS_MOV_SP_FP_MEDIA(x)   \
391   (IS_ADDL_SP_FP_MEDIA(x) || IS_ADD_SP_FP_MEDIA(x))
392
393 /* MOV #imm, R0    1110 0000 ssss ssss 
394    #imm-->R0 */
395 #define IS_MOV_R0(x)            (((x) & 0xff00) == 0xe000)
396
397 /* MOV.L @(disp,PC), R0    1101 0000 iiii iiii  */
398 #define IS_MOVL_R0(x)           (((x) & 0xff00) == 0xd000)
399
400 /* ADD r15,r0      0011 0000 1111 1100
401    r15+r0-->r0 */
402 #define IS_ADD_SP_R0(x)         ((x) == 0x30fc)
403
404 /* MOV.L R14 @-R0  0010 0000 1110 0110
405    R14-->(R0-4), R0-4-->R0 */
406 #define IS_MOV_R14_R0(x)        ((x) == 0x20e6)
407
408 /* ADD Rm,R63,Rn  Rm+R63-->Rn  0000 00mm mmmm 1001 1111 11nn nnnn 0000
409    where Rm is one of r2-r9 which are the argument registers.  */
410 /* FIXME: Recognize the float and double register moves too!  */
411 #define IS_MEDIA_IND_ARG_MOV(x) \
412   ((((x) & 0xfc0ffc0f) == 0x0009fc00) \
413    && (((x) & 0x03f00000) >= 0x00200000 \
414        && ((x) & 0x03f00000) <= 0x00900000))
415
416 /* ST.Q Rn,0,Rm  Rm-->Rn+0  1010 11nn nnnn 0000 0000 00mm mmmm 0000
417    or ST.L Rn,0,Rm  Rm-->Rn+0  1010 10nn nnnn 0000 0000 00mm mmmm 0000
418    where Rm is one of r2-r9 which are the argument registers.  */
419 #define IS_MEDIA_ARG_MOV(x) \
420 (((((x) & 0xfc0ffc0f) == 0xac000000) || (((x) & 0xfc0ffc0f) == 0xa8000000)) \
421    && (((x) & 0x000003f0) >= 0x00000020 && ((x) & 0x000003f0) <= 0x00000090))
422
423 /* ST.B R14,0,Rn     Rn-->(R14+0) 1010 0000 1110 0000 0000 00nn nnnn 0000 */
424 /* ST.W R14,0,Rn     Rn-->(R14+0) 1010 0100 1110 0000 0000 00nn nnnn 0000 */
425 /* ST.L R14,0,Rn     Rn-->(R14+0) 1010 1000 1110 0000 0000 00nn nnnn 0000 */
426 /* FST.S R14,0,FRn   Rn-->(R14+0) 1011 0100 1110 0000 0000 00nn nnnn 0000 */
427 /* FST.D R14,0,DRn   Rn-->(R14+0) 1011 1100 1110 0000 0000 00nn nnnn 0000 */
428 #define IS_MEDIA_MOV_TO_R14(x)  \
429 ((((x) & 0xfffffc0f) == 0xa0e00000) \
430 || (((x) & 0xfffffc0f) == 0xa4e00000) \
431 || (((x) & 0xfffffc0f) == 0xa8e00000) \
432 || (((x) & 0xfffffc0f) == 0xb4e00000) \
433 || (((x) & 0xfffffc0f) == 0xbce00000))
434
435 /* MOV Rm, Rn  Rm-->Rn 0110 nnnn mmmm 0011
436    where Rm is r2-r9 */
437 #define IS_COMPACT_IND_ARG_MOV(x) \
438   ((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0020) \
439    && (((x) & 0x00f0) <= 0x0090))
440
441 /* compact direct arg move! 
442    MOV.L Rn, @r14     0010 1110 mmmm 0010 */
443 #define IS_COMPACT_ARG_MOV(x) \
444   (((((x) & 0xff0f) == 0x2e02) && (((x) & 0x00f0) >= 0x0020) \
445     && ((x) & 0x00f0) <= 0x0090))
446
447 /* MOV.B Rm, @R14     0010 1110 mmmm 0000 
448    MOV.W Rm, @R14     0010 1110 mmmm 0001 */
449 #define IS_COMPACT_MOV_TO_R14(x) \
450 ((((x) & 0xff0f) == 0x2e00) || (((x) & 0xff0f) == 0x2e01))
451
452 #define IS_JSR_R0(x)           ((x) == 0x400b)
453 #define IS_NOP(x)              ((x) == 0x0009)
454
455
456 /* MOV r15,r14     0110111011110011
457    r15-->r14  */
458 #define IS_MOV_SP_FP(x)         ((x) == 0x6ef3)
459
460 /* ADD #imm,r15    01111111iiiiiiii
461    r15+imm-->r15 */
462 #define IS_ADD_SP(x)            (((x) & 0xff00) == 0x7f00)
463
464 /* Skip any prologue before the guts of a function.  */
465
466 /* Skip the prologue using the debug information.  If this fails we'll
467    fall back on the 'guess' method below.  */
468 static CORE_ADDR
469 after_prologue (CORE_ADDR pc)
470 {
471   struct symtab_and_line sal;
472   CORE_ADDR func_addr, func_end;
473
474   /* If we can not find the symbol in the partial symbol table, then
475      there is no hope we can determine the function's start address
476      with this code.  */
477   if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
478     return 0;
479
480
481   /* Get the line associated with FUNC_ADDR.  */
482   sal = find_pc_line (func_addr, 0);
483
484   /* There are only two cases to consider.  First, the end of the source line
485      is within the function bounds.  In that case we return the end of the
486      source line.  Second is the end of the source line extends beyond the
487      bounds of the current function.  We need to use the slow code to
488      examine instructions in that case.  */
489   if (sal.end < func_end)
490     return sal.end;
491   else
492     return 0;
493 }
494
495 static CORE_ADDR 
496 look_for_args_moves (struct gdbarch *gdbarch,
497                      CORE_ADDR start_pc, int media_mode)
498 {
499   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
500   CORE_ADDR here, end;
501   int w;
502   int insn_size = (media_mode ? 4 : 2);
503
504   for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
505     {
506       if (media_mode)
507         {
508           w = read_memory_integer (UNMAKE_ISA32_ADDR (here),
509                                    insn_size, byte_order);
510           here += insn_size;
511           if (IS_MEDIA_IND_ARG_MOV (w))
512             {
513               /* This must be followed by a store to r14, so the argument
514                  is where the debug info says it is.  This can happen after
515                  the SP has been saved, unfortunately.  */
516          
517               int next_insn = read_memory_integer (UNMAKE_ISA32_ADDR (here),
518                                                    insn_size, byte_order);
519               here += insn_size;
520               if (IS_MEDIA_MOV_TO_R14 (next_insn))
521                 start_pc = here;          
522             }
523           else if (IS_MEDIA_ARG_MOV (w))
524             {
525               /* These instructions store directly the argument in r14.  */
526               start_pc = here;
527             }
528           else
529             break;
530         }
531       else
532         {
533           w = read_memory_integer (here, insn_size, byte_order);
534           w = w & 0xffff;
535           here += insn_size;
536           if (IS_COMPACT_IND_ARG_MOV (w))
537             {
538               /* This must be followed by a store to r14, so the argument
539                  is where the debug info says it is.  This can happen after
540                  the SP has been saved, unfortunately.  */
541          
542               int next_insn = 0xffff & read_memory_integer (here, insn_size,
543                                                             byte_order);
544               here += insn_size;
545               if (IS_COMPACT_MOV_TO_R14 (next_insn))
546                 start_pc = here;
547             }
548           else if (IS_COMPACT_ARG_MOV (w))
549             {
550               /* These instructions store directly the argument in r14.  */
551               start_pc = here;
552             }
553           else if (IS_MOVL_R0 (w))
554             {
555               /* There is a function that gcc calls to get the arguments
556                  passed correctly to the function.  Only after this
557                  function call the arguments will be found at the place
558                  where they are supposed to be.  This happens in case the
559                  argument has to be stored into a 64-bit register (for
560                  instance doubles, long longs).  SHcompact doesn't have
561                  access to the full 64-bits, so we store the register in
562                  stack slot and store the address of the stack slot in
563                  the register, then do a call through a wrapper that
564                  loads the memory value into the register.  A SHcompact
565                  callee calls an argument decoder
566                  (GCC_shcompact_incoming_args) that stores the 64-bit
567                  value in a stack slot and stores the address of the
568                  stack slot in the register.  GCC thinks the argument is
569                  just passed by transparent reference, but this is only
570                  true after the argument decoder is called.  Such a call
571                  needs to be considered part of the prologue.  */
572
573               /* This must be followed by a JSR @r0 instruction and by
574                  a NOP instruction.  After these, the prologue is over!  */
575          
576               int next_insn = 0xffff & read_memory_integer (here, insn_size,
577                                                             byte_order);
578               here += insn_size;
579               if (IS_JSR_R0 (next_insn))
580                 {
581                   next_insn = 0xffff & read_memory_integer (here, insn_size,
582                                                             byte_order);
583                   here += insn_size;
584
585                   if (IS_NOP (next_insn))
586                     start_pc = here;
587                 }
588             }
589           else
590             break;
591         }
592     }
593
594   return start_pc;
595 }
596
597 static CORE_ADDR
598 sh64_skip_prologue_hard_way (struct gdbarch *gdbarch, CORE_ADDR start_pc)
599 {
600   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
601   CORE_ADDR here, end;
602   int updated_fp = 0;
603   int insn_size = 4;
604   int media_mode = 1;
605
606   if (!start_pc)
607     return 0;
608
609   if (pc_is_isa32 (start_pc) == 0)
610     {
611       insn_size = 2;
612       media_mode = 0;
613     }
614
615   for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
616     {
617
618       if (media_mode)
619         {
620           int w = read_memory_integer (UNMAKE_ISA32_ADDR (here),
621                                        insn_size, byte_order);
622           here += insn_size;
623           if (IS_STQ_R18_R14 (w) || IS_STQ_R18_R15 (w) || IS_STQ_R14_R15 (w)
624               || IS_STL_R14_R15 (w) || IS_STL_R18_R15 (w)
625               || IS_ADDIL_SP_MEDIA (w) || IS_ADDI_SP_MEDIA (w)
626               || IS_PTABSL_R18 (w))
627             {
628               start_pc = here;
629             }
630           else if (IS_MOV_SP_FP (w) || IS_MOV_SP_FP_MEDIA(w))
631             {
632               start_pc = here;
633               updated_fp = 1;
634             }
635           else
636             if (updated_fp)
637               {
638                 /* Don't bail out yet, we may have arguments stored in
639                    registers here, according to the debug info, so that
640                    gdb can print the frames correctly.  */
641                 start_pc = look_for_args_moves (gdbarch,
642                                                 here - insn_size, media_mode);
643                 break;
644               }
645         }
646       else
647         {
648           int w = 0xffff & read_memory_integer (here, insn_size, byte_order);
649           here += insn_size;
650
651           if (IS_STS_R0 (w) || IS_STS_PR (w)
652               || IS_MOV_TO_R15 (w) || IS_MOV_R14 (w) 
653               || IS_MOV_R0 (w) || IS_ADD_SP_R0 (w) || IS_MOV_R14_R0 (w))
654             {
655               start_pc = here;
656             }
657           else if (IS_MOV_SP_FP (w))
658             {
659               start_pc = here;
660               updated_fp = 1;
661             }
662           else
663             if (updated_fp)
664               {
665                 /* Don't bail out yet, we may have arguments stored in
666                    registers here, according to the debug info, so that
667                    gdb can print the frames correctly.  */
668                 start_pc = look_for_args_moves (gdbarch,
669                                                 here - insn_size, media_mode);
670                 break;
671               }
672         }
673     }
674
675   return start_pc;
676 }
677
678 static CORE_ADDR
679 sh64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
680 {
681   CORE_ADDR post_prologue_pc;
682
683   /* See if we can determine the end of the prologue via the symbol table.
684      If so, then return either PC, or the PC after the prologue, whichever
685      is greater.  */
686   post_prologue_pc = after_prologue (pc);
687
688   /* If after_prologue returned a useful address, then use it.  Else
689      fall back on the instruction skipping code.  */
690   if (post_prologue_pc != 0)
691     return max (pc, post_prologue_pc);
692   else
693     return sh64_skip_prologue_hard_way (gdbarch, pc);
694 }
695
696 /* Should call_function allocate stack space for a struct return?  */
697 static int
698 sh64_use_struct_convention (struct type *type)
699 {
700   return (TYPE_LENGTH (type) > 8);
701 }
702
703 /* For vectors of 4 floating point registers.  */
704 static int
705 sh64_fv_reg_base_num (struct gdbarch *gdbarch, int fv_regnum)
706 {
707   int fp_regnum;
708
709   fp_regnum = gdbarch_fp0_regnum (gdbarch) + (fv_regnum - FV0_REGNUM) * 4;
710   return fp_regnum;
711 }
712
713 /* For double precision floating point registers, i.e 2 fp regs.  */
714 static int
715 sh64_dr_reg_base_num (struct gdbarch *gdbarch, int dr_regnum)
716 {
717   int fp_regnum;
718
719   fp_regnum = gdbarch_fp0_regnum (gdbarch) + (dr_regnum - DR0_REGNUM) * 2;
720   return fp_regnum;
721 }
722
723 /* For pairs of floating point registers.  */
724 static int
725 sh64_fpp_reg_base_num (struct gdbarch *gdbarch, int fpp_regnum)
726 {
727   int fp_regnum;
728
729   fp_regnum = gdbarch_fp0_regnum (gdbarch) + (fpp_regnum - FPP0_REGNUM) * 2;
730   return fp_regnum;
731 }
732
733 /* *INDENT-OFF* */
734 /*
735     SH COMPACT MODE (ISA 16) (all pseudo) 221-272
736        GDB_REGNUM  BASE_REGNUM
737  r0_c       221      0
738  r1_c       222      1
739  r2_c       223      2
740  r3_c       224      3
741  r4_c       225      4
742  r5_c       226      5
743  r6_c       227      6
744  r7_c       228      7
745  r8_c       229      8
746  r9_c       230      9
747  r10_c      231      10
748  r11_c      232      11
749  r12_c      233      12
750  r13_c      234      13
751  r14_c      235      14
752  r15_c      236      15
753
754  pc_c       237      64
755  gbr_c      238      16
756  mach_c     239      17
757  macl_c     240      17
758  pr_c       241      18
759  t_c        242      19
760  fpscr_c    243      76
761  fpul_c     244      109
762
763  fr0_c      245      77
764  fr1_c      246      78
765  fr2_c      247      79
766  fr3_c      248      80
767  fr4_c      249      81
768  fr5_c      250      82
769  fr6_c      251      83
770  fr7_c      252      84
771  fr8_c      253      85
772  fr9_c      254      86
773  fr10_c     255      87
774  fr11_c     256      88
775  fr12_c     257      89
776  fr13_c     258      90
777  fr14_c     259      91
778  fr15_c     260      92
779
780  dr0_c      261      77
781  dr2_c      262      79
782  dr4_c      263      81
783  dr6_c      264      83
784  dr8_c      265      85
785  dr10_c     266      87
786  dr12_c     267      89
787  dr14_c     268      91
788
789  fv0_c      269      77
790  fv4_c      270      81
791  fv8_c      271      85
792  fv12_c     272      91
793 */
794 /* *INDENT-ON* */
795 static int
796 sh64_compact_reg_base_num (struct gdbarch *gdbarch, int reg_nr)
797 {
798   int base_regnum = reg_nr;
799
800   /* general register N maps to general register N */
801   if (reg_nr >= R0_C_REGNUM 
802       && reg_nr <= R_LAST_C_REGNUM)
803     base_regnum = reg_nr - R0_C_REGNUM;
804
805   /* floating point register N maps to floating point register N */
806   else if (reg_nr >= FP0_C_REGNUM 
807             && reg_nr <= FP_LAST_C_REGNUM)
808     base_regnum = reg_nr - FP0_C_REGNUM + gdbarch_fp0_regnum (gdbarch);
809
810   /* double prec register N maps to base regnum for double prec register N */
811   else if (reg_nr >= DR0_C_REGNUM 
812             && reg_nr <= DR_LAST_C_REGNUM)
813     base_regnum = sh64_dr_reg_base_num (gdbarch,
814                                         DR0_REGNUM + reg_nr - DR0_C_REGNUM);
815
816   /* vector N maps to base regnum for vector register N */
817   else if (reg_nr >= FV0_C_REGNUM 
818             && reg_nr <= FV_LAST_C_REGNUM)
819     base_regnum = sh64_fv_reg_base_num (gdbarch,
820                                         FV0_REGNUM + reg_nr - FV0_C_REGNUM);
821
822   else if (reg_nr == PC_C_REGNUM)
823     base_regnum = gdbarch_pc_regnum (gdbarch);
824
825   else if (reg_nr == GBR_C_REGNUM) 
826     base_regnum = 16;
827
828   else if (reg_nr == MACH_C_REGNUM
829            || reg_nr == MACL_C_REGNUM)
830     base_regnum = 17;
831
832   else if (reg_nr == PR_C_REGNUM) 
833     base_regnum = PR_REGNUM;
834
835   else if (reg_nr == T_C_REGNUM) 
836     base_regnum = 19;
837
838   else if (reg_nr == FPSCR_C_REGNUM) 
839     base_regnum = FPSCR_REGNUM; /*???? this register is a mess.  */
840
841   else if (reg_nr == FPUL_C_REGNUM) 
842     base_regnum = gdbarch_fp0_regnum (gdbarch) + 32;
843   
844   return base_regnum;
845 }
846
847 static int
848 sign_extend (int value, int bits)
849 {
850   value = value & ((1 << bits) - 1);
851   return (value & (1 << (bits - 1))
852           ? value | (~((1 << bits) - 1))
853           : value);
854 }
855
856 static void
857 sh64_analyze_prologue (struct gdbarch *gdbarch,
858                        struct sh64_frame_cache *cache,
859                        CORE_ADDR func_pc,
860                        CORE_ADDR current_pc)
861 {
862   int reg_nr;
863   int pc;
864   int opc;
865   int insn;
866   int r0_val = 0;
867   int insn_size;
868   int gdb_register_number;
869   int register_number;
870   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
871   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
872   
873   cache->sp_offset = 0;
874
875   /* Loop around examining the prologue insns until we find something
876      that does not appear to be part of the prologue.  But give up
877      after 20 of them, since we're getting silly then.  */
878
879   pc = func_pc;
880
881   if (cache->media_mode)
882     insn_size = 4;
883   else
884     insn_size = 2;
885
886   opc = pc + (insn_size * 28);
887   if (opc > current_pc)
888     opc = current_pc;
889   for ( ; pc <= opc; pc += insn_size)
890     {
891       insn = read_memory_integer (cache->media_mode ? UNMAKE_ISA32_ADDR (pc)
892                                                     : pc,
893                                   insn_size, byte_order);
894
895       if (!cache->media_mode)
896         {
897           if (IS_STS_PR (insn))
898             {
899               int next_insn = read_memory_integer (pc + insn_size,
900                                                    insn_size, byte_order);
901               if (IS_MOV_TO_R15 (next_insn))
902                 {
903                   cache->saved_regs[PR_REGNUM]
904                     = cache->sp_offset - ((((next_insn & 0xf) ^ 0x8)
905                                            - 0x8) << 2);
906                   pc += insn_size;
907                 }
908             }
909
910           else if (IS_MOV_R14 (insn))
911             cache->saved_regs[MEDIA_FP_REGNUM] =
912               cache->sp_offset - ((((insn & 0xf) ^ 0x8) - 0x8) << 2);
913
914           else if (IS_MOV_R0 (insn))
915             {
916               /* Put in R0 the offset from SP at which to store some
917                  registers.  We are interested in this value, because it
918                  will tell us where the given registers are stored within
919                  the frame.  */
920               r0_val = ((insn & 0xff) ^ 0x80) - 0x80;
921             }
922
923           else if (IS_ADD_SP_R0 (insn))
924             {
925               /* This instruction still prepares r0, but we don't care.
926                  We already have the offset in r0_val.  */
927             }
928
929           else if (IS_STS_R0 (insn))
930             {
931               /* Store PR at r0_val-4 from SP.  Decrement r0 by 4.  */
932               cache->saved_regs[PR_REGNUM] = cache->sp_offset - (r0_val - 4);
933               r0_val -= 4;
934             }
935
936           else if (IS_MOV_R14_R0 (insn))
937             {
938               /* Store R14 at r0_val-4 from SP.  Decrement r0 by 4.  */
939               cache->saved_regs[MEDIA_FP_REGNUM] = cache->sp_offset
940                                                    - (r0_val - 4);
941               r0_val -= 4;
942             }
943
944           else if (IS_ADD_SP (insn))
945             cache->sp_offset -= ((insn & 0xff) ^ 0x80) - 0x80;
946
947           else if (IS_MOV_SP_FP (insn))
948             break;
949         }
950       else
951         {
952           if (IS_ADDIL_SP_MEDIA (insn) || IS_ADDI_SP_MEDIA (insn))
953             cache->sp_offset -=
954               sign_extend ((((insn & 0xffc00) ^ 0x80000) - 0x80000) >> 10, 9);
955
956           else if (IS_STQ_R18_R15 (insn))
957             cache->saved_regs[PR_REGNUM]
958               = cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10,
959                                                  9) << 3);
960
961           else if (IS_STL_R18_R15 (insn))
962             cache->saved_regs[PR_REGNUM]
963               = cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10,
964                                                  9) << 2);
965
966           else if (IS_STQ_R14_R15 (insn))
967             cache->saved_regs[MEDIA_FP_REGNUM]
968               = cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10,
969                                                  9) << 3);
970
971           else if (IS_STL_R14_R15 (insn))
972             cache->saved_regs[MEDIA_FP_REGNUM]
973               = cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10,
974                                                  9) << 2);
975
976           else if (IS_MOV_SP_FP_MEDIA (insn))
977             break;
978         }
979     }
980
981   if (cache->saved_regs[MEDIA_FP_REGNUM] >= 0)
982     cache->uses_fp = 1;
983 }
984
985 static CORE_ADDR
986 sh64_frame_align (struct gdbarch *ignore, CORE_ADDR sp)
987 {
988   return sp & ~7;
989 }
990
991 /* Function: push_dummy_call
992    Setup the function arguments for calling a function in the inferior.
993
994    On the Renesas SH architecture, there are four registers (R4 to R7)
995    which are dedicated for passing function arguments.  Up to the first
996    four arguments (depending on size) may go into these registers.
997    The rest go on the stack.
998
999    Arguments that are smaller than 4 bytes will still take up a whole
1000    register or a whole 32-bit word on the stack, and will be 
1001    right-justified in the register or the stack word.  This includes
1002    chars, shorts, and small aggregate types.
1003
1004    Arguments that are larger than 4 bytes may be split between two or 
1005    more registers.  If there are not enough registers free, an argument
1006    may be passed partly in a register (or registers), and partly on the
1007    stack.  This includes doubles, long longs, and larger aggregates.
1008    As far as I know, there is no upper limit to the size of aggregates 
1009    that will be passed in this way; in other words, the convention of 
1010    passing a pointer to a large aggregate instead of a copy is not used.
1011
1012    An exceptional case exists for struct arguments (and possibly other
1013    aggregates such as arrays) if the size is larger than 4 bytes but 
1014    not a multiple of 4 bytes.  In this case the argument is never split 
1015    between the registers and the stack, but instead is copied in its
1016    entirety onto the stack, AND also copied into as many registers as 
1017    there is room for.  In other words, space in registers permitting, 
1018    two copies of the same argument are passed in.  As far as I can tell,
1019    only the one on the stack is used, although that may be a function 
1020    of the level of compiler optimization.  I suspect this is a compiler
1021    bug.  Arguments of these odd sizes are left-justified within the 
1022    word (as opposed to arguments smaller than 4 bytes, which are 
1023    right-justified).
1024
1025    If the function is to return an aggregate type such as a struct, it 
1026    is either returned in the normal return value register R0 (if its 
1027    size is no greater than one byte), or else the caller must allocate
1028    space into which the callee will copy the return value (if the size
1029    is greater than one byte).  In this case, a pointer to the return 
1030    value location is passed into the callee in register R2, which does 
1031    not displace any of the other arguments passed in via registers R4
1032    to R7.  */
1033
1034 /* R2-R9 for integer types and integer equivalent (char, pointers) and
1035    non-scalar (struct, union) elements (even if the elements are
1036    floats).  
1037    FR0-FR11 for single precision floating point (float)
1038    DR0-DR10 for double precision floating point (double) 
1039    
1040    If a float is argument number 3 (for instance) and arguments number
1041    1,2, and 4 are integer, the mapping will be:
1042    arg1 -->R2, arg2 --> R3, arg3 -->FR0, arg4 --> R5.  I.e. R4 is not used.
1043    
1044    If a float is argument number 10 (for instance) and arguments number
1045    1 through 10 are integer, the mapping will be:
1046    arg1->R2, arg2->R3, arg3->R4, arg4->R5, arg5->R6, arg6->R7, arg7->R8,
1047    arg8->R9, arg9->(0,SP)stack(8-byte aligned), arg10->FR0,
1048    arg11->stack(16,SP).  I.e. there is hole in the stack.
1049
1050    Different rules apply for variable arguments functions, and for functions
1051    for which the prototype is not known.  */
1052
1053 static CORE_ADDR
1054 sh64_push_dummy_call (struct gdbarch *gdbarch,
1055                       struct value *function,
1056                       struct regcache *regcache,
1057                       CORE_ADDR bp_addr,
1058                       int nargs, struct value **args,
1059                       CORE_ADDR sp, int struct_return,
1060                       CORE_ADDR struct_addr)
1061 {
1062   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1063   int stack_offset, stack_alloc;
1064   int int_argreg;
1065   int float_argreg;
1066   int double_argreg;
1067   int float_arg_index = 0;
1068   int double_arg_index = 0;
1069   int argnum;
1070   struct type *type;
1071   CORE_ADDR regval;
1072   char *val;
1073   char valbuf[8];
1074   char valbuf_tmp[8];
1075   int len;
1076   int argreg_size;
1077   int fp_args[12];
1078
1079   memset (fp_args, 0, sizeof (fp_args));
1080
1081   /* First force sp to a 8-byte alignment.  */
1082   sp = sh64_frame_align (gdbarch, sp);
1083
1084   /* The "struct return pointer" pseudo-argument has its own dedicated 
1085      register.  */
1086
1087   if (struct_return)
1088     regcache_cooked_write_unsigned (regcache, 
1089                                     STRUCT_RETURN_REGNUM, struct_addr);
1090
1091   /* Now make sure there's space on the stack.  */
1092   for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
1093     stack_alloc += ((TYPE_LENGTH (value_type (args[argnum])) + 7) & ~7);
1094   sp -= stack_alloc;            /* Make room on stack for args.  */
1095
1096   /* Now load as many as possible of the first arguments into
1097      registers, and push the rest onto the stack.  There are 64 bytes
1098      in eight registers available.  Loop thru args from first to last.  */
1099
1100   int_argreg = ARG0_REGNUM;
1101   float_argreg = gdbarch_fp0_regnum (gdbarch);
1102   double_argreg = DR0_REGNUM;
1103
1104   for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
1105     {
1106       type = value_type (args[argnum]);
1107       len = TYPE_LENGTH (type);
1108       memset (valbuf, 0, sizeof (valbuf));
1109       
1110       if (TYPE_CODE (type) != TYPE_CODE_FLT)
1111         {
1112           argreg_size = register_size (gdbarch, int_argreg);
1113
1114           if (len < argreg_size)
1115             {
1116               /* value gets right-justified in the register or stack word.  */
1117               if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1118                 memcpy (valbuf + argreg_size - len,
1119                         (char *) value_contents (args[argnum]), len);
1120               else
1121                 memcpy (valbuf, (char *) value_contents (args[argnum]), len);
1122
1123               val = valbuf;
1124             }
1125           else
1126             val = (char *) value_contents (args[argnum]);
1127
1128           while (len > 0)
1129             {
1130               if (int_argreg > ARGLAST_REGNUM)
1131                 {                       
1132                   /* Must go on the stack.  */
1133                   write_memory (sp + stack_offset, (const bfd_byte *) val,
1134                                 argreg_size);
1135                   stack_offset += 8;/*argreg_size;*/
1136                 }
1137               /* NOTE WELL!!!!!  This is not an "else if" clause!!!
1138                  That's because some *&^%$ things get passed on the stack
1139                  AND in the registers!   */
1140               if (int_argreg <= ARGLAST_REGNUM)
1141                 {                       
1142                   /* There's room in a register.  */
1143                   regval = extract_unsigned_integer (val, argreg_size,
1144                                                      byte_order);
1145                   regcache_cooked_write_unsigned (regcache,
1146                                                   int_argreg, regval);
1147                 }
1148               /* Store the value 8 bytes at a time.  This means that
1149                  things larger than 8 bytes may go partly in registers
1150                  and partly on the stack.  FIXME: argreg is incremented
1151                  before we use its size.  */
1152               len -= argreg_size;
1153               val += argreg_size;
1154               int_argreg++;
1155             }
1156         }
1157       else
1158         {
1159           val = (char *) value_contents (args[argnum]);
1160           if (len == 4)
1161             {
1162               /* Where is it going to be stored?  */
1163               while (fp_args[float_arg_index])
1164                 float_arg_index ++;
1165
1166               /* Now float_argreg points to the register where it
1167                  should be stored.  Are we still within the allowed
1168                  register set?  */
1169               if (float_arg_index <= FLOAT_ARGLAST_REGNUM)
1170                 {
1171                   /* Goes in FR0...FR11 */
1172                   regcache_cooked_write (regcache,
1173                                          gdbarch_fp0_regnum (gdbarch)
1174                                          + float_arg_index,
1175                                          val);
1176                   fp_args[float_arg_index] = 1;
1177                   /* Skip the corresponding general argument register.  */
1178                   int_argreg ++;
1179                 }
1180               else 
1181                 ;
1182                 /* Store it as the integers, 8 bytes at the time, if
1183                    necessary spilling on the stack.  */
1184               
1185             }
1186             else if (len == 8)
1187               {
1188                 /* Where is it going to be stored?  */
1189                 while (fp_args[double_arg_index])
1190                   double_arg_index += 2;
1191                 /* Now double_argreg points to the register
1192                    where it should be stored.
1193                    Are we still within the allowed register set?  */
1194                 if (double_arg_index < FLOAT_ARGLAST_REGNUM)
1195                   {
1196                     /* Goes in DR0...DR10 */
1197                     /* The numbering of the DRi registers is consecutive,
1198                        i.e. includes odd numbers.  */
1199                     int double_register_offset = double_arg_index / 2;
1200                     int regnum = DR0_REGNUM + double_register_offset;
1201                     regcache_cooked_write (regcache, regnum, val);
1202                     fp_args[double_arg_index] = 1;
1203                     fp_args[double_arg_index + 1] = 1;
1204                     /* Skip the corresponding general argument register.  */
1205                     int_argreg ++;
1206                   }
1207                 else
1208                   ;
1209                   /* Store it as the integers, 8 bytes at the time, if
1210                      necessary spilling on the stack.  */
1211               }
1212         }
1213     }
1214   /* Store return address.  */
1215   regcache_cooked_write_unsigned (regcache, PR_REGNUM, bp_addr);
1216
1217   /* Update stack pointer.  */
1218   regcache_cooked_write_unsigned (regcache,
1219                                   gdbarch_sp_regnum (gdbarch), sp);
1220
1221   return sp;
1222 }
1223
1224 /* Find a function's return value in the appropriate registers (in
1225    regbuf), and copy it into valbuf.  Extract from an array REGBUF
1226    containing the (raw) register state a function return value of type
1227    TYPE, and copy that, in virtual format, into VALBUF.  */
1228 static void
1229 sh64_extract_return_value (struct type *type, struct regcache *regcache,
1230                            void *valbuf)
1231 {
1232   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1233   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1234   int len = TYPE_LENGTH (type);
1235
1236   if (TYPE_CODE (type) == TYPE_CODE_FLT)
1237     {
1238       if (len == 4)
1239         {
1240           /* Return value stored in gdbarch_fp0_regnum.  */
1241           regcache_raw_read (regcache,
1242                              gdbarch_fp0_regnum (gdbarch), valbuf);
1243         }
1244       else if (len == 8)
1245         {
1246           /* return value stored in DR0_REGNUM.  */
1247           DOUBLEST val;
1248           gdb_byte buf[8];
1249
1250           regcache_cooked_read (regcache, DR0_REGNUM, buf);
1251           
1252           if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1253             floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
1254                                      buf, &val);
1255           else
1256             floatformat_to_doublest (&floatformat_ieee_double_big,
1257                                      buf, &val);
1258           store_typed_floating (valbuf, type, val);
1259         }
1260     }
1261   else
1262     { 
1263       if (len <= 8)
1264         {
1265           int offset;
1266           char buf[8];
1267           /* Result is in register 2.  If smaller than 8 bytes, it is padded 
1268              at the most significant end.  */
1269           regcache_raw_read (regcache, DEFAULT_RETURN_REGNUM, buf);
1270
1271           if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1272             offset = register_size (gdbarch, DEFAULT_RETURN_REGNUM)
1273                      - len;
1274           else
1275             offset = 0;
1276           memcpy (valbuf, buf + offset, len);
1277         }
1278       else
1279         error (_("bad size for return value"));
1280     }
1281 }
1282
1283 /* Write into appropriate registers a function return value
1284    of type TYPE, given in virtual format.
1285    If the architecture is sh4 or sh3e, store a function's return value
1286    in the R0 general register or in the FP0 floating point register,
1287    depending on the type of the return value.  In all the other cases
1288    the result is stored in r0, left-justified.  */
1289
1290 static void
1291 sh64_store_return_value (struct type *type, struct regcache *regcache,
1292                          const void *valbuf)
1293 {
1294   struct gdbarch *gdbarch = get_regcache_arch (regcache);
1295   char buf[64]; /* more than enough...  */
1296   int len = TYPE_LENGTH (type);
1297
1298   if (TYPE_CODE (type) == TYPE_CODE_FLT)
1299     {
1300       int i, regnum = gdbarch_fp0_regnum (gdbarch);
1301       for (i = 0; i < len; i += 4)
1302         if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1303           regcache_raw_write (regcache, regnum++,
1304                               (char *) valbuf + len - 4 - i);
1305         else
1306           regcache_raw_write (regcache, regnum++, (char *) valbuf + i);
1307     }
1308   else
1309     {
1310       int return_register = DEFAULT_RETURN_REGNUM;
1311       int offset = 0;
1312
1313       if (len <= register_size (gdbarch, return_register))
1314         {
1315           /* Pad with zeros.  */
1316           memset (buf, 0, register_size (gdbarch, return_register));
1317           if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1318             offset = 0; /*register_size (gdbarch, 
1319                           return_register) - len;*/
1320           else
1321             offset = register_size (gdbarch, return_register) - len;
1322
1323           memcpy (buf + offset, valbuf, len);
1324           regcache_raw_write (regcache, return_register, buf);
1325         }
1326       else
1327         regcache_raw_write (regcache, return_register, valbuf);
1328     }
1329 }
1330
1331 static enum return_value_convention
1332 sh64_return_value (struct gdbarch *gdbarch, struct type *func_type,
1333                    struct type *type, struct regcache *regcache,
1334                    gdb_byte *readbuf, const gdb_byte *writebuf)
1335 {
1336   if (sh64_use_struct_convention (type))
1337     return RETURN_VALUE_STRUCT_CONVENTION;
1338   if (writebuf)
1339     sh64_store_return_value (type, regcache, writebuf);
1340   else if (readbuf)
1341     sh64_extract_return_value (type, regcache, readbuf);
1342   return RETURN_VALUE_REGISTER_CONVENTION;
1343 }
1344
1345 static void
1346 sh64_show_media_regs (struct frame_info *frame)
1347 {
1348   struct gdbarch *gdbarch = get_frame_arch (frame);
1349   int i;
1350
1351   printf_filtered
1352     ("PC=%s SR=%s\n",
1353      phex (get_frame_register_unsigned (frame,
1354                                         gdbarch_pc_regnum (gdbarch)), 8),
1355      phex (get_frame_register_unsigned (frame, SR_REGNUM), 8));
1356
1357   printf_filtered
1358     ("SSR=%s SPC=%s\n",
1359      phex (get_frame_register_unsigned (frame, SSR_REGNUM), 8),
1360      phex (get_frame_register_unsigned (frame, SPC_REGNUM), 8));
1361   printf_filtered
1362     ("FPSCR=%s\n ",
1363      phex (get_frame_register_unsigned (frame, FPSCR_REGNUM), 8));
1364
1365   for (i = 0; i < 64; i = i + 4)
1366     printf_filtered
1367       ("\nR%d-R%d  %s %s %s %s\n",
1368        i, i + 3,
1369       phex (get_frame_register_unsigned (frame, i + 0), 8),
1370       phex (get_frame_register_unsigned (frame, i + 1), 8),
1371       phex (get_frame_register_unsigned (frame, i + 2), 8),
1372       phex (get_frame_register_unsigned (frame, i + 3), 8));
1373
1374   printf_filtered ("\n");
1375   
1376   for (i = 0; i < 64; i = i + 8)
1377     printf_filtered
1378       ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
1379        i, i + 7,
1380        (long) get_frame_register_unsigned
1381                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 0),
1382        (long) get_frame_register_unsigned
1383                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 1),
1384        (long) get_frame_register_unsigned
1385                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 2),
1386        (long) get_frame_register_unsigned
1387                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 3),
1388        (long) get_frame_register_unsigned
1389                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 4),
1390        (long) get_frame_register_unsigned
1391                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 5),
1392        (long) get_frame_register_unsigned
1393                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 6),
1394        (long) get_frame_register_unsigned
1395                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 7));
1396 }
1397
1398 static void
1399 sh64_show_compact_regs (struct frame_info *frame)
1400 {
1401   struct gdbarch *gdbarch = get_frame_arch (frame);
1402   int i;
1403
1404   printf_filtered
1405     ("PC=%s\n",
1406      phex (get_frame_register_unsigned (frame, PC_C_REGNUM), 8));
1407
1408   printf_filtered
1409     ("GBR=%08lx MACH=%08lx MACL=%08lx PR=%08lx T=%08lx\n",
1410      (long) get_frame_register_unsigned (frame, GBR_C_REGNUM),
1411      (long) get_frame_register_unsigned (frame, MACH_C_REGNUM),
1412      (long) get_frame_register_unsigned (frame, MACL_C_REGNUM),
1413      (long) get_frame_register_unsigned (frame, PR_C_REGNUM),
1414      (long) get_frame_register_unsigned (frame, T_C_REGNUM));
1415   printf_filtered
1416     ("FPSCR=%08lx FPUL=%08lx\n",
1417      (long) get_frame_register_unsigned (frame, FPSCR_C_REGNUM),
1418      (long) get_frame_register_unsigned (frame, FPUL_C_REGNUM));
1419
1420   for (i = 0; i < 16; i = i + 4)
1421     printf_filtered
1422       ("\nR%d-R%d  %08lx %08lx %08lx %08lx\n",
1423        i, i + 3,
1424        (long) get_frame_register_unsigned (frame, i + 0),
1425        (long) get_frame_register_unsigned (frame, i + 1),
1426        (long) get_frame_register_unsigned (frame, i + 2),
1427        (long) get_frame_register_unsigned (frame, i + 3));
1428
1429   printf_filtered ("\n");
1430   
1431   for (i = 0; i < 16; i = i + 8)
1432     printf_filtered
1433       ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
1434        i, i + 7,
1435        (long) get_frame_register_unsigned
1436                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 0),
1437        (long) get_frame_register_unsigned
1438                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 1),
1439        (long) get_frame_register_unsigned
1440                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 2),
1441        (long) get_frame_register_unsigned
1442                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 3),
1443        (long) get_frame_register_unsigned
1444                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 4),
1445        (long) get_frame_register_unsigned
1446                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 5),
1447        (long) get_frame_register_unsigned
1448                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 6),
1449        (long) get_frame_register_unsigned
1450                 (frame, gdbarch_fp0_regnum (gdbarch) + i + 7));
1451 }
1452
1453 /* FIXME!!! This only shows the registers for shmedia, excluding the
1454    pseudo registers.  */
1455 void
1456 sh64_show_regs (struct frame_info *frame)
1457 {
1458   if (pc_is_isa32 (get_frame_pc (frame)))
1459     sh64_show_media_regs (frame);
1460   else
1461     sh64_show_compact_regs (frame);
1462 }
1463
1464 /* *INDENT-OFF* */
1465 /*
1466     SH MEDIA MODE (ISA 32)
1467     general registers (64-bit) 0-63
1468 0    r0,   r1,   r2,   r3,   r4,   r5,   r6,   r7,
1469 64   r8,   r9,   r10,  r11,  r12,  r13,  r14,  r15,
1470 128  r16,  r17,  r18,  r19,  r20,  r21,  r22,  r23,
1471 192  r24,  r25,  r26,  r27,  r28,  r29,  r30,  r31,
1472 256  r32,  r33,  r34,  r35,  r36,  r37,  r38,  r39,
1473 320  r40,  r41,  r42,  r43,  r44,  r45,  r46,  r47,
1474 384  r48,  r49,  r50,  r51,  r52,  r53,  r54,  r55,
1475 448  r56,  r57,  r58,  r59,  r60,  r61,  r62,  r63,
1476
1477     pc (64-bit) 64
1478 512  pc,
1479
1480     status reg., saved status reg., saved pc reg. (64-bit) 65-67
1481 520  sr,  ssr,  spc,
1482
1483     target registers (64-bit) 68-75
1484 544  tr0,  tr1,  tr2,  tr3,  tr4,  tr5,  tr6,  tr7,
1485
1486     floating point state control register (32-bit) 76
1487 608  fpscr,
1488
1489     single precision floating point registers (32-bit) 77-140
1490 612  fr0,  fr1,  fr2,  fr3,  fr4,  fr5,  fr6,  fr7,
1491 644  fr8,  fr9,  fr10, fr11, fr12, fr13, fr14, fr15,
1492 676  fr16, fr17, fr18, fr19, fr20, fr21, fr22, fr23,
1493 708  fr24, fr25, fr26, fr27, fr28, fr29, fr30, fr31,
1494 740  fr32, fr33, fr34, fr35, fr36, fr37, fr38, fr39,
1495 772  fr40, fr41, fr42, fr43, fr44, fr45, fr46, fr47,
1496 804  fr48, fr49, fr50, fr51, fr52, fr53, fr54, fr55,
1497 836  fr56, fr57, fr58, fr59, fr60, fr61, fr62, fr63,
1498
1499 TOTAL SPACE FOR REGISTERS: 868 bytes
1500
1501 From here on they are all pseudo registers: no memory allocated.
1502 REGISTER_BYTE returns the register byte for the base register.
1503
1504     double precision registers (pseudo) 141-172
1505      dr0,  dr2,  dr4,  dr6,  dr8,  dr10, dr12, dr14,
1506      dr16, dr18, dr20, dr22, dr24, dr26, dr28, dr30,
1507      dr32, dr34, dr36, dr38, dr40, dr42, dr44, dr46,
1508      dr48, dr50, dr52, dr54, dr56, dr58, dr60, dr62,
1509  
1510     floating point pairs (pseudo) 173-204
1511      fp0,  fp2,  fp4,  fp6,  fp8,  fp10, fp12, fp14,
1512      fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30,
1513      fp32, fp34, fp36, fp38, fp40, fp42, fp44, fp46,
1514      fp48, fp50, fp52, fp54, fp56, fp58, fp60, fp62,
1515  
1516     floating point vectors (4 floating point regs) (pseudo) 205-220
1517      fv0,  fv4,  fv8,  fv12, fv16, fv20, fv24, fv28,
1518      fv32, fv36, fv40, fv44, fv48, fv52, fv56, fv60,
1519  
1520     SH COMPACT MODE (ISA 16) (all pseudo) 221-272
1521      r0_c, r1_c, r2_c,  r3_c,  r4_c,  r5_c,  r6_c,  r7_c,
1522      r8_c, r9_c, r10_c, r11_c, r12_c, r13_c, r14_c, r15_c,
1523      pc_c,
1524      gbr_c, mach_c, macl_c, pr_c, t_c,
1525      fpscr_c, fpul_c,
1526      fr0_c, fr1_c, fr2_c,  fr3_c,  fr4_c,  fr5_c,  fr6_c,  fr7_c,
1527      fr8_c, fr9_c, fr10_c, fr11_c, fr12_c, fr13_c, fr14_c, fr15_c
1528      dr0_c, dr2_c, dr4_c,  dr6_c,  dr8_c,  dr10_c, dr12_c, dr14_c
1529      fv0_c, fv4_c, fv8_c,  fv12_c
1530 */
1531
1532 static struct type *
1533 sh64_build_float_register_type (struct gdbarch *gdbarch, int high)
1534 {
1535   return lookup_array_range_type (builtin_type (gdbarch)->builtin_float,
1536                                   0, high);
1537 }
1538
1539 /* Return the GDB type object for the "standard" data type
1540    of data in register REG_NR.  */
1541 static struct type *
1542 sh64_register_type (struct gdbarch *gdbarch, int reg_nr)
1543 {
1544   if ((reg_nr >= gdbarch_fp0_regnum (gdbarch)
1545        && reg_nr <= FP_LAST_REGNUM)
1546       || (reg_nr >= FP0_C_REGNUM
1547           && reg_nr <= FP_LAST_C_REGNUM))
1548     return builtin_type (gdbarch)->builtin_float;
1549   else if ((reg_nr >= DR0_REGNUM 
1550             && reg_nr <= DR_LAST_REGNUM)
1551            || (reg_nr >= DR0_C_REGNUM 
1552                && reg_nr <= DR_LAST_C_REGNUM))
1553     return builtin_type (gdbarch)->builtin_double;
1554   else if  (reg_nr >= FPP0_REGNUM 
1555             && reg_nr <= FPP_LAST_REGNUM)
1556     return sh64_build_float_register_type (gdbarch, 1);
1557   else if ((reg_nr >= FV0_REGNUM
1558             && reg_nr <= FV_LAST_REGNUM)
1559            ||(reg_nr >= FV0_C_REGNUM 
1560               && reg_nr <= FV_LAST_C_REGNUM))
1561     return sh64_build_float_register_type (gdbarch, 3);
1562   else if (reg_nr == FPSCR_REGNUM)
1563     return builtin_type (gdbarch)->builtin_int;
1564   else if (reg_nr >= R0_C_REGNUM
1565            && reg_nr < FP0_C_REGNUM)
1566     return builtin_type (gdbarch)->builtin_int;
1567   else
1568     return builtin_type (gdbarch)->builtin_long_long;
1569 }
1570
1571 static void
1572 sh64_register_convert_to_virtual (struct gdbarch *gdbarch, int regnum,
1573                                   struct type *type, char *from, char *to)
1574 {
1575   if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE)
1576     {
1577       /* It is a no-op.  */
1578       memcpy (to, from, register_size (gdbarch, regnum));
1579       return;
1580     }
1581
1582   if ((regnum >= DR0_REGNUM 
1583        && regnum <= DR_LAST_REGNUM)
1584       || (regnum >= DR0_C_REGNUM 
1585           && regnum <= DR_LAST_C_REGNUM))
1586     {
1587       DOUBLEST val;
1588       floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, 
1589                                from, &val);
1590       store_typed_floating (to, type, val);
1591     }
1592   else
1593     error (_("sh64_register_convert_to_virtual "
1594              "called with non DR register number"));
1595 }
1596
1597 static void
1598 sh64_register_convert_to_raw (struct gdbarch *gdbarch, struct type *type,
1599                               int regnum, const void *from, void *to)
1600 {
1601   if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE)
1602     {
1603       /* It is a no-op.  */
1604       memcpy (to, from, register_size (gdbarch, regnum));
1605       return;
1606     }
1607
1608   if ((regnum >= DR0_REGNUM 
1609        && regnum <= DR_LAST_REGNUM)
1610       || (regnum >= DR0_C_REGNUM 
1611           && regnum <= DR_LAST_C_REGNUM))
1612     {
1613       DOUBLEST val = extract_typed_floating (from, type);
1614       floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, 
1615                                  &val, to);
1616     }
1617   else
1618     error (_("sh64_register_convert_to_raw called "
1619              "with non DR register number"));
1620 }
1621
1622 static void
1623 sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
1624                            int reg_nr, gdb_byte *buffer)
1625 {
1626   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1627   int base_regnum;
1628   int portion;
1629   int offset = 0;
1630   char temp_buffer[MAX_REGISTER_SIZE];
1631
1632   if (reg_nr >= DR0_REGNUM 
1633       && reg_nr <= DR_LAST_REGNUM)
1634     {
1635       base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr);
1636
1637       /* Build the value in the provided buffer.  */ 
1638       /* DR regs are double precision registers obtained by
1639          concatenating 2 single precision floating point registers.  */
1640       for (portion = 0; portion < 2; portion++)
1641         regcache_raw_read (regcache, base_regnum + portion, 
1642                            (temp_buffer
1643                             + register_size (gdbarch, base_regnum) * portion));
1644
1645       /* We must pay attention to the endianness.  */
1646       sh64_register_convert_to_virtual (gdbarch, reg_nr,
1647                                         register_type (gdbarch, reg_nr),
1648                                         temp_buffer, buffer);
1649
1650     }
1651
1652   else if (reg_nr >= FPP0_REGNUM 
1653            && reg_nr <= FPP_LAST_REGNUM)
1654     {
1655       base_regnum = sh64_fpp_reg_base_num (gdbarch, reg_nr);
1656
1657       /* Build the value in the provided buffer.  */ 
1658       /* FPP regs are pairs of single precision registers obtained by
1659          concatenating 2 single precision floating point registers.  */
1660       for (portion = 0; portion < 2; portion++)
1661         regcache_raw_read (regcache, base_regnum + portion, 
1662                            ((char *) buffer
1663                             + register_size (gdbarch, base_regnum) * portion));
1664     }
1665
1666   else if (reg_nr >= FV0_REGNUM 
1667            && reg_nr <= FV_LAST_REGNUM)
1668     {
1669       base_regnum = sh64_fv_reg_base_num (gdbarch, reg_nr);
1670
1671       /* Build the value in the provided buffer.  */ 
1672       /* FV regs are vectors of single precision registers obtained by
1673          concatenating 4 single precision floating point registers.  */
1674       for (portion = 0; portion < 4; portion++)
1675         regcache_raw_read (regcache, base_regnum + portion, 
1676                            ((char *) buffer
1677                             + register_size (gdbarch, base_regnum) * portion));
1678     }
1679
1680   /* sh compact pseudo registers.  1-to-1 with a shmedia register.  */
1681   else if (reg_nr >= R0_C_REGNUM 
1682            && reg_nr <= T_C_REGNUM)
1683     {
1684       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1685
1686       /* Build the value in the provided buffer.  */ 
1687       regcache_raw_read (regcache, base_regnum, temp_buffer);
1688       if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1689         offset = 4;
1690       memcpy (buffer,
1691               temp_buffer + offset, 4); /* get LOWER 32 bits only????  */
1692     }
1693
1694   else if (reg_nr >= FP0_C_REGNUM
1695            && reg_nr <= FP_LAST_C_REGNUM)
1696     {
1697       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1698
1699       /* Build the value in the provided buffer.  */ 
1700       /* Floating point registers map 1-1 to the media fp regs,
1701          they have the same size and endianness.  */
1702       regcache_raw_read (regcache, base_regnum, buffer);
1703     }
1704
1705   else if (reg_nr >= DR0_C_REGNUM 
1706            && reg_nr <= DR_LAST_C_REGNUM)
1707     {
1708       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1709
1710       /* DR_C regs are double precision registers obtained by
1711          concatenating 2 single precision floating point registers.  */
1712       for (portion = 0; portion < 2; portion++)
1713         regcache_raw_read (regcache, base_regnum + portion, 
1714                            (temp_buffer
1715                             + register_size (gdbarch, base_regnum) * portion));
1716
1717       /* We must pay attention to the endianness.  */
1718       sh64_register_convert_to_virtual (gdbarch, reg_nr, 
1719                                         register_type (gdbarch, reg_nr),
1720                                         temp_buffer, buffer);
1721     }
1722
1723   else if (reg_nr >= FV0_C_REGNUM 
1724            && reg_nr <= FV_LAST_C_REGNUM)
1725     {
1726       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1727
1728       /* Build the value in the provided buffer.  */ 
1729       /* FV_C regs are vectors of single precision registers obtained by
1730          concatenating 4 single precision floating point registers.  */
1731       for (portion = 0; portion < 4; portion++)
1732         regcache_raw_read (regcache, base_regnum + portion, 
1733                            ((char *) buffer
1734                             + register_size (gdbarch, base_regnum) * portion));
1735     }
1736
1737   else if (reg_nr == FPSCR_C_REGNUM)
1738     {
1739       int fpscr_base_regnum;
1740       int sr_base_regnum;
1741       unsigned int fpscr_value;
1742       unsigned int sr_value;
1743       unsigned int fpscr_c_value;
1744       unsigned int fpscr_c_part1_value;
1745       unsigned int fpscr_c_part2_value;
1746
1747       fpscr_base_regnum = FPSCR_REGNUM;
1748       sr_base_regnum = SR_REGNUM;
1749
1750       /* Build the value in the provided buffer.  */ 
1751       /* FPSCR_C is a very weird register that contains sparse bits
1752          from the FPSCR and the SR architectural registers.
1753          Specifically: */
1754       /* *INDENT-OFF* */
1755       /*
1756          FPSRC_C bit
1757             0         Bit 0 of FPSCR
1758             1         reserved
1759             2-17      Bit 2-18 of FPSCR
1760             18-20     Bits 12,13,14 of SR
1761             21-31     reserved
1762        */
1763       /* *INDENT-ON* */
1764       /* Get FPSCR into a local buffer.  */
1765       regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
1766       /* Get value as an int.  */
1767       fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1768       /* Get SR into a local buffer */
1769       regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
1770       /* Get value as an int.  */
1771       sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1772       /* Build the new value.  */
1773       fpscr_c_part1_value = fpscr_value & 0x3fffd;
1774       fpscr_c_part2_value = (sr_value & 0x7000) << 6;
1775       fpscr_c_value = fpscr_c_part1_value | fpscr_c_part2_value;
1776       /* Store that in out buffer!!!  */
1777       store_unsigned_integer (buffer, 4, byte_order, fpscr_c_value);
1778       /* FIXME There is surely an endianness gotcha here.  */
1779     }
1780
1781   else if (reg_nr == FPUL_C_REGNUM)
1782     {
1783       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1784
1785       /* FPUL_C register is floating point register 32,
1786          same size, same endianness.  */
1787       regcache_raw_read (regcache, base_regnum, buffer);
1788     }
1789 }
1790
1791 static void
1792 sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
1793                             int reg_nr, const gdb_byte *buffer)
1794 {
1795   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1796   int base_regnum, portion;
1797   int offset;
1798   char temp_buffer[MAX_REGISTER_SIZE];
1799
1800   if (reg_nr >= DR0_REGNUM
1801       && reg_nr <= DR_LAST_REGNUM)
1802     {
1803       base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr);
1804       /* We must pay attention to the endianness.  */
1805       sh64_register_convert_to_raw (gdbarch, register_type (gdbarch, reg_nr),
1806                                     reg_nr,
1807                                     buffer, temp_buffer);
1808
1809       /* Write the real regs for which this one is an alias.  */
1810       for (portion = 0; portion < 2; portion++)
1811         regcache_raw_write (regcache, base_regnum + portion, 
1812                             (temp_buffer
1813                              + register_size (gdbarch, 
1814                                               base_regnum) * portion));
1815     }
1816
1817   else if (reg_nr >= FPP0_REGNUM 
1818            && reg_nr <= FPP_LAST_REGNUM)
1819     {
1820       base_regnum = sh64_fpp_reg_base_num (gdbarch, reg_nr);
1821
1822       /* Write the real regs for which this one is an alias.  */
1823       for (portion = 0; portion < 2; portion++)
1824         regcache_raw_write (regcache, base_regnum + portion,
1825                             ((char *) buffer
1826                              + register_size (gdbarch, 
1827                                               base_regnum) * portion));
1828     }
1829
1830   else if (reg_nr >= FV0_REGNUM
1831            && reg_nr <= FV_LAST_REGNUM)
1832     {
1833       base_regnum = sh64_fv_reg_base_num (gdbarch, reg_nr);
1834
1835       /* Write the real regs for which this one is an alias.  */
1836       for (portion = 0; portion < 4; portion++)
1837         regcache_raw_write (regcache, base_regnum + portion,
1838                             ((char *) buffer
1839                              + register_size (gdbarch, 
1840                                               base_regnum) * portion));
1841     }
1842
1843   /* sh compact general pseudo registers.  1-to-1 with a shmedia
1844      register but only 4 bytes of it.  */
1845   else if (reg_nr >= R0_C_REGNUM 
1846            && reg_nr <= T_C_REGNUM)
1847     {
1848       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1849       /* reg_nr is 32 bit here, and base_regnum is 64 bits.  */
1850       if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1851         offset = 4;
1852       else 
1853         offset = 0;
1854       /* Let's read the value of the base register into a temporary
1855          buffer, so that overwriting the last four bytes with the new
1856          value of the pseudo will leave the upper 4 bytes unchanged.  */
1857       regcache_raw_read (regcache, base_regnum, temp_buffer);
1858       /* Write as an 8 byte quantity.  */
1859       memcpy (temp_buffer + offset, buffer, 4);
1860       regcache_raw_write (regcache, base_regnum, temp_buffer);
1861     }
1862
1863   /* sh floating point compact pseudo registers.  1-to-1 with a shmedia
1864      registers.  Both are 4 bytes.  */
1865   else if (reg_nr >= FP0_C_REGNUM
1866                && reg_nr <= FP_LAST_C_REGNUM)
1867     {
1868       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1869       regcache_raw_write (regcache, base_regnum, buffer);
1870     }
1871
1872   else if (reg_nr >= DR0_C_REGNUM 
1873            && reg_nr <= DR_LAST_C_REGNUM)
1874     {
1875       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1876       for (portion = 0; portion < 2; portion++)
1877         {
1878           /* We must pay attention to the endianness.  */
1879           sh64_register_convert_to_raw (gdbarch,
1880                                         register_type (gdbarch, reg_nr),
1881                                         reg_nr,
1882                                         buffer, temp_buffer);
1883
1884           regcache_raw_write (regcache, base_regnum + portion,
1885                               (temp_buffer
1886                                + register_size (gdbarch, 
1887                                                 base_regnum) * portion));
1888         }
1889     }
1890
1891   else if (reg_nr >= FV0_C_REGNUM 
1892            && reg_nr <= FV_LAST_C_REGNUM)
1893     {
1894       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1895      
1896       for (portion = 0; portion < 4; portion++)
1897         {
1898           regcache_raw_write (regcache, base_regnum + portion,
1899                               ((char *) buffer
1900                                + register_size (gdbarch, 
1901                                                 base_regnum) * portion));
1902         }
1903     }
1904
1905   else if (reg_nr == FPSCR_C_REGNUM)
1906     {      
1907       int fpscr_base_regnum;
1908       int sr_base_regnum;
1909       unsigned int fpscr_value;
1910       unsigned int sr_value;
1911       unsigned int old_fpscr_value;
1912       unsigned int old_sr_value;
1913       unsigned int fpscr_c_value;
1914       unsigned int fpscr_mask;
1915       unsigned int sr_mask;
1916
1917       fpscr_base_regnum = FPSCR_REGNUM;
1918       sr_base_regnum = SR_REGNUM;
1919
1920       /* FPSCR_C is a very weird register that contains sparse bits
1921          from the FPSCR and the SR architectural registers.
1922          Specifically: */
1923       /* *INDENT-OFF* */
1924       /*
1925          FPSRC_C bit
1926             0         Bit 0 of FPSCR
1927             1         reserved
1928             2-17      Bit 2-18 of FPSCR
1929             18-20     Bits 12,13,14 of SR
1930             21-31     reserved
1931        */
1932       /* *INDENT-ON* */
1933       /* Get value as an int.  */
1934       fpscr_c_value = extract_unsigned_integer (buffer, 4, byte_order);
1935
1936       /* Build the new values.  */
1937       fpscr_mask = 0x0003fffd;
1938       sr_mask = 0x001c0000;
1939        
1940       fpscr_value = fpscr_c_value & fpscr_mask;
1941       sr_value = (fpscr_value & sr_mask) >> 6;
1942       
1943       regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
1944       old_fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1945       old_fpscr_value &= 0xfffc0002;
1946       fpscr_value |= old_fpscr_value;
1947       store_unsigned_integer (temp_buffer, 4, byte_order, fpscr_value);
1948       regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer);
1949       
1950       regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
1951       old_sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1952       old_sr_value &= 0xffff8fff;
1953       sr_value |= old_sr_value;
1954       store_unsigned_integer (temp_buffer, 4, byte_order, sr_value);
1955       regcache_raw_write (regcache, sr_base_regnum, temp_buffer);
1956     }
1957
1958   else if (reg_nr == FPUL_C_REGNUM)
1959     {
1960       base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1961       regcache_raw_write (regcache, base_regnum, buffer);
1962     }
1963 }
1964
1965 /* FIXME:!! THIS SHOULD TAKE CARE OF GETTING THE RIGHT PORTION OF THE
1966    shmedia REGISTERS.  */
1967 /* Control registers, compact mode.  */
1968 static void
1969 sh64_do_cr_c_register_info (struct ui_file *file, struct frame_info *frame,
1970                             int cr_c_regnum)
1971 {
1972   switch (cr_c_regnum)
1973     {
1974     case PC_C_REGNUM:
1975       fprintf_filtered (file, "pc_c\t0x%08x\n",
1976           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1977       break;
1978     case GBR_C_REGNUM: 
1979       fprintf_filtered (file, "gbr_c\t0x%08x\n",
1980           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1981       break;
1982     case MACH_C_REGNUM: 
1983       fprintf_filtered (file, "mach_c\t0x%08x\n",
1984           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1985       break;
1986     case MACL_C_REGNUM: 
1987       fprintf_filtered (file, "macl_c\t0x%08x\n",
1988           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1989       break;
1990     case PR_C_REGNUM: 
1991       fprintf_filtered (file, "pr_c\t0x%08x\n",
1992           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1993       break;
1994     case T_C_REGNUM: 
1995       fprintf_filtered (file, "t_c\t0x%08x\n",
1996           (int) get_frame_register_unsigned (frame, cr_c_regnum));
1997       break;
1998     case FPSCR_C_REGNUM: 
1999       fprintf_filtered (file, "fpscr_c\t0x%08x\n",
2000           (int) get_frame_register_unsigned (frame, cr_c_regnum));
2001       break;
2002     case FPUL_C_REGNUM:
2003       fprintf_filtered (file, "fpul_c\t0x%08x\n",
2004           (int) get_frame_register_unsigned (frame, cr_c_regnum));
2005       break;
2006     }
2007 }
2008
2009 static void
2010 sh64_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file,
2011                      struct frame_info *frame, int regnum)
2012 {                               /* Do values for FP (float) regs.  */
2013   unsigned char *raw_buffer;
2014   double flt;   /* Double extracted from raw hex data.  */
2015   int inv;
2016   int j;
2017
2018   /* Allocate space for the float.  */
2019   raw_buffer = (unsigned char *)
2020     alloca (register_size (gdbarch, gdbarch_fp0_regnum (gdbarch)));
2021
2022   /* Get the data in raw format.  */
2023   if (!frame_register_read (frame, regnum, raw_buffer))
2024     error (_("can't read register %d (%s)"),
2025            regnum, gdbarch_register_name (gdbarch, regnum));
2026
2027   /* Get the register as a number.  */ 
2028   flt = unpack_double (builtin_type (gdbarch)->builtin_float,
2029                        raw_buffer, &inv);
2030
2031   /* Print the name and some spaces.  */
2032   fputs_filtered (gdbarch_register_name (gdbarch, regnum), file);
2033   print_spaces_filtered (15 - strlen (gdbarch_register_name
2034                                         (gdbarch, regnum)), file);
2035
2036   /* Print the value.  */
2037   if (inv)
2038     fprintf_filtered (file, "<invalid float>");
2039   else
2040     fprintf_filtered (file, "%-10.9g", flt);
2041
2042   /* Print the fp register as hex.  */
2043   fprintf_filtered (file, "\t(raw 0x");
2044   for (j = 0; j < register_size (gdbarch, regnum); j++)
2045     {
2046       int idx = gdbarch_byte_order (gdbarch)
2047                 == BFD_ENDIAN_BIG ? j : register_size
2048                 (gdbarch, regnum) - 1 - j;
2049       fprintf_filtered (file, "%02x", raw_buffer[idx]);
2050     }
2051   fprintf_filtered (file, ")");
2052   fprintf_filtered (file, "\n");
2053 }
2054
2055 static void
2056 sh64_do_pseudo_register (struct gdbarch *gdbarch, struct ui_file *file,
2057                          struct frame_info *frame, int regnum)
2058 {
2059   /* All the sh64-compact mode registers are pseudo registers.  */
2060
2061   if (regnum < gdbarch_num_regs (gdbarch)
2062       || regnum >= gdbarch_num_regs (gdbarch)
2063                    + NUM_PSEUDO_REGS_SH_MEDIA
2064                    + NUM_PSEUDO_REGS_SH_COMPACT)
2065     internal_error (__FILE__, __LINE__,
2066                     _("Invalid pseudo register number %d\n"), regnum);
2067
2068   else if ((regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM))
2069     {
2070       int fp_regnum = sh64_dr_reg_base_num (gdbarch, regnum);
2071       fprintf_filtered (file, "dr%d\t0x%08x%08x\n", regnum - DR0_REGNUM, 
2072           (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2073           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2074     }
2075
2076   else if ((regnum >= DR0_C_REGNUM && regnum <= DR_LAST_C_REGNUM))
2077     {
2078       int fp_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2079       fprintf_filtered (file, "dr%d_c\t0x%08x%08x\n", regnum - DR0_C_REGNUM,
2080           (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2081           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2082     }
2083
2084   else if ((regnum >= FV0_REGNUM && regnum <= FV_LAST_REGNUM))
2085     {
2086       int fp_regnum = sh64_fv_reg_base_num (gdbarch, regnum);
2087       fprintf_filtered (file, "fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n", 
2088            regnum - FV0_REGNUM, 
2089            (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2090            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1),
2091            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 2),
2092            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 3));
2093     }
2094            
2095   else if ((regnum >= FV0_C_REGNUM && regnum <= FV_LAST_C_REGNUM))
2096     {
2097       int fp_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2098       fprintf_filtered (file, "fv%d_c\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n", 
2099            regnum - FV0_C_REGNUM, 
2100            (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2101            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1),
2102            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 2),
2103            (unsigned) get_frame_register_unsigned (frame, fp_regnum + 3));
2104     }
2105
2106   else if (regnum >= FPP0_REGNUM && regnum <= FPP_LAST_REGNUM)
2107     {
2108       int fp_regnum = sh64_fpp_reg_base_num (gdbarch, regnum);
2109       fprintf_filtered (file, "fpp%d\t0x%08x\t0x%08x\n", regnum - FPP0_REGNUM, 
2110           (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2111           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2112     }
2113
2114   else if (regnum >= R0_C_REGNUM && regnum <= R_LAST_C_REGNUM)
2115     {
2116       int c_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2117       fprintf_filtered (file, "r%d_c\t0x%08x\n", regnum - R0_C_REGNUM, 
2118            (unsigned) get_frame_register_unsigned (frame, c_regnum));
2119     }
2120   else if (regnum >= FP0_C_REGNUM && regnum <= FP_LAST_C_REGNUM)
2121     /* This should work also for pseudoregs.  */
2122     sh64_do_fp_register (gdbarch, file, frame, regnum);
2123   else if (regnum >= PC_C_REGNUM && regnum <= FPUL_C_REGNUM)
2124     sh64_do_cr_c_register_info (file, frame, regnum);
2125 }
2126
2127 static void
2128 sh64_do_register (struct gdbarch *gdbarch, struct ui_file *file,
2129                   struct frame_info *frame, int regnum)
2130 {
2131   unsigned char raw_buffer[MAX_REGISTER_SIZE];
2132   struct value_print_options opts;
2133
2134   fputs_filtered (gdbarch_register_name (gdbarch, regnum), file);
2135   print_spaces_filtered (15 - strlen (gdbarch_register_name
2136                                       (gdbarch, regnum)), file);
2137
2138   /* Get the data in raw format.  */
2139   if (!frame_register_read (frame, regnum, raw_buffer))
2140     fprintf_filtered (file, "*value not available*\n");
2141
2142   get_formatted_print_options (&opts, 'x');
2143   opts.deref_ref = 1;
2144   val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
2145              file, 0, NULL, &opts, current_language);
2146   fprintf_filtered (file, "\t");
2147   get_formatted_print_options (&opts, 0);
2148   opts.deref_ref = 1;
2149   val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
2150              file, 0, NULL, &opts, current_language);
2151   fprintf_filtered (file, "\n");
2152 }
2153
2154 static void
2155 sh64_print_register (struct gdbarch *gdbarch, struct ui_file *file,
2156                      struct frame_info *frame, int regnum)
2157 {
2158   if (regnum < 0 || regnum >= gdbarch_num_regs (gdbarch)
2159                               + gdbarch_num_pseudo_regs (gdbarch))
2160     internal_error (__FILE__, __LINE__,
2161                     _("Invalid register number %d\n"), regnum);
2162
2163   else if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch))
2164     {
2165       if (TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT)
2166         sh64_do_fp_register (gdbarch, file, frame, regnum);     /* FP regs */
2167       else
2168         sh64_do_register (gdbarch, file, frame, regnum);
2169     }
2170
2171   else if (regnum < gdbarch_num_regs (gdbarch)
2172                     + gdbarch_num_pseudo_regs (gdbarch))
2173     sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2174 }
2175
2176 static void
2177 sh64_media_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
2178                                  struct frame_info *frame, int regnum,
2179                                  int fpregs)
2180 {
2181   if (regnum != -1)             /* Do one specified register.  */
2182     {
2183       if (*(gdbarch_register_name (gdbarch, regnum)) == '\0')
2184         error (_("Not a valid register for the current processor type"));
2185
2186       sh64_print_register (gdbarch, file, frame, regnum);
2187     }
2188   else
2189     /* Do all (or most) registers.  */
2190     {
2191       regnum = 0;
2192       while (regnum < gdbarch_num_regs (gdbarch))
2193         {
2194           /* If the register name is empty, it is undefined for this
2195              processor, so don't display anything.  */
2196           if (gdbarch_register_name (gdbarch, regnum) == NULL
2197               || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
2198             { 
2199               regnum++;
2200               continue;
2201             }
2202
2203           if (TYPE_CODE (register_type (gdbarch, regnum))
2204               == TYPE_CODE_FLT)
2205             {
2206               if (fpregs)
2207                 {
2208                   /* true for "INFO ALL-REGISTERS" command.  */
2209                   sh64_do_fp_register (gdbarch, file, frame, regnum);
2210                   regnum ++;
2211                 }
2212               else
2213                 regnum += FP_LAST_REGNUM - gdbarch_fp0_regnum (gdbarch);
2214                 /* skip FP regs */
2215             }
2216           else
2217             {
2218               sh64_do_register (gdbarch, file, frame, regnum);
2219               regnum++;
2220             }
2221         }
2222
2223       if (fpregs)
2224         while (regnum < gdbarch_num_regs (gdbarch)
2225                         + gdbarch_num_pseudo_regs (gdbarch))
2226           {
2227             sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2228             regnum++;
2229           }
2230     }
2231 }
2232
2233 static void
2234 sh64_compact_print_registers_info (struct gdbarch *gdbarch,
2235                                    struct ui_file *file,
2236                                    struct frame_info *frame, int regnum,
2237                                    int fpregs)
2238 {
2239   if (regnum != -1)             /* Do one specified register.  */
2240     {
2241       if (*(gdbarch_register_name (gdbarch, regnum)) == '\0')
2242         error (_("Not a valid register for the current processor type"));
2243
2244       if (regnum >= 0 && regnum < R0_C_REGNUM)
2245         error (_("Not a valid register for the current processor mode."));
2246
2247       sh64_print_register (gdbarch, file, frame, regnum);
2248     }
2249   else
2250     /* Do all compact registers.  */
2251     {
2252       regnum = R0_C_REGNUM;
2253       while (regnum < gdbarch_num_regs (gdbarch)
2254                       + gdbarch_num_pseudo_regs (gdbarch))
2255         {
2256           sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2257           regnum++;
2258         }
2259     }
2260 }
2261
2262 static void
2263 sh64_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
2264                            struct frame_info *frame, int regnum, int fpregs)
2265 {
2266   if (pc_is_isa32 (get_frame_pc (frame)))
2267     sh64_media_print_registers_info (gdbarch, file, frame, regnum, fpregs);
2268   else
2269     sh64_compact_print_registers_info (gdbarch, file, frame, regnum, fpregs);
2270 }
2271
2272 static struct sh64_frame_cache *
2273 sh64_alloc_frame_cache (void)
2274 {
2275   struct sh64_frame_cache *cache;
2276   int i;
2277
2278   cache = FRAME_OBSTACK_ZALLOC (struct sh64_frame_cache);
2279
2280   /* Base address.  */
2281   cache->base = 0;
2282   cache->saved_sp = 0;
2283   cache->sp_offset = 0;
2284   cache->pc = 0;
2285
2286   /* Frameless until proven otherwise.  */
2287   cache->uses_fp = 0;
2288
2289   /* Saved registers.  We initialize these to -1 since zero is a valid
2290      offset (that's where fp is supposed to be stored).  */
2291   for (i = 0; i < SIM_SH64_NR_REGS; i++)
2292     {
2293       cache->saved_regs[i] = -1;
2294     }
2295
2296   return cache;
2297 }
2298
2299 static struct sh64_frame_cache *
2300 sh64_frame_cache (struct frame_info *this_frame, void **this_cache)
2301 {
2302   struct gdbarch *gdbarch;
2303   struct sh64_frame_cache *cache;
2304   CORE_ADDR current_pc;
2305   int i;
2306
2307   if (*this_cache)
2308     return *this_cache;
2309
2310   gdbarch = get_frame_arch (this_frame);
2311   cache = sh64_alloc_frame_cache ();
2312   *this_cache = cache;
2313
2314   current_pc = get_frame_pc (this_frame);
2315   cache->media_mode = pc_is_isa32 (current_pc);
2316
2317   /* In principle, for normal frames, fp holds the frame pointer,
2318      which holds the base address for the current stack frame.
2319      However, for functions that don't need it, the frame pointer is
2320      optional.  For these "frameless" functions the frame pointer is
2321      actually the frame pointer of the calling frame.  */
2322   cache->base = get_frame_register_unsigned (this_frame, MEDIA_FP_REGNUM);
2323   if (cache->base == 0)
2324     return cache;
2325
2326   cache->pc = get_frame_func (this_frame);
2327   if (cache->pc != 0)
2328     sh64_analyze_prologue (gdbarch, cache, cache->pc, current_pc);
2329
2330   if (!cache->uses_fp)
2331     {
2332       /* We didn't find a valid frame, which means that CACHE->base
2333          currently holds the frame pointer for our calling frame.  If
2334          we're at the start of a function, or somewhere half-way its
2335          prologue, the function's frame probably hasn't been fully
2336          setup yet.  Try to reconstruct the base address for the stack
2337          frame by looking at the stack pointer.  For truly "frameless"
2338          functions this might work too.  */
2339       cache->base = get_frame_register_unsigned
2340                     (this_frame, gdbarch_sp_regnum (gdbarch));
2341     }
2342
2343   /* Now that we have the base address for the stack frame we can
2344      calculate the value of sp in the calling frame.  */
2345   cache->saved_sp = cache->base + cache->sp_offset;
2346
2347   /* Adjust all the saved registers such that they contain addresses
2348      instead of offsets.  */
2349   for (i = 0; i < SIM_SH64_NR_REGS; i++)
2350     if (cache->saved_regs[i] != -1)
2351       cache->saved_regs[i] = cache->saved_sp - cache->saved_regs[i];
2352
2353   return cache;
2354 }
2355
2356 static struct value *
2357 sh64_frame_prev_register (struct frame_info *this_frame,
2358                           void **this_cache, int regnum)
2359 {
2360   struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2361   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2362   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2363
2364   gdb_assert (regnum >= 0);
2365
2366   if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
2367     frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
2368
2369   /* The PC of the previous frame is stored in the PR register of
2370      the current frame.  Frob regnum so that we pull the value from
2371      the correct place.  */
2372   if (regnum == gdbarch_pc_regnum (gdbarch))
2373     regnum = PR_REGNUM;
2374
2375   if (regnum < SIM_SH64_NR_REGS && cache->saved_regs[regnum] != -1)
2376     {
2377       if (gdbarch_tdep (gdbarch)->sh_abi == SH_ABI_32
2378           && (regnum == MEDIA_FP_REGNUM || regnum == PR_REGNUM))
2379         {
2380           CORE_ADDR val;
2381           val = read_memory_unsigned_integer (cache->saved_regs[regnum],
2382                                               4, byte_order);
2383           return frame_unwind_got_constant (this_frame, regnum, val);
2384         }
2385
2386       return frame_unwind_got_memory (this_frame, regnum,
2387                                       cache->saved_regs[regnum]);
2388     }
2389
2390   return frame_unwind_got_register (this_frame, regnum, regnum);
2391 }
2392
2393 static void
2394 sh64_frame_this_id (struct frame_info *this_frame, void **this_cache,
2395                     struct frame_id *this_id)
2396 {
2397   struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2398
2399   /* This marks the outermost frame.  */
2400   if (cache->base == 0)
2401     return;
2402
2403   *this_id = frame_id_build (cache->saved_sp, cache->pc);
2404 }
2405
2406 static const struct frame_unwind sh64_frame_unwind = {
2407   NORMAL_FRAME,
2408   sh64_frame_this_id,
2409   sh64_frame_prev_register,
2410   NULL,
2411   default_frame_sniffer
2412 };
2413
2414 static CORE_ADDR
2415 sh64_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
2416 {
2417   return frame_unwind_register_unsigned (next_frame,
2418                                          gdbarch_sp_regnum (gdbarch));
2419 }
2420
2421 static CORE_ADDR
2422 sh64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
2423 {
2424   return frame_unwind_register_unsigned (next_frame,
2425                                          gdbarch_pc_regnum (gdbarch));
2426 }
2427
2428 static struct frame_id
2429 sh64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
2430 {
2431   CORE_ADDR sp = get_frame_register_unsigned (this_frame,
2432                                               gdbarch_sp_regnum (gdbarch));
2433   return frame_id_build (sp, get_frame_pc (this_frame));
2434 }
2435
2436 static CORE_ADDR
2437 sh64_frame_base_address (struct frame_info *this_frame, void **this_cache)
2438 {
2439   struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2440
2441   return cache->base;
2442 }
2443
2444 static const struct frame_base sh64_frame_base = {
2445   &sh64_frame_unwind,
2446   sh64_frame_base_address,
2447   sh64_frame_base_address,
2448   sh64_frame_base_address
2449 };
2450
2451
2452 struct gdbarch *
2453 sh64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2454 {
2455   struct gdbarch *gdbarch;
2456   struct gdbarch_tdep *tdep;
2457
2458   /* If there is already a candidate, use it.  */
2459   arches = gdbarch_list_lookup_by_info (arches, &info);
2460   if (arches != NULL)
2461     return arches->gdbarch;
2462
2463   /* None found, create a new architecture from the information
2464      provided.  */
2465   tdep = XMALLOC (struct gdbarch_tdep);
2466   gdbarch = gdbarch_alloc (&info, tdep);
2467
2468   /* Determine the ABI */
2469   if (info.abfd && bfd_get_arch_size (info.abfd) == 64)
2470     {
2471       /* If the ABI is the 64-bit one, it can only be sh-media.  */
2472       tdep->sh_abi = SH_ABI_64;
2473       set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2474       set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2475     }
2476   else
2477     {
2478       /* If the ABI is the 32-bit one it could be either media or
2479          compact.  */
2480       tdep->sh_abi = SH_ABI_32;
2481       set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2482       set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2483     }
2484
2485   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
2486   set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2487   set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2488   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2489   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2490   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2491   set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2492
2493   /* The number of real registers is the same whether we are in 
2494      ISA16(compact) or ISA32(media).  */
2495   set_gdbarch_num_regs (gdbarch, SIM_SH64_NR_REGS);
2496   set_gdbarch_sp_regnum (gdbarch, 15);
2497   set_gdbarch_pc_regnum (gdbarch, 64);
2498   set_gdbarch_fp0_regnum (gdbarch, SIM_SH64_FR0_REGNUM);
2499   set_gdbarch_num_pseudo_regs (gdbarch, NUM_PSEUDO_REGS_SH_MEDIA
2500                                         + NUM_PSEUDO_REGS_SH_COMPACT);
2501
2502   set_gdbarch_register_name (gdbarch, sh64_register_name);
2503   set_gdbarch_register_type (gdbarch, sh64_register_type);
2504
2505   set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read);
2506   set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write);
2507
2508   set_gdbarch_breakpoint_from_pc (gdbarch, sh64_breakpoint_from_pc);
2509
2510   set_gdbarch_print_insn (gdbarch, print_insn_sh);
2511   set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno);
2512
2513   set_gdbarch_return_value (gdbarch, sh64_return_value);
2514
2515   set_gdbarch_skip_prologue (gdbarch, sh64_skip_prologue);
2516   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2517
2518   set_gdbarch_push_dummy_call (gdbarch, sh64_push_dummy_call);
2519
2520   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
2521
2522   set_gdbarch_frame_align (gdbarch, sh64_frame_align);
2523   set_gdbarch_unwind_sp (gdbarch, sh64_unwind_sp);
2524   set_gdbarch_unwind_pc (gdbarch, sh64_unwind_pc);
2525   set_gdbarch_dummy_id (gdbarch, sh64_dummy_id);
2526   frame_base_set_default (gdbarch, &sh64_frame_base);
2527
2528   set_gdbarch_print_registers_info (gdbarch, sh64_print_registers_info);
2529
2530   set_gdbarch_elf_make_msymbol_special (gdbarch,
2531                                         sh64_elf_make_msymbol_special);
2532
2533   /* Hook in ABI-specific overrides, if they have been registered.  */
2534   gdbarch_init_osabi (info, gdbarch);
2535
2536   dwarf2_append_unwinders (gdbarch);
2537   frame_unwind_append_unwinder (gdbarch, &sh64_frame_unwind);
2538
2539   return gdbarch;
2540 }