Made square asm better.

This commit is contained in:
Ken MacKay
2014-03-04 21:15:34 -08:00
parent 412ace6b61
commit 86a33b4334
2 changed files with 80 additions and 175 deletions
+66 -165
View File
@@ -2414,13 +2414,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r5 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r4 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2433,13 +2430,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r6 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r5 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2456,13 +2450,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r7 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r6 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2479,13 +2470,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r8 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r7 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2506,13 +2494,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r9 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r8 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2533,13 +2518,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r10 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r9 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2564,13 +2546,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r11 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r10 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2595,13 +2574,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r12 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r11 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2630,13 +2606,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r13 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r12 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2665,13 +2638,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r14 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r13 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2704,13 +2674,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r15 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r14 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2743,13 +2710,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r16 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r15 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2786,13 +2750,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r17 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r16 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2829,13 +2790,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r18 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r17 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2876,13 +2834,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r19 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r18 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -2923,13 +2878,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r2, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r3, r19 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -2974,13 +2926,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r2, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r3, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3025,13 +2974,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r3, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r4, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3076,13 +3022,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r4, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r5, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3123,13 +3066,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r5, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r6, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3170,13 +3110,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r6, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r7, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3213,13 +3150,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r7, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r8, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3256,13 +3190,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r8, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r9, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3295,13 +3226,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r9, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r10, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3334,13 +3262,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r10, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r11, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3369,13 +3294,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r11, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r12, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3404,13 +3326,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r12, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r13, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3435,13 +3354,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r13, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r14, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3466,13 +3382,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r14, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r15, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3493,13 +3406,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r15, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r16, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3520,13 +3430,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r16, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r17, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
@@ -3543,13 +3450,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r26, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r24, 0 \n\t"
"ldi r22, 0 \n\t"
"mul r17, r21 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
"adc r22, r27 \n\t"
"mov r23, r0 \n\t"
"mov r24, r1 \n\t"
"mul r18, r20 \n\t"
"add r23, r0 \n\t"
"adc r24, r1 \n\t"
@@ -3566,13 +3470,10 @@ static void vli_square(uint8_t *p_result, uint8_t *p_left)
"adc r22, r27 \n\t"
"st z+, r23 \n\t"
"ldi r23, 0 \n\t"
"ldi r25, 0 \n\t"
"ldi r26, 0 \n\t"
"mul r18, r21 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
"adc r26, r27 \n\t"
"mov r23, r0 \n\t"
"mov r25, r1 \n\t"
"mul r19, r20 \n\t"
"add r23, r0 \n\t"
"adc r25, r1 \n\t"
+14 -10
View File
@@ -48,8 +48,6 @@ print ""
acc = [23, 24, 22]
old_acc = [25, 26]
for i in xrange(3, 20):
emit("ldi r%s, 0", acc[0])
emit("ldi r%s, 0", old_acc[0])
emit("ldi r%s, 0", old_acc[1])
tmp = [acc[1], acc[2]]
acc = [acc[0], old_acc[0], old_acc[1]]
@@ -58,9 +56,13 @@ for i in xrange(3, 20):
# gather non-equal words
for j in xrange(0, (i+1)//2):
emit("mul r%s, r%s", r(j), r(i-j))
emit("add r%s, r0", acc[0])
emit("adc r%s, r1", acc[1])
emit("adc r%s, r27", acc[2])
if j == 0:
emit("mov r%s, r0", acc[0])
emit("mov r%s, r1", acc[1])
else:
emit("add r%s, r0", acc[0])
emit("adc r%s, r1", acc[1])
emit("adc r%s, r27", acc[2])
# multiply by 2
emit("lsl r%s", acc[0])
emit("rol r%s", acc[1])
@@ -83,8 +85,6 @@ for i in xrange(3, 20):
print ""
for i in xrange(1, 17):
emit("ldi r%s, 0", acc[0])
emit("ldi r%s, 0", old_acc[0])
emit("ldi r%s, 0", old_acc[1])
tmp = [acc[1], acc[2]]
acc = [acc[0], old_acc[0], old_acc[1]]
@@ -93,9 +93,13 @@ for i in xrange(1, 17):
# gather non-equal words
for j in xrange(0, (20-i)//2):
emit("mul r%s, r%s", r(i+j), r(19-j))
emit("add r%s, r0", acc[0])
emit("adc r%s, r1", acc[1])
emit("adc r%s, r27", acc[2])
if j == 0:
emit("mov r%s, r0", acc[0])
emit("mov r%s, r1", acc[1])
else:
emit("add r%s, r0", acc[0])
emit("adc r%s, r1", acc[1])
emit("adc r%s, r27", acc[2])
# multiply by 2
emit("lsl r%s", acc[0])
emit("rol r%s", acc[1])