
 # DEC Alpha assember
 # The bn_div64 is actually gcc output but the other parts are hand done.
 # Thanks to tzeruch@ceddec.com for sending me the gcc output for
 # bn_div64.
 # I've gone back and re-done most of routines.
 # The key thing to remeber for the 164 CPU is that while a
 # multiply operation takes 8 cycles, another one can only be issued
 # after 4 cycles have elapsed.  I've done modification to help
 # improve this.  Also, normally, a ld instruction will not be available
 # for about 3 cycles.
	.file	1 "bn_asm.c"
	.set noat
gcc2_compiled.:
__gnu_compiled_c:
	.text
	.align 3
	.globl bn_mul_add_words
	.ent bn_mul_add_words
bn_mul_add_words:
bn_mul_add_words..ng:
	.frame $30,0,$26,0
	.prologue 0
	.align 5
	subq	$18,4,$18
	bis	$31,$31,$0
	blt	$18,$43		# if we are -1, -2, -3 or -4 goto tail code
	ldq	$20,0($17)	# 1 1
	ldq	$1,0($16)	# 1 1
	.align 3
$42:
	mulq	$20,$19,$5	# 1 2 1	######
	ldq	$21,8($17)	# 2 1
	ldq	$2,8($16)	# 2 1
	umulh	$20,$19,$20	# 1 2	######
	ldq	$27,16($17)	# 3 1
	ldq	$3,16($16)	# 3 1
	mulq	$21,$19,$6	# 2 2 1	######
	 ldq	$28,24($17)	# 4 1
	addq	$1,$5,$1	# 1 2 2
	 ldq	$4,24($16)	# 4 1
	umulh	$21,$19,$21	# 2 2	######
	 cmpult	$1,$5,$22	# 1 2 3 1
	addq	$20,$22,$20	# 1 3 1
	 addq	$1,$0,$1	# 1 2 3 1
	mulq	$27,$19,$7	# 3 2 1	######
	 cmpult	$1,$0,$0	# 1 2 3 2
	addq	$2,$6,$2	# 2 2 2
	 addq	$20,$0,$0	# 1 3 2 
	cmpult	$2,$6,$23	# 2 2 3 1
	 addq	$21,$23,$21	# 2 3 1
	umulh	$27,$19,$27	# 3 2	######
	 addq	$2,$0,$2	# 2 2 3 1
	cmpult	$2,$0,$0	# 2 2 3 2
	 subq	$18,4,$18
	mulq	$28,$19,$8	# 4 2 1	######
	 addq	$21,$0,$0	# 2 3 2 
	addq	$3,$7,$3	# 3 2 2
	 addq	$16,32,$16
	cmpult	$3,$7,$24	# 3 2 3 1
	 stq	$1,-32($16)	# 1 2 4
	umulh	$28,$19,$28	# 4 2	######
	 addq	$27,$24,$27	# 3 3 1
	addq	$3,$0,$3	# 3 2 3 1
	 stq	$2,-24($16)	# 2 2 4
	cmpult	$3,$0,$0	# 3 2 3 2
	 stq	$3,-16($16)	# 3 2 4
	addq	$4,$8,$4	# 4 2 2
	 addq	$27,$0,$0	# 3 3 2 
	cmpult	$4,$8,$25	# 4 2 3 1
	 addq	$17,32,$17
	addq	$28,$25,$28	# 4 3 1
	 addq	$4,$0,$4	# 4 2 3 1
	cmpult	$4,$0,$0	# 4 2 3 2
	 stq	$4,-8($16)	# 4 2 4
	addq	$28,$0,$0	# 4 3 2 
	 blt	$18,$43

	ldq	$20,0($17)	# 1 1
	ldq	$1,0($16)	# 1 1

	br	$42

	.align 4
$45:
	ldq	$20,0($17)	# 4 1
	ldq	$1,0($16)	# 4 1
	mulq	$20,$19,$5	# 4 2 1
	subq	$18,1,$18
	addq	$16,8,$16
	addq	$17,8,$17
	umulh	$20,$19,$20	# 4 2
	addq	$1,$5,$1	# 4 2 2
	cmpult	$1,$5,$22	# 4 2 3 1
	addq	$20,$22,$20	# 4 3 1
	addq	$1,$0,$1	# 4 2 3 1
	cmpult	$1,$0,$0	# 4 2 3 2
	addq	$20,$0,$0	# 4 3 2 
	stq	$1,-8($16)	# 4 2 4
	bgt	$18,$45
	ret	$31,($26),1	# else exit

	.align 4
