0,0 → 1,209 |
1 # 1 "isqrt.S" |
1 ;-----------------------------------------------------------------------------; |
0 |
0 |
2 ;-----------------------------------------------------------------------------; |
3 ; Fast integer squareroot routines for avr-gcc project (C)ChaN, 2008 |
4 ; http://elm-chan.org/docs/avrlib/sqrt32.S |
5 ;-----------------------------------------------------------------------------; |
6 ; uint16_t isqrt32 (uint32_t n); |
7 ; uint8_t isqrt16 (uint16_t n); |
8 ; uint16_t ihypot (int16_t x, int16_t y); |
9 |
10 ;-----------------------------------------------------------------------------: |
11 ; 32bit integer squareroot |
12 ;-----------------------------------------------------------------------------; |
13 ; uint16_t isqrt32 ( |
14 ; uint32_t n |
15 ; ); |
16 ; |
17 ; Return Value: |
18 ; Squareroot of n. |
19 ; |
20 ; Size = 53 words |
21 ; Clock = 532..548 cycles |
22 ; Stack = 0 byte |
23 |
24 .global isqrt32 |
25 .func isqrt32 |
26 |
27:isqrt.S **** isqrt32: |
28:isqrt.S **** clr r0 |
29:isqrt.S **** clr r18 |
30:isqrt.S **** clr r19 |
31:isqrt.S **** clr r20 |
32:isqrt.S **** ldi r21, 1 |
33:isqrt.S **** clr r27 |
34:isqrt.S **** clr r30 |
35:isqrt.S **** clr r31 |
36:isqrt.S **** ldi r26, 16 |
37:isqrt.S **** 1: lsl r22 |
38:isqrt.S **** rol r23 |
39:isqrt.S **** rol r24 |
40:isqrt.S **** rol r25 |
41:isqrt.S **** rol r0 |
42:isqrt.S **** rol r18 |
43:isqrt.S **** rol r19 |
44:isqrt.S **** rol r20 |
45:isqrt.S **** lsl r22 |
46:isqrt.S **** rol r23 |
47:isqrt.S **** rol r24 |
48:isqrt.S **** rol r25 |
49:isqrt.S **** rol r0 |
50:isqrt.S **** rol r18 |
51:isqrt.S **** rol r19 |
52:isqrt.S **** rol r20 |
53:isqrt.S **** brpl 2f |
54:isqrt.S **** add r0, r21 |
55:isqrt.S **** adc r18, r27 |
56:isqrt.S **** adc r19, r30 |
57:isqrt.S **** adc r20, r31 |
58:isqrt.S **** rjmp 3f |
59:isqrt.S **** 2: sub r0, r21 |
60:isqrt.S **** sbc r18, r27 |
61:isqrt.S **** sbc r19, r30 |
62:isqrt.S **** sbc r20, r31 |
63:isqrt.S **** 3: lsl r21 |
64:isqrt.S **** rol r27 |
65:isqrt.S **** rol r30 |
66:isqrt.S **** andi r21, 0b11111000 |
67:isqrt.S **** ori r21, 0b00000101 |
68:isqrt.S **** sbrc r20, 7 |
69:isqrt.S **** subi r21, 2 |
70:isqrt.S **** dec r26 |
71:isqrt.S **** brne 1b |
72:isqrt.S **** lsr r30 |
73:isqrt.S **** ror r27 |
74:isqrt.S **** ror r21 |
75:isqrt.S **** lsr r30 |
76:isqrt.S **** ror r27 |
77:isqrt.S **** ror r21 |
78:isqrt.S **** mov r24, r21 |
79:isqrt.S **** mov r25, r27 |
80 ret |
81 .endfunc |
82 |
83 |
84 |
85 ;-----------------------------------------------------------------------------: |
86 ; 16bit integer squareroot |
87 ;-----------------------------------------------------------------------------; |
88 ; uint8_t isqrt16 ( |
89 ; uint16_t n |
90 ; ); |
91 ; |
92 ; Return Value: |
93 ; Squareroot of n. |
94 ; |
95 ; Size = 33 words |
96 ; Clock = 181..189 cycles |
97 ; Stack = 0 byte |
98 |
99 .global isqrt16 |
100 .func isqrt16 |
101 |
102:isqrt.S **** isqrt16: |
103:isqrt.S **** clr r18 |
104:isqrt.S **** clr r19 |
105:isqrt.S **** ldi r20, 1 |
106:isqrt.S **** clr r21 |
107:isqrt.S **** ldi r22, 8 |
108:isqrt.S **** 1: lsl r24 |
109:isqrt.S **** rol r25 |
110:isqrt.S **** rol r18 |
111:isqrt.S **** rol r19 |
112:isqrt.S **** lsl r24 |
113:isqrt.S **** rol r25 |
114:isqrt.S **** rol r18 |
115:isqrt.S **** rol r19 |
116:isqrt.S **** brpl 2f |
117:isqrt.S **** add r18, r20 |
118:isqrt.S **** adc r19, r21 |
119:isqrt.S **** rjmp 3f |
120:isqrt.S **** 2: sub r18, r20 |
121:isqrt.S **** sbc r19, r21 |
122:isqrt.S **** 3: lsl r20 |
123:isqrt.S **** rol r21 |
124:isqrt.S **** andi r20, 0b11111000 |
125:isqrt.S **** ori r20, 0b00000101 |
126:isqrt.S **** sbrc r19, 7 |
127:isqrt.S **** subi r20, 2 |
128:isqrt.S **** dec r22 |
129:isqrt.S **** brne 1b |
130:isqrt.S **** lsr r21 |
131:isqrt.S **** ror r20 |
132:isqrt.S **** lsr r21 |
133:isqrt.S **** ror r20 |
134:isqrt.S **** mov r24, r20 |
135 ret |
136 .endfunc |
137 |
138 |
139 |
140 ;-----------------------------------------------------------------------------: |
141 ; 16bit integer hypot (megaAVR is required) |
142 ;-----------------------------------------------------------------------------; |
143 ; uint16_t ihypot ( |
144 ; int16_t x, |
145 ; int16_t y |
146 ; ); |
147 ; |
148 ; Return Value: |
149 ; Squareroot of (x*x + y*y) |
150 ; |
151 ; Size = 42 words |
152 ; Clock = 581..597 cycles |
153 ; Stack = 0 byte |
154 |
155 .global ihypot |
156 .func ihypot |
157 |
158:isqrt.S **** ihypot: |
159:isqrt.S **** clr r26 |
160:isqrt.S **** sbrs r25, 7 |
161:isqrt.S **** rjmp 1f |
162:isqrt.S **** com r24 |
163:isqrt.S **** com r25 |
164:isqrt.S **** adc r24, r26 |
165:isqrt.S **** adc r25, r26 |
166:isqrt.S **** 1: sbrs r23, 7 |
167:isqrt.S **** rjmp 2f |
168:isqrt.S **** com r22 |
169:isqrt.S **** com r23 |
170:isqrt.S **** adc r22, r26 |
171:isqrt.S **** adc r23, r26 |
172:isqrt.S **** 2: mul r22, r22 |
173:isqrt.S **** movw r18, r0 |
174:isqrt.S **** mul r23, r23 |
175:isqrt.S **** movw r20, r0 |
176:isqrt.S **** mul r22, r23 |
177:isqrt.S **** add r19, r0 |
178:isqrt.S **** adc r20, r1 |
179:isqrt.S **** adc r21, r26 |
180:isqrt.S **** add r19, r0 |
181:isqrt.S **** adc r20, r1 |
182:isqrt.S **** adc r21, r26 |
183:isqrt.S **** mul r24, r24 |
184:isqrt.S **** movw r30, r0 |
185:isqrt.S **** mul r25, r25 |
186:isqrt.S **** add r18, r30 |
187:isqrt.S **** adc r19, r31 |
188:isqrt.S **** adc r20, r0 |
189:isqrt.S **** adc r21, r1 |
190:isqrt.S **** mul r24, r25 |
191:isqrt.S **** add r19, r0 |
192:isqrt.S **** adc r20, r1 |
193:isqrt.S **** adc r21, r26 |
194:isqrt.S **** add r19, r0 |
195:isqrt.S **** adc r20, r1 |
196:isqrt.S **** adc r21, r26 |
197:isqrt.S **** movw r24, r20 |
198:isqrt.S **** movw r22, r18 |
199:isqrt.S **** clr r1 |
200 rjmp isqrt32 |
DEFINED SYMBOLS |
isqrt.S:26 .text:00000000 isqrt32 |
isqrt.S:101 .text:0000006a isqrt16 |
isqrt.S:157 .text:000000ac ihypot |
|
NO UNDEFINED SYMBOLS |