~ubuntu-branches/ubuntu/maverick/avr-libc/maverick

« back to all changes in this revision

Viewing changes to libm/fplib/asmdef.h

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2009-10-31 11:52:10 UTC
  • mfrom: (1.1.8 upstream) (4.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091031115210-x0mlijnegkce86fk
Tags: 1:1.6.7-1
* New upstream relese (closes: #544030)
* Added lintian overrides (closes: #553265)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2006  Dmitry Xmelkov
 
2
   All rights reserved.
 
3
 
 
4
   Redistribution and use in source and binary forms, with or without
 
5
   modification, are permitted provided that the following conditions are met:
 
6
 
 
7
   * Redistributions of source code must retain the above copyright
 
8
     notice, this list of conditions and the following disclaimer.
 
9
   * Redistributions in binary form must reproduce the above copyright
 
10
     notice, this list of conditions and the following disclaimer in
 
11
     the documentation and/or other materials provided with the
 
12
     distribution.
 
13
   * Neither the name of the copyright holders nor the names of
 
14
     contributors may be used to endorse or promote products derived
 
15
     from this software without specific prior written permission.
 
16
 
 
17
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 
18
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
19
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
20
  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 
21
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
22
  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
23
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
24
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
25
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
26
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
27
  POSSIBILITY OF SUCH DAMAGE. */
 
28
 
 
29
/* $Id: asmdef.h,v 1.1.2.1 2008/12/06 03:28:42 dmix Exp $       */
 
30
 
1
31
#ifndef _ASMDEF_H
2
32
#define _ASMDEF_H
3
33
 
29
59
 
30
60
.macro  FUNCTION name
31
61
  .ifdef  .Lfunction
32
 
    .err    "FUNCTION is defined already"
 
62
    .err        ; FUNCTION is defined already.
33
63
  .endif
34
64
        .Lfunction = 1
35
65
#ifdef  FUNC_SEGNAME
39
69
#endif
40
70
        .type   _U(\name), "function"
41
71
  .ifdef   .LEND
42
 
    .err    ".LEND is defined already"
 
72
    .err        ; .LEND is defined already.
43
73
  .endif
44
74
        .size   _U(\name), .LEND - .
45
75
.endm
57
87
.LEND:
58
88
.endm
59
89
 
 
90
 
 
91
/* Macro REGNO set the symbol name 'name' to integer which is a 'reg'
 
92
   number (0..31). If 'reg' is not a valid register, compilation error.
 
93
   Valid regs are: r0..r31, R0..R31 and 0..31
 
94
 */
 
95
.macro  REGNO   name, reg
 
96
  \name = -1
 
97
 
 
98
  .L__regno = 0
 
99
  .irp  sym,  r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
 
100
             r10,r11,r12,r13,r14,r15,r16,r17,r18,r19, \
 
101
             r20,r21,r22,r23,r24,r25,r26,r27,r28,r29, \
 
102
             r30,r31
 
103
    .ifc  \sym,\reg
 
104
      \name = .L__regno
 
105
    .endif
 
106
    .L__regno = .L__regno + 1
 
107
  .endr
 
108
 
 
109
  .L__regno = 0
 
110
  .irp  sym,  R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
 
111
             R10,R11,R12,R13,R14,R15,R16,R17,R18,R19, \
 
112
             R20,R21,R22,R23,R24,R25,R26,R27,R28,R29, \
 
113
             R30,R31
 
114
    .ifc  \sym,\reg
 
115
      \name = .L__regno
 
116
    .endif
 
117
    .L__regno = .L__regno + 1
 
118
  .endr
 
119
 
 
120
  .if  \name < 0
 
121
    .L__regno = 0
 
122
    .rept 32
 
123
      .if  \reg == .L__regno
 
124
        \name = .L__regno
 
125
      .endif
 
126
      .L__regno = .L__regno + 1
 
127
    .endr
 
128
  .endif
 
129
 
 
130
  .if  \name < 0
 
131
    .err        ; Invalid dst arg of 'X_lpm' macro.
 
132
  .endif
 
133
 
 
134
.endm   /* REGNO */
 
135
 
60
136
/* Macro 'X_movw' extends enhanced movw instruction for classic chips.
61
137
 */
62
138
.macro  X_movw  dst,src
63
139
#if  defined(__AVR_HAVE_MOVW__) && __AVR_HAVE_MOVW__
64
140
        movw    \dst,\src
65
141
#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
 
142
  REGNO .L__movw_dst, \dst
 
143
  .if   .L__movw_dst < 0
 
144
    .exitm
 
145
  .endif
 
146
  .if   .L__movw_dst % 1
 
147
    .err        ; Invalid dst arg in X_movw macro.
 
148
    .exitm
 
149
  .endif
 
150
 
 
151
  REGNO .L__movw_src, \src
 
152
  .if   .L__movw_src < 0
 
153
    .exitm
 
154
  .endif
 
155
  .if   .L__movw_src % 1
 
156
    .err        ; Invalid src arg in X_movw macro.
 
157
    .exitm
 
158
  .endif
 
159
        mov     .L__movw_dst, .L__movw_src
 
160
        mov     .L__movw_dst + 1, .L__movw_src + 1
103
161
#endif
104
 
.endm
 
162
.endm   /* X_movw */
105
163
 
106
164
/* Macro 'X_lpm' extends enhanced lpm instruction for classic chips.
107
165
   Usage:
125
183
.macro  X_lpm   dst=r0, src=Z
126
184
 
127
185
  /* 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."
 
186
  REGNO .L__lpm_dst, \dst
 
187
  .if .L__lpm_dst < 0
 
188
    .exitm      ; do not multiply errors
164
189
  .endif
165
190
 
166
191
  /* src evaluation     */    
167
 
  .L_lpm_src = -1
168
 
  .L_lpm_n = 0
 
192
  .L__lpm_src = -1
 
193
  .L__lpm_n = 0
169
194
  .irp  reg,  z,Z,z+,Z+
170
195
    .ifc  \reg,\src
171
 
      .L_lpm_src = .L_lpm_n
 
196
      .L__lpm_src = .L__lpm_n
172
197
    .endif
173
 
    .L_lpm_n = .L_lpm_n + 1
 
198
    .L__lpm_n = .L__lpm_n + 1
174
199
  .endr
175
200
 
176
 
  .if  (.L_lpm_src < 0)
177
 
    .err        "Invalid src arg of 'X_lpm' macro."
 
201
  .if  (.L__lpm_src < 0)
 
202
    .err        ; Invalid src arg of 'X_lpm' macro.
178
203
  .endif
179
204
 
180
205
  /* instruction(s)     */    
181
 
  .if  .L_lpm_src < 2
182
 
    .if  .L_lpm_dst == 0
 
206
  .if  .L__lpm_src < 2
 
207
    .if  .L__lpm_dst == 0
183
208
        lpm
184
209
    .else
185
210
#if  defined(__AVR_HAVE_LPMX__) && __AVR_HAVE_LPMX__
186
 
        lpm     .L_lpm_dst, Z
 
211
        lpm     .L__lpm_dst, Z
187
212
#else
188
213
        lpm
189
 
        mov     .L_lpm_dst, r0
 
214
        mov     .L__lpm_dst, r0
190
215
#endif
191
216
    .endif
192
217
  .else
193
 
    .if  (.L_lpm_dst >= 30)
194
 
      .err      "Registers 30 and 31 are inhibited as 'X_lpm *,Z+' dst."
 
218
    .if  (.L__lpm_dst >= 30)
 
219
      .err      ; Registers 30 and 31 are inhibited as 'X_lpm *,Z+' dst.
195
220
    .endif
196
221
#if  defined(__AVR_HAVE_LPMX__) && __AVR_HAVE_LPMX__
197
 
        lpm     .L_lpm_dst, Z+
 
222
        lpm     .L__lpm_dst, Z+
198
223
#else
199
224
        lpm
200
 
    .if  .L_lpm_dst
201
 
        mov     .L_lpm_dst, r0
 
225
    .if  .L__lpm_dst
 
226
        mov     .L__lpm_dst, r0
202
227
    .endif
203
228
        adiw    r30, 1
204
229
#endif
205
230
  .endif
206
 
.endm
 
231
.endm   /* X_lpm */
207
232
 
208
233
#endif  /* !_ASMDEF_H */