Browse Source

Apply shorthand Assembler macros

Scott Lahteine 7 years ago
parent
commit
0436e16fb2

+ 47
- 45
Marlin/src/HAL/HAL_AVR/math_AVR.h View File

@@ -23,6 +23,8 @@
23 23
 #ifndef _MATH_AVR_H_
24 24
 #define _MATH_AVR_H_
25 25
 
26
+#define a(CODE) " " CODE "\n\t"
27
+
26 28
 /**
27 29
  * Optimized math functions for AVR
28 30
  */
@@ -39,41 +41,41 @@
39 41
 //
40 42
 #define MultiU24X32toH16(intRes, longIn1, longIn2) \
41 43
   asm volatile ( \
42
-                 "clr r26 \n\t" \
43
-                 "mul %A1, %B2 \n\t" \
44
-                 "mov r27, r1 \n\t" \
45
-                 "mul %B1, %C2 \n\t" \
46
-                 "movw %A0, r0 \n\t" \
47
-                 "mul %C1, %C2 \n\t" \
48
-                 "add %B0, r0 \n\t" \
49
-                 "mul %C1, %B2 \n\t" \
50
-                 "add %A0, r0 \n\t" \
51
-                 "adc %B0, r1 \n\t" \
52
-                 "mul %A1, %C2 \n\t" \
53
-                 "add r27, r0 \n\t" \
54
-                 "adc %A0, r1 \n\t" \
55
-                 "adc %B0, r26 \n\t" \
56
-                 "mul %B1, %B2 \n\t" \
57
-                 "add r27, r0 \n\t" \
58
-                 "adc %A0, r1 \n\t" \
59
-                 "adc %B0, r26 \n\t" \
60
-                 "mul %C1, %A2 \n\t" \
61
-                 "add r27, r0 \n\t" \
62
-                 "adc %A0, r1 \n\t" \
63
-                 "adc %B0, r26 \n\t" \
64
-                 "mul %B1, %A2 \n\t" \
65
-                 "add r27, r1 \n\t" \
66
-                 "adc %A0, r26 \n\t" \
67
-                 "adc %B0, r26 \n\t" \
68
-                 "lsr r27 \n\t" \
69
-                 "adc %A0, r26 \n\t" \
70
-                 "adc %B0, r26 \n\t" \
71
-                 "mul %D2, %A1 \n\t" \
72
-                 "add %A0, r0 \n\t" \
73
-                 "adc %B0, r1 \n\t" \
74
-                 "mul %D2, %B1 \n\t" \
75
-                 "add %B0, r0 \n\t" \
76
-                 "clr r1 \n\t" \
44
+                 A("clr r26")      \
45
+                 A("mul %A1, %B2") \
46
+                 A("mov r27, r1")  \
47
+                 A("mul %B1, %C2") \
48
+                 A("movw %A0, r0") \
49
+                 A("mul %C1, %C2") \
50
+                 A("add %B0, r0")  \
51
+                 A("mul %C1, %B2") \
52
+                 A("add %A0, r0")  \
53
+                 A("adc %B0, r1")  \
54
+                 A("mul %A1, %C2") \
55
+                 A("add r27, r0")  \
56
+                 A("adc %A0, r1")  \
57
+                 A("adc %B0, r26") \
58
+                 A("mul %B1, %B2") \
59
+                 A("add r27, r0")  \
60
+                 A("adc %A0, r1")  \
61
+                 A("adc %B0, r26") \
62
+                 A("mul %C1, %A2") \
63
+                 A("add r27, r0")  \
64
+                 A("adc %A0, r1")  \
65
+                 A("adc %B0, r26") \
66
+                 A("mul %B1, %A2") \
67
+                 A("add r27, r1")  \
68
+                 A("adc %A0, r26") \
69
+                 A("adc %B0, r26") \
70
+                 A("lsr r27")      \
71
+                 A("adc %A0, r26") \
72
+                 A("adc %B0, r26") \
73
+                 A("mul %D2, %A1") \
74
+                 A("add %A0, r0")  \
75
+                 A("adc %B0, r1")  \
76
+                 A("mul %D2, %B1") \
77
+                 A("add %B0, r0")  \
78
+                 A("clr r1")       \
77 79
                  : \
78 80
                  "=&r" (intRes) \
79 81
                  : \
@@ -89,16 +91,16 @@
89 91
 // r27 to store the byte 1 of the 24 bit result
90 92
 #define MultiU16X8toH16(intRes, charIn1, intIn2) \
91 93
   asm volatile ( \
92
-                 "clr r26 \n\t" \
93
-                 "mul %A1, %B2 \n\t" \
94
-                 "movw %A0, r0 \n\t" \
95
-                 "mul %A1, %A2 \n\t" \
96
-                 "add %A0, r1 \n\t" \
97
-                 "adc %B0, r26 \n\t" \
98
-                 "lsr r0 \n\t" \
99
-                 "adc %A0, r26 \n\t" \
100
-                 "adc %B0, r26 \n\t" \
101
-                 "clr r1 \n\t" \
94
+                 A("clr r26")      \
95
+                 A("mul %A1, %B2") \
96
+                 A("movw %A0, r0") \
97
+                 A("mul %A1, %A2") \
98
+                 A("add %A0, r1")  \
99
+                 A("adc %B0, r26") \
100
+                 A("lsr r0")       \
101
+                 A("adc %A0, r26") \
102
+                 A("adc %B0, r26") \
103
+                 A("clr r1")       \
102 104
                  : \
103 105
                  "=&r" (intRes) \
104 106
                  : \

+ 65
- 65
Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp View File

@@ -36,7 +36,7 @@
36 36
 // state we are when running them
37 37
 
38 38
 // A SW memory barrier, to ensure GCC does not overoptimize loops
39
-#define sw_barrier() asm volatile("": : :"memory");
39
+#define sw_barrier() __asm__ volatile("": : :"memory");
40 40
 
41 41
 // (re)initialize UART0 as a monitor output to 250000,n,8,1
42 42
 static void TXBegin(void) {
@@ -230,106 +230,106 @@ void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause
230 230
 
231 231
 __attribute__((naked)) void NMI_Handler(void) {
232 232
   __asm__ __volatile__ (
233
-    ".syntax unified        \n"
234
-    " tst lr, #4            \n"
235
-    " ite eq                \n"
236
-    " mrseq r0, msp         \n"
237
-    " mrsne r0, psp         \n"
238
-    " mov r1,lr             \n"
239
-    " mov r2,#0             \n"
240
-    " b HardFault_HandlerC  \n"
233
+    ".syntax unified" "\n\t"
234
+    A("tst lr, #4")
235
+    A("ite eq")
236
+    A("mrseq r0, msp")
237
+    A("mrsne r0, psp")
238
+    A("mov r1,lr")
239
+    A("mov r2,#0")
240
+    A("b HardFault_HandlerC")
241 241
   );
242 242
 }
243 243
 
244 244
 __attribute__((naked)) void HardFault_Handler(void) {
245 245
   __asm__ __volatile__ (
246
-    ".syntax unified        \n"
247
-    " tst lr, #4            \n"
248
-    " ite eq                \n"
249
-    " mrseq r0, msp         \n"
250
-    " mrsne r0, psp         \n"
251
-    " mov r1,lr             \n"
252
-    " mov r2,#1             \n"
253
-    " b HardFault_HandlerC  \n"
246
+    ".syntax unified" "\n\t"
247
+    A("tst lr, #4")
248
+    A("ite eq")
249
+    A("mrseq r0, msp")
250
+    A("mrsne r0, psp")
251
+    A("mov r1,lr")
252
+    A("mov r2,#1")
253
+    A("b HardFault_HandlerC")
254 254
   );
255 255
 }
256 256
 
257 257
 __attribute__((naked)) void MemManage_Handler(void) {
258 258
   __asm__ __volatile__ (
259
-    ".syntax unified        \n"
260
-    " tst lr, #4            \n"
261
-    " ite eq                \n"
262
-    " mrseq r0, msp         \n"
263
-    " mrsne r0, psp         \n"
264
-    " mov r1,lr             \n"
265
-    " mov r2,#2             \n"
266
-    " b HardFault_HandlerC  \n"
259
+    ".syntax unified" "\n\t"
260
+    A("tst lr, #4")
261
+    A("ite eq")
262
+    A("mrseq r0, msp")
263
+    A("mrsne r0, psp")
264
+    A("mov r1,lr")
265
+    A("mov r2,#2")
266
+    A("b HardFault_HandlerC")
267 267
   );
268 268
 }
269 269
 
270 270
 __attribute__((naked)) void BusFault_Handler(void) {
271 271
   __asm__ __volatile__ (
272
-    ".syntax unified        \n"
273
-    " tst lr, #4            \n"
274
-    " ite eq                \n"
275
-    " mrseq r0, msp         \n"
276
-    " mrsne r0, psp         \n"
277
-    " mov r1,lr             \n"
278
-    " mov r2,#3             \n"
279
-    " b HardFault_HandlerC  \n"
272
+    ".syntax unified" "\n\t"
273
+    A("tst lr, #4")
274
+    A("ite eq")
275
+    A("mrseq r0, msp")
276
+    A("mrsne r0, psp")
277
+    A("mov r1,lr")
278
+    A("mov r2,#3")
279
+    A("b HardFault_HandlerC")
280 280
   );
281 281
 }
282 282
 
283 283
 __attribute__((naked)) void UsageFault_Handler(void) {
284 284
   __asm__ __volatile__ (
285
-    ".syntax unified        \n"
286
-    " tst lr, #4            \n"
287
-    " ite eq                \n"
288
-    " mrseq r0, msp         \n"
289
-    " mrsne r0, psp         \n"
290
-    " mov r1,lr             \n"
291
-    " mov r2,#4             \n"
292
-    " b HardFault_HandlerC  \n"
285
+    ".syntax unified" "\n\t"
286
+    A("tst lr, #4")
287
+    A("ite eq")
288
+    A("mrseq r0, msp")
289
+    A("mrsne r0, psp")
290
+    A("mov r1,lr")
291
+    A("mov r2,#4")
292
+    A("b HardFault_HandlerC")
293 293
   );
294 294
 }
295 295
 
296 296
 __attribute__((naked)) void DebugMon_Handler(void) {
297 297
   __asm__ __volatile__ (
298
-    ".syntax unified        \n"
299
-    " tst lr, #4            \n"
300
-    " ite eq                \n"
301
-    " mrseq r0, msp         \n"
302
-    " mrsne r0, psp         \n"
303
-    " mov r1,lr             \n"
304
-    " mov r2,#5             \n"
305
-    " b HardFault_HandlerC  \n"
298
+    ".syntax unified" "\n\t"
299
+    A("tst lr, #4")
300
+    A("ite eq")
301
+    A("mrseq r0, msp")
302
+    A("mrsne r0, psp")
303
+    A("mov r1,lr")
304
+    A("mov r2,#5")
305
+    A("b HardFault_HandlerC")
306 306
   );
307 307
 }
308 308
 
309 309
 /* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
310 310
 __attribute__((naked)) void WDT_Handler(void) {
311 311
   __asm__ __volatile__ (
312
-    ".syntax unified        \n"
313
-    " tst lr, #4            \n"
314
-    " ite eq                \n"
315
-    " mrseq r0, msp         \n"
316
-    " mrsne r0, psp         \n"
317
-    " mov r1,lr             \n"
318
-    " mov r2,#6             \n"
319
-    " b HardFault_HandlerC  \n"
312
+    ".syntax unified" "\n\t"
313
+    A("tst lr, #4")
314
+    A("ite eq")
315
+    A("mrseq r0, msp")
316
+    A("mrsne r0, psp")
317
+    A("mov r1,lr")
318
+    A("mov r2,#6")
319
+    A("b HardFault_HandlerC")
320 320
   );
321 321
 }
322 322
 
323 323
 __attribute__((naked)) void RSTC_Handler(void) {
324 324
   __asm__ __volatile__ (
325
-    ".syntax unified        \n"
326
-    " tst lr, #4            \n"
327
-    " ite eq                \n"
328
-    " mrseq r0, msp         \n"
329
-    " mrsne r0, psp         \n"
330
-    " mov r1,lr             \n"
331
-    " mov r2,#7             \n"
332
-    " b HardFault_HandlerC  \n"
325
+    ".syntax unified" "\n\t"
326
+    A("tst lr, #4")
327
+    A("ite eq")
328
+    A("mrseq r0, msp")
329
+    A("mrsne r0, psp")
330
+    A("mov r1,lr")
331
+    A("mov r2,#7")
332
+    A("b HardFault_HandlerC")
333 333
   );
334 334
 }
335 335
 

+ 143
- 143
Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp View File

@@ -77,10 +77,10 @@
77 77
     __asm__ __volatile__(
78 78
       ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
79 79
 
80
-      "loop%=:" "\n\t"
81
-      " subs %[cnt],#1" "\n\t"
82
-      EXTRA_NOP_CYCLES "\n\t"
83
-      " bne loop%=" "\n\t"
80
+      L("loop%=")
81
+      A("subs %[cnt],#1")
82
+      A(EXTRA_NOP_CYCLES)
83
+      A("bne loop%=")
84 84
       : [cnt]"+r"(cy) // output: +r means input+output
85 85
       : // input:
86 86
       : "cc" // clobbers:
@@ -141,54 +141,54 @@
141 141
       ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
142 142
 
143 143
       /* Bit 7 */
144
-      " ubfx %[idx],%[txval],#7,#1" "\n\t"                      /* Place bit 7 in bit 0 of idx*/
144
+      A("ubfx %[idx],%[txval],#7,#1")                      /* Place bit 7 in bit 0 of idx*/
145 145
 
146
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
147
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
148
-      " ubfx %[idx],%[txval],#6,#1" "\n\t"                      /* Place bit 6 in bit 0 of idx*/
149
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
146
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
147
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
148
+      A("ubfx %[idx],%[txval],#6,#1")                      /* Place bit 6 in bit 0 of idx*/
149
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
150 150
 
151 151
       /* Bit 6 */
152
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
153
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
154
-      " ubfx %[idx],%[txval],#5,#1" "\n\t"                      /* Place bit 5 in bit 0 of idx*/
155
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
152
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
153
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
154
+      A("ubfx %[idx],%[txval],#5,#1")                      /* Place bit 5 in bit 0 of idx*/
155
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
156 156
 
157 157
       /* Bit 5 */
158
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
159
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
160
-      " ubfx %[idx],%[txval],#4,#1" "\n\t"                      /* Place bit 4 in bit 0 of idx*/
161
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
158
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
159
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
160
+      A("ubfx %[idx],%[txval],#4,#1")                      /* Place bit 4 in bit 0 of idx*/
161
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
162 162
 
163 163
       /* Bit 4 */
164
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
165
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
166
-      " ubfx %[idx],%[txval],#3,#1" "\n\t"                      /* Place bit 3 in bit 0 of idx*/
167
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
164
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
165
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
166
+      A("ubfx %[idx],%[txval],#3,#1")                      /* Place bit 3 in bit 0 of idx*/
167
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
168 168
 
169 169
       /* Bit 3 */
170
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
171
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
172
-      " ubfx %[idx],%[txval],#2,#1" "\n\t"                      /* Place bit 2 in bit 0 of idx*/
173
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
170
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
171
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
172
+      A("ubfx %[idx],%[txval],#2,#1")                      /* Place bit 2 in bit 0 of idx*/
173
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
174 174
 
175 175
       /* Bit 2 */
176
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
177
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
178
-      " ubfx %[idx],%[txval],#1,#1" "\n\t"                      /* Place bit 1 in bit 0 of idx*/
179
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
176
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
177
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
178
+      A("ubfx %[idx],%[txval],#1,#1")                      /* Place bit 1 in bit 0 of idx*/
179
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
180 180
 
181 181
       /* Bit 1 */
182
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
183
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
184
-      " ubfx %[idx],%[txval],#0,#1" "\n\t"                      /* Place bit 0 in bit 0 of idx*/
185
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
182
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
183
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
184
+      A("ubfx %[idx],%[txval],#0,#1")                      /* Place bit 0 in bit 0 of idx*/
185
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
186 186
 
187 187
       /* Bit 0 */
188
-      " str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
189
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
190
-      " nop" "\n\t"                                             /* Result will be 0 */
191
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
188
+      A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
189
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
190
+      A("nop")                                             /* Result will be 0 */
191
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
192 192
 
193 193
       : [idx]"+r"( idx )
194 194
       : [txval]"r"( bout ) ,
@@ -222,52 +222,52 @@
222 222
       ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
223 223
 
224 224
       /* bit 7 */
225
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
226
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
227
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
228
-      " bfi %[bin],%[work],#7,#1" "\n\t"                /* Store read bit as the bit 7 */
225
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
226
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
227
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
228
+      A("bfi %[bin],%[work],#7,#1")                /* Store read bit as the bit 7 */
229 229
 
230 230
       /* bit 6 */
231
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
232
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
233
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
234
-      " bfi %[bin],%[work],#6,#1" "\n\t"                /* Store read bit as the bit 6 */
231
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
232
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
233
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
234
+      A("bfi %[bin],%[work],#6,#1")                /* Store read bit as the bit 6 */
235 235
 
236 236
       /* bit 5 */
237
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
238
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
239
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
240
-      " bfi %[bin],%[work],#5,#1" "\n\t"                /* Store read bit as the bit 5 */
237
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
238
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
239
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
240
+      A("bfi %[bin],%[work],#5,#1")                /* Store read bit as the bit 5 */
241 241
 
242 242
       /* bit 4 */
243
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
244
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
245
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
246
-      " bfi %[bin],%[work],#4,#1" "\n\t"                /* Store read bit as the bit 4 */
243
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
244
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
245
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
246
+      A("bfi %[bin],%[work],#4,#1")                /* Store read bit as the bit 4 */
247 247
 
248 248
       /* bit 3 */
249
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
250
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
251
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
252
-      " bfi %[bin],%[work],#3,#1" "\n\t"                /* Store read bit as the bit 3 */
249
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
250
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
251
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
252
+      A("bfi %[bin],%[work],#3,#1")                /* Store read bit as the bit 3 */
253 253
 
254 254
       /* bit 2 */
255
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
256
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
257
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
258
-      " bfi %[bin],%[work],#2,#1" "\n\t"                /* Store read bit as the bit 2 */
255
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
256
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
257
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
258
+      A("bfi %[bin],%[work],#2,#1")                /* Store read bit as the bit 2 */
259 259
 
260 260
       /* bit 1 */
261
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
262
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
263
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
264
-      " bfi %[bin],%[work],#1,#1" "\n\t"                /* Store read bit as the bit 1 */
261
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
262
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
263
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
264
+      A("bfi %[bin],%[work],#1,#1")                /* Store read bit as the bit 1 */
265 265
 
266 266
       /* bit 0 */
267
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
268
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
269
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
270
-      " bfi %[bin],%[work],#0,#1" "\n\t"                /* Store read bit as the bit 0 */
267
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
268
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
269
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
270
+      A("bfi %[bin],%[work],#0,#1")                /* Store read bit as the bit 0 */
271 271
 
272 272
       : [bin]"+r"(bin),
273 273
         [work]"+r"(work)
@@ -335,60 +335,60 @@
335 335
     __asm__ __volatile__(
336 336
       ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
337 337
 
338
-      " loop%=:" "\n\t"
339
-      " ldrb.w %[txval], [%[ptr]], #1" "\n\t"                   /* Load value to send, increment buffer */
340
-      " mvn %[txval],%[txval]" "\n\t"                           /* Negate value */
338
+      L("loop%=")
339
+      A("ldrb.w %[txval], [%[ptr]], #1")                   /* Load value to send, increment buffer */
340
+      A("mvn %[txval],%[txval]")                           /* Negate value */
341 341
 
342 342
       /* Bit 7 */
343
-      " ubfx %[work],%[txval],#7,#1" "\n\t"                     /* Place bit 7 in bit 0 of work*/
343
+      A("ubfx %[work],%[txval],#7,#1")                     /* Place bit 7 in bit 0 of work*/
344 344
 
345
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
346
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
347
-      " ubfx %[work],%[txval],#6,#1" "\n\t"                     /* Place bit 6 in bit 0 of work*/
348
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
345
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
346
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
347
+      A("ubfx %[work],%[txval],#6,#1")                     /* Place bit 6 in bit 0 of work*/
348
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
349 349
 
350 350
       /* Bit 6 */
351
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
352
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
353
-      " ubfx %[work],%[txval],#5,#1" "\n\t"                     /* Place bit 5 in bit 0 of work*/
354
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
351
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
352
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
353
+      A("ubfx %[work],%[txval],#5,#1")                     /* Place bit 5 in bit 0 of work*/
354
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
355 355
 
356 356
       /* Bit 5 */
357
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
358
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
359
-      " ubfx %[work],%[txval],#4,#1" "\n\t"                     /* Place bit 4 in bit 0 of work*/
360
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
357
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
358
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
359
+      A("ubfx %[work],%[txval],#4,#1")                     /* Place bit 4 in bit 0 of work*/
360
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
361 361
 
362 362
       /* Bit 4 */
363
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
364
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
365
-      " ubfx %[work],%[txval],#3,#1" "\n\t"                     /* Place bit 3 in bit 0 of work*/
366
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
363
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
364
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
365
+      A("ubfx %[work],%[txval],#3,#1")                     /* Place bit 3 in bit 0 of work*/
366
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
367 367
 
368 368
       /* Bit 3 */
369
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
370
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
371
-      " ubfx %[work],%[txval],#2,#1" "\n\t"                     /* Place bit 2 in bit 0 of work*/
372
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
369
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
370
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
371
+      A("ubfx %[work],%[txval],#2,#1")                     /* Place bit 2 in bit 0 of work*/
372
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
373 373
 
374 374
       /* Bit 2 */
375
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
376
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
377
-      " ubfx %[work],%[txval],#1,#1" "\n\t"                     /* Place bit 1 in bit 0 of work*/
378
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
375
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
376
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
377
+      A("ubfx %[work],%[txval],#1,#1")                     /* Place bit 1 in bit 0 of work*/
378
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
379 379
 
380 380
       /* Bit 1 */
381
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t" /* Access the proper SODR or CODR registers based on that bit */
382
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
383
-      " ubfx %[work],%[txval],#0,#1" "\n\t"                     /* Place bit 0 in bit 0 of work*/
384
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
381
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
382
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
383
+      A("ubfx %[work],%[txval],#0,#1")                     /* Place bit 0 in bit 0 of work*/
384
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
385 385
 
386 386
       /* Bit 0 */
387
-      " str %[mosi_mask],[%[mosi_port], %[work],LSL #2]" "\n\t"  /* Access the proper SODR or CODR registers based on that bit */
388
-      " str %[sck_mask],[%[sck_port]]" "\n\t"                   /* SODR */
389
-      " subs %[todo],#1" "\n\t"                                 /* Decrement count of pending words to send, update status */
390
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"              /* CODR */
391
-      " bne.n loop%=" "\n\t"                                    /* Repeat until done */
387
+      A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]")  /* Access the proper SODR or CODR registers based on that bit */
388
+      A("str %[sck_mask],[%[sck_port]]")                   /* SODR */
389
+      A("subs %[todo],#1")                                 /* Decrement count of pending words to send, update status */
390
+      A("str %[sck_mask],[%[sck_port],#0x4]")              /* CODR */
391
+      A("bne.n loop%=")                                    /* Repeat until done */
392 392
 
393 393
       : [ptr]"+r" ( ptr ) ,
394 394
         [todo]"+r" ( todo ) ,
@@ -413,59 +413,59 @@
413 413
     __asm__ __volatile__(
414 414
       ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
415 415
 
416
-      " loop%=:" "\n\t"
416
+      L("loop%=")
417 417
 
418 418
       /* bit 7 */
419
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
420
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
421
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
422
-      " bfi %[bin],%[work],#7,#1" "\n\t"                /* Store read bit as the bit 7 */
419
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
420
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
421
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
422
+      A("bfi %[bin],%[work],#7,#1")                /* Store read bit as the bit 7 */
423 423
 
424 424
       /* bit 6 */
425
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
426
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
427
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
428
-      " bfi %[bin],%[work],#6,#1" "\n\t"                /* Store read bit as the bit 6 */
425
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
426
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
427
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
428
+      A("bfi %[bin],%[work],#6,#1")                /* Store read bit as the bit 6 */
429 429
 
430 430
       /* bit 5 */
431
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
432
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
433
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
434
-      " bfi %[bin],%[work],#5,#1" "\n\t"                /* Store read bit as the bit 5 */
431
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
432
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
433
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
434
+      A("bfi %[bin],%[work],#5,#1")                /* Store read bit as the bit 5 */
435 435
 
436 436
       /* bit 4 */
437
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
438
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
439
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
440
-      " bfi %[bin],%[work],#4,#1" "\n\t"                /* Store read bit as the bit 4 */
437
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
438
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
439
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
440
+      A("bfi %[bin],%[work],#4,#1")                /* Store read bit as the bit 4 */
441 441
 
442 442
       /* bit 3 */
443
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
444
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
445
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
446
-      " bfi %[bin],%[work],#3,#1" "\n\t"                /* Store read bit as the bit 3 */
443
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
444
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
445
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
446
+      A("bfi %[bin],%[work],#3,#1")                /* Store read bit as the bit 3 */
447 447
 
448 448
       /* bit 2 */
449
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
450
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
451
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
452
-      " bfi %[bin],%[work],#2,#1" "\n\t"                /* Store read bit as the bit 2 */
449
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
450
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
451
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
452
+      A("bfi %[bin],%[work],#2,#1")                /* Store read bit as the bit 2 */
453 453
 
454 454
       /* bit 1 */
455
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
456
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
457
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
458
-      " bfi %[bin],%[work],#1,#1" "\n\t"                /* Store read bit as the bit 1 */
455
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
456
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
457
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
458
+      A("bfi %[bin],%[work],#1,#1")                /* Store read bit as the bit 1 */
459 459
 
460 460
       /* bit 0 */
461
-      " str %[sck_mask],[%[sck_port]]" "\n\t"           /* SODR */
462
-      " ldr %[work],[%[bitband_miso_port]]" "\n\t"      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
463
-      " str %[sck_mask],[%[sck_port],#0x4]" "\n\t"      /* CODR */
464
-      " bfi %[bin],%[work],#0,#1" "\n\t"                /* Store read bit as the bit 0 */
465
-
466
-      " subs %[todo],#1" "\n\t"                         /* Decrement count of pending words to send, update status */
467
-      " strb.w %[bin], [%[ptr]], #1" "\n\t"             /* Store read value into buffer, increment buffer pointer */
468
-      " bne.n loop%=" "\n\t"                            /* Repeat until done */
461
+      A("str %[sck_mask],[%[sck_port]]")           /* SODR */
462
+      A("ldr %[work],[%[bitband_miso_port]]")      /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
463
+      A("str %[sck_mask],[%[sck_port],#0x4]")      /* CODR */
464
+      A("bfi %[bin],%[work],#0,#1")                /* Store read bit as the bit 0 */
465
+
466
+      A("subs %[todo],#1")                         /* Decrement count of pending words to send, update status */
467
+      A("strb.w %[bin], [%[ptr]], #1")             /* Store read value into buffer, increment buffer pointer */
468
+      A("bne.n loop%=")                            /* Repeat until done */
469 469
 
470 470
       : [ptr]"+r"(ptr),
471 471
         [todo]"+r"(todo),

+ 4
- 6
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp View File

@@ -71,8 +71,6 @@ void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) {
71 71
   else port->PIO_CODR = mask;
72 72
 }
73 73
 
74
-#define nop() __asm__ __volatile__("nop;\n\t":::)
75
-
76 74
 void __delay_4cycles(uint32_t cy) __attribute__ ((weak));
77 75
 
78 76
 FORCE_INLINE void __delay_4cycles(uint32_t cy) { // +1 cycle
@@ -85,10 +83,10 @@ FORCE_INLINE void __delay_4cycles(uint32_t cy) { // +1 cycle
85 83
   __asm__ __volatile__(
86 84
     ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax
87 85
 
88
-    "loop%=:" "\n\t"
89
-    " subs %[cnt],#1" "\n\t"
90
-    EXTRA_NOP_CYCLES "\n\t"
91
-    " bne loop%=" "\n\t"
86
+    L("loop%=")
87
+    A("subs %[cnt],#1")
88
+    A(EXTRA_NOP_CYCLES)
89
+    A("bne loop%=")
92 90
     : [cnt]"+r"(cy) // output: +r means input+output
93 91
     : // input:
94 92
     : "cc" // clobbers:

+ 1
- 1
Marlin/src/backtrace/unwarmbytab.cpp View File

@@ -291,7 +291,7 @@ static inline __attribute__((always_inline)) uint32_t read_psp(void) {
291 291
   /* Read the current PSP and return its value as a pointer */
292 292
   uint32_t psp;
293 293
 
294
-  __asm volatile (
294
+  __asm__ volatile (
295 295
     "   mrs %0, psp \n"
296 296
     : "=r" (psp) : :
297 297
   );

+ 3
- 0
Marlin/src/core/macros.h View File

@@ -110,6 +110,9 @@
110 110
 #define STRINGIFY_(M) #M
111 111
 #define STRINGIFY(M) STRINGIFY_(M)
112 112
 
113
+#define A(CODE) " " CODE "\n\t"
114
+#define L(CODE) CODE ":\n\t"
115
+
113 116
 // Macros for bit masks
114 117
 #undef _BV
115 118
 #define _BV(b) (1 << (b))

+ 1
- 1
Marlin/src/libs/softspi.h View File

@@ -639,7 +639,7 @@ class DigitalPin {
639 639
 
640 640
 //------------------------------------------------------------------------------
641 641
 /** Nop for timing. */
642
-#define nop asm volatile ("nop\n\t")
642
+#define nop __asm__ volatile ("nop")
643 643
 //------------------------------------------------------------------------------
644 644
 /** Pin Mode for MISO is input.*/
645 645
 const bool MISO_MODE  = false;

+ 232
- 232
Marlin/src/module/planner.cpp View File

@@ -409,7 +409,7 @@ void Planner::init() {
409 409
         // %8:%7:%6 = interval
410 410
         // r31:r30: MUST be those registers, and they must point to the inv_tab
411 411
 
412
-        " clr %13" "\n\t"                 // %13 = 0
412
+        A("clr %13")                       // %13 = 0
413 413
 
414 414
         // Now we must compute
415 415
         // result = 0xFFFFFF / d
@@ -421,122 +421,122 @@ void Planner::init() {
421 421
         // use Newton-Raphson for the calculation, and will strive to get way less cycles
422 422
         // for the same result - Using C division, it takes 500cycles to complete .
423 423
 
424
-        " clr %3" "\n\t"                  // idx = 0
425
-        " mov %14,%6" "\n\t"
426
-        " mov %15,%7" "\n\t"
427
-        " mov %16,%8" "\n\t"              // nr = interval
428
-        " tst %16" "\n\t"                 // nr & 0xFF0000 == 0 ?
429
-        " brne 2f" "\n\t"                 // No, skip this
430
-        " mov %16,%15" "\n\t"
431
-        " mov %15,%14" "\n\t"             // nr <<= 8, %14 not needed
432
-        " subi %3,-8" "\n\t"              // idx += 8
433
-        " tst %16" "\n\t"                 // nr & 0xFF0000 == 0 ?
434
-        " brne 2f" "\n\t"                 // No, skip this
435
-        " mov %16,%15" "\n\t"             // nr <<= 8, %14 not needed
436
-        " clr %15" "\n\t"                 // We clear %14
437
-        " subi %3,-8" "\n\t"              // idx += 8
424
+        A("clr %3")                        // idx = 0
425
+        A("mov %14,%6")      
426
+        A("mov %15,%7")      
427
+        A("mov %16,%8")                    // nr = interval
428
+        A("tst %16")                       // nr & 0xFF0000 == 0 ?
429
+        A("brne 2f")                       // No, skip this
430
+        A("mov %16,%15")      
431
+        A("mov %15,%14")                   // nr <<= 8, %14 not needed
432
+        A("subi %3,-8")                    // idx += 8
433
+        A("tst %16")                       // nr & 0xFF0000 == 0 ?
434
+        A("brne 2f")                       // No, skip this
435
+        A("mov %16,%15")                   // nr <<= 8, %14 not needed
436
+        A("clr %15")                       // We clear %14
437
+        A("subi %3,-8")                    // idx += 8
438 438
 
439 439
         // here %16 != 0 and %16:%15 contains at least 9 MSBits, or both %16:%15 are 0
440
-        "2:" "\n\t"
441
-        " cpi %16,0x10" "\n\t"            // (nr & 0xf00000) == 0 ?
442
-        " brcc 3f" "\n\t"                 // No, skip this
443
-        " swap %15" "\n\t"                // Swap nibbles
444
-        " swap %16" "\n\t"                // Swap nibbles. Low nibble is 0
445
-        " mov %14, %15" "\n\t"
446
-        " andi %14,0x0f" "\n\t"           // Isolate low nibble
447
-        " andi %15,0xf0" "\n\t"           // Keep proper nibble in %15
448
-        " or %16, %14" "\n\t"             // %16:%15 <<= 4
449
-        " subi %3,-4" "\n\t"              // idx += 4
450
-
451
-        "3:" "\n\t"
452
-        " cpi %16,0x40" "\n\t"            // (nr & 0xc00000) == 0 ?
453
-        " brcc 4f" "\n\t"                 // No, skip this
454
-        " add %15,%15" "\n\t"
455
-        " adc %16,%16" "\n\t"
456
-        " add %15,%15" "\n\t"
457
-        " adc %16,%16" "\n\t"             // %16:%15 <<= 2
458
-        " subi %3,-2" "\n\t"              // idx += 2
459
-
460
-        "4:" "\n\t"
461
-        " cpi %16,0x80" "\n\t"            // (nr & 0x800000) == 0 ?
462
-        " brcc 5f" "\n\t"                 // No, skip this
463
-        " add %15,%15" "\n\t"
464
-        " adc %16,%16" "\n\t"             // %16:%15 <<= 1
465
-        " inc %3" "\n\t"                  // idx += 1
440
+        L("2")
441
+        A("cpi %16,0x10")                  // (nr & 0xF00000) == 0 ?
442
+        A("brcc 3f")                       // No, skip this
443
+        A("swap %15")                      // Swap nibbles
444
+        A("swap %16")                      // Swap nibbles. Low nibble is 0
445
+        A("mov %14, %15")      
446
+        A("andi %14,0x0F")                 // Isolate low nibble
447
+        A("andi %15,0xF0")                 // Keep proper nibble in %15
448
+        A("or %16, %14")                   // %16:%15 <<= 4
449
+        A("subi %3,-4")                    // idx += 4
450
+
451
+        L("3")
452
+        A("cpi %16,0x40")                  // (nr & 0xC00000) == 0 ?
453
+        A("brcc 4f")                       // No, skip this
454
+        A("add %15,%15")      
455
+        A("adc %16,%16")      
456
+        A("add %15,%15")      
457
+        A("adc %16,%16")                   // %16:%15 <<= 2
458
+        A("subi %3,-2")                    // idx += 2
459
+
460
+        L("4")
461
+        A("cpi %16,0x80")                  // (nr & 0x800000) == 0 ?
462
+        A("brcc 5f")                       // No, skip this
463
+        A("add %15,%15")      
464
+        A("adc %16,%16")                   // %16:%15 <<= 1
465
+        A("inc %3")                        // idx += 1
466 466
 
467 467
         // Now %16:%15 contains its MSBit set to 1, or %16:%15 is == 0. We are now absolutely sure
468 468
         // we have at least 9 MSBits available to enter the initial estimation table
469
-        "5:" "\n\t"
470
-        " add %15,%15" "\n\t"
471
-        " adc %16,%16" "\n\t"             // %16:%15 = tidx = (nr <<= 1), we lose the top MSBit (always set to 1, %16 is the index into the inverse table)
472
-        " add r30,%16" "\n\t"             // Only use top 8 bits
473
-        " adc r31,%13" "\n\t"             // r31:r30 = inv_tab + (tidx)
474
-        " lpm %14, Z" "\n\t"              // %14 = inv_tab[tidx]
475
-        " ldi %15, 1" "\n\t"              // %15 = 1  %15:%14 = inv_tab[tidx] + 256
469
+        L("5")
470
+        A("add %15,%15")      
471
+        A("adc %16,%16")                   // %16:%15 = tidx = (nr <<= 1), we lose the top MSBit (always set to 1, %16 is the index into the inverse table)
472
+        A("add r30,%16")                   // Only use top 8 bits
473
+        A("adc r31,%13")                   // r31:r30 = inv_tab + (tidx)
474
+        A("lpm %14, Z")                    // %14 = inv_tab[tidx]
475
+        A("ldi %15, 1")                    // %15 = 1  %15:%14 = inv_tab[tidx] + 256
476 476
 
477 477
         // We must scale the approximation to the proper place
478
-        " clr %16" "\n\t"                 // %16 will always be 0 here
479
-        " subi %3,8" "\n\t"               // idx == 8 ?
480
-        " breq 6f" "\n\t"                 // yes, no need to scale
481
-        " brcs 7f" "\n\t"                 // If C=1, means idx < 8, result was negative!
478
+        A("clr %16")                       // %16 will always be 0 here
479
+        A("subi %3,8")                     // idx == 8 ?
480
+        A("breq 6f")                       // yes, no need to scale
481
+        A("brcs 7f")                       // If C=1, means idx < 8, result was negative!
482 482
 
483 483
         // idx > 8, now %3 = idx - 8. We must perform a left shift. idx range:[1-8]
484
-        " sbrs %3,0" "\n\t"               // shift by 1bit position?
485
-        " rjmp 8f" "\n\t"                 // No
486
-        " add %14,%14" "\n\t"
487
-        " adc %15,%15" "\n\t"             // %15:16 <<= 1
488
-        "8:" "\n\t"
489
-        " sbrs %3,1" "\n\t"               // shift by 2bit position?
490
-        " rjmp 9f" "\n\t"                 // No
491
-        " add %14,%14" "\n\t"
492
-        " adc %15,%15" "\n\t"
493
-        " add %14,%14" "\n\t"
494
-        " adc %15,%15" "\n\t"             // %15:16 <<= 1
495
-        "9:" "\n\t"
496
-        " sbrs %3,2" "\n\t"               // shift by 4bits position?
497
-        " rjmp 16f" "\n\t"                // No
498
-        " swap %15" "\n\t"                // Swap nibbles. lo nibble of %15 will always be 0
499
-        " swap %14" "\n\t"                // Swap nibbles
500
-        " mov %12,%14" "\n\t"
501
-        " andi %12,0x0f" "\n\t"           // isolate low nibble
502
-        " andi %14,0xf0" "\n\t"           // and clear it
503
-        " or %15,%12" "\n\t"              // %15:%16 <<= 4
504
-        "16:" "\n\t"
505
-        " sbrs %3,3" "\n\t"               // shift by 8bits position?
506
-        " rjmp 6f" "\n\t"                 // No, we are done
507
-        " mov %16,%15" "\n\t"
508
-        " mov %15,%14" "\n\t"
509
-        " clr %14" "\n\t"
510
-        " jmp 6f" "\n\t"
484
+        A("sbrs %3,0")                     // shift by 1bit position?
485
+        A("rjmp 8f")                       // No
486
+        A("add %14,%14")      
487
+        A("adc %15,%15")                   // %15:16 <<= 1
488
+        L("8")
489
+        A("sbrs %3,1")                     // shift by 2bit position?
490
+        A("rjmp 9f")                       // No
491
+        A("add %14,%14")      
492
+        A("adc %15,%15")      
493
+        A("add %14,%14")      
494
+        A("adc %15,%15")                   // %15:16 <<= 1
495
+        L("9")
496
+        A("sbrs %3,2")                     // shift by 4bits position?
497
+        A("rjmp 16f")                      // No
498
+        A("swap %15")                      // Swap nibbles. lo nibble of %15 will always be 0
499
+        A("swap %14")                      // Swap nibbles
500
+        A("mov %12,%14")      
501
+        A("andi %12,0x0F")                 // isolate low nibble
502
+        A("andi %14,0xF0")                 // and clear it
503
+        A("or %15,%12")                    // %15:%16 <<= 4
504
+        L("16")
505
+        A("sbrs %3,3")                     // shift by 8bits position?
506
+        A("rjmp 6f")                       // No, we are done
507
+        A("mov %16,%15")      
508
+        A("mov %15,%14")      
509
+        A("clr %14")      
510
+        A("jmp 6f")      
511 511
 
512 512
         // idx < 8, now %3 = idx - 8. Get the count of bits
513
-        "7:" "\n\t"
514
-        " neg %3" "\n\t"                  // %3 = -idx = count of bits to move right. idx range:[1...8]
515
-        " sbrs %3,0" "\n\t"               // shift by 1 bit position ?
516
-        " rjmp 10f" "\n\t"                // No, skip it
517
-        " asr %15" "\n\t"                 // (bit7 is always 0 here)
518
-        " ror %14" "\n\t"
519
-        "10:" "\n\t"
520
-        " sbrs %3,1" "\n\t"               // shift by 2 bit position ?
521
-        " rjmp 11f" "\n\t"                // No, skip it
522
-        " asr %15" "\n\t"                 // (bit7 is always 0 here)
523
-        " ror %14" "\n\t"
524
-        " asr %15" "\n\t"                 // (bit7 is always 0 here)
525
-        " ror %14" "\n\t"
526
-        "11:" "\n\t"
527
-        " sbrs %3,2" "\n\t"               // shift by 4 bit position ?
528
-        " rjmp 12f" "\n\t"                // No, skip it
529
-        " swap %15" "\n\t"                // Swap nibbles
530
-        " andi %14, 0xf0" "\n\t"          // Lose the lowest nibble
531
-        " swap %14" "\n\t"                // Swap nibbles. Upper nibble is 0
532
-        " or %14,%15" "\n\t"              // Pass nibble from upper byte
533
-        " andi %15, 0x0f" "\n\t"          // And get rid of that nibble
534
-        "12:" "\n\t"
535
-        " sbrs %3,3" "\n\t"               // shift by 8 bit position ?
536
-        " rjmp 6f" "\n\t"                 // No, skip it
537
-        " mov %14,%15" "\n\t"
538
-        " clr %15" "\n\t"
539
-        "6:" "\n\t"                       // %16:%15:%14 = initial estimation of 0x1000000 / d
513
+        L("7")
514
+        A("neg %3")                        // %3 = -idx = count of bits to move right. idx range:[1...8]
515
+        A("sbrs %3,0")                     // shift by 1 bit position ?
516
+        A("rjmp 10f")                      // No, skip it
517
+        A("asr %15")                       // (bit7 is always 0 here)
518
+        A("ror %14")      
519
+        L("10")
520
+        A("sbrs %3,1")                     // shift by 2 bit position ?
521
+        A("rjmp 11f")                      // No, skip it
522
+        A("asr %15")                       // (bit7 is always 0 here)
523
+        A("ror %14")      
524
+        A("asr %15")                       // (bit7 is always 0 here)
525
+        A("ror %14")      
526
+        L("11")
527
+        A("sbrs %3,2")                     // shift by 4 bit position ?
528
+        A("rjmp 12f")                      // No, skip it
529
+        A("swap %15")                      // Swap nibbles
530
+        A("andi %14, 0xF0")                // Lose the lowest nibble
531
+        A("swap %14")                      // Swap nibbles. Upper nibble is 0
532
+        A("or %14,%15")                    // Pass nibble from upper byte
533
+        A("andi %15, 0x0F")                // And get rid of that nibble
534
+        L("12")
535
+        A("sbrs %3,3")                     // shift by 8 bit position ?
536
+        A("rjmp 6f")                       // No, skip it
537
+        A("mov %14,%15")      
538
+        A("clr %15")      
539
+        L("6")                       // %16:%15:%14 = initial estimation of 0x1000000 / d
540 540
 
541 541
         // Now, we must refine the estimation present on %16:%15:%14 using 1 iteration
542 542
         // of Newton-Raphson. As it has a quadratic convergence, 1 iteration is enough
@@ -549,36 +549,36 @@ void Planner::init() {
549 549
         // %3:%2:%1:%0 = working accumulator
550 550
 
551 551
         // Compute 1<<25 - x*d. Result should never exceed 25 bits and should always be positive
552
-        " clr %0" "\n\t"
553
-        " clr %1" "\n\t"
554
-        " clr %2" "\n\t"
555
-        " ldi %3,2" "\n\t"                // %3:%2:%1:%0 = 0x2000000
556
-        " mul %6,%14" "\n\t"              // r1:r0 = LO(d) * LO(x)
557
-        " sub %0,r0" "\n\t"
558
-        " sbc %1,r1" "\n\t"
559
-        " sbc %2,%13" "\n\t"
560
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= LO(d) * LO(x)
561
-        " mul %7,%14" "\n\t"              // r1:r0 = MI(d) * LO(x)
562
-        " sub %1,r0" "\n\t"
563
-        " sbc %2,r1"  "\n\t"
564
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= MI(d) * LO(x) << 8
565
-        " mul %8,%14" "\n\t"              // r1:r0 = HI(d) * LO(x)
566
-        " sub %2,r0" "\n\t"
567
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16
568
-        " mul %6,%15" "\n\t"              // r1:r0 = LO(d) * MI(x)
569
-        " sub %1,r0" "\n\t"
570
-        " sbc %2,r1" "\n\t"
571
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= LO(d) * MI(x) << 8
572
-        " mul %7,%15" "\n\t"              // r1:r0 = MI(d) * MI(x)
573
-        " sub %2,r0" "\n\t"
574
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= MI(d) * MI(x) << 16
575
-        " mul %8,%15" "\n\t"              // r1:r0 = HI(d) * MI(x)
576
-        " sub %3,r0" "\n\t"               // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24
577
-        " mul %6,%16" "\n\t"              // r1:r0 = LO(d) * HI(x)
578
-        " sub %2,r0" "\n\t"
579
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= LO(d) * HI(x) << 16
580
-        " mul %7,%16" "\n\t"              // r1:r0 = MI(d) * HI(x)
581
-        " sub %3,r0" "\n\t"               // %3:%2:%1:%0 -= MI(d) * HI(x) << 24
552
+        A("clr %0")      
553
+        A("clr %1")      
554
+        A("clr %2")      
555
+        A("ldi %3,2")                      // %3:%2:%1:%0 = 0x2000000
556
+        A("mul %6,%14")                    // r1:r0 = LO(d) * LO(x)
557
+        A("sub %0,r0")      
558
+        A("sbc %1,r1")      
559
+        A("sbc %2,%13")      
560
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= LO(d) * LO(x)
561
+        A("mul %7,%14")                    // r1:r0 = MI(d) * LO(x)
562
+        A("sub %1,r0")      
563
+        A("sbc %2,r1" )      
564
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= MI(d) * LO(x) << 8
565
+        A("mul %8,%14")                    // r1:r0 = HI(d) * LO(x)
566
+        A("sub %2,r0")      
567
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16
568
+        A("mul %6,%15")                    // r1:r0 = LO(d) * MI(x)
569
+        A("sub %1,r0")      
570
+        A("sbc %2,r1")      
571
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= LO(d) * MI(x) << 8
572
+        A("mul %7,%15")                    // r1:r0 = MI(d) * MI(x)
573
+        A("sub %2,r0")      
574
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= MI(d) * MI(x) << 16
575
+        A("mul %8,%15")                    // r1:r0 = HI(d) * MI(x)
576
+        A("sub %3,r0")                     // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24
577
+        A("mul %6,%16")                    // r1:r0 = LO(d) * HI(x)
578
+        A("sub %2,r0")      
579
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= LO(d) * HI(x) << 16
580
+        A("mul %7,%16")                    // r1:r0 = MI(d) * HI(x)
581
+        A("sub %3,r0")                     // %3:%2:%1:%0 -= MI(d) * HI(x) << 24
582 582
         // %3:%2:%1:%0 = (1<<25) - x*d     [169]
583 583
 
584 584
         // We need to multiply that result by x, and we are only interested in the top 24bits of that multiply
@@ -588,62 +588,62 @@ void Planner::init() {
588 588
         // %13 = 0
589 589
 
590 590
         // result = %11:%10:%9:%5:%4
591
-        " mul %14,%0" "\n\t"              // r1:r0 = LO(x) * LO(acc)
592
-        " mov %4,r1" "\n\t"
593
-        " clr %5" "\n\t"
594
-        " clr %9" "\n\t"
595
-        " clr %10" "\n\t"
596
-        " clr %11" "\n\t"                 // %11:%10:%9:%5:%4 = LO(x) * LO(acc) >> 8
597
-        " mul %15,%0" "\n\t"              // r1:r0 = MI(x) * LO(acc)
598
-        " add %4,r0" "\n\t"
599
-        " adc %5,r1" "\n\t"
600
-        " adc %9,%13" "\n\t"
601
-        " adc %10,%13" "\n\t"
602
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 += MI(x) * LO(acc)
603
-        " mul %16,%0" "\n\t"              // r1:r0 = HI(x) * LO(acc)
604
-        " add %5,r0" "\n\t"
605
-        " adc %9,r1" "\n\t"
606
-        " adc %10,%13" "\n\t"
607
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 += MI(x) * LO(acc) << 8
608
-
609
-        " mul %14,%1" "\n\t"              // r1:r0 = LO(x) * MIL(acc)
610
-        " add %4,r0" "\n\t"
611
-        " adc %5,r1" "\n\t"
612
-        " adc %9,%13" "\n\t"
613
-        " adc %10,%13" "\n\t"
614
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 = LO(x) * MIL(acc)
615
-        " mul %15,%1" "\n\t"              // r1:r0 = MI(x) * MIL(acc)
616
-        " add %5,r0" "\n\t"
617
-        " adc %9,r1" "\n\t"
618
-        " adc %10,%13" "\n\t"
619
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 8
620
-        " mul %16,%1" "\n\t"              // r1:r0 = HI(x) * MIL(acc)
621
-        " add %9,r0" "\n\t"
622
-        " adc %10,r1" "\n\t"
623
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 16
624
-
625
-        " mul %14,%2" "\n\t"              // r1:r0 = LO(x) * MIH(acc)
626
-        " add %5,r0" "\n\t"
627
-        " adc %9,r1" "\n\t"
628
-        " adc %10,%13" "\n\t"
629
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 = LO(x) * MIH(acc) << 8
630
-        " mul %15,%2" "\n\t"              // r1:r0 = MI(x) * MIH(acc)
631
-        " add %9,r0" "\n\t"
632
-        " adc %10,r1" "\n\t"
633
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 16
634
-        " mul %16,%2" "\n\t"              // r1:r0 = HI(x) * MIH(acc)
635
-        " add %10,r0" "\n\t"
636
-        " adc %11,r1" "\n\t"              // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 24
637
-
638
-        " mul %14,%3" "\n\t"              // r1:r0 = LO(x) * HI(acc)
639
-        " add %9,r0" "\n\t"
640
-        " adc %10,r1" "\n\t"
641
-        " adc %11,%13" "\n\t"             // %11:%10:%9:%5:%4 = LO(x) * HI(acc) << 16
642
-        " mul %15,%3" "\n\t"              // r1:r0 = MI(x) * HI(acc)
643
-        " add %10,r0" "\n\t"
644
-        " adc %11,r1" "\n\t"              // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 24
645
-        " mul %16,%3" "\n\t"              // r1:r0 = HI(x) * HI(acc)
646
-        " add %11,r0" "\n\t"              // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 32
591
+        A("mul %14,%0")                    // r1:r0 = LO(x) * LO(acc)
592
+        A("mov %4,r1")      
593
+        A("clr %5")      
594
+        A("clr %9")      
595
+        A("clr %10")      
596
+        A("clr %11")                       // %11:%10:%9:%5:%4 = LO(x) * LO(acc) >> 8
597
+        A("mul %15,%0")                    // r1:r0 = MI(x) * LO(acc)
598
+        A("add %4,r0")      
599
+        A("adc %5,r1")      
600
+        A("adc %9,%13")      
601
+        A("adc %10,%13")      
602
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 += MI(x) * LO(acc)
603
+        A("mul %16,%0")                    // r1:r0 = HI(x) * LO(acc)
604
+        A("add %5,r0")      
605
+        A("adc %9,r1")      
606
+        A("adc %10,%13")      
607
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 += MI(x) * LO(acc) << 8
608
+
609
+        A("mul %14,%1")                    // r1:r0 = LO(x) * MIL(acc)
610
+        A("add %4,r0")      
611
+        A("adc %5,r1")      
612
+        A("adc %9,%13")      
613
+        A("adc %10,%13")      
614
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 = LO(x) * MIL(acc)
615
+        A("mul %15,%1")                    // r1:r0 = MI(x) * MIL(acc)
616
+        A("add %5,r0")      
617
+        A("adc %9,r1")      
618
+        A("adc %10,%13")      
619
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 8
620
+        A("mul %16,%1")                    // r1:r0 = HI(x) * MIL(acc)
621
+        A("add %9,r0")      
622
+        A("adc %10,r1")      
623
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 16
624
+
625
+        A("mul %14,%2")                    // r1:r0 = LO(x) * MIH(acc)
626
+        A("add %5,r0")      
627
+        A("adc %9,r1")      
628
+        A("adc %10,%13")      
629
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 = LO(x) * MIH(acc) << 8
630
+        A("mul %15,%2")                    // r1:r0 = MI(x) * MIH(acc)
631
+        A("add %9,r0")      
632
+        A("adc %10,r1")      
633
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 16
634
+        A("mul %16,%2")                    // r1:r0 = HI(x) * MIH(acc)
635
+        A("add %10,r0")      
636
+        A("adc %11,r1")                    // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 24
637
+
638
+        A("mul %14,%3")                    // r1:r0 = LO(x) * HI(acc)
639
+        A("add %9,r0")      
640
+        A("adc %10,r1")      
641
+        A("adc %11,%13")                   // %11:%10:%9:%5:%4 = LO(x) * HI(acc) << 16
642
+        A("mul %15,%3")                    // r1:r0 = MI(x) * HI(acc)
643
+        A("add %10,r0")      
644
+        A("adc %11,r1")                    // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 24
645
+        A("mul %16,%3")                    // r1:r0 = HI(x) * HI(acc)
646
+        A("add %11,r0")                    // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 32
647 647
 
648 648
         // At this point, %11:%10:%9 contains the new estimation of x.
649 649
 
@@ -651,54 +651,54 @@ void Planner::init() {
651 651
         // (1<<24) - x*d
652 652
         // %11:%10:%9 = x
653 653
         // %8:%7:%6 = d = interval" "\n\t"
654
-        " ldi %3,1" "\n\t"
655
-        " clr %2" "\n\t"
656
-        " clr %1" "\n\t"
657
-        " clr %0" "\n\t"                  // %3:%2:%1:%0 = 0x1000000
658
-        " mul %6,%9" "\n\t"               // r1:r0 = LO(d) * LO(x)
659
-        " sub %0,r0" "\n\t"
660
-        " sbc %1,r1" "\n\t"
661
-        " sbc %2,%13" "\n\t"
662
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= LO(d) * LO(x)
663
-        " mul %7,%9" "\n\t"               // r1:r0 = MI(d) * LO(x)
664
-        " sub %1,r0" "\n\t"
665
-        " sbc %2,r1" "\n\t"
666
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= MI(d) * LO(x) << 8
667
-        " mul %8,%9" "\n\t"               // r1:r0 = HI(d) * LO(x)
668
-        " sub %2,r0" "\n\t"
669
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16
670
-        " mul %6,%10" "\n\t"              // r1:r0 = LO(d) * MI(x)
671
-        " sub %1,r0" "\n\t"
672
-        " sbc %2,r1" "\n\t"
673
-        " sbc %3,%13" "\n\t"              // %3:%2:%1:%0 -= LO(d) * MI(x) << 8
674
-        " mul %7,%10" "\n\t"              // r1:r0 = MI(d) * MI(x)
675
-        " sub %2,r0" "\n\t"
676
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= MI(d) * MI(x) << 16
677
-        " mul %8,%10" "\n\t"              // r1:r0 = HI(d) * MI(x)
678
-        " sub %3,r0" "\n\t"               // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24
679
-        " mul %6,%11" "\n\t"              // r1:r0 = LO(d) * HI(x)
680
-        " sub %2,r0" "\n\t"
681
-        " sbc %3,r1" "\n\t"               // %3:%2:%1:%0 -= LO(d) * HI(x) << 16
682
-        " mul %7,%11" "\n\t"              // r1:r0 = MI(d) * HI(x)
683
-        " sub %3,r0" "\n\t"               // %3:%2:%1:%0 -= MI(d) * HI(x) << 24
654
+        A("ldi %3,1")      
655
+        A("clr %2")      
656
+        A("clr %1")      
657
+        A("clr %0")                        // %3:%2:%1:%0 = 0x1000000
658
+        A("mul %6,%9")                     // r1:r0 = LO(d) * LO(x)
659
+        A("sub %0,r0")      
660
+        A("sbc %1,r1")      
661
+        A("sbc %2,%13")      
662
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= LO(d) * LO(x)
663
+        A("mul %7,%9")                     // r1:r0 = MI(d) * LO(x)
664
+        A("sub %1,r0")      
665
+        A("sbc %2,r1")      
666
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= MI(d) * LO(x) << 8
667
+        A("mul %8,%9")                     // r1:r0 = HI(d) * LO(x)
668
+        A("sub %2,r0")      
669
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16
670
+        A("mul %6,%10")                    // r1:r0 = LO(d) * MI(x)
671
+        A("sub %1,r0")      
672
+        A("sbc %2,r1")      
673
+        A("sbc %3,%13")                    // %3:%2:%1:%0 -= LO(d) * MI(x) << 8
674
+        A("mul %7,%10")                    // r1:r0 = MI(d) * MI(x)
675
+        A("sub %2,r0")      
676
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= MI(d) * MI(x) << 16
677
+        A("mul %8,%10")                    // r1:r0 = HI(d) * MI(x)
678
+        A("sub %3,r0")                     // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24
679
+        A("mul %6,%11")                    // r1:r0 = LO(d) * HI(x)
680
+        A("sub %2,r0")      
681
+        A("sbc %3,r1")                     // %3:%2:%1:%0 -= LO(d) * HI(x) << 16
682
+        A("mul %7,%11")                    // r1:r0 = MI(d) * HI(x)
683
+        A("sub %3,r0")                     // %3:%2:%1:%0 -= MI(d) * HI(x) << 24
684 684
         // %3:%2:%1:%0 = r = (1<<24) - x*d
685 685
         // %8:%7:%6 = d = interval
686 686
 
687 687
         // Perform the final correction
688
-        " sub %0,%6" "\n\t"
689
-        " sbc %1,%7" "\n\t"
690
-        " sbc %2,%8" "\n\t"               // r -= d
691
-        " brcs 14f" "\n\t"                // if ( r >= d)
688
+        A("sub %0,%6")      
689
+        A("sbc %1,%7")      
690
+        A("sbc %2,%8")                     // r -= d
691
+        A("brcs 14f")                      // if ( r >= d)
692 692
 
693 693
         // %11:%10:%9 = x
694
-        " ldi %3,1" "\n\t"
695
-        " add %9,%3" "\n\t"
696
-        " adc %10,%13" "\n\t"
697
-        " adc %11,%13" "\n\t"             // x++
698
-        "14:" "\n\t"
694
+        A("ldi %3,1")      
695
+        A("add %9,%3")      
696
+        A("adc %10,%13")      
697
+        A("adc %11,%13")                   // x++
698
+        L("14")
699 699
 
700 700
         // Estimation is done. %11:%10:%9 = x
701
-        " clr __zero_reg__" "\n\t"        // Make C runtime happy
701
+        A("clr __zero_reg__")              // Make C runtime happy
702 702
         // [211 cycles total]
703 703
         : "=r" (r2),
704 704
           "=r" (r3),

+ 377
- 377
Marlin/src/module/stepper.cpp View File

@@ -581,68 +581,68 @@ void Stepper::set_directions() {
581 581
         /*  %10 (must be high register!)*/
582 582
 
583 583
         /* Store initial velocity*/
584
-        " sts bezier_F, %0" "\n\t"
585
-        " sts bezier_F+1, %1" "\n\t"
586
-        " sts bezier_F+2, %10" "\n\t"    /* bezier_F = %10:%1:%0 = v0 */
584
+        A("sts bezier_F, %0")
585
+        A("sts bezier_F+1, %1")
586
+        A("sts bezier_F+2, %10")    /* bezier_F = %10:%1:%0 = v0 */
587 587
 
588 588
         /* Get delta speed */
589
-        " ldi %2,-1" "\n\t"              /* %2 = 0xff, means A_negative = true */
590
-        " clr %8" "\n\t"                 /* %8 = 0 */
591
-        " sub %0,%3" "\n\t"
592
-        " sbc %1,%4" "\n\t"
593
-        " sbc %10,%5" "\n\t"             /*  v0 -= v1, C=1 if result is negative */
594
-        " brcc 1f" "\n\t"                /* branch if result is positive (C=0), that means v0 >= v1 */
589
+        A("ldi %2,-1")              /* %2 = 0xFF, means A_negative = true */
590
+        A("clr %8")                 /* %8 = 0 */
591
+        A("sub %0,%3")
592
+        A("sbc %1,%4")
593
+        A("sbc %10,%5")             /*  v0 -= v1, C=1 if result is negative */
594
+        A("brcc 1f")                /* branch if result is positive (C=0), that means v0 >= v1 */
595 595
 
596 596
         /*  Result was negative, get the absolute value*/
597
-        " com %10" "\n\t"
598
-        " com %1" "\n\t"
599
-        " neg %0" "\n\t"
600
-        " sbc %1,%2" "\n\t"
601
-        " sbc %10,%2" "\n\t"             /* %10:%1:%0 +1  -> %10:%1:%0 = -(v0 - v1) = (v1 - v0) */
602
-        " clr %2" "\n\t"                 /* %2 = 0, means A_negative = false */
597
+        A("com %10")
598
+        A("com %1")
599
+        A("neg %0")
600
+        A("sbc %1,%2")
601
+        A("sbc %10,%2")             /* %10:%1:%0 +1  -> %10:%1:%0 = -(v0 - v1) = (v1 - v0) */
602
+        A("clr %2")                 /* %2 = 0, means A_negative = false */
603 603
 
604 604
         /*  Store negative flag*/
605
-        "1:" "\n\t"
606
-        " sts A_negative, %2" "\n\t"     /* Store negative flag */
605
+        L("1")
606
+        A("sts A_negative, %2")     /* Store negative flag */
607 607
 
608 608
         /*  Compute coefficients A,B and C   [20 cycles worst case]*/
609
-        " ldi %9,6" "\n\t"               /* %9 = 6 */
610
-        " mul %0,%9" "\n\t"              /* r1:r0 = 6*LO(v0-v1) */
611
-        " sts bezier_A, r0" "\n\t"
612
-        " mov %6,r1" "\n\t"
613
-        " clr %7" "\n\t"                 /* %7:%6:r0 = 6*LO(v0-v1) */
614
-        " mul %1,%9" "\n\t"              /* r1:r0 = 6*MI(v0-v1) */
615
-        " add %6,r0" "\n\t"
616
-        " adc %7,r1" "\n\t"              /* %7:%6:?? += 6*MI(v0-v1) << 8 */
617
-        " mul %10,%9" "\n\t"             /* r1:r0 = 6*HI(v0-v1) */
618
-        " add %7,r0" "\n\t"              /* %7:%6:?? += 6*HI(v0-v1) << 16 */
619
-        " sts bezier_A+1, %6" "\n\t"
620
-        " sts bezier_A+2, %7" "\n\t"     /* bezier_A = %7:%6:?? = 6*(v0-v1) [35 cycles worst] */
621
-
622
-        " ldi %9,15" "\n\t"              /* %9 = 15 */
623
-        " mul %0,%9" "\n\t"              /* r1:r0 = 5*LO(v0-v1) */
624
-        " sts bezier_B, r0" "\n\t"
625
-        " mov %6,r1" "\n\t"
626
-        " clr %7" "\n\t"                 /* %7:%6:?? = 5*LO(v0-v1) */
627
-        " mul %1,%9" "\n\t"              /* r1:r0 = 5*MI(v0-v1) */
628
-        " add %6,r0" "\n\t"
629
-        " adc %7,r1" "\n\t"              /* %7:%6:?? += 5*MI(v0-v1) << 8 */
630
-        " mul %10,%9" "\n\t"             /* r1:r0 = 5*HI(v0-v1) */
631
-        " add %7,r0" "\n\t"              /* %7:%6:?? += 5*HI(v0-v1) << 16 */
632
-        " sts bezier_B+1, %6" "\n\t"
633
-        " sts bezier_B+2, %7" "\n\t"     /* bezier_B = %7:%6:?? = 5*(v0-v1) [50 cycles worst] */
634
-
635
-        " ldi %9,10" "\n\t"              /* %9 = 10 */
636
-        " mul %0,%9" "\n\t"              /* r1:r0 = 10*LO(v0-v1) */
637
-        " sts bezier_C, r0" "\n\t"
638
-        " mov %6,r1" "\n\t"
639
-        " clr %7" "\n\t"                 /* %7:%6:?? = 10*LO(v0-v1) */
640
-        " mul %1,%9" "\n\t"              /* r1:r0 = 10*MI(v0-v1) */
641
-        " add %6,r0" "\n\t"
642
-        " adc %7,r1" "\n\t"              /* %7:%6:?? += 10*MI(v0-v1) << 8 */
643
-        " mul %10,%9" "\n\t"             /* r1:r0 = 10*HI(v0-v1) */
644
-        " add %7,r0" "\n\t"              /* %7:%6:?? += 10*HI(v0-v1) << 16 */
645
-        " sts bezier_C+1, %6" "\n\t"
609
+        A("ldi %9,6")               /* %9 = 6 */
610
+        A("mul %0,%9")              /* r1:r0 = 6*LO(v0-v1) */
611
+        A("sts bezier_A, r0")
612
+        A("mov %6,r1")
613
+        A("clr %7")                 /* %7:%6:r0 = 6*LO(v0-v1) */
614
+        A("mul %1,%9")              /* r1:r0 = 6*MI(v0-v1) */
615
+        A("add %6,r0")
616
+        A("adc %7,r1")              /* %7:%6:?? += 6*MI(v0-v1) << 8 */
617
+        A("mul %10,%9")             /* r1:r0 = 6*HI(v0-v1) */
618
+        A("add %7,r0")              /* %7:%6:?? += 6*HI(v0-v1) << 16 */
619
+        A("sts bezier_A+1, %6")
620
+        A("sts bezier_A+2, %7")     /* bezier_A = %7:%6:?? = 6*(v0-v1) [35 cycles worst] */
621
+
622
+        A("ldi %9,15")              /* %9 = 15 */
623
+        A("mul %0,%9")              /* r1:r0 = 5*LO(v0-v1) */
624
+        A("sts bezier_B, r0")
625
+        A("mov %6,r1")
626
+        A("clr %7")                 /* %7:%6:?? = 5*LO(v0-v1) */
627
+        A("mul %1,%9")              /* r1:r0 = 5*MI(v0-v1) */
628
+        A("add %6,r0")
629
+        A("adc %7,r1")              /* %7:%6:?? += 5*MI(v0-v1) << 8 */
630
+        A("mul %10,%9")             /* r1:r0 = 5*HI(v0-v1) */
631
+        A("add %7,r0")              /* %7:%6:?? += 5*HI(v0-v1) << 16 */
632
+        A("sts bezier_B+1, %6")
633
+        A("sts bezier_B+2, %7")     /* bezier_B = %7:%6:?? = 5*(v0-v1) [50 cycles worst] */
634
+
635
+        A("ldi %9,10")              /* %9 = 10 */
636
+        A("mul %0,%9")              /* r1:r0 = 10*LO(v0-v1) */
637
+        A("sts bezier_C, r0")
638
+        A("mov %6,r1")
639
+        A("clr %7")                 /* %7:%6:?? = 10*LO(v0-v1) */
640
+        A("mul %1,%9")              /* r1:r0 = 10*MI(v0-v1) */
641
+        A("add %6,r0")
642
+        A("adc %7,r1")              /* %7:%6:?? += 10*MI(v0-v1) << 8 */
643
+        A("mul %10,%9")             /* r1:r0 = 10*HI(v0-v1) */
644
+        A("add %7,r0")              /* %7:%6:?? += 10*HI(v0-v1) << 16 */
645
+        A("sts bezier_C+1, %6")
646 646
         " sts bezier_C+2, %7"            /* bezier_C = %7:%6:?? = 10*(v0-v1) [65 cycles worst] */
647 647
         : "+r" (r2),
648 648
           "+d" (r3),
@@ -674,358 +674,358 @@ void Stepper::set_directions() {
674 674
 
675 675
       __asm__ __volatile(
676 676
         /* umul24x24to16hi(t, bezier_AV, curr_step);  t: Range 0 - 1^16 = 16 bits*/
677
-        " lds %9,bezier_AV" "\n\t"       /* %9 = LO(AV)*/
678
-        " mul %9,%2" "\n\t"              /* r1:r0 = LO(bezier_AV)*LO(curr_step)*/
679
-        " mov %7,r1" "\n\t"              /* %7 = LO(bezier_AV)*LO(curr_step) >> 8*/
680
-        " clr %8" "\n\t"                 /* %8:%7  = LO(bezier_AV)*LO(curr_step) >> 8*/
681
-        " lds %10,bezier_AV+1" "\n\t"    /* %10 = MI(AV)*/
682
-        " mul %10,%2" "\n\t"             /* r1:r0  = MI(bezier_AV)*LO(curr_step)*/
683
-        " add %7,r0" "\n\t"
684
-        " adc %8,r1" "\n\t"              /* %8:%7 += MI(bezier_AV)*LO(curr_step)*/
685
-        " lds r1,bezier_AV+2" "\n\t"     /* r11 = HI(AV)*/
686
-        " mul r1,%2" "\n\t"              /* r1:r0  = HI(bezier_AV)*LO(curr_step)*/
687
-        " add %8,r0" "\n\t"              /* %8:%7 += HI(bezier_AV)*LO(curr_step) << 8*/
688
-        " mul %9,%3" "\n\t"              /* r1:r0 =  LO(bezier_AV)*MI(curr_step)*/
689
-        " add %7,r0" "\n\t"
690
-        " adc %8,r1" "\n\t"              /* %8:%7 += LO(bezier_AV)*MI(curr_step)*/
691
-        " mul %10,%3" "\n\t"             /* r1:r0 =  MI(bezier_AV)*MI(curr_step)*/
692
-        " add %8,r0" "\n\t"              /* %8:%7 += LO(bezier_AV)*MI(curr_step) << 8*/
693
-        " mul %9,%4" "\n\t"              /* r1:r0 =  LO(bezier_AV)*HI(curr_step)*/
694
-        " add %8,r0" "\n\t"              /* %8:%7 += LO(bezier_AV)*HI(curr_step) << 8*/
677
+        A("lds %9,bezier_AV")       /* %9 = LO(AV)*/
678
+        A("mul %9,%2")              /* r1:r0 = LO(bezier_AV)*LO(curr_step)*/
679
+        A("mov %7,r1")              /* %7 = LO(bezier_AV)*LO(curr_step) >> 8*/
680
+        A("clr %8")                 /* %8:%7  = LO(bezier_AV)*LO(curr_step) >> 8*/
681
+        A("lds %10,bezier_AV+1")    /* %10 = MI(AV)*/
682
+        A("mul %10,%2")             /* r1:r0  = MI(bezier_AV)*LO(curr_step)*/
683
+        A("add %7,r0")
684
+        A("adc %8,r1")              /* %8:%7 += MI(bezier_AV)*LO(curr_step)*/
685
+        A("lds r1,bezier_AV+2")     /* r11 = HI(AV)*/
686
+        A("mul r1,%2")              /* r1:r0  = HI(bezier_AV)*LO(curr_step)*/
687
+        A("add %8,r0")              /* %8:%7 += HI(bezier_AV)*LO(curr_step) << 8*/
688
+        A("mul %9,%3")              /* r1:r0 =  LO(bezier_AV)*MI(curr_step)*/
689
+        A("add %7,r0")
690
+        A("adc %8,r1")              /* %8:%7 += LO(bezier_AV)*MI(curr_step)*/
691
+        A("mul %10,%3")             /* r1:r0 =  MI(bezier_AV)*MI(curr_step)*/
692
+        A("add %8,r0")              /* %8:%7 += LO(bezier_AV)*MI(curr_step) << 8*/
693
+        A("mul %9,%4")              /* r1:r0 =  LO(bezier_AV)*HI(curr_step)*/
694
+        A("add %8,r0")              /* %8:%7 += LO(bezier_AV)*HI(curr_step) << 8*/
695 695
         /* %8:%7 = t*/
696 696
 
697 697
         /* uint16_t f = t;*/
698
-        " mov %5,%7" "\n\t"              /* %6:%5 = f*/
699
-        " mov %6,%8" "\n\t"
698
+        A("mov %5,%7")              /* %6:%5 = f*/
699
+        A("mov %6,%8")
700 700
         /* %6:%5 = f*/
701 701
 
702 702
         /* umul16x16to16hi(f, f, t); / Range 16 bits (unsigned) [17] */
703
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
704
-        " mov %9,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %9, we need it for rounding*/
705
-        " clr %10" "\n\t"                /* %10 = 0*/
706
-        " clr %11" "\n\t"                /* %11 = 0*/
707
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
708
-        " add %9,r0" "\n\t"              /* %9 += LO(LO(f) * HI(t))*/
709
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
710
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
711
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
712
-        " add %9,r0" "\n\t"              /* %9 += LO(HI(f) * LO(t))*/
713
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t)) */
714
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
715
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
716
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
717
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
718
-        " mov %5,%10" "\n\t"             /* %6:%5 = */
719
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
703
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
704
+        A("mov %9,r1")              /* store MIL(LO(f) * LO(t)) in %9, we need it for rounding*/
705
+        A("clr %10")                /* %10 = 0*/
706
+        A("clr %11")                /* %11 = 0*/
707
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
708
+        A("add %9,r0")              /* %9 += LO(LO(f) * HI(t))*/
709
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
710
+        A("adc %11,%0")             /* %11 += carry*/
711
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
712
+        A("add %9,r0")              /* %9 += LO(HI(f) * LO(t))*/
713
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t)) */
714
+        A("adc %11,%0")             /* %11 += carry*/
715
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
716
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
717
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
718
+        A("mov %5,%10")             /* %6:%5 = */
719
+        A("mov %6,%11")             /* f = %10:%11*/
720 720
 
721 721
         /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3  (unsigned) [17]*/
722
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
723
-        " mov %1,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
724
-        " clr %10" "\n\t"                /* %10 = 0*/
725
-        " clr %11" "\n\t"                /* %11 = 0*/
726
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
727
-        " add %1,r0" "\n\t"              /* %1 += LO(LO(f) * HI(t))*/
728
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
729
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
730
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
731
-        " add %1,r0" "\n\t"              /* %1 += LO(HI(f) * LO(t))*/
732
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t))*/
733
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
734
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
735
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
736
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
737
-        " mov %5,%10" "\n\t"             /* %6:%5 =*/
738
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
722
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
723
+        A("mov %1,r1")              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
724
+        A("clr %10")                /* %10 = 0*/
725
+        A("clr %11")                /* %11 = 0*/
726
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
727
+        A("add %1,r0")              /* %1 += LO(LO(f) * HI(t))*/
728
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
729
+        A("adc %11,%0")             /* %11 += carry*/
730
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
731
+        A("add %1,r0")              /* %1 += LO(HI(f) * LO(t))*/
732
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t))*/
733
+        A("adc %11,%0")             /* %11 += carry*/
734
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
735
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
736
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
737
+        A("mov %5,%10")             /* %6:%5 =*/
738
+        A("mov %6,%11")             /* f = %10:%11*/
739 739
         /* [15 +17*2] = [49]*/
740 740
 
741 741
         /* %4:%3:%2 will be acc from now on*/
742 742
 
743 743
         /* uint24_t acc = bezier_F; / Range 20 bits (unsigned)*/
744
-        " clr %9" "\n\t"                 /* "decimal place we get for free"*/
745
-        " lds %2,bezier_F" "\n\t"
746
-        " lds %3,bezier_F+1" "\n\t"
747
-        " lds %4,bezier_F+2" "\n\t"      /* %4:%3:%2 = acc*/
744
+        A("clr %9")                 /* "decimal place we get for free"*/
745
+        A("lds %2,bezier_F")
746
+        A("lds %3,bezier_F+1")
747
+        A("lds %4,bezier_F+2")      /* %4:%3:%2 = acc*/
748 748
 
749 749
         /* if (A_negative) {*/
750
-        " lds r0,A_negative" "\n\t"
751
-        " or r0,%0" "\n\t"               /* Is flag signalling negative? */
752
-        " brne 3f" "\n\t"                /* If yes, Skip next instruction if A was negative*/
753
-        " rjmp 1f" "\n\t"                /* Otherwise, jump */
750
+        A("lds r0,A_negative")
751
+        A("or r0,%0")               /* Is flag signalling negative? */
752
+        A("brne 3f")                /* If yes, Skip next instruction if A was negative*/
753
+        A("rjmp 1f")                /* Otherwise, jump */
754 754
 
755 755
         /* uint24_t v; */
756 756
         /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29] */
757 757
         /* acc -= v; */
758
-        "3:" "\n\t"
759
-        " lds %10, bezier_C" "\n\t"      /* %10 = LO(bezier_C)*/
760
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_C) * LO(f)*/
761
-        " sub %9,r1" "\n\t"
762
-        " sbc %2,%0" "\n\t"
763
-        " sbc %3,%0" "\n\t"
764
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(LO(bezier_C) * LO(f))*/
765
-        " lds %11, bezier_C+1" "\n\t"    /* %11 = MI(bezier_C)*/
766
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_C) * LO(f)*/
767
-        " sub %9,r0" "\n\t"
768
-        " sbc %2,r1" "\n\t"
769
-        " sbc %3,%0" "\n\t"
770
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_C) * LO(f)*/
771
-        " lds %1, bezier_C+2" "\n\t"     /* %1 = HI(bezier_C)*/
772
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_C) * LO(f)*/
773
-        " sub %2,r0" "\n\t"
774
-        " sbc %3,r1" "\n\t"
775
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 8*/
776
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_C) * MI(f)*/
777
-        " sub %9,r0" "\n\t"
778
-        " sbc %2,r1" "\n\t"
779
-        " sbc %3,%0" "\n\t"
780
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= LO(bezier_C) * MI(f)*/
781
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_C) * MI(f)*/
782
-        " sub %2,r0" "\n\t"
783
-        " sbc %3,r1" "\n\t"
784
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_C) * MI(f) << 8*/
785
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_C) * LO(f)*/
786
-        " sub %3,r0" "\n\t"
787
-        " sbc %4,r1" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 16*/
758
+        L("3")
759
+        A("lds %10, bezier_C")      /* %10 = LO(bezier_C)*/
760
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_C) * LO(f)*/
761
+        A("sub %9,r1")
762
+        A("sbc %2,%0")
763
+        A("sbc %3,%0")
764
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(LO(bezier_C) * LO(f))*/
765
+        A("lds %11, bezier_C+1")    /* %11 = MI(bezier_C)*/
766
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_C) * LO(f)*/
767
+        A("sub %9,r0")
768
+        A("sbc %2,r1")
769
+        A("sbc %3,%0")
770
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_C) * LO(f)*/
771
+        A("lds %1, bezier_C+2")     /* %1 = HI(bezier_C)*/
772
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_C) * LO(f)*/
773
+        A("sub %2,r0")
774
+        A("sbc %3,r1")
775
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 8*/
776
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_C) * MI(f)*/
777
+        A("sub %9,r0")
778
+        A("sbc %2,r1")
779
+        A("sbc %3,%0")
780
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= LO(bezier_C) * MI(f)*/
781
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_C) * MI(f)*/
782
+        A("sub %2,r0")
783
+        A("sbc %3,r1")
784
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_C) * MI(f) << 8*/
785
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_C) * LO(f)*/
786
+        A("sub %3,r0")
787
+        A("sbc %4,r1")              /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 16*/
788 788
 
