~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to tests/simulate/regression/bug-21955.c

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.1.7 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080810095916-wwyigh3vt0e9s7ud
Tags: 1:1.6.2.cvs20080610-2
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* bug #21955: pgm_read_xxxx() does not use enhanced LPM instruction
 
2
   $Id: bug-21955.c,v 1.1.2.2 2008/01/13 00:53:31 dmix Exp $
 
3
 
 
4
   Idea is to force 'region text is full': pgm_read_word() takes 5 words
 
5
   in case of classic LPM, and takes 2 words with enhanced LPM. */
 
6
 
 
7
#ifndef __AVR__
 
8
 
 
9
/* There are not sense to check host computer.  */
 
10
int main ()
 
11
{
 
12
    return 0;
 
13
}
 
14
 
 
15
#else
 
16
 
 
17
#include <avr/io.h>
 
18
#include <avr/pgmspace.h>
 
19
 
 
20
/* avr-gcc 4.1.2, Avr-libc 1.6.1, main() contains only 1 line with
 
21
   pgm_read_word, bytes:
 
22
      MIN_SIZE == 90  --> Fault
 
23
      MIN_SIZE == 100 --> OK
 
24
   So, for 50 lines it would:
 
25
      100 + 8*49 =  492  for enhanced
 
26
      100 + 14*49 = 786  for enhanced
 
27
   No use __AVR_HAVE_LPMX__ for preprocessing.  */
 
28
#if  (__AVR_ARCH__ == 2) || (__AVR_ARCH__ == 3)
 
29
# define MIN_SIZE 940
 
30
#else
 
31
# define MIN_SIZE 640
 
32
#endif
 
33
 
 
34
#define NWORDS  ((FLASHEND - _VECTORS_SIZE - MIN_SIZE)/2)
 
35
void very_big_function (void)
 
36
{
 
37
    asm volatile (
 
38
        ".rept  (%0)*256 + %1   \n\t"
 
39
        "nop                    \n\t"
 
40
        ".endr "
 
41
        :: "M" (NWORDS / 256),
 
42
           "M" (NWORDS % 256)
 
43
    );
 
44
}
 
45
 
 
46
 
 
47
int main ()
 
48
{
 
49
    volatile int rslt;
 
50
    int addr = 0;
 
51
 
 
52
    /* 10*4 words with enhanced LPM
 
53
       10*7 words with classic LPM      */
 
54
    addr = pgm_read_word (addr) & 0x7FF;
 
55
    addr = pgm_read_word (addr) & 0x7FF;
 
56
    addr = pgm_read_word (addr) & 0x7FF;
 
57
    addr = pgm_read_word (addr) & 0x7FF;
 
58
    addr = pgm_read_word (addr) & 0x7FF;
 
59
    addr = pgm_read_word (addr) & 0x7FF;
 
60
    addr = pgm_read_word (addr) & 0x7FF;
 
61
    addr = pgm_read_word (addr) & 0x7FF;
 
62
    addr = pgm_read_word (addr) & 0x7FF;
 
63
    addr = pgm_read_word (addr) & 0x7FF;                /* 10 */
 
64
 
 
65
    /* 10*4 words with enhanced LPM
 
66
       10*7 words with classic LPM      */
 
67
    addr = pgm_read_word (addr) & 0x7FF;
 
68
    addr = pgm_read_word (addr) & 0x7FF;
 
69
    addr = pgm_read_word (addr) & 0x7FF;
 
70
    addr = pgm_read_word (addr) & 0x7FF;
 
71
    addr = pgm_read_word (addr) & 0x7FF;
 
72
    addr = pgm_read_word (addr) & 0x7FF;
 
73
    addr = pgm_read_word (addr) & 0x7FF;
 
74
    addr = pgm_read_word (addr) & 0x7FF;
 
75
    addr = pgm_read_word (addr) & 0x7FF;
 
76
    addr = pgm_read_word (addr) & 0x7FF;                /* 20 */
 
77
 
 
78
    /* 10*4 words with enhanced LPM
 
79
       10*7 words with classic LPM      */
 
80
    addr = pgm_read_word (addr) & 0x7FF;
 
81
    addr = pgm_read_word (addr) & 0x7FF;
 
82
    addr = pgm_read_word (addr) & 0x7FF;
 
83
    addr = pgm_read_word (addr) & 0x7FF;
 
84
    addr = pgm_read_word (addr) & 0x7FF;
 
85
    addr = pgm_read_word (addr) & 0x7FF;
 
86
    addr = pgm_read_word (addr) & 0x7FF;
 
87
    addr = pgm_read_word (addr) & 0x7FF;
 
88
    addr = pgm_read_word (addr) & 0x7FF;
 
89
    addr = pgm_read_word (addr) & 0x7FF;                /* 30 */
 
90
 
 
91
    /* 10*4 words with enhanced LPM
 
92
       10*7 words with classic LPM      */
 
93
    addr = pgm_read_word (addr) & 0x7FF;
 
94
    addr = pgm_read_word (addr) & 0x7FF;
 
95
    addr = pgm_read_word (addr) & 0x7FF;
 
96
    addr = pgm_read_word (addr) & 0x7FF;
 
97
    addr = pgm_read_word (addr) & 0x7FF;
 
98
    addr = pgm_read_word (addr) & 0x7FF;
 
99
    addr = pgm_read_word (addr) & 0x7FF;
 
100
    addr = pgm_read_word (addr) & 0x7FF;
 
101
    addr = pgm_read_word (addr) & 0x7FF;
 
102
    addr = pgm_read_word (addr) & 0x7FF;                /* 40 */
 
103
 
 
104
    /* 10*4 words with enhanced LPM
 
105
       10*7 words with classic LPM      */
 
106
    addr = pgm_read_word (addr) & 0x7FF;
 
107
    addr = pgm_read_word (addr) & 0x7FF;
 
108
    addr = pgm_read_word (addr) & 0x7FF;
 
109
    addr = pgm_read_word (addr) & 0x7FF;
 
110
    addr = pgm_read_word (addr) & 0x7FF;
 
111
    addr = pgm_read_word (addr) & 0x7FF;
 
112
    addr = pgm_read_word (addr) & 0x7FF;
 
113
    addr = pgm_read_word (addr) & 0x7FF;
 
114
    addr = pgm_read_word (addr) & 0x7FF;
 
115
    addr = pgm_read_word (addr) & 0x7FF;                /* 50 */
 
116
 
 
117
    rslt = (int)addr;
 
118
    return 0;
 
119
}
 
120
 
 
121
#endif  /* __AVR__ */