1 /* Subroutines for insn-output.c for VAX.
2 Copyright (C) 1987, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2004
3 Free Software Foundation, Inc.
5 This file is part of GCC.
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 2, or (at your option)
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
29 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
35 #include "insn-attr.h"
44 #include "target-def.h"
46 static void vax_output_function_prologue (FILE *, HOST_WIDE_INT);
47 static void vax_file_start (void);
48 static void vax_init_libfuncs (void);
49 static void vax_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
51 static int vax_address_cost_1 (rtx);
52 static int vax_address_cost (rtx);
53 static bool vax_rtx_costs (rtx, int, int, int *);
54 static rtx vax_struct_value_rtx (tree, int);
56 /* Initialize the GCC target structure. */
57 #undef TARGET_ASM_ALIGNED_HI_OP
58 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
60 #undef TARGET_ASM_FUNCTION_PROLOGUE
61 #define TARGET_ASM_FUNCTION_PROLOGUE vax_output_function_prologue
63 #undef TARGET_ASM_FILE_START
64 #define TARGET_ASM_FILE_START vax_file_start
65 #undef TARGET_ASM_FILE_START_APP_OFF
66 #define TARGET_ASM_FILE_START_APP_OFF true
68 #undef TARGET_INIT_LIBFUNCS
69 #define TARGET_INIT_LIBFUNCS vax_init_libfuncs
71 #undef TARGET_ASM_OUTPUT_MI_THUNK
72 #define TARGET_ASM_OUTPUT_MI_THUNK vax_output_mi_thunk
73 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
74 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
76 #undef TARGET_RTX_COSTS
77 #define TARGET_RTX_COSTS vax_rtx_costs
78 #undef TARGET_ADDRESS_COST
79 #define TARGET_ADDRESS_COST vax_address_cost
81 #undef TARGET_PROMOTE_PROTOTYPES
82 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
84 #undef TARGET_STRUCT_VALUE_RTX
85 #define TARGET_STRUCT_VALUE_RTX vax_struct_value_rtx
87 struct gcc_target targetm = TARGET_INITIALIZER;
89 /* Set global variables as needed for the options enabled. */
92 override_options (void)
94 /* We're VAX floating point, not IEEE floating point. */
96 REAL_MODE_FORMAT (DFmode) = &vax_g_format;
99 /* Generate the assembly code for function entry. FILE is a stdio
100 stream to output the code to. SIZE is an int: how many units of
101 temporary storage to allocate.
103 Refer to the array `regs_ever_live' to determine which registers to
104 save; `regs_ever_live[I]' is nonzero if register number I is ever
105 used in the function. This function is responsible for knowing
106 which registers should not be saved even if used. */
109 vax_output_function_prologue (FILE * file, HOST_WIDE_INT size)
112 register int mask = 0;
114 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
115 if (regs_ever_live[regno] && !call_used_regs[regno])
118 fprintf (file, "\t.word 0x%x\n", mask);
120 if (dwarf2out_do_frame ())
122 const char *label = dwarf2out_cfi_label ();
125 for (regno = FIRST_PSEUDO_REGISTER-1; regno >= 0; --regno)
126 if (regs_ever_live[regno] && !call_used_regs[regno])
127 dwarf2out_reg_save (label, regno, offset -= 4);
129 dwarf2out_reg_save (label, PC_REGNUM, offset -= 4);
130 dwarf2out_reg_save (label, FRAME_POINTER_REGNUM, offset -= 4);
131 dwarf2out_reg_save (label, ARG_POINTER_REGNUM, offset -= 4);
132 dwarf2out_def_cfa (label, FRAME_POINTER_REGNUM, -(offset - 4));
135 size -= STARTING_FRAME_OFFSET;
137 asm_fprintf (file, "\tmovab %wd(%Rsp),%Rsp\n", -size);
139 asm_fprintf (file, "\tsubl2 $%wd,%Rsp\n", size);
142 /* When debugging with stabs, we want to output an extra dummy label
143 so that gas can distinguish between D_float and G_float prior to
144 processing the .stabs directive identifying type double. */
146 vax_file_start (void)
148 default_file_start ();
150 if (write_symbols == DBX_DEBUG)
151 fprintf (asm_out_file, "___vax_%c_doubles:\n", ASM_DOUBLE_CHAR);
154 /* We can use the BSD C library routines for the libgcc calls that are
155 still generated, since that's what they boil down to anyways. When
156 ELF, avoid the user's namespace. */
159 vax_init_libfuncs (void)
161 set_optab_libfunc (udiv_optab, SImode, TARGET_ELF ? "*__udiv" : "*udiv");
162 set_optab_libfunc (umod_optab, SImode, TARGET_ELF ? "*__urem" : "*urem");
165 /* This is like nonimmediate_operand with a restriction on the type of MEM. */
168 split_quadword_operands (rtx * operands, rtx * low, int n ATTRIBUTE_UNUSED)
171 /* Split operands. */
173 low[0] = low[1] = low[2] = 0;
174 for (i = 0; i < 3; i++)
177 /* it's already been figured out */;
178 else if (GET_CODE (operands[i]) == MEM
179 && (GET_CODE (XEXP (operands[i], 0)) == POST_INC))
181 rtx addr = XEXP (operands[i], 0);
182 operands[i] = low[i] = gen_rtx_MEM (SImode, addr);
183 if (which_alternative == 0 && i == 0)
185 addr = XEXP (operands[i], 0);
186 operands[i+1] = low[i+1] = gen_rtx_MEM (SImode, addr);
191 low[i] = operand_subword (operands[i], 0, 0, DImode);
192 operands[i] = operand_subword (operands[i], 1, 0, DImode);
198 print_operand_address (FILE * file, register rtx addr)
200 register rtx reg1, breg, ireg;
204 switch (GET_CODE (addr))
208 addr = XEXP (addr, 0);
212 fprintf (file, "(%s)", reg_names[REGNO (addr)]);
216 fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
220 fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
224 /* There can be either two or three things added here. One must be a
225 REG. One can be either a REG or a MULT of a REG and an appropriate
226 constant, and the third can only be a constant or a MEM.
228 We get these two or three things and put the constant or MEM in
229 OFFSET, the MULT or REG in IREG, and the REG in BREG. If we have
230 a register and can't tell yet if it is a base or index register,
233 reg1 = 0; ireg = 0; breg = 0; offset = 0;
235 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
236 || GET_CODE (XEXP (addr, 0)) == MEM)
238 offset = XEXP (addr, 0);
239 addr = XEXP (addr, 1);
241 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
242 || GET_CODE (XEXP (addr, 1)) == MEM)
244 offset = XEXP (addr, 1);
245 addr = XEXP (addr, 0);
247 else if (GET_CODE (XEXP (addr, 1)) == MULT)
249 ireg = XEXP (addr, 1);
250 addr = XEXP (addr, 0);
252 else if (GET_CODE (XEXP (addr, 0)) == MULT)
254 ireg = XEXP (addr, 0);
255 addr = XEXP (addr, 1);
257 else if (GET_CODE (XEXP (addr, 1)) == REG)
259 reg1 = XEXP (addr, 1);
260 addr = XEXP (addr, 0);
262 else if (GET_CODE (XEXP (addr, 0)) == REG)
264 reg1 = XEXP (addr, 0);
265 addr = XEXP (addr, 1);
270 if (GET_CODE (addr) == REG)
277 else if (GET_CODE (addr) == MULT)
279 else if (GET_CODE (addr) == PLUS)
281 if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
282 || GET_CODE (XEXP (addr, 0)) == MEM)
286 if (GET_CODE (offset) == CONST_INT)
287 offset = plus_constant (XEXP (addr, 0), INTVAL (offset));
288 else if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
289 offset = plus_constant (offset, INTVAL (XEXP (addr, 0)));
293 offset = XEXP (addr, 0);
295 else if (GET_CODE (XEXP (addr, 0)) == REG)
298 ireg = reg1, breg = XEXP (addr, 0), reg1 = 0;
300 reg1 = XEXP (addr, 0);
302 else if (GET_CODE (XEXP (addr, 0)) == MULT)
306 ireg = XEXP (addr, 0);
311 if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
312 || GET_CODE (XEXP (addr, 1)) == MEM)
316 if (GET_CODE (offset) == CONST_INT)
317 offset = plus_constant (XEXP (addr, 1), INTVAL (offset));
318 else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
319 offset = plus_constant (offset, INTVAL (XEXP (addr, 1)));
323 offset = XEXP (addr, 1);
325 else if (GET_CODE (XEXP (addr, 1)) == REG)
328 ireg = reg1, breg = XEXP (addr, 1), reg1 = 0;
330 reg1 = XEXP (addr, 1);
332 else if (GET_CODE (XEXP (addr, 1)) == MULT)
336 ireg = XEXP (addr, 1);
344 /* If REG1 is nonzero, figure out if it is a base or index register. */
347 if (breg != 0 || (offset && GET_CODE (offset) == MEM))
358 output_address (offset);
361 fprintf (file, "(%s)", reg_names[REGNO (breg)]);
365 if (GET_CODE (ireg) == MULT)
366 ireg = XEXP (ireg, 0);
367 if (GET_CODE (ireg) != REG)
369 fprintf (file, "[%s]", reg_names[REGNO (ireg)]);
374 output_addr_const (file, addr);
379 rev_cond_name (rtx op)
381 switch (GET_CODE (op))
410 vax_float_literal(register rtx c)
412 register enum machine_mode mode;
413 REAL_VALUE_TYPE r, s;
416 if (GET_CODE (c) != CONST_DOUBLE)
421 if (c == const_tiny_rtx[(int) mode][0]
422 || c == const_tiny_rtx[(int) mode][1]
423 || c == const_tiny_rtx[(int) mode][2])
426 REAL_VALUE_FROM_CONST_DOUBLE (r, c);
428 for (i = 0; i < 7; i++)
431 REAL_VALUE_FROM_INT (s, x, 0, mode);
433 if (REAL_VALUES_EQUAL (r, s))
435 if (!exact_real_inverse (mode, &s))
437 if (REAL_VALUES_EQUAL (r, s))
444 /* Return the cost in cycles of a memory address, relative to register
447 Each of the following adds the indicated number of cycles:
451 1 - indexing and/or offset(register)
456 vax_address_cost_1 (register rtx addr)
458 int reg = 0, indexed = 0, indir = 0, offset = 0, predec = 0;
459 rtx plus_op0 = 0, plus_op1 = 0;
461 switch (GET_CODE (addr))
471 indexed = 1; /* 2 on VAX 2 */
474 /* byte offsets cost nothing (on a VAX 2, they cost 1 cycle) */
476 offset = (unsigned HOST_WIDE_INT)(INTVAL(addr)+128) > 256;
480 offset = 1; /* 2 on VAX 2 */
482 case LABEL_REF: /* this is probably a byte offset from the pc */
488 plus_op1 = XEXP (addr, 0);
490 plus_op0 = XEXP (addr, 0);
491 addr = XEXP (addr, 1);
494 indir = 2; /* 3 on VAX 2 */
495 addr = XEXP (addr, 0);
501 /* Up to 3 things can be added in an address. They are stored in
502 plus_op0, plus_op1, and addr. */
516 /* Indexing and register+offset can both be used (except on a VAX 2)
517 without increasing execution time over either one alone. */
518 if (reg && indexed && offset)
519 return reg + indir + offset + predec;
520 return reg + indexed + indir + offset + predec;
524 vax_address_cost (rtx x)
526 return (1 + (GET_CODE (x) == REG ? 0 : vax_address_cost_1 (x)));
529 /* Cost of an expression on a VAX. This version has costs tuned for the
530 CVAX chip (found in the VAX 3 series) with comments for variations on
533 FIXME: The costs need review, particularly for TRUNCATE, FLOAT_EXTEND
534 and FLOAT_TRUNCATE. We need a -mcpu option to allow provision of
535 costs on a per cpu basis. */
538 vax_rtx_costs (rtx x, int code, int outer_code, int *total)
540 enum machine_mode mode = GET_MODE (x);
541 int i = 0; /* may be modified in switch */
542 const char *fmt = GET_RTX_FORMAT (code); /* may be modified in switch */
546 /* On a VAX, constants from 0..63 are cheap because they can use the
547 1 byte literal constant format. Compare to -1 should be made cheap
548 so that decrement-and-branch insns can be formed more easily (if
549 the value -1 is copied to a register some decrement-and-branch
550 patterns will not match). */
554 if (outer_code == AND)
556 *total = ((unsigned HOST_WIDE_INT) ~INTVAL (x) <= 077) ? 1 : 2;
559 if ((unsigned HOST_WIDE_INT) INTVAL (x) <= 077
560 || (outer_code == COMPARE
562 || ((outer_code == PLUS || outer_code == MINUS)
563 && (unsigned HOST_WIDE_INT) -INTVAL (x) <= 077))
577 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
578 *total = vax_float_literal (x) ? 5 : 8;
580 *total = ((CONST_DOUBLE_HIGH (x) == 0
581 && (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x) < 64)
582 || (outer_code == PLUS
583 && CONST_DOUBLE_HIGH (x) == -1
584 && (unsigned HOST_WIDE_INT)-CONST_DOUBLE_LOW (x) < 64))
590 return true; /* Implies register operand. */
594 return true; /* Implies register operand. */
600 *total = 16; /* 4 on VAX 9000 */
603 *total = 9; /* 4 on VAX 9000, 12 on VAX 2 */
606 *total = 16; /* 6 on VAX 9000, 28 on VAX 2 */
611 *total = 10; /* 3-4 on VAX 9000, 20-28 on VAX 2 */
614 *total = MAX_COST; /* Mode is not supported. */
622 *total = MAX_COST; /* Mode is not supported. */
630 *total = 30; /* Highly variable. */
631 else if (mode == DFmode)
632 /* divide takes 28 cycles if the result is not zero, 13 otherwise */
635 *total = 11; /* 25 on VAX 2 */
645 *total = MAX_COST; /* Mode is not supported. */
652 *total = (6 /* 4 on VAX 9000 */
653 + (mode == DFmode) + (GET_MODE (XEXP (x, 0)) != SImode));
657 *total = 7; /* 17 on VAX 2 */
666 *total = 10; /* 6 on VAX 9000 */
671 *total = 6; /* 5 on VAX 2, 4 on VAX 9000 */
672 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
673 fmt = "e"; /* all constant rotate counts are short */
678 *total = (mode == DFmode) ? 13 : 8; /* 6/8 on VAX 9000, 16/15 on VAX 2 */
679 /* Small integer operands can use subl2 and addl2. */
680 if ((GET_CODE (XEXP (x, 1)) == CONST_INT)
681 && (unsigned HOST_WIDE_INT)(INTVAL (XEXP (x, 1)) + 63) < 127)
691 /* AND is special because the first operand is complemented. */
693 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
695 if ((unsigned HOST_WIDE_INT)~INTVAL (XEXP (x, 0)) > 63)
705 else if (mode == SFmode)
707 else if (mode == DImode)
723 if (mode == DImode || mode == DFmode)
724 *total = 5; /* 7 on VAX 2 */
726 *total = 3; /* 4 on VAX 2 */
728 if (GET_CODE (x) != REG && GET_CODE (x) != POST_INC)
729 *total += vax_address_cost_1 (x);
735 *total = 3; /* FIXME: Costs need to be checked */
742 /* Now look inside the expression. Operands which are not registers or
743 short constants add to the cost.
745 FMT and I may have been adjusted in the switch above for instructions
746 which require special handling. */
748 while (*fmt++ == 'e')
750 rtx op = XEXP (x, i);
753 code = GET_CODE (op);
755 /* A NOT is likely to be found as the first operand of an AND
756 (in which case the relevant cost is of the operand inside
757 the not) and not likely to be found anywhere else. */
759 op = XEXP (op, 0), code = GET_CODE (op);
764 if ((unsigned HOST_WIDE_INT)INTVAL (op) > 63
765 && GET_MODE (x) != QImode)
766 *total += 1; /* 2 on VAX 2 */
771 *total += 1; /* 2 on VAX 2 */
774 if (GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT)
776 /* Registers are faster than floating point constants -- even
777 those constants which can be encoded in a single byte. */
778 if (vax_float_literal (op))
781 *total += (GET_MODE (x) == DFmode) ? 3 : 2;
785 if (CONST_DOUBLE_HIGH (op) != 0
786 || (unsigned)CONST_DOUBLE_LOW (op) > 63)
791 *total += 1; /* 2 on VAX 2 */
792 if (GET_CODE (XEXP (op, 0)) != REG)
793 *total += vax_address_cost_1 (XEXP (op, 0));
806 /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
807 Used for C++ multiple inheritance.
808 .mask ^m<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11> #conservative entry mask
809 addl2 $DELTA, 4(ap) #adjust first argument
810 jmp FUNCTION+2 #jump beyond FUNCTION's entry mask
814 vax_output_mi_thunk (FILE * file,
815 tree thunk ATTRIBUTE_UNUSED,
817 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
820 fprintf (file, "\t.word 0x0ffc\n\taddl2 $" HOST_WIDE_INT_PRINT_DEC, delta);
821 asm_fprintf (file, ",4(%Rap)\n");
822 fprintf (file, "\tjmp ");
823 assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
824 fprintf (file, "+2\n");
828 vax_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
829 int incoming ATTRIBUTE_UNUSED)
831 return gen_rtx_REG (Pmode, VAX_STRUCT_VALUE_REGNUM);
834 /* Worker function for NOTICE_UPDATE_CC. */
837 vax_notice_update_cc (rtx exp, rtx insn ATTRIBUTE_UNUSED)
839 if (GET_CODE (exp) == SET)
841 if (GET_CODE (SET_SRC (exp)) == CALL)
843 else if (GET_CODE (SET_DEST (exp)) != ZERO_EXTRACT
844 && GET_CODE (SET_DEST (exp)) != PC)
847 /* The integer operations below don't set carry or
848 set it in an incompatible way. That's ok though
849 as the Z bit is all we need when doing unsigned
850 comparisons on the result of these insns (since
851 they're always with 0). Set CC_NO_OVERFLOW to
852 generate the correct unsigned branches. */
853 switch (GET_CODE (SET_SRC (exp)))
856 if (GET_MODE_CLASS (GET_MODE (exp)) == MODE_FLOAT)
864 cc_status.flags = CC_NO_OVERFLOW;
869 cc_status.value1 = SET_DEST (exp);
870 cc_status.value2 = SET_SRC (exp);
873 else if (GET_CODE (exp) == PARALLEL
874 && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
876 if (GET_CODE (SET_SRC (XVECEXP (exp, 0, 0))) == CALL)
878 else if (GET_CODE (SET_DEST (XVECEXP (exp, 0, 0))) != PC)
881 cc_status.value1 = SET_DEST (XVECEXP (exp, 0, 0));
882 cc_status.value2 = SET_SRC (XVECEXP (exp, 0, 0));
885 /* PARALLELs whose first element sets the PC are aob,
886 sob insns. They do change the cc's. */
891 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
893 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
894 cc_status.value2 = 0;
895 if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM
897 && GET_CODE (cc_status.value2) == MEM)
898 cc_status.value2 = 0;
899 /* Actual condition, one line up, should be that value2's address
900 depends on value1, but that is too much of a pain. */