$43:
	addq	$18,4,$18
	bgt	$18,$45		# goto tail code
	ret	$31,($26),1	# else exit

	.end bn_mul_add_words
	.align 3
	.globl bn_mul_words
	.ent bn_mul_words
bn_mul_words:
bn_mul_words..ng:
	.frame $30,0,$26,0
	.prologue 0
	.align 5
	subq	$18,4,$18
	bis	$31,$31,$0
	blt	$18,$143	# if we are -1, -2, -3 or -4 goto tail code
	ldq	$20,0($17)	# 1 1
	.align 3
$142:

	mulq	$20,$19,$5	# 1 2 1	#####
	 ldq	$21,8($17)	# 2 1
	 ldq	$27,16($17)	# 3 1
	umulh	$20,$19,$20	# 1 2	#####
	 ldq	$28,24($17)	# 4 1
	mulq	$21,$19,$6	# 2 2 1	#####
	 addq	$5,$0,$5	# 1 2 3 1
	subq	$18,4,$18
	 cmpult	$5,$0,$0	# 1 2 3 2
	umulh	$21,$19,$21	# 2 2	#####
	 addq	$20,$0,$0	# 1 3 2 
	addq	$17,32,$17
	 addq	$6,$0,$6	# 2 2 3 1
	mulq	$27,$19,$7	# 3 2 1	#####
	 cmpult	$6,$0,$0	# 2 2 3 2
	addq	$21,$0,$0	# 2 3 2 
	 addq	$16,32,$16
	umulh	$27,$19,$27	# 3 2	#####
	 stq	$5,-32($16)	# 1 2 4
	mulq	$28,$19,$8	# 4 2 1	#####
	 addq	$7,$0,$7	# 3 2 3 1
	stq	$6,-24($16)	# 2 2 4
	 cmpult	$7,$0,$0	# 3 2 3 2
	umulh	$28,$19,$28	# 4 2	#####
	 addq	$27,$0,$0	# 3 3 2 
	stq	$7,-16($16)	# 3 2 4
	 addq	$8,$0,$8	# 4 2 3 1
	cmpult	$8,$0,$0	# 4 2 3 2

	addq	$28,$0,$0	# 4 3 2 

	stq	$8,-8($16)	# 4 2 4

	blt	$18,$143

	ldq	$20,0($17)	# 1 1

	br	$142

	.align 4
$145:
	ldq	$20,0($17)	# 4 1
	mulq	$20,$19,$5	# 4 2 1
	subq	$18,1,$18
	umulh	$20,$19,$20	# 4 2
	addq	$5,$0,$5	# 4 2 3 1
	 addq	$16,8,$16
	cmpult	$5,$0,$0	# 4 2 3 2
	 addq	$17,8,$17
	addq	$20,$0,$0	# 4 3 2 
	stq	$5,-8($16)	# 4 2 4

	bgt	$18,$145
	ret	$31,($26),1	# else exit

	.align 4
$143:
	addq	$18,4,$18
	bgt	$18,$145	# goto tail code
	ret	$31,($26),1	# else exit

	.end bn_mul_words
	.align 3
	.globl bn_sqr_words
	.ent bn_sqr_words
bn_sqr_words:
bn_sqr_words..ng:
	.frame $30,0,$26,0
	.prologue 0

	subq	$18,4,$18
	blt	$18,$543	# if we are -1, -2, -3 or -4 goto tail code
	ldq	$20,0($17)	# 1 1
	.align 3
$542:
	mulq	$20,$20,$5		######
	 ldq	$21,8($17)	# 1 1
	subq	$18,4
 	umulh	$20,$20,$1		######
	ldq	$27,16($17)	# 1 1
	mulq	$21,$21,$6		######
	ldq	$28,24($17)	# 1 1
	stq	$5,0($16)	# r[0]
 	umulh	$21,$21,$2		######
	stq	$1,8($16)	# r[1]
	mulq	$27,$27,$7		######
	stq	$6,16($16)	# r[0]
 	umulh	$27,$27,$3		######
	stq	$2,24($16)	# r[1]
	mulq	$28,$28,$8		######
	stq	$7,32($16)	# r[0]
 	umulh	$28,$28,$4		######
	stq	$3,40($16)	# r[1]

 	addq	$16,64,$16
 	addq	$17,32,$17
	stq	$8,-16($16)	# r[0]
	stq	$4,-8($16)	# r[1]

	blt	$18,$543
	ldq	$20,0($17)	# 1 1
 	br 	$542

$442:
	ldq	$20,0($17)   # a[0]
	mulq	$20,$20,$5  # a[0]*w low part       r2
	addq	$16,16,$16
	addq	$17,8,$17
	subq	$18,1,$18
        umulh	$20,$20,$1  # a[0]*w high part       r3
	stq	$5,-16($16)   # r[0]
        stq	$1,-8($16)   # r[1]

	bgt	$18,$442
	ret	$31,($26),1	# else exit

	.align 4
