5 #define DEC(N) uECC_CONCAT(DEC_, N)
7 #define REPEAT_1(stuff) stuff
8 #define REPEAT_2(stuff) REPEAT_1(stuff) stuff
9 #define REPEAT_3(stuff) REPEAT_2(stuff) stuff
10 #define REPEAT_4(stuff) REPEAT_3(stuff) stuff
11 #define REPEAT_5(stuff) REPEAT_4(stuff) stuff
12 #define REPEAT_6(stuff) REPEAT_5(stuff) stuff
13 #define REPEAT_7(stuff) REPEAT_6(stuff) stuff
14 #define REPEAT_8(stuff) REPEAT_7(stuff) stuff
15 #define REPEAT_9(stuff) REPEAT_8(stuff) stuff
16 #define REPEAT_10(stuff) REPEAT_9(stuff) stuff
17 #define REPEAT_11(stuff) REPEAT_10(stuff) stuff
18 #define REPEAT_12(stuff) REPEAT_11(stuff) stuff
19 #define REPEAT_13(stuff) REPEAT_12(stuff) stuff
20 #define REPEAT_14(stuff) REPEAT_13(stuff) stuff
21 #define REPEAT_15(stuff) REPEAT_14(stuff) stuff
22 #define REPEAT_16(stuff) REPEAT_15(stuff) stuff
23 #define REPEAT_17(stuff) REPEAT_16(stuff) stuff
24 #define REPEAT_18(stuff) REPEAT_17(stuff) stuff
25 #define REPEAT_19(stuff) REPEAT_18(stuff) stuff
26 #define REPEAT_20(stuff) REPEAT_19(stuff) stuff
27 #define REPEAT_21(stuff) REPEAT_20(stuff) stuff
28 #define REPEAT_22(stuff) REPEAT_21(stuff) stuff
29 #define REPEAT_23(stuff) REPEAT_22(stuff) stuff
30 #define REPEAT_24(stuff) REPEAT_23(stuff) stuff
31 #define REPEAT_25(stuff) REPEAT_24(stuff) stuff
32 #define REPEAT_26(stuff) REPEAT_25(stuff) stuff
33 #define REPEAT_27(stuff) REPEAT_26(stuff) stuff
34 #define REPEAT_28(stuff) REPEAT_27(stuff) stuff
35 #define REPEAT_29(stuff) REPEAT_28(stuff) stuff
36 #define REPEAT_30(stuff) REPEAT_29(stuff) stuff
37 #define REPEAT_31(stuff) REPEAT_30(stuff) stuff
38 #define REPEAT_32(stuff) REPEAT_31(stuff) stuff
40 #define REPEAT(N, stuff) uECC_CONCAT(REPEAT_, N)(stuff)
42 #define STR2(thing) #thing
43 #define STR(thing) STR2(thing)
45 #if (uECC_ASM == uECC_asm_fast)
47 static void vli_clear(uint8_t *p_vli)
50 REPEAT(uECC_BYTES, "st %a[ptr]+, r1 \n\t")
54 : "r0", "cc", "memory"
59 static void vli_set(uint8_t *p_dest, const uint8_t *p_src)
62 REPEAT(uECC_BYTES, "ld r0, %a[sptr]+ \n\t"
63 "st %a[dptr]+, r0 \n\t")
64 : [dptr] "+e" (p_dest), [sptr] "+e" (p_src)
66 : "r0", "cc", "memory"
71 static void vli_rshift1(uint8_t *p_vli)
74 "adiw r30, " STR(uECC_BYTES) " \n\t"
75 "ld r0, -z \n\t" /* Load byte. */
76 "lsr r0 \n\t" /* Shift. */
77 "st z, r0 \n\t" /* Store the first result byte. */
79 /* Now we just do the remaining bytes with the carry bit (using ROR) */
80 REPEAT(DEC(uECC_BYTES), "ld r0, -z \n\t"
86 : "r0", "cc", "memory"
91 /* Computes p_result = p_left + p_right, returning carry. Can modify in place. */
92 static uint8_t vli_add(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
99 "ld %[left], x+ \n\t" /* Load left byte. */
100 "ld %[right], y+ \n\t" /* Load right byte. */
101 "add %[left], %[right] \n\t" /* Add the first byte. */
102 "st z+, %[left] \n\t" /* Store the first result byte. */
104 /* Now we just do the remaining bytes with the carry bit (using ADC) */
105 REPEAT(DEC(uECC_BYTES), "ld %[left], x+ \n\t"
106 "ld %[right], y+ \n\t"
107 "adc %[left], %[right] \n\t"
108 "st z+, %[left] \n\t")
110 "adc %[carry], %[carry] \n\t" /* Store carry bit in l_carry. */
112 "sbiw r28, " STR(uECC_BYTES) " \n\t" /* Restore Y */
114 : "+z" (p_result), "+x" (p_left),
115 [carry] "+r" (l_carry), [left] "=&r" (l_left), [right] "=&r" (l_right)
123 /* Computes p_result = p_left - p_right, returning borrow. Can modify in place. */
124 static uint8_t vli_sub(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
126 uint8_t l_borrow = 0;
131 "ld %[left], x+ \n\t" /* Load left byte. */
132 "ld %[right], y+ \n\t" /* Load right byte. */
133 "sub %[left], %[right] \n\t" /* Subtract the first byte. */
134 "st z+, %[left] \n\t" /* Store the first result byte. */
136 /* Now we just do the remaining bytes with the carry bit (using SBC) */
137 REPEAT(DEC(uECC_BYTES), "ld %[left], x+ \n\t"
138 "ld %[right], y+ \n\t"
139 "sbc %[left], %[right] \n\t"
140 "st z+, %[left] \n\t")
142 "adc %[borrow], %[borrow] \n\t" /* Store carry bit in l_borrow. */
144 "sbiw r28, " STR(uECC_BYTES) " \n\t" /* Restore Y */
146 : "+z" (p_result), "+x" (p_left),
147 [borrow] "+r" (l_borrow), [left] "=&r" (l_left), [right] "=&r" (l_right)
155 #if (uECC_BYTES == 20)
156 __attribute((noinline))
157 static void vli_mult(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
2063 : "+x" (p_left), "+y" (p_right), "+z" (p_result)
2065 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
2066 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "cc", "memory"
2070 #elif (uECC_BYTES == 24)
2071 __attribute((noinline))
2072 static void vli_mult(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
4846 : "+x" (p_left), "+y" (p_right), "+z" (p_result)
4848 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
4849 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "cc", "memory"
4853 #elif (uECC_BYTES == 32)
4854 __attribute((noinline))
4855 static void vli_mult(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
9772 : "+x" (p_left), "+y" (p_right), "+z" (p_result)
9774 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
9775 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "cc", "memory"
9779 #endif /* uECC_BYTES == 32 */
9781 #if uECC_SQUARE_FUNC
9783 #if (uECC_BYTES == 20)
9784 static void vli_square(uint8_t *p_result, uint8_t *p_left)
10005 "adc r22, r27 \n\t"
10009 "adc r22, r27 \n\t"
10013 "adc r22, r27 \n\t"
10017 "adc r22, r27 \n\t"
10024 "adc r22, r27 \n\t"
10025 "add r23, r25 \n\t"
10026 "adc r24, r26 \n\t"
10027 "adc r22, r27 \n\t"
10037 "adc r26, r27 \n\t"
10041 "adc r26, r27 \n\t"
10045 "adc r26, r27 \n\t"
10049 "adc r26, r27 \n\t"
10053 "adc r26, r27 \n\t"
10057 "add r23, r24 \n\t"
10058 "adc r25, r22 \n\t"
10059 "adc r26, r27 \n\t"
10069 "adc r22, r27 \n\t"
10073 "adc r22, r27 \n\t"
10077 "adc r22, r27 \n\t"
10081 "adc r22, r27 \n\t"
10085 "adc r22, r27 \n\t"
10092 "adc r22, r27 \n\t"
10093 "add r23, r25 \n\t"
10094 "adc r24, r26 \n\t"
10095 "adc r22, r27 \n\t"
10105 "adc r26, r27 \n\t"
10109 "adc r26, r27 \n\t"
10113 "adc r26, r27 \n\t"
10117 "adc r26, r27 \n\t"
10121 "adc r26, r27 \n\t"
10125 "adc r26, r27 \n\t"
10129 "add r23, r24 \n\t"
10130 "adc r25, r22 \n\t"
10131 "adc r26, r27 \n\t"
10141 "adc r22, r27 \n\t"
10145 "adc r22, r27 \n\t"
10149 "adc r22, r27 \n\t"
10153 "adc r22, r27 \n\t"
10157 "adc r22, r27 \n\t"
10161 "adc r22, r27 \n\t"
10168 "adc r22, r27 \n\t"
10169 "add r23, r25 \n\t"
10170 "adc r24, r26 \n\t"
10171 "adc r22, r27 \n\t"
10181 "adc r26, r27 \n\t"
10185 "adc r26, r27 \n\t"
10189 "adc r26, r27 \n\t"
10193 "adc r26, r27 \n\t"
10197 "adc r26, r27 \n\t"
10201 "adc r26, r27 \n\t"
10205 "adc r26, r27 \n\t"
10209 "add r23, r24 \n\t"
10210 "adc r25, r22 \n\t"
10211 "adc r26, r27 \n\t"
10221 "adc r22, r27 \n\t"
10225 "adc r22, r27 \n\t"
10229 "adc r22, r27 \n\t"
10233 "adc r22, r27 \n\t"
10237 "adc r22, r27 \n\t"
10241 "adc r22, r27 \n\t"
10245 "adc r22, r27 \n\t"
10249 "mul r10, r10 \n\t"
10252 "adc r22, r27 \n\t"
10253 "add r23, r25 \n\t"
10254 "adc r24, r26 \n\t"
10255 "adc r22, r27 \n\t"
10265 "adc r26, r27 \n\t"
10269 "adc r26, r27 \n\t"
10273 "adc r26, r27 \n\t"
10277 "adc r26, r27 \n\t"
10281 "adc r26, r27 \n\t"
10285 "adc r26, r27 \n\t"
10289 "adc r26, r27 \n\t"
10290 "mul r10, r11 \n\t"
10293 "adc r26, r27 \n\t"
10297 "add r23, r24 \n\t"
10298 "adc r25, r22 \n\t"
10299 "adc r26, r27 \n\t"
10309 "adc r22, r27 \n\t"
10313 "adc r22, r27 \n\t"
10317 "adc r22, r27 \n\t"
10321 "adc r22, r27 \n\t"
10325 "adc r22, r27 \n\t"
10329 "adc r22, r27 \n\t"
10333 "adc r22, r27 \n\t"
10334 "mul r10, r12 \n\t"
10337 "adc r22, r27 \n\t"
10341 "mul r11, r11 \n\t"
10344 "adc r22, r27 \n\t"
10345 "add r23, r25 \n\t"
10346 "adc r24, r26 \n\t"
10347 "adc r22, r27 \n\t"
10357 "adc r26, r27 \n\t"
10361 "adc r26, r27 \n\t"
10365 "adc r26, r27 \n\t"
10369 "adc r26, r27 \n\t"
10373 "adc r26, r27 \n\t"
10377 "adc r26, r27 \n\t"
10381 "adc r26, r27 \n\t"
10382 "mul r10, r13 \n\t"
10385 "adc r26, r27 \n\t"
10386 "mul r11, r12 \n\t"
10389 "adc r26, r27 \n\t"
10393 "add r23, r24 \n\t"
10394 "adc r25, r22 \n\t"
10395 "adc r26, r27 \n\t"
10405 "adc r22, r27 \n\t"
10409 "adc r22, r27 \n\t"
10413 "adc r22, r27 \n\t"
10417 "adc r22, r27 \n\t"
10421 "adc r22, r27 \n\t"
10425 "adc r22, r27 \n\t"
10426 "mul r10, r14 \n\t"
10429 "adc r22, r27 \n\t"
10430 "mul r11, r13 \n\t"
10433 "adc r22, r27 \n\t"
10437 "mul r12, r12 \n\t"
10440 "adc r22, r27 \n\t"
10441 "add r23, r25 \n\t"
10442 "adc r24, r26 \n\t"
10443 "adc r22, r27 \n\t"
10453 "adc r26, r27 \n\t"
10457 "adc r26, r27 \n\t"
10461 "adc r26, r27 \n\t"
10465 "adc r26, r27 \n\t"
10469 "adc r26, r27 \n\t"
10470 "mul r10, r15 \n\t"
10473 "adc r26, r27 \n\t"
10474 "mul r11, r14 \n\t"
10477 "adc r26, r27 \n\t"
10478 "mul r12, r13 \n\t"
10481 "adc r26, r27 \n\t"
10485 "add r23, r24 \n\t"
10486 "adc r25, r22 \n\t"
10487 "adc r26, r27 \n\t"
10497 "adc r22, r27 \n\t"
10501 "adc r22, r27 \n\t"
10505 "adc r22, r27 \n\t"
10509 "adc r22, r27 \n\t"
10510 "mul r10, r16 \n\t"
10513 "adc r22, r27 \n\t"
10514 "mul r11, r15 \n\t"
10517 "adc r22, r27 \n\t"
10518 "mul r12, r14 \n\t"
10521 "adc r22, r27 \n\t"
10525 "mul r13, r13 \n\t"
10528 "adc r22, r27 \n\t"
10529 "add r23, r25 \n\t"
10530 "adc r24, r26 \n\t"
10531 "adc r22, r27 \n\t"
10541 "adc r26, r27 \n\t"
10545 "adc r26, r27 \n\t"
10549 "adc r26, r27 \n\t"
10550 "mul r10, r17 \n\t"
10553 "adc r26, r27 \n\t"
10554 "mul r11, r16 \n\t"
10557 "adc r26, r27 \n\t"
10558 "mul r12, r15 \n\t"
10561 "adc r26, r27 \n\t"
10562 "mul r13, r14 \n\t"
10565 "adc r26, r27 \n\t"
10569 "add r23, r24 \n\t"
10570 "adc r25, r22 \n\t"
10571 "adc r26, r27 \n\t"
10581 "adc r22, r27 \n\t"
10585 "adc r22, r27 \n\t"
10586 "mul r10, r18 \n\t"
10589 "adc r22, r27 \n\t"
10590 "mul r11, r17 \n\t"
10593 "adc r22, r27 \n\t"
10594 "mul r12, r16 \n\t"
10597 "adc r22, r27 \n\t"
10598 "mul r13, r15 \n\t"
10601 "adc r22, r27 \n\t"
10605 "mul r14, r14 \n\t"
10608 "adc r22, r27 \n\t"
10609 "add r23, r25 \n\t"
10610 "adc r24, r26 \n\t"
10611 "adc r22, r27 \n\t"
10621 "adc r26, r27 \n\t"
10622 "mul r10, r19 \n\t"
10625 "adc r26, r27 \n\t"
10626 "mul r11, r18 \n\t"
10629 "adc r26, r27 \n\t"
10630 "mul r12, r17 \n\t"
10633 "adc r26, r27 \n\t"
10634 "mul r13, r16 \n\t"
10637 "adc r26, r27 \n\t"
10638 "mul r14, r15 \n\t"
10641 "adc r26, r27 \n\t"
10645 "add r23, r24 \n\t"
10646 "adc r25, r22 \n\t"
10647 "adc r26, r27 \n\t"
10654 "mul r10, r20 \n\t"
10657 "adc r22, r27 \n\t"
10658 "mul r11, r19 \n\t"
10661 "adc r22, r27 \n\t"
10662 "mul r12, r18 \n\t"
10665 "adc r22, r27 \n\t"
10666 "mul r13, r17 \n\t"
10669 "adc r22, r27 \n\t"
10670 "mul r14, r16 \n\t"
10673 "adc r22, r27 \n\t"
10677 "mul r15, r15 \n\t"
10680 "adc r22, r27 \n\t"
10681 "add r23, r25 \n\t"
10682 "adc r24, r26 \n\t"
10683 "adc r22, r27 \n\t"
10687 "mul r10, r21 \n\t"
10690 "mul r11, r20 \n\t"
10693 "adc r26, r27 \n\t"
10694 "mul r12, r19 \n\t"
10697 "adc r26, r27 \n\t"
10698 "mul r13, r18 \n\t"
10701 "adc r26, r27 \n\t"
10702 "mul r14, r17 \n\t"
10705 "adc r26, r27 \n\t"
10706 "mul r15, r16 \n\t"
10709 "adc r26, r27 \n\t"
10713 "add r23, r24 \n\t"
10714 "adc r25, r22 \n\t"
10715 "adc r26, r27 \n\t"
10719 "mul r11, r21 \n\t"
10722 "mul r12, r20 \n\t"
10725 "adc r22, r27 \n\t"
10726 "mul r13, r19 \n\t"
10729 "adc r22, r27 \n\t"
10730 "mul r14, r18 \n\t"
10733 "adc r22, r27 \n\t"
10734 "mul r15, r17 \n\t"
10737 "adc r22, r27 \n\t"
10741 "mul r16, r16 \n\t"
10744 "adc r22, r27 \n\t"
10745 "add r23, r25 \n\t"
10746 "adc r24, r26 \n\t"
10747 "adc r22, r27 \n\t"
10751 "mul r12, r21 \n\t"
10754 "mul r13, r20 \n\t"
10757 "adc r26, r27 \n\t"
10758 "mul r14, r19 \n\t"
10761 "adc r26, r27 \n\t"
10762 "mul r15, r18 \n\t"
10765 "adc r26, r27 \n\t"
10766 "mul r16, r17 \n\t"
10769 "adc r26, r27 \n\t"
10773 "add r23, r24 \n\t"
10774 "adc r25, r22 \n\t"
10775 "adc r26, r27 \n\t"
10779 "mul r13, r21 \n\t"
10782 "mul r14, r20 \n\t"
10785 "adc r22, r27 \n\t"
10786 "mul r15, r19 \n\t"
10789 "adc r22, r27 \n\t"
10790 "mul r16, r18 \n\t"
10793 "adc r22, r27 \n\t"
10797 "mul r17, r17 \n\t"
10800 "adc r22, r27 \n\t"
10801 "add r23, r25 \n\t"
10802 "adc r24, r26 \n\t"
10803 "adc r22, r27 \n\t"
10807 "mul r14, r21 \n\t"
10810 "mul r15, r20 \n\t"
10813 "adc r26, r27 \n\t"
10814 "mul r16, r19 \n\t"
10817 "adc r26, r27 \n\t"
10818 "mul r17, r18 \n\t"
10821 "adc r26, r27 \n\t"
10825 "add r23, r24 \n\t"
10826 "adc r25, r22 \n\t"
10827 "adc r26, r27 \n\t"
10831 "mul r15, r21 \n\t"
10834 "mul r16, r20 \n\t"
10837 "adc r22, r27 \n\t"
10838 "mul r17, r19 \n\t"
10841 "adc r22, r27 \n\t"
10845 "mul r18, r18 \n\t"
10848 "adc r22, r27 \n\t"
10849 "add r23, r25 \n\t"
10850 "adc r24, r26 \n\t"
10851 "adc r22, r27 \n\t"
10855 "mul r16, r21 \n\t"
10858 "mul r17, r20 \n\t"
10861 "adc r26, r27 \n\t"
10862 "mul r18, r19 \n\t"
10865 "adc r26, r27 \n\t"
10869 "add r23, r24 \n\t"
10870 "adc r25, r22 \n\t"
10871 "adc r26, r27 \n\t"
10875 "mul r17, r21 \n\t"
10878 "mul r18, r20 \n\t"
10881 "adc r22, r27 \n\t"
10885 "mul r19, r19 \n\t"
10888 "adc r22, r27 \n\t"
10889 "add r23, r25 \n\t"
10890 "adc r24, r26 \n\t"
10891 "adc r22, r27 \n\t"
10895 "mul r18, r21 \n\t"
10898 "mul r19, r20 \n\t"
10901 "adc r26, r27 \n\t"
10905 "add r23, r24 \n\t"
10906 "adc r25, r22 \n\t"
10907 "adc r26, r27 \n\t"
10911 "mul r19, r21 \n\t"
10914 "adc r23, r27 \n\t"
10917 "adc r23, r27 \n\t"
10918 "mul r20, r20 \n\t"
10921 "adc r23, r27 \n\t"
10925 "mul r20, r21 \n\t"
10928 "adc r25, r27 \n\t"
10931 "adc r25, r27 \n\t"
10934 "mul r21, r21 \n\t"
10940 : "+x" (p_left), "+z" (p_result)
10942 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
10943 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "cc", "memory"
10946 #define asm_square 1
10948 #elif (uECC_BYTES == 24)
10950 __attribute((noinline))
10951 static void vli_square(uint8_t *p_result, uint8_t *p_left)
10955 "movw r28, r26 \n\t"
10958 "adiw r28, 20 \n\t"
10961 "adiw r30, 20 \n\t"
10972 "adc r24, r25 \n\t"
10980 "adc r22, r25 \n\t"
10984 "adc r22, r25 \n\t"
10992 "adc r23, r25 \n\t"
10996 "adc r23, r25 \n\t"
11004 "adc r24, r25 \n\t"
11008 "adc r24, r25 \n\t"
11016 "adc r22, r25 \n\t"
11026 "sbiw r30, 28 \n\t"
11057 "adc r24, r25 \n\t"
11060 "adc r24, r25 \n\t"
11067 "adc r22, r25 \n\t"
11070 "adc r22, r25 \n\t"
11074 "adc r22, r25 \n\t"
11084 "adc r29, r25 \n\t"
11088 "add r23, r24 \n\t"
11089 "adc r28, r22 \n\t"
11090 "adc r29, r25 \n\t"
11100 "adc r22, r25 \n\t"
11107 "adc r22, r25 \n\t"
11108 "add r23, r28 \n\t"
11109 "adc r24, r29 \n\t"
11110 "adc r22, r25 \n\t"
11120 "adc r29, r25 \n\t"
11124 "adc r29, r25 \n\t"
11128 "add r23, r24 \n\t"
11129 "adc r28, r22 \n\t"
11130 "adc r29, r25 \n\t"
11140 "adc r22, r25 \n\t"
11144 "adc r22, r25 \n\t"
11151 "adc r22, r25 \n\t"
11152 "add r23, r28 \n\t"
11153 "adc r24, r29 \n\t"
11154 "adc r22, r25 \n\t"
11164 "adc r29, r25 \n\t"
11168 "adc r29, r25 \n\t"
11172 "adc r29, r25 \n\t"
11176 "add r23, r24 \n\t"
11177 "adc r28, r22 \n\t"
11178 "adc r29, r25 \n\t"
11188 "adc r22, r25 \n\t"
11192 "adc r22, r25 \n\t"
11196 "adc r22, r25 \n\t"
11203 "adc r22, r25 \n\t"
11204 "add r23, r28 \n\t"
11205 "adc r24, r29 \n\t"
11206 "adc r22, r25 \n\t"
11216 "adc r29, r25 \n\t"
11220 "adc r29, r25 \n\t"
11224 "adc r29, r25 \n\t"
11228 "adc r29, r25 \n\t"
11232 "add r23, r24 \n\t"
11233 "adc r28, r22 \n\t"
11234 "adc r29, r25 \n\t"
11244 "adc r22, r25 \n\t"
11248 "adc r22, r25 \n\t"
11252 "adc r22, r25 \n\t"
11256 "adc r22, r25 \n\t"
11263 "adc r22, r25 \n\t"
11264 "add r23, r28 \n\t"
11265 "adc r24, r29 \n\t"
11266 "adc r22, r25 \n\t"
11276 "adc r29, r25 \n\t"
11280 "adc r29, r25 \n\t"
11284 "adc r29, r25 \n\t"
11288 "adc r29, r25 \n\t"
11292 "adc r29, r25 \n\t"
11296 "add r23, r24 \n\t"
11297 "adc r28, r22 \n\t"
11298 "adc r29, r25 \n\t"
11308 "adc r22, r25 \n\t"
11312 "adc r22, r25 \n\t"
11316 "adc r22, r25 \n\t"
11320 "adc r22, r25 \n\t"
11324 "adc r22, r25 \n\t"
11331 "adc r22, r25 \n\t"
11332 "add r23, r28 \n\t"
11333 "adc r24, r29 \n\t"
11334 "adc r22, r25 \n\t"
11344 "adc r29, r25 \n\t"
11348 "adc r29, r25 \n\t"
11352 "adc r29, r25 \n\t"
11356 "adc r29, r25 \n\t"
11360 "adc r29, r25 \n\t"
11364 "adc r29, r25 \n\t"
11368 "add r23, r24 \n\t"
11369 "adc r28, r22 \n\t"
11370 "adc r29, r25 \n\t"
11380 "adc r22, r25 \n\t"
11384 "adc r22, r25 \n\t"
11388 "adc r22, r25 \n\t"
11392 "adc r22, r25 \n\t"
11396 "adc r22, r25 \n\t"
11400 "adc r22, r25 \n\t"
11407 "adc r22, r25 \n\t"
11408 "add r23, r28 \n\t"
11409 "adc r24, r29 \n\t"
11410 "adc r22, r25 \n\t"
11420 "adc r29, r25 \n\t"
11424 "adc r29, r25 \n\t"
11428 "adc r29, r25 \n\t"
11432 "adc r29, r25 \n\t"
11436 "adc r29, r25 \n\t"
11440 "adc r29, r25 \n\t"
11444 "adc r29, r25 \n\t"
11448 "add r23, r24 \n\t"
11449 "adc r28, r22 \n\t"
11450 "adc r29, r25 \n\t"
11460 "adc r22, r25 \n\t"
11464 "adc r22, r25 \n\t"
11468 "adc r22, r25 \n\t"
11472 "adc r22, r25 \n\t"
11476 "adc r22, r25 \n\t"
11480 "adc r22, r25 \n\t"
11484 "adc r22, r25 \n\t"
11488 "mul r10, r10 \n\t"
11491 "adc r22, r25 \n\t"
11492 "add r23, r28 \n\t"
11493 "adc r24, r29 \n\t"
11494 "adc r22, r25 \n\t"
11504 "adc r29, r25 \n\t"
11508 "adc r29, r25 \n\t"
11512 "adc r29, r25 \n\t"
11516 "adc r29, r25 \n\t"
11520 "adc r29, r25 \n\t"
11524 "adc r29, r25 \n\t"
11528 "adc r29, r25 \n\t"
11529 "mul r10, r11 \n\t"
11532 "adc r29, r25 \n\t"
11536 "add r23, r24 \n\t"
11537 "adc r28, r22 \n\t"
11538 "adc r29, r25 \n\t"
11548 "adc r22, r25 \n\t"
11552 "adc r22, r25 \n\t"
11556 "adc r22, r25 \n\t"
11560 "adc r22, r25 \n\t"
11564 "adc r22, r25 \n\t"
11568 "adc r22, r25 \n\t"
11572 "adc r22, r25 \n\t"
11573 "mul r10, r12 \n\t"
11576 "adc r22, r25 \n\t"
11580 "mul r11, r11 \n\t"
11583 "adc r22, r25 \n\t"
11584 "add r23, r28 \n\t"
11585 "adc r24, r29 \n\t"
11586 "adc r22, r25 \n\t"
11596 "adc r29, r25 \n\t"
11600 "adc r29, r25 \n\t"
11604 "adc r29, r25 \n\t"
11608 "adc r29, r25 \n\t"
11612 "adc r29, r25 \n\t"
11616 "adc r29, r25 \n\t"
11620 "adc r29, r25 \n\t"
11621 "mul r10, r13 \n\t"
11624 "adc r29, r25 \n\t"
11625 "mul r11, r12 \n\t"
11628 "adc r29, r25 \n\t"
11632 "add r23, r24 \n\t"
11633 "adc r28, r22 \n\t"
11634 "adc r29, r25 \n\t"
11645 "adc r22, r25 \n\t"
11649 "adc r22, r25 \n\t"
11653 "adc r22, r25 \n\t"
11657 "adc r22, r25 \n\t"
11661 "adc r22, r25 \n\t"
11665 "adc r22, r25 \n\t"
11666 "mul r10, r14 \n\t"
11669 "adc r22, r25 \n\t"
11670 "mul r11, r13 \n\t"
11673 "adc r22, r25 \n\t"
11676 "adc r24, r25 \n\t"
11677 "adc r22, r25 \n\t"
11681 "mul r12, r12 \n\t"
11684 "adc r22, r25 \n\t"
11685 "add r23, r28 \n\t"
11686 "adc r24, r29 \n\t"
11687 "adc r22, r25 \n\t"
11697 "adc r29, r25 \n\t"
11701 "adc r29, r25 \n\t"
11705 "adc r29, r25 \n\t"
11709 "adc r29, r25 \n\t"
11713 "adc r29, r25 \n\t"
11717 "adc r29, r25 \n\t"
11718 "mul r10, r15 \n\t"
11721 "adc r29, r25 \n\t"
11722 "mul r11, r14 \n\t"
11725 "adc r29, r25 \n\t"
11726 "mul r12, r13 \n\t"
11729 "adc r29, r25 \n\t"
11732 "adc r28, r25 \n\t"
11733 "adc r29, r25 \n\t"
11737 "add r23, r24 \n\t"
11738 "adc r28, r22 \n\t"
11739 "adc r29, r25 \n\t"
11750 "adc r22, r25 \n\t"
11754 "adc r22, r25 \n\t"
11758 "adc r22, r25 \n\t"
11762 "adc r22, r25 \n\t"
11766 "adc r22, r25 \n\t"
11767 "mul r10, r16 \n\t"
11770 "adc r22, r25 \n\t"
11771 "mul r11, r15 \n\t"
11774 "adc r22, r25 \n\t"
11775 "mul r12, r14 \n\t"
11778 "adc r22, r25 \n\t"
11781 "adc r24, r25 \n\t"
11782 "adc r22, r25 \n\t"
11786 "mul r13, r13 \n\t"
11789 "adc r22, r25 \n\t"
11790 "add r23, r28 \n\t"
11791 "adc r24, r29 \n\t"
11792 "adc r22, r25 \n\t"
11802 "adc r29, r25 \n\t"
11806 "adc r29, r25 \n\t"
11810 "adc r29, r25 \n\t"
11814 "adc r29, r25 \n\t"
11818 "adc r29, r25 \n\t"
11819 "mul r10, r17 \n\t"
11822 "adc r29, r25 \n\t"
11823 "mul r11, r16 \n\t"
11826 "adc r29, r25 \n\t"
11827 "mul r12, r15 \n\t"
11830 "adc r29, r25 \n\t"
11831 "mul r13, r14 \n\t"
11834 "adc r29, r25 \n\t"
11837 "adc r28, r25 \n\t"
11838 "adc r29, r25 \n\t"
11842 "add r23, r24 \n\t"
11843 "adc r28, r22 \n\t"
11844 "adc r29, r25 \n\t"
11855 "adc r22, r25 \n\t"
11859 "adc r22, r25 \n\t"
11863 "adc r22, r25 \n\t"
11867 "adc r22, r25 \n\t"
11868 "mul r10, r18 \n\t"
11871 "adc r22, r25 \n\t"
11872 "mul r11, r17 \n\t"
11875 "adc r22, r25 \n\t"
11876 "mul r12, r16 \n\t"
11879 "adc r22, r25 \n\t"
11880 "mul r13, r15 \n\t"
11883 "adc r22, r25 \n\t"
11886 "adc r24, r25 \n\t"
11887 "adc r22, r25 \n\t"
11891 "mul r14, r14 \n\t"
11894 "adc r22, r25 \n\t"
11895 "add r23, r28 \n\t"
11896 "adc r24, r29 \n\t"
11897 "adc r22, r25 \n\t"
11907 "adc r29, r25 \n\t"
11911 "adc r29, r25 \n\t"
11915 "adc r29, r25 \n\t"
11919 "adc r29, r25 \n\t"
11920 "mul r10, r19 \n\t"
11923 "adc r29, r25 \n\t"
11924 "mul r11, r18 \n\t"
11927 "adc r29, r25 \n\t"
11928 "mul r12, r17 \n\t"
11931 "adc r29, r25 \n\t"
11932 "mul r13, r16 \n\t"
11935 "adc r29, r25 \n\t"
11936 "mul r14, r15 \n\t"
11939 "adc r29, r25 \n\t"
11942 "adc r28, r25 \n\t"
11943 "adc r29, r25 \n\t"
11947 "add r23, r24 \n\t"
11948 "adc r28, r22 \n\t"
11949 "adc r29, r25 \n\t"
11960 "adc r22, r25 \n\t"
11964 "adc r22, r25 \n\t"
11968 "adc r22, r25 \n\t"
11969 "mul r10, r20 \n\t"
11972 "adc r22, r25 \n\t"
11973 "mul r11, r19 \n\t"
11976 "adc r22, r25 \n\t"
11977 "mul r12, r18 \n\t"
11980 "adc r22, r25 \n\t"
11981 "mul r13, r17 \n\t"
11984 "adc r22, r25 \n\t"
11985 "mul r14, r16 \n\t"
11988 "adc r22, r25 \n\t"
11991 "adc r24, r25 \n\t"
11992 "adc r22, r25 \n\t"
11996 "mul r15, r15 \n\t"
11999 "adc r22, r25 \n\t"
12000 "add r23, r28 \n\t"
12001 "adc r24, r29 \n\t"
12002 "adc r22, r25 \n\t"
12012 "adc r29, r25 \n\t"
12016 "adc r29, r25 \n\t"
12020 "adc r29, r25 \n\t"
12021 "mul r10, r21 \n\t"
12024 "adc r29, r25 \n\t"
12025 "mul r11, r20 \n\t"
12028 "adc r29, r25 \n\t"
12029 "mul r12, r19 \n\t"
12032 "adc r29, r25 \n\t"
12033 "mul r13, r18 \n\t"
12036 "adc r29, r25 \n\t"
12037 "mul r14, r17 \n\t"
12040 "adc r29, r25 \n\t"
12041 "mul r15, r16 \n\t"
12044 "adc r29, r25 \n\t"
12047 "adc r28, r25 \n\t"
12048 "adc r29, r25 \n\t"
12052 "add r23, r24 \n\t"
12053 "adc r28, r22 \n\t"
12054 "adc r29, r25 \n\t"
12064 "adc r22, r25 \n\t"
12068 "adc r22, r25 \n\t"
12072 "adc r22, r25 \n\t"
12073 "mul r11, r21 \n\t"
12076 "adc r22, r25 \n\t"
12077 "mul r12, r20 \n\t"
12080 "adc r22, r25 \n\t"
12081 "mul r13, r19 \n\t"
12084 "adc r22, r25 \n\t"
12085 "mul r14, r18 \n\t"
12088 "adc r22, r25 \n\t"
12089 "mul r15, r17 \n\t"
12092 "adc r22, r25 \n\t"
12096 "mul r16, r16 \n\t"
12099 "adc r22, r25 \n\t"
12100 "add r23, r28 \n\t"
12101 "adc r24, r29 \n\t"
12102 "adc r22, r25 \n\t"
12112 "adc r29, r25 \n\t"
12116 "adc r29, r25 \n\t"
12120 "adc r29, r25 \n\t"
12121 "mul r12, r21 \n\t"
12124 "adc r29, r25 \n\t"
12125 "mul r13, r20 \n\t"
12128 "adc r29, r25 \n\t"
12129 "mul r14, r19 \n\t"
12132 "adc r29, r25 \n\t"
12133 "mul r15, r18 \n\t"
12136 "adc r29, r25 \n\t"
12137 "mul r16, r17 \n\t"
12140 "adc r29, r25 \n\t"
12144 "add r23, r24 \n\t"
12145 "adc r28, r22 \n\t"
12146 "adc r29, r25 \n\t"
12156 "adc r22, r25 \n\t"
12160 "adc r22, r25 \n\t"
12164 "adc r22, r25 \n\t"
12165 "mul r13, r21 \n\t"
12168 "adc r22, r25 \n\t"
12169 "mul r14, r20 \n\t"
12172 "adc r22, r25 \n\t"
12173 "mul r15, r19 \n\t"
12176 "adc r22, r25 \n\t"
12177 "mul r16, r18 \n\t"
12180 "adc r22, r25 \n\t"
12184 "mul r17, r17 \n\t"
12187 "adc r22, r25 \n\t"
12188 "add r23, r28 \n\t"
12189 "adc r24, r29 \n\t"
12190 "adc r22, r25 \n\t"
12200 "adc r29, r25 \n\t"
12204 "adc r29, r25 \n\t"
12208 "adc r29, r25 \n\t"
12209 "mul r14, r21 \n\t"
12212 "adc r29, r25 \n\t"
12213 "mul r15, r20 \n\t"
12216 "adc r29, r25 \n\t"
12217 "mul r16, r19 \n\t"
12220 "adc r29, r25 \n\t"
12221 "mul r17, r18 \n\t"
12224 "adc r29, r25 \n\t"
12228 "add r23, r24 \n\t"
12229 "adc r28, r22 \n\t"
12230 "adc r29, r25 \n\t"
12240 "adc r22, r25 \n\t"
12244 "adc r22, r25 \n\t"
12248 "adc r22, r25 \n\t"
12249 "mul r15, r21 \n\t"
12252 "adc r22, r25 \n\t"
12253 "mul r16, r20 \n\t"
12256 "adc r22, r25 \n\t"
12257 "mul r17, r19 \n\t"
12260 "adc r22, r25 \n\t"
12264 "mul r18, r18 \n\t"
12267 "adc r22, r25 \n\t"
12268 "add r23, r28 \n\t"
12269 "adc r24, r29 \n\t"
12270 "adc r22, r25 \n\t"
12280 "adc r29, r25 \n\t"
12284 "adc r29, r25 \n\t"
12288 "adc r29, r25 \n\t"
12289 "mul r16, r21 \n\t"
12292 "adc r29, r25 \n\t"
12293 "mul r17, r20 \n\t"
12296 "adc r29, r25 \n\t"
12297 "mul r18, r19 \n\t"
12300 "adc r29, r25 \n\t"
12304 "add r23, r24 \n\t"
12305 "adc r28, r22 \n\t"
12306 "adc r29, r25 \n\t"
12316 "adc r22, r25 \n\t"
12320 "adc r22, r25 \n\t"
12324 "adc r22, r25 \n\t"
12325 "mul r17, r21 \n\t"
12328 "adc r22, r25 \n\t"
12329 "mul r18, r20 \n\t"
12332 "adc r22, r25 \n\t"
12336 "mul r19, r19 \n\t"
12339 "adc r22, r25 \n\t"
12340 "add r23, r28 \n\t"
12341 "adc r24, r29 \n\t"
12342 "adc r22, r25 \n\t"
12352 "adc r29, r25 \n\t"
12356 "adc r29, r25 \n\t"
12360 "adc r29, r25 \n\t"
12361 "mul r18, r21 \n\t"
12364 "adc r29, r25 \n\t"
12365 "mul r19, r20 \n\t"
12368 "adc r29, r25 \n\t"
12372 "add r23, r24 \n\t"
12373 "adc r28, r22 \n\t"
12374 "adc r29, r25 \n\t"
12384 "adc r22, r25 \n\t"
12388 "adc r22, r25 \n\t"
12392 "adc r22, r25 \n\t"
12393 "mul r19, r21 \n\t"
12396 "adc r22, r25 \n\t"
12400 "mul r20, r20 \n\t"
12403 "adc r22, r25 \n\t"
12404 "add r23, r28 \n\t"
12405 "adc r24, r29 \n\t"
12406 "adc r22, r25 \n\t"
12416 "adc r29, r25 \n\t"
12420 "adc r29, r25 \n\t"
12424 "adc r29, r25 \n\t"
12425 "mul r20, r21 \n\t"
12428 "adc r29, r25 \n\t"
12432 "add r23, r24 \n\t"
12433 "adc r28, r22 \n\t"
12434 "adc r29, r25 \n\t"
12444 "adc r22, r25 \n\t"
12448 "adc r22, r25 \n\t"
12452 "adc r22, r25 \n\t"
12456 "mul r21, r21 \n\t"
12459 "adc r22, r25 \n\t"
12460 "add r23, r28 \n\t"
12461 "adc r24, r29 \n\t"
12462 "adc r22, r25 \n\t"
12472 "adc r29, r25 \n\t"
12476 "adc r29, r25 \n\t"
12480 "adc r29, r25 \n\t"
12484 "add r23, r24 \n\t"
12485 "adc r28, r22 \n\t"
12486 "adc r29, r25 \n\t"
12496 "adc r22, r25 \n\t"
12500 "adc r22, r25 \n\t"
12507 "adc r22, r25 \n\t"
12508 "add r23, r28 \n\t"
12509 "adc r24, r29 \n\t"
12510 "adc r22, r25 \n\t"
12520 "adc r29, r25 \n\t"
12524 "adc r29, r25 \n\t"
12528 "add r23, r24 \n\t"
12529 "adc r28, r22 \n\t"
12530 "adc r29, r25 \n\t"
12540 "adc r22, r25 \n\t"
12547 "adc r22, r25 \n\t"
12548 "add r23, r28 \n\t"
12549 "adc r24, r29 \n\t"
12550 "adc r22, r25 \n\t"
12560 "adc r29, r25 \n\t"
12564 "add r23, r24 \n\t"
12565 "adc r28, r22 \n\t"
12566 "adc r29, r25 \n\t"
12573 "adc r23, r25 \n\t"
12576 "adc r23, r25 \n\t"
12580 "adc r23, r25 \n\t"
12587 "adc r28, r25 \n\t"
12590 "adc r28, r25 \n\t"
12599 : "+x" (p_left), "+z" (p_result)
12601 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
12602 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r28", "r29", "cc", "memory"
12605 #define asm_square 1
12607 #elif (uECC_BYTES == 32)
12609 __attribute((noinline))
12610 static void vli_square(uint8_t *p_result, uint8_t *p_left)
12614 "movw r28, r26 \n\t"
12621 "adiw r28, 20 \n\t"
12628 "adiw r30, 20 \n\t"
12639 "adc r24, r25 \n\t"
12646 "adc r22, r25 \n\t"
12650 "adc r22, r25 \n\t"
12657 "adc r23, r25 \n\t"
12661 "adc r23, r25 \n\t"
12668 "adc r24, r25 \n\t"
12672 "adc r24, r25 \n\t"
12676 "adc r24, r25 \n\t"
12683 "adc r22, r25 \n\t"
12687 "adc r22, r25 \n\t"
12691 "adc r22, r25 \n\t"
12699 "adc r23, r25 \n\t"
12703 "adc r23, r25 \n\t"
12707 "adc r23, r25 \n\t"
12711 "adc r23, r25 \n\t"
12719 "adc r24, r25 \n\t"
12723 "adc r24, r25 \n\t"
12727 "adc r24, r25 \n\t"
12731 "adc r24, r25 \n\t"
12739 "adc r22, r25 \n\t"
12743 "adc r22, r25 \n\t"
12747 "adc r22, r25 \n\t"
12751 "adc r22, r25 \n\t"
12755 "adc r22, r25 \n\t"
12763 "adc r23, r25 \n\t"
12767 "adc r23, r25 \n\t"
12771 "adc r23, r25 \n\t"
12775 "adc r23, r25 \n\t"
12779 "adc r23, r25 \n\t"
12787 "adc r24, r25 \n\t"
12791 "adc r24, r25 \n\t"
12795 "adc r24, r25 \n\t"
12799 "adc r24, r25 \n\t"
12803 "adc r24, r25 \n\t"
12807 "adc r24, r25 \n\t"
12815 "adc r22, r25 \n\t"
12819 "adc r22, r25 \n\t"
12823 "adc r22, r25 \n\t"
12827 "adc r22, r25 \n\t"
12831 "adc r22, r25 \n\t"
12835 "adc r22, r25 \n\t"
12843 "adc r23, r25 \n\t"
12847 "adc r23, r25 \n\t"
12851 "adc r23, r25 \n\t"
12855 "adc r23, r25 \n\t"
12859 "adc r23, r25 \n\t"
12863 "adc r23, r25 \n\t"
12871 "adc r24, r25 \n\t"
12875 "adc r24, r25 \n\t"
12879 "adc r24, r25 \n\t"
12883 "adc r24, r25 \n\t"
12887 "adc r24, r25 \n\t"
12895 "adc r22, r25 \n\t"
12899 "adc r22, r25 \n\t"
12903 "adc r22, r25 \n\t"
12907 "adc r22, r25 \n\t"
12911 "adc r22, r25 \n\t"
12919 "adc r23, r25 \n\t"
12923 "adc r23, r25 \n\t"
12927 "adc r23, r25 \n\t"
12931 "adc r23, r25 \n\t"
12939 "adc r24, r25 \n\t"
12943 "adc r24, r25 \n\t"
12947 "adc r24, r25 \n\t"
12951 "adc r24, r25 \n\t"
12959 "adc r22, r25 \n\t"
12963 "adc r22, r25 \n\t"
12967 "adc r22, r25 \n\t"
12974 "adc r23, r25 \n\t"
12978 "adc r23, r25 \n\t"
12982 "adc r23, r25 \n\t"
12989 "adc r24, r25 \n\t"
12993 "adc r24, r25 \n\t"
13000 "adc r22, r25 \n\t"
13004 "adc r22, r25 \n\t"
13011 "adc r23, r25 \n\t"
13020 "sbiw r26, 12 \n\t"
13021 "sbiw r30, 44 \n\t"
13052 "adc r24, r25 \n\t"
13055 "adc r24, r25 \n\t"
13062 "adc r22, r25 \n\t"
13065 "adc r22, r25 \n\t"
13069 "adc r22, r25 \n\t"
13079 "adc r29, r25 \n\t"
13083 "add r23, r24 \n\t"
13084 "adc r28, r22 \n\t"
13085 "adc r29, r25 \n\t"
13095 "adc r22, r25 \n\t"
13102 "adc r22, r25 \n\t"
13103 "add r23, r28 \n\t"
13104 "adc r24, r29 \n\t"
13105 "adc r22, r25 \n\t"
13115 "adc r29, r25 \n\t"
13119 "adc r29, r25 \n\t"
13123 "add r23, r24 \n\t"
13124 "adc r28, r22 \n\t"
13125 "adc r29, r25 \n\t"
13135 "adc r22, r25 \n\t"
13139 "adc r22, r25 \n\t"
13146 "adc r22, r25 \n\t"
13147 "add r23, r28 \n\t"
13148 "adc r24, r29 \n\t"
13149 "adc r22, r25 \n\t"
13159 "adc r29, r25 \n\t"
13163 "adc r29, r25 \n\t"
13167 "adc r29, r25 \n\t"
13171 "add r23, r24 \n\t"
13172 "adc r28, r22 \n\t"
13173 "adc r29, r25 \n\t"
13183 "adc r22, r25 \n\t"
13187 "adc r22, r25 \n\t"
13191 "adc r22, r25 \n\t"
13198 "adc r22, r25 \n\t"
13199 "add r23, r28 \n\t"
13200 "adc r24, r29 \n\t"
13201 "adc r22, r25 \n\t"
13211 "adc r29, r25 \n\t"
13215 "adc r29, r25 \n\t"
13219 "adc r29, r25 \n\t"
13223 "adc r29, r25 \n\t"
13227 "add r23, r24 \n\t"
13228 "adc r28, r22 \n\t"
13229 "adc r29, r25 \n\t"
13239 "adc r22, r25 \n\t"
13243 "adc r22, r25 \n\t"
13247 "adc r22, r25 \n\t"
13251 "adc r22, r25 \n\t"
13258 "adc r22, r25 \n\t"
13259 "add r23, r28 \n\t"
13260 "adc r24, r29 \n\t"
13261 "adc r22, r25 \n\t"
13271 "adc r29, r25 \n\t"
13275 "adc r29, r25 \n\t"
13279 "adc r29, r25 \n\t"
13283 "adc r29, r25 \n\t"
13287 "adc r29, r25 \n\t"
13291 "add r23, r24 \n\t"
13292 "adc r28, r22 \n\t"
13293 "adc r29, r25 \n\t"
13303 "adc r22, r25 \n\t"
13307 "adc r22, r25 \n\t"
13311 "adc r22, r25 \n\t"
13315 "adc r22, r25 \n\t"
13319 "adc r22, r25 \n\t"
13326 "adc r22, r25 \n\t"
13327 "add r23, r28 \n\t"
13328 "adc r24, r29 \n\t"
13329 "adc r22, r25 \n\t"
13339 "adc r29, r25 \n\t"
13343 "adc r29, r25 \n\t"
13347 "adc r29, r25 \n\t"
13351 "adc r29, r25 \n\t"
13355 "adc r29, r25 \n\t"
13359 "adc r29, r25 \n\t"
13363 "add r23, r24 \n\t"
13364 "adc r28, r22 \n\t"
13365 "adc r29, r25 \n\t"
13375 "adc r22, r25 \n\t"
13379 "adc r22, r25 \n\t"
13383 "adc r22, r25 \n\t"
13387 "adc r22, r25 \n\t"
13391 "adc r22, r25 \n\t"
13395 "adc r22, r25 \n\t"
13402 "adc r22, r25 \n\t"
13403 "add r23, r28 \n\t"
13404 "adc r24, r29 \n\t"
13405 "adc r22, r25 \n\t"
13415 "adc r29, r25 \n\t"
13419 "adc r29, r25 \n\t"
13423 "adc r29, r25 \n\t"
13427 "adc r29, r25 \n\t"
13431 "adc r29, r25 \n\t"
13435 "adc r29, r25 \n\t"
13439 "adc r29, r25 \n\t"
13443 "add r23, r24 \n\t"
13444 "adc r28, r22 \n\t"
13445 "adc r29, r25 \n\t"
13455 "adc r22, r25 \n\t"
13459 "adc r22, r25 \n\t"
13463 "adc r22, r25 \n\t"
13467 "adc r22, r25 \n\t"
13471 "adc r22, r25 \n\t"
13475 "adc r22, r25 \n\t"
13479 "adc r22, r25 \n\t"
13483 "mul r10, r10 \n\t"
13486 "adc r22, r25 \n\t"
13487 "add r23, r28 \n\t"
13488 "adc r24, r29 \n\t"
13489 "adc r22, r25 \n\t"
13499 "adc r29, r25 \n\t"
13503 "adc r29, r25 \n\t"
13507 "adc r29, r25 \n\t"
13511 "adc r29, r25 \n\t"
13515 "adc r29, r25 \n\t"
13519 "adc r29, r25 \n\t"
13523 "adc r29, r25 \n\t"
13524 "mul r10, r11 \n\t"
13527 "adc r29, r25 \n\t"
13531 "add r23, r24 \n\t"
13532 "adc r28, r22 \n\t"
13533 "adc r29, r25 \n\t"
13543 "adc r22, r25 \n\t"
13547 "adc r22, r25 \n\t"
13551 "adc r22, r25 \n\t"
13555 "adc r22, r25 \n\t"
13559 "adc r22, r25 \n\t"
13563 "adc r22, r25 \n\t"
13567 "adc r22, r25 \n\t"
13568 "mul r10, r12 \n\t"
13571 "adc r22, r25 \n\t"
13575 "mul r11, r11 \n\t"
13578 "adc r22, r25 \n\t"
13579 "add r23, r28 \n\t"
13580 "adc r24, r29 \n\t"
13581 "adc r22, r25 \n\t"
13591 "adc r29, r25 \n\t"
13595 "adc r29, r25 \n\t"
13599 "adc r29, r25 \n\t"
13603 "adc r29, r25 \n\t"
13607 "adc r29, r25 \n\t"
13611 "adc r29, r25 \n\t"
13615 "adc r29, r25 \n\t"
13616 "mul r10, r13 \n\t"
13619 "adc r29, r25 \n\t"
13620 "mul r11, r12 \n\t"
13623 "adc r29, r25 \n\t"
13627 "add r23, r24 \n\t"
13628 "adc r28, r22 \n\t"
13629 "adc r29, r25 \n\t"
13640 "adc r22, r25 \n\t"
13644 "adc r22, r25 \n\t"
13648 "adc r22, r25 \n\t"
13652 "adc r22, r25 \n\t"
13656 "adc r22, r25 \n\t"
13660 "adc r22, r25 \n\t"
13661 "mul r10, r14 \n\t"
13664 "adc r22, r25 \n\t"
13665 "mul r11, r13 \n\t"
13668 "adc r22, r25 \n\t"
13671 "adc r24, r25 \n\t"
13672 "adc r22, r25 \n\t"
13676 "mul r12, r12 \n\t"
13679 "adc r22, r25 \n\t"
13680 "add r23, r28 \n\t"
13681 "adc r24, r29 \n\t"
13682 "adc r22, r25 \n\t"
13692 "adc r29, r25 \n\t"
13696 "adc r29, r25 \n\t"
13700 "adc r29, r25 \n\t"
13704 "adc r29, r25 \n\t"
13708 "adc r29, r25 \n\t"
13712 "adc r29, r25 \n\t"
13713 "mul r10, r15 \n\t"
13716 "adc r29, r25 \n\t"
13717 "mul r11, r14 \n\t"
13720 "adc r29, r25 \n\t"
13721 "mul r12, r13 \n\t"
13724 "adc r29, r25 \n\t"
13727 "adc r28, r25 \n\t"
13728 "adc r29, r25 \n\t"
13732 "add r23, r24 \n\t"
13733 "adc r28, r22 \n\t"
13734 "adc r29, r25 \n\t"
13745 "adc r22, r25 \n\t"
13749 "adc r22, r25 \n\t"
13753 "adc r22, r25 \n\t"
13757 "adc r22, r25 \n\t"
13761 "adc r22, r25 \n\t"
13762 "mul r10, r16 \n\t"
13765 "adc r22, r25 \n\t"
13766 "mul r11, r15 \n\t"
13769 "adc r22, r25 \n\t"
13770 "mul r12, r14 \n\t"
13773 "adc r22, r25 \n\t"
13776 "adc r24, r25 \n\t"
13777 "adc r22, r25 \n\t"
13781 "mul r13, r13 \n\t"
13784 "adc r22, r25 \n\t"
13785 "add r23, r28 \n\t"
13786 "adc r24, r29 \n\t"
13787 "adc r22, r25 \n\t"
13797 "adc r29, r25 \n\t"
13801 "adc r29, r25 \n\t"
13805 "adc r29, r25 \n\t"
13809 "adc r29, r25 \n\t"
13813 "adc r29, r25 \n\t"
13814 "mul r10, r17 \n\t"
13817 "adc r29, r25 \n\t"
13818 "mul r11, r16 \n\t"
13821 "adc r29, r25 \n\t"
13822 "mul r12, r15 \n\t"
13825 "adc r29, r25 \n\t"
13826 "mul r13, r14 \n\t"
13829 "adc r29, r25 \n\t"
13832 "adc r28, r25 \n\t"
13833 "adc r29, r25 \n\t"
13837 "add r23, r24 \n\t"
13838 "adc r28, r22 \n\t"
13839 "adc r29, r25 \n\t"
13850 "adc r22, r25 \n\t"
13854 "adc r22, r25 \n\t"
13858 "adc r22, r25 \n\t"
13862 "adc r22, r25 \n\t"
13863 "mul r10, r18 \n\t"
13866 "adc r22, r25 \n\t"
13867 "mul r11, r17 \n\t"
13870 "adc r22, r25 \n\t"
13871 "mul r12, r16 \n\t"
13874 "adc r22, r25 \n\t"
13875 "mul r13, r15 \n\t"
13878 "adc r22, r25 \n\t"
13881 "adc r24, r25 \n\t"
13882 "adc r22, r25 \n\t"
13886 "mul r14, r14 \n\t"
13889 "adc r22, r25 \n\t"
13890 "add r23, r28 \n\t"
13891 "adc r24, r29 \n\t"
13892 "adc r22, r25 \n\t"
13902 "adc r29, r25 \n\t"
13906 "adc r29, r25 \n\t"
13910 "adc r29, r25 \n\t"
13914 "adc r29, r25 \n\t"
13915 "mul r10, r19 \n\t"
13918 "adc r29, r25 \n\t"
13919 "mul r11, r18 \n\t"
13922 "adc r29, r25 \n\t"
13923 "mul r12, r17 \n\t"
13926 "adc r29, r25 \n\t"
13927 "mul r13, r16 \n\t"
13930 "adc r29, r25 \n\t"
13931 "mul r14, r15 \n\t"
13934 "adc r29, r25 \n\t"
13937 "adc r28, r25 \n\t"
13938 "adc r29, r25 \n\t"
13942 "add r23, r24 \n\t"
13943 "adc r28, r22 \n\t"
13944 "adc r29, r25 \n\t"
13955 "adc r22, r25 \n\t"
13959 "adc r22, r25 \n\t"
13963 "adc r22, r25 \n\t"
13964 "mul r10, r20 \n\t"
13967 "adc r22, r25 \n\t"
13968 "mul r11, r19 \n\t"
13971 "adc r22, r25 \n\t"
13972 "mul r12, r18 \n\t"
13975 "adc r22, r25 \n\t"
13976 "mul r13, r17 \n\t"
13979 "adc r22, r25 \n\t"
13980 "mul r14, r16 \n\t"
13983 "adc r22, r25 \n\t"
13986 "adc r24, r25 \n\t"
13987 "adc r22, r25 \n\t"
13991 "mul r15, r15 \n\t"
13994 "adc r22, r25 \n\t"
13995 "add r23, r28 \n\t"
13996 "adc r24, r29 \n\t"
13997 "adc r22, r25 \n\t"
14007 "adc r29, r25 \n\t"
14011 "adc r29, r25 \n\t"
14015 "adc r29, r25 \n\t"
14016 "mul r10, r21 \n\t"
14019 "adc r29, r25 \n\t"
14020 "mul r11, r20 \n\t"
14023 "adc r29, r25 \n\t"
14024 "mul r12, r19 \n\t"
14027 "adc r29, r25 \n\t"
14028 "mul r13, r18 \n\t"
14031 "adc r29, r25 \n\t"
14032 "mul r14, r17 \n\t"
14035 "adc r29, r25 \n\t"
14036 "mul r15, r16 \n\t"
14039 "adc r29, r25 \n\t"
14042 "adc r28, r25 \n\t"
14043 "adc r29, r25 \n\t"
14047 "add r23, r24 \n\t"
14048 "adc r28, r22 \n\t"
14049 "adc r29, r25 \n\t"
14060 "adc r22, r25 \n\t"
14064 "adc r22, r25 \n\t"
14068 "adc r22, r25 \n\t"
14069 "mul r11, r21 \n\t"
14072 "adc r22, r25 \n\t"
14073 "mul r12, r20 \n\t"
14076 "adc r22, r25 \n\t"
14077 "mul r13, r19 \n\t"
14080 "adc r22, r25 \n\t"
14081 "mul r14, r18 \n\t"
14084 "adc r22, r25 \n\t"
14085 "mul r15, r17 \n\t"
14088 "adc r22, r25 \n\t"
14091 "adc r24, r25 \n\t"
14092 "adc r22, r25 \n\t"
14096 "mul r16, r16 \n\t"
14099 "adc r22, r25 \n\t"
14100 "add r23, r28 \n\t"
14101 "adc r24, r29 \n\t"
14102 "adc r22, r25 \n\t"
14112 "adc r29, r25 \n\t"
14116 "adc r29, r25 \n\t"
14120 "adc r29, r25 \n\t"
14124 "adc r29, r25 \n\t"
14125 "mul r12, r21 \n\t"
14128 "adc r29, r25 \n\t"
14129 "mul r13, r20 \n\t"
14132 "adc r29, r25 \n\t"
14133 "mul r14, r19 \n\t"
14136 "adc r29, r25 \n\t"
14137 "mul r15, r18 \n\t"
14140 "adc r29, r25 \n\t"
14141 "mul r16, r17 \n\t"
14144 "adc r29, r25 \n\t"
14147 "adc r28, r25 \n\t"
14148 "adc r29, r25 \n\t"
14152 "add r23, r24 \n\t"
14153 "adc r28, r22 \n\t"
14154 "adc r29, r25 \n\t"
14165 "adc r22, r25 \n\t"
14169 "adc r22, r25 \n\t"
14173 "adc r22, r25 \n\t"
14177 "adc r22, r25 \n\t"
14178 "mul r13, r21 \n\t"
14181 "adc r22, r25 \n\t"
14182 "mul r14, r20 \n\t"
14185 "adc r22, r25 \n\t"
14186 "mul r15, r19 \n\t"
14189 "adc r22, r25 \n\t"
14190 "mul r16, r18 \n\t"
14193 "adc r22, r25 \n\t"
14196 "adc r24, r25 \n\t"
14197 "adc r22, r25 \n\t"
14201 "mul r17, r17 \n\t"
14204 "adc r22, r25 \n\t"
14205 "add r23, r28 \n\t"
14206 "adc r24, r29 \n\t"
14207 "adc r22, r25 \n\t"
14217 "adc r29, r25 \n\t"
14221 "adc r29, r25 \n\t"
14225 "adc r29, r25 \n\t"
14229 "adc r29, r25 \n\t"
14233 "adc r29, r25 \n\t"
14234 "mul r14, r21 \n\t"
14237 "adc r29, r25 \n\t"
14238 "mul r15, r20 \n\t"
14241 "adc r29, r25 \n\t"
14242 "mul r16, r19 \n\t"
14245 "adc r29, r25 \n\t"
14246 "mul r17, r18 \n\t"
14249 "adc r29, r25 \n\t"
14252 "adc r28, r25 \n\t"
14253 "adc r29, r25 \n\t"
14257 "add r23, r24 \n\t"
14258 "adc r28, r22 \n\t"
14259 "adc r29, r25 \n\t"
14270 "adc r22, r25 \n\t"
14274 "adc r22, r25 \n\t"
14278 "adc r22, r25 \n\t"
14282 "adc r22, r25 \n\t"
14286 "adc r22, r25 \n\t"
14287 "mul r15, r21 \n\t"
14290 "adc r22, r25 \n\t"
14291 "mul r16, r20 \n\t"
14294 "adc r22, r25 \n\t"
14295 "mul r17, r19 \n\t"
14298 "adc r22, r25 \n\t"
14301 "adc r24, r25 \n\t"
14302 "adc r22, r25 \n\t"
14306 "mul r18, r18 \n\t"
14309 "adc r22, r25 \n\t"
14310 "add r23, r28 \n\t"
14311 "adc r24, r29 \n\t"
14312 "adc r22, r25 \n\t"
14322 "adc r29, r25 \n\t"
14326 "adc r29, r25 \n\t"
14330 "adc r29, r25 \n\t"
14334 "adc r29, r25 \n\t"
14338 "adc r29, r25 \n\t"
14342 "adc r29, r25 \n\t"
14343 "mul r16, r21 \n\t"
14346 "adc r29, r25 \n\t"
14347 "mul r17, r20 \n\t"
14350 "adc r29, r25 \n\t"
14351 "mul r18, r19 \n\t"
14354 "adc r29, r25 \n\t"
14357 "adc r28, r25 \n\t"
14358 "adc r29, r25 \n\t"
14362 "add r23, r24 \n\t"
14363 "adc r28, r22 \n\t"
14364 "adc r29, r25 \n\t"
14375 "adc r22, r25 \n\t"
14379 "adc r22, r25 \n\t"
14383 "adc r22, r25 \n\t"
14387 "adc r22, r25 \n\t"
14391 "adc r22, r25 \n\t"
14395 "adc r22, r25 \n\t"
14396 "mul r17, r21 \n\t"
14399 "adc r22, r25 \n\t"
14400 "mul r18, r20 \n\t"
14403 "adc r22, r25 \n\t"
14406 "adc r24, r25 \n\t"
14407 "adc r22, r25 \n\t"
14411 "mul r19, r19 \n\t"
14414 "adc r22, r25 \n\t"
14415 "add r23, r28 \n\t"
14416 "adc r24, r29 \n\t"
14417 "adc r22, r25 \n\t"
14427 "adc r29, r25 \n\t"
14431 "adc r29, r25 \n\t"
14435 "adc r29, r25 \n\t"
14439 "adc r29, r25 \n\t"
14443 "adc r29, r25 \n\t"
14447 "adc r29, r25 \n\t"
14451 "adc r29, r25 \n\t"
14452 "mul r18, r21 \n\t"
14455 "adc r29, r25 \n\t"
14456 "mul r19, r20 \n\t"
14459 "adc r29, r25 \n\t"
14462 "adc r28, r25 \n\t"
14463 "adc r29, r25 \n\t"
14467 "add r23, r24 \n\t"
14468 "adc r28, r22 \n\t"
14469 "adc r29, r25 \n\t"
14480 "adc r22, r25 \n\t"
14484 "adc r22, r25 \n\t"
14488 "adc r22, r25 \n\t"
14492 "adc r22, r25 \n\t"
14496 "adc r22, r25 \n\t"
14500 "adc r22, r25 \n\t"
14504 "adc r22, r25 \n\t"
14505 "mul r19, r21 \n\t"
14508 "adc r22, r25 \n\t"
14511 "adc r24, r25 \n\t"
14512 "adc r22, r25 \n\t"
14516 "mul r20, r20 \n\t"
14519 "adc r22, r25 \n\t"
14520 "add r23, r28 \n\t"
14521 "adc r24, r29 \n\t"
14522 "adc r22, r25 \n\t"
14526 "mul r11, r10 \n\t"
14532 "adc r29, r25 \n\t"
14536 "adc r29, r25 \n\t"
14540 "adc r29, r25 \n\t"
14544 "adc r29, r25 \n\t"
14548 "adc r29, r25 \n\t"
14552 "adc r29, r25 \n\t"
14556 "adc r29, r25 \n\t"
14560 "adc r29, r25 \n\t"
14561 "mul r20, r21 \n\t"
14564 "adc r29, r25 \n\t"
14567 "adc r28, r25 \n\t"
14568 "adc r29, r25 \n\t"
14572 "add r23, r24 \n\t"
14573 "adc r28, r22 \n\t"
14574 "adc r29, r25 \n\t"
14579 "mul r12, r10 \n\t"
14585 "adc r22, r25 \n\t"
14589 "adc r22, r25 \n\t"
14593 "adc r22, r25 \n\t"
14597 "adc r22, r25 \n\t"
14601 "adc r22, r25 \n\t"
14605 "adc r22, r25 \n\t"
14609 "adc r22, r25 \n\t"
14613 "adc r22, r25 \n\t"
14616 "adc r24, r25 \n\t"
14617 "adc r22, r25 \n\t"
14621 "mul r21, r21 \n\t"
14624 "adc r22, r25 \n\t"
14625 "add r23, r28 \n\t"
14626 "adc r24, r29 \n\t"
14627 "adc r22, r25 \n\t"
14631 "mul r12, r11 \n\t"
14634 "mul r13, r10 \n\t"
14637 "adc r29, r25 \n\t"
14641 "adc r29, r25 \n\t"
14645 "adc r29, r25 \n\t"
14649 "adc r29, r25 \n\t"
14653 "adc r29, r25 \n\t"
14657 "adc r29, r25 \n\t"
14661 "adc r29, r25 \n\t"
14665 "adc r29, r25 \n\t"
14669 "adc r29, r25 \n\t"
14672 "adc r28, r25 \n\t"
14673 "adc r29, r25 \n\t"
14677 "add r23, r24 \n\t"
14678 "adc r28, r22 \n\t"
14679 "adc r29, r25 \n\t"
14684 "mul r13, r11 \n\t"
14687 "mul r14, r10 \n\t"
14690 "adc r22, r25 \n\t"
14694 "adc r22, r25 \n\t"
14698 "adc r22, r25 \n\t"
14702 "adc r22, r25 \n\t"
14706 "adc r22, r25 \n\t"
14710 "adc r22, r25 \n\t"
14714 "adc r22, r25 \n\t"
14718 "adc r22, r25 \n\t"
14721 "adc r24, r25 \n\t"
14722 "adc r22, r25 \n\t"
14729 "adc r22, r25 \n\t"
14730 "add r23, r28 \n\t"
14731 "adc r24, r29 \n\t"
14732 "adc r22, r25 \n\t"
14736 "mul r13, r12 \n\t"
14739 "mul r14, r11 \n\t"
14742 "adc r29, r25 \n\t"
14743 "mul r15, r10 \n\t"
14746 "adc r29, r25 \n\t"
14750 "adc r29, r25 \n\t"
14754 "adc r29, r25 \n\t"
14758 "adc r29, r25 \n\t"
14762 "adc r29, r25 \n\t"
14766 "adc r29, r25 \n\t"
14770 "adc r29, r25 \n\t"
14774 "adc r29, r25 \n\t"
14777 "adc r28, r25 \n\t"
14778 "adc r29, r25 \n\t"
14782 "add r23, r24 \n\t"
14783 "adc r28, r22 \n\t"
14784 "adc r29, r25 \n\t"
14789 "mul r14, r12 \n\t"
14792 "mul r15, r11 \n\t"
14795 "adc r22, r25 \n\t"
14796 "mul r16, r10 \n\t"
14799 "adc r22, r25 \n\t"
14803 "adc r22, r25 \n\t"
14807 "adc r22, r25 \n\t"
14811 "adc r22, r25 \n\t"
14815 "adc r22, r25 \n\t"
14819 "adc r22, r25 \n\t"
14823 "adc r22, r25 \n\t"
14826 "adc r24, r25 \n\t"
14827 "adc r22, r25 \n\t"
14834 "adc r22, r25 \n\t"
14835 "add r23, r28 \n\t"
14836 "adc r24, r29 \n\t"
14837 "adc r22, r25 \n\t"
14841 "mul r14, r13 \n\t"
14844 "mul r15, r12 \n\t"
14847 "adc r29, r25 \n\t"
14848 "mul r16, r11 \n\t"
14851 "adc r29, r25 \n\t"
14852 "mul r17, r10 \n\t"
14855 "adc r29, r25 \n\t"
14859 "adc r29, r25 \n\t"
14863 "adc r29, r25 \n\t"
14867 "adc r29, r25 \n\t"
14871 "adc r29, r25 \n\t"
14875 "adc r29, r25 \n\t"
14879 "adc r29, r25 \n\t"
14882 "adc r28, r25 \n\t"
14883 "adc r29, r25 \n\t"
14887 "add r23, r24 \n\t"
14888 "adc r28, r22 \n\t"
14889 "adc r29, r25 \n\t"
14893 "mul r15, r13 \n\t"
14896 "mul r16, r12 \n\t"
14899 "adc r22, r25 \n\t"
14900 "mul r17, r11 \n\t"
14903 "adc r22, r25 \n\t"
14904 "mul r18, r10 \n\t"
14907 "adc r22, r25 \n\t"
14911 "adc r22, r25 \n\t"
14915 "adc r22, r25 \n\t"
14919 "adc r22, r25 \n\t"
14923 "adc r22, r25 \n\t"
14927 "adc r22, r25 \n\t"
14934 "adc r22, r25 \n\t"
14935 "add r23, r28 \n\t"
14936 "adc r24, r29 \n\t"
14937 "adc r22, r25 \n\t"
14941 "mul r16, r13 \n\t"
14944 "mul r17, r12 \n\t"
14947 "adc r29, r25 \n\t"
14948 "mul r18, r11 \n\t"
14951 "adc r29, r25 \n\t"
14952 "mul r19, r10 \n\t"
14955 "adc r29, r25 \n\t"
14959 "adc r29, r25 \n\t"
14963 "adc r29, r25 \n\t"
14967 "adc r29, r25 \n\t"
14971 "adc r29, r25 \n\t"
14975 "adc r29, r25 \n\t"
14979 "add r23, r24 \n\t"
14980 "adc r28, r22 \n\t"
14981 "adc r29, r25 \n\t"
14985 "mul r17, r13 \n\t"
14988 "mul r18, r12 \n\t"
14991 "adc r22, r25 \n\t"
14992 "mul r19, r11 \n\t"
14995 "adc r22, r25 \n\t"
14996 "mul r20, r10 \n\t"
14999 "adc r22, r25 \n\t"
15003 "adc r22, r25 \n\t"
15007 "adc r22, r25 \n\t"
15011 "adc r22, r25 \n\t"
15015 "adc r22, r25 \n\t"
15022 "adc r22, r25 \n\t"
15023 "add r23, r28 \n\t"
15024 "adc r24, r29 \n\t"
15025 "adc r22, r25 \n\t"
15029 "mul r18, r13 \n\t"
15032 "mul r19, r12 \n\t"
15035 "adc r29, r25 \n\t"
15036 "mul r20, r11 \n\t"
15039 "adc r29, r25 \n\t"
15040 "mul r21, r10 \n\t"
15043 "adc r29, r25 \n\t"
15047 "adc r29, r25 \n\t"
15051 "adc r29, r25 \n\t"
15055 "adc r29, r25 \n\t"
15059 "adc r29, r25 \n\t"
15063 "add r23, r24 \n\t"
15064 "adc r28, r22 \n\t"
15065 "adc r29, r25 \n\t"
15069 "mul r19, r13 \n\t"
15072 "mul r20, r12 \n\t"
15075 "adc r22, r25 \n\t"
15076 "mul r21, r11 \n\t"
15079 "adc r22, r25 \n\t"
15083 "adc r22, r25 \n\t"
15087 "adc r22, r25 \n\t"
15091 "adc r22, r25 \n\t"
15095 "adc r22, r25 \n\t"
15102 "adc r22, r25 \n\t"
15103 "add r23, r28 \n\t"
15104 "adc r24, r29 \n\t"
15105 "adc r22, r25 \n\t"
15109 "mul r20, r13 \n\t"
15112 "mul r21, r12 \n\t"
15115 "adc r29, r25 \n\t"
15119 "adc r29, r25 \n\t"
15123 "adc r29, r25 \n\t"
15127 "adc r29, r25 \n\t"
15131 "adc r29, r25 \n\t"
15135 "adc r29, r25 \n\t"
15139 "add r23, r24 \n\t"
15140 "adc r28, r22 \n\t"
15141 "adc r29, r25 \n\t"
15145 "mul r21, r13 \n\t"
15151 "adc r22, r25 \n\t"
15155 "adc r22, r25 \n\t"
15159 "adc r22, r25 \n\t"
15163 "adc r22, r25 \n\t"
15167 "adc r22, r25 \n\t"
15174 "adc r22, r25 \n\t"
15175 "add r23, r28 \n\t"
15176 "adc r24, r29 \n\t"
15177 "adc r22, r25 \n\t"
15187 "adc r29, r25 \n\t"
15191 "adc r29, r25 \n\t"
15195 "adc r29, r25 \n\t"
15199 "adc r29, r25 \n\t"
15203 "adc r29, r25 \n\t"
15207 "add r23, r24 \n\t"
15208 "adc r28, r22 \n\t"
15209 "adc r29, r25 \n\t"
15219 "adc r22, r25 \n\t"
15223 "adc r22, r25 \n\t"
15227 "adc r22, r25 \n\t"
15231 "adc r22, r25 \n\t"
15238 "adc r22, r25 \n\t"
15239 "add r23, r28 \n\t"
15240 "adc r24, r29 \n\t"
15241 "adc r22, r25 \n\t"
15251 "adc r29, r25 \n\t"
15255 "adc r29, r25 \n\t"
15259 "adc r29, r25 \n\t"
15263 "adc r29, r25 \n\t"
15267 "add r23, r24 \n\t"
15268 "adc r28, r22 \n\t"
15269 "adc r29, r25 \n\t"
15279 "adc r22, r25 \n\t"
15283 "adc r22, r25 \n\t"
15287 "adc r22, r25 \n\t"
15294 "adc r22, r25 \n\t"
15295 "add r23, r28 \n\t"
15296 "adc r24, r29 \n\t"
15297 "adc r22, r25 \n\t"
15307 "adc r29, r25 \n\t"
15311 "adc r29, r25 \n\t"
15315 "adc r29, r25 \n\t"
15319 "add r23, r24 \n\t"
15320 "adc r28, r22 \n\t"
15321 "adc r29, r25 \n\t"
15331 "adc r22, r25 \n\t"
15335 "adc r22, r25 \n\t"
15339 "mul r10, r10 \n\t"
15342 "adc r22, r25 \n\t"
15343 "add r23, r28 \n\t"
15344 "adc r24, r29 \n\t"
15345 "adc r22, r25 \n\t"
15355 "adc r29, r25 \n\t"
15356 "mul r10, r11 \n\t"
15359 "adc r29, r25 \n\t"
15363 "add r23, r24 \n\t"
15364 "adc r28, r22 \n\t"
15365 "adc r29, r25 \n\t"
15372 "mul r10, r12 \n\t"
15375 "adc r22, r25 \n\t"
15379 "mul r11, r11 \n\t"
15382 "adc r22, r25 \n\t"
15383 "add r23, r28 \n\t"
15384 "adc r24, r29 \n\t"
15385 "adc r22, r25 \n\t"
15389 "mul r10, r13 \n\t"
15392 "mul r11, r12 \n\t"
15395 "adc r29, r25 \n\t"
15399 "add r23, r24 \n\t"
15400 "adc r28, r22 \n\t"
15401 "adc r29, r25 \n\t"
15405 "mul r11, r13 \n\t"
15408 "adc r23, r25 \n\t"
15411 "adc r23, r25 \n\t"
15412 "mul r12, r12 \n\t"
15415 "adc r23, r25 \n\t"
15419 "mul r12, r13 \n\t"
15422 "adc r28, r25 \n\t"
15425 "adc r28, r25 \n\t"
15428 "mul r13, r13 \n\t"
15434 : "+x" (p_left), "+z" (p_result)
15436 : "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
15437 "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r28", "r29", "cc", "memory"
15440 #define asm_square 1
15442 #endif /* uECC_BYTES == xx */
15443 #endif /* uECC_SQUARE_FUNC */
15445 static void vli_modSub_fast(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
15449 "push r28 \n\t" /* Save Y */
15452 "ld %[t1], x+ \n\t" /* Load left word. */
15453 "ld %[t2], y+ \n\t" /* Load right word. */
15454 "sub %[t1], %[t2] \n\t" /* Subtract the first word. */
15455 "st z+, %[t1] \n\t" /* Store the first result word. */
15457 /* Now we just do the remaining words with the carry bit (using SBC) */
15458 REPEAT(DEC(uECC_BYTES), "ld %[t1], x+ \n\t"
15459 "ld %[t2], y+ \n\t"
15460 "sbc %[t1], %[t2] \n\t"
15461 "st z+, %[t1] \n\t")
15463 "brcs 1f \n\t" /* If borrow is set, then we need to add */
15464 "rjmp done \n\t" /* otherwise we are done */
15467 "sbiw r30, " STR(uECC_BYTES) " \n\t" /* make z point at p_result again */
15468 "ldi r28, lo8(curve_p) \n\t" /* make y point at curve_p */
15469 "ldi r29, hi8(curve_p) \n\t"
15471 /* do the addition */
15473 "ld %[t2], y+ \n\t"
15474 "add %[t1], %[t2] \n\t"
15475 "st z+, %[t1] \n\t"
15476 REPEAT(DEC(uECC_BYTES), "ld %[t1], z \n\t"
15477 "ld %[t2], y+ \n\t"
15478 "adc %[t1], %[t2] \n\t"
15479 "st z+, %[t1] \n\t")
15482 "pop r29 \n\t" /* Restore Y */
15485 : "+z" (p_result), "+x" (p_left),
15486 [t1] "=&r" (t1), [t2] "=&r" (t2)
15491 #define asm_modSub_fast 1
15493 #if uECC_CURVE == uECC_secp160r1
15494 static void vli_mmod_fast(uint8_t *RESTRICT p_result, uint8_t *RESTRICT p_product)
15496 uint8_t l_carry = 0;
15498 "in r30, __SP_L__ \n\t"
15499 "in r31, __SP_H__ \n\t"
15500 "sbiw r30, 24 \n\t"
15501 "in r0, __SREG__ \n\t"
15503 "out __SP_H__, r31 \n\t"
15504 "out __SREG__, r0 \n\t"
15505 "out __SP_L__, r30 \n\t"
15507 "adiw r30, 25 \n\t" /* we are shifting by 31 bits, so shift over 4 bytes (+ 1 since z initially points below the stack) */
15508 "adiw r26, 40 \n\t" /* end of p_product */
15509 "ld r18, -x \n\t" /* Load word. */
15510 "lsr r18 \n\t" /* Shift. */
15511 "st -z, r18 \n\t" /* Store the first result word. */
15513 /* Now we just do the remaining words with the carry bit (using ROR) */
15514 REPEAT(19, "ld r18, -x \n\t"
15518 "eor r18, r18 \n\t" /* r18 = 0 */
15519 "ror r18 \n\t" /* get last bit */
15520 "st -z, r18 \n\t" /* store it */
15522 "sbiw r30, 3 \n\t" /* move z back to point at tmp */
15523 /* now we add p_right */
15525 "st z+, r18 \n\t" /* the first 3 bytes do not need to be added */
15533 "add r18, r19 \n\t"
15536 /* Now we just do the remaining words with the carry bit (using ADC) */
15537 REPEAT(16, "ld r18, x+ \n\t"
15539 "adc r18, r19 \n\t"
15542 /* Propagate over the remaining bytes of p_result */
15559 "sbiw r30, 24 \n\t" /* move z back to point at tmp */
15560 "sbiw r26, 40 \n\t" /* move x back to point at p_product */
15562 /* add low bytes of tmp to p_product, storing in p_result */
15565 "add r18, r19 \n\t"
15567 REPEAT(19, "ld r18, z+ \n\t"
15569 "adc r18, r19 \n\t"
15571 "adc %[carry], __zero_reg__ \n\t" /* Store carry bit (carry flag is cleared). */
15572 /* at this point x is at the end of p_product, y is at the end of p_result, z is 20 bytes into tmp */
15573 "sbiw r28, 20 \n\t" /* move y back to point at p_result */
15574 "adiw r30, 4 \n\t" /* move z to point to the end of tmp */
15576 /* do omega_mult again with the 4 relevant bytes */
15577 /* z points to the end of tmp, x points to the end of p_product */
15578 "ld r18, -z \n\t" /* Load word. */
15579 "lsr r18 \n\t" /* Shift. */
15580 "st -x, r18 \n\t" /* Store the first result word. */
15592 "eor r18, r18 \n\t" /* r18 = 0 */
15593 "ror r18 \n\t" /* get last bit */
15594 "st -x, r18 \n\t" /* store it */
15596 "sbiw r26, 3 \n\t" /* move x back to point at beginning */
15597 /* now we add a copy of the 4 bytes */
15599 "st x+, r18 \n\t" /* the first 3 bytes do not need to be added */
15607 "add r18, r19 \n\t"
15610 /* Propagate over the remaining bytes */
15627 /* now z points to the end of tmp, x points to the end of p_product (y still points at p_result) */
15628 "sbiw r26, 8 \n\t" /* move x back to point at beginning of actual data */
15629 /* add into p_result */
15632 "add r18, r19 \n\t"
15634 REPEAT(7, "ld r18, x+ \n\t"
15636 "adc r18, r19 \n\t"
15639 /* Done adding, now propagate carry bit */
15640 REPEAT(12, "ld r18, y \n\t"
15641 "adc r18, __zero_reg__ \n\t"
15644 "adc %[carry], __zero_reg__ \n\t" /* Store carry bit (carry flag is cleared). */
15645 "sbiw r28, 20 \n\t" /* move y back to point at p_result */
15647 "sbiw r30, 1 \n\t" /* fix stack pointer */
15648 "in r0, __SREG__ \n\t"
15650 "out __SP_H__, r31 \n\t"
15651 "out __SREG__, r0 \n\t"
15652 "out __SP_L__, r30 \n\t"
15654 : "+x" (p_product), [carry] "+r" (l_carry)
15656 : "r0", "r18", "r19", "r30", "r31", "cc", "memory"
15662 vli_sub(p_result, p_result, curve_p);
15666 vli_sub(p_result, p_result, curve_p);
15669 if(vli_cmp(p_result, curve_p) > 0)
15671 vli_sub(p_result, p_result, curve_p);
15674 #define asm_mmod_fast 1
15676 #elif (uECC_CURVE == uECC_secp256k1)
15677 static void vli_mmod_fast(uint8_t *RESTRICT p_result, uint8_t *RESTRICT p_product)
15679 uint8_t l_carry = 0;
15681 "in r30, __SP_L__ \n\t"
15682 "in r31, __SP_H__ \n\t"
15683 "sbiw r30, 37 \n\t"
15684 "in r0, __SREG__ \n\t"
15686 "out __SP_H__, r31 \n\t"
15687 "out __SREG__, r0 \n\t"
15688 "out __SP_L__, r30 \n\t"
15690 "adiw r30, 1 \n\t" /* add 1 since z initially points below the stack */
15691 "adiw r26, 32 \n\t" /* p_product + uECC_WORDS */
15692 "ldi r25, 0x03 \n\t"
15693 "ldi r24, 0xD1 \n\t"
15699 "mul r24, r18 \n\t"
15704 "mul r24, r19 \n\t"
15706 "adc r23, r1 \n\t" /* can't overflow */
15707 "mul r25, r18 \n\t"
15709 "adc r23, r1 \n\t" /* can't overflow */
15713 "mul r24, r20 \n\t"
15716 "mul r25, r19 \n\t"
15722 "mul r24, r21 \n\t"
15725 "mul r25, r20 \n\t"
15731 /* now we start adding the 2^32 part as well */
15732 "add r23, r18 \n\t" // 28
15733 "adc r22, r22 \n\t"
15735 "mul r24, r18 \n\t"
15738 "mul r25, r21 \n\t"
15744 "add r22, r19 \n\t" // 27
15745 "adc r23, r23 \n\t"
15747 "mul r24, r19 \n\t"
15750 "mul r25, r18 \n\t"
15756 REPEAT(6, // 26 - 3
15757 "add r23, r20 \n\t"
15758 "adc r22, r22 \n\t"
15760 "mul r24, r20 \n\t"
15763 "mul r25, r19 \n\t"
15769 "add r22, r21 \n\t"
15770 "adc r23, r23 \n\t"
15772 "mul r24, r21 \n\t"
15775 "mul r25, r20 \n\t"
15781 "add r23, r18 \n\t"
15782 "adc r22, r22 \n\t"
15784 "mul r24, r18 \n\t"
15787 "mul r25, r21 \n\t"
15793 "add r22, r19 \n\t"
15794 "adc r23, r23 \n\t"
15796 "mul r24, r19 \n\t"
15799 "mul r25, r18 \n\t"
15805 "add r23, r20 \n\t" // 2
15806 "adc r22, r22 \n\t"
15808 "mul r24, r20 \n\t"
15811 "mul r25, r19 \n\t"
15817 "add r22, r21 \n\t" // 1
15818 "adc r23, r23 \n\t"
15820 "mul r24, r21 \n\t"
15823 "mul r25, r20 \n\t"
15829 /* Now finish the carries etc */
15830 "add r23, r18 \n\t"
15831 "adc r22, r22 \n\t"
15832 "mul r25, r21 \n\t"
15838 "add r22, r19 \n\t"
15839 "adc r23, r23 \n\t"
15843 "add r23, r20 \n\t"
15844 "adc r22, r22 \n\t"
15848 "add r22, r21 \n\t"
15849 "adc r23, r23 \n\t"
15852 "eor r1, r1 \n\t" /* make r1 be 0 again */
15854 "sbiw r30, 37 \n\t" /* move z back to point at tmp */
15855 "subi r26, 64 \n\t" /* move x back to point at p_product */
15856 "sbc r27, __zero_reg__ \n\t"
15858 /* add low bytes of tmp to p_product, storing in p_result */
15861 "add r18, r19 \n\t"
15863 REPEAT(31, "ld r18, z+ \n\t"
15865 "adc r18, r19 \n\t"
15868 "adc %[carry], __zero_reg__ \n\t" /* Store carry bit (carry flag is cleared). */
15869 /* at this point x is at the end of p_product, y is at the end of p_result, z is 32 bytes into tmp */
15870 "sbiw r28, 32 \n\t" /* move y back to point at p_result */
15872 /* do omega_mult again with the 5 relevant bytes */
15873 /* z points to l_tmp + uECC_WORDS, x points to the end of p_product */
15874 "sbiw r26, 32 \n\t" /* shift x back to point into the p_product buffer (we can overwrite it now) */
15881 "mul r24, r18 \n\t"
15886 "mul r24, r19 \n\t"
15888 "adc r23, r1 \n\t" /* can't overflow */
15889 "mul r25, r18 \n\t"
15891 "adc r23, r1 \n\t" /* can't overflow */
15895 "mul r24, r20 \n\t"
15898 "mul r25, r19 \n\t"
15904 "mul r24, r21 \n\t"
15907 "mul r25, r20 \n\t"
15913 "add r23, r18 \n\t"
15914 "adc r22, r22 \n\t"
15916 "mul r24, r18 \n\t"
15919 "mul r25, r21 \n\t"
15925 /* Now finish the carries etc */
15926 "add r22, r19 \n\t"
15927 "adc r23, r23 \n\t"
15928 "mul r25, r18 \n\t"
15934 "add r23, r20 \n\t"
15935 "adc r22, r22 \n\t"
15939 "add r22, r21 \n\t"
15940 "adc r23, r23 \n\t"
15944 "add r23, r18 \n\t"
15945 "adc r22, r22 \n\t"
15948 "eor r1, r1 \n\t" /* make r1 be 0 again */
15950 /* now z points to the end of tmp, x points to the end of p_product (y still points at p_result) */
15951 "sbiw r26, 10 \n\t" /* move x back to point at beginning of actual data */
15952 /* add into p_result */
15955 "add r18, r19 \n\t"
15957 REPEAT(9, "ld r18, x+ \n\t"
15959 "adc r18, r19 \n\t"
15962 /* Done adding, now propagate carry bit */
15963 REPEAT(22, "ld r18, y \n\t"
15964 "adc r18, __zero_reg__ \n\t"
15967 "adc %[carry], __zero_reg__ \n\t" /* Store carry bit (carry flag is cleared). */
15968 "sbiw r28, 32 \n\t" /* move y back to point at p_result */
15970 "sbiw r30, 1 \n\t" /* fix stack pointer */
15971 "in r0, __SREG__ \n\t"
15973 "out __SP_H__, r31 \n\t"
15974 "out __SREG__, r0 \n\t"
15975 "out __SP_L__, r30 \n\t"
15977 : "+x" (p_product), [carry] "+r" (l_carry)
15979 : "r0", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r30", "r31", "cc", "memory"
15985 vli_sub(p_result, p_result, curve_p);
15989 vli_sub(p_result, p_result, curve_p);
15992 if(vli_cmp(p_result, curve_p) > 0)
15994 vli_sub(p_result, p_result, curve_p);
15997 #define asm_mmod_fast 1
15999 #endif /* (uECC_CURVE == uECC_secp256k1) */
16001 #endif /* (uECC_ASM == uECC_asm_fast) */
16004 static void vli_rshift1(uint8_t *p_vli)
16006 uint8_t i = uECC_BYTES;
16008 "adiw r30, " STR(uECC_BYTES) " \n\t"
16018 : "+z" (p_vli), [i] "+r" (i)
16020 : "r0", "cc", "memory"
16023 #define asm_rshift1 1
16027 static uint8_t vli_add(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
16029 uint8_t i = uECC_BYTES;
16030 uint8_t l_carry = 0;
16038 "ld %[left], x+ \n\t" /* Load left byte. */
16039 "ld %[right], y+ \n\t" /* Load right byte. */
16040 "adc %[left], %[right] \n\t" /* Add. */
16041 "st z+, %[left] \n\t" /* Store the result. */
16045 "adc %[carry], %[carry] \n\t" /* Store carry bit in l_carry. */
16047 "sbiw r28, " STR(uECC_BYTES) " \n\t" /* Restore Y */
16049 : "+z" (p_result), "+x" (p_left), [i] "+r" (i),
16050 [carry] "+r" (l_carry), [left] "=&r" (l_left), [right] "=&r" (l_right)
16060 static uint8_t vli_sub(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
16062 uint8_t i = uECC_BYTES;
16063 uint8_t l_borrow = 0;
16071 "ld %[left], x+ \n\t" /* Load left byte. */
16072 "ld %[right], y+ \n\t" /* Load right byte. */
16073 "sbc %[left], %[right] \n\t" /* Subtract. */
16074 "st z+, %[left] \n\t" /* Store the result. */
16078 "adc %[borrow], %[borrow] \n\t" /* Store carry bit in l_borrow. */
16080 "sbiw r28, " STR(uECC_BYTES) " \n\t" /* Restore Y */
16082 : "+z" (p_result), "+x" (p_left), [i] "+r" (i),
16083 [borrow] "+r" (l_borrow), [left] "=&r" (l_left), [right] "=&r" (l_right)
16093 __attribute((noinline))
16094 static void vli_mult(uint8_t *p_result, uint8_t *p_left, uint8_t *p_right)
16100 uint8_t l_zero = 0;
16105 "ldi %[k], 1 \n\t" /* k = 1; k < uECC_BYTES; ++k */
16108 "ldi %[i], 0 \n\t" /* i=0; i < k; ++i */
16110 "add r28, %[k] \n\t" /* pre-add right ptr */
16111 "adc r29, %[zero] \n\t"
16118 "add %[r0], r0 \n\t"
16119 "adc %[r1], r1 \n\t"
16120 "adc %[r2], %[zero] \n\t"
16123 "cp %[i], %[k] \n\t"
16124 "brlo 2b \n\t" /* loop if i < k */
16126 "sub r26, %[k] \n\t" /* fix up left ptr */
16127 "sbc r27, %[zero] \n\t"
16129 "st z+, %[r0] \n\t" /* Store the result. */
16130 "mov %[r0], %[r1] \n\t"
16131 "mov %[r1], %[r2] \n\t"
16132 "mov %[r2], %[zero] \n\t"
16135 "cpi %[k], " STR(uECC_BYTES) " \n\t"
16136 "brlo 1b \n\t" /* loop if k < uECC_BYTES */
16139 "ldi %[k], " STR(uECC_BYTES) " \n\t" /* k = uECC_BYTES; k > 0; --k */
16140 "adiw r28, " STR(uECC_BYTES) " \n\t" /* move right ptr to point at the end of p_right */
16143 "ldi %[i], 0 \n\t" /* i=0; i < k; ++i */
16150 "add %[r0], r0 \n\t"
16151 "adc %[r1], r1 \n\t"
16152 "adc %[r2], %[zero] \n\t"
16155 "cp %[i], %[k] \n\t"
16156 "brlo 2b \n\t" /* loop if i < k */
16158 "add r28, %[k] \n\t" /* fix up right ptr */
16159 "adc r29, %[zero] \n\t"
16161 "st z+, %[r0] \n\t" /* Store the result. */
16162 "mov %[r0], %[r1] \n\t"
16163 "mov %[r1], %[r2] \n\t"
16164 "mov %[r2], %[zero] \n\t"
16167 "sub r26, %[k] \n\t" /* fix up left ptr (after k is decremented, so next time we start 1 higher) */
16168 "sbc r27, %[zero] \n\t"
16171 "brne 1b \n\t" /* loop if k > 0 */
16173 "st z+, %[r0] \n\t" /* Store last result byte. */
16175 "eor r1, r1 \n\t" /* fix r1 to be 0 again */
16177 "sbiw r28, " STR(uECC_BYTES) " \n\t" /* Restore Y */
16179 : "+z" (p_result), "+x" (p_left),
16180 [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [zero] "+r" (l_zero),
16181 [k] "=&a" (k), [i] "=&a" (i)
16183 : "r0", "cc", "memory"
16189 #if uECC_SQUARE_FUNC
16191 static void vli_square(uint8_t *p_result, uint8_t *p_left)
16197 uint8_t l_zero = 0;
16202 "ldi %[k], 1 \n\t" /* k = 1; k < uECC_BYTES*2; ++k */
16206 "movw r26, %[orig] \n\t" /* copy orig ptr to 'left' ptr */
16207 "movw r30, %[orig] \n\t" /* copy orig ptr to 'right' ptr */
16208 "cpi %[k], " STR(uECC_BYTES) " \n\t"
16212 /* when k > uECC_BYTES, we start from (k - uECC_BYTES) on the 'left' ptr */
16213 "add r26, %[k] \n\t"
16214 "adc r27, %[zero] \n\t"
16215 "subi r26, " STR(uECC_BYTES) " \n\t"
16216 "sbc r27, %[zero] \n\t"
16217 "adiw r30, " STR(uECC_BYTES) " \n\t" /* move right ptr to point at the end */
16220 "2: \n\t" /* when k <= uECC_BYTES, we add k to the 'right' ptr */
16221 "add r30, %[k] \n\t" /* pre-add 'right' ptr */
16222 "adc r31, %[zero] \n\t"
16226 "cp r26, r30 \n\t" /* if left == right here, then we are done after this mult (and we don't need to double) */
16231 /* add twice since it costs the same as doubling */
16232 "add %[r0], r0 \n\t"
16233 "adc %[r1], r1 \n\t"
16234 "adc %[r2], %[zero] \n\t"
16235 "add %[r0], r0 \n\t"
16236 "adc %[r1], r1 \n\t"
16237 "adc %[r2], %[zero] \n\t"
16239 "cpse r26, r30 \n\t" /* if left == right here, then we are done */
16241 "rjmp 5f \n\t" /* skip code for non-doubled mult */
16246 "add %[r0], r0 \n\t"
16247 "adc %[r1], r1 \n\t"
16248 "adc %[r2], %[zero] \n\t"
16251 "movw r30, %[result] \n\t" /* make z point to result */
16252 "st z+, %[r0] \n\t" /* Store the result. */
16253 "movw %[result], r30 \n\t" /* update result ptr*/
16254 "mov %[r0], %[r1] \n\t"
16255 "mov %[r1], %[r2] \n\t"
16256 "mov %[r2], %[zero] \n\t"
16259 "cpi %[k], %[max] \n\t"
16260 "brlo 1b \n\t" /* loop if k < uECC_BYTES */
16262 "movw r30, %[result] \n\t" /* make z point to result */
16263 "st z+, %[r0] \n\t" /* Store last result byte. */
16265 "eor r1, r1 \n\t" /* fix r1 to be 0 again */
16267 : [result] "+r" (p_result),
16268 [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), [zero] "+r" (l_zero),
16270 : [orig] "r" (p_left), [max] "M" (2*uECC_BYTES)
16271 : "r0", "r26", "r27", "r30", "r31", "cc", "memory"
16274 #define asm_square 1
16276 #endif /* uECC_SQUARE_FUNC */