]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/pdp11/pdp11.c
expr.h: Remove prototypes of functions defined in builtins.c.
[thirdparty/gcc.git] / gcc / config / pdp11 / pdp11.c
1 /* Subroutines for gcc2 for pdp11.
2 Copyright (C) 1994-2014 Free Software Foundation, Inc.
3 Contributed by Michael K. Gschwind (mike@vlsivie.tuwien.ac.at).
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "regs.h"
27 #include "hard-reg-set.h"
28 #include "insn-config.h"
29 #include "conditions.h"
30 #include "function.h"
31 #include "output.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "recog.h"
35 #include "tree.h"
36 #include "stor-layout.h"
37 #include "varasm.h"
38 #include "calls.h"
39 #include "expr.h"
40 #include "diagnostic-core.h"
41 #include "tm_p.h"
42 #include "target.h"
43 #include "target-def.h"
44 #include "df.h"
45 #include "opts.h"
46 #include "dbxout.h"
47 #include "builtins.h"
48
49 /* this is the current value returned by the macro FIRST_PARM_OFFSET
50 defined in tm.h */
51 int current_first_parm_offset;
52
53 /* Routines to encode/decode pdp11 floats */
54 static void encode_pdp11_f (const struct real_format *fmt,
55 long *, const REAL_VALUE_TYPE *);
56 static void decode_pdp11_f (const struct real_format *,
57 REAL_VALUE_TYPE *, const long *);
58 static void encode_pdp11_d (const struct real_format *fmt,
59 long *, const REAL_VALUE_TYPE *);
60 static void decode_pdp11_d (const struct real_format *,
61 REAL_VALUE_TYPE *, const long *);
62
63 /* These two are taken from the corresponding vax descriptors
64 in real.c, changing only the encode/decode routine pointers. */
65 const struct real_format pdp11_f_format =
66 {
67 encode_pdp11_f,
68 decode_pdp11_f,
69 2,
70 24,
71 24,
72 -127,
73 127,
74 15,
75 15,
76 false,
77 false,
78 false,
79 false,
80 false,
81 false,
82 false,
83 false
84 };
85
86 const struct real_format pdp11_d_format =
87 {
88 encode_pdp11_d,
89 decode_pdp11_d,
90 2,
91 56,
92 56,
93 -127,
94 127,
95 15,
96 15,
97 false,
98 false,
99 false,
100 false,
101 false,
102 false,
103 false,
104 false
105 };
106
107 static void
108 encode_pdp11_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
109 const REAL_VALUE_TYPE *r)
110 {
111 (*vax_f_format.encode) (fmt, buf, r);
112 buf[0] = ((buf[0] >> 16) & 0xffff) | ((buf[0] & 0xffff) << 16);
113 }
114
115 static void
116 decode_pdp11_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
117 REAL_VALUE_TYPE *r, const long *buf)
118 {
119 long tbuf;
120 tbuf = ((buf[0] >> 16) & 0xffff) | ((buf[0] & 0xffff) << 16);
121 (*vax_f_format.decode) (fmt, r, &tbuf);
122 }
123
124 static void
125 encode_pdp11_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
126 const REAL_VALUE_TYPE *r)
127 {
128 (*vax_d_format.encode) (fmt, buf, r);
129 buf[0] = ((buf[0] >> 16) & 0xffff) | ((buf[0] & 0xffff) << 16);
130 buf[1] = ((buf[1] >> 16) & 0xffff) | ((buf[1] & 0xffff) << 16);
131 }
132
133 static void
134 decode_pdp11_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
135 REAL_VALUE_TYPE *r, const long *buf)
136 {
137 long tbuf[2];
138 tbuf[0] = ((buf[0] >> 16) & 0xffff) | ((buf[0] & 0xffff) << 16);
139 tbuf[1] = ((buf[1] >> 16) & 0xffff) | ((buf[1] & 0xffff) << 16);
140 (*vax_d_format.decode) (fmt, r, tbuf);
141 }
142
143 /* This is where the condition code register lives. */
144 /* rtx cc0_reg_rtx; - no longer needed? */
145
146 static const char *singlemove_string (rtx *);
147 static bool pdp11_assemble_integer (rtx, unsigned int, int);
148 static bool pdp11_rtx_costs (rtx, int, int, int, int *, bool);
149 static bool pdp11_return_in_memory (const_tree, const_tree);
150 static rtx pdp11_function_value (const_tree, const_tree, bool);
151 static rtx pdp11_libcall_value (enum machine_mode, const_rtx);
152 static bool pdp11_function_value_regno_p (const unsigned int);
153 static void pdp11_trampoline_init (rtx, tree, rtx);
154 static rtx pdp11_function_arg (cumulative_args_t, enum machine_mode,
155 const_tree, bool);
156 static void pdp11_function_arg_advance (cumulative_args_t,
157 enum machine_mode, const_tree, bool);
158 static void pdp11_conditional_register_usage (void);
159 static bool pdp11_legitimate_constant_p (enum machine_mode, rtx);
160 \f
161 /* Initialize the GCC target structure. */
162 #undef TARGET_ASM_BYTE_OP
163 #define TARGET_ASM_BYTE_OP NULL
164 #undef TARGET_ASM_ALIGNED_HI_OP
165 #define TARGET_ASM_ALIGNED_HI_OP NULL
166 #undef TARGET_ASM_ALIGNED_SI_OP
167 #define TARGET_ASM_ALIGNED_SI_OP NULL
168 #undef TARGET_ASM_INTEGER
169 #define TARGET_ASM_INTEGER pdp11_assemble_integer
170
171 #undef TARGET_ASM_OPEN_PAREN
172 #define TARGET_ASM_OPEN_PAREN "["
173 #undef TARGET_ASM_CLOSE_PAREN
174 #define TARGET_ASM_CLOSE_PAREN "]"
175
176 #undef TARGET_RTX_COSTS
177 #define TARGET_RTX_COSTS pdp11_rtx_costs
178
179 #undef TARGET_FUNCTION_ARG
180 #define TARGET_FUNCTION_ARG pdp11_function_arg
181 #undef TARGET_FUNCTION_ARG_ADVANCE
182 #define TARGET_FUNCTION_ARG_ADVANCE pdp11_function_arg_advance
183
184 #undef TARGET_RETURN_IN_MEMORY
185 #define TARGET_RETURN_IN_MEMORY pdp11_return_in_memory
186
187 #undef TARGET_FUNCTION_VALUE
188 #define TARGET_FUNCTION_VALUE pdp11_function_value
189 #undef TARGET_LIBCALL_VALUE
190 #define TARGET_LIBCALL_VALUE pdp11_libcall_value
191 #undef TARGET_FUNCTION_VALUE_REGNO_P
192 #define TARGET_FUNCTION_VALUE_REGNO_P pdp11_function_value_regno_p
193
194 #undef TARGET_TRAMPOLINE_INIT
195 #define TARGET_TRAMPOLINE_INIT pdp11_trampoline_init
196
197 #undef TARGET_SECONDARY_RELOAD
198 #define TARGET_SECONDARY_RELOAD pdp11_secondary_reload
199
200 #undef TARGET_REGISTER_MOVE_COST
201 #define TARGET_REGISTER_MOVE_COST pdp11_register_move_cost
202
203 #undef TARGET_PREFERRED_RELOAD_CLASS
204 #define TARGET_PREFERRED_RELOAD_CLASS pdp11_preferred_reload_class
205
206 #undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
207 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS pdp11_preferred_output_reload_class
208
209 #undef TARGET_LEGITIMATE_ADDRESS_P
210 #define TARGET_LEGITIMATE_ADDRESS_P pdp11_legitimate_address_p
211
212 #undef TARGET_CONDITIONAL_REGISTER_USAGE
213 #define TARGET_CONDITIONAL_REGISTER_USAGE pdp11_conditional_register_usage
214
215 #undef TARGET_ASM_FUNCTION_SECTION
216 #define TARGET_ASM_FUNCTION_SECTION pdp11_function_section
217
218 #undef TARGET_PRINT_OPERAND
219 #define TARGET_PRINT_OPERAND pdp11_asm_print_operand
220
221 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
222 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P pdp11_asm_print_operand_punct_valid_p
223
224 #undef TARGET_LEGITIMATE_CONSTANT_P
225 #define TARGET_LEGITIMATE_CONSTANT_P pdp11_legitimate_constant_p
226 \f
227 /* A helper function to determine if REGNO should be saved in the
228 current function's stack frame. */
229
230 static inline bool
231 pdp11_saved_regno (unsigned regno)
232 {
233 return !call_used_regs[regno] && df_regs_ever_live_p (regno);
234 }
235
236 /* Expand the function prologue. */
237
238 void
239 pdp11_expand_prologue (void)
240 {
241 HOST_WIDE_INT fsize = get_frame_size ();
242 unsigned regno;
243 rtx x, via_ac = NULL;
244
245 /* If we are outputting code for main, the switch FPU to the
246 right mode if TARGET_FPU. */
247 if (MAIN_NAME_P (DECL_NAME (current_function_decl)) && TARGET_FPU)
248 {
249 emit_insn (gen_setd ());
250 emit_insn (gen_seti ());
251 }
252
253 if (frame_pointer_needed)
254 {
255 x = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx);
256 x = gen_frame_mem (Pmode, x);
257 emit_move_insn (x, hard_frame_pointer_rtx);
258
259 emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
260 }
261
262 /* Make frame. */
263 if (fsize)
264 {
265 emit_insn (gen_addhi3 (stack_pointer_rtx, stack_pointer_rtx,
266 GEN_INT (-fsize)));
267
268 /* Prevent frame references via the frame pointer from being
269 scheduled before the frame is allocated. */
270 if (frame_pointer_needed)
271 emit_insn (gen_blockage ());
272 }
273
274 /* Save CPU registers. */
275 for (regno = R0_REGNUM; regno <= PC_REGNUM; regno++)
276 if (pdp11_saved_regno (regno)
277 && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed))
278 {
279 x = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx);
280 x = gen_frame_mem (Pmode, x);
281 emit_move_insn (x, gen_rtx_REG (Pmode, regno));
282 }
283
284 /* Save FPU registers. */
285 for (regno = AC0_REGNUM; regno <= AC3_REGNUM; regno++)
286 if (pdp11_saved_regno (regno))
287 {
288 x = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx);
289 x = gen_frame_mem (DFmode, x);
290 via_ac = gen_rtx_REG (DFmode, regno);
291 emit_move_insn (x, via_ac);
292 }
293
294 /* ??? Maybe make ac4, ac5 call used regs?? */
295 for (regno = AC4_REGNUM; regno <= AC5_REGNUM; regno++)
296 if (pdp11_saved_regno (regno))
297 {
298 gcc_assert (via_ac != NULL);
299 emit_move_insn (via_ac, gen_rtx_REG (DFmode, regno));
300
301 x = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx);
302 x = gen_frame_mem (DFmode, x);
303 emit_move_insn (x, via_ac);
304 }
305 }
306
307 /* The function epilogue should not depend on the current stack pointer!
308 It should use the frame pointer only. This is mandatory because
309 of alloca; we also take advantage of it to omit stack adjustments
310 before returning. */
311
312 /* Maybe we can make leaf functions faster by switching to the
313 second register file - this way we don't have to save regs!
314 leaf functions are ~ 50% of all functions (dynamically!)
315
316 set/clear bit 11 (dec. 2048) of status word for switching register files -
317 but how can we do this? the pdp11/45 manual says bit may only
318 be set (p.24), but not cleared!
319
320 switching to kernel is probably more expensive, so we'll leave it
321 like this and not use the second set of registers...
322
323 maybe as option if you want to generate code for kernel mode? */
324
325 void
326 pdp11_expand_epilogue (void)
327 {
328 HOST_WIDE_INT fsize = get_frame_size ();
329 unsigned regno;
330 rtx x, reg, via_ac = NULL;
331
332 if (pdp11_saved_regno (AC4_REGNUM) || pdp11_saved_regno (AC5_REGNUM))
333 {
334 /* Find a temporary with which to restore AC4/5. */
335 for (regno = AC0_REGNUM; regno <= AC3_REGNUM; regno++)
336 if (pdp11_saved_regno (regno))
337 {
338 via_ac = gen_rtx_REG (DFmode, regno);
339 break;
340 }
341 }
342
343 /* If possible, restore registers via pops. */
344 if (!frame_pointer_needed || crtl->sp_is_unchanging)
345 {
346 /* Restore registers via pops. */
347
348 for (regno = AC5_REGNUM; regno >= AC0_REGNUM; regno--)
349 if (pdp11_saved_regno (regno))
350 {
351 x = gen_rtx_POST_INC (Pmode, stack_pointer_rtx);
352 x = gen_frame_mem (DFmode, x);
353 reg = gen_rtx_REG (DFmode, regno);
354
355 if (LOAD_FPU_REG_P (regno))
356 emit_move_insn (reg, x);
357 else
358 {
359 emit_move_insn (via_ac, x);
360 emit_move_insn (reg, via_ac);
361 }
362 }
363
364 for (regno = PC_REGNUM; regno >= R0_REGNUM + 2; regno--)
365 if (pdp11_saved_regno (regno)
366 && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed))
367 {
368 x = gen_rtx_POST_INC (Pmode, stack_pointer_rtx);
369 x = gen_frame_mem (Pmode, x);
370 emit_move_insn (gen_rtx_REG (Pmode, regno), x);
371 }
372 }
373 else
374 {
375 /* Restore registers via moves. */
376 /* ??? If more than a few registers need to be restored, it's smaller
377 to generate a pointer through which we can emit pops. Consider
378 that moves cost 2*NREG words and pops cost NREG+3 words. This
379 means that the crossover is NREG=3.
380
381 Possible registers to use are:
382 (1) The first call-saved general register. This register will
383 be restored with the last pop.
384 (2) R1, if it's not used as a return register.
385 (3) FP itself. This option may result in +4 words, since we
386 may need two add imm,rn instructions instead of just one.
387 This also has the downside that we're not representing
388 the unwind info in any way, so during the epilogue the
389 debugger may get lost. */
390
391 HOST_WIDE_INT ofs = -pdp11_sp_frame_offset ();
392
393 for (regno = AC5_REGNUM; regno >= AC0_REGNUM; regno--)
394 if (pdp11_saved_regno (regno))
395 {
396 x = plus_constant (Pmode, hard_frame_pointer_rtx, ofs);
397 x = gen_frame_mem (DFmode, x);
398 reg = gen_rtx_REG (DFmode, regno);
399
400 if (LOAD_FPU_REG_P (regno))
401 emit_move_insn (reg, x);
402 else
403 {
404 emit_move_insn (via_ac, x);
405 emit_move_insn (reg, via_ac);
406 }
407 ofs += 8;
408 }
409
410 for (regno = PC_REGNUM; regno >= R0_REGNUM + 2; regno--)
411 if (pdp11_saved_regno (regno)
412 && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed))
413 {
414 x = plus_constant (Pmode, hard_frame_pointer_rtx, ofs);
415 x = gen_frame_mem (Pmode, x);
416 emit_move_insn (gen_rtx_REG (Pmode, regno), x);
417 ofs += 2;
418 }
419 }
420
421 /* Deallocate the stack frame. */
422 if (fsize)
423 {
424 /* Prevent frame references via any pointer from being
425 scheduled after the frame is deallocated. */
426 emit_insn (gen_blockage ());
427
428 if (frame_pointer_needed)
429 {
430 /* We can deallocate the frame with a single move. */
431 emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
432 }
433 else
434 emit_insn (gen_addhi3 (stack_pointer_rtx, stack_pointer_rtx,
435 GEN_INT (fsize)));
436 }
437
438 if (frame_pointer_needed)
439 {
440 x = gen_rtx_POST_INC (Pmode, stack_pointer_rtx);
441 x = gen_frame_mem (Pmode, x);
442 emit_move_insn (hard_frame_pointer_rtx, x);
443 }
444
445 emit_jump_insn (gen_return ());
446 }
447
448 /* Return the best assembler insn template
449 for moving operands[1] into operands[0] as a fullword. */
450 static const char *
451 singlemove_string (rtx *operands)
452 {
453 if (operands[1] != const0_rtx)
454 return "mov %1,%0";
455
456 return "clr %0";
457 }
458
459 \f
460 /* Expand multi-word operands (SImode or DImode) into the 2 or 4
461 corresponding HImode operands. The number of operands is given
462 as the third argument, and the required order of the parts as
463 the fourth argument. */
464 bool
465 pdp11_expand_operands (rtx *operands, rtx exops[][2], int opcount,
466 pdp11_action *action, pdp11_partorder order)
467 {
468 int words, op, w, i, sh;
469 pdp11_partorder useorder;
470 bool sameoff = false;
471 enum { REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP } optype;
472 REAL_VALUE_TYPE r;
473 long sval[2];
474
475 words = GET_MODE_BITSIZE (GET_MODE (operands[0])) / 16;
476
477 /* If either piece order is accepted and one is pre-decrement
478 while the other is post-increment, set order to be high order
479 word first. That will force the pre-decrement to be turned
480 into a pointer adjust, then offset addressing.
481 Otherwise, if either operand uses pre-decrement, that means
482 the order is low order first.
483 Otherwise, if both operands are registers and destination is
484 higher than source and they overlap, do low order word (highest
485 register number) first. */
486 useorder = either;
487 if (opcount == 2)
488 {
489 if (!REG_P (operands[0]) && !REG_P (operands[1]) &&
490 !(CONSTANT_P (operands[1]) ||
491 GET_CODE (operands[1]) == CONST_DOUBLE) &&
492 ((GET_CODE (XEXP (operands[0], 0)) == POST_INC &&
493 GET_CODE (XEXP (operands[1], 0)) == PRE_DEC) ||
494 (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC &&
495 GET_CODE (XEXP (operands[1], 0)) == POST_INC)))
496 useorder = big;
497 else if ((!REG_P (operands[0]) &&
498 GET_CODE (XEXP (operands[0], 0)) == PRE_DEC) ||
499 (!REG_P (operands[1]) &&
500 !(CONSTANT_P (operands[1]) ||
501 GET_CODE (operands[1]) == CONST_DOUBLE) &&
502 GET_CODE (XEXP (operands[1], 0)) == PRE_DEC))
503 useorder = little;
504 else if (REG_P (operands[0]) && REG_P (operands[1]) &&
505 REGNO (operands[0]) > REGNO (operands[1]) &&
506 REGNO (operands[0]) < REGNO (operands[1]) + words)
507 useorder = little;
508
509 /* Check for source == offset from register and dest == push of
510 the same register. In that case, we have to use the same
511 offset (the one for the low order word) for all words, because
512 the push increases the offset to each source word.
513 In theory there are other cases like this, for example dest == pop,
514 but those don't occur in real life so ignore those. */
515 if (GET_CODE (operands[0]) == MEM
516 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
517 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
518 && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
519 sameoff = true;
520 }
521
522 /* If the caller didn't specify order, use the one we computed,
523 or high word first if we don't care either. If the caller did
524 specify, verify we don't have a problem with that order.
525 (If it matters to the caller, constraints need to be used to
526 ensure this case doesn't occur). */
527 if (order == either)
528 order = (useorder == either) ? big : useorder;
529 else
530 gcc_assert (useorder == either || useorder == order);
531
532
533 for (op = 0; op < opcount; op++)
534 {
535 /* First classify the operand. */
536 if (REG_P (operands[op]))
537 optype = REGOP;
538 else if (CONSTANT_P (operands[op])
539 || GET_CODE (operands[op]) == CONST_DOUBLE)
540 optype = CNSTOP;
541 else if (GET_CODE (XEXP (operands[op], 0)) == POST_INC)
542 optype = POPOP;
543 else if (GET_CODE (XEXP (operands[op], 0)) == PRE_DEC)
544 optype = PUSHOP;
545 else if (!reload_in_progress || offsettable_memref_p (operands[op]))
546 optype = OFFSOP;
547 else if (GET_CODE (operands[op]) == MEM)
548 optype = MEMOP;
549 else
550 optype = RNDOP;
551
552 /* Check for the cases that the operand constraints are not
553 supposed to allow to happen. Return failure for such cases. */
554 if (optype == RNDOP)
555 return false;
556
557 if (action != NULL)
558 action[op] = no_action;
559
560 /* If the operand uses pre-decrement addressing but we
561 want to get the parts high order first,
562 decrement the former register explicitly
563 and change the operand into ordinary indexing. */
564 if (optype == PUSHOP && order == big)
565 {
566 gcc_assert (action != NULL);
567 action[op] = dec_before;
568 operands[op] = gen_rtx_MEM (GET_MODE (operands[op]),
569 XEXP (XEXP (operands[op], 0), 0));
570 optype = OFFSOP;
571 }
572 /* If the operand uses post-increment mode but we want
573 to get the parts low order first, change the operand
574 into ordinary indexing and remember to increment
575 the register explicitly when we're done. */
576 else if (optype == POPOP && order == little)
577 {
578 gcc_assert (action != NULL);
579 action[op] = inc_after;
580 operands[op] = gen_rtx_MEM (GET_MODE (operands[op]),
581 XEXP (XEXP (operands[op], 0), 0));
582 optype = OFFSOP;
583 }
584
585 if (GET_CODE (operands[op]) == CONST_DOUBLE)
586 {
587 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[op]);
588 REAL_VALUE_TO_TARGET_DOUBLE (r, sval);
589 }
590
591 for (i = 0; i < words; i++)
592 {
593 if (order == big)
594 w = i;
595 else if (sameoff)
596 w = words - 1;
597 else
598 w = words - 1 - i;
599
600 /* Set the output operand to be word "w" of the input. */
601 if (optype == REGOP)
602 exops[i][op] = gen_rtx_REG (HImode, REGNO (operands[op]) + w);
603 else if (optype == OFFSOP)
604 exops[i][op] = adjust_address (operands[op], HImode, w * 2);
605 else if (optype == CNSTOP)
606 {
607 if (GET_CODE (operands[op]) == CONST_DOUBLE)
608 {
609 sh = 16 - (w & 1) * 16;
610 exops[i][op] = gen_rtx_CONST_INT (HImode, (sval[w / 2] >> sh) & 0xffff);
611 }
612 else
613 {
614 sh = ((words - 1 - w) * 16);
615 exops[i][op] = gen_rtx_CONST_INT (HImode, trunc_int_for_mode (INTVAL(operands[op]) >> sh, HImode));
616 }
617 }
618 else
619 exops[i][op] = operands[op];
620 }
621 }
622 return true;
623 }
624
625 /* Output assembler code to perform a multiple-word move insn
626 with operands OPERANDS. This moves 2 or 4 words depending
627 on the machine mode of the operands. */
628
629 const char *
630 output_move_multiple (rtx *operands)
631 {
632 rtx exops[4][2];
633 pdp11_action action[2];
634 int i, words;
635
636 words = GET_MODE_BITSIZE (GET_MODE (operands[0])) / 16;
637
638 pdp11_expand_operands (operands, exops, 2, action, either);
639
640 /* Check for explicit decrement before. */
641 if (action[0] == dec_before)
642 {
643 operands[0] = XEXP (operands[0], 0);
644 output_asm_insn ("sub $4,%0", operands);
645 }
646 if (action[1] == dec_before)
647 {
648 operands[1] = XEXP (operands[1], 0);
649 output_asm_insn ("sub $4,%1", operands);
650 }
651
652 /* Do the words. */
653 for (i = 0; i < words; i++)
654 output_asm_insn (singlemove_string (exops[i]), exops[i]);
655
656 /* Check for increment after. */
657 if (action[0] == inc_after)
658 {
659 operands[0] = XEXP (operands[0], 0);
660 output_asm_insn ("add $4,%0", operands);
661 }
662 if (action[1] == inc_after)
663 {
664 operands[1] = XEXP (operands[1], 0);
665 output_asm_insn ("add $4,%1", operands);
666 }
667
668 return "";
669 }
670 \f
671 /* Output an ascii string. */
672 void
673 output_ascii (FILE *file, const char *p, int size)
674 {
675 int i;
676
677 /* This used to output .byte "string", which doesn't work with the UNIX
678 assembler and I think not with DEC ones either. */
679 fprintf (file, "\t.byte ");
680
681 for (i = 0; i < size; i++)
682 {
683 register int c = p[i];
684 if (c < 0)
685 c += 256;
686 fprintf (file, "%#o", c);
687 if (i < size - 1)
688 putc (',', file);
689 }
690 putc ('\n', file);
691 }
692
693
694 void
695 pdp11_asm_output_var (FILE *file, const char *name, int size,
696 int align, bool global)
697 {
698 if (align > 8)
699 fprintf (file, "\n\t.even\n");
700 if (global)
701 {
702 fprintf (file, ".globl ");
703 assemble_name (file, name);
704 }
705 fprintf (file, "\n");
706 assemble_name (file, name);
707 fprintf (file, ": .=.+ %#ho\n", (unsigned short)size);
708 }
709
710 static void
711 pdp11_asm_print_operand (FILE *file, rtx x, int code)
712 {
713 REAL_VALUE_TYPE r;
714 long sval[2];
715
716 if (code == '#')
717 fprintf (file, "#");
718 else if (code == '@')
719 {
720 if (TARGET_UNIX_ASM)
721 fprintf (file, "*");
722 else
723 fprintf (file, "@");
724 }
725 else if (GET_CODE (x) == REG)
726 fprintf (file, "%s", reg_names[REGNO (x)]);
727 else if (GET_CODE (x) == MEM)
728 output_address (XEXP (x, 0));
729 else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != SImode)
730 {
731 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
732 REAL_VALUE_TO_TARGET_DOUBLE (r, sval);
733 fprintf (file, "$%#lo", sval[0] >> 16);
734 }
735 else
736 {
737 putc ('$', file);
738 output_addr_const_pdp11 (file, x);
739 }
740 }
741
742 static bool
743 pdp11_asm_print_operand_punct_valid_p (unsigned char c)
744 {
745 return (c == '#' || c == '@');
746 }
747
748 void
749 print_operand_address (FILE *file, register rtx addr)
750 {
751 register rtx breg;
752 rtx offset;
753 int again = 0;
754
755 retry:
756
757 switch (GET_CODE (addr))
758 {
759 case MEM:
760 if (TARGET_UNIX_ASM)
761 fprintf (file, "*");
762 else
763 fprintf (file, "@");
764 addr = XEXP (addr, 0);
765 again = 1;
766 goto retry;
767
768 case REG:
769 fprintf (file, "(%s)", reg_names[REGNO (addr)]);
770 break;
771
772 case PRE_MODIFY:
773 case PRE_DEC:
774 fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
775 break;
776
777 case POST_MODIFY:
778 case POST_INC:
779 fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
780 break;
781
782 case PLUS:
783 breg = 0;
784 offset = 0;
785 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
786 || GET_CODE (XEXP (addr, 0)) == MEM)
787 {
788 offset = XEXP (addr, 0);
789 addr = XEXP (addr, 1);
790 }
791 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
792 || GET_CODE (XEXP (addr, 1)) == MEM)
793 {
794 offset = XEXP (addr, 1);
795 addr = XEXP (addr, 0);
796 }
797 if (GET_CODE (addr) != PLUS)
798 ;
799 else if (GET_CODE (XEXP (addr, 0)) == REG)
800 {
801 breg = XEXP (addr, 0);
802 addr = XEXP (addr, 1);
803 }
804 else if (GET_CODE (XEXP (addr, 1)) == REG)
805 {
806 breg = XEXP (addr, 1);
807 addr = XEXP (addr, 0);
808 }
809 if (GET_CODE (addr) == REG)
810 {
811 gcc_assert (breg == 0);
812 breg = addr;
813 addr = 0;
814 }
815 if (offset != 0)
816 {
817 gcc_assert (addr == 0);
818 addr = offset;
819 }
820 if (addr != 0)
821 output_addr_const_pdp11 (file, addr);
822 if (breg != 0)
823 {
824 gcc_assert (GET_CODE (breg) == REG);
825 fprintf (file, "(%s)", reg_names[REGNO (breg)]);
826 }
827 break;
828
829 default:
830 if (!again && GET_CODE (addr) == CONST_INT)
831 {
832 /* Absolute (integer number) address. */
833 if (!TARGET_UNIX_ASM)
834 fprintf (file, "@$");
835 }
836 output_addr_const_pdp11 (file, addr);
837 }
838 }
839
840 /* Target hook to assemble integer objects. We need to use the
841 pdp-specific version of output_addr_const. */
842
843 static bool
844 pdp11_assemble_integer (rtx x, unsigned int size, int aligned_p)
845 {
846 if (aligned_p)
847 switch (size)
848 {
849 case 1:
850 fprintf (asm_out_file, "\t.byte\t");
851 output_addr_const_pdp11 (asm_out_file, GEN_INT (INTVAL (x) & 0xff));
852 ;
853 fprintf (asm_out_file, " /* char */\n");
854 return true;
855
856 case 2:
857 fprintf (asm_out_file, TARGET_UNIX_ASM ? "\t" : "\t.word\t");
858 output_addr_const_pdp11 (asm_out_file, x);
859 fprintf (asm_out_file, " /* short */\n");
860 return true;
861 }
862 return default_assemble_integer (x, size, aligned_p);
863 }
864
865
866 /* register move costs, indexed by regs */
867
868 static const int move_costs[N_REG_CLASSES][N_REG_CLASSES] =
869 {
870 /* NO MUL GEN LFPU NLFPU FPU ALL */
871
872 /* NO */ { 0, 0, 0, 0, 0, 0, 0},
873 /* MUL */ { 0, 2, 2, 22, 22, 22, 22},
874 /* GEN */ { 0, 2, 2, 22, 22, 22, 22},
875 /* LFPU */ { 0, 22, 22, 2, 2, 2, 22},
876 /* NLFPU */ { 0, 22, 22, 2, 10, 10, 22},
877 /* FPU */ { 0, 22, 22, 2, 10, 10, 22},
878 /* ALL */ { 0, 22, 22, 22, 22, 22, 22}
879 } ;
880
881
882 /* -- note that some moves are tremendously expensive,
883 because they require lots of tricks! do we have to
884 charge the costs incurred by secondary reload class
885 -- as we do here with 10 -- or not ? */
886
887 static int
888 pdp11_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
889 reg_class_t c1, reg_class_t c2)
890 {
891 return move_costs[(int)c1][(int)c2];
892 }
893
894 static bool
895 pdp11_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
896 int opno ATTRIBUTE_UNUSED, int *total,
897 bool speed ATTRIBUTE_UNUSED)
898 {
899 switch (code)
900 {
901 case CONST_INT:
902 if (INTVAL (x) == 0 || INTVAL (x) == -1 || INTVAL (x) == 1)
903 {
904 *total = 0;
905 return true;
906 }
907 /* FALLTHRU */
908
909 case CONST:
910 case LABEL_REF:
911 case SYMBOL_REF:
912 /* Twice as expensive as REG. */
913 *total = 2;
914 return true;
915
916 case CONST_DOUBLE:
917 /* Twice (or 4 times) as expensive as 16 bit. */
918 *total = 4;
919 return true;
920
921 case MULT:
922 /* ??? There is something wrong in MULT because MULT is not
923 as cheap as total = 2 even if we can shift! */
924 /* If optimizing for size make mult etc cheap, but not 1, so when
925 in doubt the faster insn is chosen. */
926 if (optimize_size)
927 *total = COSTS_N_INSNS (2);
928 else
929 *total = COSTS_N_INSNS (11);
930 return false;
931
932 case DIV:
933 if (optimize_size)
934 *total = COSTS_N_INSNS (2);
935 else
936 *total = COSTS_N_INSNS (25);
937 return false;
938
939 case MOD:
940 if (optimize_size)
941 *total = COSTS_N_INSNS (2);
942 else
943 *total = COSTS_N_INSNS (26);
944 return false;
945
946 case ABS:
947 /* Equivalent to length, so same for optimize_size. */
948 *total = COSTS_N_INSNS (3);
949 return false;
950
951 case ZERO_EXTEND:
952 /* Only used for qi->hi. */
953 *total = COSTS_N_INSNS (1);
954 return false;
955
956 case SIGN_EXTEND:
957 if (GET_MODE (x) == HImode)
958 *total = COSTS_N_INSNS (1);
959 else if (GET_MODE (x) == SImode)
960 *total = COSTS_N_INSNS (6);
961 else
962 *total = COSTS_N_INSNS (2);
963 return false;
964
965 case ASHIFT:
966 case LSHIFTRT:
967 case ASHIFTRT:
968 if (optimize_size)
969 *total = COSTS_N_INSNS (1);
970 else if (GET_MODE (x) == QImode)
971 {
972 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
973 *total = COSTS_N_INSNS (8); /* worst case */
974 else
975 *total = COSTS_N_INSNS (INTVAL (XEXP (x, 1)));
976 }
977 else if (GET_MODE (x) == HImode)
978 {
979 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
980 {
981 if (abs (INTVAL (XEXP (x, 1))) == 1)
982 *total = COSTS_N_INSNS (1);
983 else
984 *total = COSTS_N_INSNS (2.5 + 0.5 * INTVAL (XEXP (x, 1)));
985 }
986 else
987 *total = COSTS_N_INSNS (10); /* worst case */
988 }
989 else if (GET_MODE (x) == SImode)
990 {
991 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
992 *total = COSTS_N_INSNS (2.5 + 0.5 * INTVAL (XEXP (x, 1)));
993 else /* worst case */
994 *total = COSTS_N_INSNS (18);
995 }
996 return false;
997
998 default:
999 return false;
1000 }
1001 }
1002
1003 const char *
1004 output_jump (enum rtx_code code, int inv, int length)
1005 {
1006 static int x = 0;
1007
1008 static char buf[1000];
1009 const char *pos, *neg;
1010
1011 if (cc_prev_status.flags & CC_NO_OVERFLOW)
1012 {
1013 switch (code)
1014 {
1015 case GTU: code = GT; break;
1016 case LTU: code = LT; break;
1017 case GEU: code = GE; break;
1018 case LEU: code = LE; break;
1019 default: ;
1020 }
1021 }
1022 switch (code)
1023 {
1024 case EQ: pos = "beq", neg = "bne"; break;
1025 case NE: pos = "bne", neg = "beq"; break;
1026 case GT: pos = "bgt", neg = "ble"; break;
1027 case GTU: pos = "bhi", neg = "blos"; break;
1028 case LT: pos = "blt", neg = "bge"; break;
1029 case LTU: pos = "blo", neg = "bhis"; break;
1030 case GE: pos = "bge", neg = "blt"; break;
1031 case GEU: pos = "bhis", neg = "blo"; break;
1032 case LE: pos = "ble", neg = "bgt"; break;
1033 case LEU: pos = "blos", neg = "bhi"; break;
1034 default: gcc_unreachable ();
1035 }
1036
1037 #if 0
1038 /* currently we don't need this, because the tstdf and cmpdf
1039 copy the condition code immediately, and other float operations are not
1040 yet recognized as changing the FCC - if so, then the length-cost of all
1041 jump insns increases by one, because we have to potentially copy the
1042 FCC! */
1043 if (cc_status.flags & CC_IN_FPU)
1044 output_asm_insn("cfcc", NULL);
1045 #endif
1046
1047 switch (length)
1048 {
1049 case 2:
1050
1051 sprintf(buf, "%s %%l1", inv ? neg : pos);
1052
1053 return buf;
1054
1055 case 6:
1056
1057 sprintf(buf, "%s JMP_%d\n\tjmp %%l1\nJMP_%d:", inv ? pos : neg, x, x);
1058
1059 x++;
1060
1061 return buf;
1062
1063 default:
1064
1065 gcc_unreachable ();
1066 }
1067
1068 }
1069
1070 void
1071 notice_update_cc_on_set(rtx exp, rtx insn ATTRIBUTE_UNUSED)
1072 {
1073 if (GET_CODE (SET_DEST (exp)) == CC0)
1074 {
1075 cc_status.flags = 0;
1076 cc_status.value1 = SET_DEST (exp);
1077 cc_status.value2 = SET_SRC (exp);
1078 }
1079 else if (GET_CODE (SET_SRC (exp)) == CALL)
1080 {
1081 CC_STATUS_INIT;
1082 }
1083 else if (SET_DEST(exp) == pc_rtx)
1084 {
1085 /* jump */
1086 }
1087 else if (GET_MODE (SET_DEST(exp)) == HImode
1088 || GET_MODE (SET_DEST(exp)) == QImode)
1089 {
1090 cc_status.flags = GET_CODE (SET_SRC(exp)) == MINUS ? 0 : CC_NO_OVERFLOW;
1091 cc_status.value1 = SET_SRC (exp);
1092 cc_status.value2 = SET_DEST (exp);
1093
1094 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
1095 && cc_status.value2
1096 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
1097 cc_status.value2 = 0;
1098 if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM
1099 && cc_status.value2
1100 && GET_CODE (cc_status.value2) == MEM)
1101 cc_status.value2 = 0;
1102 }
1103 else
1104 {
1105 CC_STATUS_INIT;
1106 }
1107 }
1108
1109
1110 int
1111 simple_memory_operand(rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1112 {
1113 rtx addr;
1114
1115 /* Eliminate non-memory operations */
1116 if (GET_CODE (op) != MEM)
1117 return FALSE;
1118
1119 #if 0
1120 /* dword operations really put out 2 instructions, so eliminate them. */
1121 if (GET_MODE_SIZE (GET_MODE (op)) > (HAVE_64BIT_P () ? 8 : 4))
1122 return FALSE;
1123 #endif
1124
1125 /* Decode the address now. */
1126
1127 indirection:
1128
1129 addr = XEXP (op, 0);
1130
1131 switch (GET_CODE (addr))
1132 {
1133 case REG:
1134 /* (R0) - no extra cost */
1135 return 1;
1136
1137 case PRE_DEC:
1138 case POST_INC:
1139 /* -(R0), (R0)+ - cheap! */
1140 return 0;
1141
1142 case MEM:
1143 /* cheap - is encoded in addressing mode info!
1144
1145 -- except for @(R0), which has to be @0(R0) !!! */
1146
1147 if (GET_CODE (XEXP (addr, 0)) == REG)
1148 return 0;
1149
1150 op=addr;
1151 goto indirection;
1152
1153 case CONST_INT:
1154 case LABEL_REF:
1155 case CONST:
1156 case SYMBOL_REF:
1157 /* @#address - extra cost */
1158 return 0;
1159
1160 case PLUS:
1161 /* X(R0) - extra cost */
1162 return 0;
1163
1164 default:
1165 break;
1166 }
1167
1168 return FALSE;
1169 }
1170
1171
1172 /*
1173 * output a block move:
1174 *
1175 * operands[0] ... to
1176 * operands[1] ... from
1177 * operands[2] ... length
1178 * operands[3] ... alignment
1179 * operands[4] ... scratch register
1180 */
1181
1182
1183 const char *
1184 output_block_move(rtx *operands)
1185 {
1186 static int count = 0;
1187 char buf[200];
1188 int unroll;
1189 int lastbyte = 0;
1190
1191 /* Move of zero bytes is a NOP. */
1192 if (operands[2] == const0_rtx)
1193 return "";
1194
1195 /* Look for moves by small constant byte counts, those we'll
1196 expand to straight line code. */
1197 if (CONSTANT_P (operands[2]))
1198 {
1199 if (INTVAL (operands[2]) < 16
1200 && (!optimize_size || INTVAL (operands[2]) < 5)
1201 && INTVAL (operands[3]) == 1)
1202 {
1203 register int i;
1204
1205 for (i = 1; i <= INTVAL (operands[2]); i++)
1206 output_asm_insn("movb (%1)+, (%0)+", operands);
1207
1208 return "";
1209 }
1210 else if (INTVAL(operands[2]) < 32
1211 && (!optimize_size || INTVAL (operands[2]) < 9)
1212 && INTVAL (operands[3]) >= 2)
1213 {
1214 register int i;
1215
1216 for (i = 1; i <= INTVAL (operands[2]) / 2; i++)
1217 output_asm_insn ("mov (%1)+, (%0)+", operands);
1218 if (INTVAL (operands[2]) & 1)
1219 output_asm_insn ("movb (%1), (%0)", operands);
1220
1221 return "";
1222 }
1223 }
1224
1225 /* Ideally we'd look for moves that are multiples of 4 or 8
1226 bytes and handle those by unrolling the move loop. That
1227 makes for a lot of code if done at run time, but it's ok
1228 for constant counts. Also, for variable counts we have
1229 to worry about odd byte count with even aligned pointers.
1230 On 11/40 and up we handle that case; on older machines
1231 we don't and just use byte-wise moves all the time. */
1232
1233 if (CONSTANT_P (operands[2]) )
1234 {
1235 if (INTVAL (operands[3]) < 2)
1236 unroll = 0;
1237 else
1238 {
1239 lastbyte = INTVAL (operands[2]) & 1;
1240
1241 if (optimize_size || INTVAL (operands[2]) & 2)
1242 unroll = 1;
1243 else if (INTVAL (operands[2]) & 4)
1244 unroll = 2;
1245 else
1246 unroll = 3;
1247 }
1248
1249 /* Loop count is byte count scaled by unroll. */
1250 operands[2] = GEN_INT (INTVAL (operands[2]) >> unroll);
1251 output_asm_insn ("mov %2, %4", operands);
1252 }
1253 else
1254 {
1255 /* Variable byte count; use the input register
1256 as the scratch. */
1257 operands[4] = operands[2];
1258
1259 /* Decide whether to move by words, and check
1260 the byte count for zero. */
1261 if (TARGET_40_PLUS && INTVAL (operands[3]) > 1)
1262 {
1263 unroll = 1;
1264 output_asm_insn ("asr %4", operands);
1265 }
1266 else
1267 {
1268 unroll = 0;
1269 output_asm_insn ("tst %4", operands);
1270 }
1271 sprintf (buf, "beq movestrhi%d", count + 1);
1272 output_asm_insn (buf, NULL);
1273 }
1274
1275 /* Output the loop label. */
1276 sprintf (buf, "\nmovestrhi%d:", count);
1277 output_asm_insn (buf, NULL);
1278
1279 /* Output the appropriate move instructions. */
1280 switch (unroll)
1281 {
1282 case 0:
1283 output_asm_insn ("movb (%1)+, (%0)+", operands);
1284 break;
1285
1286 case 1:
1287 output_asm_insn ("mov (%1)+, (%0)+", operands);
1288 break;
1289
1290 case 2:
1291 output_asm_insn ("mov (%1)+, (%0)+", operands);
1292 output_asm_insn ("mov (%1)+, (%0)+", operands);
1293 break;
1294
1295 default:
1296 output_asm_insn ("mov (%1)+, (%0)+", operands);
1297 output_asm_insn ("mov (%1)+, (%0)+", operands);
1298 output_asm_insn ("mov (%1)+, (%0)+", operands);
1299 output_asm_insn ("mov (%1)+, (%0)+", operands);
1300 break;
1301 }
1302
1303 /* Output the decrement and test. */
1304 if (TARGET_40_PLUS)
1305 {
1306 sprintf (buf, "sob %%4, movestrhi%d", count);
1307 output_asm_insn (buf, operands);
1308 }
1309 else
1310 {
1311 output_asm_insn ("dec %4", operands);
1312 sprintf (buf, "bgt movestrhi%d", count);
1313 output_asm_insn (buf, NULL);
1314 }
1315 count ++;
1316
1317 /* If constant odd byte count, move the last byte. */
1318 if (lastbyte)
1319 output_asm_insn ("movb (%1), (%0)", operands);
1320 else if (!CONSTANT_P (operands[2]))
1321 {
1322 /* Output the destination label for the zero byte count check. */
1323 sprintf (buf, "\nmovestrhi%d:", count);
1324 output_asm_insn (buf, NULL);
1325 count++;
1326
1327 /* If we did word moves, check for trailing last byte. */
1328 if (unroll)
1329 {
1330 sprintf (buf, "bcc movestrhi%d", count);
1331 output_asm_insn (buf, NULL);
1332 output_asm_insn ("movb (%1), (%0)", operands);
1333 sprintf (buf, "\nmovestrhi%d:", count);
1334 output_asm_insn (buf, NULL);
1335 count++;
1336 }
1337 }
1338
1339 return "";
1340 }
1341
1342 /* This function checks whether a real value can be encoded as
1343 a literal, i.e., addressing mode 27. In that mode, real values
1344 are one word values, so the remaining 48 bits have to be zero. */
1345 int
1346 legitimate_const_double_p (rtx address)
1347 {
1348 REAL_VALUE_TYPE r;
1349 long sval[2];
1350 REAL_VALUE_FROM_CONST_DOUBLE (r, address);
1351 REAL_VALUE_TO_TARGET_DOUBLE (r, sval);
1352 if ((sval[0] & 0xffff) == 0 && sval[1] == 0)
1353 return 1;
1354 return 0;
1355 }
1356
1357 /* Implement CANNOT_CHANGE_MODE_CLASS. */
1358 bool
1359 pdp11_cannot_change_mode_class (enum machine_mode from,
1360 enum machine_mode to,
1361 enum reg_class rclass)
1362 {
1363 /* Also, FPU registers contain a whole float value and the parts of
1364 it are not separately accessible.
1365
1366 So we disallow all mode changes involving FPRs. */
1367 if (FLOAT_MODE_P (from) != FLOAT_MODE_P (to))
1368 return true;
1369
1370 return reg_classes_intersect_p (FPU_REGS, rclass);
1371 }
1372
1373 /* TARGET_PREFERRED_RELOAD_CLASS
1374
1375 Given an rtx X being reloaded into a reg required to be
1376 in class CLASS, return the class of reg to actually use.
1377 In general this is just CLASS; but on some machines
1378 in some cases it is preferable to use a more restrictive class.
1379
1380 loading is easier into LOAD_FPU_REGS than FPU_REGS! */
1381
1382 static reg_class_t
1383 pdp11_preferred_reload_class (rtx x, reg_class_t rclass)
1384 {
1385 if (rclass == FPU_REGS)
1386 return LOAD_FPU_REGS;
1387 if (rclass == ALL_REGS)
1388 {
1389 if (FLOAT_MODE_P (GET_MODE (x)))
1390 return LOAD_FPU_REGS;
1391 else
1392 return GENERAL_REGS;
1393 }
1394 return rclass;
1395 }
1396
1397 /* TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
1398
1399 Given an rtx X being reloaded into a reg required to be
1400 in class CLASS, return the class of reg to actually use.
1401 In general this is just CLASS; but on some machines
1402 in some cases it is preferable to use a more restrictive class.
1403
1404 loading is easier into LOAD_FPU_REGS than FPU_REGS! */
1405
1406 static reg_class_t
1407 pdp11_preferred_output_reload_class (rtx x, reg_class_t rclass)
1408 {
1409 if (rclass == FPU_REGS)
1410 return LOAD_FPU_REGS;
1411 if (rclass == ALL_REGS)
1412 {
1413 if (FLOAT_MODE_P (GET_MODE (x)))
1414 return LOAD_FPU_REGS;
1415 else
1416 return GENERAL_REGS;
1417 }
1418 return rclass;
1419 }
1420
1421
1422 /* TARGET_SECONDARY_RELOAD.
1423
1424 FPU registers AC4 and AC5 (class NO_LOAD_FPU_REGS) require an
1425 intermediate register (AC0-AC3: LOAD_FPU_REGS). Everything else
1426 can be loade/stored directly. */
1427 static reg_class_t
1428 pdp11_secondary_reload (bool in_p ATTRIBUTE_UNUSED,
1429 rtx x,
1430 reg_class_t reload_class,
1431 enum machine_mode reload_mode ATTRIBUTE_UNUSED,
1432 secondary_reload_info *sri ATTRIBUTE_UNUSED)
1433 {
1434 if (reload_class != NO_LOAD_FPU_REGS || GET_CODE (x) != REG ||
1435 REGNO_REG_CLASS (REGNO (x)) == LOAD_FPU_REGS)
1436 return NO_REGS;
1437
1438 return LOAD_FPU_REGS;
1439 }
1440
1441 /* Target routine to check if register to register move requires memory.
1442
1443 The answer is yes if we're going between general register and FPU
1444 registers. The mode doesn't matter in making this check.
1445 */
1446 bool
1447 pdp11_secondary_memory_needed (reg_class_t c1, reg_class_t c2,
1448 enum machine_mode mode ATTRIBUTE_UNUSED)
1449 {
1450 int fromfloat = (c1 == LOAD_FPU_REGS || c1 == NO_LOAD_FPU_REGS ||
1451 c1 == FPU_REGS);
1452 int tofloat = (c2 == LOAD_FPU_REGS || c2 == NO_LOAD_FPU_REGS ||
1453 c2 == FPU_REGS);
1454
1455 return (fromfloat != tofloat);
1456 }
1457
1458 /* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression
1459 that is a valid memory address for an instruction.
1460 The MODE argument is the machine mode for the MEM expression
1461 that wants to use this address.
1462
1463 */
1464
1465 static bool
1466 pdp11_legitimate_address_p (enum machine_mode mode,
1467 rtx operand, bool strict)
1468 {
1469 rtx xfoob;
1470
1471 /* accept @#address */
1472 if (CONSTANT_ADDRESS_P (operand))
1473 return true;
1474
1475 switch (GET_CODE (operand))
1476 {
1477 case REG:
1478 /* accept (R0) */
1479 return !strict || REGNO_OK_FOR_BASE_P (REGNO (operand));
1480
1481 case PLUS:
1482 /* accept X(R0) */
1483 return GET_CODE (XEXP (operand, 0)) == REG
1484 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (operand, 0))))
1485 && CONSTANT_ADDRESS_P (XEXP (operand, 1));
1486
1487 case PRE_DEC:
1488 /* accept -(R0) */
1489 return GET_CODE (XEXP (operand, 0)) == REG
1490 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (operand, 0))));
1491
1492 case POST_INC:
1493 /* accept (R0)+ */
1494 return GET_CODE (XEXP (operand, 0)) == REG
1495 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (operand, 0))));
1496
1497 case PRE_MODIFY:
1498 /* accept -(SP) -- which uses PRE_MODIFY for byte mode */
1499 return GET_CODE (XEXP (operand, 0)) == REG
1500 && REGNO (XEXP (operand, 0)) == STACK_POINTER_REGNUM
1501 && GET_CODE ((xfoob = XEXP (operand, 1))) == PLUS
1502 && GET_CODE (XEXP (xfoob, 0)) == REG
1503 && REGNO (XEXP (xfoob, 0)) == STACK_POINTER_REGNUM
1504 && CONSTANT_P (XEXP (xfoob, 1))
1505 && INTVAL (XEXP (xfoob,1)) == -2;
1506
1507 case POST_MODIFY:
1508 /* accept (SP)+ -- which uses POST_MODIFY for byte mode */
1509 return GET_CODE (XEXP (operand, 0)) == REG
1510 && REGNO (XEXP (operand, 0)) == STACK_POINTER_REGNUM
1511 && GET_CODE ((xfoob = XEXP (operand, 1))) == PLUS
1512 && GET_CODE (XEXP (xfoob, 0)) == REG
1513 && REGNO (XEXP (xfoob, 0)) == STACK_POINTER_REGNUM
1514 && CONSTANT_P (XEXP (xfoob, 1))
1515 && INTVAL (XEXP (xfoob,1)) == 2;
1516
1517 case MEM:
1518 /* handle another level of indirection ! */
1519 xfoob = XEXP (operand, 0);
1520
1521 /* (MEM:xx (MEM:xx ())) is not valid for SI, DI and currently
1522 also forbidden for float, because we have to handle this
1523 in output_move_double and/or output_move_quad() - we could
1524 do it, but currently it's not worth it!!!
1525 now that DFmode cannot go into CPU register file,
1526 maybe I should allow float ...
1527 but then I have to handle memory-to-memory moves in movdf ?? */
1528 if (GET_MODE_BITSIZE(mode) > 16)
1529 return false;
1530
1531 /* accept @address */
1532 if (CONSTANT_ADDRESS_P (xfoob))
1533 return true;
1534
1535 switch (GET_CODE (xfoob))
1536 {
1537 case REG:
1538 /* accept @(R0) - which is @0(R0) */
1539 return !strict || REGNO_OK_FOR_BASE_P(REGNO (xfoob));
1540
1541 case PLUS:
1542 /* accept @X(R0) */
1543 return GET_CODE (XEXP (xfoob, 0)) == REG
1544 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (xfoob, 0))))
1545 && CONSTANT_ADDRESS_P (XEXP (xfoob, 1));
1546
1547 case PRE_DEC:
1548 /* accept @-(R0) */
1549 return GET_CODE (XEXP (xfoob, 0)) == REG
1550 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (xfoob, 0))));
1551
1552 case POST_INC:
1553 /* accept @(R0)+ */
1554 return GET_CODE (XEXP (xfoob, 0)) == REG
1555 && (!strict || REGNO_OK_FOR_BASE_P (REGNO (XEXP (xfoob, 0))));
1556
1557 default:
1558 /* anything else is invalid */
1559 return false;
1560 }
1561
1562 default:
1563 /* anything else is invalid */
1564 return false;
1565 }
1566 }
1567
1568 /* Return the class number of the smallest class containing
1569 reg number REGNO. */
1570 enum reg_class
1571 pdp11_regno_reg_class (int regno)
1572 {
1573 if (regno == FRAME_POINTER_REGNUM || regno == ARG_POINTER_REGNUM)
1574 return GENERAL_REGS;
1575 else if (regno > AC3_REGNUM)
1576 return NO_LOAD_FPU_REGS;
1577 else if (regno >= AC0_REGNUM)
1578 return LOAD_FPU_REGS;
1579 else if (regno & 1)
1580 return MUL_REGS;
1581 else
1582 return GENERAL_REGS;
1583 }
1584
1585
1586 int
1587 pdp11_sp_frame_offset (void)
1588 {
1589 int offset = 0, regno;
1590 offset = get_frame_size();
1591 for (regno = 0; regno <= PC_REGNUM; regno++)
1592 if (pdp11_saved_regno (regno))
1593 offset += 2;
1594 for (regno = AC0_REGNUM; regno <= AC5_REGNUM; regno++)
1595 if (pdp11_saved_regno (regno))
1596 offset += 8;
1597
1598 return offset;
1599 }
1600
1601 /* Return the offset between two registers, one to be eliminated, and the other
1602 its replacement, at the start of a routine. */
1603
1604 int
1605 pdp11_initial_elimination_offset (int from, int to)
1606 {
1607 int spoff;
1608
1609 if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
1610 return 4;
1611 else if (from == FRAME_POINTER_REGNUM
1612 && to == HARD_FRAME_POINTER_REGNUM)
1613 return 0;
1614 else
1615 {
1616 gcc_assert (to == STACK_POINTER_REGNUM);
1617
1618 /* Get the size of the register save area. */
1619 spoff = pdp11_sp_frame_offset ();
1620 if (from == FRAME_POINTER_REGNUM)
1621 return spoff;
1622
1623 gcc_assert (from == ARG_POINTER_REGNUM);
1624
1625 /* If there is a frame pointer, that is saved too. */
1626 if (frame_pointer_needed)
1627 spoff += 2;
1628
1629 /* Account for the saved PC in the function call. */
1630 return spoff + 2;
1631 }
1632 }
1633
1634 /* A copy of output_addr_const modified for pdp11 expression syntax.
1635 output_addr_const also gets called for %cDIGIT and %nDIGIT, which we don't
1636 use, and for debugging output, which we don't support with this port either.
1637 So this copy should get called whenever needed.
1638 */
1639 void
1640 output_addr_const_pdp11 (FILE *file, rtx x)
1641 {
1642 char buf[256];
1643 int i;
1644
1645 restart:
1646 switch (GET_CODE (x))
1647 {
1648 case PC:
1649 gcc_assert (flag_pic);
1650 putc ('.', file);
1651 break;
1652
1653 case SYMBOL_REF:
1654 assemble_name (file, XSTR (x, 0));
1655 break;
1656
1657 case LABEL_REF:
1658 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (x, 0)));
1659 assemble_name (file, buf);
1660 break;
1661
1662 case CODE_LABEL:
1663 ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
1664 assemble_name (file, buf);
1665 break;
1666
1667 case CONST_INT:
1668 i = INTVAL (x);
1669 if (i < 0)
1670 {
1671 i = -i;
1672 fprintf (file, "-");
1673 }
1674 fprintf (file, "%#o", i & 0xffff);
1675 break;
1676
1677 case CONST:
1678 /* This used to output parentheses around the expression,
1679 but that does not work on the 386 (either ATT or BSD assembler). */
1680 output_addr_const_pdp11 (file, XEXP (x, 0));
1681 break;
1682
1683 case CONST_DOUBLE:
1684 if (GET_MODE (x) == VOIDmode)
1685 {
1686 /* We can use %o if the number is one word and positive. */
1687 gcc_assert (!CONST_DOUBLE_HIGH (x));
1688 fprintf (file, "%#ho", (unsigned short) CONST_DOUBLE_LOW (x));
1689 }
1690 else
1691 /* We can't handle floating point constants;
1692 PRINT_OPERAND must handle them. */
1693 output_operand_lossage ("floating constant misused");
1694 break;
1695
1696 case PLUS:
1697 /* Some assemblers need integer constants to appear last (e.g. masm). */
1698 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
1699 {
1700 output_addr_const_pdp11 (file, XEXP (x, 1));
1701 if (INTVAL (XEXP (x, 0)) >= 0)
1702 fprintf (file, "+");
1703 output_addr_const_pdp11 (file, XEXP (x, 0));
1704 }
1705 else
1706 {
1707 output_addr_const_pdp11 (file, XEXP (x, 0));
1708 if (INTVAL (XEXP (x, 1)) >= 0)
1709 fprintf (file, "+");
1710 output_addr_const_pdp11 (file, XEXP (x, 1));
1711 }
1712 break;
1713
1714 case MINUS:
1715 /* Avoid outputting things like x-x or x+5-x,
1716 since some assemblers can't handle that. */
1717 x = simplify_subtraction (x);
1718 if (GET_CODE (x) != MINUS)
1719 goto restart;
1720
1721 output_addr_const_pdp11 (file, XEXP (x, 0));
1722 if (GET_CODE (XEXP (x, 1)) != CONST_INT
1723 || INTVAL (XEXP (x, 1)) >= 0)
1724 fprintf (file, "-");
1725 output_addr_const_pdp11 (file, XEXP (x, 1));
1726 break;
1727
1728 case ZERO_EXTEND:
1729 case SIGN_EXTEND:
1730 output_addr_const_pdp11 (file, XEXP (x, 0));
1731 break;
1732
1733 default:
1734 output_operand_lossage ("invalid expression as operand");
1735 }
1736 }
1737
1738 /* Worker function for TARGET_RETURN_IN_MEMORY. */
1739
1740 static bool
1741 pdp11_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
1742 {
1743 /* Integers 32 bits and under, and scalar floats (if FPU), are returned
1744 in registers. The rest go into memory. */
1745 return (TYPE_MODE (type) == DImode
1746 || (FLOAT_MODE_P (TYPE_MODE (type)) && ! TARGET_AC0)
1747 || TREE_CODE (type) == VECTOR_TYPE
1748 || COMPLEX_MODE_P (TYPE_MODE (type)));
1749 }
1750
1751 /* Worker function for TARGET_FUNCTION_VALUE.
1752
1753 On the pdp11 the value is found in R0 (or ac0??? not without FPU!!!! ) */
1754
1755 static rtx
1756 pdp11_function_value (const_tree valtype,
1757 const_tree fntype_or_decl ATTRIBUTE_UNUSED,
1758 bool outgoing ATTRIBUTE_UNUSED)
1759 {
1760 return gen_rtx_REG (TYPE_MODE (valtype),
1761 BASE_RETURN_VALUE_REG(TYPE_MODE(valtype)));
1762 }
1763
1764 /* Worker function for TARGET_LIBCALL_VALUE. */
1765
1766 static rtx
1767 pdp11_libcall_value (enum machine_mode mode,
1768 const_rtx fun ATTRIBUTE_UNUSED)
1769 {
1770 return gen_rtx_REG (mode, BASE_RETURN_VALUE_REG(mode));
1771 }
1772
1773 /* Worker function for TARGET_FUNCTION_VALUE_REGNO_P.
1774
1775 On the pdp, the first "output" reg is the only register thus used.
1776
1777 maybe ac0 ? - as option someday! */
1778
1779 static bool
1780 pdp11_function_value_regno_p (const unsigned int regno)
1781 {
1782 return (regno == RETVAL_REGNUM) || (TARGET_AC0 && (regno == AC0_REGNUM));
1783 }
1784
1785 /* Worker function for TARGET_TRAMPOLINE_INIT.
1786
1787 trampoline - how should i do it in separate i+d ?
1788 have some allocate_trampoline magic???
1789
1790 the following should work for shared I/D:
1791
1792 MOV #STATIC, $4 01270Y 0x0000 <- STATIC; Y = STATIC_CHAIN_REGNUM
1793 JMP @#FUNCTION 000137 0x0000 <- FUNCTION
1794 */
1795
1796 static void
1797 pdp11_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
1798 {
1799 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
1800 rtx mem;
1801
1802 gcc_assert (!TARGET_SPLIT);
1803
1804 mem = adjust_address (m_tramp, HImode, 0);
1805 emit_move_insn (mem, GEN_INT (012700+STATIC_CHAIN_REGNUM));
1806 mem = adjust_address (m_tramp, HImode, 2);
1807 emit_move_insn (mem, chain_value);
1808 mem = adjust_address (m_tramp, HImode, 4);
1809 emit_move_insn (mem, GEN_INT (000137));
1810 emit_move_insn (mem, fnaddr);
1811 }
1812
1813 /* Worker function for TARGET_FUNCTION_ARG.
1814
1815 Determine where to put an argument to a function.
1816 Value is zero to push the argument on the stack,
1817 or a hard register in which to store the argument.
1818
1819 MODE is the argument's machine mode.
1820 TYPE is the data type of the argument (as a tree).
1821 This is null for libcalls where that information may
1822 not be available.
1823 CUM is a variable of type CUMULATIVE_ARGS which gives info about
1824 the preceding args and about the function being called.
1825 NAMED is nonzero if this argument is a named parameter
1826 (otherwise it is an extra parameter matching an ellipsis). */
1827
1828 static rtx
1829 pdp11_function_arg (cumulative_args_t cum ATTRIBUTE_UNUSED,
1830 enum machine_mode mode ATTRIBUTE_UNUSED,
1831 const_tree type ATTRIBUTE_UNUSED,
1832 bool named ATTRIBUTE_UNUSED)
1833 {
1834 return NULL_RTX;
1835 }
1836
1837 /* Worker function for TARGET_FUNCTION_ARG_ADVANCE.
1838
1839 Update the data in CUM to advance over an argument of mode MODE and
1840 data type TYPE. (TYPE is null for libcalls where that information
1841 may not be available.) */
1842
1843 static void
1844 pdp11_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
1845 const_tree type, bool named ATTRIBUTE_UNUSED)
1846 {
1847 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
1848
1849 *cum += (mode != BLKmode
1850 ? GET_MODE_SIZE (mode)
1851 : int_size_in_bytes (type));
1852 }
1853
1854 /* Make sure everything's fine if we *don't* have an FPU.
1855 This assumes that putting a register in fixed_regs will keep the
1856 compiler's mitts completely off it. We don't bother to zero it out
1857 of register classes. Also fix incompatible register naming with
1858 the UNIX assembler. */
1859
1860 static void
1861 pdp11_conditional_register_usage (void)
1862 {
1863 int i;
1864 HARD_REG_SET x;
1865 if (!TARGET_FPU)
1866 {
1867 COPY_HARD_REG_SET (x, reg_class_contents[(int)FPU_REGS]);
1868 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++ )
1869 if (TEST_HARD_REG_BIT (x, i))
1870 fixed_regs[i] = call_used_regs[i] = 1;
1871 }
1872
1873 if (TARGET_AC0)
1874 call_used_regs[AC0_REGNUM] = 1;
1875 if (TARGET_UNIX_ASM)
1876 {
1877 /* Change names of FPU registers for the UNIX assembler. */
1878 reg_names[8] = "fr0";
1879 reg_names[9] = "fr1";
1880 reg_names[10] = "fr2";
1881 reg_names[11] = "fr3";
1882 reg_names[12] = "fr4";
1883 reg_names[13] = "fr5";
1884 }
1885 }
1886
1887 static section *
1888 pdp11_function_section (tree decl ATTRIBUTE_UNUSED,
1889 enum node_frequency freq ATTRIBUTE_UNUSED,
1890 bool startup ATTRIBUTE_UNUSED,
1891 bool exit ATTRIBUTE_UNUSED)
1892 {
1893 return NULL;
1894 }
1895
1896 /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
1897
1898 static bool
1899 pdp11_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
1900 {
1901 return GET_CODE (x) != CONST_DOUBLE || legitimate_const_double_p (x);
1902 }
1903
1904 struct gcc_target targetm = TARGET_INITIALIZER;