$543:
	addq	$18,4,$18
	bgt	$18,$442	# goto tail code
	ret	$31,($26),1	# else exit
	.end bn_sqr_words

	.align 3
	.globl bn_add_words
	.ent bn_add_words
bn_add_words:
bn_add_words..ng:
	.frame $30,0,$26,0
	.prologue 0

	subq	$19,4,$19
	bis	$31,$31,$0	# carry = 0
	blt	$19,$900
	ldq	$5,0($17)	# a[0]
	ldq	$1,0($18)	# b[1]
	.align 3
$901:
	addq	$1,$5,$1	# r=a+b;
	 ldq	$6,8($17)	# a[1]
	cmpult	$1,$5,$22	# did we overflow?
	 ldq	$2,8($18)	# b[1]
	addq	$1,$0,$1	# c+= overflow
	 ldq	$7,16($17)	# a[2]
	cmpult	$1,$0,$0	# overflow?
	 ldq	$3,16($18)	# b[2]
	addq	$0,$22,$0
	 ldq	$8,24($17)	# a[3]
	addq	$2,$6,$2	# r=a+b;
	 ldq	$4,24($18)	# b[3]
	cmpult	$2,$6,$23	# did we overflow?
	 addq	$3,$7,$3	# r=a+b;
	addq	$2,$0,$2	# c+= overflow
	 cmpult	$3,$7,$24	# did we overflow?
	cmpult	$2,$0,$0	# overflow?
	 addq	$4,$8,$4	# r=a+b;
	addq	$0,$23,$0
	 cmpult	$4,$8,$25	# did we overflow?
	addq	$3,$0,$3	# c+= overflow
	 stq	$1,0($16)	# r[0]=c
	cmpult	$3,$0,$0	# overflow?
	 stq	$2,8($16)	# r[1]=c
	addq	$0,$24,$0
	 stq	$3,16($16)	# r[2]=c
	addq	$4,$0,$4	# c+= overflow
	 subq	$19,4,$19	# loop--
	cmpult	$4,$0,$0	# overflow?
	 addq	$17,32,$17	# a++
	addq	$0,$25,$0
	 stq	$4,24($16)	# r[3]=c
	addq	$18,32,$18	# b++
	 addq	$16,32,$16	# r++

	blt	$19,$900
	 ldq	$5,0($17)	# a[0]
	ldq	$1,0($18)	# b[1]
	 br	$901
	.align 4
$945:
	ldq	$5,0($17)	# a[0]
	 ldq	$1,0($18)	# b[1]
	addq	$1,$5,$1	# r=a+b;
	 subq	$19,1,$19	# loop--
	addq	$1,$0,$1	# c+= overflow
	 addq	$17,8,$17	# a++
	cmpult	$1,$5,$22	# did we overflow?
	 cmpult	$1,$0,$0	# overflow?
	addq	$18,8,$18	# b++
	 stq	$1,0($16)	# r[0]=c
	addq	$0,$22,$0
	 addq	$16,8,$16	# r++

	bgt	$19,$945
	ret	$31,($26),1	# else exit

$900:
	addq	$19,4,$19
	bgt	$19,$945	# goto tail code
	ret	$31,($26),1	# else exit
	.end bn_add_words

 #
 # What follows was taken directly from the C compiler with a few
 # hacks to redo the lables.
 #
.text
	.align 3
	.globl bn_div64
	.ent bn_div64
bn_div64:
	ldgp $29,0($27)
bn_div64..ng:
	lda $30,-48($30)
	.frame $30,48,$26,0
	stq $26,0($30)
	stq $9,8($30)
	stq $10,16($30)
	stq $11,24($30)
	stq $12,32($30)
	stq $13,40($30)
	.mask 0x4003e00,-48
	.prologue 1
	bis $16,$16,$9
	bis $17,$17,$10
	bis $18,$18,$11
	bis $31,$31,$13
	bis $31,2,$12
	bne $11,$119
	lda $0,-1
	br $31,$136
	.align 4
$119:
	bis $11,$11,$16
	jsr $26,BN_num_bits_word
	ldgp $29,0($26)
	subq $0,64,$1
	beq $1,$120
	bis $31,1,$1
	sll $1,$0,$1
	cmpule $9,$1,$1
	bne $1,$120
 #	lda $16,_IO_stderr_
 #	lda $17,$C32
 #	bis $0,$0,$18
 #	jsr $26,fprintf
 #	ldgp $29,0($26)
	jsr $26,abort
	ldgp $29,0($26)
	.align 4
