Mercurial > hg > CbC > CbC_gcc
diff gcc/config/cr16/cr16.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/config/cr16/cr16.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/config/cr16/cr16.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Output routines for CR16 processor. - Copyright (C) 2012-2017 Free Software Foundation, Inc. + Copyright (C) 2012-2018 Free Software Foundation, Inc. Contributed by KPIT Cummins Infosystems Limited. This file is part of GCC. @@ -18,6 +18,8 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ +#define IN_TARGET_CODE 1 + #include "config.h" #include "system.h" #include "coretypes.h" @@ -206,10 +208,10 @@ /* Table of machine attributes. */ static const struct attribute_spec cr16_attribute_table[] = { /* ISRs have special prologue and epilogue requirements. */ - /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, - affects_type_identity }. */ - {"interrupt", 0, 0, false, true, true, NULL, false}, - {NULL, 0, 0, false, false, false, NULL, false} + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, + affects_type_identity, handler, exclude }. */ + {"interrupt", 0, 0, false, true, true, false, NULL, NULL}, + {NULL, 0, 0, false, false, false, false, NULL, NULL} }; /* TARGET_ASM_UNALIGNED_xx_OP generates .?byte directive @@ -251,10 +253,8 @@ return false; } -static int -cr16_return_pops_args (tree fundecl ATTRIBUTE_UNUSED, - tree funtype ATTRIBUTE_UNUSED, - int size ATTRIBUTE_UNUSED) +static poly_int64 +cr16_return_pops_args (tree, tree, poly_int64) { return 0; } @@ -431,9 +431,10 @@ padding_locals = stack_alignment - padding_locals; current_frame_info.var_size += padding_locals; - current_frame_info.total_size = current_frame_info.var_size - + (ACCUMULATE_OUTGOING_ARGS - ? crtl->outgoing_args_size : 0); + current_frame_info.total_size + = (current_frame_info.var_size + + (ACCUMULATE_OUTGOING_ARGS + ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0)); } /* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */ @@ -447,12 +448,14 @@ cr16_compute_frame (); if (((from) == FRAME_POINTER_REGNUM) && ((to) == STACK_POINTER_REGNUM)) - return (ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : 0); + return (ACCUMULATE_OUTGOING_ARGS + ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0); else if (((from) == ARG_POINTER_REGNUM) && ((to) == FRAME_POINTER_REGNUM)) return (current_frame_info.reg_size + current_frame_info.var_size); else if (((from) == ARG_POINTER_REGNUM) && ((to) == STACK_POINTER_REGNUM)) return (current_frame_info.reg_size + current_frame_info.var_size - + (ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : 0)); + + (ACCUMULATE_OUTGOING_ARGS + ? (HOST_WIDE_INT) crtl->outgoing_args_size : 0)); else gcc_unreachable (); } @@ -1857,10 +1860,10 @@ for (i = current_frame_info.last_reg_to_save; i >= 0;) { - if (!current_frame_info.save_regs[i] || 0 == i || split_here) + if (!current_frame_info.save_regs[i] || i == 0 || split_here) { /* This block of regs is pushed in one instruction. */ - if (0 == i && current_frame_info.save_regs[i]) + if (i == 0 && current_frame_info.save_regs[i]) from = 0; for (j = to; j >= from; --j) @@ -2212,6 +2215,14 @@ return ""; } +/* Implement PUSH_ROUNDING. */ + +poly_int64 +cr16_push_rounding (poly_int64 bytes) +{ + return (bytes + 1) & ~1; +} + /* Initialize 'targetm' variable which contains pointers to functions and data relating to the target machine. */