nds32.cc revision 1.1 1 1.1 mrg /* Subroutines used for code generation of Andes NDS32 cpu for GNU compiler
2 1.1 mrg Copyright (C) 2012-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Andes Technology Corporation.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it
8 1.1 mrg under the terms of the GNU General Public License as published
9 1.1 mrg by the Free Software Foundation; either version 3, or (at your
10 1.1 mrg option) any later version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
13 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 1.1 mrg License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg /* ------------------------------------------------------------------------ */
22 1.1 mrg
23 1.1 mrg #define IN_TARGET_CODE 1
24 1.1 mrg
25 1.1 mrg #include "config.h"
26 1.1 mrg #include "system.h"
27 1.1 mrg #include "coretypes.h"
28 1.1 mrg #include "backend.h"
29 1.1 mrg #include "target.h"
30 1.1 mrg #include "rtl.h"
31 1.1 mrg #include "tree.h"
32 1.1 mrg #include "tree-pass.h"
33 1.1 mrg #include "stringpool.h"
34 1.1 mrg #include "attribs.h"
35 1.1 mrg #include "df.h"
36 1.1 mrg #include "memmodel.h"
37 1.1 mrg #include "tm_p.h"
38 1.1 mrg #include "optabs.h" /* For GEN_FCN. */
39 1.1 mrg #include "regs.h"
40 1.1 mrg #include "emit-rtl.h"
41 1.1 mrg #include "recog.h"
42 1.1 mrg #include "diagnostic-core.h"
43 1.1 mrg #include "stor-layout.h"
44 1.1 mrg #include "varasm.h"
45 1.1 mrg #include "calls.h"
46 1.1 mrg #include "output.h"
47 1.1 mrg #include "explow.h"
48 1.1 mrg #include "expr.h"
49 1.1 mrg #include "tm-constrs.h"
50 1.1 mrg #include "builtins.h"
51 1.1 mrg #include "cpplib.h"
52 1.1 mrg #include "context.h"
53 1.1 mrg
54 1.1 mrg /* This file should be included last. */
55 1.1 mrg #include "target-def.h"
56 1.1 mrg
57 1.1 mrg /* ------------------------------------------------------------------------ */
58 1.1 mrg
59 1.1 mrg /* This file is divided into five parts:
60 1.1 mrg
61 1.1 mrg PART 1: Auxiliary static variable definitions and
62 1.1 mrg target hook static variable definitions.
63 1.1 mrg
64 1.1 mrg PART 2: Auxiliary static function definitions.
65 1.1 mrg
66 1.1 mrg PART 3: Implement target hook stuff definitions.
67 1.1 mrg
68 1.1 mrg PART 4: Implemet extern function definitions,
69 1.1 mrg the prototype is in nds32-protos.h.
70 1.1 mrg
71 1.1 mrg PART 5: Initialize target hook structure and definitions. */
72 1.1 mrg
73 1.1 mrg /* ------------------------------------------------------------------------ */
74 1.1 mrg
75 1.1 mrg /* PART 1: Auxiliary static variable definitions and
76 1.1 mrg target hook static variable definitions. */
77 1.1 mrg
78 1.1 mrg /* Define intrinsic register names.
79 1.1 mrg Please refer to nds32_intrinsic.h file, the index is corresponding to
80 1.1 mrg 'enum nds32_intrinsic_registers' data type values.
81 1.1 mrg NOTE that the base value starting from 1024. */
82 1.1 mrg static const char * const nds32_intrinsic_register_names[] =
83 1.1 mrg {
84 1.1 mrg "$CPU_VER",
85 1.1 mrg "$ICM_CFG",
86 1.1 mrg "$DCM_CFG",
87 1.1 mrg "$MMU_CFG",
88 1.1 mrg "$MSC_CFG",
89 1.1 mrg "$MSC_CFG2",
90 1.1 mrg "$CORE_ID",
91 1.1 mrg "$FUCOP_EXIST",
92 1.1 mrg
93 1.1 mrg "$PSW",
94 1.1 mrg "$IPSW",
95 1.1 mrg "$P_IPSW",
96 1.1 mrg "$IVB",
97 1.1 mrg "$EVA",
98 1.1 mrg "$P_EVA",
99 1.1 mrg "$ITYPE",
100 1.1 mrg "$P_ITYPE",
101 1.1 mrg
102 1.1 mrg "$MERR",
103 1.1 mrg "$IPC",
104 1.1 mrg "$P_IPC",
105 1.1 mrg "$OIPC",
106 1.1 mrg "$P_P0",
107 1.1 mrg "$P_P1",
108 1.1 mrg
109 1.1 mrg "$INT_MASK",
110 1.1 mrg "$INT_MASK2",
111 1.1 mrg "$INT_MASK3",
112 1.1 mrg "$INT_PEND",
113 1.1 mrg "$INT_PEND2",
114 1.1 mrg "$INT_PEND3",
115 1.1 mrg "$SP_USR",
116 1.1 mrg "$SP_PRIV",
117 1.1 mrg "$INT_PRI",
118 1.1 mrg "$INT_PRI2",
119 1.1 mrg "$INT_PRI3",
120 1.1 mrg "$INT_PRI4",
121 1.1 mrg "$INT_CTRL",
122 1.1 mrg "$INT_TRIGGER",
123 1.1 mrg "$INT_TRIGGER2",
124 1.1 mrg "$INT_GPR_PUSH_DIS",
125 1.1 mrg
126 1.1 mrg "$MMU_CTL",
127 1.1 mrg "$L1_PPTB",
128 1.1 mrg "$TLB_VPN",
129 1.1 mrg "$TLB_DATA",
130 1.1 mrg "$TLB_MISC",
131 1.1 mrg "$VLPT_IDX",
132 1.1 mrg "$ILMB",
133 1.1 mrg "$DLMB",
134 1.1 mrg
135 1.1 mrg "$CACHE_CTL",
136 1.1 mrg "$HSMP_SADDR",
137 1.1 mrg "$HSMP_EADDR",
138 1.1 mrg "$SDZ_CTL",
139 1.1 mrg "$N12MISC_CTL",
140 1.1 mrg "$MISC_CTL",
141 1.1 mrg "$ECC_MISC",
142 1.1 mrg
143 1.1 mrg "$BPC0",
144 1.1 mrg "$BPC1",
145 1.1 mrg "$BPC2",
146 1.1 mrg "$BPC3",
147 1.1 mrg "$BPC4",
148 1.1 mrg "$BPC5",
149 1.1 mrg "$BPC6",
150 1.1 mrg "$BPC7",
151 1.1 mrg
152 1.1 mrg "$BPA0",
153 1.1 mrg "$BPA1",
154 1.1 mrg "$BPA2",
155 1.1 mrg "$BPA3",
156 1.1 mrg "$BPA4",
157 1.1 mrg "$BPA5",
158 1.1 mrg "$BPA6",
159 1.1 mrg "$BPA7",
160 1.1 mrg
161 1.1 mrg "$BPAM0",
162 1.1 mrg "$BPAM1",
163 1.1 mrg "$BPAM2",
164 1.1 mrg "$BPAM3",
165 1.1 mrg "$BPAM4",
166 1.1 mrg "$BPAM5",
167 1.1 mrg "$BPAM6",
168 1.1 mrg "$BPAM7",
169 1.1 mrg
170 1.1 mrg "$BPV0",
171 1.1 mrg "$BPV1",
172 1.1 mrg "$BPV2",
173 1.1 mrg "$BPV3",
174 1.1 mrg "$BPV4",
175 1.1 mrg "$BPV5",
176 1.1 mrg "$BPV6",
177 1.1 mrg "$BPV7",
178 1.1 mrg
179 1.1 mrg "$BPCID0",
180 1.1 mrg "$BPCID1",
181 1.1 mrg "$BPCID2",
182 1.1 mrg "$BPCID3",
183 1.1 mrg "$BPCID4",
184 1.1 mrg "$BPCID5",
185 1.1 mrg "$BPCID6",
186 1.1 mrg "$BPCID7",
187 1.1 mrg
188 1.1 mrg "$EDM_CFG",
189 1.1 mrg "$EDMSW",
190 1.1 mrg "$EDM_CTL",
191 1.1 mrg "$EDM_DTR",
192 1.1 mrg "$BPMTC",
193 1.1 mrg "$DIMBR",
194 1.1 mrg
195 1.1 mrg "$TECR0",
196 1.1 mrg "$TECR1",
197 1.1 mrg "$PFMC0",
198 1.1 mrg "$PFMC1",
199 1.1 mrg "$PFMC2",
200 1.1 mrg "$PFM_CTL",
201 1.1 mrg "$PFT_CTL",
202 1.1 mrg "$HSP_CTL",
203 1.1 mrg "$SP_BOUND",
204 1.1 mrg "$SP_BOUND_PRIV",
205 1.1 mrg "$SP_BASE",
206 1.1 mrg "$SP_BASE_PRIV",
207 1.1 mrg "$FUCOP_CTL",
208 1.1 mrg "$PRUSR_ACC_CTL",
209 1.1 mrg
210 1.1 mrg "$DMA_CFG",
211 1.1 mrg "$DMA_GCSW",
212 1.1 mrg "$DMA_CHNSEL",
213 1.1 mrg "$DMA_ACT",
214 1.1 mrg "$DMA_SETUP",
215 1.1 mrg "$DMA_ISADDR",
216 1.1 mrg "$DMA_ESADDR",
217 1.1 mrg "$DMA_TCNT",
218 1.1 mrg "$DMA_STATUS",
219 1.1 mrg "$DMA_2DSET",
220 1.1 mrg "$DMA_2DSCTL",
221 1.1 mrg "$DMA_RCNT",
222 1.1 mrg "$DMA_HSTATUS",
223 1.1 mrg
224 1.1 mrg "$PC",
225 1.1 mrg "$SP_USR1",
226 1.1 mrg "$SP_USR2",
227 1.1 mrg "$SP_USR3",
228 1.1 mrg "$SP_PRIV1",
229 1.1 mrg "$SP_PRIV2",
230 1.1 mrg "$SP_PRIV3",
231 1.1 mrg "$BG_REGION",
232 1.1 mrg "$SFCR",
233 1.1 mrg "$SIGN",
234 1.1 mrg "$ISIGN",
235 1.1 mrg "$P_ISIGN",
236 1.1 mrg "$IFC_LP",
237 1.1 mrg "$ITB"
238 1.1 mrg };
239 1.1 mrg
240 1.1 mrg /* Define instrinsic cctl names. */
241 1.1 mrg static const char * const nds32_cctl_names[] =
242 1.1 mrg {
243 1.1 mrg "L1D_VA_FILLCK",
244 1.1 mrg "L1D_VA_ULCK",
245 1.1 mrg "L1I_VA_FILLCK",
246 1.1 mrg "L1I_VA_ULCK",
247 1.1 mrg
248 1.1 mrg "L1D_IX_WBINVAL",
249 1.1 mrg "L1D_IX_INVAL",
250 1.1 mrg "L1D_IX_WB",
251 1.1 mrg "L1I_IX_INVAL",
252 1.1 mrg
253 1.1 mrg "L1D_VA_INVAL",
254 1.1 mrg "L1D_VA_WB",
255 1.1 mrg "L1D_VA_WBINVAL",
256 1.1 mrg "L1I_VA_INVAL",
257 1.1 mrg
258 1.1 mrg "L1D_IX_RTAG",
259 1.1 mrg "L1D_IX_RWD",
260 1.1 mrg "L1I_IX_RTAG",
261 1.1 mrg "L1I_IX_RWD",
262 1.1 mrg
263 1.1 mrg "L1D_IX_WTAG",
264 1.1 mrg "L1D_IX_WWD",
265 1.1 mrg "L1I_IX_WTAG",
266 1.1 mrg "L1I_IX_WWD"
267 1.1 mrg };
268 1.1 mrg
269 1.1 mrg static const char * const nds32_dpref_names[] =
270 1.1 mrg {
271 1.1 mrg "SRD",
272 1.1 mrg "MRD",
273 1.1 mrg "SWR",
274 1.1 mrg "MWR",
275 1.1 mrg "PTE",
276 1.1 mrg "CLWR"
277 1.1 mrg };
278 1.1 mrg
279 1.1 mrg /* Defining register allocation order for performance.
280 1.1 mrg We want to allocate callee-saved registers after others.
281 1.1 mrg It may be used by nds32_adjust_reg_alloc_order(). */
282 1.1 mrg static const int nds32_reg_alloc_order_for_speed[] =
283 1.1 mrg {
284 1.1 mrg 0, 1, 2, 3, 4, 5, 16, 17,
285 1.1 mrg 18, 19, 20, 21, 22, 23, 24, 25,
286 1.1 mrg 26, 27, 6, 7, 8, 9, 10, 11,
287 1.1 mrg 12, 13, 14, 15
288 1.1 mrg };
289 1.1 mrg
290 1.1 mrg /* Defining target-specific uses of __attribute__. */
291 1.1 mrg static const struct attribute_spec nds32_attribute_table[] =
292 1.1 mrg {
293 1.1 mrg /* Syntax: { name, min_len, max_len, decl_required, type_required,
294 1.1 mrg function_type_required, affects_type_identity, handler,
295 1.1 mrg exclude } */
296 1.1 mrg
297 1.1 mrg /* The interrupt vid: [0-63]+ (actual vector number starts from 9 to 72). */
298 1.1 mrg { "interrupt", 1, 64, false, false, false, false, NULL, NULL },
299 1.1 mrg /* The exception vid: [1-8]+ (actual vector number starts from 1 to 8). */
300 1.1 mrg { "exception", 1, 8, false, false, false, false, NULL, NULL },
301 1.1 mrg /* Argument is user's interrupt numbers. The vector number is always 0. */
302 1.1 mrg { "reset", 1, 1, false, false, false, false, NULL, NULL },
303 1.1 mrg
304 1.1 mrg /* The attributes describing isr nested type. */
305 1.1 mrg { "nested", 0, 0, false, false, false, false, NULL, NULL },
306 1.1 mrg { "not_nested", 0, 0, false, false, false, false, NULL, NULL },
307 1.1 mrg { "nested_ready", 0, 0, false, false, false, false, NULL, NULL },
308 1.1 mrg { "critical", 0, 0, false, false, false, false, NULL, NULL },
309 1.1 mrg
310 1.1 mrg /* The attributes describing isr register save scheme. */
311 1.1 mrg { "save_all", 0, 0, false, false, false, false, NULL, NULL },
312 1.1 mrg { "partial_save", 0, 0, false, false, false, false, NULL, NULL },
313 1.1 mrg
314 1.1 mrg /* The attributes used by reset attribute. */
315 1.1 mrg { "nmi", 1, 1, false, false, false, false, NULL, NULL },
316 1.1 mrg { "warm", 1, 1, false, false, false, false, NULL, NULL },
317 1.1 mrg
318 1.1 mrg /* The attributes describing isr security level. */
319 1.1 mrg { "secure", 1, 1, false, false, false, false, NULL, NULL },
320 1.1 mrg
321 1.1 mrg /* The attribute telling no prologue/epilogue. */
322 1.1 mrg { "naked", 0, 0, false, false, false, false, NULL, NULL },
323 1.1 mrg
324 1.1 mrg /* The attribute is used to tell this function to be ROM patch. */
325 1.1 mrg { "indirect_call",0, 0, false, false, false, false, NULL, NULL },
326 1.1 mrg
327 1.1 mrg /* FOR BACKWARD COMPATIBILITY,
328 1.1 mrg this attribute also tells no prologue/epilogue. */
329 1.1 mrg { "no_prologue", 0, 0, false, false, false, false, NULL, NULL },
330 1.1 mrg
331 1.1 mrg /* The last attribute spec is set to be NULL. */
332 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL }
333 1.1 mrg };
334 1.1 mrg
335 1.1 mrg
336 1.1 mrg /* ------------------------------------------------------------------------ */
337 1.1 mrg
338 1.1 mrg /* PART 2: Auxiliary static function definitions. */
339 1.1 mrg
340 1.1 mrg /* Function to save and restore machine-specific function data. */
341 1.1 mrg static struct machine_function *
342 1.1 mrg nds32_init_machine_status (void)
343 1.1 mrg {
344 1.1 mrg struct machine_function *machine;
345 1.1 mrg machine = ggc_cleared_alloc<machine_function> ();
346 1.1 mrg
347 1.1 mrg /* Initially assume this function does not use __builtin_eh_return. */
348 1.1 mrg machine->use_eh_return_p = 0;
349 1.1 mrg
350 1.1 mrg /* Initially assume this function needs prologue/epilogue. */
351 1.1 mrg machine->naked_p = 0;
352 1.1 mrg
353 1.1 mrg /* Initially assume this function does NOT use fp_as_gp optimization. */
354 1.1 mrg machine->fp_as_gp_p = 0;
355 1.1 mrg
356 1.1 mrg /* Initially this function is not under strictly aligned situation. */
357 1.1 mrg machine->strict_aligned_p = 0;
358 1.1 mrg
359 1.1 mrg /* Initially this function has no naked and no_prologue attributes. */
360 1.1 mrg machine->attr_naked_p = 0;
361 1.1 mrg machine->attr_no_prologue_p = 0;
362 1.1 mrg
363 1.1 mrg return machine;
364 1.1 mrg }
365 1.1 mrg
366 1.1 mrg /* Function to compute stack frame size and
367 1.1 mrg store into cfun->machine structure. */
368 1.1 mrg static void
369 1.1 mrg nds32_compute_stack_frame (void)
370 1.1 mrg {
371 1.1 mrg int r;
372 1.1 mrg int block_size;
373 1.1 mrg bool v3pushpop_p;
374 1.1 mrg
375 1.1 mrg /* Because nds32_compute_stack_frame() will be called from different place,
376 1.1 mrg everytime we enter this function, we have to assume this function
377 1.1 mrg needs prologue/epilogue. */
378 1.1 mrg cfun->machine->naked_p = 0;
379 1.1 mrg
380 1.1 mrg /* We need to mark whether this function has naked and no_prologue
381 1.1 mrg attribute so that we can distinguish the difference if users applies
382 1.1 mrg -mret-in-naked-func option. */
383 1.1 mrg cfun->machine->attr_naked_p
384 1.1 mrg = lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl))
385 1.1 mrg ? 1 : 0;
386 1.1 mrg cfun->machine->attr_no_prologue_p
387 1.1 mrg = lookup_attribute ("no_prologue", DECL_ATTRIBUTES (current_function_decl))
388 1.1 mrg ? 1 : 0;
389 1.1 mrg
390 1.1 mrg /* If __builtin_eh_return is used, we better have frame pointer needed
391 1.1 mrg so that we can easily locate the stack slot of return address. */
392 1.1 mrg if (crtl->calls_eh_return)
393 1.1 mrg {
394 1.1 mrg frame_pointer_needed = 1;
395 1.1 mrg
396 1.1 mrg /* We need to mark eh data registers that need to be saved
397 1.1 mrg in the stack. */
398 1.1 mrg cfun->machine->eh_return_data_first_regno = EH_RETURN_DATA_REGNO (0);
399 1.1 mrg for (r = 0; EH_RETURN_DATA_REGNO (r) != INVALID_REGNUM; r++)
400 1.1 mrg cfun->machine->eh_return_data_last_regno = r;
401 1.1 mrg
402 1.1 mrg cfun->machine->eh_return_data_regs_size
403 1.1 mrg = 4 * (cfun->machine->eh_return_data_last_regno
404 1.1 mrg - cfun->machine->eh_return_data_first_regno
405 1.1 mrg + 1);
406 1.1 mrg cfun->machine->use_eh_return_p = 1;
407 1.1 mrg }
408 1.1 mrg else
409 1.1 mrg {
410 1.1 mrg /* Assigning SP_REGNUM to eh_first_regno and eh_last_regno means we
411 1.1 mrg do not need to handle __builtin_eh_return case in this function. */
412 1.1 mrg cfun->machine->eh_return_data_first_regno = SP_REGNUM;
413 1.1 mrg cfun->machine->eh_return_data_last_regno = SP_REGNUM;
414 1.1 mrg
415 1.1 mrg cfun->machine->eh_return_data_regs_size = 0;
416 1.1 mrg cfun->machine->use_eh_return_p = 0;
417 1.1 mrg }
418 1.1 mrg
419 1.1 mrg /* Get variadic arguments size to prepare pretend arguments and
420 1.1 mrg we will push them into stack at prologue by ourself. */
421 1.1 mrg cfun->machine->va_args_size = crtl->args.pretend_args_size;
422 1.1 mrg if (cfun->machine->va_args_size != 0)
423 1.1 mrg {
424 1.1 mrg cfun->machine->va_args_first_regno
425 1.1 mrg = NDS32_GPR_ARG_FIRST_REGNUM
426 1.1 mrg + NDS32_MAX_GPR_REGS_FOR_ARGS
427 1.1 mrg - (crtl->args.pretend_args_size / UNITS_PER_WORD);
428 1.1 mrg cfun->machine->va_args_last_regno
429 1.1 mrg = NDS32_GPR_ARG_FIRST_REGNUM + NDS32_MAX_GPR_REGS_FOR_ARGS - 1;
430 1.1 mrg }
431 1.1 mrg else
432 1.1 mrg {
433 1.1 mrg cfun->machine->va_args_first_regno = SP_REGNUM;
434 1.1 mrg cfun->machine->va_args_last_regno = SP_REGNUM;
435 1.1 mrg }
436 1.1 mrg
437 1.1 mrg /* Important: We need to make sure that varargs area is 8-byte alignment. */
438 1.1 mrg block_size = cfun->machine->va_args_size;
439 1.1 mrg if (!NDS32_DOUBLE_WORD_ALIGN_P (block_size))
440 1.1 mrg {
441 1.1 mrg cfun->machine->va_args_area_padding_bytes
442 1.1 mrg = NDS32_ROUND_UP_DOUBLE_WORD (block_size) - block_size;
443 1.1 mrg }
444 1.1 mrg
445 1.1 mrg /* Get local variables, incoming variables, and temporary variables size.
446 1.1 mrg Note that we need to make sure it is 8-byte alignment because
447 1.1 mrg there may be no padding bytes if we are using LRA. */
448 1.1 mrg cfun->machine->local_size = NDS32_ROUND_UP_DOUBLE_WORD (get_frame_size ());
449 1.1 mrg
450 1.1 mrg /* Get outgoing arguments size. */
451 1.1 mrg cfun->machine->out_args_size = crtl->outgoing_args_size;
452 1.1 mrg
453 1.1 mrg /* If $fp value is required to be saved on stack, it needs 4 bytes space.
454 1.1 mrg Check whether $fp is ever live. */
455 1.1 mrg cfun->machine->fp_size = (df_regs_ever_live_p (FP_REGNUM)) ? 4 : 0;
456 1.1 mrg
457 1.1 mrg /* If $gp value is required to be saved on stack, it needs 4 bytes space.
458 1.1 mrg Check whether we are using PIC code genration. */
459 1.1 mrg cfun->machine->gp_size =
460 1.1 mrg (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)) ? 4 : 0;
461 1.1 mrg
462 1.1 mrg /* If $lp value is required to be saved on stack, it needs 4 bytes space.
463 1.1 mrg Check whether $lp is ever live. */
464 1.1 mrg cfun->machine->lp_size
465 1.1 mrg = (flag_always_save_lp || df_regs_ever_live_p (LP_REGNUM)) ? 4 : 0;
466 1.1 mrg
467 1.1 mrg /* Initially there is no padding bytes. */
468 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes = 0;
469 1.1 mrg
470 1.1 mrg /* Calculate the bytes of saving callee-saved registers on stack. */
471 1.1 mrg cfun->machine->callee_saved_gpr_regs_size = 0;
472 1.1 mrg cfun->machine->callee_saved_first_gpr_regno = SP_REGNUM;
473 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = SP_REGNUM;
474 1.1 mrg cfun->machine->callee_saved_fpr_regs_size = 0;
475 1.1 mrg cfun->machine->callee_saved_first_fpr_regno = SP_REGNUM;
476 1.1 mrg cfun->machine->callee_saved_last_fpr_regno = SP_REGNUM;
477 1.1 mrg
478 1.1 mrg /* Currently, there is no need to check $r28~$r31
479 1.1 mrg because we will save them in another way. */
480 1.1 mrg for (r = 0; r < 28; r++)
481 1.1 mrg {
482 1.1 mrg if (NDS32_REQUIRED_CALLEE_SAVED_P (r))
483 1.1 mrg {
484 1.1 mrg /* Mark the first required callee-saved register
485 1.1 mrg (only need to set it once).
486 1.1 mrg If first regno == SP_REGNUM, we can tell that
487 1.1 mrg it is the first time to be here. */
488 1.1 mrg if (cfun->machine->callee_saved_first_gpr_regno == SP_REGNUM)
489 1.1 mrg cfun->machine->callee_saved_first_gpr_regno = r;
490 1.1 mrg /* Mark the last required callee-saved register. */
491 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = r;
492 1.1 mrg }
493 1.1 mrg }
494 1.1 mrg
495 1.1 mrg /* Recording fpu callee-saved register. */
496 1.1 mrg if (TARGET_HARD_FLOAT)
497 1.1 mrg {
498 1.1 mrg for (r = NDS32_FIRST_FPR_REGNUM; r < NDS32_LAST_FPR_REGNUM; r++)
499 1.1 mrg {
500 1.1 mrg if (NDS32_REQUIRED_CALLEE_SAVED_P (r))
501 1.1 mrg {
502 1.1 mrg /* Mark the first required callee-saved register. */
503 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno == SP_REGNUM)
504 1.1 mrg {
505 1.1 mrg /* Make first callee-saved number is even,
506 1.1 mrg bacause we use doubleword access, and this way
507 1.1 mrg promise 8-byte alignemt. */
508 1.1 mrg if (!NDS32_FPR_REGNO_OK_FOR_DOUBLE (r))
509 1.1 mrg cfun->machine->callee_saved_first_fpr_regno = r - 1;
510 1.1 mrg else
511 1.1 mrg cfun->machine->callee_saved_first_fpr_regno = r;
512 1.1 mrg }
513 1.1 mrg cfun->machine->callee_saved_last_fpr_regno = r;
514 1.1 mrg }
515 1.1 mrg }
516 1.1 mrg
517 1.1 mrg /* Make last callee-saved register number is odd,
518 1.1 mrg we hope callee-saved register is even. */
519 1.1 mrg int last_fpr = cfun->machine->callee_saved_last_fpr_regno;
520 1.1 mrg if (NDS32_FPR_REGNO_OK_FOR_DOUBLE (last_fpr))
521 1.1 mrg cfun->machine->callee_saved_last_fpr_regno++;
522 1.1 mrg }
523 1.1 mrg
524 1.1 mrg /* Check if this function can omit prologue/epilogue code fragment.
525 1.1 mrg If there is 'no_prologue'/'naked'/'secure' attribute in this function,
526 1.1 mrg we can set 'naked_p' flag to indicate that
527 1.1 mrg we do not have to generate prologue/epilogue.
528 1.1 mrg Or, if all the following conditions succeed,
529 1.1 mrg we can set this function 'naked_p' as well:
530 1.1 mrg condition 1: first_regno == last_regno == SP_REGNUM,
531 1.1 mrg which means we do not have to save
532 1.1 mrg any callee-saved registers.
533 1.1 mrg condition 2: Both $lp and $fp are NOT live in this function,
534 1.1 mrg which means we do not need to save them and there
535 1.1 mrg is no outgoing size.
536 1.1 mrg condition 3: There is no local_size, which means
537 1.1 mrg we do not need to adjust $sp. */
538 1.1 mrg if (lookup_attribute ("no_prologue", DECL_ATTRIBUTES (current_function_decl))
539 1.1 mrg || lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl))
540 1.1 mrg || lookup_attribute ("secure", DECL_ATTRIBUTES (current_function_decl))
541 1.1 mrg || (cfun->machine->callee_saved_first_gpr_regno == SP_REGNUM
542 1.1 mrg && cfun->machine->callee_saved_last_gpr_regno == SP_REGNUM
543 1.1 mrg && cfun->machine->callee_saved_first_fpr_regno == SP_REGNUM
544 1.1 mrg && cfun->machine->callee_saved_last_fpr_regno == SP_REGNUM
545 1.1 mrg && !df_regs_ever_live_p (FP_REGNUM)
546 1.1 mrg && !df_regs_ever_live_p (LP_REGNUM)
547 1.1 mrg && cfun->machine->local_size == 0
548 1.1 mrg && !flag_pic))
549 1.1 mrg {
550 1.1 mrg /* Set this function 'naked_p' and other functions can check this flag.
551 1.1 mrg Note that in nds32 port, the 'naked_p = 1' JUST means there is no
552 1.1 mrg callee-saved, local size, and outgoing size.
553 1.1 mrg The varargs space and ret instruction may still present in
554 1.1 mrg the prologue/epilogue expanding. */
555 1.1 mrg cfun->machine->naked_p = 1;
556 1.1 mrg
557 1.1 mrg /* No need to save $fp, $gp, and $lp.
558 1.1 mrg We should set these value to be zero
559 1.1 mrg so that nds32_initial_elimination_offset() can work properly. */
560 1.1 mrg cfun->machine->fp_size = 0;
561 1.1 mrg cfun->machine->gp_size = 0;
562 1.1 mrg cfun->machine->lp_size = 0;
563 1.1 mrg
564 1.1 mrg /* If stack usage computation is required,
565 1.1 mrg we need to provide the static stack size. */
566 1.1 mrg if (flag_stack_usage_info)
567 1.1 mrg current_function_static_stack_size = 0;
568 1.1 mrg
569 1.1 mrg /* No need to do following adjustment, return immediately. */
570 1.1 mrg return;
571 1.1 mrg }
572 1.1 mrg
573 1.1 mrg v3pushpop_p = NDS32_V3PUSH_AVAILABLE_P;
574 1.1 mrg
575 1.1 mrg /* Adjustment for v3push instructions:
576 1.1 mrg If we are using v3push (push25/pop25) instructions,
577 1.1 mrg we need to make sure Rb is $r6 and Re is
578 1.1 mrg located on $r6, $r8, $r10, or $r14.
579 1.1 mrg Some results above will be discarded and recomputed.
580 1.1 mrg Note that it is only available under V3/V3M ISA and we
581 1.1 mrg DO NOT setup following stuff for isr or variadic function. */
582 1.1 mrg if (v3pushpop_p)
583 1.1 mrg {
584 1.1 mrg /* Recompute:
585 1.1 mrg cfun->machine->fp_size
586 1.1 mrg cfun->machine->gp_size
587 1.1 mrg cfun->machine->lp_size
588 1.1 mrg cfun->machine->callee_saved_first_gpr_regno
589 1.1 mrg cfun->machine->callee_saved_last_gpr_regno */
590 1.1 mrg
591 1.1 mrg /* For v3push instructions, $fp, $gp, and $lp are always saved. */
592 1.1 mrg cfun->machine->fp_size = 4;
593 1.1 mrg cfun->machine->gp_size = 4;
594 1.1 mrg cfun->machine->lp_size = 4;
595 1.1 mrg
596 1.1 mrg /* Remember to set Rb = $r6. */
597 1.1 mrg cfun->machine->callee_saved_first_gpr_regno = 6;
598 1.1 mrg
599 1.1 mrg if (cfun->machine->callee_saved_last_gpr_regno <= 6)
600 1.1 mrg {
601 1.1 mrg /* Re = $r6 */
602 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = 6;
603 1.1 mrg }
604 1.1 mrg else if (cfun->machine->callee_saved_last_gpr_regno <= 8)
605 1.1 mrg {
606 1.1 mrg /* Re = $r8 */
607 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = 8;
608 1.1 mrg }
609 1.1 mrg else if (cfun->machine->callee_saved_last_gpr_regno <= 10)
610 1.1 mrg {
611 1.1 mrg /* Re = $r10 */
612 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = 10;
613 1.1 mrg }
614 1.1 mrg else if (cfun->machine->callee_saved_last_gpr_regno <= 14)
615 1.1 mrg {
616 1.1 mrg /* Re = $r14 */
617 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = 14;
618 1.1 mrg }
619 1.1 mrg else if (cfun->machine->callee_saved_last_gpr_regno == SP_REGNUM)
620 1.1 mrg {
621 1.1 mrg /* If last_regno is SP_REGNUM, which means
622 1.1 mrg it is never changed, so set it to Re = $r6. */
623 1.1 mrg cfun->machine->callee_saved_last_gpr_regno = 6;
624 1.1 mrg }
625 1.1 mrg else
626 1.1 mrg {
627 1.1 mrg /* The program flow should not go here. */
628 1.1 mrg gcc_unreachable ();
629 1.1 mrg }
630 1.1 mrg }
631 1.1 mrg
632 1.1 mrg int sp_adjust = cfun->machine->local_size
633 1.1 mrg + cfun->machine->out_args_size
634 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
635 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
636 1.1 mrg
637 1.1 mrg if (!v3pushpop_p
638 1.1 mrg && sp_adjust == 0
639 1.1 mrg && !frame_pointer_needed)
640 1.1 mrg {
641 1.1 mrg block_size = cfun->machine->fp_size
642 1.1 mrg + cfun->machine->gp_size
643 1.1 mrg + cfun->machine->lp_size;
644 1.1 mrg
645 1.1 mrg if (cfun->machine->callee_saved_last_gpr_regno != SP_REGNUM)
646 1.1 mrg block_size += (4 * (cfun->machine->callee_saved_last_gpr_regno
647 1.1 mrg - cfun->machine->callee_saved_first_gpr_regno
648 1.1 mrg + 1));
649 1.1 mrg
650 1.1 mrg if (!NDS32_DOUBLE_WORD_ALIGN_P (block_size))
651 1.1 mrg {
652 1.1 mrg /* $r14 is last callee save register. */
653 1.1 mrg if (cfun->machine->callee_saved_last_gpr_regno
654 1.1 mrg < NDS32_LAST_CALLEE_SAVE_GPR_REGNUM)
655 1.1 mrg {
656 1.1 mrg cfun->machine->callee_saved_last_gpr_regno++;
657 1.1 mrg }
658 1.1 mrg else if (cfun->machine->callee_saved_first_gpr_regno == SP_REGNUM)
659 1.1 mrg {
660 1.1 mrg cfun->machine->callee_saved_first_gpr_regno
661 1.1 mrg = NDS32_FIRST_CALLEE_SAVE_GPR_REGNUM;
662 1.1 mrg cfun->machine->callee_saved_last_gpr_regno
663 1.1 mrg = NDS32_FIRST_CALLEE_SAVE_GPR_REGNUM;
664 1.1 mrg }
665 1.1 mrg }
666 1.1 mrg }
667 1.1 mrg
668 1.1 mrg /* We have correctly set callee_saved_first_gpr_regno
669 1.1 mrg and callee_saved_last_gpr_regno.
670 1.1 mrg Initially, the callee_saved_gpr_regs_size is supposed to be 0.
671 1.1 mrg As long as callee_saved_last_gpr_regno is not SP_REGNUM,
672 1.1 mrg we can update callee_saved_gpr_regs_size with new size. */
673 1.1 mrg if (cfun->machine->callee_saved_last_gpr_regno != SP_REGNUM)
674 1.1 mrg {
675 1.1 mrg /* Compute pushed size of callee-saved registers. */
676 1.1 mrg cfun->machine->callee_saved_gpr_regs_size
677 1.1 mrg = 4 * (cfun->machine->callee_saved_last_gpr_regno
678 1.1 mrg - cfun->machine->callee_saved_first_gpr_regno
679 1.1 mrg + 1);
680 1.1 mrg }
681 1.1 mrg
682 1.1 mrg if (TARGET_HARD_FLOAT)
683 1.1 mrg {
684 1.1 mrg /* Compute size of callee svaed floating-point registers. */
685 1.1 mrg if (cfun->machine->callee_saved_last_fpr_regno != SP_REGNUM)
686 1.1 mrg {
687 1.1 mrg cfun->machine->callee_saved_fpr_regs_size
688 1.1 mrg = 4 * (cfun->machine->callee_saved_last_fpr_regno
689 1.1 mrg - cfun->machine->callee_saved_first_fpr_regno
690 1.1 mrg + 1);
691 1.1 mrg }
692 1.1 mrg }
693 1.1 mrg
694 1.1 mrg /* Important: We need to make sure that
695 1.1 mrg (fp_size + gp_size + lp_size + callee_saved_gpr_regs_size)
696 1.1 mrg is 8-byte alignment.
697 1.1 mrg If it is not, calculate the padding bytes. */
698 1.1 mrg block_size = cfun->machine->fp_size
699 1.1 mrg + cfun->machine->gp_size
700 1.1 mrg + cfun->machine->lp_size
701 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size;
702 1.1 mrg if (!NDS32_DOUBLE_WORD_ALIGN_P (block_size))
703 1.1 mrg {
704 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes
705 1.1 mrg = NDS32_ROUND_UP_DOUBLE_WORD (block_size) - block_size;
706 1.1 mrg }
707 1.1 mrg
708 1.1 mrg /* If stack usage computation is required,
709 1.1 mrg we need to provide the static stack size. */
710 1.1 mrg if (flag_stack_usage_info)
711 1.1 mrg {
712 1.1 mrg current_function_static_stack_size
713 1.1 mrg = NDS32_ROUND_UP_DOUBLE_WORD (block_size)
714 1.1 mrg + cfun->machine->local_size
715 1.1 mrg + cfun->machine->out_args_size;
716 1.1 mrg }
717 1.1 mrg }
718 1.1 mrg
719 1.1 mrg /* Function to create a parallel rtx pattern
720 1.1 mrg which presents stack push multiple behavior.
721 1.1 mrg The overall concept are:
722 1.1 mrg "push registers to memory",
723 1.1 mrg "adjust stack pointer". */
724 1.1 mrg static void
725 1.1 mrg nds32_emit_stack_push_multiple (unsigned Rb, unsigned Re,
726 1.1 mrg bool save_fp_p, bool save_gp_p, bool save_lp_p,
727 1.1 mrg bool vaarg_p)
728 1.1 mrg {
729 1.1 mrg unsigned regno;
730 1.1 mrg int extra_count;
731 1.1 mrg int num_use_regs;
732 1.1 mrg int par_index;
733 1.1 mrg int offset;
734 1.1 mrg
735 1.1 mrg rtx reg;
736 1.1 mrg rtx mem;
737 1.1 mrg rtx push_rtx;
738 1.1 mrg rtx adjust_sp_rtx;
739 1.1 mrg rtx parallel_insn;
740 1.1 mrg rtx dwarf;
741 1.1 mrg
742 1.1 mrg /* We need to provide a customized rtx which contains
743 1.1 mrg necessary information for data analysis,
744 1.1 mrg so we create a parallel rtx like this:
745 1.1 mrg (parallel [(set (mem (plus (reg:SI SP_REGNUM) (const_int -32)))
746 1.1 mrg (reg:SI Rb))
747 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -28)))
748 1.1 mrg (reg:SI Rb+1))
749 1.1 mrg ...
750 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -16)))
751 1.1 mrg (reg:SI Re))
752 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -12)))
753 1.1 mrg (reg:SI FP_REGNUM))
754 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -8)))
755 1.1 mrg (reg:SI GP_REGNUM))
756 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -4)))
757 1.1 mrg (reg:SI LP_REGNUM))
758 1.1 mrg (set (reg:SI SP_REGNUM)
759 1.1 mrg (plus (reg:SI SP_REGNUM) (const_int -32)))]) */
760 1.1 mrg
761 1.1 mrg /* Calculate the number of registers that will be pushed. */
762 1.1 mrg extra_count = 0;
763 1.1 mrg if (save_fp_p)
764 1.1 mrg extra_count++;
765 1.1 mrg if (save_gp_p)
766 1.1 mrg extra_count++;
767 1.1 mrg if (save_lp_p)
768 1.1 mrg extra_count++;
769 1.1 mrg /* Note that Rb and Re may be SP_REGNUM. DO NOT count it in. */
770 1.1 mrg if (Rb == SP_REGNUM && Re == SP_REGNUM)
771 1.1 mrg num_use_regs = extra_count;
772 1.1 mrg else
773 1.1 mrg num_use_regs = Re - Rb + 1 + extra_count;
774 1.1 mrg
775 1.1 mrg /* In addition to used registers,
776 1.1 mrg we need one more space for (set sp sp-x) rtx. */
777 1.1 mrg parallel_insn = gen_rtx_PARALLEL (VOIDmode,
778 1.1 mrg rtvec_alloc (num_use_regs + 1));
779 1.1 mrg par_index = 0;
780 1.1 mrg
781 1.1 mrg /* Initialize offset and start to create push behavior. */
782 1.1 mrg offset = -(num_use_regs * 4);
783 1.1 mrg
784 1.1 mrg /* Create (set mem regX) from Rb, Rb+1 up to Re. */
785 1.1 mrg for (regno = Rb; regno <= Re; regno++)
786 1.1 mrg {
787 1.1 mrg /* Rb and Re may be SP_REGNUM.
788 1.1 mrg We need to break this loop immediately. */
789 1.1 mrg if (regno == SP_REGNUM)
790 1.1 mrg break;
791 1.1 mrg
792 1.1 mrg reg = gen_rtx_REG (SImode, regno);
793 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
794 1.1 mrg stack_pointer_rtx,
795 1.1 mrg offset));
796 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
797 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
798 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
799 1.1 mrg offset = offset + 4;
800 1.1 mrg par_index++;
801 1.1 mrg }
802 1.1 mrg
803 1.1 mrg /* Create (set mem fp), (set mem gp), and (set mem lp) if necessary. */
804 1.1 mrg if (save_fp_p)
805 1.1 mrg {
806 1.1 mrg reg = gen_rtx_REG (SImode, FP_REGNUM);
807 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
808 1.1 mrg stack_pointer_rtx,
809 1.1 mrg offset));
810 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
811 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
812 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
813 1.1 mrg offset = offset + 4;
814 1.1 mrg par_index++;
815 1.1 mrg }
816 1.1 mrg if (save_gp_p)
817 1.1 mrg {
818 1.1 mrg reg = gen_rtx_REG (SImode, GP_REGNUM);
819 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
820 1.1 mrg stack_pointer_rtx,
821 1.1 mrg offset));
822 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
823 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
824 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
825 1.1 mrg offset = offset + 4;
826 1.1 mrg par_index++;
827 1.1 mrg }
828 1.1 mrg if (save_lp_p)
829 1.1 mrg {
830 1.1 mrg reg = gen_rtx_REG (SImode, LP_REGNUM);
831 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
832 1.1 mrg stack_pointer_rtx,
833 1.1 mrg offset));
834 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
835 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
836 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
837 1.1 mrg offset = offset + 4;
838 1.1 mrg par_index++;
839 1.1 mrg }
840 1.1 mrg
841 1.1 mrg /* Create (set sp sp-x). */
842 1.1 mrg
843 1.1 mrg /* We need to re-calculate the offset value again for adjustment. */
844 1.1 mrg offset = -(num_use_regs * 4);
845 1.1 mrg adjust_sp_rtx
846 1.1 mrg = gen_rtx_SET (stack_pointer_rtx,
847 1.1 mrg plus_constant (Pmode, stack_pointer_rtx, offset));
848 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = adjust_sp_rtx;
849 1.1 mrg RTX_FRAME_RELATED_P (adjust_sp_rtx) = 1;
850 1.1 mrg
851 1.1 mrg parallel_insn = emit_insn (parallel_insn);
852 1.1 mrg
853 1.1 mrg /* The insn rtx 'parallel_insn' will change frame layout.
854 1.1 mrg We need to use RTX_FRAME_RELATED_P so that GCC is able to
855 1.1 mrg generate CFI (Call Frame Information) stuff. */
856 1.1 mrg RTX_FRAME_RELATED_P (parallel_insn) = 1;
857 1.1 mrg
858 1.1 mrg /* Don't use GCC's logic for CFI info if we are generate a push for VAARG
859 1.1 mrg since we will not restore those register at epilogue. */
860 1.1 mrg if (vaarg_p)
861 1.1 mrg {
862 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA,
863 1.1 mrg copy_rtx (adjust_sp_rtx), NULL_RTX);
864 1.1 mrg REG_NOTES (parallel_insn) = dwarf;
865 1.1 mrg }
866 1.1 mrg }
867 1.1 mrg
868 1.1 mrg /* Function to create a parallel rtx pattern
869 1.1 mrg which presents stack pop multiple behavior.
870 1.1 mrg The overall concept are:
871 1.1 mrg "pop registers from memory",
872 1.1 mrg "adjust stack pointer". */
873 1.1 mrg static void
874 1.1 mrg nds32_emit_stack_pop_multiple (unsigned Rb, unsigned Re,
875 1.1 mrg bool save_fp_p, bool save_gp_p, bool save_lp_p)
876 1.1 mrg {
877 1.1 mrg unsigned regno;
878 1.1 mrg int extra_count;
879 1.1 mrg int num_use_regs;
880 1.1 mrg int par_index;
881 1.1 mrg int offset;
882 1.1 mrg
883 1.1 mrg rtx reg;
884 1.1 mrg rtx mem;
885 1.1 mrg rtx pop_rtx;
886 1.1 mrg rtx adjust_sp_rtx;
887 1.1 mrg rtx parallel_insn;
888 1.1 mrg rtx dwarf = NULL_RTX;
889 1.1 mrg
890 1.1 mrg /* We need to provide a customized rtx which contains
891 1.1 mrg necessary information for data analysis,
892 1.1 mrg so we create a parallel rtx like this:
893 1.1 mrg (parallel [(set (reg:SI Rb)
894 1.1 mrg (mem (reg:SI SP_REGNUM)))
895 1.1 mrg (set (reg:SI Rb+1)
896 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 4))))
897 1.1 mrg ...
898 1.1 mrg (set (reg:SI Re)
899 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 16))))
900 1.1 mrg (set (reg:SI FP_REGNUM)
901 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 20))))
902 1.1 mrg (set (reg:SI GP_REGNUM)
903 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 24))))
904 1.1 mrg (set (reg:SI LP_REGNUM)
905 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 28))))
906 1.1 mrg (set (reg:SI SP_REGNUM)
907 1.1 mrg (plus (reg:SI SP_REGNUM) (const_int 32)))]) */
908 1.1 mrg
909 1.1 mrg /* Calculate the number of registers that will be poped. */
910 1.1 mrg extra_count = 0;
911 1.1 mrg if (save_fp_p)
912 1.1 mrg extra_count++;
913 1.1 mrg if (save_gp_p)
914 1.1 mrg extra_count++;
915 1.1 mrg if (save_lp_p)
916 1.1 mrg extra_count++;
917 1.1 mrg /* Note that Rb and Re may be SP_REGNUM. DO NOT count it in. */
918 1.1 mrg if (Rb == SP_REGNUM && Re == SP_REGNUM)
919 1.1 mrg num_use_regs = extra_count;
920 1.1 mrg else
921 1.1 mrg num_use_regs = Re - Rb + 1 + extra_count;
922 1.1 mrg
923 1.1 mrg /* In addition to used registers,
924 1.1 mrg we need one more space for (set sp sp+x) rtx. */
925 1.1 mrg parallel_insn = gen_rtx_PARALLEL (VOIDmode,
926 1.1 mrg rtvec_alloc (num_use_regs + 1));
927 1.1 mrg par_index = 0;
928 1.1 mrg
929 1.1 mrg /* Initialize offset and start to create pop behavior. */
930 1.1 mrg offset = 0;
931 1.1 mrg
932 1.1 mrg /* Create (set regX mem) from Rb, Rb+1 up to Re. */
933 1.1 mrg for (regno = Rb; regno <= Re; regno++)
934 1.1 mrg {
935 1.1 mrg /* Rb and Re may be SP_REGNUM.
936 1.1 mrg We need to break this loop immediately. */
937 1.1 mrg if (regno == SP_REGNUM)
938 1.1 mrg break;
939 1.1 mrg
940 1.1 mrg reg = gen_rtx_REG (SImode, regno);
941 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
942 1.1 mrg stack_pointer_rtx,
943 1.1 mrg offset));
944 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
945 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
946 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
947 1.1 mrg offset = offset + 4;
948 1.1 mrg par_index++;
949 1.1 mrg
950 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
951 1.1 mrg }
952 1.1 mrg
953 1.1 mrg /* Create (set fp mem), (set gp mem), and (set lp mem) if necessary. */
954 1.1 mrg if (save_fp_p)
955 1.1 mrg {
956 1.1 mrg reg = gen_rtx_REG (SImode, FP_REGNUM);
957 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
958 1.1 mrg stack_pointer_rtx,
959 1.1 mrg offset));
960 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
961 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
962 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
963 1.1 mrg offset = offset + 4;
964 1.1 mrg par_index++;
965 1.1 mrg
966 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
967 1.1 mrg }
968 1.1 mrg if (save_gp_p)
969 1.1 mrg {
970 1.1 mrg reg = gen_rtx_REG (SImode, GP_REGNUM);
971 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
972 1.1 mrg stack_pointer_rtx,
973 1.1 mrg offset));
974 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
975 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
976 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
977 1.1 mrg offset = offset + 4;
978 1.1 mrg par_index++;
979 1.1 mrg
980 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
981 1.1 mrg }
982 1.1 mrg if (save_lp_p)
983 1.1 mrg {
984 1.1 mrg reg = gen_rtx_REG (SImode, LP_REGNUM);
985 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
986 1.1 mrg stack_pointer_rtx,
987 1.1 mrg offset));
988 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
989 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
990 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
991 1.1 mrg offset = offset + 4;
992 1.1 mrg par_index++;
993 1.1 mrg
994 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
995 1.1 mrg }
996 1.1 mrg
997 1.1 mrg /* Create (set sp sp+x). */
998 1.1 mrg
999 1.1 mrg /* The offset value is already in place. No need to re-calculate it. */
1000 1.1 mrg adjust_sp_rtx
1001 1.1 mrg = gen_rtx_SET (stack_pointer_rtx,
1002 1.1 mrg plus_constant (Pmode, stack_pointer_rtx, offset));
1003 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = adjust_sp_rtx;
1004 1.1 mrg
1005 1.1 mrg /* Tell gcc we adjust SP in this insn. */
1006 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA, copy_rtx (adjust_sp_rtx), dwarf);
1007 1.1 mrg
1008 1.1 mrg parallel_insn = emit_insn (parallel_insn);
1009 1.1 mrg
1010 1.1 mrg /* The insn rtx 'parallel_insn' will change frame layout.
1011 1.1 mrg We need to use RTX_FRAME_RELATED_P so that GCC is able to
1012 1.1 mrg generate CFI (Call Frame Information) stuff. */
1013 1.1 mrg RTX_FRAME_RELATED_P (parallel_insn) = 1;
1014 1.1 mrg
1015 1.1 mrg /* Add CFI info by manual. */
1016 1.1 mrg REG_NOTES (parallel_insn) = dwarf;
1017 1.1 mrg }
1018 1.1 mrg
1019 1.1 mrg /* Function to create a parallel rtx pattern
1020 1.1 mrg which presents stack v3push behavior.
1021 1.1 mrg The overall concept are:
1022 1.1 mrg "push registers to memory",
1023 1.1 mrg "adjust stack pointer". */
1024 1.1 mrg static void
1025 1.1 mrg nds32_emit_stack_v3push (unsigned Rb,
1026 1.1 mrg unsigned Re,
1027 1.1 mrg unsigned imm8u)
1028 1.1 mrg {
1029 1.1 mrg unsigned regno;
1030 1.1 mrg int num_use_regs;
1031 1.1 mrg int par_index;
1032 1.1 mrg int offset;
1033 1.1 mrg
1034 1.1 mrg rtx reg;
1035 1.1 mrg rtx mem;
1036 1.1 mrg rtx push_rtx;
1037 1.1 mrg rtx adjust_sp_rtx;
1038 1.1 mrg rtx parallel_insn;
1039 1.1 mrg
1040 1.1 mrg /* We need to provide a customized rtx which contains
1041 1.1 mrg necessary information for data analysis,
1042 1.1 mrg so we create a parallel rtx like this:
1043 1.1 mrg (parallel [(set (mem (plus (reg:SI SP_REGNUM) (const_int -32)))
1044 1.1 mrg (reg:SI Rb))
1045 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -28)))
1046 1.1 mrg (reg:SI Rb+1))
1047 1.1 mrg ...
1048 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -16)))
1049 1.1 mrg (reg:SI Re))
1050 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -12)))
1051 1.1 mrg (reg:SI FP_REGNUM))
1052 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -8)))
1053 1.1 mrg (reg:SI GP_REGNUM))
1054 1.1 mrg (set (mem (plus (reg:SI SP_REGNUM) (const_int -4)))
1055 1.1 mrg (reg:SI LP_REGNUM))
1056 1.1 mrg (set (reg:SI SP_REGNUM)
1057 1.1 mrg (plus (reg:SI SP_REGNUM) (const_int -32-imm8u)))]) */
1058 1.1 mrg
1059 1.1 mrg /* Calculate the number of registers that will be pushed.
1060 1.1 mrg Since $fp, $gp, and $lp is always pushed with v3push instruction,
1061 1.1 mrg we need to count these three registers.
1062 1.1 mrg Under v3push, Rb is $r6, while Re is $r6, $r8, $r10, or $r14.
1063 1.1 mrg So there is no need to worry about Rb=Re=SP_REGNUM case. */
1064 1.1 mrg num_use_regs = Re - Rb + 1 + 3;
1065 1.1 mrg
1066 1.1 mrg /* In addition to used registers,
1067 1.1 mrg we need one more space for (set sp sp-x-imm8u) rtx. */
1068 1.1 mrg parallel_insn = gen_rtx_PARALLEL (VOIDmode,
1069 1.1 mrg rtvec_alloc (num_use_regs + 1));
1070 1.1 mrg par_index = 0;
1071 1.1 mrg
1072 1.1 mrg /* Initialize offset and start to create push behavior. */
1073 1.1 mrg offset = -(num_use_regs * 4);
1074 1.1 mrg
1075 1.1 mrg /* Create (set mem regX) from Rb, Rb+1 up to Re.
1076 1.1 mrg Under v3push, Rb is $r6, while Re is $r6, $r8, $r10, or $r14.
1077 1.1 mrg So there is no need to worry about Rb=Re=SP_REGNUM case. */
1078 1.1 mrg for (regno = Rb; regno <= Re; regno++)
1079 1.1 mrg {
1080 1.1 mrg reg = gen_rtx_REG (SImode, regno);
1081 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1082 1.1 mrg stack_pointer_rtx,
1083 1.1 mrg offset));
1084 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
1085 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
1086 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
1087 1.1 mrg offset = offset + 4;
1088 1.1 mrg par_index++;
1089 1.1 mrg }
1090 1.1 mrg
1091 1.1 mrg /* Create (set mem fp). */
1092 1.1 mrg reg = gen_rtx_REG (SImode, FP_REGNUM);
1093 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1094 1.1 mrg stack_pointer_rtx,
1095 1.1 mrg offset));
1096 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
1097 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
1098 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
1099 1.1 mrg offset = offset + 4;
1100 1.1 mrg par_index++;
1101 1.1 mrg /* Create (set mem gp). */
1102 1.1 mrg reg = gen_rtx_REG (SImode, GP_REGNUM);
1103 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1104 1.1 mrg stack_pointer_rtx,
1105 1.1 mrg offset));
1106 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
1107 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
1108 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
1109 1.1 mrg offset = offset + 4;
1110 1.1 mrg par_index++;
1111 1.1 mrg /* Create (set mem lp). */
1112 1.1 mrg reg = gen_rtx_REG (SImode, LP_REGNUM);
1113 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1114 1.1 mrg stack_pointer_rtx,
1115 1.1 mrg offset));
1116 1.1 mrg push_rtx = gen_rtx_SET (mem, reg);
1117 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = push_rtx;
1118 1.1 mrg RTX_FRAME_RELATED_P (push_rtx) = 1;
1119 1.1 mrg offset = offset + 4;
1120 1.1 mrg par_index++;
1121 1.1 mrg
1122 1.1 mrg /* Create (set sp sp-x-imm8u). */
1123 1.1 mrg
1124 1.1 mrg /* We need to re-calculate the offset value again for adjustment. */
1125 1.1 mrg offset = -(num_use_regs * 4);
1126 1.1 mrg adjust_sp_rtx
1127 1.1 mrg = gen_rtx_SET (stack_pointer_rtx,
1128 1.1 mrg plus_constant (Pmode,
1129 1.1 mrg stack_pointer_rtx,
1130 1.1 mrg offset - imm8u));
1131 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = adjust_sp_rtx;
1132 1.1 mrg RTX_FRAME_RELATED_P (adjust_sp_rtx) = 1;
1133 1.1 mrg
1134 1.1 mrg parallel_insn = emit_insn (parallel_insn);
1135 1.1 mrg
1136 1.1 mrg /* The insn rtx 'parallel_insn' will change frame layout.
1137 1.1 mrg We need to use RTX_FRAME_RELATED_P so that GCC is able to
1138 1.1 mrg generate CFI (Call Frame Information) stuff. */
1139 1.1 mrg RTX_FRAME_RELATED_P (parallel_insn) = 1;
1140 1.1 mrg }
1141 1.1 mrg
1142 1.1 mrg /* Function to create a parallel rtx pattern
1143 1.1 mrg which presents stack v3pop behavior.
1144 1.1 mrg The overall concept are:
1145 1.1 mrg "pop registers from memory",
1146 1.1 mrg "adjust stack pointer". */
1147 1.1 mrg static void
1148 1.1 mrg nds32_emit_stack_v3pop (unsigned Rb,
1149 1.1 mrg unsigned Re,
1150 1.1 mrg unsigned imm8u)
1151 1.1 mrg {
1152 1.1 mrg unsigned regno;
1153 1.1 mrg int num_use_regs;
1154 1.1 mrg int par_index;
1155 1.1 mrg int offset;
1156 1.1 mrg
1157 1.1 mrg rtx reg;
1158 1.1 mrg rtx mem;
1159 1.1 mrg rtx pop_rtx;
1160 1.1 mrg rtx adjust_sp_rtx;
1161 1.1 mrg rtx parallel_insn;
1162 1.1 mrg rtx dwarf = NULL_RTX;
1163 1.1 mrg
1164 1.1 mrg /* We need to provide a customized rtx which contains
1165 1.1 mrg necessary information for data analysis,
1166 1.1 mrg so we create a parallel rtx like this:
1167 1.1 mrg (parallel [(set (reg:SI Rb)
1168 1.1 mrg (mem (reg:SI SP_REGNUM)))
1169 1.1 mrg (set (reg:SI Rb+1)
1170 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 4))))
1171 1.1 mrg ...
1172 1.1 mrg (set (reg:SI Re)
1173 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 16))))
1174 1.1 mrg (set (reg:SI FP_REGNUM)
1175 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 20))))
1176 1.1 mrg (set (reg:SI GP_REGNUM)
1177 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 24))))
1178 1.1 mrg (set (reg:SI LP_REGNUM)
1179 1.1 mrg (mem (plus (reg:SI SP_REGNUM) (const_int 28))))
1180 1.1 mrg (set (reg:SI SP_REGNUM)
1181 1.1 mrg (plus (reg:SI SP_REGNUM) (const_int 32+imm8u)))]) */
1182 1.1 mrg
1183 1.1 mrg /* Calculate the number of registers that will be poped.
1184 1.1 mrg Since $fp, $gp, and $lp is always poped with v3pop instruction,
1185 1.1 mrg we need to count these three registers.
1186 1.1 mrg Under v3push, Rb is $r6, while Re is $r6, $r8, $r10, or $r14.
1187 1.1 mrg So there is no need to worry about Rb=Re=SP_REGNUM case. */
1188 1.1 mrg num_use_regs = Re - Rb + 1 + 3;
1189 1.1 mrg
1190 1.1 mrg /* In addition to used registers,
1191 1.1 mrg we need one more space for (set sp sp+x+imm8u) rtx. */
1192 1.1 mrg parallel_insn = gen_rtx_PARALLEL (VOIDmode,
1193 1.1 mrg rtvec_alloc (num_use_regs + 1));
1194 1.1 mrg par_index = 0;
1195 1.1 mrg
1196 1.1 mrg /* Initialize offset and start to create pop behavior. */
1197 1.1 mrg offset = 0;
1198 1.1 mrg
1199 1.1 mrg /* Create (set regX mem) from Rb, Rb+1 up to Re.
1200 1.1 mrg Under v3pop, Rb is $r6, while Re is $r6, $r8, $r10, or $r14.
1201 1.1 mrg So there is no need to worry about Rb=Re=SP_REGNUM case. */
1202 1.1 mrg for (regno = Rb; regno <= Re; regno++)
1203 1.1 mrg {
1204 1.1 mrg reg = gen_rtx_REG (SImode, regno);
1205 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1206 1.1 mrg stack_pointer_rtx,
1207 1.1 mrg offset));
1208 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
1209 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
1210 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
1211 1.1 mrg offset = offset + 4;
1212 1.1 mrg par_index++;
1213 1.1 mrg
1214 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
1215 1.1 mrg }
1216 1.1 mrg
1217 1.1 mrg /* Create (set fp mem). */
1218 1.1 mrg reg = gen_rtx_REG (SImode, FP_REGNUM);
1219 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1220 1.1 mrg stack_pointer_rtx,
1221 1.1 mrg offset));
1222 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
1223 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
1224 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
1225 1.1 mrg offset = offset + 4;
1226 1.1 mrg par_index++;
1227 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
1228 1.1 mrg
1229 1.1 mrg /* Create (set gp mem). */
1230 1.1 mrg reg = gen_rtx_REG (SImode, GP_REGNUM);
1231 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1232 1.1 mrg stack_pointer_rtx,
1233 1.1 mrg offset));
1234 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
1235 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
1236 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
1237 1.1 mrg offset = offset + 4;
1238 1.1 mrg par_index++;
1239 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
1240 1.1 mrg
1241 1.1 mrg /* Create (set lp mem ). */
1242 1.1 mrg reg = gen_rtx_REG (SImode, LP_REGNUM);
1243 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
1244 1.1 mrg stack_pointer_rtx,
1245 1.1 mrg offset));
1246 1.1 mrg pop_rtx = gen_rtx_SET (reg, mem);
1247 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = pop_rtx;
1248 1.1 mrg RTX_FRAME_RELATED_P (pop_rtx) = 1;
1249 1.1 mrg offset = offset + 4;
1250 1.1 mrg par_index++;
1251 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
1252 1.1 mrg
1253 1.1 mrg /* Create (set sp sp+x+imm8u). */
1254 1.1 mrg
1255 1.1 mrg /* The offset value is already in place. No need to re-calculate it. */
1256 1.1 mrg adjust_sp_rtx
1257 1.1 mrg = gen_rtx_SET (stack_pointer_rtx,
1258 1.1 mrg plus_constant (Pmode,
1259 1.1 mrg stack_pointer_rtx,
1260 1.1 mrg offset + imm8u));
1261 1.1 mrg XVECEXP (parallel_insn, 0, par_index) = adjust_sp_rtx;
1262 1.1 mrg
1263 1.1 mrg if (frame_pointer_needed)
1264 1.1 mrg {
1265 1.1 mrg /* (expr_list:REG_CFA_DEF_CFA (plus:SI (reg/f:SI $sp)
1266 1.1 mrg (const_int 0))
1267 1.1 mrg mean reset frame pointer to $sp and reset to offset 0. */
1268 1.1 mrg rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
1269 1.1 mrg const0_rtx);
1270 1.1 mrg dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
1271 1.1 mrg }
1272 1.1 mrg else
1273 1.1 mrg {
1274 1.1 mrg /* Tell gcc we adjust SP in this insn. */
1275 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA,
1276 1.1 mrg copy_rtx (adjust_sp_rtx), dwarf);
1277 1.1 mrg }
1278 1.1 mrg
1279 1.1 mrg parallel_insn = emit_insn (parallel_insn);
1280 1.1 mrg
1281 1.1 mrg /* The insn rtx 'parallel_insn' will change frame layout.
1282 1.1 mrg We need to use RTX_FRAME_RELATED_P so that GCC is able to
1283 1.1 mrg generate CFI (Call Frame Information) stuff. */
1284 1.1 mrg RTX_FRAME_RELATED_P (parallel_insn) = 1;
1285 1.1 mrg
1286 1.1 mrg /* Add CFI info by manual. */
1287 1.1 mrg REG_NOTES (parallel_insn) = dwarf;
1288 1.1 mrg }
1289 1.1 mrg
1290 1.1 mrg static void
1291 1.1 mrg nds32_emit_load_gp (void)
1292 1.1 mrg {
1293 1.1 mrg rtx got_symbol, pat;
1294 1.1 mrg
1295 1.1 mrg /* Initial GLOBAL OFFSET TABLE don't do the scheduling. */
1296 1.1 mrg emit_insn (gen_blockage ());
1297 1.1 mrg
1298 1.1 mrg got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
1299 1.1 mrg /* sethi $gp, _GLOBAL_OFFSET_TABLE_ -8 */
1300 1.1 mrg pat = gen_rtx_UNSPEC (SImode, gen_rtvec (1, got_symbol), UNSPEC_GOTINIT);
1301 1.1 mrg pat = gen_rtx_CONST (SImode, gen_rtx_PLUS (Pmode, pat, GEN_INT (-8)));
1302 1.1 mrg emit_insn (gen_sethi (pic_offset_table_rtx,pat));
1303 1.1 mrg
1304 1.1 mrg /* ori $gp, $gp, _GLOBAL_OFFSET_TABLE_ -4 */
1305 1.1 mrg pat = gen_rtx_UNSPEC (SImode, gen_rtvec (1, got_symbol), UNSPEC_GOTINIT);
1306 1.1 mrg pat = gen_rtx_CONST (SImode, gen_rtx_PLUS (Pmode, pat, GEN_INT (-4)));
1307 1.1 mrg emit_insn (gen_lo_sum (pic_offset_table_rtx, pic_offset_table_rtx, pat));
1308 1.1 mrg
1309 1.1 mrg /* add5.pc $gp */
1310 1.1 mrg emit_insn (gen_add_pc (pic_offset_table_rtx, pic_offset_table_rtx));
1311 1.1 mrg
1312 1.1 mrg /* Initial GLOBAL OFFSET TABLE don't do the scheduling. */
1313 1.1 mrg emit_insn (gen_blockage ());
1314 1.1 mrg }
1315 1.1 mrg
1316 1.1 mrg /* Function that may creates more instructions
1317 1.1 mrg for large value on adjusting stack pointer.
1318 1.1 mrg
1319 1.1 mrg In nds32 target, 'addi' can be used for stack pointer
1320 1.1 mrg adjustment in prologue/epilogue stage.
1321 1.1 mrg However, sometimes there are too many local variables so that
1322 1.1 mrg the adjustment value is not able to be fit in the 'addi' instruction.
1323 1.1 mrg One solution is to move value into a register
1324 1.1 mrg and then use 'add' instruction.
1325 1.1 mrg In practice, we use TA_REGNUM ($r15) to accomplish this purpose. */
1326 1.1 mrg static void
1327 1.1 mrg nds32_emit_adjust_frame (rtx to_reg, rtx from_reg, int adjust_value)
1328 1.1 mrg {
1329 1.1 mrg rtx tmp_reg;
1330 1.1 mrg rtx frame_adjust_insn;
1331 1.1 mrg rtx adjust_value_rtx = GEN_INT (adjust_value);
1332 1.1 mrg
1333 1.1 mrg if (adjust_value == 0)
1334 1.1 mrg return;
1335 1.1 mrg
1336 1.1 mrg if (!satisfies_constraint_Is15 (adjust_value_rtx))
1337 1.1 mrg {
1338 1.1 mrg /* The value is not able to fit in single addi instruction.
1339 1.1 mrg Create more instructions of moving value into a register
1340 1.1 mrg and then add stack pointer with it. */
1341 1.1 mrg
1342 1.1 mrg /* $r15 is going to be temporary register to hold the value. */
1343 1.1 mrg tmp_reg = gen_rtx_REG (SImode, TA_REGNUM);
1344 1.1 mrg
1345 1.1 mrg /* Create one more instruction to move value
1346 1.1 mrg into the temporary register. */
1347 1.1 mrg emit_move_insn (tmp_reg, adjust_value_rtx);
1348 1.1 mrg
1349 1.1 mrg /* Create new 'add' rtx. */
1350 1.1 mrg frame_adjust_insn = gen_addsi3 (to_reg,
1351 1.1 mrg from_reg,
1352 1.1 mrg tmp_reg);
1353 1.1 mrg /* Emit rtx into insn list and receive its transformed insn rtx. */
1354 1.1 mrg frame_adjust_insn = emit_insn (frame_adjust_insn);
1355 1.1 mrg
1356 1.1 mrg /* Because (tmp_reg <- full_value) may be split into two
1357 1.1 mrg rtl patterns, we cannot set its RTX_FRAME_RELATED_P.
1358 1.1 mrg We need to construct another (sp <- sp + full_value)
1359 1.1 mrg and then insert it into sp_adjust_insn's reg note to
1360 1.1 mrg represent a frame related expression.
1361 1.1 mrg GCC knows how to refer it and output debug information. */
1362 1.1 mrg
1363 1.1 mrg rtx plus_rtx;
1364 1.1 mrg rtx set_rtx;
1365 1.1 mrg
1366 1.1 mrg plus_rtx = plus_constant (Pmode, from_reg, adjust_value);
1367 1.1 mrg set_rtx = gen_rtx_SET (to_reg, plus_rtx);
1368 1.1 mrg add_reg_note (frame_adjust_insn, REG_FRAME_RELATED_EXPR, set_rtx);
1369 1.1 mrg }
1370 1.1 mrg else
1371 1.1 mrg {
1372 1.1 mrg /* Generate sp adjustment instruction if and only if sp_adjust != 0. */
1373 1.1 mrg frame_adjust_insn = gen_addsi3 (to_reg,
1374 1.1 mrg from_reg,
1375 1.1 mrg adjust_value_rtx);
1376 1.1 mrg /* Emit rtx into instructions list and receive INSN rtx form. */
1377 1.1 mrg frame_adjust_insn = emit_insn (frame_adjust_insn);
1378 1.1 mrg }
1379 1.1 mrg
1380 1.1 mrg /* The insn rtx 'sp_adjust_insn' will change frame layout.
1381 1.1 mrg We need to use RTX_FRAME_RELATED_P so that GCC is able to
1382 1.1 mrg generate CFI (Call Frame Information) stuff. */
1383 1.1 mrg RTX_FRAME_RELATED_P (frame_adjust_insn) = 1;
1384 1.1 mrg }
1385 1.1 mrg
1386 1.1 mrg /* Return true if MODE/TYPE need double word alignment. */
1387 1.1 mrg static bool
1388 1.1 mrg nds32_needs_double_word_align (machine_mode mode, const_tree type)
1389 1.1 mrg {
1390 1.1 mrg unsigned int align;
1391 1.1 mrg
1392 1.1 mrg /* Pick up the alignment according to the mode or type. */
1393 1.1 mrg align = NDS32_MODE_TYPE_ALIGN (mode, type);
1394 1.1 mrg
1395 1.1 mrg return (align > PARM_BOUNDARY);
1396 1.1 mrg }
1397 1.1 mrg
1398 1.1 mrg /* Return true if FUNC is a naked function. */
1399 1.1 mrg bool
1400 1.1 mrg nds32_naked_function_p (tree func)
1401 1.1 mrg {
1402 1.1 mrg /* FOR BACKWARD COMPATIBILITY,
1403 1.1 mrg we need to support 'no_prologue' attribute as well. */
1404 1.1 mrg tree t_naked;
1405 1.1 mrg tree t_no_prologue;
1406 1.1 mrg
1407 1.1 mrg if (TREE_CODE (func) != FUNCTION_DECL)
1408 1.1 mrg abort ();
1409 1.1 mrg
1410 1.1 mrg /* We have to use lookup_attribute() to check attributes.
1411 1.1 mrg Because attr_naked_p and attr_no_prologue_p are set in
1412 1.1 mrg nds32_compute_stack_frame() and the function has not been
1413 1.1 mrg invoked yet. */
1414 1.1 mrg t_naked = lookup_attribute ("naked", DECL_ATTRIBUTES (func));
1415 1.1 mrg t_no_prologue = lookup_attribute ("no_prologue", DECL_ATTRIBUTES (func));
1416 1.1 mrg
1417 1.1 mrg return ((t_naked != NULL_TREE) || (t_no_prologue != NULL_TREE));
1418 1.1 mrg }
1419 1.1 mrg
1420 1.1 mrg /* Function that determine whether a load postincrement is a good thing to use
1421 1.1 mrg for a given mode. */
1422 1.1 mrg bool
1423 1.1 mrg nds32_use_load_post_increment (machine_mode mode)
1424 1.1 mrg {
1425 1.1 mrg return (GET_MODE_SIZE (mode) <= GET_MODE_SIZE(E_DImode));
1426 1.1 mrg }
1427 1.1 mrg
1428 1.1 mrg /* Function that check if 'X' is a valid address register.
1429 1.1 mrg The variable 'STRICT' is very important to
1430 1.1 mrg make decision for register number.
1431 1.1 mrg
1432 1.1 mrg STRICT : true
1433 1.1 mrg => We are in reload pass or after reload pass.
1434 1.1 mrg The register number should be strictly limited in general registers.
1435 1.1 mrg
1436 1.1 mrg STRICT : false
1437 1.1 mrg => Before reload pass, we are free to use any register number. */
1438 1.1 mrg static bool
1439 1.1 mrg nds32_address_register_rtx_p (rtx x, bool strict)
1440 1.1 mrg {
1441 1.1 mrg int regno;
1442 1.1 mrg
1443 1.1 mrg if (GET_CODE (x) != REG)
1444 1.1 mrg return false;
1445 1.1 mrg
1446 1.1 mrg regno = REGNO (x);
1447 1.1 mrg
1448 1.1 mrg if (strict)
1449 1.1 mrg return REGNO_OK_FOR_BASE_P (regno);
1450 1.1 mrg else
1451 1.1 mrg return true;
1452 1.1 mrg }
1453 1.1 mrg
1454 1.1 mrg /* Function that check if 'INDEX' is valid to be a index rtx for address.
1455 1.1 mrg
1456 1.1 mrg OUTER_MODE : Machine mode of outer address rtx.
1457 1.1 mrg INDEX : Check if this rtx is valid to be a index for address.
1458 1.1 mrg STRICT : If it is true, we are in reload pass or after reload pass. */
1459 1.1 mrg static bool
1460 1.1 mrg nds32_legitimate_index_p (machine_mode outer_mode,
1461 1.1 mrg rtx index,
1462 1.1 mrg bool strict)
1463 1.1 mrg {
1464 1.1 mrg int regno;
1465 1.1 mrg rtx op0;
1466 1.1 mrg rtx op1;
1467 1.1 mrg
1468 1.1 mrg switch (GET_CODE (index))
1469 1.1 mrg {
1470 1.1 mrg case REG:
1471 1.1 mrg regno = REGNO (index);
1472 1.1 mrg /* If we are in reload pass or after reload pass,
1473 1.1 mrg we need to limit it to general register. */
1474 1.1 mrg if (strict)
1475 1.1 mrg return REGNO_OK_FOR_INDEX_P (regno);
1476 1.1 mrg else
1477 1.1 mrg return true;
1478 1.1 mrg
1479 1.1 mrg case CONST_INT:
1480 1.1 mrg /* The alignment of the integer value is determined by 'outer_mode'. */
1481 1.1 mrg switch (GET_MODE_SIZE (outer_mode))
1482 1.1 mrg {
1483 1.1 mrg case 1:
1484 1.1 mrg /* Further check if the value is legal for the 'outer_mode'. */
1485 1.1 mrg if (satisfies_constraint_Is15 (index))
1486 1.1 mrg return true;
1487 1.1 mrg break;
1488 1.1 mrg
1489 1.1 mrg case 2:
1490 1.1 mrg /* Further check if the value is legal for the 'outer_mode'. */
1491 1.1 mrg if (satisfies_constraint_Is16 (index))
1492 1.1 mrg {
1493 1.1 mrg /* If it is not under strictly aligned situation,
1494 1.1 mrg we can return true without checking alignment. */
1495 1.1 mrg if (!cfun->machine->strict_aligned_p)
1496 1.1 mrg return true;
1497 1.1 mrg /* Make sure address is half word alignment. */
1498 1.1 mrg else if (NDS32_HALF_WORD_ALIGN_P (INTVAL (index)))
1499 1.1 mrg return true;
1500 1.1 mrg }
1501 1.1 mrg break;
1502 1.1 mrg
1503 1.1 mrg case 4:
1504 1.1 mrg /* Further check if the value is legal for the 'outer_mode'. */
1505 1.1 mrg if (satisfies_constraint_Is17 (index))
1506 1.1 mrg {
1507 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE))
1508 1.1 mrg {
1509 1.1 mrg if (!satisfies_constraint_Is14 (index))
1510 1.1 mrg return false;
1511 1.1 mrg }
1512 1.1 mrg
1513 1.1 mrg /* If it is not under strictly aligned situation,
1514 1.1 mrg we can return true without checking alignment. */
1515 1.1 mrg if (!cfun->machine->strict_aligned_p)
1516 1.1 mrg return true;
1517 1.1 mrg /* Make sure address is word alignment. */
1518 1.1 mrg else if (NDS32_SINGLE_WORD_ALIGN_P (INTVAL (index)))
1519 1.1 mrg return true;
1520 1.1 mrg }
1521 1.1 mrg break;
1522 1.1 mrg
1523 1.1 mrg case 8:
1524 1.1 mrg if (satisfies_constraint_Is17 (gen_int_mode (INTVAL (index) + 4,
1525 1.1 mrg SImode)))
1526 1.1 mrg {
1527 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE))
1528 1.1 mrg {
1529 1.1 mrg if (!satisfies_constraint_Is14 (index))
1530 1.1 mrg return false;
1531 1.1 mrg }
1532 1.1 mrg
1533 1.1 mrg /* If it is not under strictly aligned situation,
1534 1.1 mrg we can return true without checking alignment. */
1535 1.1 mrg if (!cfun->machine->strict_aligned_p)
1536 1.1 mrg return true;
1537 1.1 mrg /* Make sure address is word alignment.
1538 1.1 mrg Currently we do not have 64-bit load/store yet,
1539 1.1 mrg so we will use two 32-bit load/store instructions to do
1540 1.1 mrg memory access and they are single word alignment. */
1541 1.1 mrg else if (NDS32_SINGLE_WORD_ALIGN_P (INTVAL (index)))
1542 1.1 mrg return true;
1543 1.1 mrg }
1544 1.1 mrg break;
1545 1.1 mrg
1546 1.1 mrg default:
1547 1.1 mrg return false;
1548 1.1 mrg }
1549 1.1 mrg
1550 1.1 mrg return false;
1551 1.1 mrg
1552 1.1 mrg case MULT:
1553 1.1 mrg op0 = XEXP (index, 0);
1554 1.1 mrg op1 = XEXP (index, 1);
1555 1.1 mrg
1556 1.1 mrg if (REG_P (op0) && CONST_INT_P (op1))
1557 1.1 mrg {
1558 1.1 mrg int multiplier;
1559 1.1 mrg multiplier = INTVAL (op1);
1560 1.1 mrg
1561 1.1 mrg /* We only allow (mult reg const_int_1), (mult reg const_int_2),
1562 1.1 mrg (mult reg const_int_4) or (mult reg const_int_8). */
1563 1.1 mrg if (multiplier != 1 && multiplier != 2
1564 1.1 mrg && multiplier != 4 && multiplier != 8)
1565 1.1 mrg return false;
1566 1.1 mrg
1567 1.1 mrg regno = REGNO (op0);
1568 1.1 mrg /* Limit it in general registers if we are
1569 1.1 mrg in reload pass or after reload pass. */
1570 1.1 mrg if(strict)
1571 1.1 mrg return REGNO_OK_FOR_INDEX_P (regno);
1572 1.1 mrg else
1573 1.1 mrg return true;
1574 1.1 mrg }
1575 1.1 mrg
1576 1.1 mrg return false;
1577 1.1 mrg
1578 1.1 mrg case ASHIFT:
1579 1.1 mrg op0 = XEXP (index, 0);
1580 1.1 mrg op1 = XEXP (index, 1);
1581 1.1 mrg
1582 1.1 mrg if (REG_P (op0) && CONST_INT_P (op1))
1583 1.1 mrg {
1584 1.1 mrg int sv;
1585 1.1 mrg /* op1 is already the sv value for use to do left shift. */
1586 1.1 mrg sv = INTVAL (op1);
1587 1.1 mrg
1588 1.1 mrg /* We only allow (ashift reg const_int_0)
1589 1.1 mrg or (ashift reg const_int_1) or (ashift reg const_int_2) or
1590 1.1 mrg (ashift reg const_int_3). */
1591 1.1 mrg if (sv != 0 && sv != 1 && sv !=2 && sv != 3)
1592 1.1 mrg return false;
1593 1.1 mrg
1594 1.1 mrg regno = REGNO (op0);
1595 1.1 mrg /* Limit it in general registers if we are
1596 1.1 mrg in reload pass or after reload pass. */
1597 1.1 mrg if(strict)
1598 1.1 mrg return REGNO_OK_FOR_INDEX_P (regno);
1599 1.1 mrg else
1600 1.1 mrg return true;
1601 1.1 mrg }
1602 1.1 mrg
1603 1.1 mrg return false;
1604 1.1 mrg
1605 1.1 mrg default:
1606 1.1 mrg return false;
1607 1.1 mrg }
1608 1.1 mrg }
1609 1.1 mrg
1610 1.1 mrg static void
1611 1.1 mrg nds32_register_pass (
1612 1.1 mrg rtl_opt_pass *(*make_pass_func) (gcc::context *),
1613 1.1 mrg enum pass_positioning_ops pass_pos,
1614 1.1 mrg const char *ref_pass_name)
1615 1.1 mrg {
1616 1.1 mrg opt_pass *new_opt_pass = make_pass_func (g);
1617 1.1 mrg
1618 1.1 mrg struct register_pass_info insert_pass =
1619 1.1 mrg {
1620 1.1 mrg new_opt_pass, /* pass */
1621 1.1 mrg ref_pass_name, /* reference_pass_name */
1622 1.1 mrg 1, /* ref_pass_instance_number */
1623 1.1 mrg pass_pos /* po_op */
1624 1.1 mrg };
1625 1.1 mrg
1626 1.1 mrg register_pass (&insert_pass);
1627 1.1 mrg }
1628 1.1 mrg
1629 1.1 mrg /* This function is called from nds32_option_override ().
1630 1.1 mrg All new passes should be registered here. */
1631 1.1 mrg static void
1632 1.1 mrg nds32_register_passes (void)
1633 1.1 mrg {
1634 1.1 mrg nds32_register_pass (
1635 1.1 mrg make_pass_nds32_fp_as_gp,
1636 1.1 mrg PASS_POS_INSERT_BEFORE,
1637 1.1 mrg "ira");
1638 1.1 mrg
1639 1.1 mrg nds32_register_pass (
1640 1.1 mrg make_pass_nds32_relax_opt,
1641 1.1 mrg PASS_POS_INSERT_AFTER,
1642 1.1 mrg "mach");
1643 1.1 mrg }
1644 1.1 mrg
1645 1.1 mrg /* ------------------------------------------------------------------------ */
1646 1.1 mrg
1647 1.1 mrg /* PART 3: Implement target hook stuff definitions. */
1648 1.1 mrg
1649 1.1 mrg
1651 1.1 mrg /* Computing the Length of an Insn.
1652 1.1 mrg Modifies the length assigned to instruction INSN.
1653 1.1 mrg LEN is the initially computed length of the insn. */
1654 1.1 mrg int
1655 1.1 mrg nds32_adjust_insn_length (rtx_insn *insn, int length)
1656 1.1 mrg {
1657 1.1 mrg int adjust_value = 0;
1658 1.1 mrg switch (recog_memoized (insn))
1659 1.1 mrg {
1660 1.1 mrg case CODE_FOR_call_internal:
1661 1.1 mrg case CODE_FOR_call_value_internal:
1662 1.1 mrg {
1663 1.1 mrg if (NDS32_ALIGN_P ())
1664 1.1 mrg {
1665 1.1 mrg rtx_insn *next_insn = next_active_insn (insn);
1666 1.1 mrg if (next_insn && get_attr_length (next_insn) != 2)
1667 1.1 mrg adjust_value += 2;
1668 1.1 mrg }
1669 1.1 mrg /* We need insert a nop after a noretun function call
1670 1.1 mrg to prevent software breakpoint corrupt the next function. */
1671 1.1 mrg if (find_reg_note (insn, REG_NORETURN, NULL_RTX))
1672 1.1 mrg {
1673 1.1 mrg if (TARGET_16_BIT)
1674 1.1 mrg adjust_value += 2;
1675 1.1 mrg else
1676 1.1 mrg adjust_value += 4;
1677 1.1 mrg }
1678 1.1 mrg }
1679 1.1 mrg return length + adjust_value;
1680 1.1 mrg
1681 1.1 mrg default:
1682 1.1 mrg return length;
1683 1.1 mrg }
1684 1.1 mrg }
1685 1.1 mrg
1686 1.1 mrg /* Storage Layout. */
1687 1.1 mrg
1688 1.1 mrg /* This function will be called just before expansion into rtl. */
1689 1.1 mrg static void
1690 1.1 mrg nds32_expand_to_rtl_hook (void)
1691 1.1 mrg {
1692 1.1 mrg /* We need to set strictly aligned situation.
1693 1.1 mrg After that, the memory address checking in nds32_legitimate_address_p()
1694 1.1 mrg will take alignment offset into consideration so that it will not create
1695 1.1 mrg unaligned [base + offset] access during the rtl optimization. */
1696 1.1 mrg cfun->machine->strict_aligned_p = 1;
1697 1.1 mrg }
1698 1.1 mrg
1699 1.1 mrg
1700 1.1 mrg /* Register Usage. */
1702 1.1 mrg
1703 1.1 mrg static void
1704 1.1 mrg nds32_conditional_register_usage (void)
1705 1.1 mrg {
1706 1.1 mrg int regno;
1707 1.1 mrg
1708 1.1 mrg if (TARGET_LINUX_ABI)
1709 1.1 mrg fixed_regs[TP_REGNUM] = 1;
1710 1.1 mrg
1711 1.1 mrg if (TARGET_HARD_FLOAT)
1712 1.1 mrg {
1713 1.1 mrg for (regno = NDS32_FIRST_FPR_REGNUM;
1714 1.1 mrg regno <= NDS32_LAST_FPR_REGNUM; regno++)
1715 1.1 mrg {
1716 1.1 mrg fixed_regs[regno] = 0;
1717 1.1 mrg if (regno < NDS32_FIRST_FPR_REGNUM + NDS32_MAX_FPR_REGS_FOR_ARGS)
1718 1.1 mrg call_used_regs[regno] = 1;
1719 1.1 mrg else if (regno >= NDS32_FIRST_FPR_REGNUM + 22
1720 1.1 mrg && regno < NDS32_FIRST_FPR_REGNUM + 48)
1721 1.1 mrg call_used_regs[regno] = 1;
1722 1.1 mrg else
1723 1.1 mrg call_used_regs[regno] = 0;
1724 1.1 mrg }
1725 1.1 mrg }
1726 1.1 mrg else if (TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
1727 1.1 mrg {
1728 1.1 mrg for (regno = NDS32_FIRST_FPR_REGNUM;
1729 1.1 mrg regno <= NDS32_LAST_FPR_REGNUM;
1730 1.1 mrg regno++)
1731 1.1 mrg fixed_regs[regno] = 0;
1732 1.1 mrg }
1733 1.1 mrg }
1734 1.1 mrg
1735 1.1 mrg
1736 1.1 mrg /* Register Classes. */
1738 1.1 mrg
1739 1.1 mrg static unsigned char
1740 1.1 mrg nds32_class_max_nregs (reg_class_t rclass ATTRIBUTE_UNUSED,
1741 1.1 mrg machine_mode mode)
1742 1.1 mrg {
1743 1.1 mrg /* Return the maximum number of consecutive registers
1744 1.1 mrg needed to represent "mode" in a register of "rclass". */
1745 1.1 mrg return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
1746 1.1 mrg }
1747 1.1 mrg
1748 1.1 mrg static int
1749 1.1 mrg nds32_register_priority (int hard_regno)
1750 1.1 mrg {
1751 1.1 mrg /* Encourage to use r0-r7 for LRA when optimize for size. */
1752 1.1 mrg if (optimize_size)
1753 1.1 mrg {
1754 1.1 mrg if (hard_regno < 8)
1755 1.1 mrg return 4;
1756 1.1 mrg else if (hard_regno < 16)
1757 1.1 mrg return 3;
1758 1.1 mrg else if (hard_regno < 28)
1759 1.1 mrg return 2;
1760 1.1 mrg else
1761 1.1 mrg return 1;
1762 1.1 mrg }
1763 1.1 mrg else
1764 1.1 mrg {
1765 1.1 mrg if (hard_regno > 27)
1766 1.1 mrg return 1;
1767 1.1 mrg else
1768 1.1 mrg return 4;
1769 1.1 mrg }
1770 1.1 mrg }
1771 1.1 mrg
1772 1.1 mrg static bool
1773 1.1 mrg nds32_can_change_mode_class (machine_mode from,
1774 1.1 mrg machine_mode to,
1775 1.1 mrg reg_class_t rclass)
1776 1.1 mrg {
1777 1.1 mrg /* Don't spill double-precision register to two singal-precision
1778 1.1 mrg registers */
1779 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
1780 1.1 mrg && GET_MODE_SIZE (from) != GET_MODE_SIZE (to))
1781 1.1 mrg {
1782 1.1 mrg return !reg_classes_intersect_p (rclass, FP_REGS);
1783 1.1 mrg }
1784 1.1 mrg
1785 1.1 mrg return true;
1786 1.1 mrg }
1787 1.1 mrg
1788 1.1 mrg
1789 1.1 mrg /* Stack Layout and Calling Conventions. */
1791 1.1 mrg
1792 1.1 mrg /* There are three kinds of pointer concepts using in GCC compiler:
1793 1.1 mrg
1794 1.1 mrg frame pointer: A pointer to the first location of local variables.
1795 1.1 mrg stack pointer: A pointer to the top of a stack frame.
1796 1.1 mrg argument pointer: A pointer to the incoming arguments.
1797 1.1 mrg
1798 1.1 mrg In nds32 target calling convention, we are using 8-byte alignment.
1799 1.1 mrg Besides, we would like to have each stack frame of a function includes:
1800 1.1 mrg
1801 1.1 mrg [Block A]
1802 1.1 mrg 1. previous hard frame pointer
1803 1.1 mrg 2. return address
1804 1.1 mrg 3. callee-saved registers
1805 1.1 mrg 4. <padding bytes> (we will calculte in nds32_compute_stack_frame()
1806 1.1 mrg and save it at
1807 1.1 mrg cfun->machine->callee_saved_area_padding_bytes)
1808 1.1 mrg
1809 1.1 mrg [Block B]
1810 1.1 mrg 1. local variables
1811 1.1 mrg 2. spilling location
1812 1.1 mrg 3. <padding bytes> (it will be calculated by GCC itself)
1813 1.1 mrg 4. incoming arguments
1814 1.1 mrg 5. <padding bytes> (it will be calculated by GCC itself)
1815 1.1 mrg
1816 1.1 mrg [Block C]
1817 1.1 mrg 1. <padding bytes> (it will be calculated by GCC itself)
1818 1.1 mrg 2. outgoing arguments
1819 1.1 mrg
1820 1.1 mrg We 'wrap' these blocks together with
1821 1.1 mrg hard frame pointer ($r28) and stack pointer ($r31).
1822 1.1 mrg By applying the basic frame/stack/argument pointers concept,
1823 1.1 mrg the layout of a stack frame shoule be like this:
1824 1.1 mrg
1825 1.1 mrg | |
1826 1.1 mrg old stack pointer -> ----
1827 1.1 mrg | | \
1828 1.1 mrg | | saved arguments for
1829 1.1 mrg | | vararg functions
1830 1.1 mrg | | /
1831 1.1 mrg hard frame pointer -> --
1832 1.1 mrg & argument pointer | | \
1833 1.1 mrg | | previous hardware frame pointer
1834 1.1 mrg | | return address
1835 1.1 mrg | | callee-saved registers
1836 1.1 mrg | | /
1837 1.1 mrg frame pointer -> --
1838 1.1 mrg | | \
1839 1.1 mrg | | local variables
1840 1.1 mrg | | and incoming arguments
1841 1.1 mrg | | /
1842 1.1 mrg --
1843 1.1 mrg | | \
1844 1.1 mrg | | outgoing
1845 1.1 mrg | | arguments
1846 1.1 mrg | | /
1847 1.1 mrg stack pointer -> ----
1848 1.1 mrg
1849 1.1 mrg $SFP and $AP are used to represent frame pointer and arguments pointer,
1850 1.1 mrg which will be both eliminated as hard frame pointer. */
1851 1.1 mrg
1852 1.1 mrg /* -- Eliminating Frame Pointer and Arg Pointer. */
1853 1.1 mrg
1854 1.1 mrg static bool
1855 1.1 mrg nds32_can_eliminate (const int from_reg, const int to_reg)
1856 1.1 mrg {
1857 1.1 mrg if (from_reg == ARG_POINTER_REGNUM && to_reg == STACK_POINTER_REGNUM)
1858 1.1 mrg return true;
1859 1.1 mrg
1860 1.1 mrg if (from_reg == ARG_POINTER_REGNUM && to_reg == HARD_FRAME_POINTER_REGNUM)
1861 1.1 mrg return true;
1862 1.1 mrg
1863 1.1 mrg if (from_reg == FRAME_POINTER_REGNUM && to_reg == STACK_POINTER_REGNUM)
1864 1.1 mrg return true;
1865 1.1 mrg
1866 1.1 mrg if (from_reg == FRAME_POINTER_REGNUM && to_reg == HARD_FRAME_POINTER_REGNUM)
1867 1.1 mrg return true;
1868 1.1 mrg
1869 1.1 mrg return false;
1870 1.1 mrg }
1871 1.1 mrg
1872 1.1 mrg /* -- Passing Arguments in Registers. */
1873 1.1 mrg
1874 1.1 mrg static rtx
1875 1.1 mrg nds32_function_arg (cumulative_args_t ca, const function_arg_info &arg)
1876 1.1 mrg {
1877 1.1 mrg unsigned int regno;
1878 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (ca);
1879 1.1 mrg tree type = arg.type;
1880 1.1 mrg machine_mode mode = arg.mode;
1881 1.1 mrg
1882 1.1 mrg /* The last time this hook is called,
1883 1.1 mrg it is called with an end marker. */
1884 1.1 mrg if (arg.end_marker_p ())
1885 1.1 mrg return NULL_RTX;
1886 1.1 mrg
1887 1.1 mrg /* For nameless arguments, we need to take care it individually. */
1888 1.1 mrg if (!arg.named)
1889 1.1 mrg {
1890 1.1 mrg /* If we are under hard float abi, we have arguments passed on the
1891 1.1 mrg stack and all situation can be handled by GCC itself. */
1892 1.1 mrg if (TARGET_HARD_FLOAT)
1893 1.1 mrg return NULL_RTX;
1894 1.1 mrg
1895 1.1 mrg if (NDS32_ARG_PARTIAL_IN_GPR_REG_P (cum->gpr_offset, mode, type))
1896 1.1 mrg {
1897 1.1 mrg /* If we still have enough registers to pass argument, pick up
1898 1.1 mrg next available register number. */
1899 1.1 mrg regno
1900 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, mode, type);
1901 1.1 mrg return gen_rtx_REG (mode, regno);
1902 1.1 mrg }
1903 1.1 mrg
1904 1.1 mrg /* No register available, return NULL_RTX.
1905 1.1 mrg The compiler will use stack to pass argument instead. */
1906 1.1 mrg return NULL_RTX;
1907 1.1 mrg }
1908 1.1 mrg
1909 1.1 mrg /* The following is to handle named argument.
1910 1.1 mrg Note that the strategies of TARGET_HARD_FLOAT and !TARGET_HARD_FLOAT
1911 1.1 mrg are different. */
1912 1.1 mrg if (TARGET_HARD_FLOAT)
1913 1.1 mrg {
1914 1.1 mrg /* For TARGET_HARD_FLOAT calling convention, we use GPR and FPR
1915 1.1 mrg to pass argument. We have to further check TYPE and MODE so
1916 1.1 mrg that we can determine which kind of register we shall use. */
1917 1.1 mrg
1918 1.1 mrg /* Note that we need to pass argument entirely in registers under
1919 1.1 mrg hard float abi. */
1920 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_FLOAT
1921 1.1 mrg && NDS32_ARG_ENTIRE_IN_FPR_REG_P (cum->fpr_offset, mode, type))
1922 1.1 mrg {
1923 1.1 mrg /* Pick up the next available FPR register number. */
1924 1.1 mrg regno
1925 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_FPR_ARG (cum->fpr_offset, mode, type);
1926 1.1 mrg return gen_rtx_REG (mode, regno);
1927 1.1 mrg }
1928 1.1 mrg else if (GET_MODE_CLASS (mode) != MODE_FLOAT
1929 1.1 mrg && NDS32_ARG_ENTIRE_IN_GPR_REG_P (cum->gpr_offset, mode, type))
1930 1.1 mrg {
1931 1.1 mrg /* Pick up the next available GPR register number. */
1932 1.1 mrg regno
1933 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, mode, type);
1934 1.1 mrg return gen_rtx_REG (mode, regno);
1935 1.1 mrg }
1936 1.1 mrg }
1937 1.1 mrg else
1938 1.1 mrg {
1939 1.1 mrg /* For !TARGET_HARD_FLOAT calling convention, we always use GPR to pass
1940 1.1 mrg argument. Since we allow to pass argument partially in registers,
1941 1.1 mrg we can just return it if there are still registers available. */
1942 1.1 mrg if (NDS32_ARG_PARTIAL_IN_GPR_REG_P (cum->gpr_offset, mode, type))
1943 1.1 mrg {
1944 1.1 mrg /* Pick up the next available register number. */
1945 1.1 mrg regno
1946 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, mode, type);
1947 1.1 mrg return gen_rtx_REG (mode, regno);
1948 1.1 mrg }
1949 1.1 mrg
1950 1.1 mrg }
1951 1.1 mrg
1952 1.1 mrg /* No register available, return NULL_RTX.
1953 1.1 mrg The compiler will use stack to pass argument instead. */
1954 1.1 mrg return NULL_RTX;
1955 1.1 mrg }
1956 1.1 mrg
1957 1.1 mrg static bool
1958 1.1 mrg nds32_must_pass_in_stack (const function_arg_info &arg)
1959 1.1 mrg {
1960 1.1 mrg /* Return true if a type must be passed in memory.
1961 1.1 mrg If it is NOT using hard float abi, small aggregates can be
1962 1.1 mrg passed in a register even we are calling a variadic function.
1963 1.1 mrg So there is no need to take padding into consideration. */
1964 1.1 mrg if (TARGET_HARD_FLOAT)
1965 1.1 mrg return must_pass_in_stack_var_size_or_pad (arg);
1966 1.1 mrg else
1967 1.1 mrg return must_pass_in_stack_var_size (arg);
1968 1.1 mrg }
1969 1.1 mrg
1970 1.1 mrg static int
1971 1.1 mrg nds32_arg_partial_bytes (cumulative_args_t ca, const function_arg_info &arg)
1972 1.1 mrg {
1973 1.1 mrg /* Returns the number of bytes at the beginning of an argument that
1974 1.1 mrg must be put in registers. The value must be zero for arguments that are
1975 1.1 mrg passed entirely in registers or that are entirely pushed on the stack.
1976 1.1 mrg Besides, TARGET_FUNCTION_ARG for these arguments should return the
1977 1.1 mrg first register to be used by the caller for this argument. */
1978 1.1 mrg unsigned int needed_reg_count;
1979 1.1 mrg unsigned int remaining_reg_count;
1980 1.1 mrg CUMULATIVE_ARGS *cum;
1981 1.1 mrg
1982 1.1 mrg cum = get_cumulative_args (ca);
1983 1.1 mrg
1984 1.1 mrg /* Under hard float abi, we better have argument entirely passed in
1985 1.1 mrg registers or pushed on the stack so that we can reduce the complexity
1986 1.1 mrg of dealing with cum->gpr_offset and cum->fpr_offset. */
1987 1.1 mrg if (TARGET_HARD_FLOAT)
1988 1.1 mrg return 0;
1989 1.1 mrg
1990 1.1 mrg /* If we have already runned out of argument registers, return zero
1991 1.1 mrg so that the argument will be entirely pushed on the stack. */
1992 1.1 mrg if (NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, arg.mode, arg.type)
1993 1.1 mrg >= NDS32_GPR_ARG_FIRST_REGNUM + NDS32_MAX_GPR_REGS_FOR_ARGS)
1994 1.1 mrg return 0;
1995 1.1 mrg
1996 1.1 mrg /* Calculate how many registers do we need for this argument. */
1997 1.1 mrg needed_reg_count = NDS32_NEED_N_REGS_FOR_ARG (arg.mode, arg.type);
1998 1.1 mrg
1999 1.1 mrg /* Calculate how many argument registers have left for passing argument.
2000 1.1 mrg Note that we should count it from next available register number. */
2001 1.1 mrg remaining_reg_count
2002 1.1 mrg = NDS32_MAX_GPR_REGS_FOR_ARGS
2003 1.1 mrg - (NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset,
2004 1.1 mrg arg.mode, arg.type)
2005 1.1 mrg - NDS32_GPR_ARG_FIRST_REGNUM);
2006 1.1 mrg
2007 1.1 mrg /* Note that we have to return the nubmer of bytes, not registers count. */
2008 1.1 mrg if (needed_reg_count > remaining_reg_count)
2009 1.1 mrg return remaining_reg_count * UNITS_PER_WORD;
2010 1.1 mrg
2011 1.1 mrg return 0;
2012 1.1 mrg }
2013 1.1 mrg
2014 1.1 mrg static void
2015 1.1 mrg nds32_function_arg_advance (cumulative_args_t ca,
2016 1.1 mrg const function_arg_info &arg)
2017 1.1 mrg {
2018 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (ca);
2019 1.1 mrg tree type = arg.type;
2020 1.1 mrg machine_mode mode = arg.mode;
2021 1.1 mrg
2022 1.1 mrg if (arg.named)
2023 1.1 mrg {
2024 1.1 mrg /* We need to further check TYPE and MODE so that we can determine
2025 1.1 mrg which kind of register we shall advance. */
2026 1.1 mrg
2027 1.1 mrg /* Under hard float abi, we may advance FPR registers. */
2028 1.1 mrg if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
2029 1.1 mrg {
2030 1.1 mrg cum->fpr_offset
2031 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_FPR_ARG (cum->fpr_offset, mode, type)
2032 1.1 mrg - NDS32_FPR_ARG_FIRST_REGNUM
2033 1.1 mrg + NDS32_NEED_N_REGS_FOR_ARG (mode, type);
2034 1.1 mrg }
2035 1.1 mrg else
2036 1.1 mrg {
2037 1.1 mrg cum->gpr_offset
2038 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, mode, type)
2039 1.1 mrg - NDS32_GPR_ARG_FIRST_REGNUM
2040 1.1 mrg + NDS32_NEED_N_REGS_FOR_ARG (mode, type);
2041 1.1 mrg }
2042 1.1 mrg }
2043 1.1 mrg else
2044 1.1 mrg {
2045 1.1 mrg /* If this nameless argument is NOT under TARGET_HARD_FLOAT,
2046 1.1 mrg we can advance next register as well so that caller is
2047 1.1 mrg able to pass arguments in registers and callee must be
2048 1.1 mrg in charge of pushing all of them into stack. */
2049 1.1 mrg if (!TARGET_HARD_FLOAT)
2050 1.1 mrg {
2051 1.1 mrg cum->gpr_offset
2052 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, mode, type)
2053 1.1 mrg - NDS32_GPR_ARG_FIRST_REGNUM
2054 1.1 mrg + NDS32_NEED_N_REGS_FOR_ARG (mode, type);
2055 1.1 mrg }
2056 1.1 mrg }
2057 1.1 mrg }
2058 1.1 mrg
2059 1.1 mrg static unsigned int
2060 1.1 mrg nds32_function_arg_boundary (machine_mode mode, const_tree type)
2061 1.1 mrg {
2062 1.1 mrg return (nds32_needs_double_word_align (mode, type)
2063 1.1 mrg ? NDS32_DOUBLE_WORD_ALIGNMENT
2064 1.1 mrg : PARM_BOUNDARY);
2065 1.1 mrg }
2066 1.1 mrg
2067 1.1 mrg bool
2068 1.1 mrg nds32_vector_mode_supported_p (machine_mode mode)
2069 1.1 mrg {
2070 1.1 mrg if (mode == V4QImode
2071 1.1 mrg || mode == V2HImode)
2072 1.1 mrg return NDS32_EXT_DSP_P ();
2073 1.1 mrg
2074 1.1 mrg return false;
2075 1.1 mrg }
2076 1.1 mrg
2077 1.1 mrg /* -- How Scalar Function Values Are Returned. */
2078 1.1 mrg
2079 1.1 mrg static rtx
2080 1.1 mrg nds32_function_value (const_tree ret_type,
2081 1.1 mrg const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
2082 1.1 mrg bool outgoing ATTRIBUTE_UNUSED)
2083 1.1 mrg {
2084 1.1 mrg machine_mode mode;
2085 1.1 mrg int unsignedp;
2086 1.1 mrg
2087 1.1 mrg mode = TYPE_MODE (ret_type);
2088 1.1 mrg unsignedp = TYPE_UNSIGNED (ret_type);
2089 1.1 mrg
2090 1.1 mrg if (INTEGRAL_TYPE_P (ret_type))
2091 1.1 mrg mode = promote_mode (ret_type, mode, &unsignedp);
2092 1.1 mrg
2093 1.1 mrg if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
2094 1.1 mrg return gen_rtx_REG (mode, NDS32_FPR_RET_FIRST_REGNUM);
2095 1.1 mrg else
2096 1.1 mrg return gen_rtx_REG (mode, NDS32_GPR_RET_FIRST_REGNUM);
2097 1.1 mrg }
2098 1.1 mrg
2099 1.1 mrg static rtx
2100 1.1 mrg nds32_libcall_value (machine_mode mode,
2101 1.1 mrg const_rtx fun ATTRIBUTE_UNUSED)
2102 1.1 mrg {
2103 1.1 mrg if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
2104 1.1 mrg return gen_rtx_REG (mode, NDS32_FPR_RET_FIRST_REGNUM);
2105 1.1 mrg
2106 1.1 mrg return gen_rtx_REG (mode, NDS32_GPR_RET_FIRST_REGNUM);
2107 1.1 mrg }
2108 1.1 mrg
2109 1.1 mrg static bool
2110 1.1 mrg nds32_function_value_regno_p (const unsigned int regno)
2111 1.1 mrg {
2112 1.1 mrg if (regno == NDS32_GPR_RET_FIRST_REGNUM
2113 1.1 mrg || (TARGET_HARD_FLOAT
2114 1.1 mrg && regno == NDS32_FPR_RET_FIRST_REGNUM))
2115 1.1 mrg return true;
2116 1.1 mrg
2117 1.1 mrg return false;
2118 1.1 mrg }
2119 1.1 mrg
2120 1.1 mrg /* -- How Large Values Are Returned. */
2121 1.1 mrg
2122 1.1 mrg static bool
2123 1.1 mrg nds32_return_in_memory (const_tree type,
2124 1.1 mrg const_tree fntype ATTRIBUTE_UNUSED)
2125 1.1 mrg {
2126 1.1 mrg /* Note that int_size_in_bytes can return -1 if the size can vary
2127 1.1 mrg or is larger than an integer. */
2128 1.1 mrg HOST_WIDE_INT size = int_size_in_bytes (type);
2129 1.1 mrg
2130 1.1 mrg /* For COMPLEX_TYPE, if the total size cannot be hold within two registers,
2131 1.1 mrg the return value is supposed to be in memory. We need to be aware of
2132 1.1 mrg that the size may be -1. */
2133 1.1 mrg if (TREE_CODE (type) == COMPLEX_TYPE)
2134 1.1 mrg if (size < 0 || size > 2 * UNITS_PER_WORD)
2135 1.1 mrg return true;
2136 1.1 mrg
2137 1.1 mrg /* If it is BLKmode and the total size cannot be hold within two registers,
2138 1.1 mrg the return value is supposed to be in memory. We need to be aware of
2139 1.1 mrg that the size may be -1. */
2140 1.1 mrg if (TYPE_MODE (type) == BLKmode)
2141 1.1 mrg if (size < 0 || size > 2 * UNITS_PER_WORD)
2142 1.1 mrg return true;
2143 1.1 mrg
2144 1.1 mrg /* For other cases, having result in memory is unnecessary. */
2145 1.1 mrg return false;
2146 1.1 mrg }
2147 1.1 mrg
2148 1.1 mrg /* -- Function Entry and Exit. */
2149 1.1 mrg
2150 1.1 mrg /* The content produced from this function
2151 1.1 mrg will be placed before prologue body. */
2152 1.1 mrg static void
2153 1.1 mrg nds32_asm_function_prologue (FILE *file)
2154 1.1 mrg {
2155 1.1 mrg int r;
2156 1.1 mrg const char *func_name;
2157 1.1 mrg tree attrs;
2158 1.1 mrg tree name;
2159 1.1 mrg
2160 1.1 mrg /* All stack frame information is supposed to be
2161 1.1 mrg already computed when expanding prologue.
2162 1.1 mrg The result is in cfun->machine.
2163 1.1 mrg DO NOT call nds32_compute_stack_frame() here
2164 1.1 mrg because it may corrupt the essential information. */
2165 1.1 mrg
2166 1.1 mrg fprintf (file, "\t! BEGIN PROLOGUE\n");
2167 1.1 mrg fprintf (file, "\t! fp needed: %d\n", frame_pointer_needed);
2168 1.1 mrg fprintf (file, "\t! pretend_args: %d\n", cfun->machine->va_args_size);
2169 1.1 mrg fprintf (file, "\t! local_size: %d\n", cfun->machine->local_size);
2170 1.1 mrg fprintf (file, "\t! out_args_size: %d\n", cfun->machine->out_args_size);
2171 1.1 mrg
2172 1.1 mrg /* Use df_regs_ever_live_p() to detect if the register
2173 1.1 mrg is ever used in the current function. */
2174 1.1 mrg fprintf (file, "\t! registers ever_live: ");
2175 1.1 mrg for (r = 0; r < 65; r++)
2176 1.1 mrg {
2177 1.1 mrg if (df_regs_ever_live_p (r))
2178 1.1 mrg fprintf (file, "%s, ", reg_names[r]);
2179 1.1 mrg }
2180 1.1 mrg fputc ('\n', file);
2181 1.1 mrg
2182 1.1 mrg /* Display the attributes of this function. */
2183 1.1 mrg fprintf (file, "\t! function attributes: ");
2184 1.1 mrg /* Get the attributes tree list.
2185 1.1 mrg Note that GCC builds attributes list with reverse order. */
2186 1.1 mrg attrs = DECL_ATTRIBUTES (current_function_decl);
2187 1.1 mrg
2188 1.1 mrg /* If there is no any attribute, print out "None". */
2189 1.1 mrg if (!attrs)
2190 1.1 mrg fprintf (file, "None");
2191 1.1 mrg
2192 1.1 mrg /* If there are some attributes, try if we need to
2193 1.1 mrg construct isr vector information. */
2194 1.1 mrg func_name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
2195 1.1 mrg nds32_construct_isr_vectors_information (attrs, func_name);
2196 1.1 mrg
2197 1.1 mrg /* Display all attributes of this function. */
2198 1.1 mrg while (attrs)
2199 1.1 mrg {
2200 1.1 mrg name = TREE_PURPOSE (attrs);
2201 1.1 mrg fprintf (file, "%s ", IDENTIFIER_POINTER (name));
2202 1.1 mrg
2203 1.1 mrg /* Pick up the next attribute. */
2204 1.1 mrg attrs = TREE_CHAIN (attrs);
2205 1.1 mrg }
2206 1.1 mrg fputc ('\n', file);
2207 1.1 mrg }
2208 1.1 mrg
2209 1.1 mrg /* After rtl prologue has been expanded, this function is used. */
2210 1.1 mrg static void
2211 1.1 mrg nds32_asm_function_end_prologue (FILE *file)
2212 1.1 mrg {
2213 1.1 mrg fprintf (file, "\t! END PROLOGUE\n");
2214 1.1 mrg }
2215 1.1 mrg
2216 1.1 mrg /* Before rtl epilogue has been expanded, this function is used. */
2217 1.1 mrg static void
2218 1.1 mrg nds32_asm_function_begin_epilogue (FILE *file)
2219 1.1 mrg {
2220 1.1 mrg fprintf (file, "\t! BEGIN EPILOGUE\n");
2221 1.1 mrg }
2222 1.1 mrg
2223 1.1 mrg /* The content produced from this function
2224 1.1 mrg will be placed after epilogue body. */
2225 1.1 mrg static void
2226 1.1 mrg nds32_asm_function_epilogue (FILE *file)
2227 1.1 mrg {
2228 1.1 mrg fprintf (file, "\t! END EPILOGUE\n");
2229 1.1 mrg }
2230 1.1 mrg
2231 1.1 mrg static void
2232 1.1 mrg nds32_asm_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
2233 1.1 mrg HOST_WIDE_INT delta,
2234 1.1 mrg HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
2235 1.1 mrg tree function)
2236 1.1 mrg {
2237 1.1 mrg const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk));
2238 1.1 mrg int this_regno;
2239 1.1 mrg
2240 1.1 mrg assemble_start_function (thunk, fnname);
2241 1.1 mrg /* Make sure unwind info is emitted for the thunk if needed. */
2242 1.1 mrg final_start_function (emit_barrier (), file, 1);
2243 1.1 mrg
2244 1.1 mrg this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function)
2245 1.1 mrg ? 1
2246 1.1 mrg : 0);
2247 1.1 mrg
2248 1.1 mrg if (flag_pic)
2249 1.1 mrg {
2250 1.1 mrg fprintf (file, "\tsmw.adm\t$r31, [$r31], $r31, 4\n");
2251 1.1 mrg fprintf (file, "\tsethi\t%s, hi20(_GLOBAL_OFFSET_TABLE_-8)\n",
2252 1.1 mrg reg_names [PIC_OFFSET_TABLE_REGNUM]);
2253 1.1 mrg fprintf (file, "\tori\t%s, %s, lo12(_GLOBAL_OFFSET_TABLE_-4)\n",
2254 1.1 mrg reg_names [PIC_OFFSET_TABLE_REGNUM],
2255 1.1 mrg reg_names [PIC_OFFSET_TABLE_REGNUM]);
2256 1.1 mrg
2257 1.1 mrg if (TARGET_ISA_V3)
2258 1.1 mrg fprintf (file, "\tadd5.pc\t$gp\n");
2259 1.1 mrg else
2260 1.1 mrg {
2261 1.1 mrg fprintf (file, "\tmfusr\t$ta, $pc\n");
2262 1.1 mrg fprintf (file, "\tadd\t%s, $ta, %s\n",
2263 1.1 mrg reg_names [PIC_OFFSET_TABLE_REGNUM],
2264 1.1 mrg reg_names [PIC_OFFSET_TABLE_REGNUM]);
2265 1.1 mrg }
2266 1.1 mrg }
2267 1.1 mrg
2268 1.1 mrg if (delta != 0)
2269 1.1 mrg {
2270 1.1 mrg if (satisfies_constraint_Is15 (GEN_INT (delta)))
2271 1.1 mrg {
2272 1.1 mrg fprintf (file, "\taddi\t$r%d, $r%d, " HOST_WIDE_INT_PRINT_DEC "\n",
2273 1.1 mrg this_regno, this_regno, delta);
2274 1.1 mrg }
2275 1.1 mrg else if (satisfies_constraint_Is20 (GEN_INT (delta)))
2276 1.1 mrg {
2277 1.1 mrg fprintf (file, "\tmovi\t$ta, " HOST_WIDE_INT_PRINT_DEC "\n", delta);
2278 1.1 mrg fprintf (file, "\tadd\t$r%d, $r%d, $ta\n", this_regno, this_regno);
2279 1.1 mrg }
2280 1.1 mrg else
2281 1.1 mrg {
2282 1.1 mrg fprintf (file,
2283 1.1 mrg "\tsethi\t$ta, hi20(" HOST_WIDE_INT_PRINT_DEC ")\n",
2284 1.1 mrg delta);
2285 1.1 mrg fprintf (file,
2286 1.1 mrg "\tori\t$ta, $ta, lo12(" HOST_WIDE_INT_PRINT_DEC ")\n",
2287 1.1 mrg delta);
2288 1.1 mrg fprintf (file, "\tadd\t$r%d, $r%d, $ta\n", this_regno, this_regno);
2289 1.1 mrg }
2290 1.1 mrg }
2291 1.1 mrg
2292 1.1 mrg if (flag_pic)
2293 1.1 mrg {
2294 1.1 mrg fprintf (file, "\tla\t$ta, ");
2295 1.1 mrg assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
2296 1.1 mrg fprintf (file, "@PLT\n");
2297 1.1 mrg fprintf (file, "\t! epilogue\n");
2298 1.1 mrg fprintf (file, "\tlwi.bi\t%s, [%s], 4\n",
2299 1.1 mrg reg_names[PIC_OFFSET_TABLE_REGNUM],
2300 1.1 mrg reg_names[STACK_POINTER_REGNUM]);
2301 1.1 mrg fprintf (file, "\tbr\t$ta\n");
2302 1.1 mrg }
2303 1.1 mrg else
2304 1.1 mrg {
2305 1.1 mrg fprintf (file, "\tb\t");
2306 1.1 mrg assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
2307 1.1 mrg fprintf (file, "\n");
2308 1.1 mrg }
2309 1.1 mrg
2310 1.1 mrg final_end_function ();
2311 1.1 mrg assemble_end_function (thunk, fnname);
2312 1.1 mrg }
2313 1.1 mrg
2314 1.1 mrg /* -- Permitting tail calls. */
2315 1.1 mrg
2316 1.1 mrg /* Return true if it is ok to do sibling call optimization. */
2317 1.1 mrg static bool
2318 1.1 mrg nds32_function_ok_for_sibcall (tree decl,
2319 1.1 mrg tree exp ATTRIBUTE_UNUSED)
2320 1.1 mrg {
2321 1.1 mrg /* The DECL is NULL if it is an indirect call. */
2322 1.1 mrg
2323 1.1 mrg /* 1. Do not apply sibling call if -mv3push is enabled,
2324 1.1 mrg because pop25 instruction also represents return behavior.
2325 1.1 mrg 2. If this function is a isr function, do not apply sibling call
2326 1.1 mrg because it may perform the behavior that user does not expect.
2327 1.1 mrg 3. If this function is a variadic function, do not apply sibling call
2328 1.1 mrg because the stack layout may be a mess.
2329 1.1 mrg 4. We don't want to apply sibling call optimization for indirect
2330 1.1 mrg sibcall because the pop behavior in epilogue may pollute the
2331 1.1 mrg content of caller-saved regsiter when the register is used for
2332 1.1 mrg indirect sibcall.
2333 1.1 mrg 5. In pic mode, it may use some registers for PLT call. */
2334 1.1 mrg return (!TARGET_V3PUSH
2335 1.1 mrg && !nds32_isr_function_p (current_function_decl)
2336 1.1 mrg && (cfun->machine->va_args_size == 0)
2337 1.1 mrg && decl
2338 1.1 mrg && !flag_pic);
2339 1.1 mrg }
2340 1.1 mrg
2341 1.1 mrg /* Determine whether we need to enable warning for function return check. */
2342 1.1 mrg static bool
2343 1.1 mrg nds32_warn_func_return (tree decl)
2344 1.1 mrg {
2345 1.1 mrg /* Naked functions are implemented entirely in assembly, including the
2346 1.1 mrg return sequence, so suppress warnings about this. */
2347 1.1 mrg return !nds32_naked_function_p (decl);
2348 1.1 mrg }
2349 1.1 mrg
2350 1.1 mrg
2351 1.1 mrg /* Implementing the Varargs Macros. */
2353 1.1 mrg
2354 1.1 mrg static void
2355 1.1 mrg nds32_setup_incoming_varargs (cumulative_args_t ca,
2356 1.1 mrg const function_arg_info &arg,
2357 1.1 mrg int *pretend_args_size,
2358 1.1 mrg int second_time ATTRIBUTE_UNUSED)
2359 1.1 mrg {
2360 1.1 mrg unsigned int total_args_regs;
2361 1.1 mrg unsigned int num_of_used_regs;
2362 1.1 mrg unsigned int remaining_reg_count;
2363 1.1 mrg CUMULATIVE_ARGS *cum;
2364 1.1 mrg
2365 1.1 mrg /* If we are under hard float abi, we do not need to set *pretend_args_size.
2366 1.1 mrg So that all nameless arguments are pushed by caller and all situation
2367 1.1 mrg can be handled by GCC itself. */
2368 1.1 mrg if (TARGET_HARD_FLOAT)
2369 1.1 mrg return;
2370 1.1 mrg
2371 1.1 mrg /* We are using NDS32_MAX_GPR_REGS_FOR_ARGS registers,
2372 1.1 mrg counting from NDS32_GPR_ARG_FIRST_REGNUM, for saving incoming arguments.
2373 1.1 mrg However, for nameless(anonymous) arguments, we should push them on the
2374 1.1 mrg stack so that all the nameless arguments appear to have been passed
2375 1.1 mrg consecutively in the memory for accessing. Hence, we need to check and
2376 1.1 mrg exclude the registers that are used for named arguments. */
2377 1.1 mrg
2378 1.1 mrg cum = get_cumulative_args (ca);
2379 1.1 mrg
2380 1.1 mrg /* ARG describes the last argument.
2381 1.1 mrg We need those information to determine the remaining registers
2382 1.1 mrg for varargs. */
2383 1.1 mrg total_args_regs
2384 1.1 mrg = NDS32_MAX_GPR_REGS_FOR_ARGS + NDS32_GPR_ARG_FIRST_REGNUM;
2385 1.1 mrg num_of_used_regs
2386 1.1 mrg = NDS32_AVAILABLE_REGNUM_FOR_GPR_ARG (cum->gpr_offset, arg.mode, arg.type)
2387 1.1 mrg + NDS32_NEED_N_REGS_FOR_ARG (arg.mode, arg.type);
2388 1.1 mrg
2389 1.1 mrg remaining_reg_count = total_args_regs - num_of_used_regs;
2390 1.1 mrg *pretend_args_size = remaining_reg_count * UNITS_PER_WORD;
2391 1.1 mrg
2392 1.1 mrg return;
2393 1.1 mrg }
2394 1.1 mrg
2395 1.1 mrg static bool
2396 1.1 mrg nds32_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
2397 1.1 mrg {
2398 1.1 mrg /* If this hook returns true, the named argument of FUNCTION_ARG is always
2399 1.1 mrg true for named arguments, and false for unnamed arguments. */
2400 1.1 mrg return true;
2401 1.1 mrg }
2402 1.1 mrg
2403 1.1 mrg
2404 1.1 mrg /* Trampolines for Nested Functions. */
2406 1.1 mrg
2407 1.1 mrg static void
2408 1.1 mrg nds32_asm_trampoline_template (FILE *f)
2409 1.1 mrg {
2410 1.1 mrg if (TARGET_REDUCED_REGS)
2411 1.1 mrg {
2412 1.1 mrg /* Trampoline is not supported on reduced-set registers yet. */
2413 1.1 mrg sorry ("a nested function is not supported for reduced registers");
2414 1.1 mrg }
2415 1.1 mrg else
2416 1.1 mrg {
2417 1.1 mrg asm_fprintf (f, "\t! Trampoline code template\n");
2418 1.1 mrg asm_fprintf (f, "\t! This code fragment will be copied "
2419 1.1 mrg "into stack on demand\n");
2420 1.1 mrg
2421 1.1 mrg asm_fprintf (f, "\tmfusr\t$r16,$pc\n");
2422 1.1 mrg asm_fprintf (f, "\tlwi\t$r15,[$r16 + 20] "
2423 1.1 mrg "! load nested function address\n");
2424 1.1 mrg asm_fprintf (f, "\tlwi\t$r16,[$r16 + 16] "
2425 1.1 mrg "! load chain_value\n");
2426 1.1 mrg asm_fprintf (f, "\tjr\t$r15\n");
2427 1.1 mrg }
2428 1.1 mrg
2429 1.1 mrg /* Preserve space ($pc + 16) for saving chain_value,
2430 1.1 mrg nds32_trampoline_init will fill the value in this slot. */
2431 1.1 mrg asm_fprintf (f, "\t! space for saving chain_value\n");
2432 1.1 mrg assemble_aligned_integer (UNITS_PER_WORD, const0_rtx);
2433 1.1 mrg
2434 1.1 mrg /* Preserve space ($pc + 20) for saving nested function address,
2435 1.1 mrg nds32_trampoline_init will fill the value in this slot. */
2436 1.1 mrg asm_fprintf (f, "\t! space for saving nested function address\n");
2437 1.1 mrg assemble_aligned_integer (UNITS_PER_WORD, const0_rtx);
2438 1.1 mrg }
2439 1.1 mrg
2440 1.1 mrg /* Emit RTL insns to initialize the variable parts of a trampoline. */
2441 1.1 mrg static void
2442 1.1 mrg nds32_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
2443 1.1 mrg {
2444 1.1 mrg int i;
2445 1.1 mrg
2446 1.1 mrg /* Nested function address. */
2447 1.1 mrg rtx fnaddr;
2448 1.1 mrg /* The memory rtx that is going to
2449 1.1 mrg be filled with chain_value. */
2450 1.1 mrg rtx chain_value_mem;
2451 1.1 mrg /* The memory rtx that is going to
2452 1.1 mrg be filled with nested function address. */
2453 1.1 mrg rtx nested_func_mem;
2454 1.1 mrg
2455 1.1 mrg /* Start address of trampoline code in stack, for doing cache sync. */
2456 1.1 mrg rtx sync_cache_addr;
2457 1.1 mrg /* Temporary register for sync instruction. */
2458 1.1 mrg rtx tmp_reg;
2459 1.1 mrg /* Instruction-cache sync instruction,
2460 1.1 mrg requesting an argument as starting address. */
2461 1.1 mrg rtx isync_insn;
2462 1.1 mrg /* For convenience reason of doing comparison. */
2463 1.1 mrg int tramp_align_in_bytes;
2464 1.1 mrg
2465 1.1 mrg /* Trampoline is not supported on reduced-set registers yet. */
2466 1.1 mrg if (TARGET_REDUCED_REGS)
2467 1.1 mrg sorry ("a nested function is not supported for reduced registers");
2468 1.1 mrg
2469 1.1 mrg /* STEP 1: Copy trampoline code template into stack,
2470 1.1 mrg fill up essential data into stack. */
2471 1.1 mrg
2472 1.1 mrg /* Extract nested function address rtx. */
2473 1.1 mrg fnaddr = XEXP (DECL_RTL (fndecl), 0);
2474 1.1 mrg
2475 1.1 mrg /* m_tramp is memory rtx that is going to be filled with trampoline code.
2476 1.1 mrg We have nds32_asm_trampoline_template() to emit template pattern. */
2477 1.1 mrg emit_block_move (m_tramp, assemble_trampoline_template (),
2478 1.1 mrg GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
2479 1.1 mrg
2480 1.1 mrg /* After copying trampoline code into stack,
2481 1.1 mrg fill chain_value into stack. */
2482 1.1 mrg chain_value_mem = adjust_address (m_tramp, SImode, 16);
2483 1.1 mrg emit_move_insn (chain_value_mem, chain_value);
2484 1.1 mrg /* After copying trampoline code int stack,
2485 1.1 mrg fill nested function address into stack. */
2486 1.1 mrg nested_func_mem = adjust_address (m_tramp, SImode, 20);
2487 1.1 mrg emit_move_insn (nested_func_mem, fnaddr);
2488 1.1 mrg
2489 1.1 mrg /* STEP 2: Sync instruction-cache. */
2490 1.1 mrg
2491 1.1 mrg /* We have successfully filled trampoline code into stack.
2492 1.1 mrg However, in order to execute code in stack correctly,
2493 1.1 mrg we must sync instruction cache. */
2494 1.1 mrg sync_cache_addr = XEXP (m_tramp, 0);
2495 1.1 mrg tmp_reg = gen_reg_rtx (SImode);
2496 1.1 mrg isync_insn = gen_unspec_volatile_isync (tmp_reg);
2497 1.1 mrg
2498 1.1 mrg /* Because nds32_cache_block_size is in bytes,
2499 1.1 mrg we get trampoline alignment in bytes for convenient comparison. */
2500 1.1 mrg tramp_align_in_bytes = TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT;
2501 1.1 mrg
2502 1.1 mrg if (tramp_align_in_bytes >= nds32_cache_block_size
2503 1.1 mrg && (tramp_align_in_bytes % nds32_cache_block_size) == 0)
2504 1.1 mrg {
2505 1.1 mrg /* Under this condition, the starting address of trampoline
2506 1.1 mrg must be aligned to the starting address of each cache block
2507 1.1 mrg and we do not have to worry about cross-boundary issue. */
2508 1.1 mrg for (i = 0;
2509 1.1 mrg i < (TRAMPOLINE_SIZE + nds32_cache_block_size - 1)
2510 1.1 mrg / nds32_cache_block_size;
2511 1.1 mrg i++)
2512 1.1 mrg {
2513 1.1 mrg emit_move_insn (tmp_reg,
2514 1.1 mrg plus_constant (Pmode, sync_cache_addr,
2515 1.1 mrg nds32_cache_block_size * i));
2516 1.1 mrg emit_insn (isync_insn);
2517 1.1 mrg }
2518 1.1 mrg }
2519 1.1 mrg else if (TRAMPOLINE_SIZE > nds32_cache_block_size)
2520 1.1 mrg {
2521 1.1 mrg /* The starting address of trampoline code
2522 1.1 mrg may not be aligned to the cache block,
2523 1.1 mrg so the trampoline code may be across two cache block.
2524 1.1 mrg We need to sync the last element, which is 4-byte size,
2525 1.1 mrg of trampoline template. */
2526 1.1 mrg for (i = 0;
2527 1.1 mrg i < (TRAMPOLINE_SIZE + nds32_cache_block_size - 1)
2528 1.1 mrg / nds32_cache_block_size;
2529 1.1 mrg i++)
2530 1.1 mrg {
2531 1.1 mrg emit_move_insn (tmp_reg,
2532 1.1 mrg plus_constant (Pmode, sync_cache_addr,
2533 1.1 mrg nds32_cache_block_size * i));
2534 1.1 mrg emit_insn (isync_insn);
2535 1.1 mrg }
2536 1.1 mrg
2537 1.1 mrg /* The last element of trampoline template is 4-byte size. */
2538 1.1 mrg emit_move_insn (tmp_reg,
2539 1.1 mrg plus_constant (Pmode, sync_cache_addr,
2540 1.1 mrg TRAMPOLINE_SIZE - 4));
2541 1.1 mrg emit_insn (isync_insn);
2542 1.1 mrg }
2543 1.1 mrg else
2544 1.1 mrg {
2545 1.1 mrg /* This is the simplest case.
2546 1.1 mrg Because TRAMPOLINE_SIZE is less than or
2547 1.1 mrg equal to nds32_cache_block_size,
2548 1.1 mrg we can just sync start address and
2549 1.1 mrg the last element of trampoline code. */
2550 1.1 mrg
2551 1.1 mrg /* Sync starting address of tampoline code. */
2552 1.1 mrg emit_move_insn (tmp_reg, sync_cache_addr);
2553 1.1 mrg emit_insn (isync_insn);
2554 1.1 mrg /* Sync the last element, which is 4-byte size,
2555 1.1 mrg of trampoline template. */
2556 1.1 mrg emit_move_insn (tmp_reg,
2557 1.1 mrg plus_constant (Pmode, sync_cache_addr,
2558 1.1 mrg TRAMPOLINE_SIZE - 4));
2559 1.1 mrg emit_insn (isync_insn);
2560 1.1 mrg }
2561 1.1 mrg
2562 1.1 mrg /* Set instruction serialization barrier
2563 1.1 mrg to guarantee the correct operations. */
2564 1.1 mrg emit_insn (gen_unspec_volatile_isb ());
2565 1.1 mrg }
2566 1.1 mrg
2567 1.1 mrg
2568 1.1 mrg /* Addressing Modes. */
2570 1.1 mrg
2571 1.1 mrg static bool
2572 1.1 mrg nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
2573 1.1 mrg {
2574 1.1 mrg if (TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
2575 1.1 mrg {
2576 1.1 mrg /* When using floating-point instructions,
2577 1.1 mrg we don't allow 'addr' to be [symbol_ref], [CONST] pattern. */
2578 1.1 mrg if ((mode == DFmode || mode == SFmode)
2579 1.1 mrg && (GET_CODE (x) == SYMBOL_REF
2580 1.1 mrg || GET_CODE(x) == CONST))
2581 1.1 mrg return false;
2582 1.1 mrg
2583 1.1 mrg /* Allow [post_modify] addressing mode, when using FPU instructions. */
2584 1.1 mrg if (GET_CODE (x) == POST_MODIFY
2585 1.1 mrg && mode == DFmode)
2586 1.1 mrg {
2587 1.1 mrg if (GET_CODE (XEXP (x, 0)) == REG
2588 1.1 mrg && GET_CODE (XEXP (x, 1)) == PLUS)
2589 1.1 mrg {
2590 1.1 mrg rtx plus_op = XEXP (x, 1);
2591 1.1 mrg rtx op0 = XEXP (plus_op, 0);
2592 1.1 mrg rtx op1 = XEXP (plus_op, 1);
2593 1.1 mrg
2594 1.1 mrg if (nds32_address_register_rtx_p (op0, strict)
2595 1.1 mrg && CONST_INT_P (op1))
2596 1.1 mrg {
2597 1.1 mrg if (satisfies_constraint_Is14 (op1))
2598 1.1 mrg {
2599 1.1 mrg /* If it is not under strictly aligned situation,
2600 1.1 mrg we can return true without checking alignment. */
2601 1.1 mrg if (!cfun->machine->strict_aligned_p)
2602 1.1 mrg return true;
2603 1.1 mrg /* Make sure address is word alignment.
2604 1.1 mrg Currently we do not have 64-bit load/store yet,
2605 1.1 mrg so we will use two 32-bit load/store instructions to do
2606 1.1 mrg memory access and they are single word alignment. */
2607 1.1 mrg else if (NDS32_SINGLE_WORD_ALIGN_P (INTVAL (op1)))
2608 1.1 mrg return true;
2609 1.1 mrg }
2610 1.1 mrg }
2611 1.1 mrg }
2612 1.1 mrg }
2613 1.1 mrg }
2614 1.1 mrg
2615 1.1 mrg /* For (mem:DI addr) or (mem:DF addr) case,
2616 1.1 mrg we only allow 'addr' to be [reg], [symbol_ref],
2617 1.1 mrg [const], or [reg + const_int] pattern. */
2618 1.1 mrg if (mode == DImode || mode == DFmode)
2619 1.1 mrg {
2620 1.1 mrg /* Allow [Reg + const_int] addressing mode. */
2621 1.1 mrg if (GET_CODE (x) == PLUS)
2622 1.1 mrg {
2623 1.1 mrg if (nds32_address_register_rtx_p (XEXP (x, 0), strict)
2624 1.1 mrg && nds32_legitimate_index_p (mode, XEXP (x, 1), strict)
2625 1.1 mrg && CONST_INT_P (XEXP (x, 1)))
2626 1.1 mrg return true;
2627 1.1 mrg else if (nds32_address_register_rtx_p (XEXP (x, 1), strict)
2628 1.1 mrg && nds32_legitimate_index_p (mode, XEXP (x, 0), strict)
2629 1.1 mrg && CONST_INT_P (XEXP (x, 0)))
2630 1.1 mrg return true;
2631 1.1 mrg }
2632 1.1 mrg
2633 1.1 mrg /* Allow [post_inc] and [post_dec] addressing mode. */
2634 1.1 mrg if (GET_CODE (x) == POST_INC || GET_CODE (x) == POST_DEC)
2635 1.1 mrg {
2636 1.1 mrg if (nds32_address_register_rtx_p (XEXP (x, 0), strict))
2637 1.1 mrg return true;
2638 1.1 mrg }
2639 1.1 mrg
2640 1.1 mrg /* Now check [reg], [symbol_ref], and [const]. */
2641 1.1 mrg if (GET_CODE (x) != REG
2642 1.1 mrg && GET_CODE (x) != SYMBOL_REF
2643 1.1 mrg && GET_CODE (x) != CONST)
2644 1.1 mrg return false;
2645 1.1 mrg }
2646 1.1 mrg
2647 1.1 mrg /* Check if 'x' is a valid address. */
2648 1.1 mrg switch (GET_CODE (x))
2649 1.1 mrg {
2650 1.1 mrg case REG:
2651 1.1 mrg /* (mem (reg A)) => [Ra] */
2652 1.1 mrg return nds32_address_register_rtx_p (x, strict);
2653 1.1 mrg
2654 1.1 mrg case SYMBOL_REF:
2655 1.1 mrg /* (mem (symbol_ref A)) => [symbol_ref] */
2656 1.1 mrg
2657 1.1 mrg if (flag_pic || SYMBOL_REF_TLS_MODEL (x))
2658 1.1 mrg return false;
2659 1.1 mrg
2660 1.1 mrg if (TARGET_ICT_MODEL_LARGE && nds32_indirect_call_referenced_p (x))
2661 1.1 mrg return false;
2662 1.1 mrg
2663 1.1 mrg /* If -mcmodel=large, the 'symbol_ref' is not a valid address
2664 1.1 mrg during or after LRA/reload phase. */
2665 1.1 mrg if (TARGET_CMODEL_LARGE
2666 1.1 mrg && (reload_completed
2667 1.1 mrg || reload_in_progress
2668 1.1 mrg || lra_in_progress))
2669 1.1 mrg return false;
2670 1.1 mrg /* If -mcmodel=medium and the symbol references to rodata section,
2671 1.1 mrg the 'symbol_ref' is not a valid address during or after
2672 1.1 mrg LRA/reload phase. */
2673 1.1 mrg if (TARGET_CMODEL_MEDIUM
2674 1.1 mrg && (NDS32_SYMBOL_REF_RODATA_P (x)
2675 1.1 mrg || CONSTANT_POOL_ADDRESS_P (x))
2676 1.1 mrg && (reload_completed
2677 1.1 mrg || reload_in_progress
2678 1.1 mrg || lra_in_progress))
2679 1.1 mrg return false;
2680 1.1 mrg
2681 1.1 mrg return true;
2682 1.1 mrg
2683 1.1 mrg case CONST:
2684 1.1 mrg /* (mem (const (...)))
2685 1.1 mrg => [ + const_addr ], where const_addr = symbol_ref + const_int */
2686 1.1 mrg if (GET_CODE (XEXP (x, 0)) == PLUS)
2687 1.1 mrg {
2688 1.1 mrg rtx plus_op = XEXP (x, 0);
2689 1.1 mrg
2690 1.1 mrg rtx op0 = XEXP (plus_op, 0);
2691 1.1 mrg rtx op1 = XEXP (plus_op, 1);
2692 1.1 mrg
2693 1.1 mrg if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1))
2694 1.1 mrg {
2695 1.1 mrg /* Now we see the [ + const_addr ] pattern, but we need
2696 1.1 mrg some further checking. */
2697 1.1 mrg
2698 1.1 mrg if (flag_pic || SYMBOL_REF_TLS_MODEL (op0))
2699 1.1 mrg return false;
2700 1.1 mrg
2701 1.1 mrg /* If -mcmodel=large, the 'const_addr' is not a valid address
2702 1.1 mrg during or after LRA/reload phase. */
2703 1.1 mrg if (TARGET_CMODEL_LARGE
2704 1.1 mrg && (reload_completed
2705 1.1 mrg || reload_in_progress
2706 1.1 mrg || lra_in_progress))
2707 1.1 mrg return false;
2708 1.1 mrg /* If -mcmodel=medium and the symbol references to rodata section,
2709 1.1 mrg the 'const_addr' is not a valid address during or after
2710 1.1 mrg LRA/reload phase. */
2711 1.1 mrg if (TARGET_CMODEL_MEDIUM
2712 1.1 mrg && NDS32_SYMBOL_REF_RODATA_P (op0)
2713 1.1 mrg && (reload_completed
2714 1.1 mrg || reload_in_progress
2715 1.1 mrg || lra_in_progress))
2716 1.1 mrg return false;
2717 1.1 mrg
2718 1.1 mrg /* At this point we can make sure 'const_addr' is a
2719 1.1 mrg valid address. */
2720 1.1 mrg return true;
2721 1.1 mrg }
2722 1.1 mrg }
2723 1.1 mrg
2724 1.1 mrg return false;
2725 1.1 mrg
2726 1.1 mrg case POST_MODIFY:
2727 1.1 mrg /* (mem (post_modify (reg) (plus (reg) (reg))))
2728 1.1 mrg => [Ra], Rb */
2729 1.1 mrg /* (mem (post_modify (reg) (plus (reg) (const_int))))
2730 1.1 mrg => [Ra], const_int */
2731 1.1 mrg if (GET_CODE (XEXP (x, 0)) == REG
2732 1.1 mrg && GET_CODE (XEXP (x, 1)) == PLUS)
2733 1.1 mrg {
2734 1.1 mrg rtx plus_op = XEXP (x, 1);
2735 1.1 mrg
2736 1.1 mrg rtx op0 = XEXP (plus_op, 0);
2737 1.1 mrg rtx op1 = XEXP (plus_op, 1);
2738 1.1 mrg
2739 1.1 mrg if (nds32_address_register_rtx_p (op0, strict)
2740 1.1 mrg && nds32_legitimate_index_p (mode, op1, strict))
2741 1.1 mrg return true;
2742 1.1 mrg else
2743 1.1 mrg return false;
2744 1.1 mrg }
2745 1.1 mrg
2746 1.1 mrg return false;
2747 1.1 mrg
2748 1.1 mrg case POST_INC:
2749 1.1 mrg case POST_DEC:
2750 1.1 mrg /* (mem (post_inc reg)) => [Ra], 1/2/4 */
2751 1.1 mrg /* (mem (post_dec reg)) => [Ra], -1/-2/-4 */
2752 1.1 mrg /* The 1/2/4 or -1/-2/-4 have been displayed in nds32.md.
2753 1.1 mrg We only need to deal with register Ra. */
2754 1.1 mrg if (nds32_address_register_rtx_p (XEXP (x, 0), strict))
2755 1.1 mrg return true;
2756 1.1 mrg else
2757 1.1 mrg return false;
2758 1.1 mrg
2759 1.1 mrg case PLUS:
2760 1.1 mrg /* (mem (plus reg const_int))
2761 1.1 mrg => [Ra + imm] */
2762 1.1 mrg /* (mem (plus reg reg))
2763 1.1 mrg => [Ra + Rb] */
2764 1.1 mrg /* (mem (plus (mult reg const_int) reg))
2765 1.1 mrg => [Ra + Rb << sv] */
2766 1.1 mrg if (nds32_address_register_rtx_p (XEXP (x, 0), strict)
2767 1.1 mrg && nds32_legitimate_index_p (mode, XEXP (x, 1), strict))
2768 1.1 mrg return true;
2769 1.1 mrg else if (nds32_address_register_rtx_p (XEXP (x, 1), strict)
2770 1.1 mrg && nds32_legitimate_index_p (mode, XEXP (x, 0), strict))
2771 1.1 mrg return true;
2772 1.1 mrg else
2773 1.1 mrg return false;
2774 1.1 mrg
2775 1.1 mrg case LO_SUM:
2776 1.1 mrg /* (mem (lo_sum (reg) (symbol_ref))) */
2777 1.1 mrg /* (mem (lo_sum (reg) (const (plus (symbol_ref) (reg)))) */
2778 1.1 mrg /* TLS case: (mem (lo_sum (reg) (const (unspec symbol_ref X)))) */
2779 1.1 mrg /* The LO_SUM is a valid address if and only if we would like to
2780 1.1 mrg generate 32-bit full address memory access with any of following
2781 1.1 mrg circumstance:
2782 1.1 mrg 1. -mcmodel=large.
2783 1.1 mrg 2. -mcmodel=medium and the symbol_ref references to rodata. */
2784 1.1 mrg {
2785 1.1 mrg rtx sym = NULL_RTX;
2786 1.1 mrg
2787 1.1 mrg if (flag_pic)
2788 1.1 mrg return false;
2789 1.1 mrg
2790 1.1 mrg if (!REG_P (XEXP (x, 0)))
2791 1.1 mrg return false;
2792 1.1 mrg
2793 1.1 mrg if (GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
2794 1.1 mrg sym = XEXP (x, 1);
2795 1.1 mrg else if (GET_CODE (XEXP (x, 1)) == CONST)
2796 1.1 mrg {
2797 1.1 mrg rtx plus = XEXP(XEXP (x, 1), 0);
2798 1.1 mrg if (GET_CODE (plus) == PLUS)
2799 1.1 mrg sym = XEXP (plus, 0);
2800 1.1 mrg else if (GET_CODE (plus) == UNSPEC)
2801 1.1 mrg sym = XVECEXP (plus, 0, 0);
2802 1.1 mrg }
2803 1.1 mrg else
2804 1.1 mrg return false;
2805 1.1 mrg
2806 1.1 mrg gcc_assert (GET_CODE (sym) == SYMBOL_REF);
2807 1.1 mrg
2808 1.1 mrg if (TARGET_ICT_MODEL_LARGE
2809 1.1 mrg && nds32_indirect_call_referenced_p (sym))
2810 1.1 mrg return true;
2811 1.1 mrg
2812 1.1 mrg if (TARGET_CMODEL_LARGE)
2813 1.1 mrg return true;
2814 1.1 mrg else if (TARGET_CMODEL_MEDIUM
2815 1.1 mrg && NDS32_SYMBOL_REF_RODATA_P (sym))
2816 1.1 mrg return true;
2817 1.1 mrg else
2818 1.1 mrg return false;
2819 1.1 mrg }
2820 1.1 mrg
2821 1.1 mrg default:
2822 1.1 mrg return false;
2823 1.1 mrg }
2824 1.1 mrg }
2825 1.1 mrg
2826 1.1 mrg static rtx
2827 1.1 mrg nds32_legitimize_address (rtx x,
2828 1.1 mrg rtx oldx ATTRIBUTE_UNUSED,
2829 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED)
2830 1.1 mrg {
2831 1.1 mrg if (nds32_tls_referenced_p (x))
2832 1.1 mrg x = nds32_legitimize_tls_address (x);
2833 1.1 mrg else if (flag_pic && SYMBOLIC_CONST_P (x))
2834 1.1 mrg x = nds32_legitimize_pic_address (x);
2835 1.1 mrg else if (TARGET_ICT_MODEL_LARGE && nds32_indirect_call_referenced_p (x))
2836 1.1 mrg x = nds32_legitimize_ict_address (x);
2837 1.1 mrg
2838 1.1 mrg return x;
2839 1.1 mrg }
2840 1.1 mrg
2841 1.1 mrg static bool
2842 1.1 mrg nds32_legitimate_constant_p (machine_mode mode, rtx x)
2843 1.1 mrg {
2844 1.1 mrg switch (GET_CODE (x))
2845 1.1 mrg {
2846 1.1 mrg case CONST_DOUBLE:
2847 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
2848 1.1 mrg && (mode == DFmode || mode == SFmode))
2849 1.1 mrg return false;
2850 1.1 mrg break;
2851 1.1 mrg case CONST:
2852 1.1 mrg x = XEXP (x, 0);
2853 1.1 mrg
2854 1.1 mrg if (GET_CODE (x) == PLUS)
2855 1.1 mrg {
2856 1.1 mrg if (!CONST_INT_P (XEXP (x, 1)))
2857 1.1 mrg return false;
2858 1.1 mrg x = XEXP (x, 0);
2859 1.1 mrg }
2860 1.1 mrg
2861 1.1 mrg if (GET_CODE (x) == UNSPEC)
2862 1.1 mrg {
2863 1.1 mrg switch (XINT (x, 1))
2864 1.1 mrg {
2865 1.1 mrg case UNSPEC_GOT:
2866 1.1 mrg case UNSPEC_GOTOFF:
2867 1.1 mrg case UNSPEC_PLT:
2868 1.1 mrg case UNSPEC_TLSGD:
2869 1.1 mrg case UNSPEC_TLSLD:
2870 1.1 mrg case UNSPEC_TLSIE:
2871 1.1 mrg case UNSPEC_TLSLE:
2872 1.1 mrg case UNSPEC_ICT:
2873 1.1 mrg return false;
2874 1.1 mrg default:
2875 1.1 mrg return true;
2876 1.1 mrg }
2877 1.1 mrg }
2878 1.1 mrg break;
2879 1.1 mrg case SYMBOL_REF:
2880 1.1 mrg /* TLS symbols need a call to resolve in
2881 1.1 mrg precompute_register_parameters. */
2882 1.1 mrg if (SYMBOL_REF_TLS_MODEL (x))
2883 1.1 mrg return false;
2884 1.1 mrg break;
2885 1.1 mrg default:
2886 1.1 mrg return true;
2887 1.1 mrg }
2888 1.1 mrg
2889 1.1 mrg return true;
2890 1.1 mrg }
2891 1.1 mrg
2892 1.1 mrg /* Reorgnize the UNSPEC CONST and return its direct symbol. */
2893 1.1 mrg static rtx
2894 1.1 mrg nds32_delegitimize_address (rtx x)
2895 1.1 mrg {
2896 1.1 mrg x = delegitimize_mem_from_attrs (x);
2897 1.1 mrg
2898 1.1 mrg if (GET_CODE(x) == CONST)
2899 1.1 mrg {
2900 1.1 mrg rtx inner = XEXP (x, 0);
2901 1.1 mrg
2902 1.1 mrg /* Handle for GOTOFF. */
2903 1.1 mrg if (GET_CODE (inner) == PLUS)
2904 1.1 mrg inner = XEXP (inner, 0);
2905 1.1 mrg
2906 1.1 mrg if (GET_CODE (inner) == UNSPEC)
2907 1.1 mrg {
2908 1.1 mrg switch (XINT (inner, 1))
2909 1.1 mrg {
2910 1.1 mrg case UNSPEC_GOTINIT:
2911 1.1 mrg case UNSPEC_GOT:
2912 1.1 mrg case UNSPEC_GOTOFF:
2913 1.1 mrg case UNSPEC_PLT:
2914 1.1 mrg case UNSPEC_TLSGD:
2915 1.1 mrg case UNSPEC_TLSLD:
2916 1.1 mrg case UNSPEC_TLSIE:
2917 1.1 mrg case UNSPEC_TLSLE:
2918 1.1 mrg case UNSPEC_ICT:
2919 1.1 mrg x = XVECEXP (inner, 0, 0);
2920 1.1 mrg break;
2921 1.1 mrg default:
2922 1.1 mrg break;
2923 1.1 mrg }
2924 1.1 mrg }
2925 1.1 mrg }
2926 1.1 mrg return x;
2927 1.1 mrg }
2928 1.1 mrg
2929 1.1 mrg static machine_mode
2930 1.1 mrg nds32_vectorize_preferred_simd_mode (scalar_mode mode)
2931 1.1 mrg {
2932 1.1 mrg if (!NDS32_EXT_DSP_P ())
2933 1.1 mrg return word_mode;
2934 1.1 mrg
2935 1.1 mrg switch (mode)
2936 1.1 mrg {
2937 1.1 mrg case E_QImode:
2938 1.1 mrg return V4QImode;
2939 1.1 mrg case E_HImode:
2940 1.1 mrg return V2HImode;
2941 1.1 mrg default:
2942 1.1 mrg return word_mode;
2943 1.1 mrg }
2944 1.1 mrg }
2945 1.1 mrg
2946 1.1 mrg static bool
2947 1.1 mrg nds32_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
2948 1.1 mrg {
2949 1.1 mrg switch (GET_CODE (x))
2950 1.1 mrg {
2951 1.1 mrg case CONST:
2952 1.1 mrg return !nds32_legitimate_constant_p (mode, x);
2953 1.1 mrg case SYMBOL_REF:
2954 1.1 mrg /* All symbols have to be accessed through gp-relative in PIC mode. */
2955 1.1 mrg /* We don't want to force symbol as constant pool in .text section,
2956 1.1 mrg because we use the gp-relatived instruction to load in small
2957 1.1 mrg or medium model. */
2958 1.1 mrg if (flag_pic
2959 1.1 mrg || SYMBOL_REF_TLS_MODEL (x)
2960 1.1 mrg || TARGET_CMODEL_SMALL
2961 1.1 mrg || TARGET_CMODEL_MEDIUM)
2962 1.1 mrg return true;
2963 1.1 mrg break;
2964 1.1 mrg case CONST_INT:
2965 1.1 mrg case CONST_DOUBLE:
2966 1.1 mrg if (flag_pic && (lra_in_progress || reload_completed))
2967 1.1 mrg return true;
2968 1.1 mrg break;
2969 1.1 mrg default:
2970 1.1 mrg return false;
2971 1.1 mrg }
2972 1.1 mrg return false;
2973 1.1 mrg }
2974 1.1 mrg
2975 1.1 mrg
2976 1.1 mrg /* Condition Code Status. */
2978 1.1 mrg
2979 1.1 mrg /* -- Representation of condition codes using registers. */
2980 1.1 mrg
2981 1.1 mrg static void
2982 1.1 mrg nds32_canonicalize_comparison (int *code,
2983 1.1 mrg rtx *op0 ATTRIBUTE_UNUSED,
2984 1.1 mrg rtx *op1,
2985 1.1 mrg bool op0_preserve_value ATTRIBUTE_UNUSED)
2986 1.1 mrg {
2987 1.1 mrg /* When the instruction combination pass tries to combine a comparison insn
2988 1.1 mrg with its previous insns, it also transforms the operator in order to
2989 1.1 mrg minimize its constant field. For example, it tries to transform a
2990 1.1 mrg comparison insn from
2991 1.1 mrg (set (reg:SI 54)
2992 1.1 mrg (ltu:SI (reg:SI 52)
2993 1.1 mrg (const_int 10 [0xa])))
2994 1.1 mrg to
2995 1.1 mrg (set (reg:SI 54)
2996 1.1 mrg (leu:SI (reg:SI 52)
2997 1.1 mrg (const_int 9 [0x9])))
2998 1.1 mrg
2999 1.1 mrg However, the nds32 target only provides instructions supporting the LTU
3000 1.1 mrg operation directly, and the implementation of the pattern "cbranchsi4"
3001 1.1 mrg only expands the LTU form. In order to handle the non-LTU operations
3002 1.1 mrg generated from passes other than the RTL expansion pass, we have to
3003 1.1 mrg implement this hook to revert those changes. Since we only expand the LTU
3004 1.1 mrg operator in the RTL expansion pass, we might only need to handle the LEU
3005 1.1 mrg case, unless we find other optimization passes perform more aggressive
3006 1.1 mrg transformations. */
3007 1.1 mrg
3008 1.1 mrg if (*code == LEU && CONST_INT_P (*op1))
3009 1.1 mrg {
3010 1.1 mrg *op1 = gen_int_mode (INTVAL (*op1) + 1, SImode);
3011 1.1 mrg *code = LTU;
3012 1.1 mrg }
3013 1.1 mrg }
3014 1.1 mrg
3015 1.1 mrg
3016 1.1 mrg /* Describing Relative Costs of Operations. */
3018 1.1 mrg
3019 1.1 mrg static int
3020 1.1 mrg nds32_register_move_cost (machine_mode mode,
3021 1.1 mrg reg_class_t from,
3022 1.1 mrg reg_class_t to)
3023 1.1 mrg {
3024 1.1 mrg /* In garywolf cpu, FPR to GPR is chaper than other cpu. */
3025 1.1 mrg if (TARGET_PIPELINE_GRAYWOLF)
3026 1.1 mrg {
3027 1.1 mrg if (GET_MODE_SIZE (mode) == 8)
3028 1.1 mrg {
3029 1.1 mrg /* DPR to GPR. */
3030 1.1 mrg if (from == FP_REGS && to != FP_REGS)
3031 1.1 mrg return 3;
3032 1.1 mrg /* GPR to DPR. */
3033 1.1 mrg if (from != FP_REGS && to == FP_REGS)
3034 1.1 mrg return 2;
3035 1.1 mrg }
3036 1.1 mrg else
3037 1.1 mrg {
3038 1.1 mrg if ((from == FP_REGS && to != FP_REGS)
3039 1.1 mrg || (from != FP_REGS && to == FP_REGS))
3040 1.1 mrg return 2;
3041 1.1 mrg }
3042 1.1 mrg }
3043 1.1 mrg
3044 1.1 mrg if ((from == FP_REGS && to != FP_REGS)
3045 1.1 mrg || (from != FP_REGS && to == FP_REGS))
3046 1.1 mrg return 3;
3047 1.1 mrg else if (from == HIGH_REGS || to == HIGH_REGS)
3048 1.1 mrg return optimize_size ? 6 : 2;
3049 1.1 mrg else
3050 1.1 mrg return 2;
3051 1.1 mrg }
3052 1.1 mrg
3053 1.1 mrg static int
3054 1.1 mrg nds32_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
3055 1.1 mrg reg_class_t rclass ATTRIBUTE_UNUSED,
3056 1.1 mrg bool in ATTRIBUTE_UNUSED)
3057 1.1 mrg {
3058 1.1 mrg return 8;
3059 1.1 mrg }
3060 1.1 mrg
3061 1.1 mrg /* This target hook describes the relative costs of RTL expressions.
3062 1.1 mrg Return 'true' when all subexpressions of x have been processed.
3063 1.1 mrg Return 'false' to sum the costs of sub-rtx, plus cost of this operation.
3064 1.1 mrg Refer to gcc/rtlanal.cc for more information. */
3065 1.1 mrg static bool
3066 1.1 mrg nds32_rtx_costs (rtx x,
3067 1.1 mrg machine_mode mode,
3068 1.1 mrg int outer_code,
3069 1.1 mrg int opno,
3070 1.1 mrg int *total,
3071 1.1 mrg bool speed)
3072 1.1 mrg {
3073 1.1 mrg return nds32_rtx_costs_impl (x, mode, outer_code, opno, total, speed);
3074 1.1 mrg }
3075 1.1 mrg
3076 1.1 mrg static int
3077 1.1 mrg nds32_address_cost (rtx address,
3078 1.1 mrg machine_mode mode,
3079 1.1 mrg addr_space_t as,
3080 1.1 mrg bool speed)
3081 1.1 mrg {
3082 1.1 mrg return nds32_address_cost_impl (address, mode, as, speed);
3083 1.1 mrg }
3084 1.1 mrg
3085 1.1 mrg
3086 1.1 mrg /* Dividing the Output into Sections (Texts, Data, . . . ). */
3088 1.1 mrg
3089 1.1 mrg /* If references to a symbol or a constant must be treated differently
3090 1.1 mrg depending on something about the variable or function named by the symbol
3091 1.1 mrg (such as what section it is in), we use this hook to store flags
3092 1.1 mrg in symbol_ref rtx. */
3093 1.1 mrg static void
3094 1.1 mrg nds32_encode_section_info (tree decl, rtx rtl, int new_decl_p)
3095 1.1 mrg {
3096 1.1 mrg default_encode_section_info (decl, rtl, new_decl_p);
3097 1.1 mrg
3098 1.1 mrg /* For the memory rtx, if it references to rodata section, we can store
3099 1.1 mrg NDS32_SYMBOL_FLAG_RODATA flag into symbol_ref rtx so that the
3100 1.1 mrg nds32_legitimate_address_p() can determine how to treat such symbol_ref
3101 1.1 mrg based on -mcmodel=X and this information. */
3102 1.1 mrg if (MEM_P (rtl) && MEM_READONLY_P (rtl))
3103 1.1 mrg {
3104 1.1 mrg rtx addr = XEXP (rtl, 0);
3105 1.1 mrg
3106 1.1 mrg if (GET_CODE (addr) == SYMBOL_REF)
3107 1.1 mrg {
3108 1.1 mrg /* For (mem (symbol_ref X)) case. */
3109 1.1 mrg SYMBOL_REF_FLAGS (addr) |= NDS32_SYMBOL_FLAG_RODATA;
3110 1.1 mrg }
3111 1.1 mrg else if (GET_CODE (addr) == CONST
3112 1.1 mrg && GET_CODE (XEXP (addr, 0)) == PLUS)
3113 1.1 mrg {
3114 1.1 mrg /* For (mem (const (plus (symbol_ref X) (const_int N)))) case. */
3115 1.1 mrg rtx plus_op = XEXP (addr, 0);
3116 1.1 mrg rtx op0 = XEXP (plus_op, 0);
3117 1.1 mrg rtx op1 = XEXP (plus_op, 1);
3118 1.1 mrg
3119 1.1 mrg if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1))
3120 1.1 mrg SYMBOL_REF_FLAGS (op0) |= NDS32_SYMBOL_FLAG_RODATA;
3121 1.1 mrg }
3122 1.1 mrg }
3123 1.1 mrg }
3124 1.1 mrg
3125 1.1 mrg
3126 1.1 mrg /* Defining the Output Assembler Language. */
3128 1.1 mrg
3129 1.1 mrg /* -- The Overall Framework of an Assembler File. */
3130 1.1 mrg
3131 1.1 mrg static void
3132 1.1 mrg nds32_asm_file_start (void)
3133 1.1 mrg {
3134 1.1 mrg default_file_start ();
3135 1.1 mrg
3136 1.1 mrg if (flag_pic)
3137 1.1 mrg fprintf (asm_out_file, "\t.pic\n");
3138 1.1 mrg
3139 1.1 mrg /* Tell assembler which ABI we are using. */
3140 1.1 mrg fprintf (asm_out_file, "\t! ABI version\n");
3141 1.1 mrg if (TARGET_HARD_FLOAT)
3142 1.1 mrg fprintf (asm_out_file, "\t.abi_2fp_plus\n");
3143 1.1 mrg else
3144 1.1 mrg fprintf (asm_out_file, "\t.abi_2\n");
3145 1.1 mrg
3146 1.1 mrg /* Tell assembler that this asm code is generated by compiler. */
3147 1.1 mrg fprintf (asm_out_file, "\t! This asm file is generated by compiler\n");
3148 1.1 mrg fprintf (asm_out_file, "\t.flag\tverbatim\n");
3149 1.1 mrg
3150 1.1 mrg /* Insert directive for linker to distinguish object's ict flag. */
3151 1.1 mrg if (!TARGET_LINUX_ABI)
3152 1.1 mrg {
3153 1.1 mrg if (TARGET_ICT_MODEL_LARGE)
3154 1.1 mrg fprintf (asm_out_file, "\t.ict_model\tlarge\n");
3155 1.1 mrg else
3156 1.1 mrg fprintf (asm_out_file, "\t.ict_model\tsmall\n");
3157 1.1 mrg }
3158 1.1 mrg
3159 1.1 mrg /* We need to provide the size of each vector for interrupt handler
3160 1.1 mrg under elf toolchain. */
3161 1.1 mrg if (!TARGET_LINUX_ABI)
3162 1.1 mrg {
3163 1.1 mrg fprintf (asm_out_file, "\t! This vector size directive is required "
3164 1.1 mrg "for checking inconsistency on interrupt handler\n");
3165 1.1 mrg fprintf (asm_out_file, "\t.vec_size\t%d\n", nds32_isr_vector_size);
3166 1.1 mrg }
3167 1.1 mrg
3168 1.1 mrg /* If user enables '-mforce-fp-as-gp' or compiles programs with -Os,
3169 1.1 mrg the compiler may produce 'la $fp,_FP_BASE_' instruction
3170 1.1 mrg at prologue for fp-as-gp optimization.
3171 1.1 mrg We should emit weak reference of _FP_BASE_ to avoid undefined reference
3172 1.1 mrg in case user does not pass '--relax' option to linker. */
3173 1.1 mrg if (!TARGET_LINUX_ABI && (TARGET_FORCE_FP_AS_GP || optimize_size))
3174 1.1 mrg {
3175 1.1 mrg fprintf (asm_out_file, "\t! This weak reference is required to do "
3176 1.1 mrg "fp-as-gp link time optimization\n");
3177 1.1 mrg fprintf (asm_out_file, "\t.weak\t_FP_BASE_\n");
3178 1.1 mrg }
3179 1.1 mrg
3180 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3181 1.1 mrg
3182 1.1 mrg if (TARGET_ISA_V2)
3183 1.1 mrg fprintf (asm_out_file, "\t! ISA family\t\t: %s\n", "V2");
3184 1.1 mrg if (TARGET_ISA_V3)
3185 1.1 mrg fprintf (asm_out_file, "\t! ISA family\t\t: %s\n", "V3");
3186 1.1 mrg if (TARGET_ISA_V3M)
3187 1.1 mrg fprintf (asm_out_file, "\t! ISA family\t\t: %s\n", "V3M");
3188 1.1 mrg
3189 1.1 mrg switch (nds32_cpu_option)
3190 1.1 mrg {
3191 1.1 mrg case CPU_N6:
3192 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N6");
3193 1.1 mrg break;
3194 1.1 mrg
3195 1.1 mrg case CPU_N7:
3196 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N7");
3197 1.1 mrg break;
3198 1.1 mrg
3199 1.1 mrg case CPU_N8:
3200 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N8");
3201 1.1 mrg break;
3202 1.1 mrg
3203 1.1 mrg case CPU_E8:
3204 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "E8");
3205 1.1 mrg break;
3206 1.1 mrg
3207 1.1 mrg case CPU_N9:
3208 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N9");
3209 1.1 mrg break;
3210 1.1 mrg
3211 1.1 mrg case CPU_N10:
3212 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N10");
3213 1.1 mrg break;
3214 1.1 mrg
3215 1.1 mrg case CPU_GRAYWOLF:
3216 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "Graywolf");
3217 1.1 mrg break;
3218 1.1 mrg
3219 1.1 mrg case CPU_N12:
3220 1.1 mrg case CPU_N13:
3221 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "N13");
3222 1.1 mrg break;
3223 1.1 mrg
3224 1.1 mrg case CPU_SIMPLE:
3225 1.1 mrg fprintf (asm_out_file, "\t! Pipeline model\t: %s\n", "SIMPLE");
3226 1.1 mrg break;
3227 1.1 mrg
3228 1.1 mrg default:
3229 1.1 mrg gcc_unreachable ();
3230 1.1 mrg }
3231 1.1 mrg
3232 1.1 mrg if (TARGET_CMODEL_SMALL)
3233 1.1 mrg fprintf (asm_out_file, "\t! Code model\t\t: %s\n", "SMALL");
3234 1.1 mrg if (TARGET_CMODEL_MEDIUM)
3235 1.1 mrg fprintf (asm_out_file, "\t! Code model\t\t: %s\n", "MEDIUM");
3236 1.1 mrg if (TARGET_CMODEL_LARGE)
3237 1.1 mrg fprintf (asm_out_file, "\t! Code model\t\t: %s\n", "LARGE");
3238 1.1 mrg
3239 1.1 mrg fprintf (asm_out_file, "\t! Endian setting\t: %s\n",
3240 1.1 mrg ((TARGET_BIG_ENDIAN) ? "big-endian"
3241 1.1 mrg : "little-endian"));
3242 1.1 mrg fprintf (asm_out_file, "\t! Use SP floating-point instruction\t: %s\n",
3243 1.1 mrg ((TARGET_FPU_SINGLE) ? "Yes"
3244 1.1 mrg : "No"));
3245 1.1 mrg fprintf (asm_out_file, "\t! Use DP floating-point instruction\t: %s\n",
3246 1.1 mrg ((TARGET_FPU_DOUBLE) ? "Yes"
3247 1.1 mrg : "No"));
3248 1.1 mrg fprintf (asm_out_file, "\t! ABI version\t\t: %s\n",
3249 1.1 mrg ((TARGET_HARD_FLOAT) ? "ABI2FP+"
3250 1.1 mrg : "ABI2"));
3251 1.1 mrg
3252 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3253 1.1 mrg
3254 1.1 mrg fprintf (asm_out_file, "\t! Use conditional move\t\t: %s\n",
3255 1.1 mrg ((TARGET_CMOV) ? "Yes"
3256 1.1 mrg : "No"));
3257 1.1 mrg fprintf (asm_out_file, "\t! Use performance extension\t: %s\n",
3258 1.1 mrg ((TARGET_EXT_PERF) ? "Yes"
3259 1.1 mrg : "No"));
3260 1.1 mrg fprintf (asm_out_file, "\t! Use performance extension 2\t: %s\n",
3261 1.1 mrg ((TARGET_EXT_PERF2) ? "Yes"
3262 1.1 mrg : "No"));
3263 1.1 mrg fprintf (asm_out_file, "\t! Use string extension\t\t: %s\n",
3264 1.1 mrg ((TARGET_EXT_STRING) ? "Yes"
3265 1.1 mrg : "No"));
3266 1.1 mrg
3267 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3268 1.1 mrg
3269 1.1 mrg fprintf (asm_out_file, "\t! V3PUSH instructions\t: %s\n",
3270 1.1 mrg ((TARGET_V3PUSH) ? "Yes"
3271 1.1 mrg : "No"));
3272 1.1 mrg fprintf (asm_out_file, "\t! 16-bit instructions\t: %s\n",
3273 1.1 mrg ((TARGET_16_BIT) ? "Yes"
3274 1.1 mrg : "No"));
3275 1.1 mrg fprintf (asm_out_file, "\t! Reduced registers set\t: %s\n",
3276 1.1 mrg ((TARGET_REDUCED_REGS) ? "Yes"
3277 1.1 mrg : "No"));
3278 1.1 mrg
3279 1.1 mrg fprintf (asm_out_file, "\t! Support unaligned access\t\t: %s\n",
3280 1.1 mrg (flag_unaligned_access ? "Yes"
3281 1.1 mrg : "No"));
3282 1.1 mrg
3283 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3284 1.1 mrg
3285 1.1 mrg if (optimize_size)
3286 1.1 mrg fprintf (asm_out_file, "\t! Optimization level\t: -Os\n");
3287 1.1 mrg else if (optimize_fast)
3288 1.1 mrg fprintf (asm_out_file, "\t! Optimization level\t: -Ofast\n");
3289 1.1 mrg else if (optimize_debug)
3290 1.1 mrg fprintf (asm_out_file, "\t! Optimization level\t: -Og\n");
3291 1.1 mrg else
3292 1.1 mrg fprintf (asm_out_file, "\t! Optimization level\t: -O%d\n", optimize);
3293 1.1 mrg
3294 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3295 1.1 mrg
3296 1.1 mrg fprintf (asm_out_file, "\t! Cache block size\t: %d\n",
3297 1.1 mrg nds32_cache_block_size);
3298 1.1 mrg
3299 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3300 1.1 mrg
3301 1.1 mrg nds32_asm_file_start_for_isr ();
3302 1.1 mrg }
3303 1.1 mrg
3304 1.1 mrg static void
3305 1.1 mrg nds32_asm_file_end (void)
3306 1.1 mrg {
3307 1.1 mrg nds32_asm_file_end_for_isr ();
3308 1.1 mrg
3309 1.1 mrg /* The NDS32 Linux stack is mapped non-executable by default, so add a
3310 1.1 mrg .note.GNU-stack section. */
3311 1.1 mrg if (TARGET_LINUX_ABI)
3312 1.1 mrg file_end_indicate_exec_stack ();
3313 1.1 mrg
3314 1.1 mrg fprintf (asm_out_file, "\t! ------------------------------------\n");
3315 1.1 mrg }
3316 1.1 mrg
3317 1.1 mrg static bool
3318 1.1 mrg nds32_asm_output_addr_const_extra (FILE *file, rtx x)
3319 1.1 mrg {
3320 1.1 mrg if (GET_CODE (x) == UNSPEC)
3321 1.1 mrg {
3322 1.1 mrg switch (XINT (x, 1))
3323 1.1 mrg {
3324 1.1 mrg case UNSPEC_GOTINIT:
3325 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3326 1.1 mrg break;
3327 1.1 mrg case UNSPEC_GOTOFF:
3328 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3329 1.1 mrg fputs ("@GOTOFF", file);
3330 1.1 mrg break;
3331 1.1 mrg case UNSPEC_GOT:
3332 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3333 1.1 mrg fputs ("@GOT", file);
3334 1.1 mrg break;
3335 1.1 mrg case UNSPEC_PLT:
3336 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3337 1.1 mrg fputs ("@PLT", file);
3338 1.1 mrg break;
3339 1.1 mrg case UNSPEC_TLSGD:
3340 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3341 1.1 mrg fputs ("@TLSDESC", file);
3342 1.1 mrg break;
3343 1.1 mrg case UNSPEC_TLSLD:
3344 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3345 1.1 mrg fputs ("@TLSDESC", file);
3346 1.1 mrg break;
3347 1.1 mrg case UNSPEC_TLSIE:
3348 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3349 1.1 mrg fputs ("@GOTTPOFF", file);
3350 1.1 mrg break;
3351 1.1 mrg case UNSPEC_TLSLE:
3352 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3353 1.1 mrg fputs ("@TPOFF", file);
3354 1.1 mrg break;
3355 1.1 mrg case UNSPEC_ICT:
3356 1.1 mrg output_addr_const (file, XVECEXP (x, 0, 0));
3357 1.1 mrg fputs ("@ICT", file);
3358 1.1 mrg break;
3359 1.1 mrg default:
3360 1.1 mrg return false;
3361 1.1 mrg }
3362 1.1 mrg return true;
3363 1.1 mrg }
3364 1.1 mrg else
3365 1.1 mrg return false;
3366 1.1 mrg }
3367 1.1 mrg
3368 1.1 mrg /* -- Output and Generation of Labels. */
3369 1.1 mrg
3370 1.1 mrg static void
3371 1.1 mrg nds32_asm_globalize_label (FILE *stream, const char *name)
3372 1.1 mrg {
3373 1.1 mrg fputs ("\t.global\t", stream);
3374 1.1 mrg assemble_name (stream, name);
3375 1.1 mrg fputs ("\n", stream);
3376 1.1 mrg }
3377 1.1 mrg
3378 1.1 mrg /* -- Output of Assembler Instructions. */
3379 1.1 mrg
3380 1.1 mrg static void
3381 1.1 mrg nds32_print_operand (FILE *stream, rtx x, int code)
3382 1.1 mrg {
3383 1.1 mrg HOST_WIDE_INT op_value = 0;
3384 1.1 mrg HOST_WIDE_INT one_position;
3385 1.1 mrg HOST_WIDE_INT zero_position;
3386 1.1 mrg bool pick_lsb_p = false;
3387 1.1 mrg bool pick_msb_p = false;
3388 1.1 mrg int regno;
3389 1.1 mrg
3390 1.1 mrg if (CONST_INT_P (x))
3391 1.1 mrg op_value = INTVAL (x);
3392 1.1 mrg
3393 1.1 mrg switch (code)
3394 1.1 mrg {
3395 1.1 mrg case 0 :
3396 1.1 mrg /* Do nothing special. */
3397 1.1 mrg break;
3398 1.1 mrg
3399 1.1 mrg case 'b':
3400 1.1 mrg /* Use exact_log2() to search the 0-bit position. */
3401 1.1 mrg gcc_assert (CONST_INT_P (x));
3402 1.1 mrg zero_position = exact_log2 (~UINTVAL (x) & GET_MODE_MASK (SImode));
3403 1.1 mrg gcc_assert (zero_position != -1);
3404 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_DEC, zero_position);
3405 1.1 mrg
3406 1.1 mrg /* No need to handle following process, so return immediately. */
3407 1.1 mrg return;
3408 1.1 mrg
3409 1.1 mrg case 'e':
3410 1.1 mrg gcc_assert (MEM_P (x)
3411 1.1 mrg && GET_CODE (XEXP (x, 0)) == PLUS
3412 1.1 mrg && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT);
3413 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (XEXP (XEXP (x, 0), 1)));
3414 1.1 mrg
3415 1.1 mrg /* No need to handle following process, so return immediately. */
3416 1.1 mrg return;
3417 1.1 mrg
3418 1.1 mrg case 'v':
3419 1.1 mrg gcc_assert (CONST_INT_P (x)
3420 1.1 mrg && (INTVAL (x) == 0
3421 1.1 mrg || INTVAL (x) == 8
3422 1.1 mrg || INTVAL (x) == 16
3423 1.1 mrg || INTVAL (x) == 24));
3424 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) / 8);
3425 1.1 mrg
3426 1.1 mrg /* No need to handle following process, so return immediately. */
3427 1.1 mrg return;
3428 1.1 mrg
3429 1.1 mrg case 'B':
3430 1.1 mrg /* Use exact_log2() to search the 1-bit position. */
3431 1.1 mrg gcc_assert (CONST_INT_P (x));
3432 1.1 mrg one_position = exact_log2 (UINTVAL (x) & GET_MODE_MASK (SImode));
3433 1.1 mrg gcc_assert (one_position != -1);
3434 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_DEC, one_position);
3435 1.1 mrg
3436 1.1 mrg /* No need to handle following process, so return immediately. */
3437 1.1 mrg return;
3438 1.1 mrg
3439 1.1 mrg case 'L':
3440 1.1 mrg /* X is supposed to be REG rtx. */
3441 1.1 mrg gcc_assert (REG_P (x));
3442 1.1 mrg /* Claim that we are going to pick LSB part of X. */
3443 1.1 mrg pick_lsb_p = true;
3444 1.1 mrg break;
3445 1.1 mrg
3446 1.1 mrg case 'H':
3447 1.1 mrg /* X is supposed to be REG rtx. */
3448 1.1 mrg gcc_assert (REG_P (x));
3449 1.1 mrg /* Claim that we are going to pick MSB part of X. */
3450 1.1 mrg pick_msb_p = true;
3451 1.1 mrg break;
3452 1.1 mrg
3453 1.1 mrg case 'V':
3454 1.1 mrg /* 'x' is supposed to be CONST_INT, get the value. */
3455 1.1 mrg gcc_assert (CONST_INT_P (x));
3456 1.1 mrg
3457 1.1 mrg /* According to the Andes architecture,
3458 1.1 mrg the system/user register index range is 0 ~ 1023.
3459 1.1 mrg In order to avoid conflict between user-specified-integer value
3460 1.1 mrg and enum-specified-register value,
3461 1.1 mrg the 'enum nds32_intrinsic_registers' value
3462 1.1 mrg in nds32_intrinsic.h starts from 1024. */
3463 1.1 mrg if (op_value < 1024 && op_value >= 0)
3464 1.1 mrg {
3465 1.1 mrg /* If user gives integer value directly (0~1023),
3466 1.1 mrg we just print out the value. */
3467 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_DEC, op_value);
3468 1.1 mrg }
3469 1.1 mrg else if (op_value < 0
3470 1.1 mrg || op_value >= ((int) ARRAY_SIZE (nds32_intrinsic_register_names)
3471 1.1 mrg + 1024))
3472 1.1 mrg {
3473 1.1 mrg /* The enum index value for array size is out of range. */
3474 1.1 mrg error ("intrinsic register index is out of range");
3475 1.1 mrg }
3476 1.1 mrg else
3477 1.1 mrg {
3478 1.1 mrg /* If user applies normal way with __NDS32_REG_XXX__ enum data,
3479 1.1 mrg we can print out register name. Remember to substract 1024. */
3480 1.1 mrg fprintf (stream, "%s",
3481 1.1 mrg nds32_intrinsic_register_names[op_value - 1024]);
3482 1.1 mrg }
3483 1.1 mrg
3484 1.1 mrg /* No need to handle following process, so return immediately. */
3485 1.1 mrg return;
3486 1.1 mrg
3487 1.1 mrg case 'R': /* cctl valck */
3488 1.1 mrg /* Note the cctl divide to 5 group and share the same name table. */
3489 1.1 mrg if (op_value < 0 || op_value > 4)
3490 1.1 mrg error ("CCTL intrinsic function subtype out of range");
3491 1.1 mrg fprintf (stream, "%s", nds32_cctl_names[op_value]);
3492 1.1 mrg return;
3493 1.1 mrg
3494 1.1 mrg case 'T': /* cctl idxwbinv */
3495 1.1 mrg /* Note the cctl divide to 5 group and share the same name table. */
3496 1.1 mrg if (op_value < 0 || op_value > 4)
3497 1.1 mrg error ("CCTL intrinsic function subtype out of range");
3498 1.1 mrg fprintf (stream, "%s", nds32_cctl_names[op_value + 4]);
3499 1.1 mrg return;
3500 1.1 mrg
3501 1.1 mrg case 'U': /* cctl vawbinv */
3502 1.1 mrg /* Note the cctl divide to 5 group and share the same name table. */
3503 1.1 mrg if (op_value < 0 || op_value > 4)
3504 1.1 mrg error ("CCTL intrinsic function subtype out of range");
3505 1.1 mrg fprintf (stream, "%s", nds32_cctl_names[op_value + 8]);
3506 1.1 mrg return;
3507 1.1 mrg
3508 1.1 mrg case 'X': /* cctl idxread */
3509 1.1 mrg /* Note the cctl divide to 5 group and share the same name table. */
3510 1.1 mrg if (op_value < 0 || op_value > 4)
3511 1.1 mrg error ("CCTL intrinsic function subtype out of range");
3512 1.1 mrg fprintf (stream, "%s", nds32_cctl_names[op_value + 12]);
3513 1.1 mrg return;
3514 1.1 mrg
3515 1.1 mrg case 'W': /* cctl idxwitre */
3516 1.1 mrg /* Note the cctl divide to 5 group and share the same name table. */
3517 1.1 mrg if (op_value < 0 || op_value > 4)
3518 1.1 mrg error ("CCTL intrinsic function subtype out of range");
3519 1.1 mrg fprintf (stream, "%s", nds32_cctl_names[op_value + 16]);
3520 1.1 mrg return;
3521 1.1 mrg
3522 1.1 mrg case 'Z': /* dpref */
3523 1.1 mrg fprintf (stream, "%s", nds32_dpref_names[op_value]);
3524 1.1 mrg return;
3525 1.1 mrg
3526 1.1 mrg default :
3527 1.1 mrg /* Unknown flag. */
3528 1.1 mrg output_operand_lossage ("invalid operand output code");
3529 1.1 mrg break;
3530 1.1 mrg }
3531 1.1 mrg
3532 1.1 mrg switch (GET_CODE (x))
3533 1.1 mrg {
3534 1.1 mrg case LABEL_REF:
3535 1.1 mrg output_addr_const (stream, x);
3536 1.1 mrg break;
3537 1.1 mrg
3538 1.1 mrg case SYMBOL_REF:
3539 1.1 mrg output_addr_const (stream, x);
3540 1.1 mrg
3541 1.1 mrg if (!TARGET_LINUX_ABI && nds32_indirect_call_referenced_p (x))
3542 1.1 mrg fprintf (stream, "@ICT");
3543 1.1 mrg
3544 1.1 mrg break;
3545 1.1 mrg
3546 1.1 mrg case REG:
3547 1.1 mrg /* Print a Double-precision register name. */
3548 1.1 mrg if ((GET_MODE (x) == DImode || GET_MODE (x) == DFmode)
3549 1.1 mrg && NDS32_IS_FPR_REGNUM (REGNO (x)))
3550 1.1 mrg {
3551 1.1 mrg regno = REGNO (x);
3552 1.1 mrg if (!NDS32_FPR_REGNO_OK_FOR_DOUBLE (regno))
3553 1.1 mrg {
3554 1.1 mrg output_operand_lossage ("invalid operand for code '%c'", code);
3555 1.1 mrg break;
3556 1.1 mrg }
3557 1.1 mrg fprintf (stream, "$fd%d", (regno - NDS32_FIRST_FPR_REGNUM) >> 1);
3558 1.1 mrg break;
3559 1.1 mrg }
3560 1.1 mrg
3561 1.1 mrg /* Print LSB or MSB part of register pair if the
3562 1.1 mrg constraint modifier 'L' or 'H' is specified. */
3563 1.1 mrg if ((GET_MODE (x) == DImode || GET_MODE (x) == DFmode)
3564 1.1 mrg && NDS32_IS_GPR_REGNUM (REGNO (x)))
3565 1.1 mrg {
3566 1.1 mrg if ((pick_lsb_p && WORDS_BIG_ENDIAN)
3567 1.1 mrg || (pick_msb_p && !WORDS_BIG_ENDIAN))
3568 1.1 mrg {
3569 1.1 mrg /* If we would like to print out LSB register under big-endian,
3570 1.1 mrg or print out MSB register under little-endian, we need to
3571 1.1 mrg increase register number. */
3572 1.1 mrg regno = REGNO (x);
3573 1.1 mrg regno++;
3574 1.1 mrg fputs (reg_names[regno], stream);
3575 1.1 mrg break;
3576 1.1 mrg }
3577 1.1 mrg }
3578 1.1 mrg
3579 1.1 mrg /* Forbid using static chain register ($r16)
3580 1.1 mrg on reduced-set registers configuration. */
3581 1.1 mrg if (TARGET_REDUCED_REGS
3582 1.1 mrg && REGNO (x) == STATIC_CHAIN_REGNUM)
3583 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3584 1.1 mrg
3585 1.1 mrg /* Normal cases, print out register name. */
3586 1.1 mrg fputs (reg_names[REGNO (x)], stream);
3587 1.1 mrg break;
3588 1.1 mrg
3589 1.1 mrg case MEM:
3590 1.1 mrg output_address (GET_MODE (x), XEXP (x, 0));
3591 1.1 mrg break;
3592 1.1 mrg
3593 1.1 mrg case HIGH:
3594 1.1 mrg if (GET_CODE (XEXP (x, 0)) == CONST_DOUBLE)
3595 1.1 mrg {
3596 1.1 mrg const REAL_VALUE_TYPE *rv;
3597 1.1 mrg long val;
3598 1.1 mrg gcc_assert (GET_MODE (x) == SFmode);
3599 1.1 mrg
3600 1.1 mrg rv = CONST_DOUBLE_REAL_VALUE (XEXP (x, 0));
3601 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*rv, val);
3602 1.1 mrg
3603 1.1 mrg fprintf (stream, "hi20(0x%lx)", val);
3604 1.1 mrg }
3605 1.1 mrg else
3606 1.1 mrg gcc_unreachable ();
3607 1.1 mrg break;
3608 1.1 mrg
3609 1.1 mrg case CONST_DOUBLE:
3610 1.1 mrg const REAL_VALUE_TYPE *rv;
3611 1.1 mrg long val;
3612 1.1 mrg gcc_assert (GET_MODE (x) == SFmode);
3613 1.1 mrg
3614 1.1 mrg rv = CONST_DOUBLE_REAL_VALUE (x);
3615 1.1 mrg REAL_VALUE_TO_TARGET_SINGLE (*rv, val);
3616 1.1 mrg
3617 1.1 mrg fprintf (stream, "0x%lx", val);
3618 1.1 mrg break;
3619 1.1 mrg
3620 1.1 mrg case CODE_LABEL:
3621 1.1 mrg case CONST_INT:
3622 1.1 mrg case CONST:
3623 1.1 mrg output_addr_const (stream, x);
3624 1.1 mrg break;
3625 1.1 mrg
3626 1.1 mrg case CONST_VECTOR:
3627 1.1 mrg fprintf (stream, HOST_WIDE_INT_PRINT_HEX, const_vector_to_hwint (x));
3628 1.1 mrg break;
3629 1.1 mrg
3630 1.1 mrg case LO_SUM:
3631 1.1 mrg /* This is a special case for inline assembly using memory address 'p'.
3632 1.1 mrg The inline assembly code is expected to use pesudo instruction
3633 1.1 mrg for the operand. EX: la */
3634 1.1 mrg output_addr_const (stream, XEXP(x, 1));
3635 1.1 mrg break;
3636 1.1 mrg
3637 1.1 mrg default:
3638 1.1 mrg /* Generally, output_addr_const () is able to handle most cases.
3639 1.1 mrg We want to see what CODE could appear,
3640 1.1 mrg so we use gcc_unreachable() to stop it. */
3641 1.1 mrg debug_rtx (x);
3642 1.1 mrg gcc_unreachable ();
3643 1.1 mrg break;
3644 1.1 mrg }
3645 1.1 mrg }
3646 1.1 mrg
3647 1.1 mrg static void
3648 1.1 mrg nds32_print_operand_address (FILE *stream,
3649 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED,
3650 1.1 mrg rtx x)
3651 1.1 mrg {
3652 1.1 mrg rtx op0, op1;
3653 1.1 mrg
3654 1.1 mrg switch (GET_CODE (x))
3655 1.1 mrg {
3656 1.1 mrg case SYMBOL_REF:
3657 1.1 mrg case CONST:
3658 1.1 mrg /* [ + symbol_ref] */
3659 1.1 mrg /* [ + const_addr], where const_addr = symbol_ref + const_int */
3660 1.1 mrg fputs ("[ + ", stream);
3661 1.1 mrg output_addr_const (stream, x);
3662 1.1 mrg fputs ("]", stream);
3663 1.1 mrg break;
3664 1.1 mrg
3665 1.1 mrg case LO_SUM:
3666 1.1 mrg /* This is a special case for inline assembly using memory operand 'm'.
3667 1.1 mrg The inline assembly code is expected to use pesudo instruction
3668 1.1 mrg for the operand. EX: [ls].[bhw] */
3669 1.1 mrg fputs ("[ + ", stream);
3670 1.1 mrg op1 = XEXP (x, 1);
3671 1.1 mrg output_addr_const (stream, op1);
3672 1.1 mrg fputs ("]", stream);
3673 1.1 mrg break;
3674 1.1 mrg
3675 1.1 mrg case REG:
3676 1.1 mrg /* Forbid using static chain register ($r16)
3677 1.1 mrg on reduced-set registers configuration. */
3678 1.1 mrg if (TARGET_REDUCED_REGS
3679 1.1 mrg && REGNO (x) == STATIC_CHAIN_REGNUM)
3680 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3681 1.1 mrg
3682 1.1 mrg /* [Ra] */
3683 1.1 mrg fprintf (stream, "[%s]", reg_names[REGNO (x)]);
3684 1.1 mrg break;
3685 1.1 mrg
3686 1.1 mrg case PLUS:
3687 1.1 mrg op0 = XEXP (x, 0);
3688 1.1 mrg op1 = XEXP (x, 1);
3689 1.1 mrg
3690 1.1 mrg /* Checking op0, forbid using static chain register ($r16)
3691 1.1 mrg on reduced-set registers configuration. */
3692 1.1 mrg if (TARGET_REDUCED_REGS
3693 1.1 mrg && REG_P (op0)
3694 1.1 mrg && REGNO (op0) == STATIC_CHAIN_REGNUM)
3695 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3696 1.1 mrg /* Checking op1, forbid using static chain register ($r16)
3697 1.1 mrg on reduced-set registers configuration. */
3698 1.1 mrg if (TARGET_REDUCED_REGS
3699 1.1 mrg && REG_P (op1)
3700 1.1 mrg && REGNO (op1) == STATIC_CHAIN_REGNUM)
3701 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3702 1.1 mrg
3703 1.1 mrg if (REG_P (op0) && CONST_INT_P (op1))
3704 1.1 mrg {
3705 1.1 mrg /* [Ra + imm] */
3706 1.1 mrg fprintf (stream, "[%s + (" HOST_WIDE_INT_PRINT_DEC ")]",
3707 1.1 mrg reg_names[REGNO (op0)], INTVAL (op1));
3708 1.1 mrg }
3709 1.1 mrg else if (REG_P (op0) && REG_P (op1))
3710 1.1 mrg {
3711 1.1 mrg /* [Ra + Rb] */
3712 1.1 mrg fprintf (stream, "[%s + %s]",
3713 1.1 mrg reg_names[REGNO (op0)], reg_names[REGNO (op1)]);
3714 1.1 mrg }
3715 1.1 mrg else if (GET_CODE (op0) == MULT && REG_P (op1))
3716 1.1 mrg {
3717 1.1 mrg /* [Ra + Rb << sv]
3718 1.1 mrg From observation, the pattern looks like:
3719 1.1 mrg (plus:SI (mult:SI (reg:SI 58)
3720 1.1 mrg (const_int 4 [0x4]))
3721 1.1 mrg (reg/f:SI 57)) */
3722 1.1 mrg int sv;
3723 1.1 mrg
3724 1.1 mrg /* We need to set sv to output shift value. */
3725 1.1 mrg if (INTVAL (XEXP (op0, 1)) == 1)
3726 1.1 mrg sv = 0;
3727 1.1 mrg else if (INTVAL (XEXP (op0, 1)) == 2)
3728 1.1 mrg sv = 1;
3729 1.1 mrg else if (INTVAL (XEXP (op0, 1)) == 4)
3730 1.1 mrg sv = 2;
3731 1.1 mrg else if (INTVAL (XEXP (op0, 1)) == 8)
3732 1.1 mrg sv = 3;
3733 1.1 mrg else
3734 1.1 mrg gcc_unreachable ();
3735 1.1 mrg
3736 1.1 mrg fprintf (stream, "[%s + %s << %d]",
3737 1.1 mrg reg_names[REGNO (op1)],
3738 1.1 mrg reg_names[REGNO (XEXP (op0, 0))],
3739 1.1 mrg sv);
3740 1.1 mrg }
3741 1.1 mrg else if (GET_CODE (op0) == ASHIFT && REG_P (op1))
3742 1.1 mrg {
3743 1.1 mrg /* [Ra + Rb << sv]
3744 1.1 mrg In normal, ASHIFT can be converted to MULT like above case.
3745 1.1 mrg But when the address rtx does not go through canonicalize_address
3746 1.1 mrg defined in fwprop, we'll need this case. */
3747 1.1 mrg int sv = INTVAL (XEXP (op0, 1));
3748 1.1 mrg gcc_assert (sv <= 3 && sv >=0);
3749 1.1 mrg
3750 1.1 mrg fprintf (stream, "[%s + %s << %d]",
3751 1.1 mrg reg_names[REGNO (op1)],
3752 1.1 mrg reg_names[REGNO (XEXP (op0, 0))],
3753 1.1 mrg sv);
3754 1.1 mrg }
3755 1.1 mrg else
3756 1.1 mrg {
3757 1.1 mrg /* The control flow is not supposed to be here. */
3758 1.1 mrg debug_rtx (x);
3759 1.1 mrg gcc_unreachable ();
3760 1.1 mrg }
3761 1.1 mrg
3762 1.1 mrg break;
3763 1.1 mrg
3764 1.1 mrg case POST_MODIFY:
3765 1.1 mrg /* (post_modify (regA) (plus (regA) (regB)))
3766 1.1 mrg (post_modify (regA) (plus (regA) (const_int)))
3767 1.1 mrg We would like to extract
3768 1.1 mrg regA and regB (or const_int) from plus rtx. */
3769 1.1 mrg op0 = XEXP (XEXP (x, 1), 0);
3770 1.1 mrg op1 = XEXP (XEXP (x, 1), 1);
3771 1.1 mrg
3772 1.1 mrg /* Checking op0, forbid using static chain register ($r16)
3773 1.1 mrg on reduced-set registers configuration. */
3774 1.1 mrg if (TARGET_REDUCED_REGS
3775 1.1 mrg && REG_P (op0)
3776 1.1 mrg && REGNO (op0) == STATIC_CHAIN_REGNUM)
3777 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3778 1.1 mrg /* Checking op1, forbid using static chain register ($r16)
3779 1.1 mrg on reduced-set registers configuration. */
3780 1.1 mrg if (TARGET_REDUCED_REGS
3781 1.1 mrg && REG_P (op1)
3782 1.1 mrg && REGNO (op1) == STATIC_CHAIN_REGNUM)
3783 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3784 1.1 mrg
3785 1.1 mrg if (REG_P (op0) && REG_P (op1))
3786 1.1 mrg {
3787 1.1 mrg /* [Ra], Rb */
3788 1.1 mrg fprintf (stream, "[%s], %s",
3789 1.1 mrg reg_names[REGNO (op0)], reg_names[REGNO (op1)]);
3790 1.1 mrg }
3791 1.1 mrg else if (REG_P (op0) && CONST_INT_P (op1))
3792 1.1 mrg {
3793 1.1 mrg /* [Ra], imm */
3794 1.1 mrg fprintf (stream, "[%s], " HOST_WIDE_INT_PRINT_DEC,
3795 1.1 mrg reg_names[REGNO (op0)], INTVAL (op1));
3796 1.1 mrg }
3797 1.1 mrg else
3798 1.1 mrg {
3799 1.1 mrg /* The control flow is not supposed to be here. */
3800 1.1 mrg debug_rtx (x);
3801 1.1 mrg gcc_unreachable ();
3802 1.1 mrg }
3803 1.1 mrg
3804 1.1 mrg break;
3805 1.1 mrg
3806 1.1 mrg case POST_INC:
3807 1.1 mrg case POST_DEC:
3808 1.1 mrg op0 = XEXP (x, 0);
3809 1.1 mrg
3810 1.1 mrg /* Checking op0, forbid using static chain register ($r16)
3811 1.1 mrg on reduced-set registers configuration. */
3812 1.1 mrg if (TARGET_REDUCED_REGS
3813 1.1 mrg && REG_P (op0)
3814 1.1 mrg && REGNO (op0) == STATIC_CHAIN_REGNUM)
3815 1.1 mrg sorry ("a nested function is not supported for reduced registers");
3816 1.1 mrg
3817 1.1 mrg if (REG_P (op0))
3818 1.1 mrg {
3819 1.1 mrg /* "[Ra], 1/2/4" or "[Ra], -1/-2/-4"
3820 1.1 mrg The 1/2/4 or -1/-2/-4 have been displayed in nds32.md.
3821 1.1 mrg We only need to deal with register Ra. */
3822 1.1 mrg fprintf (stream, "[%s]", reg_names[REGNO (op0)]);
3823 1.1 mrg }
3824 1.1 mrg else
3825 1.1 mrg {
3826 1.1 mrg /* The control flow is not supposed to be here. */
3827 1.1 mrg debug_rtx (x);
3828 1.1 mrg gcc_unreachable ();
3829 1.1 mrg }
3830 1.1 mrg
3831 1.1 mrg break;
3832 1.1 mrg
3833 1.1 mrg default :
3834 1.1 mrg /* Generally, output_addr_const () is able to handle most cases.
3835 1.1 mrg We want to see what CODE could appear,
3836 1.1 mrg so we use gcc_unreachable() to stop it. */
3837 1.1 mrg debug_rtx (x);
3838 1.1 mrg gcc_unreachable ();
3839 1.1 mrg break;
3840 1.1 mrg }
3841 1.1 mrg }
3842 1.1 mrg
3843 1.1 mrg /* -- Assembler Commands for Exception Regions. */
3844 1.1 mrg
3845 1.1 mrg static rtx
3846 1.1 mrg nds32_dwarf_register_span (rtx reg)
3847 1.1 mrg {
3848 1.1 mrg rtx dwarf_high, dwarf_low;
3849 1.1 mrg rtx dwarf_single;
3850 1.1 mrg machine_mode mode;
3851 1.1 mrg int regno;
3852 1.1 mrg
3853 1.1 mrg mode = GET_MODE (reg);
3854 1.1 mrg regno = REGNO (reg);
3855 1.1 mrg
3856 1.1 mrg /* We need to adjust dwarf register information for floating-point registers
3857 1.1 mrg rather than using default register number mapping. */
3858 1.1 mrg if (regno >= NDS32_FIRST_FPR_REGNUM
3859 1.1 mrg && regno <= NDS32_LAST_FPR_REGNUM)
3860 1.1 mrg {
3861 1.1 mrg if (mode == DFmode || mode == SCmode)
3862 1.1 mrg {
3863 1.1 mrg /* By default, GCC maps increasing register numbers to increasing
3864 1.1 mrg memory locations, but paired FPRs in NDS32 target are always
3865 1.1 mrg big-endian, i.e.:
3866 1.1 mrg
3867 1.1 mrg fd0 : fs0 fs1
3868 1.1 mrg (MSB) (LSB)
3869 1.1 mrg
3870 1.1 mrg We must return parallel rtx to represent such layout. */
3871 1.1 mrg dwarf_high = gen_rtx_REG (word_mode, regno);
3872 1.1 mrg dwarf_low = gen_rtx_REG (word_mode, regno + 1);
3873 1.1 mrg return gen_rtx_PARALLEL (VOIDmode,
3874 1.1 mrg gen_rtvec (2, dwarf_low, dwarf_high));
3875 1.1 mrg }
3876 1.1 mrg else if (mode == DCmode)
3877 1.1 mrg {
3878 1.1 mrg rtx dwarf_high_re = gen_rtx_REG (word_mode, regno);
3879 1.1 mrg rtx dwarf_low_re = gen_rtx_REG (word_mode, regno + 1);
3880 1.1 mrg rtx dwarf_high_im = gen_rtx_REG (word_mode, regno);
3881 1.1 mrg rtx dwarf_low_im = gen_rtx_REG (word_mode, regno + 1);
3882 1.1 mrg return gen_rtx_PARALLEL (VOIDmode,
3883 1.1 mrg gen_rtvec (4, dwarf_low_re, dwarf_high_re,
3884 1.1 mrg dwarf_high_im, dwarf_low_im));
3885 1.1 mrg }
3886 1.1 mrg else if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
3887 1.1 mrg {
3888 1.1 mrg return NULL_RTX;
3889 1.1 mrg }
3890 1.1 mrg else
3891 1.1 mrg {
3892 1.1 mrg /* We should not be here. */
3893 1.1 mrg gcc_unreachable ();
3894 1.1 mrg }
3895 1.1 mrg }
3896 1.1 mrg
3897 1.1 mrg return NULL_RTX;
3898 1.1 mrg }
3899 1.1 mrg
3900 1.1 mrg /* Map internal gcc register numbers to DWARF2 register numbers. */
3901 1.1 mrg
3902 1.1 mrg unsigned int
3903 1.1 mrg nds32_dbx_register_number (unsigned int regno)
3904 1.1 mrg {
3905 1.1 mrg /* The nds32 port in GDB maintains a mapping between dwarf register
3906 1.1 mrg number and displayed register name. For backward compatibility to
3907 1.1 mrg previous toolchain, currently our gdb still has four registers
3908 1.1 mrg (d0.l, d0.h, d1.l, and d1.h) between GPR and FPR while compiler
3909 1.1 mrg does not count those four registers in its register number table.
3910 1.1 mrg So we have to add 4 on its register number and then create new
3911 1.1 mrg dwarf information. Hopefully we can discard such workaround
3912 1.1 mrg in the future. */
3913 1.1 mrg if (NDS32_IS_FPR_REGNUM (regno))
3914 1.1 mrg return regno + 4;
3915 1.1 mrg
3916 1.1 mrg return regno;
3917 1.1 mrg }
3918 1.1 mrg
3919 1.1 mrg
3920 1.1 mrg /* Defining target-specific uses of __attribute__. */
3922 1.1 mrg
3923 1.1 mrg /* Add some checking after merging attributes. */
3924 1.1 mrg static tree
3925 1.1 mrg nds32_merge_decl_attributes (tree olddecl, tree newdecl)
3926 1.1 mrg {
3927 1.1 mrg tree combined_attrs;
3928 1.1 mrg
3929 1.1 mrg /* Create combined attributes. */
3930 1.1 mrg combined_attrs = merge_attributes (DECL_ATTRIBUTES (olddecl),
3931 1.1 mrg DECL_ATTRIBUTES (newdecl));
3932 1.1 mrg
3933 1.1 mrg /* Since newdecl is acutally a duplicate of olddecl,
3934 1.1 mrg we can take olddecl for some operations. */
3935 1.1 mrg if (TREE_CODE (olddecl) == FUNCTION_DECL)
3936 1.1 mrg {
3937 1.1 mrg /* Check isr-specific attributes conflict. */
3938 1.1 mrg nds32_check_isr_attrs_conflict (olddecl, combined_attrs);
3939 1.1 mrg }
3940 1.1 mrg
3941 1.1 mrg return combined_attrs;
3942 1.1 mrg }
3943 1.1 mrg
3944 1.1 mrg /* Add some checking when inserting attributes. */
3945 1.1 mrg static void
3946 1.1 mrg nds32_insert_attributes (tree decl, tree *attributes)
3947 1.1 mrg {
3948 1.1 mrg /* A "indirect_call" function attribute implies "noinline" and "noclone"
3949 1.1 mrg for elf toolchain to support ROM patch mechanism. */
3950 1.1 mrg if (TREE_CODE (decl) == FUNCTION_DECL
3951 1.1 mrg && lookup_attribute ("indirect_call", *attributes) != NULL)
3952 1.1 mrg {
3953 1.1 mrg tree new_attrs = *attributes;
3954 1.1 mrg
3955 1.1 mrg if (TARGET_LINUX_ABI)
3956 1.1 mrg error ("cannot use %<indirect_call%> attribute under linux toolchain");
3957 1.1 mrg
3958 1.1 mrg if (lookup_attribute ("noinline", new_attrs) == NULL)
3959 1.1 mrg new_attrs = tree_cons (get_identifier ("noinline"), NULL, new_attrs);
3960 1.1 mrg if (lookup_attribute ("noclone", new_attrs) == NULL)
3961 1.1 mrg new_attrs = tree_cons (get_identifier ("noclone"), NULL, new_attrs);
3962 1.1 mrg
3963 1.1 mrg if (!TREE_PUBLIC (decl))
3964 1.1 mrg error ("%<indirect_call%> attribute cannot apply for static function");
3965 1.1 mrg
3966 1.1 mrg *attributes = new_attrs;
3967 1.1 mrg }
3968 1.1 mrg
3969 1.1 mrg /* For function declaration, we need to check isr-specific attributes:
3970 1.1 mrg 1. Call nds32_check_isr_attrs_conflict() to check any conflict.
3971 1.1 mrg 2. Check valid integer value for interrupt/exception.
3972 1.1 mrg 3. Check valid integer value for reset.
3973 1.1 mrg 4. Check valid function for nmi/warm. */
3974 1.1 mrg if (TREE_CODE (decl) == FUNCTION_DECL)
3975 1.1 mrg {
3976 1.1 mrg tree func_attrs;
3977 1.1 mrg tree intr, excp, reset;
3978 1.1 mrg
3979 1.1 mrg /* Pick up function attributes. */
3980 1.1 mrg func_attrs = *attributes;
3981 1.1 mrg
3982 1.1 mrg /* 1. Call nds32_check_isr_attrs_conflict() to check any conflict. */
3983 1.1 mrg nds32_check_isr_attrs_conflict (decl, func_attrs);
3984 1.1 mrg
3985 1.1 mrg /* Now we are starting to check valid id value
3986 1.1 mrg for interrupt/exception/reset.
3987 1.1 mrg Note that we ONLY check its validity here.
3988 1.1 mrg To construct isr vector information, it is still performed
3989 1.1 mrg by nds32_construct_isr_vectors_information(). */
3990 1.1 mrg intr = lookup_attribute ("interrupt", func_attrs);
3991 1.1 mrg excp = lookup_attribute ("exception", func_attrs);
3992 1.1 mrg reset = lookup_attribute ("reset", func_attrs);
3993 1.1 mrg
3994 1.1 mrg /* The following code may use attribute arguments. If there is no
3995 1.1 mrg argument from source code, it will cause segmentation fault.
3996 1.1 mrg Therefore, return dircetly and report error message later. */
3997 1.1 mrg if ((intr && TREE_VALUE (intr) == NULL)
3998 1.1 mrg || (excp && TREE_VALUE (excp) == NULL)
3999 1.1 mrg || (reset && TREE_VALUE (reset) == NULL))
4000 1.1 mrg return;
4001 1.1 mrg
4002 1.1 mrg /* ------------------------------------------------------------- */
4003 1.1 mrg /* FIXME:
4004 1.1 mrg FOR BACKWARD COMPATIBILITY, we need to support following patterns:
4005 1.1 mrg
4006 1.1 mrg __attribute__((interrupt("XXX;YYY;id=ZZZ")))
4007 1.1 mrg __attribute__((exception("XXX;YYY;id=ZZZ")))
4008 1.1 mrg __attribute__((reset("vectors=XXX;nmi_func=YYY;warm_func=ZZZ")))
4009 1.1 mrg
4010 1.1 mrg If interrupt/exception/reset appears and its argument is a
4011 1.1 mrg STRING_CST, we will use other functions to parse string in the
4012 1.1 mrg nds32_construct_isr_vectors_information() and then set necessary
4013 1.1 mrg isr information in the nds32_isr_vectors[] array. Here we can
4014 1.1 mrg just return immediately to avoid new-syntax checking. */
4015 1.1 mrg if (intr != NULL_TREE
4016 1.1 mrg && TREE_CODE (TREE_VALUE (TREE_VALUE (intr))) == STRING_CST)
4017 1.1 mrg return;
4018 1.1 mrg if (excp != NULL_TREE
4019 1.1 mrg && TREE_CODE (TREE_VALUE (TREE_VALUE (excp))) == STRING_CST)
4020 1.1 mrg return;
4021 1.1 mrg if (reset != NULL_TREE
4022 1.1 mrg && TREE_CODE (TREE_VALUE (TREE_VALUE (reset))) == STRING_CST)
4023 1.1 mrg return;
4024 1.1 mrg /* ------------------------------------------------------------- */
4025 1.1 mrg
4026 1.1 mrg if (intr || excp)
4027 1.1 mrg {
4028 1.1 mrg /* Deal with interrupt/exception. */
4029 1.1 mrg tree id_list;
4030 1.1 mrg unsigned int lower_bound, upper_bound;
4031 1.1 mrg
4032 1.1 mrg /* The way to handle interrupt or exception is the same,
4033 1.1 mrg we just need to take care of actual vector number.
4034 1.1 mrg For interrupt(0..63), the actual vector number is (9..72).
4035 1.1 mrg For exception(1..8), the actual vector number is (1..8). */
4036 1.1 mrg lower_bound = (intr) ? (0) : (1);
4037 1.1 mrg upper_bound = (intr) ? (63) : (8);
4038 1.1 mrg
4039 1.1 mrg /* Prepare id list so that we can traverse id value. */
4040 1.1 mrg id_list = (intr) ? (TREE_VALUE (intr)) : (TREE_VALUE (excp));
4041 1.1 mrg
4042 1.1 mrg /* 2. Check valid integer value for interrupt/exception. */
4043 1.1 mrg while (id_list)
4044 1.1 mrg {
4045 1.1 mrg tree id;
4046 1.1 mrg
4047 1.1 mrg /* Pick up each vector id value. */
4048 1.1 mrg id = TREE_VALUE (id_list);
4049 1.1 mrg /* Issue error if it is not a valid integer value. */
4050 1.1 mrg if (TREE_CODE (id) != INTEGER_CST
4051 1.1 mrg || wi::ltu_p (wi::to_wide (id), lower_bound)
4052 1.1 mrg || wi::gtu_p (wi::to_wide (id), upper_bound))
4053 1.1 mrg error ("invalid id value for interrupt/exception attribute");
4054 1.1 mrg
4055 1.1 mrg /* Advance to next id. */
4056 1.1 mrg id_list = TREE_CHAIN (id_list);
4057 1.1 mrg }
4058 1.1 mrg }
4059 1.1 mrg else if (reset)
4060 1.1 mrg {
4061 1.1 mrg /* Deal with reset. */
4062 1.1 mrg tree id_list;
4063 1.1 mrg tree id;
4064 1.1 mrg tree nmi, warm;
4065 1.1 mrg unsigned int lower_bound;
4066 1.1 mrg unsigned int upper_bound;
4067 1.1 mrg
4068 1.1 mrg /* Prepare id_list and identify id value so that
4069 1.1 mrg we can check if total number of vectors is valid. */
4070 1.1 mrg id_list = TREE_VALUE (reset);
4071 1.1 mrg id = TREE_VALUE (id_list);
4072 1.1 mrg
4073 1.1 mrg /* The maximum numbers for user's interrupt is 64. */
4074 1.1 mrg lower_bound = 0;
4075 1.1 mrg upper_bound = 64;
4076 1.1 mrg
4077 1.1 mrg /* 3. Check valid integer value for reset. */
4078 1.1 mrg if (TREE_CODE (id) != INTEGER_CST
4079 1.1 mrg || wi::ltu_p (wi::to_wide (id), lower_bound)
4080 1.1 mrg || wi::gtu_p (wi::to_wide (id), upper_bound))
4081 1.1 mrg error ("invalid id value for reset attribute");
4082 1.1 mrg
4083 1.1 mrg /* 4. Check valid function for nmi/warm. */
4084 1.1 mrg nmi = lookup_attribute ("nmi", func_attrs);
4085 1.1 mrg warm = lookup_attribute ("warm", func_attrs);
4086 1.1 mrg
4087 1.1 mrg if (nmi != NULL_TREE)
4088 1.1 mrg {
4089 1.1 mrg tree nmi_func_list;
4090 1.1 mrg tree nmi_func;
4091 1.1 mrg
4092 1.1 mrg nmi_func_list = TREE_VALUE (nmi);
4093 1.1 mrg nmi_func = TREE_VALUE (nmi_func_list);
4094 1.1 mrg
4095 1.1 mrg /* Issue error if it is not a valid nmi function. */
4096 1.1 mrg if (TREE_CODE (nmi_func) != IDENTIFIER_NODE)
4097 1.1 mrg error ("invalid nmi function for reset attribute");
4098 1.1 mrg }
4099 1.1 mrg
4100 1.1 mrg if (warm != NULL_TREE)
4101 1.1 mrg {
4102 1.1 mrg tree warm_func_list;
4103 1.1 mrg tree warm_func;
4104 1.1 mrg
4105 1.1 mrg warm_func_list = TREE_VALUE (warm);
4106 1.1 mrg warm_func = TREE_VALUE (warm_func_list);
4107 1.1 mrg
4108 1.1 mrg /* Issue error if it is not a valid warm function. */
4109 1.1 mrg if (TREE_CODE (warm_func) != IDENTIFIER_NODE)
4110 1.1 mrg error ("invalid warm function for reset attribute");
4111 1.1 mrg }
4112 1.1 mrg }
4113 1.1 mrg else
4114 1.1 mrg {
4115 1.1 mrg /* No interrupt, exception, or reset attribute is set. */
4116 1.1 mrg return;
4117 1.1 mrg }
4118 1.1 mrg }
4119 1.1 mrg }
4120 1.1 mrg
4121 1.1 mrg static bool
4122 1.1 mrg nds32_option_pragma_parse (tree args ATTRIBUTE_UNUSED,
4123 1.1 mrg tree pop_target ATTRIBUTE_UNUSED)
4124 1.1 mrg {
4125 1.1 mrg /* Currently, we do not parse any pragma target by ourself,
4126 1.1 mrg so just simply return false. */
4127 1.1 mrg return false;
4128 1.1 mrg }
4129 1.1 mrg
4130 1.1 mrg static void
4131 1.1 mrg nds32_option_override (void)
4132 1.1 mrg {
4133 1.1 mrg /* After all the command options have been parsed,
4134 1.1 mrg we shall deal with some flags for changing compiler settings. */
4135 1.1 mrg
4136 1.1 mrg /* At first, we check if we have to strictly
4137 1.1 mrg set some flags based on ISA family. */
4138 1.1 mrg if (TARGET_ISA_V2)
4139 1.1 mrg {
4140 1.1 mrg /* Under V2 ISA, we need to strictly disable TARGET_V3PUSH. */
4141 1.1 mrg target_flags &= ~MASK_V3PUSH;
4142 1.1 mrg }
4143 1.1 mrg if (TARGET_ISA_V3)
4144 1.1 mrg {
4145 1.1 mrg /* If this is ARCH_V3J, we need to enable TARGET_REDUCED_REGS. */
4146 1.1 mrg if (nds32_arch_option == ARCH_V3J)
4147 1.1 mrg target_flags |= MASK_REDUCED_REGS;
4148 1.1 mrg }
4149 1.1 mrg if (TARGET_ISA_V3M)
4150 1.1 mrg {
4151 1.1 mrg /* Under V3M ISA, we need to strictly enable TARGET_REDUCED_REGS. */
4152 1.1 mrg target_flags |= MASK_REDUCED_REGS;
4153 1.1 mrg /* Under V3M ISA, we need to strictly disable TARGET_EXT_PERF. */
4154 1.1 mrg target_flags &= ~MASK_EXT_PERF;
4155 1.1 mrg /* Under V3M ISA, we need to strictly disable TARGET_EXT_PERF2. */
4156 1.1 mrg target_flags &= ~MASK_EXT_PERF2;
4157 1.1 mrg /* Under V3M ISA, we need to strictly disable TARGET_EXT_STRING. */
4158 1.1 mrg target_flags &= ~MASK_EXT_STRING;
4159 1.1 mrg
4160 1.1 mrg if (flag_pic)
4161 1.1 mrg error ("not support %<-fpic%> option for v3m toolchain");
4162 1.1 mrg }
4163 1.1 mrg
4164 1.1 mrg /* See if we are using reduced-set registers:
4165 1.1 mrg $r0~$r5, $r6~$r10, $r15, $r28, $r29, $r30, $r31
4166 1.1 mrg If so, we must forbid using $r11~$r14, $r16~$r27. */
4167 1.1 mrg if (TARGET_REDUCED_REGS)
4168 1.1 mrg {
4169 1.1 mrg int r;
4170 1.1 mrg
4171 1.1 mrg /* Prevent register allocator from
4172 1.1 mrg choosing it as doing register allocation. */
4173 1.1 mrg for (r = 11; r <= 14; r++)
4174 1.1 mrg fixed_regs[r] = call_used_regs[r] = 1;
4175 1.1 mrg for (r = 16; r <= 27; r++)
4176 1.1 mrg fixed_regs[r] = call_used_regs[r] = 1;
4177 1.1 mrg }
4178 1.1 mrg
4179 1.1 mrg /* See if user explicitly would like to use fp-as-gp optimization.
4180 1.1 mrg If so, we must prevent $fp from being allocated
4181 1.1 mrg during register allocation. */
4182 1.1 mrg if (TARGET_FORCE_FP_AS_GP)
4183 1.1 mrg fixed_regs[FP_REGNUM] = call_used_regs[FP_REGNUM] = 1;
4184 1.1 mrg
4185 1.1 mrg if (!TARGET_16_BIT)
4186 1.1 mrg {
4187 1.1 mrg /* Under no 16 bit ISA, we need to strictly disable TARGET_V3PUSH. */
4188 1.1 mrg target_flags &= ~MASK_V3PUSH;
4189 1.1 mrg }
4190 1.1 mrg
4191 1.1 mrg if (TARGET_HARD_FLOAT && !(TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE))
4192 1.1 mrg {
4193 1.1 mrg if (nds32_arch_option == ARCH_V3S || nds32_arch_option == ARCH_V3F)
4194 1.1 mrg error ("Disable FPU ISA, "
4195 1.1 mrg "the ABI option must be enable %<-mfloat-abi=soft%>");
4196 1.1 mrg else
4197 1.1 mrg error ("%<-mabi=2fp+%> option only support when FPU available, "
4198 1.1 mrg "must be enable %<-mext-fpu-sp%> or %<-mext-fpu-dp%>");
4199 1.1 mrg }
4200 1.1 mrg
4201 1.1 mrg nds32_init_rtx_costs ();
4202 1.1 mrg
4203 1.1 mrg nds32_register_passes ();
4204 1.1 mrg }
4205 1.1 mrg
4206 1.1 mrg
4207 1.1 mrg /* Miscellaneous Parameters. */
4209 1.1 mrg
4210 1.1 mrg static rtx_insn *
4211 1.1 mrg nds32_md_asm_adjust (vec<rtx> &outputs ATTRIBUTE_UNUSED,
4212 1.1 mrg vec<rtx> &inputs ATTRIBUTE_UNUSED,
4213 1.1 mrg vec<machine_mode> &input_modes ATTRIBUTE_UNUSED,
4214 1.1 mrg vec<const char *> &constraints ATTRIBUTE_UNUSED,
4215 1.1 mrg vec<rtx> &clobbers, HARD_REG_SET &clobbered_regs,
4216 1.1 mrg location_t /*loc*/)
4217 1.1 mrg {
4218 1.1 mrg if (!flag_inline_asm_r15)
4219 1.1 mrg {
4220 1.1 mrg clobbers.safe_push (gen_rtx_REG (SImode, TA_REGNUM));
4221 1.1 mrg SET_HARD_REG_BIT (clobbered_regs, TA_REGNUM);
4222 1.1 mrg }
4223 1.1 mrg return NULL;
4224 1.1 mrg }
4225 1.1 mrg
4226 1.1 mrg static void
4227 1.1 mrg nds32_init_builtins (void)
4228 1.1 mrg {
4229 1.1 mrg nds32_init_builtins_impl ();
4230 1.1 mrg }
4231 1.1 mrg
4232 1.1 mrg static tree
4233 1.1 mrg nds32_builtin_decl (unsigned code, bool initialize_p)
4234 1.1 mrg {
4235 1.1 mrg /* Implement in nds32-intrinsic.cc. */
4236 1.1 mrg return nds32_builtin_decl_impl (code, initialize_p);
4237 1.1 mrg }
4238 1.1 mrg
4239 1.1 mrg static rtx
4240 1.1 mrg nds32_expand_builtin (tree exp,
4241 1.1 mrg rtx target,
4242 1.1 mrg rtx subtarget,
4243 1.1 mrg machine_mode mode,
4244 1.1 mrg int ignore)
4245 1.1 mrg {
4246 1.1 mrg return nds32_expand_builtin_impl (exp, target, subtarget, mode, ignore);
4247 1.1 mrg }
4248 1.1 mrg
4249 1.1 mrg /* Implement TARGET_INIT_LIBFUNCS. */
4250 1.1 mrg static void
4251 1.1 mrg nds32_init_libfuncs (void)
4252 1.1 mrg {
4253 1.1 mrg if (TARGET_LINUX_ABI)
4254 1.1 mrg init_sync_libfuncs (UNITS_PER_WORD);
4255 1.1 mrg }
4256 1.1 mrg
4257 1.1 mrg /* ------------------------------------------------------------------------ */
4258 1.1 mrg
4259 1.1 mrg /* PART 4: Implemet extern function definitions,
4260 1.1 mrg the prototype is in nds32-protos.h. */
4261 1.1 mrg
4262 1.1 mrg /* Run-time Target Specification. */
4264 1.1 mrg
4265 1.1 mrg void
4266 1.1 mrg nds32_cpu_cpp_builtins(struct cpp_reader *pfile)
4267 1.1 mrg {
4268 1.1 mrg #define builtin_define(TXT) cpp_define (pfile, TXT)
4269 1.1 mrg #define builtin_assert(TXT) cpp_assert (pfile, TXT)
4270 1.1 mrg builtin_define ("__nds32__");
4271 1.1 mrg builtin_define ("__NDS32__");
4272 1.1 mrg
4273 1.1 mrg /* We need to provide builtin macro to describe the size of
4274 1.1 mrg each vector for interrupt handler under elf toolchain. */
4275 1.1 mrg if (!TARGET_LINUX_ABI)
4276 1.1 mrg {
4277 1.1 mrg if (TARGET_ISR_VECTOR_SIZE_4_BYTE)
4278 1.1 mrg builtin_define ("__NDS32_ISR_VECTOR_SIZE_4__");
4279 1.1 mrg else
4280 1.1 mrg builtin_define ("__NDS32_ISR_VECTOR_SIZE_16__");
4281 1.1 mrg }
4282 1.1 mrg
4283 1.1 mrg if (TARGET_HARD_FLOAT)
4284 1.1 mrg builtin_define ("__NDS32_ABI_2FP_PLUS__");
4285 1.1 mrg else
4286 1.1 mrg builtin_define ("__NDS32_ABI_2__");
4287 1.1 mrg
4288 1.1 mrg if (TARGET_ISA_V2)
4289 1.1 mrg builtin_define ("__NDS32_ISA_V2__");
4290 1.1 mrg if (TARGET_ISA_V3)
4291 1.1 mrg builtin_define ("__NDS32_ISA_V3__");
4292 1.1 mrg if (TARGET_ISA_V3M)
4293 1.1 mrg builtin_define ("__NDS32_ISA_V3M__");
4294 1.1 mrg
4295 1.1 mrg if (TARGET_FPU_SINGLE)
4296 1.1 mrg builtin_define ("__NDS32_EXT_FPU_SP__");
4297 1.1 mrg if (TARGET_FPU_DOUBLE)
4298 1.1 mrg builtin_define ("__NDS32_EXT_FPU_DP__");
4299 1.1 mrg
4300 1.1 mrg if (TARGET_EXT_FPU_FMA)
4301 1.1 mrg builtin_define ("__NDS32_EXT_FPU_FMA__");
4302 1.1 mrg if (NDS32_EXT_FPU_DOT_E)
4303 1.1 mrg builtin_define ("__NDS32_EXT_FPU_DOT_E__");
4304 1.1 mrg if (TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
4305 1.1 mrg {
4306 1.1 mrg switch (nds32_fp_regnum)
4307 1.1 mrg {
4308 1.1 mrg case 0:
4309 1.1 mrg case 4:
4310 1.1 mrg builtin_define ("__NDS32_EXT_FPU_CONFIG_0__");
4311 1.1 mrg break;
4312 1.1 mrg case 1:
4313 1.1 mrg case 5:
4314 1.1 mrg builtin_define ("__NDS32_EXT_FPU_CONFIG_1__");
4315 1.1 mrg break;
4316 1.1 mrg case 2:
4317 1.1 mrg case 6:
4318 1.1 mrg builtin_define ("__NDS32_EXT_FPU_CONFIG_2__");
4319 1.1 mrg break;
4320 1.1 mrg case 3:
4321 1.1 mrg case 7:
4322 1.1 mrg builtin_define ("__NDS32_EXT_FPU_CONFIG_3__");
4323 1.1 mrg break;
4324 1.1 mrg default:
4325 1.1 mrg abort ();
4326 1.1 mrg }
4327 1.1 mrg }
4328 1.1 mrg
4329 1.1 mrg if (TARGET_BIG_ENDIAN)
4330 1.1 mrg builtin_define ("__NDS32_EB__");
4331 1.1 mrg else
4332 1.1 mrg builtin_define ("__NDS32_EL__");
4333 1.1 mrg
4334 1.1 mrg if (TARGET_REDUCED_REGS)
4335 1.1 mrg builtin_define ("__NDS32_REDUCED_REGS__");
4336 1.1 mrg if (TARGET_CMOV)
4337 1.1 mrg builtin_define ("__NDS32_CMOV__");
4338 1.1 mrg if (TARGET_EXT_PERF)
4339 1.1 mrg builtin_define ("__NDS32_EXT_PERF__");
4340 1.1 mrg if (TARGET_EXT_PERF2)
4341 1.1 mrg builtin_define ("__NDS32_EXT_PERF2__");
4342 1.1 mrg if (TARGET_EXT_STRING)
4343 1.1 mrg builtin_define ("__NDS32_EXT_STRING__");
4344 1.1 mrg if (TARGET_16_BIT)
4345 1.1 mrg builtin_define ("__NDS32_16_BIT__");
4346 1.1 mrg if (TARGET_GP_DIRECT)
4347 1.1 mrg builtin_define ("__NDS32_GP_DIRECT__");
4348 1.1 mrg if (TARGET_VH)
4349 1.1 mrg builtin_define ("__NDS32_VH__");
4350 1.1 mrg if (NDS32_EXT_DSP_P ())
4351 1.1 mrg builtin_define ("__NDS32_EXT_DSP__");
4352 1.1 mrg
4353 1.1 mrg if (TARGET_BIG_ENDIAN)
4354 1.1 mrg builtin_define ("__big_endian__");
4355 1.1 mrg
4356 1.1 mrg builtin_assert ("cpu=nds32");
4357 1.1 mrg builtin_assert ("machine=nds32");
4358 1.1 mrg
4359 1.1 mrg if (TARGET_HARD_FLOAT)
4360 1.1 mrg builtin_define ("__NDS32_ABI_2FP_PLUS");
4361 1.1 mrg else
4362 1.1 mrg builtin_define ("__NDS32_ABI_2");
4363 1.1 mrg
4364 1.1 mrg #undef builtin_define
4365 1.1 mrg #undef builtin_assert
4366 1.1 mrg }
4367 1.1 mrg
4368 1.1 mrg
4369 1.1 mrg /* Defining Data Structures for Per-function Information. */
4371 1.1 mrg
4372 1.1 mrg void
4373 1.1 mrg nds32_init_expanders (void)
4374 1.1 mrg {
4375 1.1 mrg /* Arrange to initialize and mark the machine per-function status. */
4376 1.1 mrg init_machine_status = nds32_init_machine_status;
4377 1.1 mrg }
4378 1.1 mrg
4379 1.1 mrg
4380 1.1 mrg /* Register Usage. */
4382 1.1 mrg
4383 1.1 mrg /* -- Order of Allocation of Registers. */
4384 1.1 mrg
4385 1.1 mrg void
4386 1.1 mrg nds32_adjust_reg_alloc_order (void)
4387 1.1 mrg {
4388 1.1 mrg const int nds32_reg_alloc_order[] = REG_ALLOC_ORDER;
4389 1.1 mrg
4390 1.1 mrg /* Copy the default register allocation order, which is designed
4391 1.1 mrg to optimize for code size. */
4392 1.1 mrg memcpy(reg_alloc_order, nds32_reg_alloc_order, sizeof (reg_alloc_order));
4393 1.1 mrg
4394 1.1 mrg /* Adjust few register allocation order when optimizing for speed. */
4395 1.1 mrg if (!optimize_size)
4396 1.1 mrg {
4397 1.1 mrg memcpy (reg_alloc_order, nds32_reg_alloc_order_for_speed,
4398 1.1 mrg sizeof (nds32_reg_alloc_order_for_speed));
4399 1.1 mrg }
4400 1.1 mrg }
4401 1.1 mrg
4402 1.1 mrg /* -- How Values Fit in Registers. */
4403 1.1 mrg
4404 1.1 mrg static unsigned
4405 1.1 mrg nds32_hard_regno_nregs (unsigned regno ATTRIBUTE_UNUSED,
4406 1.1 mrg machine_mode mode)
4407 1.1 mrg {
4408 1.1 mrg return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);
4409 1.1 mrg }
4410 1.1 mrg
4411 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. */
4412 1.1 mrg
4413 1.1 mrg static bool
4414 1.1 mrg nds32_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
4415 1.1 mrg {
4416 1.1 mrg if (regno >= FIRST_PSEUDO_REGISTER)
4417 1.1 mrg return true;
4418 1.1 mrg
4419 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE) && NDS32_IS_FPR_REGNUM (regno))
4420 1.1 mrg {
4421 1.1 mrg if (NDS32_IS_EXT_FPR_REGNUM(regno))
4422 1.1 mrg return (NDS32_FPR_REGNO_OK_FOR_DOUBLE(regno) && (mode == DFmode));
4423 1.1 mrg else if (mode == SFmode || mode == SImode)
4424 1.1 mrg return NDS32_FPR_REGNO_OK_FOR_SINGLE (regno);
4425 1.1 mrg else if (mode == DFmode)
4426 1.1 mrg return NDS32_FPR_REGNO_OK_FOR_DOUBLE (regno);
4427 1.1 mrg
4428 1.1 mrg return false;
4429 1.1 mrg }
4430 1.1 mrg
4431 1.1 mrg /* Restrict double-word quantities to even register pairs. */
4432 1.1 mrg if (regno <= NDS32_LAST_GPR_REGNUM)
4433 1.1 mrg return (targetm.hard_regno_nregs (regno, mode) == 1
4434 1.1 mrg || !((regno) & 1));
4435 1.1 mrg
4436 1.1 mrg return false;
4437 1.1 mrg }
4438 1.1 mrg
4439 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P. We can use general registers to
4440 1.1 mrg tie QI/HI/SI modes together. */
4441 1.1 mrg
4442 1.1 mrg static bool
4443 1.1 mrg nds32_modes_tieable_p (machine_mode mode1, machine_mode mode2)
4444 1.1 mrg {
4445 1.1 mrg if ((GET_MODE_CLASS (mode1) == MODE_INT
4446 1.1 mrg && GET_MODE_CLASS (mode2) == MODE_INT)
4447 1.1 mrg && GET_MODE_SIZE (mode1) <= UNITS_PER_WORD
4448 1.1 mrg && GET_MODE_SIZE (mode2) <= UNITS_PER_WORD)
4449 1.1 mrg return true;
4450 1.1 mrg
4451 1.1 mrg if (GET_MODE_SIZE (mode1) == GET_MODE_SIZE (mode2))
4452 1.1 mrg {
4453 1.1 mrg if ((TARGET_FPU_SINGLE && !TARGET_FPU_DOUBLE)
4454 1.1 mrg && (mode1 == DFmode || mode2 == DFmode))
4455 1.1 mrg return false;
4456 1.1 mrg else
4457 1.1 mrg return true;
4458 1.1 mrg }
4459 1.1 mrg
4460 1.1 mrg return false;
4461 1.1 mrg }
4462 1.1 mrg
4463 1.1 mrg /* Register Classes. */
4465 1.1 mrg
4466 1.1 mrg enum reg_class
4467 1.1 mrg nds32_regno_reg_class (int regno)
4468 1.1 mrg {
4469 1.1 mrg /* Refer to nds32.h for more register class details. */
4470 1.1 mrg
4471 1.1 mrg if (regno >= 0 && regno <= 7)
4472 1.1 mrg return LOW_REGS;
4473 1.1 mrg else if (regno >= 8 && regno <= 11)
4474 1.1 mrg return MIDDLE_REGS;
4475 1.1 mrg else if (regno >= 12 && regno <= 14)
4476 1.1 mrg return HIGH_REGS;
4477 1.1 mrg else if (regno == 15)
4478 1.1 mrg return R15_TA_REG;
4479 1.1 mrg else if (regno >= 16 && regno <= 19)
4480 1.1 mrg return MIDDLE_REGS;
4481 1.1 mrg else if (regno >= 20 && regno <= 31)
4482 1.1 mrg return HIGH_REGS;
4483 1.1 mrg else if (regno == 32 || regno == 33)
4484 1.1 mrg {
4485 1.1 mrg /* $SFP and $AP is FRAME_REGS in fact, However prevent IRA don't
4486 1.1 mrg know how to allocate register for $SFP and $AP, just tell IRA they
4487 1.1 mrg are GENERAL_REGS, and ARM do this hack too. */
4488 1.1 mrg return GENERAL_REGS;
4489 1.1 mrg }
4490 1.1 mrg else if (regno >= 34 && regno <= 97)
4491 1.1 mrg return FP_REGS;
4492 1.1 mrg else
4493 1.1 mrg return NO_REGS;
4494 1.1 mrg }
4495 1.1 mrg
4496 1.1 mrg
4497 1.1 mrg /* Stack Layout and Calling Conventions. */
4499 1.1 mrg
4500 1.1 mrg /* -- Basic Stack Layout. */
4501 1.1 mrg
4502 1.1 mrg rtx
4503 1.1 mrg nds32_dynamic_chain_address (rtx frameaddr)
4504 1.1 mrg {
4505 1.1 mrg if (TARGET_V3PUSH)
4506 1.1 mrg {
4507 1.1 mrg /* If -mv3push is specified, we push $fp, $gp, and $lp into stack.
4508 1.1 mrg We can access dynamic chain address from stack by [$fp - 12]. */
4509 1.1 mrg return plus_constant (Pmode, frameaddr, -12);
4510 1.1 mrg }
4511 1.1 mrg else
4512 1.1 mrg {
4513 1.1 mrg /* For general case we push $fp and $lp into stack at prologue.
4514 1.1 mrg We can access dynamic chain address from stack by [$fp - 8]. */
4515 1.1 mrg return plus_constant (Pmode, frameaddr, -8);
4516 1.1 mrg }
4517 1.1 mrg }
4518 1.1 mrg
4519 1.1 mrg rtx
4520 1.1 mrg nds32_return_addr_rtx (int count,
4521 1.1 mrg rtx frameaddr)
4522 1.1 mrg {
4523 1.1 mrg int offset;
4524 1.1 mrg rtx addr;
4525 1.1 mrg
4526 1.1 mrg if (count != 0)
4527 1.1 mrg {
4528 1.1 mrg /* In nds32 ABI design, we can expect that $lp is always available
4529 1.1 mrg from stack by [$fp - 4] location. */
4530 1.1 mrg offset = -4;
4531 1.1 mrg addr = plus_constant (Pmode, frameaddr, offset);
4532 1.1 mrg addr = memory_address (Pmode, addr);
4533 1.1 mrg
4534 1.1 mrg return gen_rtx_MEM (Pmode, addr);
4535 1.1 mrg }
4536 1.1 mrg
4537 1.1 mrg /* If count == 0, it means we are at current frame,
4538 1.1 mrg the return address is $r30 ($lp). */
4539 1.1 mrg return get_hard_reg_initial_val (Pmode, LP_REGNUM);
4540 1.1 mrg }
4541 1.1 mrg
4542 1.1 mrg /* -- Eliminating Frame Pointer and Arg Pointer. */
4543 1.1 mrg
4544 1.1 mrg HOST_WIDE_INT
4545 1.1 mrg nds32_initial_elimination_offset (unsigned int from_reg, unsigned int to_reg)
4546 1.1 mrg {
4547 1.1 mrg HOST_WIDE_INT offset;
4548 1.1 mrg
4549 1.1 mrg /* Compute and setup stack frame size.
4550 1.1 mrg The result will be in cfun->machine. */
4551 1.1 mrg nds32_compute_stack_frame ();
4552 1.1 mrg
4553 1.1 mrg /* Remember to consider
4554 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes and
4555 1.1 mrg cfun->machine->eh_return_data_regs_size
4556 1.1 mrg when calculating offset. */
4557 1.1 mrg if (from_reg == ARG_POINTER_REGNUM && to_reg == STACK_POINTER_REGNUM)
4558 1.1 mrg {
4559 1.1 mrg offset = (cfun->machine->fp_size
4560 1.1 mrg + cfun->machine->gp_size
4561 1.1 mrg + cfun->machine->lp_size
4562 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
4563 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
4564 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size
4565 1.1 mrg + cfun->machine->eh_return_data_regs_size
4566 1.1 mrg + cfun->machine->local_size
4567 1.1 mrg + cfun->machine->out_args_size);
4568 1.1 mrg }
4569 1.1 mrg else if (from_reg == ARG_POINTER_REGNUM
4570 1.1 mrg && to_reg == HARD_FRAME_POINTER_REGNUM)
4571 1.1 mrg {
4572 1.1 mrg offset = 0;
4573 1.1 mrg }
4574 1.1 mrg else if (from_reg == FRAME_POINTER_REGNUM
4575 1.1 mrg && to_reg == STACK_POINTER_REGNUM)
4576 1.1 mrg {
4577 1.1 mrg offset = (cfun->machine->local_size + cfun->machine->out_args_size);
4578 1.1 mrg }
4579 1.1 mrg else if (from_reg == FRAME_POINTER_REGNUM
4580 1.1 mrg && to_reg == HARD_FRAME_POINTER_REGNUM)
4581 1.1 mrg {
4582 1.1 mrg offset = (-1) * (cfun->machine->fp_size
4583 1.1 mrg + cfun->machine->gp_size
4584 1.1 mrg + cfun->machine->lp_size
4585 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
4586 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
4587 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size
4588 1.1 mrg + cfun->machine->eh_return_data_regs_size);
4589 1.1 mrg }
4590 1.1 mrg else
4591 1.1 mrg {
4592 1.1 mrg gcc_unreachable ();
4593 1.1 mrg }
4594 1.1 mrg
4595 1.1 mrg return offset;
4596 1.1 mrg }
4597 1.1 mrg
4598 1.1 mrg /* -- Passing Arguments in Registers. */
4599 1.1 mrg
4600 1.1 mrg void
4601 1.1 mrg nds32_init_cumulative_args (CUMULATIVE_ARGS *cum,
4602 1.1 mrg tree fntype ATTRIBUTE_UNUSED,
4603 1.1 mrg rtx libname ATTRIBUTE_UNUSED,
4604 1.1 mrg tree fndecl ATTRIBUTE_UNUSED,
4605 1.1 mrg int n_named_args ATTRIBUTE_UNUSED)
4606 1.1 mrg {
4607 1.1 mrg /* Initial available registers. The values are offset against
4608 1.1 mrg NDS32_GPR_ARG_FIRST_REGNUM and NDS32_FPR_ARG_FIRST_REGNUM
4609 1.1 mrg for passing arguments. */
4610 1.1 mrg cum->gpr_offset = 0;
4611 1.1 mrg cum->fpr_offset = 0;
4612 1.1 mrg }
4613 1.1 mrg
4614 1.1 mrg /* -- Function Entry and Exit. */
4615 1.1 mrg
4616 1.1 mrg /* Function for normal multiple push prologue. */
4617 1.1 mrg void
4618 1.1 mrg nds32_expand_prologue (void)
4619 1.1 mrg {
4620 1.1 mrg int fp_adjust;
4621 1.1 mrg int sp_adjust;
4622 1.1 mrg unsigned Rb, Re;
4623 1.1 mrg
4624 1.1 mrg /* Compute and setup stack frame size.
4625 1.1 mrg The result will be in cfun->machine. */
4626 1.1 mrg nds32_compute_stack_frame ();
4627 1.1 mrg
4628 1.1 mrg /* Check frame_pointer_needed again to prevent fp is need after reload. */
4629 1.1 mrg if (frame_pointer_needed)
4630 1.1 mrg cfun->machine->fp_as_gp_p = false;
4631 1.1 mrg
4632 1.1 mrg /* If this is a variadic function, first we need to push argument
4633 1.1 mrg registers that hold the unnamed argument value. */
4634 1.1 mrg if (cfun->machine->va_args_size != 0)
4635 1.1 mrg {
4636 1.1 mrg Rb = cfun->machine->va_args_first_regno;
4637 1.1 mrg Re = cfun->machine->va_args_last_regno;
4638 1.1 mrg /* No need to push $fp, $gp, or $lp. */
4639 1.1 mrg nds32_emit_stack_push_multiple (Rb, Re, false, false, false, true);
4640 1.1 mrg
4641 1.1 mrg /* We may also need to adjust stack pointer for padding bytes
4642 1.1 mrg because varargs may cause $sp not 8-byte aligned. */
4643 1.1 mrg if (cfun->machine->va_args_area_padding_bytes)
4644 1.1 mrg {
4645 1.1 mrg /* Generate sp adjustment instruction. */
4646 1.1 mrg sp_adjust = cfun->machine->va_args_area_padding_bytes;
4647 1.1 mrg
4648 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4649 1.1 mrg stack_pointer_rtx,
4650 1.1 mrg -1 * sp_adjust);
4651 1.1 mrg }
4652 1.1 mrg }
4653 1.1 mrg
4654 1.1 mrg /* If the function is 'naked',
4655 1.1 mrg we do not have to generate prologue code fragment. */
4656 1.1 mrg if (cfun->machine->naked_p && !flag_pic)
4657 1.1 mrg return;
4658 1.1 mrg
4659 1.1 mrg /* Get callee_first_regno and callee_last_regno. */
4660 1.1 mrg Rb = cfun->machine->callee_saved_first_gpr_regno;
4661 1.1 mrg Re = cfun->machine->callee_saved_last_gpr_regno;
4662 1.1 mrg
4663 1.1 mrg /* If $fp, $gp, $lp, and all callee-save registers are NOT required
4664 1.1 mrg to be saved, we don't have to create multiple push instruction.
4665 1.1 mrg Otherwise, a multiple push instruction is needed. */
4666 1.1 mrg if (!(Rb == SP_REGNUM && Re == SP_REGNUM
4667 1.1 mrg && cfun->machine->fp_size == 0
4668 1.1 mrg && cfun->machine->gp_size == 0
4669 1.1 mrg && cfun->machine->lp_size == 0))
4670 1.1 mrg {
4671 1.1 mrg /* Create multiple push instruction rtx. */
4672 1.1 mrg nds32_emit_stack_push_multiple (
4673 1.1 mrg Rb, Re,
4674 1.1 mrg cfun->machine->fp_size, cfun->machine->gp_size, cfun->machine->lp_size,
4675 1.1 mrg false);
4676 1.1 mrg }
4677 1.1 mrg
4678 1.1 mrg /* Save eh data registers. */
4679 1.1 mrg if (cfun->machine->use_eh_return_p)
4680 1.1 mrg {
4681 1.1 mrg Rb = cfun->machine->eh_return_data_first_regno;
4682 1.1 mrg Re = cfun->machine->eh_return_data_last_regno;
4683 1.1 mrg
4684 1.1 mrg /* No need to push $fp, $gp, or $lp.
4685 1.1 mrg Also, this is not variadic arguments push. */
4686 1.1 mrg nds32_emit_stack_push_multiple (Rb, Re, false, false, false, false);
4687 1.1 mrg }
4688 1.1 mrg
4689 1.1 mrg /* Check frame_pointer_needed to see
4690 1.1 mrg if we shall emit fp adjustment instruction. */
4691 1.1 mrg if (frame_pointer_needed)
4692 1.1 mrg {
4693 1.1 mrg /* adjust $fp = $sp + ($fp size) + ($gp size) + ($lp size)
4694 1.1 mrg + (4 * callee-saved-registers)
4695 1.1 mrg + (4 * exception-handling-data-registers)
4696 1.1 mrg Note: No need to adjust
4697 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes,
4698 1.1 mrg because, at this point, stack pointer is just
4699 1.1 mrg at the position after push instruction. */
4700 1.1 mrg fp_adjust = cfun->machine->fp_size
4701 1.1 mrg + cfun->machine->gp_size
4702 1.1 mrg + cfun->machine->lp_size
4703 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
4704 1.1 mrg + cfun->machine->eh_return_data_regs_size;
4705 1.1 mrg
4706 1.1 mrg nds32_emit_adjust_frame (hard_frame_pointer_rtx,
4707 1.1 mrg stack_pointer_rtx,
4708 1.1 mrg fp_adjust);
4709 1.1 mrg }
4710 1.1 mrg
4711 1.1 mrg /* Save fpu registers. */
4712 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
4713 1.1 mrg {
4714 1.1 mrg /* When $sp moved to bottom of stack, we need to check whether
4715 1.1 mrg the range of offset in the FPU instruction. */
4716 1.1 mrg int fpr_offset = cfun->machine->local_size
4717 1.1 mrg + cfun->machine->out_args_size
4718 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
4719 1.1 mrg
4720 1.1 mrg /* Check FPU instruction offset imm14s. */
4721 1.1 mrg if (!satisfies_constraint_Is14 (GEN_INT (fpr_offset)))
4722 1.1 mrg {
4723 1.1 mrg int fpr_space = cfun->machine->callee_saved_area_gpr_padding_bytes
4724 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
4725 1.1 mrg
4726 1.1 mrg /* Save fpu registers, need to allocate stack space
4727 1.1 mrg for fpu callee registers. And now $sp position
4728 1.1 mrg on callee saved fpr registers. */
4729 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4730 1.1 mrg stack_pointer_rtx,
4731 1.1 mrg -1 * fpr_space);
4732 1.1 mrg
4733 1.1 mrg /* Emit fpu store instruction, using [$sp + offset] store
4734 1.1 mrg fpu registers. */
4735 1.1 mrg nds32_emit_push_fpr_callee_saved (0);
4736 1.1 mrg
4737 1.1 mrg /* Adjust $sp = $sp - local_size - out_args_size. */
4738 1.1 mrg sp_adjust = cfun->machine->local_size
4739 1.1 mrg + cfun->machine->out_args_size;
4740 1.1 mrg
4741 1.1 mrg /* Allocate stack space for local size and out args size. */
4742 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4743 1.1 mrg stack_pointer_rtx,
4744 1.1 mrg -1 * sp_adjust);
4745 1.1 mrg }
4746 1.1 mrg else
4747 1.1 mrg {
4748 1.1 mrg /* Offset range in Is14, so $sp moved to bottom of stack. */
4749 1.1 mrg
4750 1.1 mrg /* Adjust $sp = $sp - local_size - out_args_size
4751 1.1 mrg - callee_saved_area_gpr_padding_bytes
4752 1.1 mrg - callee_saved_fpr_regs_size. */
4753 1.1 mrg sp_adjust = cfun->machine->local_size
4754 1.1 mrg + cfun->machine->out_args_size
4755 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
4756 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
4757 1.1 mrg
4758 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4759 1.1 mrg stack_pointer_rtx,
4760 1.1 mrg -1 * sp_adjust);
4761 1.1 mrg
4762 1.1 mrg /* Emit fpu store instruction, using [$sp + offset] store
4763 1.1 mrg fpu registers. */
4764 1.1 mrg int fpr_position = cfun->machine->out_args_size
4765 1.1 mrg + cfun->machine->local_size;
4766 1.1 mrg nds32_emit_push_fpr_callee_saved (fpr_position);
4767 1.1 mrg }
4768 1.1 mrg }
4769 1.1 mrg else
4770 1.1 mrg {
4771 1.1 mrg /* Adjust $sp = $sp - local_size - out_args_size
4772 1.1 mrg - callee_saved_area_gpr_padding_bytes. */
4773 1.1 mrg sp_adjust = cfun->machine->local_size
4774 1.1 mrg + cfun->machine->out_args_size
4775 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes;
4776 1.1 mrg
4777 1.1 mrg /* sp_adjust value may be out of range of the addi instruction,
4778 1.1 mrg create alternative add behavior with TA_REGNUM if necessary,
4779 1.1 mrg using NEGATIVE value to tell that we are decreasing address. */
4780 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4781 1.1 mrg stack_pointer_rtx,
4782 1.1 mrg -1 * sp_adjust);
4783 1.1 mrg }
4784 1.1 mrg
4785 1.1 mrg /* Emit gp setup instructions for -fpic. */
4786 1.1 mrg if (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
4787 1.1 mrg nds32_emit_load_gp ();
4788 1.1 mrg
4789 1.1 mrg /* If user applies -mno-sched-prolog-epilog option,
4790 1.1 mrg we need to prevent instructions of function body from being
4791 1.1 mrg scheduled with stack adjustment in prologue. */
4792 1.1 mrg if (!flag_sched_prolog_epilog)
4793 1.1 mrg emit_insn (gen_blockage ());
4794 1.1 mrg }
4795 1.1 mrg
4796 1.1 mrg /* Function for normal multiple pop epilogue. */
4797 1.1 mrg void
4798 1.1 mrg nds32_expand_epilogue (bool sibcall_p)
4799 1.1 mrg {
4800 1.1 mrg int sp_adjust;
4801 1.1 mrg unsigned Rb, Re;
4802 1.1 mrg
4803 1.1 mrg /* Compute and setup stack frame size.
4804 1.1 mrg The result will be in cfun->machine. */
4805 1.1 mrg nds32_compute_stack_frame ();
4806 1.1 mrg
4807 1.1 mrg /* If user applies -mno-sched-prolog-epilog option,
4808 1.1 mrg we need to prevent instructions of function body from being
4809 1.1 mrg scheduled with stack adjustment in epilogue. */
4810 1.1 mrg if (!flag_sched_prolog_epilog)
4811 1.1 mrg emit_insn (gen_blockage ());
4812 1.1 mrg
4813 1.1 mrg /* If the function is 'naked', we do not have to generate
4814 1.1 mrg epilogue code fragment BUT 'ret' instruction.
4815 1.1 mrg However, if this function is also a variadic function,
4816 1.1 mrg we need to create adjust stack pointer before 'ret' instruction. */
4817 1.1 mrg if (cfun->machine->naked_p)
4818 1.1 mrg {
4819 1.1 mrg /* If this is a variadic function, we do not have to restore argument
4820 1.1 mrg registers but need to adjust stack pointer back to previous stack
4821 1.1 mrg frame location before return. */
4822 1.1 mrg if (cfun->machine->va_args_size != 0)
4823 1.1 mrg {
4824 1.1 mrg /* Generate sp adjustment instruction.
4825 1.1 mrg We need to consider padding bytes here. */
4826 1.1 mrg sp_adjust = cfun->machine->va_args_size
4827 1.1 mrg + cfun->machine->va_args_area_padding_bytes;
4828 1.1 mrg
4829 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4830 1.1 mrg stack_pointer_rtx,
4831 1.1 mrg sp_adjust);
4832 1.1 mrg }
4833 1.1 mrg
4834 1.1 mrg /* Generate return instruction by using 'return_internal' pattern.
4835 1.1 mrg Make sure this instruction is after gen_blockage(). */
4836 1.1 mrg if (!sibcall_p)
4837 1.1 mrg {
4838 1.1 mrg /* We need to further check attributes to determine whether
4839 1.1 mrg there should be return instruction at epilogue.
4840 1.1 mrg If the attribute naked exists but -mno-ret-in-naked-func
4841 1.1 mrg is issued, there is NO need to generate return instruction. */
4842 1.1 mrg if (cfun->machine->attr_naked_p && !flag_ret_in_naked_func)
4843 1.1 mrg return;
4844 1.1 mrg
4845 1.1 mrg emit_jump_insn (gen_return_internal ());
4846 1.1 mrg }
4847 1.1 mrg return;
4848 1.1 mrg }
4849 1.1 mrg
4850 1.1 mrg if (frame_pointer_needed)
4851 1.1 mrg {
4852 1.1 mrg /* Restore fpu registers. */
4853 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
4854 1.1 mrg {
4855 1.1 mrg int gpr_padding = cfun->machine->callee_saved_area_gpr_padding_bytes;
4856 1.1 mrg
4857 1.1 mrg /* adjust $sp = $fp - ($fp size) - ($gp size) - ($lp size)
4858 1.1 mrg - (4 * callee-saved-registers)
4859 1.1 mrg - (4 * exception-handling-data-registers)
4860 1.1 mrg - (4 * callee-saved-gpr-registers padding byte)
4861 1.1 mrg - (4 * callee-saved-fpr-registers)
4862 1.1 mrg Note: we want to adjust stack pointer
4863 1.1 mrg to the position for callee-saved fpr register,
4864 1.1 mrg And restore fpu register use .bi instruction to adjust $sp
4865 1.1 mrg from callee-saved fpr register to pop instruction. */
4866 1.1 mrg sp_adjust = cfun->machine->fp_size
4867 1.1 mrg + cfun->machine->gp_size
4868 1.1 mrg + cfun->machine->lp_size
4869 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
4870 1.1 mrg + cfun->machine->eh_return_data_regs_size
4871 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
4872 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
4873 1.1 mrg
4874 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4875 1.1 mrg hard_frame_pointer_rtx,
4876 1.1 mrg -1 * sp_adjust);
4877 1.1 mrg
4878 1.1 mrg /* Emit fpu load instruction, using .bi instruction
4879 1.1 mrg load fpu registers. */
4880 1.1 mrg nds32_emit_pop_fpr_callee_saved (gpr_padding);
4881 1.1 mrg }
4882 1.1 mrg else
4883 1.1 mrg {
4884 1.1 mrg /* adjust $sp = $fp - ($fp size) - ($gp size) - ($lp size)
4885 1.1 mrg - (4 * callee-saved-registers)
4886 1.1 mrg - (4 * exception-handling-data-registers)
4887 1.1 mrg Note: No need to adjust
4888 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes,
4889 1.1 mrg because we want to adjust stack pointer
4890 1.1 mrg to the position for pop instruction. */
4891 1.1 mrg sp_adjust = cfun->machine->fp_size
4892 1.1 mrg + cfun->machine->gp_size
4893 1.1 mrg + cfun->machine->lp_size
4894 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
4895 1.1 mrg + cfun->machine->eh_return_data_regs_size;
4896 1.1 mrg
4897 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4898 1.1 mrg hard_frame_pointer_rtx,
4899 1.1 mrg -1 * sp_adjust);
4900 1.1 mrg }
4901 1.1 mrg }
4902 1.1 mrg else
4903 1.1 mrg {
4904 1.1 mrg /* Restore fpu registers. */
4905 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
4906 1.1 mrg {
4907 1.1 mrg int gpr_padding = cfun->machine->callee_saved_area_gpr_padding_bytes;
4908 1.1 mrg
4909 1.1 mrg /* Adjust $sp = $sp + local_size + out_args_size. */
4910 1.1 mrg sp_adjust = cfun->machine->local_size
4911 1.1 mrg + cfun->machine->out_args_size;
4912 1.1 mrg
4913 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4914 1.1 mrg stack_pointer_rtx,
4915 1.1 mrg sp_adjust);
4916 1.1 mrg
4917 1.1 mrg /* Emit fpu load instruction, using .bi instruction
4918 1.1 mrg load fpu registers, and adjust $sp from callee-saved fpr register
4919 1.1 mrg to callee-saved gpr register. */
4920 1.1 mrg nds32_emit_pop_fpr_callee_saved (gpr_padding);
4921 1.1 mrg }
4922 1.1 mrg else
4923 1.1 mrg {
4924 1.1 mrg /* If frame pointer is NOT needed,
4925 1.1 mrg we cannot calculate the sp adjustment from frame pointer.
4926 1.1 mrg Instead, we calculate the adjustment by local_size,
4927 1.1 mrg out_args_size, and callee_saved_area_gpr_padding_bytes.
4928 1.1 mrg Notice that such sp adjustment value may be out of range,
4929 1.1 mrg so we have to deal with it as well. */
4930 1.1 mrg
4931 1.1 mrg /* Adjust $sp = $sp + local_size + out_args_size
4932 1.1 mrg + callee_saved_area_gpr_padding_bytes. */
4933 1.1 mrg sp_adjust = cfun->machine->local_size
4934 1.1 mrg + cfun->machine->out_args_size
4935 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes;
4936 1.1 mrg
4937 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4938 1.1 mrg stack_pointer_rtx,
4939 1.1 mrg sp_adjust);
4940 1.1 mrg }
4941 1.1 mrg }
4942 1.1 mrg
4943 1.1 mrg /* Restore eh data registers. */
4944 1.1 mrg if (cfun->machine->use_eh_return_p)
4945 1.1 mrg {
4946 1.1 mrg Rb = cfun->machine->eh_return_data_first_regno;
4947 1.1 mrg Re = cfun->machine->eh_return_data_last_regno;
4948 1.1 mrg
4949 1.1 mrg /* No need to pop $fp, $gp, or $lp. */
4950 1.1 mrg nds32_emit_stack_pop_multiple (Rb, Re, false, false, false);
4951 1.1 mrg }
4952 1.1 mrg
4953 1.1 mrg /* Get callee_first_regno and callee_last_regno. */
4954 1.1 mrg Rb = cfun->machine->callee_saved_first_gpr_regno;
4955 1.1 mrg Re = cfun->machine->callee_saved_last_gpr_regno;
4956 1.1 mrg
4957 1.1 mrg /* If $fp, $gp, $lp, and all callee-save registers are NOT required
4958 1.1 mrg to be saved, we don't have to create multiple pop instruction.
4959 1.1 mrg Otherwise, a multiple pop instruction is needed. */
4960 1.1 mrg if (!(Rb == SP_REGNUM && Re == SP_REGNUM
4961 1.1 mrg && cfun->machine->fp_size == 0
4962 1.1 mrg && cfun->machine->gp_size == 0
4963 1.1 mrg && cfun->machine->lp_size == 0))
4964 1.1 mrg {
4965 1.1 mrg /* Create multiple pop instruction rtx. */
4966 1.1 mrg nds32_emit_stack_pop_multiple (
4967 1.1 mrg Rb, Re,
4968 1.1 mrg cfun->machine->fp_size, cfun->machine->gp_size, cfun->machine->lp_size);
4969 1.1 mrg }
4970 1.1 mrg
4971 1.1 mrg /* If this is a variadic function, we do not have to restore argument
4972 1.1 mrg registers but need to adjust stack pointer back to previous stack
4973 1.1 mrg frame location before return. */
4974 1.1 mrg if (cfun->machine->va_args_size != 0)
4975 1.1 mrg {
4976 1.1 mrg /* Generate sp adjustment instruction.
4977 1.1 mrg We need to consider padding bytes here. */
4978 1.1 mrg sp_adjust = cfun->machine->va_args_size
4979 1.1 mrg + cfun->machine->va_args_area_padding_bytes;
4980 1.1 mrg
4981 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
4982 1.1 mrg stack_pointer_rtx,
4983 1.1 mrg sp_adjust);
4984 1.1 mrg }
4985 1.1 mrg
4986 1.1 mrg /* If this function uses __builtin_eh_return, make stack adjustment
4987 1.1 mrg for exception handler. */
4988 1.1 mrg if (cfun->machine->use_eh_return_p)
4989 1.1 mrg {
4990 1.1 mrg /* We need to unwind the stack by the offset computed by
4991 1.1 mrg EH_RETURN_STACKADJ_RTX. However, at this point the CFA is
4992 1.1 mrg based on SP. Ideally we would update the SP and define the
4993 1.1 mrg CFA along the lines of:
4994 1.1 mrg
4995 1.1 mrg SP = SP + EH_RETURN_STACKADJ_RTX
4996 1.1 mrg (regnote CFA = SP - EH_RETURN_STACKADJ_RTX)
4997 1.1 mrg
4998 1.1 mrg However the dwarf emitter only understands a constant
4999 1.1 mrg register offset.
5000 1.1 mrg
5001 1.1 mrg The solution chosen here is to use the otherwise $ta ($r15)
5002 1.1 mrg as a temporary register to hold the current SP value. The
5003 1.1 mrg CFA is described using $ta then SP is modified. */
5004 1.1 mrg
5005 1.1 mrg rtx ta_reg;
5006 1.1 mrg rtx insn;
5007 1.1 mrg
5008 1.1 mrg ta_reg = gen_rtx_REG (SImode, TA_REGNUM);
5009 1.1 mrg
5010 1.1 mrg insn = emit_move_insn (ta_reg, stack_pointer_rtx);
5011 1.1 mrg add_reg_note (insn, REG_CFA_DEF_CFA, ta_reg);
5012 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
5013 1.1 mrg
5014 1.1 mrg emit_insn (gen_addsi3 (stack_pointer_rtx,
5015 1.1 mrg stack_pointer_rtx,
5016 1.1 mrg EH_RETURN_STACKADJ_RTX));
5017 1.1 mrg
5018 1.1 mrg /* Ensure the assignment to $ta does not get optimized away. */
5019 1.1 mrg emit_use (ta_reg);
5020 1.1 mrg }
5021 1.1 mrg
5022 1.1 mrg /* Generate return instruction. */
5023 1.1 mrg if (!sibcall_p)
5024 1.1 mrg emit_jump_insn (gen_return_internal ());
5025 1.1 mrg }
5026 1.1 mrg
5027 1.1 mrg /* Function for v3push prologue. */
5028 1.1 mrg void
5029 1.1 mrg nds32_expand_prologue_v3push (void)
5030 1.1 mrg {
5031 1.1 mrg int fp_adjust;
5032 1.1 mrg int sp_adjust;
5033 1.1 mrg int fpr_space = 0;
5034 1.1 mrg unsigned Rb, Re;
5035 1.1 mrg
5036 1.1 mrg /* Compute and setup stack frame size.
5037 1.1 mrg The result will be in cfun->machine. */
5038 1.1 mrg nds32_compute_stack_frame ();
5039 1.1 mrg
5040 1.1 mrg if (cfun->machine->callee_saved_gpr_regs_size > 0)
5041 1.1 mrg df_set_regs_ever_live (FP_REGNUM, 1);
5042 1.1 mrg
5043 1.1 mrg /* Check frame_pointer_needed again to prevent fp is need after reload. */
5044 1.1 mrg if (frame_pointer_needed)
5045 1.1 mrg cfun->machine->fp_as_gp_p = false;
5046 1.1 mrg
5047 1.1 mrg /* If the function is 'naked',
5048 1.1 mrg we do not have to generate prologue code fragment. */
5049 1.1 mrg if (cfun->machine->naked_p && !flag_pic)
5050 1.1 mrg return;
5051 1.1 mrg
5052 1.1 mrg /* Get callee_first_regno and callee_last_regno. */
5053 1.1 mrg Rb = cfun->machine->callee_saved_first_gpr_regno;
5054 1.1 mrg Re = cfun->machine->callee_saved_last_gpr_regno;
5055 1.1 mrg
5056 1.1 mrg /* Calculate sp_adjust first to test if 'push25 Re,imm8u' is available,
5057 1.1 mrg where imm8u has to be 8-byte alignment. */
5058 1.1 mrg sp_adjust = cfun->machine->local_size
5059 1.1 mrg + cfun->machine->out_args_size
5060 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
5061 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5062 1.1 mrg
5063 1.1 mrg if (satisfies_constraint_Iu08 (GEN_INT (sp_adjust))
5064 1.1 mrg && NDS32_DOUBLE_WORD_ALIGN_P (sp_adjust))
5065 1.1 mrg {
5066 1.1 mrg /* We can use 'push25 Re,imm8u'. */
5067 1.1 mrg
5068 1.1 mrg /* nds32_emit_stack_v3push(last_regno, sp_adjust),
5069 1.1 mrg the pattern 'stack_v3push' is implemented in nds32.md. */
5070 1.1 mrg nds32_emit_stack_v3push (Rb, Re, sp_adjust);
5071 1.1 mrg
5072 1.1 mrg /* Save fpu registers. */
5073 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5074 1.1 mrg {
5075 1.1 mrg /* Calculate fpr position. */
5076 1.1 mrg int fpr_position = cfun->machine->local_size
5077 1.1 mrg + cfun->machine->out_args_size;
5078 1.1 mrg /* Emit fpu store instruction, using [$sp + offset] store
5079 1.1 mrg fpu registers. */
5080 1.1 mrg nds32_emit_push_fpr_callee_saved (fpr_position);
5081 1.1 mrg }
5082 1.1 mrg
5083 1.1 mrg /* Check frame_pointer_needed to see
5084 1.1 mrg if we shall emit fp adjustment instruction. */
5085 1.1 mrg if (frame_pointer_needed)
5086 1.1 mrg {
5087 1.1 mrg /* adjust $fp = $sp + 4 ($fp size)
5088 1.1 mrg + 4 ($gp size)
5089 1.1 mrg + 4 ($lp size)
5090 1.1 mrg + (4 * n) (callee-saved registers)
5091 1.1 mrg + sp_adjust ('push25 Re,imm8u')
5092 1.1 mrg Note: Since we use 'push25 Re,imm8u',
5093 1.1 mrg the position of stack pointer is further
5094 1.1 mrg changed after push instruction.
5095 1.1 mrg Hence, we need to take sp_adjust value
5096 1.1 mrg into consideration. */
5097 1.1 mrg fp_adjust = cfun->machine->fp_size
5098 1.1 mrg + cfun->machine->gp_size
5099 1.1 mrg + cfun->machine->lp_size
5100 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size
5101 1.1 mrg + sp_adjust;
5102 1.1 mrg
5103 1.1 mrg nds32_emit_adjust_frame (hard_frame_pointer_rtx,
5104 1.1 mrg stack_pointer_rtx,
5105 1.1 mrg fp_adjust);
5106 1.1 mrg }
5107 1.1 mrg }
5108 1.1 mrg else
5109 1.1 mrg {
5110 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5111 1.1 mrg {
5112 1.1 mrg /* Calculate fpr space. */
5113 1.1 mrg fpr_space = cfun->machine->callee_saved_area_gpr_padding_bytes
5114 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5115 1.1 mrg
5116 1.1 mrg /* We have to use 'push25 Re, fpr_space', to pre-allocate
5117 1.1 mrg callee saved fpr registers space. */
5118 1.1 mrg nds32_emit_stack_v3push (Rb, Re, fpr_space);
5119 1.1 mrg nds32_emit_push_fpr_callee_saved (0);
5120 1.1 mrg }
5121 1.1 mrg else
5122 1.1 mrg {
5123 1.1 mrg /* We have to use 'push25 Re,0' and
5124 1.1 mrg expand one more instruction to adjust $sp later. */
5125 1.1 mrg
5126 1.1 mrg /* nds32_emit_stack_v3push(last_regno, sp_adjust),
5127 1.1 mrg the pattern 'stack_v3push' is implemented in nds32.md. */
5128 1.1 mrg nds32_emit_stack_v3push (Rb, Re, 0);
5129 1.1 mrg }
5130 1.1 mrg
5131 1.1 mrg /* Check frame_pointer_needed to see
5132 1.1 mrg if we shall emit fp adjustment instruction. */
5133 1.1 mrg if (frame_pointer_needed)
5134 1.1 mrg {
5135 1.1 mrg /* adjust $fp = $sp + 4 ($fp size)
5136 1.1 mrg + 4 ($gp size)
5137 1.1 mrg + 4 ($lp size)
5138 1.1 mrg + (4 * n) (callee-saved registers)
5139 1.1 mrg Note: Since we use 'push25 Re,0',
5140 1.1 mrg the stack pointer is just at the position
5141 1.1 mrg after push instruction.
5142 1.1 mrg No need to take sp_adjust into consideration. */
5143 1.1 mrg fp_adjust = cfun->machine->fp_size
5144 1.1 mrg + cfun->machine->gp_size
5145 1.1 mrg + cfun->machine->lp_size
5146 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size;
5147 1.1 mrg
5148 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5149 1.1 mrg {
5150 1.1 mrg /* We use 'push25 Re, fpr_space', the $sp is
5151 1.1 mrg on callee saved fpr position, so need to consider
5152 1.1 mrg fpr space. */
5153 1.1 mrg fp_adjust = fp_adjust + fpr_space;
5154 1.1 mrg }
5155 1.1 mrg
5156 1.1 mrg nds32_emit_adjust_frame (hard_frame_pointer_rtx,
5157 1.1 mrg stack_pointer_rtx,
5158 1.1 mrg fp_adjust);
5159 1.1 mrg }
5160 1.1 mrg
5161 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5162 1.1 mrg {
5163 1.1 mrg /* We use 'push25 Re, fpr_space',
5164 1.1 mrg the $sp is on callee saved fpr position,
5165 1.1 mrg no need to consider fpr space. */
5166 1.1 mrg sp_adjust = sp_adjust - fpr_space;
5167 1.1 mrg }
5168 1.1 mrg
5169 1.1 mrg /* Because we use 'push25 Re,0',
5170 1.1 mrg we need to expand one more instruction to adjust $sp.
5171 1.1 mrg using NEGATIVE value to tell that we are decreasing address. */
5172 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
5173 1.1 mrg stack_pointer_rtx,
5174 1.1 mrg -1 * sp_adjust);
5175 1.1 mrg }
5176 1.1 mrg
5177 1.1 mrg /* Emit gp setup instructions for -fpic. */
5178 1.1 mrg if (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
5179 1.1 mrg nds32_emit_load_gp ();
5180 1.1 mrg
5181 1.1 mrg /* Prevent the instruction scheduler from
5182 1.1 mrg moving instructions across the boundary. */
5183 1.1 mrg emit_insn (gen_blockage ());
5184 1.1 mrg }
5185 1.1 mrg
5186 1.1 mrg /* Function for v3pop epilogue. */
5187 1.1 mrg void
5188 1.1 mrg nds32_expand_epilogue_v3pop (bool sibcall_p)
5189 1.1 mrg {
5190 1.1 mrg int sp_adjust;
5191 1.1 mrg unsigned Rb, Re;
5192 1.1 mrg
5193 1.1 mrg /* Compute and setup stack frame size.
5194 1.1 mrg The result will be in cfun->machine. */
5195 1.1 mrg nds32_compute_stack_frame ();
5196 1.1 mrg
5197 1.1 mrg /* Prevent the instruction scheduler from
5198 1.1 mrg moving instructions across the boundary. */
5199 1.1 mrg emit_insn (gen_blockage ());
5200 1.1 mrg
5201 1.1 mrg /* If the function is 'naked', we do not have to generate
5202 1.1 mrg epilogue code fragment BUT 'ret' instruction. */
5203 1.1 mrg if (cfun->machine->naked_p)
5204 1.1 mrg {
5205 1.1 mrg /* Generate return instruction by using 'return_internal' pattern.
5206 1.1 mrg Make sure this instruction is after gen_blockage().
5207 1.1 mrg First we need to check this is a function without sibling call. */
5208 1.1 mrg if (!sibcall_p)
5209 1.1 mrg {
5210 1.1 mrg /* We need to further check attributes to determine whether
5211 1.1 mrg there should be return instruction at epilogue.
5212 1.1 mrg If the attribute naked exists but -mno-ret-in-naked-func
5213 1.1 mrg is issued, there is NO need to generate return instruction. */
5214 1.1 mrg if (cfun->machine->attr_naked_p && !flag_ret_in_naked_func)
5215 1.1 mrg return;
5216 1.1 mrg
5217 1.1 mrg emit_jump_insn (gen_return_internal ());
5218 1.1 mrg }
5219 1.1 mrg return;
5220 1.1 mrg }
5221 1.1 mrg
5222 1.1 mrg /* Get callee_first_regno and callee_last_regno. */
5223 1.1 mrg Rb = cfun->machine->callee_saved_first_gpr_regno;
5224 1.1 mrg Re = cfun->machine->callee_saved_last_gpr_regno;
5225 1.1 mrg
5226 1.1 mrg /* Calculate sp_adjust first to test if 'pop25 Re,imm8u' is available,
5227 1.1 mrg where imm8u has to be 8-byte alignment. */
5228 1.1 mrg sp_adjust = cfun->machine->local_size
5229 1.1 mrg + cfun->machine->out_args_size
5230 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
5231 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5232 1.1 mrg
5233 1.1 mrg /* We have to consider alloca issue as well.
5234 1.1 mrg If the function does call alloca(), the stack pointer is not fixed.
5235 1.1 mrg In that case, we cannot use 'pop25 Re,imm8u' directly.
5236 1.1 mrg We have to caculate stack pointer from frame pointer
5237 1.1 mrg and then use 'pop25 Re,0'.
5238 1.1 mrg Of course, the frame_pointer_needed should be nonzero
5239 1.1 mrg if the function calls alloca(). */
5240 1.1 mrg if (satisfies_constraint_Iu08 (GEN_INT (sp_adjust))
5241 1.1 mrg && NDS32_DOUBLE_WORD_ALIGN_P (sp_adjust)
5242 1.1 mrg && !cfun->calls_alloca)
5243 1.1 mrg {
5244 1.1 mrg /* Restore fpu registers. */
5245 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5246 1.1 mrg {
5247 1.1 mrg int fpr_position = cfun->machine->local_size
5248 1.1 mrg + cfun->machine->out_args_size;
5249 1.1 mrg /* Emit fpu load instruction, using [$sp + offset] restore
5250 1.1 mrg fpu registers. */
5251 1.1 mrg nds32_emit_v3pop_fpr_callee_saved (fpr_position);
5252 1.1 mrg }
5253 1.1 mrg
5254 1.1 mrg /* We can use 'pop25 Re,imm8u'. */
5255 1.1 mrg
5256 1.1 mrg /* nds32_emit_stack_v3pop(last_regno, sp_adjust),
5257 1.1 mrg the pattern 'stack_v3pop' is implementad in nds32.md. */
5258 1.1 mrg nds32_emit_stack_v3pop (Rb, Re, sp_adjust);
5259 1.1 mrg }
5260 1.1 mrg else
5261 1.1 mrg {
5262 1.1 mrg /* We have to use 'pop25 Re,0', and prior to it,
5263 1.1 mrg we must expand one more instruction to adjust $sp. */
5264 1.1 mrg
5265 1.1 mrg if (frame_pointer_needed)
5266 1.1 mrg {
5267 1.1 mrg /* adjust $sp = $fp - 4 ($fp size)
5268 1.1 mrg - 4 ($gp size)
5269 1.1 mrg - 4 ($lp size)
5270 1.1 mrg - (4 * n) (callee-saved registers)
5271 1.1 mrg Note: No need to adjust
5272 1.1 mrg cfun->machine->callee_saved_area_gpr_padding_bytes,
5273 1.1 mrg because we want to adjust stack pointer
5274 1.1 mrg to the position for pop instruction. */
5275 1.1 mrg sp_adjust = cfun->machine->fp_size
5276 1.1 mrg + cfun->machine->gp_size
5277 1.1 mrg + cfun->machine->lp_size
5278 1.1 mrg + cfun->machine->callee_saved_gpr_regs_size;
5279 1.1 mrg
5280 1.1 mrg /* Restore fpu registers. */
5281 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5282 1.1 mrg {
5283 1.1 mrg /* Set $sp to callee saved fpr position, we need to restore
5284 1.1 mrg fpr registers. */
5285 1.1 mrg sp_adjust = sp_adjust
5286 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
5287 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5288 1.1 mrg
5289 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
5290 1.1 mrg hard_frame_pointer_rtx,
5291 1.1 mrg -1 * sp_adjust);
5292 1.1 mrg
5293 1.1 mrg /* Emit fpu load instruction, using [$sp + offset] restore
5294 1.1 mrg fpu registers. */
5295 1.1 mrg nds32_emit_v3pop_fpr_callee_saved (0);
5296 1.1 mrg }
5297 1.1 mrg else
5298 1.1 mrg {
5299 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
5300 1.1 mrg hard_frame_pointer_rtx,
5301 1.1 mrg -1 * sp_adjust);
5302 1.1 mrg }
5303 1.1 mrg }
5304 1.1 mrg else
5305 1.1 mrg {
5306 1.1 mrg /* If frame pointer is NOT needed,
5307 1.1 mrg we cannot calculate the sp adjustment from frame pointer.
5308 1.1 mrg Instead, we calculate the adjustment by local_size,
5309 1.1 mrg out_args_size, and callee_saved_area_padding_bytes.
5310 1.1 mrg Notice that such sp adjustment value may be out of range,
5311 1.1 mrg so we have to deal with it as well. */
5312 1.1 mrg
5313 1.1 mrg /* Adjust $sp = $sp + local_size + out_args_size
5314 1.1 mrg + callee_saved_area_gpr_padding_bytes
5315 1.1 mrg + callee_saved_fpr_regs_size. */
5316 1.1 mrg sp_adjust = cfun->machine->local_size
5317 1.1 mrg + cfun->machine->out_args_size
5318 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
5319 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5320 1.1 mrg
5321 1.1 mrg /* Restore fpu registers. */
5322 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5323 1.1 mrg {
5324 1.1 mrg /* Set $sp to callee saved fpr position, we need to restore
5325 1.1 mrg fpr registers. */
5326 1.1 mrg sp_adjust = sp_adjust
5327 1.1 mrg - cfun->machine->callee_saved_area_gpr_padding_bytes
5328 1.1 mrg - cfun->machine->callee_saved_fpr_regs_size;
5329 1.1 mrg
5330 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
5331 1.1 mrg stack_pointer_rtx,
5332 1.1 mrg sp_adjust);
5333 1.1 mrg
5334 1.1 mrg /* Emit fpu load instruction, using [$sp + offset] restore
5335 1.1 mrg fpu registers. */
5336 1.1 mrg nds32_emit_v3pop_fpr_callee_saved (0);
5337 1.1 mrg }
5338 1.1 mrg else
5339 1.1 mrg {
5340 1.1 mrg /* sp_adjust value may be out of range of the addi instruction,
5341 1.1 mrg create alternative add behavior with TA_REGNUM if necessary,
5342 1.1 mrg using POSITIVE value to tell that we are increasing
5343 1.1 mrg address. */
5344 1.1 mrg nds32_emit_adjust_frame (stack_pointer_rtx,
5345 1.1 mrg stack_pointer_rtx,
5346 1.1 mrg sp_adjust);
5347 1.1 mrg }
5348 1.1 mrg }
5349 1.1 mrg
5350 1.1 mrg if (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)
5351 1.1 mrg {
5352 1.1 mrg /* We have fpr need to restore, so $sp is set on callee saved fpr
5353 1.1 mrg position. And we use 'pop25 Re, fpr_space' to adjust $sp. */
5354 1.1 mrg int fpr_space = cfun->machine->callee_saved_area_gpr_padding_bytes
5355 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5356 1.1 mrg nds32_emit_stack_v3pop (Rb, Re, fpr_space);
5357 1.1 mrg }
5358 1.1 mrg else
5359 1.1 mrg {
5360 1.1 mrg /* nds32_emit_stack_v3pop(last_regno, sp_adjust),
5361 1.1 mrg the pattern 'stack_v3pop' is implementad in nds32.md. */
5362 1.1 mrg nds32_emit_stack_v3pop (Rb, Re, 0);
5363 1.1 mrg }
5364 1.1 mrg }
5365 1.1 mrg /* Generate return instruction. */
5366 1.1 mrg emit_jump_insn (gen_pop25return ());
5367 1.1 mrg }
5368 1.1 mrg
5369 1.1 mrg /* Return nonzero if this function is known to have a null epilogue.
5370 1.1 mrg This allows the optimizer to omit jumps to jumps if no stack
5371 1.1 mrg was created. */
5372 1.1 mrg int
5373 1.1 mrg nds32_can_use_return_insn (void)
5374 1.1 mrg {
5375 1.1 mrg int sp_adjust;
5376 1.1 mrg
5377 1.1 mrg /* Prior to reloading, we can't tell how many registers must be saved.
5378 1.1 mrg Thus we cannot determine whether this function has null epilogue. */
5379 1.1 mrg if (!reload_completed)
5380 1.1 mrg return 0;
5381 1.1 mrg
5382 1.1 mrg /* If attribute 'naked' appears but -mno-ret-in-naked-func is used,
5383 1.1 mrg we cannot use return instruction. */
5384 1.1 mrg if (cfun->machine->attr_naked_p && !flag_ret_in_naked_func)
5385 1.1 mrg return 0;
5386 1.1 mrg
5387 1.1 mrg sp_adjust = cfun->machine->local_size
5388 1.1 mrg + cfun->machine->out_args_size
5389 1.1 mrg + cfun->machine->callee_saved_area_gpr_padding_bytes
5390 1.1 mrg + cfun->machine->callee_saved_fpr_regs_size;
5391 1.1 mrg if (!cfun->machine->fp_as_gp_p
5392 1.1 mrg && satisfies_constraint_Iu08 (GEN_INT (sp_adjust))
5393 1.1 mrg && NDS32_DOUBLE_WORD_ALIGN_P (sp_adjust)
5394 1.1 mrg && !cfun->calls_alloca
5395 1.1 mrg && NDS32_V3PUSH_AVAILABLE_P
5396 1.1 mrg && !(TARGET_HARD_FLOAT
5397 1.1 mrg && (cfun->machine->callee_saved_first_fpr_regno != SP_REGNUM)))
5398 1.1 mrg return 1;
5399 1.1 mrg
5400 1.1 mrg /* If no stack was created, two conditions must be satisfied:
5401 1.1 mrg 1. This is a naked function.
5402 1.1 mrg So there is no callee-saved, local size, or outgoing size.
5403 1.1 mrg 2. This is NOT a variadic function.
5404 1.1 mrg So there is no pushing arguement registers into the stack. */
5405 1.1 mrg return (cfun->machine->naked_p && (cfun->machine->va_args_size == 0));
5406 1.1 mrg }
5407 1.1 mrg
5408 1.1 mrg scalar_int_mode
5409 1.1 mrg nds32_case_vector_shorten_mode (int min_offset, int max_offset,
5410 1.1 mrg rtx body ATTRIBUTE_UNUSED)
5411 1.1 mrg {
5412 1.1 mrg if (min_offset < 0 || max_offset >= 0x2000)
5413 1.1 mrg return SImode;
5414 1.1 mrg else
5415 1.1 mrg {
5416 1.1 mrg /* The jump table maybe need to 2 byte alignment,
5417 1.1 mrg so reserved 1 byte for check max_offset. */
5418 1.1 mrg if (max_offset >= 0xff)
5419 1.1 mrg return HImode;
5420 1.1 mrg else
5421 1.1 mrg return QImode;
5422 1.1 mrg }
5423 1.1 mrg }
5424 1.1 mrg
5425 1.1 mrg /* ------------------------------------------------------------------------ */
5426 1.1 mrg
5427 1.1 mrg /* Return alignment for the label. */
5428 1.1 mrg int
5429 1.1 mrg nds32_target_alignment (rtx_insn *label)
5430 1.1 mrg {
5431 1.1 mrg rtx_insn *insn;
5432 1.1 mrg
5433 1.1 mrg if (!NDS32_ALIGN_P ())
5434 1.1 mrg return 0;
5435 1.1 mrg
5436 1.1 mrg insn = next_active_insn (label);
5437 1.1 mrg
5438 1.1 mrg /* Always align to 4 byte when first instruction after label is jump
5439 1.1 mrg instruction since length for that might changed, so let's always align
5440 1.1 mrg it for make sure we don't lose any perfomance here. */
5441 1.1 mrg if (insn == 0
5442 1.1 mrg || (get_attr_length (insn) == 2
5443 1.1 mrg && !JUMP_P (insn) && !CALL_P (insn)))
5444 1.1 mrg return 0;
5445 1.1 mrg else
5446 1.1 mrg return 2;
5447 1.1 mrg }
5448 1.1 mrg
5449 1.1 mrg /* Return alignment for data. */
5450 1.1 mrg unsigned int
5451 1.1 mrg nds32_data_alignment (tree data,
5452 1.1 mrg unsigned int basic_align)
5453 1.1 mrg {
5454 1.1 mrg if ((basic_align < BITS_PER_WORD)
5455 1.1 mrg && (TREE_CODE (data) == ARRAY_TYPE
5456 1.1 mrg || TREE_CODE (data) == UNION_TYPE
5457 1.1 mrg || TREE_CODE (data) == RECORD_TYPE))
5458 1.1 mrg return BITS_PER_WORD;
5459 1.1 mrg else
5460 1.1 mrg return basic_align;
5461 1.1 mrg }
5462 1.1 mrg
5463 1.1 mrg /* Return alignment for constant value. */
5464 1.1 mrg static HOST_WIDE_INT
5465 1.1 mrg nds32_constant_alignment (const_tree constant,
5466 1.1 mrg HOST_WIDE_INT basic_align)
5467 1.1 mrg {
5468 1.1 mrg /* Make string literal and constant for constructor to word align. */
5469 1.1 mrg if (((TREE_CODE (constant) == STRING_CST
5470 1.1 mrg || TREE_CODE (constant) == CONSTRUCTOR
5471 1.1 mrg || TREE_CODE (constant) == UNION_TYPE
5472 1.1 mrg || TREE_CODE (constant) == RECORD_TYPE
5473 1.1 mrg || TREE_CODE (constant) == ARRAY_TYPE)
5474 1.1 mrg && basic_align < BITS_PER_WORD))
5475 1.1 mrg return BITS_PER_WORD;
5476 1.1 mrg else
5477 1.1 mrg return basic_align;
5478 1.1 mrg }
5479 1.1 mrg
5480 1.1 mrg /* Return alignment for local variable. */
5481 1.1 mrg unsigned int
5482 1.1 mrg nds32_local_alignment (tree local ATTRIBUTE_UNUSED,
5483 1.1 mrg unsigned int basic_align)
5484 1.1 mrg {
5485 1.1 mrg bool at_least_align_to_word = false;
5486 1.1 mrg /* Make local array, struct and union at least align to word for make
5487 1.1 mrg sure it can unroll memcpy when initialize by constant. */
5488 1.1 mrg switch (TREE_CODE (local))
5489 1.1 mrg {
5490 1.1 mrg case ARRAY_TYPE:
5491 1.1 mrg case RECORD_TYPE:
5492 1.1 mrg case UNION_TYPE:
5493 1.1 mrg at_least_align_to_word = true;
5494 1.1 mrg break;
5495 1.1 mrg default:
5496 1.1 mrg at_least_align_to_word = false;
5497 1.1 mrg break;
5498 1.1 mrg }
5499 1.1 mrg if (at_least_align_to_word
5500 1.1 mrg && (basic_align < BITS_PER_WORD))
5501 1.1 mrg return BITS_PER_WORD;
5502 1.1 mrg else
5503 1.1 mrg return basic_align;
5504 1.1 mrg }
5505 1.1 mrg
5506 1.1 mrg bool
5507 1.1 mrg nds32_split_double_word_load_store_p(rtx *operands, bool load_p)
5508 1.1 mrg {
5509 1.1 mrg rtx mem = load_p ? operands[1] : operands[0];
5510 1.1 mrg /* Do split at split2 if -O0 or schedule 2 not enable. */
5511 1.1 mrg if (optimize == 0 || !flag_schedule_insns_after_reload)
5512 1.1 mrg return !satisfies_constraint_Da (mem) || MEM_VOLATILE_P (mem);
5513 1.1 mrg
5514 1.1 mrg /* Split double word load store after copy propgation. */
5515 1.1 mrg if (current_pass == NULL)
5516 1.1 mrg return false;
5517 1.1 mrg
5518 1.1 mrg const char *pass_name = current_pass->name;
5519 1.1 mrg if (pass_name && ((strcmp (pass_name, "split3") == 0)
5520 1.1 mrg || (strcmp (pass_name, "split5") == 0)))
5521 1.1 mrg return !satisfies_constraint_Da (mem) || MEM_VOLATILE_P (mem);
5522 1.1 mrg
5523 1.1 mrg return false;
5524 1.1 mrg }
5525 1.1 mrg
5526 1.1 mrg static bool
5527 1.1 mrg nds32_use_blocks_for_constant_p (machine_mode mode,
5528 1.1 mrg const_rtx x ATTRIBUTE_UNUSED)
5529 1.1 mrg {
5530 1.1 mrg if ((TARGET_FPU_SINGLE || TARGET_FPU_DOUBLE)
5531 1.1 mrg && (mode == DFmode || mode == SFmode))
5532 1.1 mrg return true;
5533 1.1 mrg else
5534 1.1 mrg return false;
5535 1.1 mrg }
5536 1.1 mrg
5537 1.1 mrg /* ------------------------------------------------------------------------ */
5538 1.1 mrg
5539 1.1 mrg /* PART 5: Initialize target hook structure and definitions. */
5540 1.1 mrg
5541 1.1 mrg /* Controlling the Compilation Driver. */
5543 1.1 mrg
5544 1.1 mrg
5545 1.1 mrg /* Run-time Target Specification. */
5547 1.1 mrg
5548 1.1 mrg
5549 1.1 mrg /* Defining Data Structures for Per-function Information. */
5551 1.1 mrg
5552 1.1 mrg
5553 1.1 mrg /* Storage Layout. */
5555 1.1 mrg
5556 1.1 mrg #undef TARGET_PROMOTE_FUNCTION_MODE
5557 1.1 mrg #define TARGET_PROMOTE_FUNCTION_MODE \
5558 1.1 mrg default_promote_function_mode_always_promote
5559 1.1 mrg
5560 1.1 mrg #undef TARGET_EXPAND_TO_RTL_HOOK
5561 1.1 mrg #define TARGET_EXPAND_TO_RTL_HOOK nds32_expand_to_rtl_hook
5562 1.1 mrg
5563 1.1 mrg #undef TARGET_CONSTANT_ALIGNMENT
5564 1.1 mrg #define TARGET_CONSTANT_ALIGNMENT nds32_constant_alignment
5565 1.1 mrg
5566 1.1 mrg
5567 1.1 mrg /* Layout of Source Language Data Types. */
5569 1.1 mrg
5570 1.1 mrg
5571 1.1 mrg /* Register Usage. */
5573 1.1 mrg
5574 1.1 mrg /* -- Basic Characteristics of Registers. */
5575 1.1 mrg
5576 1.1 mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
5577 1.1 mrg #define TARGET_CONDITIONAL_REGISTER_USAGE nds32_conditional_register_usage
5578 1.1 mrg
5579 1.1 mrg /* -- Order of Allocation of Registers. */
5580 1.1 mrg
5581 1.1 mrg /* -- How Values Fit in Registers. */
5582 1.1 mrg
5583 1.1 mrg #undef TARGET_HARD_REGNO_NREGS
5584 1.1 mrg #define TARGET_HARD_REGNO_NREGS nds32_hard_regno_nregs
5585 1.1 mrg
5586 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK
5587 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK nds32_hard_regno_mode_ok
5588 1.1 mrg
5589 1.1 mrg #undef TARGET_MODES_TIEABLE_P
5590 1.1 mrg #define TARGET_MODES_TIEABLE_P nds32_modes_tieable_p
5591 1.1 mrg
5592 1.1 mrg /* -- Handling Leaf Functions. */
5593 1.1 mrg
5594 1.1 mrg /* -- Registers That Form a Stack. */
5595 1.1 mrg
5596 1.1 mrg
5597 1.1 mrg /* Register Classes. */
5599 1.1 mrg
5600 1.1 mrg #undef TARGET_CLASS_MAX_NREGS
5601 1.1 mrg #define TARGET_CLASS_MAX_NREGS nds32_class_max_nregs
5602 1.1 mrg
5603 1.1 mrg #undef TARGET_REGISTER_PRIORITY
5604 1.1 mrg #define TARGET_REGISTER_PRIORITY nds32_register_priority
5605 1.1 mrg
5606 1.1 mrg #undef TARGET_CAN_CHANGE_MODE_CLASS
5607 1.1 mrg #define TARGET_CAN_CHANGE_MODE_CLASS nds32_can_change_mode_class
5608 1.1 mrg
5609 1.1 mrg
5610 1.1 mrg /* Obsolete Macros for Defining Constraints. */
5612 1.1 mrg
5613 1.1 mrg
5614 1.1 mrg /* Stack Layout and Calling Conventions. */
5616 1.1 mrg
5617 1.1 mrg /* -- Basic Stack Layout. */
5618 1.1 mrg
5619 1.1 mrg /* -- Exception Handling Support. */
5620 1.1 mrg
5621 1.1 mrg /* -- Specifying How Stack Checking is Done. */
5622 1.1 mrg
5623 1.1 mrg /* -- Registers That Address the Stack Frame. */
5624 1.1 mrg
5625 1.1 mrg /* -- Eliminating Frame Pointer and Arg Pointer. */
5626 1.1 mrg
5627 1.1 mrg #undef TARGET_CAN_ELIMINATE
5628 1.1 mrg #define TARGET_CAN_ELIMINATE nds32_can_eliminate
5629 1.1 mrg
5630 1.1 mrg /* -- Passing Function Arguments on the Stack. */
5631 1.1 mrg
5632 1.1 mrg /* -- Passing Arguments in Registers. */
5633 1.1 mrg
5634 1.1 mrg #undef TARGET_FUNCTION_ARG
5635 1.1 mrg #define TARGET_FUNCTION_ARG nds32_function_arg
5636 1.1 mrg
5637 1.1 mrg #undef TARGET_MUST_PASS_IN_STACK
5638 1.1 mrg #define TARGET_MUST_PASS_IN_STACK nds32_must_pass_in_stack
5639 1.1 mrg
5640 1.1 mrg #undef TARGET_ARG_PARTIAL_BYTES
5641 1.1 mrg #define TARGET_ARG_PARTIAL_BYTES nds32_arg_partial_bytes
5642 1.1 mrg
5643 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE
5644 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE nds32_function_arg_advance
5645 1.1 mrg
5646 1.1 mrg #undef TARGET_FUNCTION_ARG_BOUNDARY
5647 1.1 mrg #define TARGET_FUNCTION_ARG_BOUNDARY nds32_function_arg_boundary
5648 1.1 mrg
5649 1.1 mrg #undef TARGET_VECTOR_MODE_SUPPORTED_P
5650 1.1 mrg #define TARGET_VECTOR_MODE_SUPPORTED_P nds32_vector_mode_supported_p
5651 1.1 mrg
5652 1.1 mrg /* -- How Scalar Function Values Are Returned. */
5653 1.1 mrg
5654 1.1 mrg #undef TARGET_FUNCTION_VALUE
5655 1.1 mrg #define TARGET_FUNCTION_VALUE nds32_function_value
5656 1.1 mrg
5657 1.1 mrg #undef TARGET_LIBCALL_VALUE
5658 1.1 mrg #define TARGET_LIBCALL_VALUE nds32_libcall_value
5659 1.1 mrg
5660 1.1 mrg #undef TARGET_FUNCTION_VALUE_REGNO_P
5661 1.1 mrg #define TARGET_FUNCTION_VALUE_REGNO_P nds32_function_value_regno_p
5662 1.1 mrg
5663 1.1 mrg /* -- How Large Values Are Returned. */
5664 1.1 mrg
5665 1.1 mrg #undef TARGET_RETURN_IN_MEMORY
5666 1.1 mrg #define TARGET_RETURN_IN_MEMORY nds32_return_in_memory
5667 1.1 mrg
5668 1.1 mrg /* -- Caller-Saves Register Allocation. */
5669 1.1 mrg
5670 1.1 mrg /* -- Function Entry and Exit. */
5671 1.1 mrg
5672 1.1 mrg #undef TARGET_ASM_FUNCTION_PROLOGUE
5673 1.1 mrg #define TARGET_ASM_FUNCTION_PROLOGUE nds32_asm_function_prologue
5674 1.1 mrg
5675 1.1 mrg #undef TARGET_ASM_FUNCTION_END_PROLOGUE
5676 1.1 mrg #define TARGET_ASM_FUNCTION_END_PROLOGUE nds32_asm_function_end_prologue
5677 1.1 mrg
5678 1.1 mrg #undef TARGET_ASM_FUNCTION_BEGIN_EPILOGUE
5679 1.1 mrg #define TARGET_ASM_FUNCTION_BEGIN_EPILOGUE nds32_asm_function_begin_epilogue
5680 1.1 mrg
5681 1.1 mrg #undef TARGET_ASM_FUNCTION_EPILOGUE
5682 1.1 mrg #define TARGET_ASM_FUNCTION_EPILOGUE nds32_asm_function_epilogue
5683 1.1 mrg
5684 1.1 mrg #undef TARGET_ASM_OUTPUT_MI_THUNK
5685 1.1 mrg #define TARGET_ASM_OUTPUT_MI_THUNK nds32_asm_output_mi_thunk
5686 1.1 mrg
5687 1.1 mrg #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
5688 1.1 mrg #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
5689 1.1 mrg
5690 1.1 mrg /* -- Generating Code for Profiling. */
5691 1.1 mrg
5692 1.1 mrg /* -- Permitting tail calls. */
5693 1.1 mrg
5694 1.1 mrg #undef TARGET_FUNCTION_OK_FOR_SIBCALL
5695 1.1 mrg #define TARGET_FUNCTION_OK_FOR_SIBCALL nds32_function_ok_for_sibcall
5696 1.1 mrg
5697 1.1 mrg #undef TARGET_WARN_FUNC_RETURN
5698 1.1 mrg #define TARGET_WARN_FUNC_RETURN nds32_warn_func_return
5699 1.1 mrg
5700 1.1 mrg /* Stack smashing protection. */
5701 1.1 mrg
5702 1.1 mrg
5703 1.1 mrg /* Implementing the Varargs Macros. */
5705 1.1 mrg
5706 1.1 mrg #undef TARGET_SETUP_INCOMING_VARARGS
5707 1.1 mrg #define TARGET_SETUP_INCOMING_VARARGS nds32_setup_incoming_varargs
5708 1.1 mrg
5709 1.1 mrg #undef TARGET_STRICT_ARGUMENT_NAMING
5710 1.1 mrg #define TARGET_STRICT_ARGUMENT_NAMING nds32_strict_argument_naming
5711 1.1 mrg
5712 1.1 mrg
5713 1.1 mrg /* Trampolines for Nested Functions. */
5715 1.1 mrg
5716 1.1 mrg #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
5717 1.1 mrg #define TARGET_ASM_TRAMPOLINE_TEMPLATE nds32_asm_trampoline_template
5718 1.1 mrg
5719 1.1 mrg #undef TARGET_TRAMPOLINE_INIT
5720 1.1 mrg #define TARGET_TRAMPOLINE_INIT nds32_trampoline_init
5721 1.1 mrg
5722 1.1 mrg
5723 1.1 mrg /* Implicit Calls to Library Routines. */
5725 1.1 mrg
5726 1.1 mrg
5727 1.1 mrg /* Addressing Modes. */
5729 1.1 mrg
5730 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P
5731 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P nds32_legitimate_address_p
5732 1.1 mrg
5733 1.1 mrg #undef TARGET_LEGITIMIZE_ADDRESS
5734 1.1 mrg #define TARGET_LEGITIMIZE_ADDRESS nds32_legitimize_address
5735 1.1 mrg
5736 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P
5737 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P nds32_legitimate_constant_p
5738 1.1 mrg
5739 1.1 mrg #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
5740 1.1 mrg #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE nds32_vectorize_preferred_simd_mode
5741 1.1 mrg
5742 1.1 mrg #undef TARGET_CANNOT_FORCE_CONST_MEM
5743 1.1 mrg #define TARGET_CANNOT_FORCE_CONST_MEM nds32_cannot_force_const_mem
5744 1.1 mrg
5745 1.1 mrg #undef TARGET_DELEGITIMIZE_ADDRESS
5746 1.1 mrg #define TARGET_DELEGITIMIZE_ADDRESS nds32_delegitimize_address
5747 1.1 mrg
5748 1.1 mrg
5749 1.1 mrg /* Anchored Addresses. */
5751 1.1 mrg
5752 1.1 mrg
5753 1.1 mrg /* Condition Code Status. */
5755 1.1 mrg
5756 1.1 mrg /* -- Representation of condition codes using (cc0). */
5757 1.1 mrg
5758 1.1 mrg /* -- Representation of condition codes using registers. */
5759 1.1 mrg
5760 1.1 mrg #undef TARGET_CANONICALIZE_COMPARISON
5761 1.1 mrg #define TARGET_CANONICALIZE_COMPARISON nds32_canonicalize_comparison
5762 1.1 mrg
5763 1.1 mrg /* -- Macros to control conditional execution. */
5764 1.1 mrg
5765 1.1 mrg
5766 1.1 mrg /* Describing Relative Costs of Operations. */
5768 1.1 mrg
5769 1.1 mrg #undef TARGET_REGISTER_MOVE_COST
5770 1.1 mrg #define TARGET_REGISTER_MOVE_COST nds32_register_move_cost
5771 1.1 mrg
5772 1.1 mrg #undef TARGET_MEMORY_MOVE_COST
5773 1.1 mrg #define TARGET_MEMORY_MOVE_COST nds32_memory_move_cost
5774 1.1 mrg
5775 1.1 mrg #undef TARGET_RTX_COSTS
5776 1.1 mrg #define TARGET_RTX_COSTS nds32_rtx_costs
5777 1.1 mrg
5778 1.1 mrg #undef TARGET_ADDRESS_COST
5779 1.1 mrg #define TARGET_ADDRESS_COST nds32_address_cost
5780 1.1 mrg
5781 1.1 mrg
5782 1.1 mrg /* Adjusting the Instruction Scheduler. */
5784 1.1 mrg
5785 1.1 mrg
5786 1.1 mrg /* Dividing the Output into Sections (Texts, Data, . . . ). */
5788 1.1 mrg
5789 1.1 mrg #undef TARGET_ENCODE_SECTION_INFO
5790 1.1 mrg #define TARGET_ENCODE_SECTION_INFO nds32_encode_section_info
5791 1.1 mrg
5792 1.1 mrg
5793 1.1 mrg /* Position Independent Code. */
5795 1.1 mrg
5796 1.1 mrg
5797 1.1 mrg /* Defining the Output Assembler Language. */
5799 1.1 mrg
5800 1.1 mrg /* -- The Overall Framework of an Assembler File. */
5801 1.1 mrg
5802 1.1 mrg #undef TARGET_ASM_FILE_START
5803 1.1 mrg #define TARGET_ASM_FILE_START nds32_asm_file_start
5804 1.1 mrg #undef TARGET_ASM_FILE_END
5805 1.1 mrg #define TARGET_ASM_FILE_END nds32_asm_file_end
5806 1.1 mrg
5807 1.1 mrg /* -- Output of Data. */
5808 1.1 mrg
5809 1.1 mrg #undef TARGET_ASM_ALIGNED_HI_OP
5810 1.1 mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
5811 1.1 mrg
5812 1.1 mrg #undef TARGET_ASM_ALIGNED_SI_OP
5813 1.1 mrg #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
5814 1.1 mrg
5815 1.1 mrg #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
5816 1.1 mrg #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA nds32_asm_output_addr_const_extra
5817 1.1 mrg
5818 1.1 mrg /* -- Output of Uninitialized Variables. */
5819 1.1 mrg
5820 1.1 mrg /* -- Output and Generation of Labels. */
5821 1.1 mrg
5822 1.1 mrg #undef TARGET_ASM_GLOBALIZE_LABEL
5823 1.1 mrg #define TARGET_ASM_GLOBALIZE_LABEL nds32_asm_globalize_label
5824 1.1 mrg
5825 1.1 mrg /* -- How Initialization Functions Are Handled. */
5826 1.1 mrg
5827 1.1 mrg /* -- Macros Controlling Initialization Routines. */
5828 1.1 mrg
5829 1.1 mrg /* -- Output of Assembler Instructions. */
5830 1.1 mrg
5831 1.1 mrg #undef TARGET_PRINT_OPERAND
5832 1.1 mrg #define TARGET_PRINT_OPERAND nds32_print_operand
5833 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS
5834 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS nds32_print_operand_address
5835 1.1 mrg
5836 1.1 mrg /* -- Output of Dispatch Tables. */
5837 1.1 mrg
5838 1.1 mrg /* -- Assembler Commands for Exception Regions. */
5839 1.1 mrg
5840 1.1 mrg #undef TARGET_DWARF_REGISTER_SPAN
5841 1.1 mrg #define TARGET_DWARF_REGISTER_SPAN nds32_dwarf_register_span
5842 1.1 mrg
5843 1.1 mrg /* -- Assembler Commands for Alignment. */
5844 1.1 mrg
5845 1.1 mrg
5846 1.1 mrg /* Controlling Debugging Information Format. */
5848 1.1 mrg
5849 1.1 mrg /* -- Macros Affecting All Debugging Formats. */
5850 1.1 mrg
5851 1.1 mrg /* -- Specific Options for DBX Output. */
5852 1.1 mrg
5853 1.1 mrg /* -- Open-Ended Hooks for DBX Format. */
5854 1.1 mrg
5855 1.1 mrg /* -- File Names in DBX Format. */
5856 1.1 mrg
5857 1.1 mrg /* -- Macros for DWARF Output. */
5858 1.1 mrg
5859 1.1 mrg /* -- Macros for VMS Debug Format. */
5860 1.1 mrg
5861 1.1 mrg
5862 1.1 mrg /* Cross Compilation and Floating Point. */
5864 1.1 mrg
5865 1.1 mrg
5866 1.1 mrg /* Mode Switching Instructions. */
5868 1.1 mrg
5869 1.1 mrg
5870 1.1 mrg /* Defining target-specific uses of __attribute__. */
5872 1.1 mrg
5873 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE
5874 1.1 mrg #define TARGET_ATTRIBUTE_TABLE nds32_attribute_table
5875 1.1 mrg
5876 1.1 mrg #undef TARGET_MERGE_DECL_ATTRIBUTES
5877 1.1 mrg #define TARGET_MERGE_DECL_ATTRIBUTES nds32_merge_decl_attributes
5878 1.1 mrg
5879 1.1 mrg #undef TARGET_INSERT_ATTRIBUTES
5880 1.1 mrg #define TARGET_INSERT_ATTRIBUTES nds32_insert_attributes
5881 1.1 mrg
5882 1.1 mrg #undef TARGET_OPTION_PRAGMA_PARSE
5883 1.1 mrg #define TARGET_OPTION_PRAGMA_PARSE nds32_option_pragma_parse
5884 1.1 mrg
5885 1.1 mrg #undef TARGET_OPTION_OVERRIDE
5886 1.1 mrg #define TARGET_OPTION_OVERRIDE nds32_option_override
5887 1.1 mrg
5888 1.1 mrg
5889 1.1 mrg /* Emulating TLS. */
5891 1.1 mrg
5892 1.1 mrg #undef TARGET_HAVE_TLS
5893 1.1 mrg #define TARGET_HAVE_TLS TARGET_LINUX_ABI
5894 1.1 mrg
5895 1.1 mrg
5896 /* Defining coprocessor specifics for MIPS targets. */
5898
5899
5900 /* Parameters for Precompiled Header Validity Checking. */
5902
5903
5904 /* C++ ABI parameters. */
5906
5907
5908 /* Adding support for named address spaces. */
5910
5911
5912 /* Miscellaneous Parameters. */
5914
5915 #undef TARGET_MD_ASM_ADJUST
5916 #define TARGET_MD_ASM_ADJUST nds32_md_asm_adjust
5917
5918 #undef TARGET_INIT_BUILTINS
5919 #define TARGET_INIT_BUILTINS nds32_init_builtins
5920
5921 #undef TARGET_BUILTIN_DECL
5922 #define TARGET_BUILTIN_DECL nds32_builtin_decl
5923
5924 #undef TARGET_EXPAND_BUILTIN
5925 #define TARGET_EXPAND_BUILTIN nds32_expand_builtin
5926
5927 #undef TARGET_INIT_LIBFUNCS
5928 #define TARGET_INIT_LIBFUNCS nds32_init_libfuncs
5929
5930 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
5931 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P nds32_use_blocks_for_constant_p
5932
5933 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
5934 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
5935
5936
5937 /* ------------------------------------------------------------------------ */
5939
5940 /* Initialize the GCC target structure. */
5941
5942 struct gcc_target targetm = TARGET_INITIALIZER;
5943
5944 /* ------------------------------------------------------------------------ */
5945