789 789
         /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3  (unsigned) [17]*/
790
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
791
-        " mov %1,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
792
-        " clr %10" "\n\t"                /* %10 = 0*/
793
-        " clr %11" "\n\t"                /* %11 = 0*/
794
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
795
-        " add %1,r0" "\n\t"              /* %1 += LO(LO(f) * HI(t))*/
796
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
797
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
798
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
799
-        " add %1,r0" "\n\t"              /* %1 += LO(HI(f) * LO(t))*/
800
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t))*/
801
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
802
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
803
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
804
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
805
-        " mov %5,%10" "\n\t"             /* %6:%5 =*/
806
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
790
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
791
+        A("mov %1,r1")              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
792
+        A("clr %10")                /* %10 = 0*/
793
+        A("clr %11")                /* %11 = 0*/
794
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
795
+        A("add %1,r0")              /* %1 += LO(LO(f) * HI(t))*/
796
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
797
+        A("adc %11,%0")             /* %11 += carry*/
798
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
799
+        A("add %1,r0")              /* %1 += LO(HI(f) * LO(t))*/
800
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t))*/
801
+        A("adc %11,%0")             /* %11 += carry*/
802
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
803
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
804
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
805
+        A("mov %5,%10")             /* %6:%5 =*/
806
+        A("mov %6,%11")             /* f = %10:%11*/
807 807
 