$120:
	bis $31,64,$3
	cmpult $9,$11,$2
	subq $3,$0,$1
	addl $1,$31,$0
	subq $9,$11,$1
	cmoveq $2,$1,$9
	beq $0,$122
	zapnot $0,15,$2
	subq $3,$0,$1
	sll $11,$2,$11
	sll $9,$2,$3
	srl $10,$1,$1
	sll $10,$2,$10
	bis $3,$1,$9
$122:
	srl $11,32,$5
	zapnot $11,15,$6
	lda $7,-1
	.align 5
$123:
	srl $9,32,$1
	subq $1,$5,$1
	bne $1,$126
	zapnot $7,15,$27
	br $31,$127
	.align 4
$126:
	bis $9,$9,$24
	bis $5,$5,$25
	divqu $24,$25,$27
$127:
	srl $10,32,$4
	.align 5
$128:
	mulq $27,$5,$1
	subq $9,$1,$3
	zapnot $3,240,$1
	bne $1,$129
	mulq $6,$27,$2
	sll $3,32,$1
	addq $1,$4,$1
	cmpule $2,$1,$2
	bne $2,$129
	subq $27,1,$27
	br $31,$128
	.align 4
$129:
	mulq $27,$6,$1
	mulq $27,$5,$4
	srl $1,32,$3
	sll $1,32,$1
	addq $4,$3,$4
	cmpult $10,$1,$2
	subq $10,$1,$10
	addq $2,$4,$2
	cmpult $9,$2,$1
	bis $2,$2,$4
	beq $1,$134
	addq $9,$11,$9
	subq $27,1,$27
$134:
	subl $12,1,$12
	subq $9,$4,$9
	beq $12,$124
	sll $27,32,$13
	sll $9,32,$2
	srl $10,32,$1
	sll $10,32,$10
	bis $2,$1,$9
	br $31,$123
	.align 4
$124:
	bis $13,$27,$0
$136:
	ldq $26,0($30)
	ldq $9,8($30)
	ldq $10,16($30)
	ldq $11,24($30)
	ldq $12,32($30)
	ldq $13,40($30)
	addq $30,48,$30
	ret $31,($26),1
	.end bn_div64

	.set noat
	.text
	.align 3
	.globl bn_sub_words
	.ent bn_sub_words
bn_sub_words:
bn_sub_words..ng:
	.frame $30,0,$26,0
	.prologue 0

	subq	$19,	4,	$19
	bis	$31,	$31,	$0
	blt	$19,	$100
	ldq	$1,	0($17)
	ldq	$2,	0($18)
$101:
	ldq	$3,	8($17)
	cmpult	$1,	$2,	$4
	ldq	$5,	8($18)
	subq	$1,	$2,	$1
	ldq	$6,	16($17)
	cmpult	$1,	$0,	$2
	ldq	$7,	16($18)
	subq	$1,	$0,	$23
	ldq	$8,	24($17)
	addq	$2,	$4,	$0
	cmpult	$3,	$5,	$24
	subq	$3,	$5,	$3
	ldq	$22,	24($18)
	cmpult	$3,	$0,	$5
	subq	$3,	$0,	$25
	addq	$5,	$24,	$0
	cmpult	$6,	$7,	$27
	subq	$6,	$7,	$6
	stq	$23,	0($16)
	cmpult	$6,	$0,	$7
	subq	$6,	$0,	$28
	addq	$7,	$27,	$0
	cmpult	$8,	$22,	$21
	subq	$8,	$22,	$8
	stq	$25,	8($16)
	cmpult	$8,	$0,	$22
	subq	$8,	$0,	$20
	addq	$22,	$21,	$0
	stq	$28,	16($16)
	subq	$19,	4,	$19
	stq	$20,	24($16)
	addq	$17,	32,	$17
	addq	$18,	32,	$18
	addq	$16,	32,	$16
	blt	$19,	$100
	ldq	$1,	0($17)
	ldq	$2,	0($18)
	br	$101
$102:
	ldq	$1,	0($17)
	ldq	$2,	0($18)
	cmpult	$1,	$2,	$27
	subq	$1,	$2,	$1
	cmpult	$1,	$0,	$2
	subq	$1,	$0,	$1
	stq	$1,	0($16)
	addq	$2,	$27,	$0
	addq	$17,	8,	$17
	addq	$18,	8,	$18
	addq	$16,	8,	$16
	subq	$19,	1,	$19
	bgt	$19,	$102
	ret	$31,($26),1
$100:
	addq	$19,	4,	$19
	bgt	$19,	$102
$103:
	ret	$31,($26),1
	.end bn_sub_words
