From 86a33b4334eda4c6e2fc15f2c4dcd22d6baa294f Mon Sep 17 00:00:00 2001 From: Ken MacKay Date: Tue, 4 Mar 2014 21:14:53 -0800 Subject: [PATCH] Made square asm better. --- ecc.c | 231 ++++++++++++++++-------------------------------------- square.py | 24 +++--- 2 files changed, 80 insertions(+), 175 deletions(-) diff --git a/ecc.c b/ecc.c index eca8d2f..8a91a87 100644 --- a/ecc.c +++ b/ecc.c @@ -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" diff --git a/square.py b/square.py index eabcfa6..fa1fc0b 100755 --- a/square.py +++ b/square.py @@ -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])