808 808
         /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/
809 809
         /* acc += v; */
810
-        " lds %10, bezier_B" "\n\t"      /* %10 = LO(bezier_B)*/
811
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_B) * LO(f)*/
812
-        " add %9,r1" "\n\t"
813
-        " adc %2,%0" "\n\t"
814
-        " adc %3,%0" "\n\t"
815
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(LO(bezier_B) * LO(f))*/
816
-        " lds %11, bezier_B+1" "\n\t"    /* %11 = MI(bezier_B)*/
817
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_B) * LO(f)*/
818
-        " add %9,r0" "\n\t"
819
-        " adc %2,r1" "\n\t"
820
-        " adc %3,%0" "\n\t"
821
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_B) * LO(f)*/
822
-        " lds %1, bezier_B+2" "\n\t"     /* %1 = HI(bezier_B)*/
823
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_B) * LO(f)*/
824
-        " add %2,r0" "\n\t"
825
-        " adc %3,r1" "\n\t"
826
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 8*/
827
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_B) * MI(f)*/
828
-        " add %9,r0" "\n\t"
829
-        " adc %2,r1" "\n\t"
830
-        " adc %3,%0" "\n\t"
831
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += LO(bezier_B) * MI(f)*/
832
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_B) * MI(f)*/
833
-        " add %2,r0" "\n\t"
834
-        " adc %3,r1" "\n\t"
835
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_B) * MI(f) << 8*/
836
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_B) * LO(f)*/
837
-        " add %3,r0" "\n\t"
838
-        " adc %4,r1" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 16*/
810
+        A("lds %10, bezier_B")      /* %10 = LO(bezier_B)*/
811
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_B) * LO(f)*/
812
+        A("add %9,r1")
813
+        A("adc %2,%0")
814
+        A("adc %3,%0")
815
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(LO(bezier_B) * LO(f))*/
816
+        A("lds %11, bezier_B+1")    /* %11 = MI(bezier_B)*/
817
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_B) * LO(f)*/
818
+        A("add %9,r0")
819
+        A("adc %2,r1")
820
+        A("adc %3,%0")
821
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_B) * LO(f)*/
822
+        A("lds %1, bezier_B+2")     /* %1 = HI(bezier_B)*/
823
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_B) * LO(f)*/
824
+        A("add %2,r0")
825
+        A("adc %3,r1")
826
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 8*/
827
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_B) * MI(f)*/
828
+        A("add %9,r0")
829
+        A("adc %2,r1")
830
+        A("adc %3,%0")
831
+        A("adc %4,%0")              /* %4:%3:%2:%9 += LO(bezier_B) * MI(f)*/
832
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_B) * MI(f)*/
833
+        A("add %2,r0")
834
+        A("adc %3,r1")
835
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_B) * MI(f) << 8*/
836
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_B) * LO(f)*/
837
+        A("add %3,r0")
838
+        A("adc %4,r1")              /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 16*/
839 839
 
