From: Uros Bizjak Date: Tue, 13 Oct 2015 15:31:06 +0000 (+0200) Subject: sparc.h (SPARC_STACK_ALIGN): Implement using ROUND_UP macro and UNITS_PER_WORD * 2. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=63b8ef40c432b8045bc6d7665ff17baf50c2fcb8;p=gcc.git sparc.h (SPARC_STACK_ALIGN): Implement using ROUND_UP macro and UNITS_PER_WORD * 2. * config/sparc/sparc.h (SPARC_STACK_ALIGN): Implement using ROUND_UP macro and UNITS_PER_WORD * 2. * config/sparc/sparc.c (sparc_compute_frame_size): Use ROUND_UP and ROUND_DOWN macros where applicable. (function_arg_record_value, function_arg_record_value_1) (function_arg_record_value_1): Ditto. (emit_save_or_restore_regs): Use ROUND_DOWN to preserve offset alignment to double-word. (sparc_gimplify_va_arg): Use ROUND_UP to calculate rsize. (sparc_emit_probe_stack_range): Use ROUND_DOWN to calculate rounded_size. From-SVN: r228768 --- diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index d9c5c665436..3f09fd7234e 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4981,11 +4981,11 @@ sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function) else { /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */ - apparent_frame_size = (size - STARTING_FRAME_OFFSET + 7) & -8; + apparent_frame_size = ROUND_UP (size - STARTING_FRAME_OFFSET, 8); apparent_frame_size += n_global_fp_regs * 4; /* We need to add the size of the outgoing argument area. */ - frame_size = apparent_frame_size + ((args_size + 7) & -8); + frame_size = apparent_frame_size + ROUND_UP (args_size, 8); /* And that of the register window save area. */ frame_size += FIRST_PARM_OFFSET (cfun->decl); @@ -5116,7 +5116,7 @@ sparc_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) /* Step 1: round SIZE to the previous multiple of the interval. */ - rounded_size = size & -PROBE_INTERVAL; + rounded_size = ROUND_DOWN (size, PROBE_INTERVAL); emit_move_insn (g4, GEN_INT (rounded_size)); @@ -5316,8 +5316,9 @@ emit_save_or_restore_regs (unsigned int low, unsigned int high, rtx base, else /* action_true == SORR_RESTORE */ emit_move_insn (gen_rtx_REG (mode, regno), mem); - /* Always preserve double-word alignment. */ - offset = (offset + 8) & -8; + /* Bump and round down to double word + in case we already bumped by 4. */ + offset = ROUND_DOWN (offset + 8, 8); } } @@ -6439,8 +6440,8 @@ function_arg_record_value_1 (const_tree type, HOST_WIDE_INT startbitpos, unsigned int startbit, endbit; int intslots, this_slotno; - startbit = parms->intoffset & -BITS_PER_WORD; - endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD; + startbit = ROUND_DOWN (parms->intoffset, BITS_PER_WORD); + endbit = ROUND_UP (bitpos, BITS_PER_WORD); intslots = (endbit - startbit) / BITS_PER_WORD; this_slotno = parms->slotno + parms->intoffset @@ -6495,8 +6496,8 @@ function_arg_record_value_3 (HOST_WIDE_INT bitpos, intoffset = parms->intoffset; parms->intoffset = -1; - startbit = intoffset & -BITS_PER_WORD; - endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD; + startbit = ROUND_DOWN (intoffset, BITS_PER_WORD); + endbit = ROUND_UP (bitpos, BITS_PER_WORD); intslots = (endbit - startbit) / BITS_PER_WORD; this_slotno = parms->slotno + intoffset / BITS_PER_WORD; @@ -6669,8 +6670,8 @@ function_arg_record_value (const_tree type, machine_mode mode, unsigned int startbit, endbit; int intslots, this_slotno; - startbit = parms.intoffset & -BITS_PER_WORD; - endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD; + startbit = ROUND_DOWN (parms.intoffset, BITS_PER_WORD); + endbit = ROUND_UP (typesize*BITS_PER_UNIT, BITS_PER_WORD); intslots = (endbit - startbit) / BITS_PER_WORD; this_slotno = slotno + parms.intoffset / BITS_PER_WORD; @@ -7451,7 +7452,7 @@ sparc_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p, { indirect = false; size = int_size_in_bytes (type); - rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; + rsize = ROUND_UP (size, UNITS_PER_WORD); align = 0; if (TARGET_ARCH64) diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 2cbe0d9b7fa..d2782a47bb1 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -510,8 +510,7 @@ extern enum cmodel sparc_cmodel; #define SPARC_STACK_BOUNDARY_HACK (TARGET_ARCH64 && TARGET_STACK_BIAS) /* ALIGN FRAMES on double word boundaries */ -#define SPARC_STACK_ALIGN(LOC) \ - (TARGET_ARCH64 ? (((LOC)+15) & ~15) : (((LOC)+7) & ~7)) +#define SPARC_STACK_ALIGN(LOC) ROUND_UP ((LOC), UNITS_PER_WORD * 2) /* Allocation boundary (in *bits*) for the code of a function. */ #define FUNCTION_BOUNDARY 32