]> git.pld-linux.org Git - packages/crossavr-gcc.git/blob - crossavr-gcc-zz-atmega256x.patch
- updated for 4.2.2
[packages/crossavr-gcc.git] / crossavr-gcc-zz-atmega256x.patch
1 diff -uNdr gcc-4.2.2/gcc/config/avr-old/avr.c gcc-4.2.2/gcc/config/avr/avr.c
2 --- gcc-4.2.2/gcc/config/avr-old/avr.c  2007-09-01 17:28:30.000000000 +0200
3 +++ gcc-4.2.2/gcc/config/avr/avr.c      2007-10-20 18:13:32.000000000 +0200
4 @@ -129,22 +129,28 @@
5  /* Core have 'MOVW' and 'LPM Rx,Z' instructions.  */
6  int avr_have_movw_lpmx_p = 0;
7  
8 +/* Usually holds the value 2, but could be 3 for the larger devices with a
9 +   3-byte program counter.  */
10 +int avr_pc_size = 2;
11 +
12  struct base_arch_s {
13    int asm_only;
14    int enhanced;
15    int mega;
16    int have_movw_lpmx;
17 +  int three_byte_pc;
18    const char *const macro;
19  };
20  
21  static const struct base_arch_s avr_arch_types[] = {
22 -  { 1, 0, 0, 0,  NULL },  /* unknown device specified */
23 -  { 1, 0, 0, 0, "__AVR_ARCH__=1" },
24 -  { 0, 0, 0, 0, "__AVR_ARCH__=2" },
25 -  { 0, 0, 0, 1, "__AVR_ARCH__=25"},
26 -  { 0, 0, 1, 0, "__AVR_ARCH__=3" },
27 -  { 0, 1, 0, 1, "__AVR_ARCH__=4" },
28 -  { 0, 1, 1, 1, "__AVR_ARCH__=5" }
29 +  { 1, 0, 0, 0, 0, NULL },  /* unknown device specified */
30 +  { 1, 0, 0, 0, 0, "__AVR_ARCH__=1" },
31 +  { 0, 0, 0, 0, 0, "__AVR_ARCH__=2" },
32 +  { 0, 0, 0, 1, 0, "__AVR_ARCH__=25"},
33 +  { 0, 0, 1, 0, 0, "__AVR_ARCH__=3" },
34 +  { 0, 1, 0, 1, 0, "__AVR_ARCH__=4" },
35 +  { 0, 1, 1, 1, 0, "__AVR_ARCH__=5" },
36 +  { 0, 1, 1, 1, 1, "__AVR_ARCH__=6" }
37  };
38  
39  /* These names are used as the index into the avr_arch_types[] table 
40 @@ -269,6 +275,10 @@
41    { "at90usb1286",  ARCH_AVR5, "__AVR_AT90USB1286__" },
42    { "at90usb1287",  ARCH_AVR5, "__AVR_AT90USB1287__" },
43    { "at94k",        ARCH_AVR5, "__AVR_AT94K__" },
44 +    /* 3-Byte PC */
45 +  { "avr6",      6, NULL },
46 +  { "atmega2560",     6, "__AVR_ATmega2560__" },
47 +  { "atmega2561",     6, "__AVR_ATmega2561__" },
48      /* Assembler only.  */
49    { "avr1",         ARCH_AVR1, NULL },
50    { "at90s1200",    ARCH_AVR1, "__AVR_AT90S1200__" },
51 @@ -354,6 +364,11 @@
52    avr_base_arch_macro = base->macro;
53    avr_extra_arch_macro = t->macro;
54  
55 +  if (base->three_byte_pc)
56 +    avr_pc_size = 3;
57 +  else
58 +    avr_pc_size = 2;
59 +
60    if (optimize && !TARGET_NO_TABLEJUMP)
61      avr_case_values_threshold = (!AVR_MEGA || TARGET_CALL_PROLOGUES) ? 8 : 17;
62  
63 @@ -482,7 +497,7 @@
64        int offset = frame_pointer_needed ? 2 : 0;
65  
66        offset += avr_regs_to_save (NULL);
67 -      return get_frame_size () + 2 + 1 + offset;
68 +      return get_frame_size () + (avr_pc_size) + 1 + offset;
69      }
70  }
71  
72 @@ -666,7 +681,6 @@
73    int reg;
74    int interrupt_func_p;
75    int signal_func_p;
76 -  int main_p;
77    int live_seq;
78    int minimize;
79  
80 @@ -684,7 +698,6 @@
81  
82    interrupt_func_p = interrupt_function_p (current_function_decl);
83    signal_func_p = signal_function_p (current_function_decl);
84 -  main_p = MAIN_NAME_P (DECL_NAME (current_function_decl));
85    live_seq = sequent_regs_live ();
86    minimize = (TARGET_CALL_PROLOGUES
87               && !interrupt_func_p && !signal_func_p && live_seq);
88 @@ -704,25 +717,14 @@
89                AS1 (clr,__zero_reg__)    "\n");
90        prologue_size += 5;
91      }
92 -  if (main_p)
93 -    {
94 -      fprintf (file, ("\t" 
95 -                     AS1 (ldi,r28) ",lo8(%s - " HOST_WIDE_INT_PRINT_DEC ")" CR_TAB
96 -                     AS1 (ldi,r29) ",hi8(%s - " HOST_WIDE_INT_PRINT_DEC ")" CR_TAB
97 -                     AS2 (out,__SP_H__,r29)     CR_TAB
98 -                     AS2 (out,__SP_L__,r28) "\n"),
99 -              avr_init_stack, size, avr_init_stack, size);
100 -      
101 -      prologue_size += 4;
102 -    }
103 -  else if (minimize && (frame_pointer_needed || live_seq > 6)) 
104 +  if (minimize && (frame_pointer_needed || live_seq > 6)) 
105      {
106        fprintf (file, ("\t"
107                       AS1 (ldi, r26) ",lo8(" HOST_WIDE_INT_PRINT_DEC ")" CR_TAB
108                       AS1 (ldi, r27) ",hi8(" HOST_WIDE_INT_PRINT_DEC ")" CR_TAB), size, size);
109  
110 -      fputs ((AS2 (ldi,r30,pm_lo8(1f)) CR_TAB
111 -             AS2 (ldi,r31,pm_hi8(1f)) CR_TAB), file);
112 +      fputs ((AS2 (ldi,r30,lo8(gs(1f))) CR_TAB
113 +             AS2 (ldi,r31,hi8(gs(1f))) CR_TAB), file);
114        
115        prologue_size += 4;
116        
117 @@ -793,7 +795,6 @@
118    int reg;
119    int interrupt_func_p;
120    int signal_func_p;
121 -  int main_p;
122    int function_size;
123    int live_seq;
124    int minimize;
125 @@ -825,27 +826,12 @@
126  
127    interrupt_func_p = interrupt_function_p (current_function_decl);
128    signal_func_p = signal_function_p (current_function_decl);
129 -  main_p = MAIN_NAME_P (DECL_NAME (current_function_decl));
130 +
131    live_seq = sequent_regs_live ();
132    minimize = (TARGET_CALL_PROLOGUES
133               && !interrupt_func_p && !signal_func_p && live_seq);
134    
135 -  if (main_p)
136 -    {
137 -      /* Return value from main() is already in the correct registers
138 -        (r25:r24) as the exit() argument.  */
139 -      if (AVR_MEGA)
140 -       {
141 -         fputs ("\t" AS1 (jmp,exit) "\n", file);
142 -         epilogue_size += 2;
143 -       }
144 -      else
145 -       {
146 -         fputs ("\t" AS1 (rjmp,exit) "\n", file);
147 -         ++epilogue_size;
148 -       }
149 -    }
150 -  else if (minimize && (frame_pointer_needed || live_seq > 4))
151 +  if (minimize && (frame_pointer_needed || live_seq > 4))
152      {
153        fprintf (file, ("\t" AS2 (ldi, r30, %d) CR_TAB), live_seq);
154        ++epilogue_size;
155 @@ -1103,7 +1089,7 @@
156           && ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (addr))
157               || GET_CODE (addr) == LABEL_REF))
158         {
159 -         fprintf (file, "pm(");
160 +         fprintf (file, "gs(");
161           output_addr_const (file,addr);
162           fprintf (file ,")");
163         }
164 @@ -4524,7 +4510,7 @@
165        && ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (x))
166           || GET_CODE (x) == LABEL_REF))
167      {
168 -      fputs ("\t.word\tpm(", asm_out_file);
169 +      fputs ("\t.word\tgs(", asm_out_file);
170        output_addr_const (asm_out_file, x);
171        fputs (")\n", asm_out_file);
172        return true;
173 @@ -5914,7 +5900,7 @@
174  {
175    switch_to_section (progmem_section);
176    if (AVR_MEGA)
177 -    fprintf (stream, "\t.word pm(.L%d)\n", value);
178 +    fprintf (stream, "\t.word gs(.L%d)\n", value);
179    else
180      fprintf (stream, "\trjmp .L%d\n", value);
181  
182 diff -uNdr gcc-4.2.2/gcc/config/avr-old/avr.h gcc-4.2.2/gcc/config/avr/avr.h
183 --- gcc-4.2.2/gcc/config/avr-old/avr.h  2007-10-20 18:11:38.000000000 +0200
184 +++ gcc-4.2.2/gcc/config/avr/avr.h      2007-10-20 18:12:15.000000000 +0200
185 @@ -36,6 +36,10 @@
186         builtin_define ("__AVR_HAVE_LPMX__");   \
187        if (avr_asm_only_p)                      \
188         builtin_define ("__AVR_ASM_ONLY__");    \
189 +      if (avr_pc_size == 2)                    \
190 +       builtin_define ("__AVR_2_BYTE_PC__");   \
191 +      if (avr_pc_size == 3)                    \
192 +       builtin_define ("__AVR_3_BYTE_PC__");   \
193        if (avr_enhanced_p)                      \
194         builtin_define ("__AVR_ENHANCED__");    \
195        if (avr_enhanced_p)                      \
196 @@ -53,6 +57,7 @@
197  extern int avr_enhanced_p;
198  extern int avr_asm_only_p;
199  extern int avr_have_movw_lpmx_p;
200 +extern int avr_pc_size;
201  #ifndef IN_LIBGCC2
202  extern GTY(()) section *progmem_section;
203  #endif
204 @@ -61,6 +66,9 @@
205  #define AVR_ENHANCED (avr_enhanced_p)
206  #define AVR_HAVE_MOVW (avr_have_movw_lpmx_p)
207  
208 +#define AVR_3_BYTE_PC (avr_pc_size == 3)
209 +#define AVR_2_BYTE_PC (avr_pc_size == 2)
210 +
211  #define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)");
212  
213  #define OVERRIDE_OPTIONS avr_override_options ()
214 @@ -727,12 +735,13 @@
215  
216  #define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
217  
218 -#define CC1_SPEC "%{profile:-p}"
219 +#define CC1_SPEC "%{profile:-p} -fno-delete-null-pointer-checks"
220  
221  #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
222      %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
223 -    %{!fexceptions:-fno-exceptions}"
224 -/* A C string constant that tells the GCC drvier program options to
225 +    %{!fexceptions:-fno-exceptions} \
226 +    -fno-delete-null-pointer-checks"
227 +/* A C string constant that tells the GCC driver program options to
228     pass to `cc1plus'.  */
229  
230  #define ASM_SPEC "%{mmcu=avr25:-mmcu=avr2;\
231 @@ -773,6 +782,7 @@
232    mmcu=at90can*|\
233    mmcu=at90usb*|\
234    mmcu=at94k:-m avr5}\
235 +%{mmcu=atmega256*:-m avr6}\
236  %{mmcu=atmega324*|\
237    mmcu=atmega325*|\
238    mmcu=atmega329*|\
239 @@ -796,7 +806,8 @@
240    mmcu=at90usb*: -Tdata 0x800100}\
241  %{mmcu=atmega640|\
242    mmcu=atmega1280|\
243 -  mmcu=atmega1281: -Tdata 0x800200} "
244 +  mmcu=atmega1281|\
245 +  mmcu=atmega256*: -Tdata 0x800200} "
246  
247  #define LIB_SPEC \
248    "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}"
249 @@ -887,6 +898,8 @@
250  %{mmcu=atmega128:crtm128.o%s} \
251  %{mmcu=atmega1280:crtm1280.o%s} \
252  %{mmcu=atmega1281:crtm1281.o%s} \
253 +%{mmcu=atmega2560:crtm2560.o%s} \
254 +%{mmcu=atmega2561:crtm2561.o%s} \
255  %{mmcu=atmega8hva:crtm8hva.o%s} \
256  %{mmcu=atmega16hva:crtm16hva.o%s} \
257  %{mmcu=at90can32:crtcan32.o%s} \
258 diff -uNdr gcc-4.2.2/gcc/config/avr-old/avr.md gcc-4.2.2/gcc/config/avr/avr.md
259 --- gcc-4.2.2/gcc/config/avr-old/avr.md 2007-09-01 17:28:30.000000000 +0200
260 +++ gcc-4.2.2/gcc/config/avr/avr.md     2007-10-20 18:12:15.000000000 +0200
261 @@ -2099,22 +2099,45 @@
262    "(register_operand (operands[0], HImode) || CONSTANT_P (operands[0]))"
263    "*{
264    if (which_alternative==0)
265 -     return \"icall\";
266 +    {
267 +      if (AVR_3_BYTE_PC)
268 +        return \"eicall\";
269 +      else
270 +        return \"icall\";
271 +    }
272    else if (which_alternative==1)
273      {
274        if (AVR_HAVE_MOVW)
275 -       return (AS2 (movw, r30, %0) CR_TAB
276 -               \"icall\");
277 +        {
278 +          if (AVR_3_BYTE_PC)
279 +            return (AS2 (movw, r30, %0) CR_TAB
280 +                    \"eicall\");
281 +          else
282 +            return (AS2 (movw, r30, %0) CR_TAB
283 +                    \"icall\");
284 +        }
285        else
286 -       return (AS2 (mov, r30, %A0) CR_TAB
287 -               AS2 (mov, r31, %B0) CR_TAB
288 -               \"icall\");
289 +        {
290 +          if (AVR_3_BYTE_PC)
291 +            return (AS2 (mov, r30, %A0) CR_TAB
292 +                    AS2 (mov, r31, %B0) CR_TAB
293 +                    \"eicall\");
294 +          else
295 +            return (AS2 (mov, r30, %A0) CR_TAB
296 +                    AS2 (mov, r31, %B0) CR_TAB
297 +                    \"icall\");
298 +        }
299      }
300    else if (which_alternative==2)
301      return AS1(%~call,%c0);
302 -  return (AS2 (ldi,r30,lo8(%0)) CR_TAB
303 -          AS2 (ldi,r31,hi8(%0)) CR_TAB
304 -          \"icall\");
305 +  if (AVR_3_BYTE_PC)
306 +    return (AS2 (ldi,r30,lo8(%0)) CR_TAB
307 +            AS2 (ldi,r31,hi8(%0)) CR_TAB
308 +            \"eicall\");
309 +  else
310 +    return (AS2 (ldi,r30,lo8(%0)) CR_TAB
311 +            AS2 (ldi,r31,hi8(%0)) CR_TAB
312 +            \"icall\");    
313  }"
314    [(set_attr "cc" "clobber,clobber,clobber,clobber")
315     (set_attr_alternative "length"
316 @@ -2136,22 +2159,45 @@
317    "(register_operand (operands[0], VOIDmode) || CONSTANT_P (operands[0]))"
318    "*{
319    if (which_alternative==0)
320 -     return \"icall\";
321 +    {
322 +      if (AVR_3_BYTE_PC)
323 +        return \"eicall\";
324 +      else
325 +        return \"icall\";
326 +    }
327    else if (which_alternative==1)
328      {
329        if (AVR_HAVE_MOVW)
330 -       return (AS2 (movw, r30, %1) CR_TAB
331 -               \"icall\");
332 +        {
333 +          if (AVR_3_BYTE_PC)
334 +            return (AS2 (movw, r30, %1) CR_TAB
335 +                    \"eicall\");
336 +          else
337 +            return (AS2 (movw, r30, %1) CR_TAB
338 +                    \"icall\");
339 +        }
340        else
341 -       return (AS2 (mov, r30, %A1) CR_TAB
342 -               AS2 (mov, r31, %B1) CR_TAB
343 -               \"icall\");
344 +        {
345 +          if (AVR_3_BYTE_PC)
346 +            return (AS2 (mov, r30, %A1) CR_TAB
347 +                    AS2 (mov, r31, %B1) CR_TAB
348 +                    \"eicall\");
349 +          else
350 +            return (AS2 (mov, r30, %A1) CR_TAB
351 +                    AS2 (mov, r31, %B1) CR_TAB
352 +                    \"icall\");
353 +        }
354      }
355    else if (which_alternative==2)
356      return AS1(%~call,%c1);
357 -  return (AS2 (ldi, r30, lo8(%1)) CR_TAB
358 -          AS2 (ldi, r31, hi8(%1)) CR_TAB
359 -          \"icall\");
360 +  if (AVR_3_BYTE_PC)
361 +    return (AS2 (ldi, r30, lo8(%1)) CR_TAB
362 +            AS2 (ldi, r31, hi8(%1)) CR_TAB
363 +            \"eicall\");
364 +  else
365 +    return (AS2 (ldi, r30, lo8(%1)) CR_TAB
366 +            AS2 (ldi, r31, hi8(%1)) CR_TAB
367 +            \"icall\");    
368  }"
369    [(set_attr "cc" "clobber,clobber,clobber,clobber")
370     (set_attr_alternative "length"
371 @@ -2181,13 +2227,20 @@
372  ; indirect jump
373  (define_insn "indirect_jump"
374    [(set (pc) (match_operand:HI 0 "register_operand" "!z,*r"))]
375 -  ""
376 +  "AVR_2_BYTE_PC"
377    "@
378         ijmp
379         push %A0\;push %B0\;ret"
380    [(set_attr "length" "1,3")
381     (set_attr "cc" "none,none")])
382  
383 +(define_insn "*indirect_jump_avr6"
384 +  [(set (pc) (match_operand:HI 0 "register_operand" "z"))]
385 +  "AVR_3_BYTE_PC"
386 +  "eijmp"
387 +  [(set_attr "length" "1")
388 +   (set_attr "cc" "none")])
389 +
390  ;; table jump
391  
392  ;; Table made from "rjmp" instructions for <=8K devices.
393 @@ -2196,7 +2249,7 @@
394                         UNSPEC_INDEX_JMP))
395     (use (label_ref (match_operand 1 "" "")))
396     (clobber (match_dup 0))]
397 -  "!AVR_MEGA"
398 +  "(!AVR_MEGA) && (AVR_2_BYTE_PC)"
399    "@
400         ijmp
401         push %A0\;push %B0\;ret"
402 @@ -2214,12 +2267,27 @@
403    [(set_attr "length" "2")
404     (set_attr "cc" "clobber")])
405  
406 +(define_insn "*tablejump_avr6"
407 +  [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
408 +                        1))
409 +   (use (label_ref (match_operand 1 "" "")))
410 +   (clobber (match_dup 0))]
411 +  "AVR_MEGA && AVR_ENHANCED && AVR_3_BYTE_PC"
412 +  "lsl r30
413 +        rol r31
414 +        lpm __tmp_reg__,Z+
415 +        lpm r31,Z
416 +        mov r30,__tmp_reg__
417 +        eijmp"
418 +  [(set_attr "length" "6")
419 +   (set_attr "cc" "clobber")])
420 +
421  (define_insn "*tablejump_enh"
422    [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "z")]
423                         UNSPEC_INDEX_JMP))
424     (use (label_ref (match_operand 1 "" "")))
425     (clobber (match_dup 0))]
426 -  "AVR_MEGA && AVR_ENHANCED"
427 +  "AVR_MEGA && AVR_ENHANCED && AVR_2_BYTE_PC"
428    "lsl r30
429         rol r31
430         lpm __tmp_reg__,Z+
431 @@ -2234,7 +2302,7 @@
432                         UNSPEC_INDEX_JMP))
433     (use (label_ref (match_operand 1 "" "")))
434     (clobber (match_dup 0))]
435 -  "AVR_MEGA"
436 +  "AVR_MEGA && AVR_2_BYTE_PC"
437    "lsl r30
438         rol r31
439         lpm
440 diff -uNdr gcc-4.2.2/gcc/config/avr-old/libgcc.S gcc-4.2.2/gcc/config/avr/libgcc.S
441 --- gcc-4.2.2/gcc/config/avr-old/libgcc.S       2006-06-19 17:04:27.000000000 +0200
442 +++ gcc-4.2.2/gcc/config/avr/libgcc.S   2007-10-20 18:12:15.000000000 +0200
443 @@ -593,7 +593,12 @@
444         out     __SP_H__,r29
445         out     __SREG__,__tmp_reg__
446         out     __SP_L__,r28
447 +#if defined (__AVR_3_BYTE_PC__)
448 +       eijmp
449 +#else
450         ijmp
451 +#endif
452 +
453  .endfunc
454  #endif /* defined (L_prologue) */
455  
456 @@ -672,13 +677,22 @@
457         lpm     __tmp_reg__, Z+
458         lpm     r31, Z
459         mov     r30, __tmp_reg__
460 +
461 +#if defined (__AVR_3_BYTE_PC__)
462 +       eijmp
463 +#else
464         ijmp
465 +#endif
466 +
467  #else
468         lpm
469         adiw    r30, 1
470         push    r0
471         lpm
472         push    r0
473 +#if defined (__AVR_3_BYTE_PC__)
474 +        push    __zero_reg__
475 +#endif
476         ret
477  #endif
478         .endfunc
479 diff -uNdr gcc-4.2.2/gcc/config/avr-old/t-avr gcc-4.2.2/gcc/config/avr/t-avr
480 --- gcc-4.2.2/gcc/config/avr-old/t-avr  2007-04-27 22:53:57.000000000 +0200
481 +++ gcc-4.2.2/gcc/config/avr/t-avr      2007-10-20 18:12:15.000000000 +0200
482 @@ -37,8 +37,8 @@
483  
484  FPBIT = fp-bit.c
485  
486 -MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr4/mmcu=avr5
487 -MULTILIB_DIRNAMES = avr2 avr25 avr3 avr4 avr5
488 +MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr4/mmcu=avr5/mmcu=avr6
489 +MULTILIB_DIRNAMES = avr2 avr25 avr3 avr4 avr5 avr6
490  
491  # The many avr2 matches are not listed here - this is the default.
492  MULTILIB_MATCHES = \
493 @@ -111,7 +111,9 @@
494         mmcu?avr5=mmcu?at90usb647 \
495         mmcu?avr5=mmcu?at90usb1286 \
496         mmcu?avr5=mmcu?at90usb1287 \
497 -       mmcu?avr5=mmcu?at94k
498 +       mmcu?avr5=mmcu?at94k \
499 +       mmcu?avr6=mmcu?atmega2560 \
500 +       mmcu?avr6=mmcu?atmega2561
501  
502  MULTILIB_EXCEPTIONS =
503  
This page took 0.093114 seconds and 3 git commands to generate.