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

« back to all changes in this revision

Viewing changes to libm/fplib/asmdef.h

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.2.1 upstream) (8 intrepid)
  • mto: (4.1.7 sid)
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: james.westby@ubuntu.com-20080810095916-7ku06pjsfia3hz16
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _ASMDEF_H
 
2
#define _ASMDEF_H
 
3
 
 
4
#ifndef __AVR_HAVE_MOVW__
 
5
# if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
 
6
#  define __AVR_HAVE_MOVW__ 1
 
7
# endif
 
8
#endif
 
9
 
 
10
#ifndef __AVR_HAVE_LPMX__
 
11
# if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
 
12
#  define __AVR_HAVE_LPMX__ 1
 
13
# endif
 
14
#endif
 
15
 
 
16
/* Historicaly, the _U() was intended to concatinate '_' prefix.
 
17
   Let us save it, as one is usefull to find externals quickly. */
 
18
#define _U(name)        name
 
19
 
 
20
#define XL      r26
 
21
#define XH      r27
 
22
#define YL      r28
 
23
#define YH      r29
 
24
#define ZL      r30
 
25
#define ZH      r31
 
26
 
 
27
#define SPL_IO_ADDR     0x3D
 
28
#define SPH_IO_ADDR     0x3E
 
29
 
 
30
.macro  FUNCTION name
 
31
  .ifdef  .Lfunction
 
32
    .err    "FUNCTION is defined already"
 
33
  .endif
 
34
        .Lfunction = 1
 
35
#ifdef  FUNC_SEGNAME
 
36
        .section  FUNC_SEGNAME, "ax", @progbits
 
37
#else
 
38
        .text
 
39
#endif
 
40
        .type   _U(\name), "function"
 
41
  .ifdef   .LEND
 
42
    .err    ".LEND is defined already"
 
43
  .endif
 
44
        .size   _U(\name), .LEND - .
 
45
.endm
 
46
#define FUNCTION  FUNCTION      /* for CPP conditional expressions      */
 
47
 
 
48
.macro  ENTRY   name
 
49
  .ifndef .Lfunction
 
50
FUNCTION \name
 
51
  .endif
 
52
        .global _U(\name)
 
53
_U(\name):
 
54
.endm
 
55
 
 
56
.macro  ENDFUNC
 
57
.LEND:
 
58
.endm
 
59
 
 
60
/* Macro 'X_movw' extends enhanced movw instruction for classic chips.
 
61
 */
 
62
.macro  X_movw  dst,src
 
63
#if  defined(__AVR_HAVE_MOVW__) && __AVR_HAVE_MOVW__
 
64
        movw    \dst,\src
 
65
#else
 
66
    .L_movw_dst = -1
 
67
    .L_movw_src = -1
 
68
    .L_movw_n = 0
 
69
    .irp  reg,   r0, r2, r4, r6, r8,    \
 
70
                r10,r12,r14,r16,r18,    \
 
71
                r20,r22,r24,r26,r28,r30
 
72
        .ifc  \reg,\dst
 
73
            .L_movw_dst = .L_movw_n
 
74
        .endif
 
75
        .ifc  \reg,\src
 
76
            .L_movw_src = .L_movw_n
 
77
        .endif
 
78
        .L_movw_n = .L_movw_n + 2
 
79
    .endr
 
80
    .if   .L_movw_dst < 0
 
81
        .L_movw_n = 0
 
82
        .rept   16
 
83
            .if \dst == .L_movw_n
 
84
                .L_movw_dst = .L_movw_n
 
85
            .endif
 
86
            .L_movw_n = .L_movw_n + 2
 
87
        .endr
 
88
    .endif
 
89
    .if   .L_movw_src < 0
 
90
        .L_movw_n = 0
 
91
        .rept   16
 
92
            .if \src == .L_movw_n
 
93
                .L_movw_src = .L_movw_n
 
94
            .endif
 
95
            .L_movw_n = .L_movw_n + 2
 
96
        .endr
 
97
    .endif
 
98
    .if   (.L_movw_dst < 0) || (.L_movw_src < 0)
 
99
        .err    "Invalid arg of the X_movw macro."
 
100
    .endif
 
101
        mov     \dst, \src
 
102
        mov     .L_movw_dst + 1, .L_movw_src + 1
 
103
#endif
 
104
.endm
 
