1 /* Subroutines for insn-output.c for Matsushita MN10300 series
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Contributed by Jeff Law (law@cygnus.com).
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
28 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
33 #include "insn-attr.h"
43 #include "target-def.h"
45 /* The size of the callee register save area. Right now we save everything
46 on entry since it costs us nothing in code size. It does cost us from a
47 speed standpoint, so we want to optimize this sooner or later. */
48 #define REG_SAVE_BYTES (4 * regs_ever_live[2] \
49 + 4 * regs_ever_live[3] \
50 + 4 * regs_ever_live[6] \
51 + 4 * regs_ever_live[7] \
52 + 16 * (regs_ever_live[14] || regs_ever_live[15] \
53 || regs_ever_live[16] || regs_ever_live[17]))
55 /* Initialize the GCC target structure. */
57 struct gcc_target targetm
= TARGET_INITIALIZER
;
63 fprintf (file
, "#\tGCC For the Matsushita MN10300\n");
65 fprintf (file
, "# -O%d\n", optimize
);
67 fprintf (file
, "\n\n");
70 fprintf (file
, "\t.am33\n");
71 output_file_directive (file
, main_input_filename
);
75 /* Print operand X using operand code CODE to assembly language output file
79 print_operand (file
, x
, code
)
88 /* These are normal and reversed branches. */
89 switch (code
== 'b' ? GET_CODE (x
) : reverse_condition (GET_CODE (x
)))
101 fprintf (file
, "gt");
104 fprintf (file
, "le");
107 fprintf (file
, "lt");
110 fprintf (file
, "cc");
113 fprintf (file
, "hi");
116 fprintf (file
, "ls");
119 fprintf (file
, "cs");
126 /* This is used for the operand to a call instruction;
127 if it's a REG, enclose it in parens, else output
128 the operand normally. */
129 if (GET_CODE (x
) == REG
)
132 print_operand (file
, x
, 0);
136 print_operand (file
, x
, 0);
139 /* These are the least significant word in a 64bit value. */
141 switch (GET_CODE (x
))
145 output_address (XEXP (x
, 0));
150 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
154 fprintf (file
, "%s", reg_names
[subreg_regno (x
)]);
162 switch (GET_MODE (x
))
165 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
166 REAL_VALUE_TO_TARGET_DOUBLE (rv
, val
);
167 fprintf (file
, "0x%lx", val
[0]);
170 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
171 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
[0]);
172 fprintf (file
, "0x%lx", val
[0]);
176 print_operand_address (file
,
177 GEN_INT (CONST_DOUBLE_LOW (x
)));
188 split_double (x
, &low
, &high
);
189 fprintf (file
, "%ld", (long)INTVAL (low
));
198 /* Similarly, but for the most significant word. */
200 switch (GET_CODE (x
))
204 x
= adjust_address (x
, SImode
, 4);
205 output_address (XEXP (x
, 0));
210 fprintf (file
, "%s", reg_names
[REGNO (x
) + 1]);
214 fprintf (file
, "%s", reg_names
[subreg_regno (x
) + 1]);
222 switch (GET_MODE (x
))
225 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
226 REAL_VALUE_TO_TARGET_DOUBLE (rv
, val
);
227 fprintf (file
, "0x%lx", val
[1]);
233 print_operand_address (file
,
234 GEN_INT (CONST_DOUBLE_HIGH (x
)));
245 split_double (x
, &low
, &high
);
246 fprintf (file
, "%ld", (long)INTVAL (high
));
257 if (GET_CODE (XEXP (x
, 0)) == REG
)
258 output_address (gen_rtx_PLUS (SImode
, XEXP (x
, 0), GEN_INT (0)));
260 output_address (XEXP (x
, 0));
265 output_address (GEN_INT ((~INTVAL (x
)) & 0xff));
268 /* For shift counts. The hardware ignores the upper bits of
269 any immediate, but the assembler will flag an out of range
270 shift count as an error. So we mask off the high bits
271 of the immediate here. */
273 if (GET_CODE (x
) == CONST_INT
)
275 fprintf (file
, "%d", INTVAL (x
) & 0x1f);
281 switch (GET_CODE (x
))
285 output_address (XEXP (x
, 0));
294 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
298 fprintf (file
, "%s", reg_names
[subreg_regno (x
)]);
301 /* This will only be single precision.... */
307 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
308 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
309 fprintf (file
, "0x%lx", val
);
318 print_operand_address (file
, x
);
327 /* Output assembly language output for the address ADDR to FILE. */
330 print_operand_address (file
, addr
)
334 switch (GET_CODE (addr
))
337 print_operand_address (file
, XEXP (addr
, 0));
341 print_operand (file
, addr
, 0);
346 if (REG_P (XEXP (addr
, 0))
347 && REG_OK_FOR_BASE_P (XEXP (addr
, 0)))
348 base
= XEXP (addr
, 0), index
= XEXP (addr
, 1);
349 else if (REG_P (XEXP (addr
, 1))
350 && REG_OK_FOR_BASE_P (XEXP (addr
, 1)))
351 base
= XEXP (addr
, 1), index
= XEXP (addr
, 0);
354 print_operand (file
, index
, 0);
356 print_operand (file
, base
, 0);;
360 output_addr_const (file
, addr
);
363 output_addr_const (file
, addr
);
368 /* Print a set of registers in the format required by "movm" and "ret".
369 Register K is saved if bit K of MASK is set. The data and address
370 registers can be stored individually, but the extended registers cannot.
371 We assume that the mask alread takes that into account. For instance,
372 bits 14 to 17 must have the same value. */
375 mn10300_print_reg_list (file
, mask
)
385 for (i
= 0; i
< FIRST_EXTENDED_REGNUM
; i
++)
386 if ((mask
& (1 << i
)) != 0)
390 fputs (reg_names
[i
], file
);
394 if ((mask
& 0x3c000) != 0)
396 if ((mask
& 0x3c000) != 0x3c000)
400 fputs ("exreg1", file
);
408 can_use_return_insn ()
410 /* size includes the fixed stack space needed for function calls. */
411 int size
= get_frame_size () + current_function_outgoing_args_size
;
413 /* And space for the return pointer. */
414 size
+= current_function_outgoing_args_size
? 4 : 0;
416 return (reload_completed
418 && !regs_ever_live
[2]
419 && !regs_ever_live
[3]
420 && !regs_ever_live
[6]
421 && !regs_ever_live
[7]
422 && !regs_ever_live
[14]
423 && !regs_ever_live
[15]
424 && !regs_ever_live
[16]
425 && !regs_ever_live
[17]
426 && !frame_pointer_needed
);
429 /* Returns the set of live, callee-saved registers as a bitmask. The
430 callee-saved extended registers cannot be stored individually, so
431 all of them will be included in the mask if any one of them is used. */
434 mn10300_get_live_callee_saved_regs ()
440 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
441 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
443 if ((mask
& 0x3c000) != 0)
449 /* Generate an instruction that pushes several registers onto the stack.
450 Register K will be saved if bit K in MASK is set. The function does
451 nothing if MASK is zero.
453 To be compatible with the "movm" instruction, the lowest-numbered
454 register must be stored in the lowest slot. If MASK is the set
455 { R1,...,RN }, where R1...RN are ordered least first, the generated
456 instruction will have the form:
459 (set (reg:SI 9) (plus:SI (reg:SI 9) (const_int -N*4)))
460 (set (mem:SI (plus:SI (reg:SI 9)
464 (set (mem:SI (plus:SI (reg:SI 9)
469 mn10300_gen_multiple_store (mask
)
479 /* Count how many registers need to be saved. */
481 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
482 if ((mask
& (1 << i
)) != 0)
485 /* We need one PARALLEL element to update the stack pointer and
486 an additional element for each register that is stored. */
487 par
= gen_rtx_PARALLEL (VOIDmode
, rtvec_alloc (count
+ 1));
489 /* Create the instruction that updates the stack pointer. */
491 = gen_rtx_SET (SImode
,
493 gen_rtx_PLUS (SImode
,
495 GEN_INT (-count
* 4)));
497 /* Create each store. */
499 for (i
= FIRST_PSEUDO_REGISTER
- 1; i
>= 0; i
--)
500 if ((mask
& (1 << i
)) != 0)
502 rtx address
= gen_rtx_PLUS (SImode
,
504 GEN_INT (-pari
* 4));
505 XVECEXP(par
, 0, pari
)
506 = gen_rtx_SET (VOIDmode
,
507 gen_rtx_MEM (SImode
, address
),
508 gen_rtx_REG (SImode
, i
));
512 par
= emit_insn (par
);
513 RTX_FRAME_RELATED_P (par
) = 1;
522 /* SIZE includes the fixed stack space needed for function calls. */
523 size
= get_frame_size () + current_function_outgoing_args_size
;
524 size
+= (current_function_outgoing_args_size
? 4 : 0);
526 /* If this is an old-style varargs function, then its arguments
527 need to be flushed back to the stack. */
528 if (current_function_varargs
)
530 emit_move_insn (gen_rtx_MEM (SImode
,
531 plus_constant (stack_pointer_rtx
, 4)),
532 gen_rtx_REG (SImode
, 0));
533 emit_move_insn (gen_rtx_MEM (SImode
,
534 plus_constant (stack_pointer_rtx
, 8)),
535 gen_rtx_REG (SImode
, 1));
538 /* If we use any of the callee-saved registers, save them now. */
539 mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
541 /* Now put the frame pointer into the frame pointer register. */
542 if (frame_pointer_needed
)
543 emit_move_insn (frame_pointer_rtx
, stack_pointer_rtx
);
545 /* Allocate stack for this frame. */
547 emit_insn (gen_addsi3 (stack_pointer_rtx
,
557 /* SIZE includes the fixed stack space needed for function calls. */
558 size
= get_frame_size () + current_function_outgoing_args_size
;
559 size
+= (current_function_outgoing_args_size
? 4 : 0);
561 /* Maybe cut back the stack, except for the register save area.
563 If the frame pointer exists, then use the frame pointer to
566 If the stack size + register save area is more than 255 bytes,
567 then the stack must be cut back here since the size + register
568 save size is too big for a ret/retf instruction.
570 Else leave it alone, it will be cut back as part of the
571 ret/retf instruction, or there wasn't any stack to begin with.
573 Under no circumstanes should the register save area be
574 deallocated here, that would leave a window where an interrupt
575 could occur and trash the register save area. */
576 if (frame_pointer_needed
)
578 emit_move_insn (stack_pointer_rtx
, frame_pointer_rtx
);
581 else if (size
+ REG_SAVE_BYTES
> 255)
583 emit_insn (gen_addsi3 (stack_pointer_rtx
,
589 /* Adjust the stack and restore callee-saved registers, if any. */
590 if (size
|| regs_ever_live
[2] || regs_ever_live
[3]
591 || regs_ever_live
[6] || regs_ever_live
[7]
592 || regs_ever_live
[14] || regs_ever_live
[15]
593 || regs_ever_live
[16] || regs_ever_live
[17]
594 || frame_pointer_needed
)
595 emit_jump_insn (gen_return_internal_regs
596 (GEN_INT (size
+ REG_SAVE_BYTES
)));
598 emit_jump_insn (gen_return_internal ());
601 /* Update the condition code from the insn. */
604 notice_update_cc (body
, insn
)
608 switch (get_attr_cc (insn
))
611 /* Insn does not affect CC at all. */
615 /* Insn does not change CC, but the 0'th operand has been changed. */
616 if (cc_status
.value1
!= 0
617 && reg_overlap_mentioned_p (recog_data
.operand
[0], cc_status
.value1
))
618 cc_status
.value1
= 0;
622 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
625 cc_status
.flags
|= CC_NO_CARRY
| CC_OVERFLOW_UNUSABLE
;
626 cc_status
.value1
= recog_data
.operand
[0];
630 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
633 cc_status
.flags
|= CC_NO_CARRY
;
634 cc_status
.value1
= recog_data
.operand
[0];
638 /* The insn is a compare instruction. */
640 cc_status
.value1
= SET_SRC (body
);
644 /* The insn is a compare instruction. */
646 cc_status
.value1
= SET_SRC (body
);
647 cc_status
.flags
|= CC_INVERTED
;
651 /* Insn doesn't leave CC in a usable state. */
660 /* Recognise the PARALLEL rtx generated by mn10300_gen_multiple_store().
661 This function is for MATCH_PARALLEL and so assumes OP is known to be
662 parallel. If OP is a multiple store, return a mask indicating which
663 registers it saves. Return 0 otherwise. */
666 store_multiple_operation (op
, mode
)
668 enum machine_mode mode ATTRIBUTE_UNUSED
;
676 count
= XVECLEN (op
, 0);
680 /* Check that first instruction has the form (set (sp) (plus A B)) */
681 elt
= XVECEXP (op
, 0, 0);
682 if (GET_CODE (elt
) != SET
683 || GET_CODE (SET_DEST (elt
)) != REG
684 || REGNO (SET_DEST (elt
)) != STACK_POINTER_REGNUM
685 || GET_CODE (SET_SRC (elt
)) != PLUS
)
688 /* Check that A is the stack pointer and B is the expected stack size.
689 For OP to match, each subsequent instruction should push a word onto
690 the stack. We therefore expect the first instruction to create
691 COUNT-1 stack slots. */
693 if (GET_CODE (XEXP (elt
, 0)) != REG
694 || REGNO (XEXP (elt
, 0)) != STACK_POINTER_REGNUM
695 || GET_CODE (XEXP (elt
, 1)) != CONST_INT
696 || INTVAL (XEXP (elt
, 1)) != -(count
- 1) * 4)
699 /* Now go through the rest of the vector elements. They must be
700 ordered so that the first instruction stores the highest-numbered
701 register to the highest stack slot and that subsequent instructions
702 store a lower-numbered register to the slot below.
704 LAST keeps track of the smallest-numbered register stored so far.
705 MASK is the set of stored registers. */
706 last
= FIRST_PSEUDO_REGISTER
;
708 for (i
= 1; i
< count
; i
++)
710 /* Check that element i is a (set (mem M) R) and that R is valid. */
711 elt
= XVECEXP (op
, 0, i
);
712 if (GET_CODE (elt
) != SET
713 || GET_CODE (SET_DEST (elt
)) != MEM
714 || GET_CODE (SET_SRC (elt
)) != REG
715 || REGNO (SET_SRC (elt
)) >= last
)
718 /* R was OK, so provisionally add it to MASK. We return 0 in any
719 case if the rest of the instruction has a flaw. */
720 last
= REGNO (SET_SRC (elt
));
723 /* Check that M has the form (plus (sp) (const_int -I*4)) */
724 elt
= XEXP (SET_DEST (elt
), 0);
725 if (GET_CODE (elt
) != PLUS
726 || GET_CODE (XEXP (elt
, 0)) != REG
727 || REGNO (XEXP (elt
, 0)) != STACK_POINTER_REGNUM
728 || GET_CODE (XEXP (elt
, 1)) != CONST_INT
729 || INTVAL (XEXP (elt
, 1)) != -i
* 4)
733 /* All or none of the callee-saved extended registers must be in the set. */
734 if ((mask
& 0x3c000) != 0
735 && (mask
& 0x3c000) != 0x3c000)
741 /* Return true if OP is a valid call operand. */
744 call_address_operand (op
, mode
)
746 enum machine_mode mode ATTRIBUTE_UNUSED
;
748 return (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == REG
);
751 /* What (if any) secondary registers are needed to move IN with mode
752 MODE into a register in register class CLASS.
754 We might be able to simplify this. */
756 secondary_reload_class (class, mode
, in
)
757 enum reg_class
class;
758 enum machine_mode mode
;
761 /* Memory loads less than a full word wide can't have an
762 address or stack pointer destination. They must use
763 a data register as an intermediate register. */
764 if ((GET_CODE (in
) == MEM
765 || (GET_CODE (in
) == REG
766 && REGNO (in
) >= FIRST_PSEUDO_REGISTER
)
767 || (GET_CODE (in
) == SUBREG
768 && GET_CODE (SUBREG_REG (in
)) == REG
769 && REGNO (SUBREG_REG (in
)) >= FIRST_PSEUDO_REGISTER
))
770 && (mode
== QImode
|| mode
== HImode
)
771 && (class == ADDRESS_REGS
|| class == SP_REGS
772 || class == SP_OR_ADDRESS_REGS
))
775 return DATA_OR_EXTENDED_REGS
;
779 /* We can't directly load sp + const_int into a data register;
780 we must use an address register as an intermediate. */
782 && class != ADDRESS_REGS
783 && class != SP_OR_ADDRESS_REGS
784 && class != SP_OR_EXTENDED_REGS
785 && class != ADDRESS_OR_EXTENDED_REGS
786 && class != SP_OR_ADDRESS_OR_EXTENDED_REGS
787 && (in
== stack_pointer_rtx
788 || (GET_CODE (in
) == PLUS
789 && (XEXP (in
, 0) == stack_pointer_rtx
790 || XEXP (in
, 1) == stack_pointer_rtx
))))
793 if (GET_CODE (in
) == PLUS
794 && (XEXP (in
, 0) == stack_pointer_rtx
795 || XEXP (in
, 1) == stack_pointer_rtx
))
798 return DATA_OR_EXTENDED_REGS
;
802 /* Otherwise assume no secondary reloads are needed. */
807 initial_offset (from
, to
)
810 /* The difference between the argument pointer and the frame pointer
811 is the size of the callee register save area. */
812 if (from
== ARG_POINTER_REGNUM
&& to
== FRAME_POINTER_REGNUM
)
814 if (regs_ever_live
[2] || regs_ever_live
[3]
815 || regs_ever_live
[6] || regs_ever_live
[7]
816 || regs_ever_live
[14] || regs_ever_live
[15]
817 || regs_ever_live
[16] || regs_ever_live
[17]
818 || frame_pointer_needed
)
819 return REG_SAVE_BYTES
;
824 /* The difference between the argument pointer and the stack pointer is
825 the sum of the size of this function's frame, the callee register save
826 area, and the fixed stack space needed for function calls (if any). */
827 if (from
== ARG_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
829 if (regs_ever_live
[2] || regs_ever_live
[3]
830 || regs_ever_live
[6] || regs_ever_live
[7]
831 || regs_ever_live
[14] || regs_ever_live
[15]
832 || regs_ever_live
[16] || regs_ever_live
[17]
833 || frame_pointer_needed
)
834 return (get_frame_size () + REG_SAVE_BYTES
835 + (current_function_outgoing_args_size
836 ? current_function_outgoing_args_size
+ 4 : 0));
838 return (get_frame_size ()
839 + (current_function_outgoing_args_size
840 ? current_function_outgoing_args_size
+ 4 : 0));
843 /* The difference between the frame pointer and stack pointer is the sum
844 of the size of this function's frame and the fixed stack space needed
845 for function calls (if any). */
846 if (from
== FRAME_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
847 return (get_frame_size ()
848 + (current_function_outgoing_args_size
849 ? current_function_outgoing_args_size
+ 4 : 0));
854 /* Flush the argument registers to the stack for a stdarg function;
855 return the new argument pointer. */
857 mn10300_builtin_saveregs ()
860 tree fntype
= TREE_TYPE (current_function_decl
);
861 int argadj
= ((!(TYPE_ARG_TYPES (fntype
) != 0
862 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype
)))
864 ? UNITS_PER_WORD
: 0);
865 int set
= get_varargs_alias_set ();
868 offset
= plus_constant (current_function_arg_offset_rtx
, argadj
);
870 offset
= current_function_arg_offset_rtx
;
872 mem
= gen_rtx_MEM (SImode
, current_function_internal_arg_pointer
);
873 set_mem_alias_set (mem
, set
);
874 emit_move_insn (mem
, gen_rtx_REG (SImode
, 0));
876 mem
= gen_rtx_MEM (SImode
,
877 plus_constant (current_function_internal_arg_pointer
, 4));
878 set_mem_alias_set (mem
, set
);
879 emit_move_insn (mem
, gen_rtx_REG (SImode
, 1));
881 return copy_to_reg (expand_binop (Pmode
, add_optab
,
882 current_function_internal_arg_pointer
,
883 offset
, 0, 0, OPTAB_LIB_WIDEN
));
887 mn10300_va_start (stdarg_p
, valist
, nextarg
)
893 nextarg
= expand_builtin_saveregs ();
895 std_expand_builtin_va_start (stdarg_p
, valist
, nextarg
);
899 mn10300_va_arg (valist
, type
)
902 HOST_WIDE_INT align
, rsize
;
905 /* Compute the rounded size of the type. */
906 align
= PARM_BOUNDARY
/ BITS_PER_UNIT
;
907 rsize
= (((int_size_in_bytes (type
) + align
- 1) / align
) * align
);
909 t
= build (POSTINCREMENT_EXPR
, TREE_TYPE (valist
), valist
,
910 build_int_2 ((rsize
> 8 ? 4 : rsize
), 0));
911 TREE_SIDE_EFFECTS (t
) = 1;
913 ptr
= build_pointer_type (type
);
915 /* "Large" types are passed by reference. */
918 pptr
= build_pointer_type (ptr
);
919 t
= build1 (NOP_EXPR
, pptr
, t
);
920 TREE_SIDE_EFFECTS (t
) = 1;
922 t
= build1 (INDIRECT_REF
, ptr
, t
);
923 TREE_SIDE_EFFECTS (t
) = 1;
927 t
= build1 (NOP_EXPR
, ptr
, t
);
928 TREE_SIDE_EFFECTS (t
) = 1;
932 return expand_expr (t
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
935 /* Return an RTX to represent where a value with mode MODE will be returned
936 from a function. If the result is 0, the argument is pushed. */
939 function_arg (cum
, mode
, type
, named
)
940 CUMULATIVE_ARGS
*cum
;
941 enum machine_mode mode
;
943 int named ATTRIBUTE_UNUSED
;
948 /* We only support using 2 data registers as argument registers. */
951 /* Figure out the size of the object to be passed. */
953 size
= int_size_in_bytes (type
);
955 size
= GET_MODE_SIZE (mode
);
957 /* Figure out the alignment of the object to be passed. */
960 cum
->nbytes
= (cum
->nbytes
+ 3) & ~3;
962 /* Don't pass this arg via a register if all the argument registers
964 if (cum
->nbytes
> nregs
* UNITS_PER_WORD
)
967 /* Don't pass this arg via a register if it would be split between
968 registers and memory. */
969 if (type
== NULL_TREE
970 && cum
->nbytes
+ size
> nregs
* UNITS_PER_WORD
)
973 switch (cum
->nbytes
/ UNITS_PER_WORD
)
976 result
= gen_rtx_REG (mode
, 0);
979 result
= gen_rtx_REG (mode
, 1);
988 /* Return the number of registers to use for an argument passed partially
989 in registers and partially in memory. */
992 function_arg_partial_nregs (cum
, mode
, type
, named
)
993 CUMULATIVE_ARGS
*cum
;
994 enum machine_mode mode
;
996 int named ATTRIBUTE_UNUSED
;
1000 /* We only support using 2 data registers as argument registers. */
1003 /* Figure out the size of the object to be passed. */
1004 if (mode
== BLKmode
)
1005 size
= int_size_in_bytes (type
);
1007 size
= GET_MODE_SIZE (mode
);
1009 /* Figure out the alignment of the object to be passed. */
1012 cum
->nbytes
= (cum
->nbytes
+ 3) & ~3;
1014 /* Don't pass this arg via a register if all the argument registers
1016 if (cum
->nbytes
> nregs
* UNITS_PER_WORD
)
1019 if (cum
->nbytes
+ size
<= nregs
* UNITS_PER_WORD
)
1022 /* Don't pass this arg via a register if it would be split between
1023 registers and memory. */
1024 if (type
== NULL_TREE
1025 && cum
->nbytes
+ size
> nregs
* UNITS_PER_WORD
)
1028 return (nregs
* UNITS_PER_WORD
- cum
->nbytes
) / UNITS_PER_WORD
;
1031 /* Output a tst insn. */
1033 output_tst (operand
, insn
)
1039 /* We can save a byte if we can find a register which has the value
1041 temp
= PREV_INSN (insn
);
1042 while (optimize
&& temp
)
1046 /* We allow the search to go through call insns. We record
1047 the fact that we've past a CALL_INSN and reject matches which
1048 use call clobbered registers. */
1049 if (GET_CODE (temp
) == CODE_LABEL
1050 || GET_CODE (temp
) == JUMP_INSN
1051 || GET_CODE (temp
) == BARRIER
)
1054 if (GET_CODE (temp
) == CALL_INSN
)
1057 if (GET_CODE (temp
) == NOTE
)
1059 temp
= PREV_INSN (temp
);
1063 /* It must be an insn, see if it is a simple set. */
1064 set
= single_set (temp
);
1067 temp
= PREV_INSN (temp
);
1071 /* Are we setting a data register to zero (this does not win for
1074 If it's a call clobbered register, have we past a call?
1076 Make sure the register we find isn't the same as ourself;
1077 the mn10300 can't encode that.
1079 ??? reg_set_between_p return nonzero anytime we pass a CALL_INSN
1080 so the code to detect calls here isn't doing anything useful. */
1081 if (REG_P (SET_DEST (set
))
1082 && SET_SRC (set
) == CONST0_RTX (GET_MODE (SET_DEST (set
)))
1083 && !reg_set_between_p (SET_DEST (set
), temp
, insn
)
1084 && (REGNO_REG_CLASS (REGNO (SET_DEST (set
)))
1085 == REGNO_REG_CLASS (REGNO (operand
)))
1086 && REGNO_REG_CLASS (REGNO (SET_DEST (set
))) != EXTENDED_REGS
1087 && REGNO (SET_DEST (set
)) != REGNO (operand
)
1089 || !call_used_regs
[REGNO (SET_DEST (set
))]))
1092 xoperands
[0] = operand
;
1093 xoperands
[1] = SET_DEST (set
);
1095 output_asm_insn ("cmp %1,%0", xoperands
);
1099 if (REGNO_REG_CLASS (REGNO (operand
)) == EXTENDED_REGS
1100 && REG_P (SET_DEST (set
))
1101 && SET_SRC (set
) == CONST0_RTX (GET_MODE (SET_DEST (set
)))
1102 && !reg_set_between_p (SET_DEST (set
), temp
, insn
)
1103 && (REGNO_REG_CLASS (REGNO (SET_DEST (set
)))
1104 != REGNO_REG_CLASS (REGNO (operand
)))
1105 && REGNO_REG_CLASS (REGNO (SET_DEST (set
))) == EXTENDED_REGS
1106 && REGNO (SET_DEST (set
)) != REGNO (operand
)
1108 || !call_used_regs
[REGNO (SET_DEST (set
))]))
1111 xoperands
[0] = operand
;
1112 xoperands
[1] = SET_DEST (set
);
1114 output_asm_insn ("cmp %1,%0", xoperands
);
1117 temp
= PREV_INSN (temp
);
1123 impossible_plus_operand (op
, mode
)
1125 enum machine_mode mode ATTRIBUTE_UNUSED
;
1127 if (GET_CODE (op
) != PLUS
)
1130 if (XEXP (op
, 0) == stack_pointer_rtx
1131 || XEXP (op
, 1) == stack_pointer_rtx
)
1137 /* Return 1 if X is a CONST_INT that is only 8 bits wide. This is used
1138 for the btst insn which may examine memory or a register (the memory
1139 variant only allows an unsigned 8 bit integer). */
1141 const_8bit_operand (op
, mode
)
1143 enum machine_mode mode ATTRIBUTE_UNUSED
;
1145 return (GET_CODE (op
) == CONST_INT
1147 && INTVAL (op
) < 256);
1150 /* Similarly, but when using a zero_extract pattern for a btst where
1151 the source operand might end up in memory. */
1153 mask_ok_for_mem_btst (len
, bit
)
1166 /* MASK must bit into an 8bit value. */
1167 return (((mask
& 0xff) == mask
)
1168 || ((mask
& 0xff00) == mask
)
1169 || ((mask
& 0xff0000) == mask
)
1170 || ((mask
& 0xff000000) == mask
));
1173 /* Return 1 if X contains a symbolic expression. We know these
1174 expressions will have one of a few well defined forms, so
1175 we need only check those forms. */
1177 symbolic_operand (op
, mode
)
1179 enum machine_mode mode ATTRIBUTE_UNUSED
;
1181 switch (GET_CODE (op
))
1188 return ((GET_CODE (XEXP (op
, 0)) == SYMBOL_REF
1189 || GET_CODE (XEXP (op
, 0)) == LABEL_REF
)
1190 && GET_CODE (XEXP (op
, 1)) == CONST_INT
);
1196 /* Try machine dependent ways of modifying an illegitimate address
1197 to be legitimate. If we find one, return the new valid address.
1198 This macro is used in only one place: `memory_address' in explow.c.
1200 OLDX is the address as it was before break_out_memory_refs was called.
1201 In some cases it is useful to look at this to decide what needs to be done.
1203 MODE and WIN are passed so that this macro can use
1204 GO_IF_LEGITIMATE_ADDRESS.
1206 Normally it is always safe for this macro to do nothing. It exists to
1207 recognize opportunities to optimize the output.
1209 But on a few ports with segmented architectures and indexed addressing
1210 (mn10300, hppa) it is used to rewrite certain problematical addresses. */
1212 legitimize_address (x
, oldx
, mode
)
1214 rtx oldx ATTRIBUTE_UNUSED
;
1215 enum machine_mode mode ATTRIBUTE_UNUSED
;
1217 /* Uh-oh. We might have an address for x[n-100000]. This needs
1218 special handling to avoid creating an indexed memory address
1219 with x-100000 as the base. */
1220 if (GET_CODE (x
) == PLUS
1221 && symbolic_operand (XEXP (x
, 1), VOIDmode
))
1223 /* Ugly. We modify things here so that the address offset specified
1224 by the index expression is computed first, then added to x to form
1225 the entire address. */
1227 rtx regx1
, regy1
, regy2
, y
;
1229 /* Strip off any CONST. */
1231 if (GET_CODE (y
) == CONST
)
1234 if (GET_CODE (y
) == PLUS
|| GET_CODE (y
) == MINUS
)
1236 regx1
= force_reg (Pmode
, force_operand (XEXP (x
, 0), 0));
1237 regy1
= force_reg (Pmode
, force_operand (XEXP (y
, 0), 0));
1238 regy2
= force_reg (Pmode
, force_operand (XEXP (y
, 1), 0));
1239 regx1
= force_reg (Pmode
,
1240 gen_rtx (GET_CODE (y
), Pmode
, regx1
, regy2
));
1241 return force_reg (Pmode
, gen_rtx_PLUS (Pmode
, regx1
, regy1
));
1248 mn10300_address_cost (x
, unsig
)
1256 switch (GET_CODE (x
))
1259 switch (REGNO_REG_CLASS (REGNO (x
)))
1284 return (mn10300_address_cost (XEXP (x
, 0), unsig
)
1285 + mn10300_address_cost (XEXP (x
, 1), unsig
));
1290 return ADDRESS_COST (XEXP (x
, 0));
1294 return mn10300_address_cost (XEXP (x
, 0), unsig
);
1297 if (INTVAL (x
) == 0)
1299 if (INTVAL (x
) + (*unsig
? 0 : 0x80) < 0x100)
1301 if (INTVAL (x
) + (*unsig
? 0 : 0x8000) < 0x10000)
1303 if (INTVAL (x
) + (*unsig
? 0 : 0x800000) < 0x1000000)
1313 switch (GET_CODE (XEXP (x
, 0)))
1316 return ADDRESS_COST (XEXP (x
, 0));