summaryrefslogtreecommitdiff
path: root/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s')
-rw-r--r--sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s1604
1 files changed, 1604 insertions, 0 deletions
diff --git a/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s b/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s
new file mode 100644
index 0000000..effdc6a
--- /dev/null
+++ b/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/bn/asm/bn_m68k.s
@@ -0,0 +1,1604 @@
+/* Copyright (C) 2002 by Howard Chu <hyc@highlandsun.com>
+ *
+ * Rights for redistribution and usage in source and binary forms are
+ * granted according to the OpenSSL license. Warranty of any kind is
+ * disclaimed.
+ */
+
+/* This file is written for GNU as. All of the code is hand written by
+ * me. The code is suitable for Motorola 68020-68060 and all CPU32-based
+ * processors providing 64-bit multiply/divide instructions. On a 68030
+ * this code is over 4 times faster than the gcc -O3 code for RSA/DSA.
+ * I haven't paid any attention to instruction sequencing; there may be
+ * room for some further improvement.
+ */
+
+.text
+ .even
+.globl _bn_mul_add_words
+_bn_mul_add_words:
+ movm.l #0x3c00,-(sp)
+ move.l 20(sp),a0
+ move.l 24(sp),a1
+ clr.l d0
+ move.l d0,d5 /* Keep a 0 handy for addx carry bits */
+ move.l 28(sp),d4
+ jble 3f
+
+ move.l 32(sp),d3
+ moveq.l #-4,d2
+ and.l d4,d2
+ jbeq 2f
+1:
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ moveq.l #-4,d2
+ add.l d2,d4
+ and.l d4,d2
+ jbne 1b
+2:
+ tst.l d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ subq.l #1,d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ subq.l #1,d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ add.l (a0),d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+3:
+ movm.l (sp)+,#0x003c
+ rts
+
+ .even
+.globl _bn_mul_words
+_bn_mul_words:
+ movm.l #0x3c00,-(sp)
+ move.l 20(sp),a0
+ move.l 24(sp),a1
+ clr.l d0
+ move.l d0,d5
+ move.l 28(sp),d4
+ jble 3f
+
+ move.l 32(sp),d3
+ moveq.l #-4,d2
+ and.l d4,d2
+ jbeq 2f
+1:
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ moveq.l #-4,d2
+ add.l d2,d4
+ and.l d4,d2
+ jbne 1b
+2:
+ tst.l d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ subq.l #1,d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+
+ subq.l #1,d4
+ jbeq 3f
+
+ move.l d3,d1
+ mulu.l (a1)+,d2:d1
+ add.l d0,d1
+ addx.l d5,d2
+ move.l d1,(a0)+
+ move.l d2,d0
+3:
+ movm.l (sp)+,#0x003c
+ rts
+
+ .even
+.globl _bn_sqr_words
+_bn_sqr_words:
+ move.l d2,-(sp)
+ move.l 8(sp),a0
+ move.l 12(sp),a1
+ move.l 16(sp),d2
+ jble 3f
+
+ moveq.l #-4,d1
+ and.l d2,d1
+ jbeq 2f
+1:
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ moveq.l #-4,d1
+ add.l d1,d2
+ and.l d2,d1
+ jbne 1b
+2:
+ tst.l d2
+ jbeq 3f
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ subq.l #1,d2
+ jbeq 3f
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+
+ subq.l #1,d2
+ jbeq 3f
+
+ move.l (a1)+,d0
+ mulu.l d0,d1:d0
+ move.l d0,(a0)+
+ move.l d1,(a0)+
+3:
+ move.l (sp)+,d2
+ rts
+
+ .even
+.globl _bn_mul_comba8
+_bn_mul_comba8:
+ movm.l #0x3c20,-(sp)
+ movm.l 24(sp),#0x0700
+ clr.l d2
+ move.l d2,d3
+ move.l d2,d4
+ move.l d2,d5
+ move.l (a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l d2,(a0)
+ move.l d5,d2
+ move.l (a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 4(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l d3,4(a0)
+ move.l d5,d3
+ move.l 8(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 4(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l (a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l d4,8(a0)
+ move.l d5,d4
+ move.l (a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 4(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 8(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 12(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l d2,12(a0)
+ move.l d5,d2
+ move.l 16(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 12(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 8(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 4(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l (a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l d3,16(a0)
+ move.l d5,d3
+ move.l (a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 4(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 8(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 12(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 16(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 20(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l d4,20(a0)
+ move.l d5,d4
+ move.l 24(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 20(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 16(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 12(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 8(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 4(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l (a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l d2,24(a0)
+ move.l d5,d2
+ move.l (a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 4(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 8(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 12(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 16(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 20(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 24(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 28(a1),d0
+ move.l (a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l d3,28(a0)
+ move.l d5,d3
+ move.l 28(a1),d0
+ move.l 4(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 24(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 20(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 16(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 12(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 8(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 4(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l d4,32(a0)
+ move.l d5,d4
+ move.l 8(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 12(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 16(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 20(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 24(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 28(a1),d0
+ move.l 8(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l d2,36(a0)
+ move.l d5,d2
+ move.l 28(a1),d0
+ move.l 12(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 24(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 20(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 16(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 12(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l d3,40(a0)
+ move.l d5,d3
+ move.l 16(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 20(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 24(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l 28(a1),d0
+ move.l 16(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l d4,44(a0)
+ move.l d5,d4
+ move.l 28(a1),d0
+ move.l 20(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 24(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l 20(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d2
+ addx.l d1,d3
+ addx.l d5,d4
+
+ move.l d2,48(a0)
+ move.l d5,d2
+ move.l 24(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l 28(a1),d0
+ move.l 24(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d3
+ addx.l d1,d4
+ addx.l d5,d2
+
+ move.l d3,52(a0)
+ move.l d5,d3
+ move.l 28(a1),d0
+ move.l 28(a2),d1
+
+ mulu.l d1,d1:d0
+ add.l d0,d4
+ addx.l d1,d2
+ addx.l d5,d3
+
+ move.l d4,56(a0)
+ move.l d2,60(a0)
+
+ movm.l (sp)+,#0x043c
+ rts
+
+ .even
+.globl _bn_sqr_comba8
+_bn_sqr_comba8:
+ movm.l #0x3e00,-(sp)
+ move.l 24(sp),a1
+ move.l 28(sp),a0
+ clr.l d5
+ move.l (a0),d1
+ move.l d5,d3
+ move.l d5,d4
+ move.l d5,d6
+
+ mulu.l d1,d0:d1
+ add.l d1,d5
+ addx.l d0,d3
+ addx.l d6,d4
+
+ move.l d5,(a1)
+ move.l d6,d5
+ move.l 4(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l d3,4(a1)
+ move.l d6,d3
+ move.l 4(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d5
+ addx.l d6,d3
+
+ move.l 8(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l d4,8(a1)
+ move.l d6,d4
+ move.l 12(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l 8(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l d5,12(a1)
+ move.l d6,d5
+ move.l 8(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d4
+ addx.l d6,d5
+
+ move.l 12(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l 16(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l d3,16(a1)
+ move.l d6,d3
+ move.l 20(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l 16(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l 12(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l d4,20(a1)
+ move.l d6,d4
+ move.l 12(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d5
+ addx.l d0,d3
+ addx.l d6,d4
+
+ move.l 16(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l 20(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l 24(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l d5,24(a1)
+ move.l d6,d5
+ move.l 28(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l 24(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l 20(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l 16(a0),d2
+ move.l 12(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l d3,28(a1)
+ move.l d6,d3
+ move.l 16(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d5
+ addx.l d6,d3
+
+ move.l 20(a0),d2
+ move.l 12(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l 24(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l 28(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l d4,32(a1)
+ move.l d6,d4
+ move.l 28(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l 24(a0),d2
+ move.l 12(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l 20(a0),d2
+ move.l 16(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l d5,36(a1)
+ move.l d6,d5
+ move.l 20(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d4
+ addx.l d6,d5
+
+ move.l 24(a0),d2
+ move.l 16(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l 28(a0),d2
+ move.l 12(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l d3,40(a1)
+ move.l d6,d3
+ move.l 28(a0),d2
+ move.l 16(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l 24(a0),d2
+ move.l 20(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+ add.l d1,d4
+ addx.l d2,d5
+ addx.l d6,d3
+
+ move.l d4,44(a1)
+ move.l d6,d4
+ move.l 24(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d5
+ addx.l d0,d3
+ addx.l d6,d4
+
+ move.l 28(a0),d2
+ move.l 20(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+ add.l d1,d5
+ addx.l d2,d3
+ addx.l d6,d4
+
+ move.l d5,48(a1)
+ move.l d6,d5
+ move.l 28(a0),d2
+ move.l 24(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+ add.l d1,d3
+ addx.l d2,d4
+ addx.l d6,d5
+
+ move.l d3,52(a1)
+ move.l d6,d3
+ move.l 28(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d5
+ addx.l d6,d3
+
+ move.l d4,56(a1)
+ move.l d5,60(a1)
+ movm.l (sp)+,#0x7c
+ rts
+
+ .even
+.globl _bn_sqr_comba4
+_bn_sqr_comba4:
+ movm.l #0x3e00,-(sp)
+ move.l 24(sp),a1
+ move.l 28(sp),a0
+ clr.l d5
+ move.l (a0),d1
+ move.l d5,d4
+ move.l d5,d3
+ move.l d5,d6
+
+ mulu.l d1,d0:d1
+ add.l d1,d5
+ addx.l d0,d4
+ addx.l d6,d3
+
+ move.l d5,(a1)
+ move.l d6,d5
+ move.l 4(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d3
+ addx.l d6,d5
+ add.l d1,d4
+ addx.l d2,d3
+ addx.l d6,d5
+
+ move.l d4,4(a1)
+ move.l d6,d4
+ move.l 4(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d5
+ addx.l d6,d4
+
+ move.l 8(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d5
+ addx.l d6,d4
+ add.l d1,d3
+ addx.l d2,d5
+ addx.l d6,d4
+
+ move.l d3,8(a1)
+ move.l d6,d3
+ move.l 12(a0),d2
+ move.l (a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d4
+ addx.l d6,d3
+ add.l d1,d5
+ addx.l d2,d4
+ addx.l d6,d3
+
+ move.l 8(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d5
+ addx.l d2,d4
+ addx.l d6,d3
+ add.l d1,d5
+ addx.l d2,d4
+ addx.l d6,d3
+
+ move.l d5,12(a1)
+ move.l d6,d5
+ move.l 8(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d6,d5
+
+ move.l 12(a0),d2
+ move.l 4(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d4
+ addx.l d2,d3
+ addx.l d6,d5
+ add.l d1,d4
+ addx.l d2,d3
+ addx.l d6,d5
+
+ move.l d4,16(a1)
+ move.l d6,d4
+ move.l 12(a0),d2
+ move.l 8(a0),d1
+
+ mulu.l d2,d2:d1
+ add.l d1,d3
+ addx.l d2,d5
+ addx.l d6,d4
+ add.l d1,d3
+ addx.l d2,d5
+ addx.l d6,d4
+
+ move.l d3,20(a1)
+ move.l d6,d3
+ move.l 12(a0),d1
+
+ mulu.l d1,d0:d1
+ add.l d1,d5
+ addx.l d0,d4
+ addx.l d6,d3
+
+ move.l d5,24(a1)
+ move.l d4,28(a1)
+ movm.l (sp)+,#0x7c
+ rts
+
+ .even
+.globl _bn_mul_comba4
+_bn_mul_comba4:
+ movm.l #0x3c20,-(sp)
+ move.l 24(sp),a2
+ move.l 28(sp),a0
+ move.l 32(sp),a1
+ clr.l d4
+ move.l (a0),d1
+ move.l (a1),d0
+ move.l d4,d3
+ move.l d4,d2
+ move.l d4,d5
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l d4,(a2)
+ move.l d5,d4
+ move.l (a0),d1
+ move.l 4(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d2
+ addx.l d5,d4
+
+ move.l 4(a0),d1
+ move.l (a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d2
+ addx.l d5,d4
+
+ move.l d3,4(a2)
+ move.l d5,d3
+ move.l 8(a0),d1
+ move.l (a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d2
+ addx.l d0,d4
+ addx.l d5,d3
+
+ move.l 4(a0),d1
+ move.l 4(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d2
+ addx.l d0,d4
+ addx.l d5,d3
+
+ move.l (a0),d1
+ move.l 8(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d2
+ addx.l d0,d4
+ addx.l d5,d3
+
+ move.l d2,8(a2)
+ move.l d5,d2
+ move.l (a0),d1
+ move.l 12(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l 4(a0),d1
+ move.l 8(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l 8(a0),d1
+ move.l 4(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l 12(a0),d1
+ move.l (a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l d4,12(a2)
+ move.l d5,d4
+ move.l 12(a0),d1
+ move.l 4(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d2
+ addx.l d5,d4
+
+ move.l 8(a0),d1
+ move.l 8(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d2
+ addx.l d5,d4
+
+ move.l 4(a0),d1
+ move.l 12(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d3
+ addx.l d0,d2
+ addx.l d5,d4
+
+ move.l d3,16(a2)
+ move.l d5,d3
+ move.l 8(a0),d1
+ move.l 12(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d2
+ addx.l d0,d4
+ addx.l d5,d3
+
+ move.l 12(a0),d1
+ move.l 8(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d2
+ addx.l d0,d4
+ addx.l d5,d3
+
+ move.l d2,20(a2)
+ move.l d5,d2
+ move.l 12(a0),d1
+ move.l 12(a1),d0
+
+ mulu.l d1,d0:d1
+ add.l d1,d4
+ addx.l d0,d3
+ addx.l d5,d2
+
+ move.l d4,24(a2)
+ move.l d3,28(a2)
+ movm.l (sp)+,#0x43c
+ rts
+
+/* bn_div_words should really just be inlined wherever it's used */
+
+ .even
+.globl _bn_div_words
+_bn_div_words:
+ move.l 4(sp),d1
+ move.l 8(sp),d0
+ divu.l 12(sp),d1:d0
+ rts
+
+ .even
+.globl _bn_add_words
+_bn_add_words:
+ movm.l #0x2030,-(sp)
+ movm.l 16(sp),#0x0f00
+ clr.l d0
+ tst.l a3
+ jble 3f
+
+/* d0 is 0, use this shift to clear the eXtend bit */
+ lsl.l #1,d0
+1:
+ move.l (a1)+,d1
+ move.l (a2)+,d2
+ addx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d1
+ move.l (a2)+,d2
+ addx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d1
+ move.l (a2)+,d2
+ addx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d1
+ move.l (a2)+,d2
+ addx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jgt 1b
+2:
+ addx.l d0,d0
+3:
+ movm.l (sp)+,#0x0c04
+ rts
+
+ .even
+.globl _bn_sub_words
+_bn_sub_words:
+ movm.l #0x2030,-(sp)
+ movm.l 16(sp),#0x0f00
+ clr.l d0
+ tst.l a3
+ jble 3f
+
+ lsl.l #1,d0
+1:
+ move.l (a1)+,d2
+ move.l (a2)+,d1
+ subx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d2
+ move.l (a2)+,d1
+ subx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d2
+ move.l (a2)+,d1
+ subx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jble 2f
+
+ move.l (a1)+,d2
+ move.l (a2)+,d1
+ subx.l d1,d2
+ move.l d2,(a0)+
+ subq.l #1,a3
+ tst.l a3
+ jgt 1b
+2:
+ addx.l d0,d0
+3:
+ movm.l (sp)+,#0x0c04
+ rts