840 840
         /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5  (unsigned) [17]*/
841
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
842
-        " mov %1,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
843
-        " clr %10" "\n\t"                /* %10 = 0*/
844
-        " clr %11" "\n\t"                /* %11 = 0*/
845
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
846
-        " add %1,r0" "\n\t"              /* %1 += LO(LO(f) * HI(t))*/
847
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
848
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
849
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
850
-        " add %1,r0" "\n\t"              /* %1 += LO(HI(f) * LO(t))*/
851
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t))*/
852
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
853
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
854
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
855
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
856
-        " mov %5,%10" "\n\t"             /* %6:%5 =*/
857
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
841
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
842
+        A("mov %1,r1")              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
843
+        A("clr %10")                /* %10 = 0*/
844
+        A("clr %11")                /* %11 = 0*/
845
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
846
+        A("add %1,r0")              /* %1 += LO(LO(f) * HI(t))*/
847
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
848
+        A("adc %11,%0")             /* %11 += carry*/
849
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
850
+        A("add %1,r0")              /* %1 += LO(HI(f) * LO(t))*/
851
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t))*/
852
+        A("adc %11,%0")             /* %11 += carry*/
853
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
854
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
855
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
856
+        A("mov %5,%10")             /* %6:%5 =*/
857
+        A("mov %6,%11")             /* f = %10:%11*/
858 858
 
