diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -192,6 +192,25 @@ static bool float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES]; (move_by_pieces_ninsns (SIZE, ALIGN) < (unsigned int) MOVE_RATIO) #endif +/* If a clear memory operation would take CLEAR_RATIO or more simple + move-instruction sequences, we will do a clrstr or libcall instead. */ + +#ifndef CLEAR_RATIO +#if defined (HAVE_clrstrqi) || defined (HAVE_clrstrhi) || defined (HAVE_clrstrsi) || defined (HAVE_clrstrdi) || defined (HAVE_clrstrti) +#define CLEAR_RATIO 2 +#else +/* If we are optimizing for space, cut down the default clear ratio. */ +#define CLEAR_RATIO (optimize_size ? 3 : 15) +#endif +#endif + +/* This macro is used to determine whether clear_by_pieces should be + called to clear storage. */ +#ifndef CLEAR_BY_PIECES_P +#define CLEAR_BY_PIECES_P(SIZE, ALIGN) \ + (move_by_pieces_ninsns (SIZE, ALIGN) < (unsigned int) CLEAR_RATIO) +#endif + /* This array records the insn_code of insns to perform block moves. */ enum insn_code movstr_optab[NUM_MACHINE_MODES]; @@ -2633,7 +2652,7 @@ clear_storage (object, size) size = protect_from_queue (size, 0); if (GET_CODE (size) == CONST_INT - && MOVE_BY_PIECES_P (INTVAL (size), align)) + && CLEAR_BY_PIECES_P (INTVAL (size), align)) clear_by_pieces (object, INTVAL (size), align); else { |