1 | /* |
2 | wiring_pulse.s - pulseInASM() function in different flavours |
3 | Part of Arduino - http://www.arduino.cc/ |
4 | |
5 | Copyright (c) 2014 Martino Facchin |
6 | |
7 | This library is free software; you can redistribute it and/or |
8 | modify it under the terms of the GNU Lesser General Public |
9 | License as published by the Free Software Foundation; either |
10 | version 2.1 of the License, or (at your option) any later version. |
11 | |
12 | This library is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | Lesser General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU Lesser General |
18 | Public License along with this library; if not, write to the |
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
20 | Boston, MA 02111-1307 USA |
21 | */ |
22 |
|
23 | /* |
24 | * The following routine was generated by avr-gcc 4.8.3 with the following parameters |
25 | * -gstabs -Wa,-ahlmsd=output.lst -dp -fverbose-asm -O2 |
26 | * on the original C function |
27 | * |
28 | * unsigned long pulseInSimpl(volatile uint8_t *port, uint8_t bit, uint8_t stateMask, unsigned long maxloops) |
29 | * { |
30 | * unsigned long width = 0; |
31 | * // wait for any previous pulse to end |
32 | * while ((*port & bit) == stateMask) |
33 | * if (--maxloops == 0) |
34 | * return 0; |
35 | * |
36 | * // wait for the pulse to start |
37 | * while ((*port & bit) != stateMask) |
38 | * if (--maxloops == 0) |
39 | * return 0; |
40 | * |
41 | * // wait for the pulse to stop |
42 | * while ((*port & bit) == stateMask) { |
43 | * if (++width == maxloops) |
44 | * return 0; |
45 | * } |
46 | * return width; |
47 | * } |
48 | * |
49 | * some compiler outputs were removed but the rest of the code is untouched |
50 | */ |
51 |
|
52 | #include <avr/io.h> |
53 |
|
54 | .section .text |
55 |
|
56 | .global countPulseASM |
57 |
|
58 | countPulseASM: |
59 |
|
60 | .LM0: |
61 | .LFBB1: |
62 | push r12 ; ; 130 pushqi1/1 [length = 1] |
63 | push r13 ; ; 131 pushqi1/1 [length = 1] |
64 | push r14 ; ; 132 pushqi1/1 [length = 1] |
65 | push r15 ; ; 133 pushqi1/1 [length = 1] |
66 | push r16 ; ; 134 pushqi1/1 [length = 1] |
67 | push r17 ; ; 135 pushqi1/1 [length = 1] |
68 | /* prologue: function */ |
69 | /* frame size = 0 */ |
70 | /* stack size = 6 */ |
71 | .L__stack_usage = 6 |
72 | mov r30,r24 ; port, port ; 2 *movhi/1 [length = 2] |
73 | mov r31,r25 ; port, port |
74 | /* unsigned long width = 0; |
75 | *** // wait for any previous pulse to end |
76 | *** while ((*port & bit) == stateMask) |
77 | */ |
78 | .LM1: |
79 | rjmp .L2 ; ; 181 jump [length = 1] |
80 | .L4: |
81 | /* if (--maxloops == 0) */ |
82 | .LM2: |
83 | subi r16,1 ; maxloops, ; 17 addsi3/2 [length = 4] |
84 | sbc r17, r1 ; maxloops |
85 | sbc r18, r1 ; maxloops |
86 | sbc r19, r1 ; maxloops |
87 | breq .L13 ; , ; 19 branch [length = 1] |
88 | .L2: |
89 | /* if (--maxloops == 0) */ |
90 | .LM3: |
91 | ld r25,Z ; D.1554, *port_7(D) ; 22 movqi_insn/4 [length = 1] |
92 | and r25,r22 ; D.1554, bit ; 24 andqi3/1 [length = 1] |
93 | cp r25,r20 ; D.1554, stateMask ; 25 *cmpqi/2 [length = 1] |
94 | breq .L4 ; , ; 26 branch [length = 1] |
95 | rjmp .L6 ; ; 184 jump [length = 1] |
96 | .L7: |
97 | /* return 0; |
98 | *** |
99 | *** // wait for the pulse to start |
100 | *** while ((*port & bit) != stateMask) |
101 | *** if (--maxloops == 0) |
102 | */ |
103 | .LM4: |
104 | subi r16,1 ; maxloops, ; 31 addsi3/2 [length = 4] |
105 | sbc r17, r1 ; maxloops |
106 | sbc r18, r1 ; maxloops |
107 | sbc r19, r1 ; maxloops |
108 | breq .L13 ; , ; 33 branch [length = 1] |
109 | .L6: |
110 | /* if (--maxloops == 0) */ |
111 | .LM5: |
112 | ld r25,Z ; D.1554, *port_7(D) ; 41 movqi_insn/4 [length = 1] |
113 | and r25,r22 ; D.1554, bit ; 43 andqi3/1 [length = 1] |
114 | cpse r25,r20 ; D.1554, stateMask ; 44 enable_interrupt-3 [length = 1] |
115 | rjmp .L7 ; |
116 | mov r12, r1 ; width ; 7 *movsi/2 [length = 4] |
117 | mov r13, r1 ; width |
118 | mov r14, r1 ; width |
119 | mov r15, r1 ; width |
120 | rjmp .L9 ; ; 186 jump [length = 1] |
121 | .L10: |
122 | /* return 0; |
123 | *** |
124 | *** // wait for the pulse to stop |
125 | *** while ((*port & bit) == stateMask) { |
126 | *** if (++width == maxloops) |
127 | */ |
128 | .LM6: |
129 | ldi r24,-1 ; , ; 50 addsi3/3 [length = 5] |
130 | sub r12,r24 ; width, |
131 | sbc r13,r24 ; width, |
132 | sbc r14,r24 ; width, |
133 | sbc r15,r24 ; width, |
134 | cp r16,r12 ; maxloops, width ; 51 *cmpsi/2 [length = 4] |
135 | cpc r17,r13 ; maxloops, width |
136 | cpc r18,r14 ; maxloops, width |
137 | cpc r19,r15 ; maxloops, width |
138 | breq .L13 ; , ; 52 branch [length = 1] |
139 | .L9: |
140 | /* if (++width == maxloops) */ |
141 | .LM7: |
142 | ld r24,Z ; D.1554, *port_7(D) ; 60 movqi_insn/4 [length = 1] |
143 | and r24,r22 ; D.1554, bit ; 62 andqi3/1 [length = 1] |
144 | cp r24,r20 ; D.1554, stateMask ; 63 *cmpqi/2 [length = 1] |
145 | breq .L10 ; , ; 64 branch [length = 1] |
146 | /* return 0; |
147 | *** } |
148 | *** return width; |
149 | */ |
150 | .LM8: |
151 | mov r22,r12 ; D.1553, width ; 108 movqi_insn/1 [length = 1] |
152 | mov r23,r13 ; D.1553, width ; 109 movqi_insn/1 [length = 1] |
153 | mov r24,r14 ; D.1553, width ; 110 movqi_insn/1 [length = 1] |
154 | mov r25,r15 ; D.1553, width ; 111 movqi_insn/1 [length = 1] |
155 | /* epilogue start */ |
156 | .LM9: |
157 | pop r17 ; ; 171 popqi [length = 1] |
158 | pop r16 ; ; 172 popqi [length = 1] |
159 | pop r15 ; ; 173 popqi [length = 1] |
160 | pop r14 ; ; 174 popqi [length = 1] |
161 | pop r13 ; ; 175 popqi [length = 1] |
162 | pop r12 ; ; 176 popqi [length = 1] |
163 | ret ; 177 return_from_epilogue [length = 1] |
164 | .L13: |
165 | .LM10: |
166 | ldi r22,0 ; D.1553 ; 120 movqi_insn/1 [length = 1] |
167 | ldi r23,0 ; D.1553 ; 121 movqi_insn/1 [length = 1] |
168 | ldi r24,0 ; D.1553 ; 122 movqi_insn/1 [length = 1] |
169 | ldi r25,0 ; D.1553 ; 123 movqi_insn/1 [length = 1] |
170 | /* epilogue start */ |
171 | .LM11: |
172 | pop r17 ; ; 138 popqi [length = 1] |
173 | pop r16 ; ; 139 popqi [length = 1] |
174 | pop r15 ; ; 140 popqi [length = 1] |
175 | pop r14 ; ; 141 popqi [length = 1] |
176 | pop r13 ; ; 142 popqi [length = 1] |
177 | pop r12 ; ; 143 popqi [length = 1] |
178 | ret ; 144 return_from_epilogue [length = 1] |
179 |
|