859 859
         /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/
860 860
         /* acc -= v; */
861
-        " lds %10, bezier_A" "\n\t"      /* %10 = LO(bezier_A)*/
862
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_A) * LO(f)*/
863
-        " sub %9,r1" "\n\t"
864
-        " sbc %2,%0" "\n\t"
865
-        " sbc %3,%0" "\n\t"
866
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(LO(bezier_A) * LO(f))*/
867
-        " lds %11, bezier_A+1" "\n\t"    /* %11 = MI(bezier_A)*/
868
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_A) * LO(f)*/
869
-        " sub %9,r0" "\n\t"
870
-        " sbc %2,r1" "\n\t"
871
-        " sbc %3,%0" "\n\t"
872
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_A) * LO(f)*/
873
-        " lds %1, bezier_A+2" "\n\t"     /* %1 = HI(bezier_A)*/
874
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_A) * LO(f)*/
875
-        " sub %2,r0" "\n\t"
876
-        " sbc %3,r1" "\n\t"
877
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 8*/
878
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_A) * MI(f)*/
879
-        " sub %9,r0" "\n\t"
880
-        " sbc %2,r1" "\n\t"
881
-        " sbc %3,%0" "\n\t"
882
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= LO(bezier_A) * MI(f)*/
883
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_A) * MI(f)*/
884
-        " sub %2,r0" "\n\t"
885
-        " sbc %3,r1" "\n\t"
886
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_A) * MI(f) << 8*/
887
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_A) * LO(f)*/
888
-        " sub %3,r0" "\n\t"
889
-        " sbc %4,r1" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 16*/
890
-        " jmp 2f" "\n\t"                 /* Done!*/
891
-
892
-        "1:" "\n\t"
861
+        A("lds %10, bezier_A")      /* %10 = LO(bezier_A)*/
862
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_A) * LO(f)*/
863
+        A("sub %9,r1")
864
+        A("sbc %2,%0")
865
+        A("sbc %3,%0")
866
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(LO(bezier_A) * LO(f))*/
867
+        A("lds %11, bezier_A+1")    /* %11 = MI(bezier_A)*/
868
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_A) * LO(f)*/
869
+        A("sub %9,r0")
870
+        A("sbc %2,r1")
871
+        A("sbc %3,%0")
872
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_A) * LO(f)*/
873
+        A("lds %1, bezier_A+2")     /* %1 = HI(bezier_A)*/
874
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_A) * LO(f)*/
875
+        A("sub %2,r0")
876
+        A("sbc %3,r1")
877
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 8*/
878
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_A) * MI(f)*/
879
+        A("sub %9,r0")
880
+        A("sbc %2,r1")
881
+        A("sbc %3,%0")
882
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= LO(bezier_A) * MI(f)*/
883
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_A) * MI(f)*/
884
+        A("sub %2,r0")
885
+        A("sbc %3,r1")
886
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_A) * MI(f) << 8*/
887
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_A) * LO(f)*/
888
+        A("sub %3,r0")
889
+        A("sbc %4,r1")              /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 16*/
890
+        A("jmp 2f")                 /* Done!*/
891
+
892
+        L("1")
893 893
 