105
 
 
106
/* Macro 'X_lpm' extends enhanced lpm instruction for classic chips.
 
107
   Usage:
 
108
        X_lpm   reg, dst
 
109
   where
 
110
        reg     is 0..31, r0..r31 or R0..R31
 
111
        dst     is z, Z, z+ or Z+
 
112
   It is possible to omit both arguments.
 
113
 
 
114
   Possible results for classic chips:
 
115
        lpm
 
116
        lpm / mov Rd,r0
 
117
        lpm / adiw ZL,1
 
118
        lpm / mov Rd,r0 / adiw ZL,1
 
119
        
 
120
   For enhanced chips it is one instruction always.
 
121
 
 
122
   ATTENTION:  unlike enhanced chips SREG (S,V,N,Z,C) flags are
 
123
   changed in case of 'Z+' dst.  R0 is scratch.
 
124
 */
 
125
.macro  X_lpm   dst=r0, src=Z
 
126
 
 
127
  /* dst evaluation     */
 
128
  .L_lpm_dst = -1
 
129
 
 
130
  .L_lpm_n = 0
 
131
  .irp  reg,  r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
 
132
             r10,r11,r12,r13,r14,r15,r16,r17,r18,r19, \
 
133
             r20,r21,r22,r23,r24,r25,r26,r27,r28,r29, \
 
134
             r30,r31
 
135
    .ifc  \reg,\dst
 
136
      .L_lpm_dst = .L_lpm_n
 
137
    .endif
 
138
    .L_lpm_n = .L_lpm_n + 1
 
139
  .endr
 
140
 
 
141
  .L_lpm_n = 0
 
142
  .irp  reg,  R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
 
143
             R10,R11,R12,R13,R14,R15,R16,R17,R18,R19, \
 
144
             R20,R21,R22,R23,R24,R25,R26,R27,R28,R29, \
 
145
             R30,R31
 
146
    .ifc  \reg,\dst
 
147
      .L_lpm_dst = .L_lpm_n
 
148
    .endif
 
149
    .L_lpm_n = .L_lpm_n + 1
 
150
  .endr
 
151
 
 
152
  .if  .L_lpm_dst < 0
 
153
    .L_lpm_n = 0
 
154
    .rept 32
 
155
      .if  \dst == .L_lpm_n
 
156
        .L_lpm_dst = .L_lpm_n
 
157
      .endif
 
158
      .L_lpm_n = .L_lpm_n + 1
 
159
    .endr
 
160
  .endif
 
161
 
 
162
  .if  (.L_lpm_dst < 0)
 
163
    .err        "Invalid dst arg of 'X_lpm' macro."
 
164
  .endif
 
165
 
 
166
  /* src evaluation     */    
 
167
  .L_lpm_src = -1
 
168
  .L_lpm_n = 0
 
169
  .irp  reg,  z,Z,z+,Z+
 
170
    .ifc  \reg,\src
 
171
      .L_lpm_src = .L_lpm_n
 
172
    .endif
 
173
    .L_lpm_n = .L_lpm_n + 1
 
174
  .endr
 
175
 
 
176
  .if  (.L_lpm_src < 0)
 
177
    .err        "Invalid src arg of 'X_lpm' macro."
 
178
  .endif
 
179
 
 
180
  /* instruction(s)     */    
 
181
  .if  .L_lpm_src < 2
 
182
    .if  .L_lpm_dst == 0
 
183
        lpm
 
184
    .else
 
185
#if  defined(__AVR_HAVE_LPMX__) && __AVR_HAVE_LPMX__
 
186
        lpm     .L_lpm_dst, Z
 
187
#else
 
188
        lpm
 
189
        mov     .L_lpm_dst, r0
 
190
#endif
 
191
    .endif
 
192
  .else
 
193
    .if  (.L_lpm_dst >= 30)
 
194
      .err      "Registers 30 and 31 are inhibited as 'X_lpm *,Z+' dst."
 
195
    .endif
 
196
#if  defined(__AVR_HAVE_LPMX__) && __AVR_HAVE_LPMX__
 
197
        lpm     .L_lpm_dst, Z+
 
198
#else
 
199
        lpm
 
200
    .if  .L_lpm_dst
 
201
        mov     .L_lpm_dst, r0
 
202
    .endif
 
203
        adiw    r30, 1
 
204
#endif
 
205
  .endif
 
206
.endm
 
207
 
 
208
#endif  /* !_ASMDEF_H */