diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2024-03-02 13:37:00 +0100 |
---|---|---|
committer | Georg-Johann Lay <avr@gjlay.de> | 2024-03-02 13:47:45 +0100 |
commit | 9ca5e579d3e1acdbf0519f7a43928ecc9bb0193f (patch) | |
tree | 7afe8aece89382ebf86ffb8d7bd39b94b9560457 | |
parent | c8d12343a9417055f3fc89bbdbb6e0ea508bcca2 (diff) |
AVR: Use REG_<n> constants instead of magic numbers <n>.
There are some places where avr.cc uses magic numbers like 17 that
are actually register numbers. This patch defines constants like
REG_17 and uses them instead of the magic numbers when a register
number is meant.
gcc/
* config/avr/avr.md (REG_0, ... REG_36): New define_constants.
* config/avr/avr.cc: Use them instead of magic numbers when it
means a register number.
-rw-r--r-- | gcc/config/avr/avr.cc | 58 | ||||
-rw-r--r-- | gcc/config/avr/avr.md | 33 |
2 files changed, 52 insertions, 39 deletions
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc index e312ddfbff4..5c71c7f8c0d 100644 --- a/gcc/config/avr/avr.cc +++ b/gcc/config/avr/avr.cc @@ -171,10 +171,10 @@ static bool avr_rtx_costs (rtx, machine_mode, int, int, int *, bool); /* Allocate registers from r25 to r8 for parameters for function calls. */ -#define FIRST_CUM_REG 26 +#define FIRST_CUM_REG REG_26 /* Last call saved register */ -#define LAST_CALLEE_SAVED_REG (AVR_TINY ? 19 : 17) +#define LAST_CALLEE_SAVED_REG (AVR_TINY ? REG_19 : REG_17) /* Implicit target register of LPM instruction (R0) */ extern GTY(()) rtx lpm_reg_rtx; @@ -197,8 +197,8 @@ extern GTY(()) rtx cc_reg_rtx; rtx cc_reg_rtx; /* RTXs for all general purpose registers as QImode */ -extern GTY(()) rtx all_regs_rtx[32]; -rtx all_regs_rtx[32]; +extern GTY(()) rtx all_regs_rtx[REG_32]; +rtx all_regs_rtx[REG_32]; /* SREG, the processor status */ extern GTY(()) rtx sreg_rtx; @@ -542,7 +542,7 @@ avr_casei_sequence_check_operands (rtx *xop) if (AVR_HAVE_EIJMP_EICALL // The last clobber op of the tablejump. - && xop[8] == all_regs_rtx[24]) + && xop[8] == all_regs_rtx[REG_24]) { // $6 is: (subreg:SI ($5) 0) sub_5 = xop[6]; @@ -1171,7 +1171,7 @@ avr_init_machine_status (void) void avr_init_expanders (void) { - for (int regno = 0; regno < 32; regno ++) + for (int regno = REG_0; regno < REG_32; regno ++) all_regs_rtx[regno] = gen_rtx_REG (QImode, regno); lpm_reg_rtx = all_regs_rtx[LPM_REGNO]; @@ -1549,7 +1549,7 @@ avr_regs_to_save (HARD_REG_SET *set) || cfun->machine->is_OS_main) return 0; - for (int reg = 0; reg < 32; reg++) + for (int reg = REG_0; reg < REG_32; reg++) { /* Do not push/pop __tmp_reg__, __zero_reg__, as well as any global register variables. */ @@ -2300,9 +2300,9 @@ avr_pass_fuse_add::execute (function *func) FOR_EACH_BB_FN (bb, func) { - Ldi_Insn prev_ldi_insns[32]; - Add_Insn prev_add_insns[32]; - Mem_Insn prev_mem_insns[32]; + Ldi_Insn prev_ldi_insns[REG_32]; + Add_Insn prev_add_insns[REG_32]; + Mem_Insn prev_mem_insns[REG_32]; rtx_insn *insn, *curr; avr_dump ("\n;; basic block %d\n\n", bb->index); @@ -2484,7 +2484,7 @@ avr_incoming_return_addr_rtx (void) static int avr_hregs_split_reg (HARD_REG_SET *set) { - for (int regno = 0; regno < 32; regno++) + for (int regno = REG_0; regno < REG_32; regno++) if (TEST_HARD_REG_BIT (*set, regno)) { // Don't remove a register from *SET which might indicate that @@ -2620,9 +2620,9 @@ avr_prologue_setup_frame (HOST_WIDE_INT size, HARD_REG_SET set) first_reg = (LAST_CALLEE_SAVED_REG + 1) - (live_seq - 2); - for (reg = 29, offset = -live_seq + 1; + for (reg = REG_29, offset = -live_seq + 1; reg >= first_reg; - reg = (reg == 28 ? LAST_CALLEE_SAVED_REG : reg - 1), ++offset) + reg = (reg == REG_28 ? LAST_CALLEE_SAVED_REG : reg - 1), ++offset) { rtx m, r; @@ -2636,7 +2636,7 @@ avr_prologue_setup_frame (HOST_WIDE_INT size, HARD_REG_SET set) } else /* !minimize */ { - for (int reg = 0; reg < 32; ++reg) + for (int reg = REG_0; reg < REG_32; ++reg) if (TEST_HARD_REG_BIT (set, reg)) emit_push_byte (reg, true); @@ -3795,7 +3795,7 @@ avr_print_operand (FILE *file, rtx x, int code) { if (x == zero_reg_rtx) fprintf (file, "__zero_reg__"); - else if (code == 'r' && REGNO (x) < 32) + else if (code == 'r' && REGNO (x) < REG_32) fprintf (file, "%d", (int) REGNO (x)); else fprintf (file, "%s", reg_names[REGNO (x) + abcd]); @@ -4136,7 +4136,9 @@ avr_asm_final_postscan_insn (FILE *stream, rtx_insn *insn, rtx *, int) int avr_function_arg_regno_p (int r) { - return AVR_TINY ? IN_RANGE (r, 20, 25) : IN_RANGE (r, 8, 25); + return AVR_TINY + ? IN_RANGE (r, REG_20, REG_25) + : IN_RANGE (r, REG_8, REG_25); } @@ -4148,7 +4150,7 @@ void avr_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, rtx libname, tree fndecl ATTRIBUTE_UNUSED) { - cum->nregs = AVR_TINY ? 6 : 18; + cum->nregs = 1 + AVR_TINY ? REG_25 - REG_20 : REG_25 - REG_8; cum->regno = FIRST_CUM_REG; cum->has_stack_args = 0; if (!libname && stdarg_p (fntype)) @@ -4216,7 +4218,7 @@ avr_function_arg_advance (cumulative_args_t cum_v, a function must not pass arguments in call-saved regs in order to get tail-called. */ - if (cum->regno >= 8 + if (cum->regno >= REG_8 && cum->nregs >= 0 && !call_used_or_fixed_reg_p (cum->regno)) { @@ -4233,7 +4235,7 @@ avr_function_arg_advance (cumulative_args_t cum_v, user has fixed a GPR needed to pass an argument, an (implicit) function call will clobber that fixed register. See PR45099 for an example. */ - if (cum->regno >= 8 + if (cum->regno >= REG_8 && cum->nregs >= 0) { for (int regno = cum->regno; regno < cum->regno + bytes; regno++) @@ -4348,7 +4350,7 @@ avr_find_unused_d_reg (rtx_insn *insn, rtx exclude) bool isr_p = (avr_interrupt_function_p (current_function_decl) || avr_signal_function_p (current_function_decl)); - for (int regno = 16; regno < 32; regno++) + for (int regno = REG_16; regno < REG_32; regno++) { rtx reg = all_regs_rtx[regno]; @@ -7117,7 +7119,7 @@ avr_out_compare64 (rtx_insn *insn, rtx *op, int *plen) { rtx xop[3]; - xop[0] = gen_rtx_REG (DImode, 18); + xop[0] = gen_rtx_REG (DImode, ACC_A); xop[1] = op[0]; xop[2] = op[1]; @@ -7340,7 +7342,7 @@ out_shift_with_cnt (const char *templ, rtx_insn *insn, rtx operands[], /* No scratch register available, use one from LD_REGS (saved in __tmp_reg__) that doesn't overlap with registers to shift. */ - op[3] = all_regs_rtx[((REGNO (op[0]) - 1) & 15) + 16]; + op[3] = all_regs_rtx[((REGNO (op[0]) - 1) & 15) + REG_16]; op[4] = tmp_reg_rtx; saved_in_tmp = true; @@ -13712,8 +13714,8 @@ output_reload_in_const (rtx *op, rtx clobber_reg, int *len, bool clear_p) /* (REG:SI 14) is special: It's neither in LD_REGS nor in NO_LD_REGS but has some subregs that are in LD_REGS. Use the MSB (REG:QI 17). */ - if (REGNO (dest) < 16 - && REGNO (dest) + GET_MODE_SIZE (mode) > 16) + if (REGNO (dest) < REG_16 + && REGNO (dest) + GET_MODE_SIZE (mode) > REG_16) { clobber_reg = all_regs_rtx[REGNO (dest) + n_bytes - 1]; } @@ -14093,7 +14095,7 @@ avr_conditional_register_usage (void) - R0-R15 are not available in Tiny Core devices - R16 and R17 are fixed registers. */ - for (size_t i = 0; i <= 17; i++) + for (size_t i = REG_0; i <= REG_17; i++) { fixed_regs[i] = 1; call_used_regs[i] = 1; @@ -14103,7 +14105,7 @@ avr_conditional_register_usage (void) - R18, R19, R20 and R21 are the callee saved registers in Tiny Core devices */ - for (size_t i = 18; i <= LAST_CALLEE_SAVED_REG; i++) + for (size_t i = REG_18; i <= LAST_CALLEE_SAVED_REG; i++) { call_used_regs[i] = 0; } @@ -15180,9 +15182,9 @@ avr_map_decompose (unsigned int f, const avr_map_op_t *g, bool val_const_p) fake values. Mimic effect of reloading xop[3]: Unused operands are mapped to 0 and used operands are reloaded to xop[0]. */ - xop[0] = all_regs_rtx[24]; + xop[0] = all_regs_rtx[REG_24]; xop[1] = gen_int_mode (f_ginv.map, SImode); - xop[2] = all_regs_rtx[25]; + xop[2] = all_regs_rtx[REG_25]; xop[3] = val_used_p ? xop[0] : const0_rtx; avr_out_insert_bits (xop, &f_ginv.cost); diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 8f6bc288515..028f9f1254d 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -51,22 +51,33 @@ ;; ~ Output 'r' if not AVR_HAVE_JMP_CALL. ;; ! Output 'e' if AVR_HAVE_EIJMP_EICALL. +;; Used in avr.cc to avoid magic numbers for register numbers. +(define_constants + [(REG_0 0) (REG_1 1) (REG_2 2) + (REG_8 8) (REG_9 9) (REG_10 10) (REG_11 11) + (REG_12 12) (REG_13 13) (REG_14 14) (REG_15 15) + (REG_16 16) (REG_17 17) (REG_18 18) (REG_19 19) + (REG_20 20) (REG_21 21) (REG_22 22) (REG_23 23) + (REG_24 24) (REG_25 25) (REG_26 26) (REG_27 27) + (REG_28 28) (REG_29 29) (REG_30 30) (REG_31 31) + (REG_32 32) (REG_36 36) + ]) (define_constants - [(REG_X 26) - (REG_Y 28) - (REG_Z 30) - (REG_W 24) - (REG_SP 32) - (REG_CC 36) - (LPM_REGNO 0) ; implicit target register of LPM - (TMP_REGNO 0) ; temporary register r0 - (ZERO_REGNO 1) ; zero register r1 + [(REG_X REG_26) + (REG_Y REG_28) + (REG_Z REG_30) + (REG_W REG_24) + (REG_SP REG_32) + (REG_CC REG_36) + (LPM_REGNO REG_0) ; implicit target register of LPM + (TMP_REGNO REG_0) ; temporary register r0 + (ZERO_REGNO REG_1) ; zero register r1 ]) (define_constants - [(TMP_REGNO_TINY 16) ; r16 is temp register for AVR_TINY - (ZERO_REGNO_TINY 17) ; r17 is zero register for AVR_TINY + [(TMP_REGNO_TINY REG_16) ; r16 is temp register for AVR_TINY + (ZERO_REGNO_TINY REG_17) ; r17 is zero register for AVR_TINY ]) (define_c_enum "unspec" |