894 894
         /* uint24_t v; */
895 895
         /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29]*/
896 896
         /* acc += v; */
897
-        " lds %10, bezier_C" "\n\t"      /* %10 = LO(bezier_C)*/
898
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_C) * LO(f)*/
899
-        " add %9,r1" "\n\t"
900
-        " adc %2,%0" "\n\t"
901
-        " adc %3,%0" "\n\t"
902
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(LO(bezier_C) * LO(f))*/
903
-        " lds %11, bezier_C+1" "\n\t"    /* %11 = MI(bezier_C)*/
904
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_C) * LO(f)*/
905
-        " add %9,r0" "\n\t"
906
-        " adc %2,r1" "\n\t"
907
-        " adc %3,%0" "\n\t"
908
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_C) * LO(f)*/
909
-        " lds %1, bezier_C+2" "\n\t"     /* %1 = HI(bezier_C)*/
910
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_C) * LO(f)*/
911
-        " add %2,r0" "\n\t"
912
-        " adc %3,r1" "\n\t"
913
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 8*/
914
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_C) * MI(f)*/
915
-        " add %9,r0" "\n\t"
916
-        " adc %2,r1" "\n\t"
917
-        " adc %3,%0" "\n\t"
918
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += LO(bezier_C) * MI(f)*/
919
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_C) * MI(f)*/
920
-        " add %2,r0" "\n\t"
921
-        " adc %3,r1" "\n\t"
922
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_C) * MI(f) << 8*/
923
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_C) * LO(f)*/
924
-        " add %3,r0" "\n\t"
925
-        " adc %4,r1" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 16*/
897
+        A("lds %10, bezier_C")      /* %10 = LO(bezier_C)*/
898
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_C) * LO(f)*/
899
+        A("add %9,r1")
900
+        A("adc %2,%0")
901
+        A("adc %3,%0")
902
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(LO(bezier_C) * LO(f))*/
903
+        A("lds %11, bezier_C+1")    /* %11 = MI(bezier_C)*/
904
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_C) * LO(f)*/
905
+        A("add %9,r0")
906
+        A("adc %2,r1")
907
+        A("adc %3,%0")
908
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_C) * LO(f)*/
909
+        A("lds %1, bezier_C+2")     /* %1 = HI(bezier_C)*/
910
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_C) * LO(f)*/
911
+        A("add %2,r0")
912
+        A("adc %3,r1")
913
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 8*/
914
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_C) * MI(f)*/
915
+        A("add %9,r0")
916
+        A("adc %2,r1")
917
+        A("adc %3,%0")
918
+        A("adc %4,%0")              /* %4:%3:%2:%9 += LO(bezier_C) * MI(f)*/
919
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_C) * MI(f)*/
920
+        A("add %2,r0")
921
+        A("adc %3,r1")
922
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_C) * MI(f) << 8*/
923
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_C) * LO(f)*/
924
+        A("add %3,r0")
925
+        A("adc %4,r1")              /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 16*/
926 926
 
