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