Robert P. J. DAY says:
apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
1 diff -durN gcc-3.4.6.orig/gcc/config/arm/arm.c gcc-3.4.6/gcc/config/arm/arm.c
2 --- gcc-3.4.6.orig/gcc/config/arm/arm.c 2007-08-15 22:56:20.000000000 +0200
3 +++ gcc-3.4.6/gcc/config/arm/arm.c 2007-08-15 22:56:20.000000000 +0200
5 return_used_this_function = 0;
8 +/* Return the number (counting from 0) of
9 + the least significant set bit in MASK. */
15 +number_of_first_bit_set (mask)
21 + (mask & (1 << bit)) == 0;
29 arm_output_epilogue (rtx sibling)
31 @@ -8757,27 +8777,47 @@
32 saved_regs_mask |= (1 << PC_REGNUM);
35 - /* Load the registers off the stack. If we only have one register
36 - to load use the LDR instruction - it is faster. */
37 - if (saved_regs_mask == (1 << LR_REGNUM))
39 - /* The exception handler ignores the LR, so we do
40 - not really need to load it off the stack. */
42 - asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
44 - asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
46 - else if (saved_regs_mask)
47 + if (saved_regs_mask)
49 - if (saved_regs_mask & (1 << SP_REGNUM))
50 - /* Note - write back to the stack register is not enabled
51 - (ie "ldmfd sp!..."). We know that the stack pointer is
52 - in the list of registers and if we add writeback the
53 - instruction becomes UNPREDICTABLE. */
54 - print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
55 + /* Load the registers off the stack. If we only have one register
56 + to load use the LDR instruction - it is faster. */
57 + if (bit_count (saved_regs_mask) == 1)
59 + int reg = number_of_first_bit_set (saved_regs_mask);
64 + /* Mustn't use base writeback when loading SP. */
65 + asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM);
71 + /* The exception handler ignores the LR, so we do
72 + not really need to load it off the stack. */
73 + asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
76 + /* else fall through */
79 + asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM);
84 - print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
86 + if (saved_regs_mask & (1 << SP_REGNUM))
87 + /* Note - write back to the stack register is not enabled
88 + (ie "ldmfd sp!..."). We know that the stack pointer is
89 + in the list of registers and if we add writeback the
90 + instruction becomes UNPREDICTABLE. */
91 + print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
93 + print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
97 if (current_function_pretend_args_size)
98 @@ -11405,22 +11445,6 @@
102 -/* Return the number (counting from 0) of
103 - the least significant set bit in MASK. */
106 -number_of_first_bit_set (int mask)
111 - (mask & (1 << bit)) == 0;
118 /* Generate code to return from a thumb function.
119 If 'reg_containing_return_addr' is -1, then the return address is
120 actually on the stack, at the stack pointer. */