927 927
         /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3  (unsigned) [17]*/
928
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
929
-        " mov %1,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
930
-        " clr %10" "\n\t"                /* %10 = 0*/
931
-        " clr %11" "\n\t"                /* %11 = 0*/
932
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
933
-        " add %1,r0" "\n\t"              /* %1 += LO(LO(f) * HI(t))*/
934
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
935
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
936
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
937
-        " add %1,r0" "\n\t"              /* %1 += LO(HI(f) * LO(t))*/
938
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t))*/
939
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
940
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
941
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
942
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
943
-        " mov %5,%10" "\n\t"             /* %6:%5 =*/
944
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
928
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
929
+        A("mov %1,r1")              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
930
+        A("clr %10")                /* %10 = 0*/
931
+        A("clr %11")                /* %11 = 0*/
932
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
933
+        A("add %1,r0")              /* %1 += LO(LO(f) * HI(t))*/
934
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
935
+        A("adc %11,%0")             /* %11 += carry*/
936
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
937
+        A("add %1,r0")              /* %1 += LO(HI(f) * LO(t))*/
938
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t))*/
939
+        A("adc %11,%0")             /* %11 += carry*/
940
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
941
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
942
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
943
+        A("mov %5,%10")             /* %6:%5 =*/
944
+        A("mov %6,%11")             /* f = %10:%11*/
945 945
 
946 946
         /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/
947 947
         /* acc -= v;*/
948
-        " lds %10, bezier_B" "\n\t"      /* %10 = LO(bezier_B)*/
949
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_B) * LO(f)*/
950
-        " sub %9,r1" "\n\t"
951
-        " sbc %2,%0" "\n\t"
952
-        " sbc %3,%0" "\n\t"
953
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(LO(bezier_B) * LO(f))*/
954
-        " lds %11, bezier_B+1" "\n\t"    /* %11 = MI(bezier_B)*/
955
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_B) * LO(f)*/
956
-        " sub %9,r0" "\n\t"
957
-        " sbc %2,r1" "\n\t"
958
-        " sbc %3,%0" "\n\t"
959
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_B) * LO(f)*/
960
-        " lds %1, bezier_B+2" "\n\t"     /* %1 = HI(bezier_B)*/
961
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_B) * LO(f)*/
962
-        " sub %2,r0" "\n\t"
963
-        " sbc %3,r1" "\n\t"
964
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 8*/
965
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_B) * MI(f)*/
966
-        " sub %9,r0" "\n\t"
967
-        " sbc %2,r1" "\n\t"
968
-        " sbc %3,%0" "\n\t"
969
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= LO(bezier_B) * MI(f)*/
970
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_B) * MI(f)*/
971
-        " sub %2,r0" "\n\t"
972
-        " sbc %3,r1" "\n\t"
973
-        " sbc %4,%0" "\n\t"              /* %4:%3:%2:%9 -= MI(bezier_B) * MI(f) << 8*/
974
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_B) * LO(f)*/
975
-        " sub %3,r0" "\n\t"
976
-        " sbc %4,r1" "\n\t"              /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 16*/
948
+        A("lds %10, bezier_B")      /* %10 = LO(bezier_B)*/
949
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_B) * LO(f)*/
950
+        A("sub %9,r1")
951
+        A("sbc %2,%0")
952
+        A("sbc %3,%0")
953
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(LO(bezier_B) * LO(f))*/
954
+        A("lds %11, bezier_B+1")    /* %11 = MI(bezier_B)*/
955
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_B) * LO(f)*/
956
+        A("sub %9,r0")
957
+        A("sbc %2,r1")
958
+        A("sbc %3,%0")
959
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_B) * LO(f)*/
960
+        A("lds %1, bezier_B+2")     /* %1 = HI(bezier_B)*/
961
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_B) * LO(f)*/
962
+        A("sub %2,r0")
963
+        A("sbc %3,r1")
964
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 8*/
965
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_B) * MI(f)*/
966
+        A("sub %9,r0")
967
+        A("sbc %2,r1")
968
+        A("sbc %3,%0")
969
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= LO(bezier_B) * MI(f)*/
970
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_B) * MI(f)*/
971
+        A("sub %2,r0")
972
+        A("sbc %3,r1")
973
+        A("sbc %4,%0")              /* %4:%3:%2:%9 -= MI(bezier_B) * MI(f) << 8*/
974
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_B) * LO(f)*/
975
+        A("sub %3,r0")
976
+        A("sbc %4,r1")              /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 16*/
977 977
 
978 978
         /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5  (unsigned) [17]*/
979
-        " mul %5,%7" "\n\t"              /* r1:r0 = LO(f) * LO(t)*/
980
-        " mov %1,r1" "\n\t"              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
981
-        " clr %10" "\n\t"                /* %10 = 0*/
982
-        " clr %11" "\n\t"                /* %11 = 0*/
983
-        " mul %5,%8" "\n\t"              /* r1:r0 = LO(f) * HI(t)*/
984
-        " add %1,r0" "\n\t"              /* %1 += LO(LO(f) * HI(t))*/
985
-        " adc %10,r1" "\n\t"             /* %10 = HI(LO(f) * HI(t))*/
986
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
987
-        " mul %6,%7" "\n\t"              /* r1:r0 = HI(f) * LO(t)*/
988
-        " add %1,r0" "\n\t"              /* %1 += LO(HI(f) * LO(t))*/
989
-        " adc %10,r1" "\n\t"             /* %10 += HI(HI(f) * LO(t))*/
990
-        " adc %11,%0" "\n\t"             /* %11 += carry*/
991
-        " mul %6,%8" "\n\t"              /* r1:r0 = HI(f) * HI(t)*/
992
-        " add %10,r0" "\n\t"             /* %10 += LO(HI(f) * HI(t))*/
993
-        " adc %11,r1" "\n\t"             /* %11 += HI(HI(f) * HI(t))*/
994
-        " mov %5,%10" "\n\t"             /* %6:%5 =*/
995
-        " mov %6,%11" "\n\t"             /* f = %10:%11*/
979
+        A("mul %5,%7")              /* r1:r0 = LO(f) * LO(t)*/
980
+        A("mov %1,r1")              /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/
981
+        A("clr %10")                /* %10 = 0*/
982
+        A("clr %11")                /* %11 = 0*/
983
+        A("mul %5,%8")              /* r1:r0 = LO(f) * HI(t)*/
984
+        A("add %1,r0")              /* %1 += LO(LO(f) * HI(t))*/
985
+        A("adc %10,r1")             /* %10 = HI(LO(f) * HI(t))*/
986
+        A("adc %11,%0")             /* %11 += carry*/
987
+        A("mul %6,%7")              /* r1:r0 = HI(f) * LO(t)*/
988
+        A("add %1,r0")              /* %1 += LO(HI(f) * LO(t))*/
989
+        A("adc %10,r1")             /* %10 += HI(HI(f) * LO(t))*/
990
+        A("adc %11,%0")             /* %11 += carry*/
991
+        A("mul %6,%8")              /* r1:r0 = HI(f) * HI(t)*/
992
+        A("add %10,r0")             /* %10 += LO(HI(f) * HI(t))*/
993
+        A("adc %11,r1")             /* %11 += HI(HI(f) * HI(t))*/
994
+        A("mov %5,%10")             /* %6:%5 =*/
995
+        A("mov %6,%11")             /* f = %10:%11*/
996 996
 
997 997
         /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/
998 998
         /* acc += v; */
999
-        " lds %10, bezier_A" "\n\t"      /* %10 = LO(bezier_A)*/
1000
-        " mul %10,%5" "\n\t"             /* r1:r0 = LO(bezier_A) * LO(f)*/
1001
-        " add %9,r1" "\n\t"
1002
-        " adc %2,%0" "\n\t"
1003
-        " adc %3,%0" "\n\t"
1004
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(LO(bezier_A) * LO(f))*/
1005
-        " lds %11, bezier_A+1" "\n\t"    /* %11 = MI(bezier_A)*/
1006
-        " mul %11,%5" "\n\t"             /* r1:r0 = MI(bezier_A) * LO(f)*/
1007
-        " add %9,r0" "\n\t"
1008
-        " adc %2,r1" "\n\t"
1009
-        " adc %3,%0" "\n\t"
1010
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_A) * LO(f)*/
1011
-        " lds %1, bezier_A+2" "\n\t"     /* %1 = HI(bezier_A)*/
1012
-        " mul %1,%5" "\n\t"              /* r1:r0 = MI(bezier_A) * LO(f)*/
1013
-        " add %2,r0" "\n\t"
1014
-        " adc %3,r1" "\n\t"
1015
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 8*/
1016
-        " mul %10,%6" "\n\t"             /* r1:r0 = LO(bezier_A) * MI(f)*/
1017
-        " add %9,r0" "\n\t"
1018
-        " adc %2,r1" "\n\t"
1019
-        " adc %3,%0" "\n\t"
1020
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += LO(bezier_A) * MI(f)*/
1021
-        " mul %11,%6" "\n\t"             /* r1:r0 = MI(bezier_A) * MI(f)*/
1022
-        " add %2,r0" "\n\t"
1023
-        " adc %3,r1" "\n\t"
1024
-        " adc %4,%0" "\n\t"              /* %4:%3:%2:%9 += MI(bezier_A) * MI(f) << 8*/
1025
-        " mul %1,%6" "\n\t"              /* r1:r0 = HI(bezier_A) * LO(f)*/
1026
-        " add %3,r0" "\n\t"
1027
-        " adc %4,r1" "\n\t"              /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 16*/
1028
-        "2:" "\n\t"
999
+        A("lds %10, bezier_A")      /* %10 = LO(bezier_A)*/
1000
+        A("mul %10,%5")             /* r1:r0 = LO(bezier_A) * LO(f)*/
1001
+        A("add %9,r1")
1002
+        A("adc %2,%0")
1003
+        A("adc %3,%0")
1004
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(LO(bezier_A) * LO(f))*/
1005
+        A("lds %11, bezier_A+1")    /* %11 = MI(bezier_A)*/
1006
+        A("mul %11,%5")             /* r1:r0 = MI(bezier_A) * LO(f)*/
1007
+        A("add %9,r0")
1008
+        A("adc %2,r1")
1009
+        A("adc %3,%0")
1010
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_A) * LO(f)*/
1011
+        A("lds %1, bezier_A+2")     /* %1 = HI(bezier_A)*/
1012
+        A("mul %1,%5")              /* r1:r0 = MI(bezier_A) * LO(f)*/
1013
+        A("add %2,r0")
1014
+        A("adc %3,r1")
1015
+        A("adc %4,%0")              /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 8*/
1016
+        A("mul %10,%6")             /* r1:r0 = LO(bezier_A) * MI(f)*/
1017
+        A("add %9,r0")
1018
+        A("adc %2,r1")
1019
+        A("adc %3,%0")
1020
+        A("adc %4,%0")              /* %4:%3:%2:%9 += LO(bezier_A) * MI(f)*/
1021
+        A("mul %11,%6")             /* r1:r0 = MI(bezier_A) * MI(f)*/
1022
+        A("add %2,r0")
1023
+        A("adc %3,r1")
1024
+        A("adc %4,%0")              /* %4:%3:%2:%9 += MI(bezier_A) * MI(f) << 8*/
1025
+        A("mul %1,%6")              /* r1:r0 = HI(bezier_A) * LO(f)*/
1026
+        A("add %3,r0")
1027
+        A("adc %4,r1")              /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 16*/
1028
+        L("2")
1029 1029
         " clr __zero_reg__"              /* C runtime expects r1 = __zero_reg__ = 0 */
1030 1030
         : "+r"(r0),
1031 1031
           "+r"(r1),
@@ -1071,20 +1071,20 @@ void Stepper::set_directions() {
1071 1071
         register int32_t C = bezier_C;
1072 1072
 
1073 1073
          __asm__ __volatile__(
1074
-          ".syntax unified"                   "\n\t"  // is to prevent CM0,CM1 non-unified syntax
1075
-          " lsrs  %[ahi],%[alo],#1"           "\n\t"  // a  = F << 31      1 cycles
1076
-          " lsls  %[alo],%[alo],#31"          "\n\t"  //                   1 cycles
1077
-          " umull %[flo],%[fhi],%[fhi],%[t]"  "\n\t"  // f *= t            5 cycles [fhi:flo=64bits]
1078
-          " umull %[flo],%[fhi],%[fhi],%[t]"  "\n\t"  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1079
-          " lsrs  %[flo],%[fhi],#1"           "\n\t"  //                   1 cycles [31bits]
1080
-          " smlal %[alo],%[ahi],%[flo],%[C]"  "\n\t"  // a+=(f>>33)*C;     5 cycles
1081
-          " umull %[flo],%[fhi],%[fhi],%[t]"  "\n\t"  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1082
-          " lsrs  %[flo],%[fhi],#1"           "\n\t"  //                   1 cycles [31bits]
1083
-          " smlal %[alo],%[ahi],%[flo],%[B]"  "\n\t"  // a+=(f>>33)*B;     5 cycles
1084
-          " umull %[flo],%[fhi],%[fhi],%[t]"  "\n\t"  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1085
-          " lsrs  %[flo],%[fhi],#1"           "\n\t"  // f>>=33;           1 cycles [31bits]
1086
-          " smlal %[alo],%[ahi],%[flo],%[A]"  "\n\t"  // a+=(f>>33)*A;     5 cycles
1087
-          " lsrs  %[alo],%[ahi],#6"           "\n\t"  // a>>=38            1 cycles
1074
+          ".syntax unified" "\n\t"              // is to prevent CM0,CM1 non-unified syntax
1075
+          A("lsrs  %[ahi],%[alo],#1")           // a  = F << 31      1 cycles
1076
+          A("lsls  %[alo],%[alo],#31")          //                   1 cycles
1077
+          A("umull %[flo],%[fhi],%[fhi],%[t]")  // f *= t            5 cycles [fhi:flo=64bits]
1078
+          A("umull %[flo],%[fhi],%[fhi],%[t]")  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1079
+          A("lsrs  %[flo],%[fhi],#1")           //                   1 cycles [31bits]
1080
+          A("smlal %[alo],%[ahi],%[flo],%[C]")  // a+=(f>>33)*C;     5 cycles
1081
+          A("umull %[flo],%[fhi],%[fhi],%[t]")  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1082
+          A("lsrs  %[flo],%[fhi],#1")           //                   1 cycles [31bits]
1083
+          A("smlal %[alo],%[ahi],%[flo],%[B]")  // a+=(f>>33)*B;     5 cycles
1084
+          A("umull %[flo],%[fhi],%[fhi],%[t]")  // f>>=32; f*=t      5 cycles [fhi:flo=64bits]
1085
+          A("lsrs  %[flo],%[fhi],#1")           // f>>=33;           1 cycles [31bits]
1086
+          A("smlal %[alo],%[ahi],%[flo],%[A]")  // a+=(f>>33)*A;     5 cycles
1087
+          A("lsrs  %[alo],%[ahi],#6")           // a>>=38            1 cycles
1088 1088
           : [alo]"+r"( alo ) ,
1089 1089
             [flo]"+r"( flo ) ,
1090 1090
             [fhi]"+r"( fhi ) ,

Loading…
Cancel
Save