152629741Schristos#if !(defined (__mips_isa_rev) && (__mips_isa_rev >= 6)) 276c4f342Schristos.set mips2 352629741Schristos#endif 4e0ea3921Schristos#include "mips_arch.h" 5e0ea3921Schristos 6e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS64R6) 7e0ea3921Schristos# define ddivu(rs,rt) 8e0ea3921Schristos# define mfqt(rd,rs,rt) ddivu rd,rs,rt 9e0ea3921Schristos# define mfrm(rd,rs,rt) dmodu rd,rs,rt 10e0ea3921Schristos#elif defined(_MIPS_ARCH_MIPS32R6) 11e0ea3921Schristos# define divu(rs,rt) 12e0ea3921Schristos# define mfqt(rd,rs,rt) divu rd,rs,rt 13e0ea3921Schristos# define mfrm(rd,rs,rt) modu rd,rs,rt 14e0ea3921Schristos#else 15e0ea3921Schristos# define divu(rs,rt) divu $0,rs,rt 16e0ea3921Schristos# define mfqt(rd,rs,rt) mflo rd 17e0ea3921Schristos# define mfrm(rd,rs,rt) mfhi rd 18e0ea3921Schristos#endif 19e0ea3921Schristos 2076c4f342Schristos.rdata 2176c4f342Schristos.asciiz "mips3.s, Version 1.2" 2276c4f342Schristos.asciiz "MIPS II/III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>" 2376c4f342Schristos 2476c4f342Schristos.text 2576c4f342Schristos.set noat 2676c4f342Schristos 2776c4f342Schristos.align 5 2876c4f342Schristos.globl bn_mul_add_words 2976c4f342Schristos.ent bn_mul_add_words 3076c4f342Schristosbn_mul_add_words: 3176c4f342Schristos .set noreorder 3276c4f342Schristos bgtz $6,bn_mul_add_words_internal 3376c4f342Schristos move $2,$0 3476c4f342Schristos jr $31 3576c4f342Schristos move $4,$2 3676c4f342Schristos.end bn_mul_add_words 3776c4f342Schristos 3876c4f342Schristos.align 5 3976c4f342Schristos.ent bn_mul_add_words_internal 4076c4f342Schristosbn_mul_add_words_internal: 4176c4f342Schristos .set reorder 4276c4f342Schristos li $3,-4 4376c4f342Schristos and $8,$6,$3 4476c4f342Schristos beqz $8,.L_bn_mul_add_words_tail 4576c4f342Schristos 4676c4f342Schristos.L_bn_mul_add_words_loop: 4776c4f342Schristos lw $12,0($5) 48e0ea3921Schristos multu ($12,$7) 4976c4f342Schristos lw $13,0($4) 5076c4f342Schristos lw $14,4($5) 5176c4f342Schristos lw $15,4($4) 5276c4f342Schristos lw $8,2*4($5) 5376c4f342Schristos lw $9,2*4($4) 5476c4f342Schristos addu $13,$2 5576c4f342Schristos sltu $2,$13,$2 # All manuals say it "compares 32-bit 5676c4f342Schristos # values", but it seems to work fine 5776c4f342Schristos # even on 64-bit registers. 58e0ea3921Schristos mflo ($1,$12,$7) 59e0ea3921Schristos mfhi ($12,$12,$7) 6076c4f342Schristos addu $13,$1 6176c4f342Schristos addu $2,$12 62e0ea3921Schristos multu ($14,$7) 6376c4f342Schristos sltu $1,$13,$1 6476c4f342Schristos sw $13,0($4) 6576c4f342Schristos addu $2,$1 6676c4f342Schristos 6776c4f342Schristos lw $10,3*4($5) 6876c4f342Schristos lw $11,3*4($4) 6976c4f342Schristos addu $15,$2 7076c4f342Schristos sltu $2,$15,$2 71e0ea3921Schristos mflo ($1,$14,$7) 72e0ea3921Schristos mfhi ($14,$14,$7) 7376c4f342Schristos addu $15,$1 7476c4f342Schristos addu $2,$14 75e0ea3921Schristos multu ($8,$7) 7676c4f342Schristos sltu $1,$15,$1 7776c4f342Schristos sw $15,4($4) 7876c4f342Schristos addu $2,$1 7976c4f342Schristos 8076c4f342Schristos subu $6,4 8176c4f342Schristos addu $4,4*4 8276c4f342Schristos addu $5,4*4 8376c4f342Schristos addu $9,$2 8476c4f342Schristos sltu $2,$9,$2 85e0ea3921Schristos mflo ($1,$8,$7) 86e0ea3921Schristos mfhi ($8,$8,$7) 8776c4f342Schristos addu $9,$1 8876c4f342Schristos addu $2,$8 89e0ea3921Schristos multu ($10,$7) 9076c4f342Schristos sltu $1,$9,$1 9176c4f342Schristos sw $9,-2*4($4) 9276c4f342Schristos addu $2,$1 9376c4f342Schristos 9476c4f342Schristos 9576c4f342Schristos and $8,$6,$3 9676c4f342Schristos addu $11,$2 9776c4f342Schristos sltu $2,$11,$2 98e0ea3921Schristos mflo ($1,$10,$7) 99e0ea3921Schristos mfhi ($10,$10,$7) 10076c4f342Schristos addu $11,$1 10176c4f342Schristos addu $2,$10 10276c4f342Schristos sltu $1,$11,$1 10376c4f342Schristos sw $11,-4($4) 10476c4f342Schristos .set noreorder 10576c4f342Schristos bgtz $8,.L_bn_mul_add_words_loop 10676c4f342Schristos addu $2,$1 10776c4f342Schristos 10876c4f342Schristos beqz $6,.L_bn_mul_add_words_return 10976c4f342Schristos nop 11076c4f342Schristos 11176c4f342Schristos.L_bn_mul_add_words_tail: 11276c4f342Schristos .set reorder 11376c4f342Schristos lw $12,0($5) 114e0ea3921Schristos multu ($12,$7) 11576c4f342Schristos lw $13,0($4) 11676c4f342Schristos subu $6,1 11776c4f342Schristos addu $13,$2 11876c4f342Schristos sltu $2,$13,$2 119e0ea3921Schristos mflo ($1,$12,$7) 120e0ea3921Schristos mfhi ($12,$12,$7) 12176c4f342Schristos addu $13,$1 12276c4f342Schristos addu $2,$12 12376c4f342Schristos sltu $1,$13,$1 12476c4f342Schristos sw $13,0($4) 12576c4f342Schristos addu $2,$1 12676c4f342Schristos beqz $6,.L_bn_mul_add_words_return 12776c4f342Schristos 12876c4f342Schristos lw $12,4($5) 129e0ea3921Schristos multu ($12,$7) 13076c4f342Schristos lw $13,4($4) 13176c4f342Schristos subu $6,1 13276c4f342Schristos addu $13,$2 13376c4f342Schristos sltu $2,$13,$2 134e0ea3921Schristos mflo ($1,$12,$7) 135e0ea3921Schristos mfhi ($12,$12,$7) 13676c4f342Schristos addu $13,$1 13776c4f342Schristos addu $2,$12 13876c4f342Schristos sltu $1,$13,$1 13976c4f342Schristos sw $13,4($4) 14076c4f342Schristos addu $2,$1 14176c4f342Schristos beqz $6,.L_bn_mul_add_words_return 14276c4f342Schristos 14376c4f342Schristos lw $12,2*4($5) 144e0ea3921Schristos multu ($12,$7) 14576c4f342Schristos lw $13,2*4($4) 14676c4f342Schristos addu $13,$2 14776c4f342Schristos sltu $2,$13,$2 148e0ea3921Schristos mflo ($1,$12,$7) 149e0ea3921Schristos mfhi ($12,$12,$7) 15076c4f342Schristos addu $13,$1 15176c4f342Schristos addu $2,$12 15276c4f342Schristos sltu $1,$13,$1 15376c4f342Schristos sw $13,2*4($4) 15476c4f342Schristos addu $2,$1 15576c4f342Schristos 15676c4f342Schristos.L_bn_mul_add_words_return: 15776c4f342Schristos .set noreorder 15876c4f342Schristos jr $31 15976c4f342Schristos move $4,$2 16076c4f342Schristos.end bn_mul_add_words_internal 16176c4f342Schristos 16276c4f342Schristos.align 5 16376c4f342Schristos.globl bn_mul_words 16476c4f342Schristos.ent bn_mul_words 16576c4f342Schristosbn_mul_words: 16676c4f342Schristos .set noreorder 16776c4f342Schristos bgtz $6,bn_mul_words_internal 16876c4f342Schristos move $2,$0 16976c4f342Schristos jr $31 17076c4f342Schristos move $4,$2 17176c4f342Schristos.end bn_mul_words 17276c4f342Schristos 17376c4f342Schristos.align 5 17476c4f342Schristos.ent bn_mul_words_internal 17576c4f342Schristosbn_mul_words_internal: 17676c4f342Schristos .set reorder 17776c4f342Schristos li $3,-4 17876c4f342Schristos and $8,$6,$3 17976c4f342Schristos beqz $8,.L_bn_mul_words_tail 18076c4f342Schristos 18176c4f342Schristos.L_bn_mul_words_loop: 18276c4f342Schristos lw $12,0($5) 183e0ea3921Schristos multu ($12,$7) 18476c4f342Schristos lw $14,4($5) 18576c4f342Schristos lw $8,2*4($5) 18676c4f342Schristos lw $10,3*4($5) 187e0ea3921Schristos mflo ($1,$12,$7) 188e0ea3921Schristos mfhi ($12,$12,$7) 18976c4f342Schristos addu $2,$1 19076c4f342Schristos sltu $13,$2,$1 191e0ea3921Schristos multu ($14,$7) 19276c4f342Schristos sw $2,0($4) 19376c4f342Schristos addu $2,$13,$12 19476c4f342Schristos 19576c4f342Schristos subu $6,4 19676c4f342Schristos addu $4,4*4 19776c4f342Schristos addu $5,4*4 198e0ea3921Schristos mflo ($1,$14,$7) 199e0ea3921Schristos mfhi ($14,$14,$7) 20076c4f342Schristos addu $2,$1 20176c4f342Schristos sltu $15,$2,$1 202e0ea3921Schristos multu ($8,$7) 20376c4f342Schristos sw $2,-3*4($4) 20476c4f342Schristos addu $2,$15,$14 20576c4f342Schristos 206e0ea3921Schristos mflo ($1,$8,$7) 207e0ea3921Schristos mfhi ($8,$8,$7) 20876c4f342Schristos addu $2,$1 20976c4f342Schristos sltu $9,$2,$1 210e0ea3921Schristos multu ($10,$7) 21176c4f342Schristos sw $2,-2*4($4) 21276c4f342Schristos addu $2,$9,$8 21376c4f342Schristos 21476c4f342Schristos and $8,$6,$3 215e0ea3921Schristos mflo ($1,$10,$7) 216e0ea3921Schristos mfhi ($10,$10,$7) 21776c4f342Schristos addu $2,$1 21876c4f342Schristos sltu $11,$2,$1 21976c4f342Schristos sw $2,-4($4) 22076c4f342Schristos .set noreorder 22176c4f342Schristos bgtz $8,.L_bn_mul_words_loop 22276c4f342Schristos addu $2,$11,$10 22376c4f342Schristos 22476c4f342Schristos beqz $6,.L_bn_mul_words_return 22576c4f342Schristos nop 22676c4f342Schristos 22776c4f342Schristos.L_bn_mul_words_tail: 22876c4f342Schristos .set reorder 22976c4f342Schristos lw $12,0($5) 230e0ea3921Schristos multu ($12,$7) 23176c4f342Schristos subu $6,1 232e0ea3921Schristos mflo ($1,$12,$7) 233e0ea3921Schristos mfhi ($12,$12,$7) 23476c4f342Schristos addu $2,$1 23576c4f342Schristos sltu $13,$2,$1 23676c4f342Schristos sw $2,0($4) 23776c4f342Schristos addu $2,$13,$12 23876c4f342Schristos beqz $6,.L_bn_mul_words_return 23976c4f342Schristos 24076c4f342Schristos lw $12,4($5) 241e0ea3921Schristos multu ($12,$7) 24276c4f342Schristos subu $6,1 243e0ea3921Schristos mflo ($1,$12,$7) 244e0ea3921Schristos mfhi ($12,$12,$7) 24576c4f342Schristos addu $2,$1 24676c4f342Schristos sltu $13,$2,$1 24776c4f342Schristos sw $2,4($4) 24876c4f342Schristos addu $2,$13,$12 24976c4f342Schristos beqz $6,.L_bn_mul_words_return 25076c4f342Schristos 25176c4f342Schristos lw $12,2*4($5) 252e0ea3921Schristos multu ($12,$7) 253e0ea3921Schristos mflo ($1,$12,$7) 254e0ea3921Schristos mfhi ($12,$12,$7) 25576c4f342Schristos addu $2,$1 25676c4f342Schristos sltu $13,$2,$1 25776c4f342Schristos sw $2,2*4($4) 25876c4f342Schristos addu $2,$13,$12 25976c4f342Schristos 26076c4f342Schristos.L_bn_mul_words_return: 26176c4f342Schristos .set noreorder 26276c4f342Schristos jr $31 26376c4f342Schristos move $4,$2 26476c4f342Schristos.end bn_mul_words_internal 26576c4f342Schristos 26676c4f342Schristos.align 5 26776c4f342Schristos.globl bn_sqr_words 26876c4f342Schristos.ent bn_sqr_words 26976c4f342Schristosbn_sqr_words: 27076c4f342Schristos .set noreorder 27176c4f342Schristos bgtz $6,bn_sqr_words_internal 27276c4f342Schristos move $2,$0 27376c4f342Schristos jr $31 27476c4f342Schristos move $4,$2 27576c4f342Schristos.end bn_sqr_words 27676c4f342Schristos 27776c4f342Schristos.align 5 27876c4f342Schristos.ent bn_sqr_words_internal 27976c4f342Schristosbn_sqr_words_internal: 28076c4f342Schristos .set reorder 28176c4f342Schristos li $3,-4 28276c4f342Schristos and $8,$6,$3 28376c4f342Schristos beqz $8,.L_bn_sqr_words_tail 28476c4f342Schristos 28576c4f342Schristos.L_bn_sqr_words_loop: 28676c4f342Schristos lw $12,0($5) 287e0ea3921Schristos multu ($12,$12) 28876c4f342Schristos lw $14,4($5) 28976c4f342Schristos lw $8,2*4($5) 29076c4f342Schristos lw $10,3*4($5) 291e0ea3921Schristos mflo ($13,$12,$12) 292e0ea3921Schristos mfhi ($12,$12,$12) 29376c4f342Schristos sw $13,0($4) 29476c4f342Schristos sw $12,4($4) 29576c4f342Schristos 296e0ea3921Schristos multu ($14,$14) 29776c4f342Schristos subu $6,4 29876c4f342Schristos addu $4,8*4 29976c4f342Schristos addu $5,4*4 300e0ea3921Schristos mflo ($15,$14,$14) 301e0ea3921Schristos mfhi ($14,$14,$14) 30276c4f342Schristos sw $15,-6*4($4) 30376c4f342Schristos sw $14,-5*4($4) 30476c4f342Schristos 305e0ea3921Schristos multu ($8,$8) 306e0ea3921Schristos mflo ($9,$8,$8) 307e0ea3921Schristos mfhi ($8,$8,$8) 30876c4f342Schristos sw $9,-4*4($4) 30976c4f342Schristos sw $8,-3*4($4) 31076c4f342Schristos 31176c4f342Schristos 312e0ea3921Schristos multu ($10,$10) 31376c4f342Schristos and $8,$6,$3 314e0ea3921Schristos mflo ($11,$10,$10) 315e0ea3921Schristos mfhi ($10,$10,$10) 31676c4f342Schristos sw $11,-2*4($4) 31776c4f342Schristos 31876c4f342Schristos .set noreorder 319e0ea3921Schristos bgtz $8,.L_bn_sqr_words_loop 3202247b70aSchristos sw $10,-4($4) 32176c4f342Schristos 32276c4f342Schristos beqz $6,.L_bn_sqr_words_return 32376c4f342Schristos nop 32476c4f342Schristos 32576c4f342Schristos.L_bn_sqr_words_tail: 32676c4f342Schristos .set reorder 32776c4f342Schristos lw $12,0($5) 328e0ea3921Schristos multu ($12,$12) 32976c4f342Schristos subu $6,1 330e0ea3921Schristos mflo ($13,$12,$12) 331e0ea3921Schristos mfhi ($12,$12,$12) 33276c4f342Schristos sw $13,0($4) 33376c4f342Schristos sw $12,4($4) 33476c4f342Schristos beqz $6,.L_bn_sqr_words_return 33576c4f342Schristos 33676c4f342Schristos lw $12,4($5) 337e0ea3921Schristos multu ($12,$12) 33876c4f342Schristos subu $6,1 339e0ea3921Schristos mflo ($13,$12,$12) 340e0ea3921Schristos mfhi ($12,$12,$12) 34176c4f342Schristos sw $13,2*4($4) 34276c4f342Schristos sw $12,3*4($4) 34376c4f342Schristos beqz $6,.L_bn_sqr_words_return 34476c4f342Schristos 34576c4f342Schristos lw $12,2*4($5) 346e0ea3921Schristos multu ($12,$12) 347e0ea3921Schristos mflo ($13,$12,$12) 348e0ea3921Schristos mfhi ($12,$12,$12) 34976c4f342Schristos sw $13,4*4($4) 35076c4f342Schristos sw $12,5*4($4) 35176c4f342Schristos 35276c4f342Schristos.L_bn_sqr_words_return: 35376c4f342Schristos .set noreorder 35476c4f342Schristos jr $31 35576c4f342Schristos move $4,$2 35676c4f342Schristos 35776c4f342Schristos.end bn_sqr_words_internal 35876c4f342Schristos 35976c4f342Schristos.align 5 36076c4f342Schristos.globl bn_add_words 36176c4f342Schristos.ent bn_add_words 36276c4f342Schristosbn_add_words: 36376c4f342Schristos .set noreorder 36476c4f342Schristos bgtz $7,bn_add_words_internal 36576c4f342Schristos move $2,$0 36676c4f342Schristos jr $31 36776c4f342Schristos move $4,$2 36876c4f342Schristos.end bn_add_words 36976c4f342Schristos 37076c4f342Schristos.align 5 37176c4f342Schristos.ent bn_add_words_internal 37276c4f342Schristosbn_add_words_internal: 37376c4f342Schristos .set reorder 37476c4f342Schristos li $3,-4 37576c4f342Schristos and $1,$7,$3 37676c4f342Schristos beqz $1,.L_bn_add_words_tail 37776c4f342Schristos 37876c4f342Schristos.L_bn_add_words_loop: 37976c4f342Schristos lw $12,0($5) 38076c4f342Schristos lw $8,0($6) 38176c4f342Schristos subu $7,4 38276c4f342Schristos lw $13,4($5) 38376c4f342Schristos and $1,$7,$3 38476c4f342Schristos lw $14,2*4($5) 38576c4f342Schristos addu $6,4*4 38676c4f342Schristos lw $15,3*4($5) 38776c4f342Schristos addu $4,4*4 38876c4f342Schristos lw $9,-3*4($6) 38976c4f342Schristos addu $5,4*4 39076c4f342Schristos lw $10,-2*4($6) 39176c4f342Schristos lw $11,-4($6) 39276c4f342Schristos addu $8,$12 39376c4f342Schristos sltu $24,$8,$12 39476c4f342Schristos addu $12,$8,$2 39576c4f342Schristos sltu $2,$12,$8 39676c4f342Schristos sw $12,-4*4($4) 39776c4f342Schristos addu $2,$24 39876c4f342Schristos 39976c4f342Schristos addu $9,$13 40076c4f342Schristos sltu $25,$9,$13 40176c4f342Schristos addu $13,$9,$2 40276c4f342Schristos sltu $2,$13,$9 40376c4f342Schristos sw $13,-3*4($4) 40476c4f342Schristos addu $2,$25 40576c4f342Schristos 40676c4f342Schristos addu $10,$14 40776c4f342Schristos sltu $24,$10,$14 40876c4f342Schristos addu $14,$10,$2 40976c4f342Schristos sltu $2,$14,$10 41076c4f342Schristos sw $14,-2*4($4) 41176c4f342Schristos addu $2,$24 41276c4f342Schristos 41376c4f342Schristos addu $11,$15 41476c4f342Schristos sltu $25,$11,$15 41576c4f342Schristos addu $15,$11,$2 41676c4f342Schristos sltu $2,$15,$11 41776c4f342Schristos sw $15,-4($4) 41876c4f342Schristos 41976c4f342Schristos .set noreorder 42076c4f342Schristos bgtz $1,.L_bn_add_words_loop 42176c4f342Schristos addu $2,$25 42276c4f342Schristos 42376c4f342Schristos beqz $7,.L_bn_add_words_return 42476c4f342Schristos nop 42576c4f342Schristos 42676c4f342Schristos.L_bn_add_words_tail: 42776c4f342Schristos .set reorder 42876c4f342Schristos lw $12,0($5) 42976c4f342Schristos lw $8,0($6) 43076c4f342Schristos addu $8,$12 43176c4f342Schristos subu $7,1 43276c4f342Schristos sltu $24,$8,$12 43376c4f342Schristos addu $12,$8,$2 43476c4f342Schristos sltu $2,$12,$8 43576c4f342Schristos sw $12,0($4) 43676c4f342Schristos addu $2,$24 43776c4f342Schristos beqz $7,.L_bn_add_words_return 43876c4f342Schristos 43976c4f342Schristos lw $13,4($5) 44076c4f342Schristos lw $9,4($6) 44176c4f342Schristos addu $9,$13 44276c4f342Schristos subu $7,1 44376c4f342Schristos sltu $25,$9,$13 44476c4f342Schristos addu $13,$9,$2 44576c4f342Schristos sltu $2,$13,$9 44676c4f342Schristos sw $13,4($4) 44776c4f342Schristos addu $2,$25 44876c4f342Schristos beqz $7,.L_bn_add_words_return 44976c4f342Schristos 45076c4f342Schristos lw $14,2*4($5) 45176c4f342Schristos lw $10,2*4($6) 45276c4f342Schristos addu $10,$14 45376c4f342Schristos sltu $24,$10,$14 45476c4f342Schristos addu $14,$10,$2 45576c4f342Schristos sltu $2,$14,$10 45676c4f342Schristos sw $14,2*4($4) 45776c4f342Schristos addu $2,$24 45876c4f342Schristos 45976c4f342Schristos.L_bn_add_words_return: 46076c4f342Schristos .set noreorder 46176c4f342Schristos jr $31 46276c4f342Schristos move $4,$2 46376c4f342Schristos 46476c4f342Schristos.end bn_add_words_internal 46576c4f342Schristos 46676c4f342Schristos.align 5 46776c4f342Schristos.globl bn_sub_words 46876c4f342Schristos.ent bn_sub_words 46976c4f342Schristosbn_sub_words: 47076c4f342Schristos .set noreorder 47176c4f342Schristos bgtz $7,bn_sub_words_internal 47276c4f342Schristos move $2,$0 47376c4f342Schristos jr $31 47476c4f342Schristos move $4,$0 47576c4f342Schristos.end bn_sub_words 47676c4f342Schristos 47776c4f342Schristos.align 5 47876c4f342Schristos.ent bn_sub_words_internal 47976c4f342Schristosbn_sub_words_internal: 48076c4f342Schristos .set reorder 48176c4f342Schristos li $3,-4 48276c4f342Schristos and $1,$7,$3 48376c4f342Schristos beqz $1,.L_bn_sub_words_tail 48476c4f342Schristos 48576c4f342Schristos.L_bn_sub_words_loop: 48676c4f342Schristos lw $12,0($5) 48776c4f342Schristos lw $8,0($6) 48876c4f342Schristos subu $7,4 48976c4f342Schristos lw $13,4($5) 49076c4f342Schristos and $1,$7,$3 49176c4f342Schristos lw $14,2*4($5) 49276c4f342Schristos addu $6,4*4 49376c4f342Schristos lw $15,3*4($5) 49476c4f342Schristos addu $4,4*4 49576c4f342Schristos lw $9,-3*4($6) 49676c4f342Schristos addu $5,4*4 49776c4f342Schristos lw $10,-2*4($6) 49876c4f342Schristos lw $11,-4($6) 49976c4f342Schristos sltu $24,$12,$8 50076c4f342Schristos subu $8,$12,$8 50176c4f342Schristos subu $12,$8,$2 50276c4f342Schristos sgtu $2,$12,$8 50376c4f342Schristos sw $12,-4*4($4) 50476c4f342Schristos addu $2,$24 50576c4f342Schristos 50676c4f342Schristos sltu $25,$13,$9 50776c4f342Schristos subu $9,$13,$9 50876c4f342Schristos subu $13,$9,$2 50976c4f342Schristos sgtu $2,$13,$9 51076c4f342Schristos sw $13,-3*4($4) 51176c4f342Schristos addu $2,$25 51276c4f342Schristos 51376c4f342Schristos 51476c4f342Schristos sltu $24,$14,$10 51576c4f342Schristos subu $10,$14,$10 51676c4f342Schristos subu $14,$10,$2 51776c4f342Schristos sgtu $2,$14,$10 51876c4f342Schristos sw $14,-2*4($4) 51976c4f342Schristos addu $2,$24 52076c4f342Schristos 52176c4f342Schristos sltu $25,$15,$11 52276c4f342Schristos subu $11,$15,$11 52376c4f342Schristos subu $15,$11,$2 52476c4f342Schristos sgtu $2,$15,$11 52576c4f342Schristos sw $15,-4($4) 52676c4f342Schristos 52776c4f342Schristos .set noreorder 52876c4f342Schristos bgtz $1,.L_bn_sub_words_loop 52976c4f342Schristos addu $2,$25 53076c4f342Schristos 53176c4f342Schristos beqz $7,.L_bn_sub_words_return 53276c4f342Schristos nop 53376c4f342Schristos 53476c4f342Schristos.L_bn_sub_words_tail: 53576c4f342Schristos .set reorder 53676c4f342Schristos lw $12,0($5) 53776c4f342Schristos lw $8,0($6) 53876c4f342Schristos subu $7,1 53976c4f342Schristos sltu $24,$12,$8 54076c4f342Schristos subu $8,$12,$8 54176c4f342Schristos subu $12,$8,$2 54276c4f342Schristos sgtu $2,$12,$8 54376c4f342Schristos sw $12,0($4) 54476c4f342Schristos addu $2,$24 54576c4f342Schristos beqz $7,.L_bn_sub_words_return 54676c4f342Schristos 54776c4f342Schristos lw $13,4($5) 54876c4f342Schristos subu $7,1 54976c4f342Schristos lw $9,4($6) 55076c4f342Schristos sltu $25,$13,$9 55176c4f342Schristos subu $9,$13,$9 55276c4f342Schristos subu $13,$9,$2 55376c4f342Schristos sgtu $2,$13,$9 55476c4f342Schristos sw $13,4($4) 55576c4f342Schristos addu $2,$25 55676c4f342Schristos beqz $7,.L_bn_sub_words_return 55776c4f342Schristos 55876c4f342Schristos lw $14,2*4($5) 55976c4f342Schristos lw $10,2*4($6) 56076c4f342Schristos sltu $24,$14,$10 56176c4f342Schristos subu $10,$14,$10 56276c4f342Schristos subu $14,$10,$2 56376c4f342Schristos sgtu $2,$14,$10 56476c4f342Schristos sw $14,2*4($4) 56576c4f342Schristos addu $2,$24 56676c4f342Schristos 56776c4f342Schristos.L_bn_sub_words_return: 56876c4f342Schristos .set noreorder 56976c4f342Schristos jr $31 57076c4f342Schristos move $4,$2 57176c4f342Schristos.end bn_sub_words_internal 57276c4f342Schristos 57352629741Schristos#if 0 57452629741Schristos/* 57552629741Schristos * The bn_div_3_words entry point is re-used for constant-time interface. 57652629741Schristos * Implementation is retained as historical reference. 57752629741Schristos */ 57876c4f342Schristos.align 5 57976c4f342Schristos.globl bn_div_3_words 58076c4f342Schristos.ent bn_div_3_words 58176c4f342Schristosbn_div_3_words: 58276c4f342Schristos .set noreorder 58376c4f342Schristos move $7,$4 # we know that bn_div_words does not 58476c4f342Schristos # touch $7, $10, $11 and preserves $6 58576c4f342Schristos # so that we can save two arguments 58676c4f342Schristos # and return address in registers 58776c4f342Schristos # instead of stack:-) 58876c4f342Schristos 58976c4f342Schristos lw $4,($7) 59076c4f342Schristos move $10,$5 591e0ea3921Schristos bne $4,$6,bn_div_3_words_internal 5922247b70aSchristos lw $5,-4($7) 59376c4f342Schristos li $2,-1 59476c4f342Schristos jr $31 59576c4f342Schristos move $4,$2 59676c4f342Schristos.end bn_div_3_words 59776c4f342Schristos 59876c4f342Schristos.align 5 59976c4f342Schristos.ent bn_div_3_words_internal 60076c4f342Schristosbn_div_3_words_internal: 60176c4f342Schristos .set reorder 60276c4f342Schristos move $11,$31 60376c4f342Schristos bal bn_div_words_internal 60476c4f342Schristos move $31,$11 605e0ea3921Schristos multu ($10,$2) 60676c4f342Schristos lw $14,-2*4($7) 60776c4f342Schristos move $8,$0 608e0ea3921Schristos mfhi ($13,$10,$2) 609e0ea3921Schristos mflo ($12,$10,$2) 61076c4f342Schristos sltu $24,$13,$5 61176c4f342Schristos.L_bn_div_3_words_inner_loop: 61276c4f342Schristos bnez $24,.L_bn_div_3_words_inner_loop_done 61376c4f342Schristos sgeu $1,$14,$12 61476c4f342Schristos seq $25,$13,$5 61576c4f342Schristos and $1,$25 61676c4f342Schristos sltu $15,$12,$10 61776c4f342Schristos addu $5,$6 61876c4f342Schristos subu $13,$15 61976c4f342Schristos subu $12,$10 62076c4f342Schristos sltu $24,$13,$5 62176c4f342Schristos sltu $8,$5,$6 62276c4f342Schristos or $24,$8 62376c4f342Schristos .set noreorder 62476c4f342Schristos beqz $1,.L_bn_div_3_words_inner_loop 62576c4f342Schristos subu $2,1 62676c4f342Schristos addu $2,1 62776c4f342Schristos .set reorder 62876c4f342Schristos.L_bn_div_3_words_inner_loop_done: 62976c4f342Schristos .set noreorder 63076c4f342Schristos jr $31 63176c4f342Schristos move $4,$2 63276c4f342Schristos.end bn_div_3_words_internal 63352629741Schristos#endif 63476c4f342Schristos 63576c4f342Schristos.align 5 63676c4f342Schristos.globl bn_div_words 63776c4f342Schristos.ent bn_div_words 63876c4f342Schristosbn_div_words: 63976c4f342Schristos .set noreorder 64076c4f342Schristos bnez $6,bn_div_words_internal 64176c4f342Schristos li $2,-1 # I would rather signal div-by-zero 64276c4f342Schristos # which can be done with 'break 7' 64376c4f342Schristos jr $31 64476c4f342Schristos move $4,$2 64576c4f342Schristos.end bn_div_words 64676c4f342Schristos 64776c4f342Schristos.align 5 64876c4f342Schristos.ent bn_div_words_internal 64976c4f342Schristosbn_div_words_internal: 65076c4f342Schristos move $3,$0 65176c4f342Schristos bltz $6,.L_bn_div_words_body 65276c4f342Schristos move $25,$3 65376c4f342Schristos sll $6,1 65476c4f342Schristos bgtz $6,.-4 65576c4f342Schristos addu $25,1 65676c4f342Schristos 65776c4f342Schristos .set reorder 65876c4f342Schristos negu $13,$25 65976c4f342Schristos li $14,-1 66076c4f342Schristos sll $14,$13 66176c4f342Schristos and $14,$4 66276c4f342Schristos srl $1,$5,$13 66376c4f342Schristos .set noreorder 66476c4f342Schristos beqz $14,.+12 66576c4f342Schristos nop 66676c4f342Schristos break 6 # signal overflow 66776c4f342Schristos .set reorder 66876c4f342Schristos sll $4,$25 66976c4f342Schristos sll $5,$25 67076c4f342Schristos or $4,$1 67176c4f342Schristos.L_bn_div_words_body: 67276c4f342Schristos srl $3,$6,4*4 # bits 67376c4f342Schristos sgeu $1,$4,$6 67476c4f342Schristos .set noreorder 67576c4f342Schristos beqz $1,.+12 67676c4f342Schristos nop 67776c4f342Schristos subu $4,$6 67876c4f342Schristos .set reorder 67976c4f342Schristos 68076c4f342Schristos li $8,-1 68176c4f342Schristos srl $9,$4,4*4 # bits 68276c4f342Schristos srl $8,4*4 # q=0xffffffff 68376c4f342Schristos beq $3,$9,.L_bn_div_words_skip_div1 684e0ea3921Schristos divu ($4,$3) 685e0ea3921Schristos mfqt ($8,$4,$3) 68676c4f342Schristos.L_bn_div_words_skip_div1: 687e0ea3921Schristos multu ($6,$8) 68876c4f342Schristos sll $15,$4,4*4 # bits 68976c4f342Schristos srl $1,$5,4*4 # bits 69076c4f342Schristos or $15,$1 691e0ea3921Schristos mflo ($12,$6,$8) 692e0ea3921Schristos mfhi ($13,$6,$8) 69376c4f342Schristos.L_bn_div_words_inner_loop1: 69476c4f342Schristos sltu $14,$15,$12 69576c4f342Schristos seq $24,$9,$13 69676c4f342Schristos sltu $1,$9,$13 69776c4f342Schristos and $14,$24 69876c4f342Schristos sltu $2,$12,$6 69976c4f342Schristos or $1,$14 70076c4f342Schristos .set noreorder 70176c4f342Schristos beqz $1,.L_bn_div_words_inner_loop1_done 70276c4f342Schristos subu $13,$2 70376c4f342Schristos subu $12,$6 70476c4f342Schristos b .L_bn_div_words_inner_loop1 70576c4f342Schristos subu $8,1 70676c4f342Schristos .set reorder 70776c4f342Schristos.L_bn_div_words_inner_loop1_done: 70876c4f342Schristos 70976c4f342Schristos sll $5,4*4 # bits 71076c4f342Schristos subu $4,$15,$12 71176c4f342Schristos sll $2,$8,4*4 # bits 71276c4f342Schristos 71376c4f342Schristos li $8,-1 71476c4f342Schristos srl $9,$4,4*4 # bits 71576c4f342Schristos srl $8,4*4 # q=0xffffffff 71676c4f342Schristos beq $3,$9,.L_bn_div_words_skip_div2 717e0ea3921Schristos divu ($4,$3) 718e0ea3921Schristos mfqt ($8,$4,$3) 71976c4f342Schristos.L_bn_div_words_skip_div2: 720e0ea3921Schristos multu ($6,$8) 72176c4f342Schristos sll $15,$4,4*4 # bits 72276c4f342Schristos srl $1,$5,4*4 # bits 72376c4f342Schristos or $15,$1 724e0ea3921Schristos mflo ($12,$6,$8) 725e0ea3921Schristos mfhi ($13,$6,$8) 72676c4f342Schristos.L_bn_div_words_inner_loop2: 72776c4f342Schristos sltu $14,$15,$12 72876c4f342Schristos seq $24,$9,$13 72976c4f342Schristos sltu $1,$9,$13 73076c4f342Schristos and $14,$24 73176c4f342Schristos sltu $3,$12,$6 73276c4f342Schristos or $1,$14 73376c4f342Schristos .set noreorder 73476c4f342Schristos beqz $1,.L_bn_div_words_inner_loop2_done 73576c4f342Schristos subu $13,$3 73676c4f342Schristos subu $12,$6 73776c4f342Schristos b .L_bn_div_words_inner_loop2 73876c4f342Schristos subu $8,1 73976c4f342Schristos .set reorder 74076c4f342Schristos.L_bn_div_words_inner_loop2_done: 74176c4f342Schristos 74276c4f342Schristos subu $4,$15,$12 74376c4f342Schristos or $2,$8 74476c4f342Schristos srl $3,$4,$25 # $3 contains remainder if anybody wants it 74576c4f342Schristos srl $6,$25 # restore $6 74676c4f342Schristos 74776c4f342Schristos .set noreorder 74876c4f342Schristos move $5,$3 74976c4f342Schristos jr $31 75076c4f342Schristos move $4,$2 75176c4f342Schristos.end bn_div_words_internal 75276c4f342Schristos 75376c4f342Schristos.align 5 75476c4f342Schristos.globl bn_mul_comba8 75576c4f342Schristos.ent bn_mul_comba8 75676c4f342Schristosbn_mul_comba8: 75776c4f342Schristos .set noreorder 75876c4f342Schristos .frame $29,6*4,$31 75976c4f342Schristos .mask 0x003f0000,-4 76076c4f342Schristos subu $29,6*4 76176c4f342Schristos sw $21,5*4($29) 76276c4f342Schristos sw $20,4*4($29) 76376c4f342Schristos sw $19,3*4($29) 76476c4f342Schristos sw $18,2*4($29) 76576c4f342Schristos sw $17,1*4($29) 76676c4f342Schristos sw $16,0*4($29) 76776c4f342Schristos 76876c4f342Schristos .set reorder 76976c4f342Schristos lw $12,0($5) # If compiled with -mips3 option on 77076c4f342Schristos # R5000 box assembler barks on this 77176c4f342Schristos # 1ine with "should not have mult/div 77276c4f342Schristos # as last instruction in bb (R10K 77376c4f342Schristos # bug)" warning. If anybody out there 77476c4f342Schristos # has a clue about how to circumvent 77576c4f342Schristos # this do send me a note. 77676c4f342Schristos # <appro@fy.chalmers.se> 77776c4f342Schristos 77876c4f342Schristos lw $8,0($6) 77976c4f342Schristos lw $13,4($5) 78076c4f342Schristos lw $14,2*4($5) 781e0ea3921Schristos multu ($12,$8) # mul_add_c(a[0],b[0],c1,c2,c3); 78276c4f342Schristos lw $15,3*4($5) 78376c4f342Schristos lw $9,4($6) 78476c4f342Schristos lw $10,2*4($6) 78576c4f342Schristos lw $11,3*4($6) 786e0ea3921Schristos mflo ($2,$12,$8) 787e0ea3921Schristos mfhi ($3,$12,$8) 78876c4f342Schristos 78976c4f342Schristos lw $16,4*4($5) 79076c4f342Schristos lw $18,5*4($5) 791e0ea3921Schristos multu ($12,$9) # mul_add_c(a[0],b[1],c2,c3,c1); 79276c4f342Schristos lw $20,6*4($5) 79376c4f342Schristos lw $5,7*4($5) 79476c4f342Schristos lw $17,4*4($6) 79576c4f342Schristos lw $19,5*4($6) 796e0ea3921Schristos mflo ($24,$12,$9) 797e0ea3921Schristos mfhi ($25,$12,$9) 79876c4f342Schristos addu $3,$24 79976c4f342Schristos sltu $1,$3,$24 800e0ea3921Schristos multu ($13,$8) # mul_add_c(a[1],b[0],c2,c3,c1); 80176c4f342Schristos addu $7,$25,$1 80276c4f342Schristos lw $21,6*4($6) 80376c4f342Schristos lw $6,7*4($6) 80476c4f342Schristos sw $2,0($4) # r[0]=c1; 805e0ea3921Schristos mflo ($24,$13,$8) 806e0ea3921Schristos mfhi ($25,$13,$8) 80776c4f342Schristos addu $3,$24 80876c4f342Schristos sltu $1,$3,$24 809e0ea3921Schristos multu ($14,$8) # mul_add_c(a[2],b[0],c3,c1,c2); 81076c4f342Schristos addu $25,$1 81176c4f342Schristos addu $7,$25 81276c4f342Schristos sltu $2,$7,$25 81376c4f342Schristos sw $3,4($4) # r[1]=c2; 81476c4f342Schristos 815e0ea3921Schristos mflo ($24,$14,$8) 816e0ea3921Schristos mfhi ($25,$14,$8) 81776c4f342Schristos addu $7,$24 81876c4f342Schristos sltu $1,$7,$24 819e0ea3921Schristos multu ($13,$9) # mul_add_c(a[1],b[1],c3,c1,c2); 82076c4f342Schristos addu $25,$1 82176c4f342Schristos addu $2,$25 822e0ea3921Schristos mflo ($24,$13,$9) 823e0ea3921Schristos mfhi ($25,$13,$9) 82476c4f342Schristos addu $7,$24 82576c4f342Schristos sltu $1,$7,$24 826e0ea3921Schristos multu ($12,$10) # mul_add_c(a[0],b[2],c3,c1,c2); 82776c4f342Schristos addu $25,$1 82876c4f342Schristos addu $2,$25 82976c4f342Schristos sltu $3,$2,$25 830e0ea3921Schristos mflo ($24,$12,$10) 831e0ea3921Schristos mfhi ($25,$12,$10) 83276c4f342Schristos addu $7,$24 83376c4f342Schristos sltu $1,$7,$24 834e0ea3921Schristos multu ($12,$11) # mul_add_c(a[0],b[3],c1,c2,c3); 83576c4f342Schristos addu $25,$1 83676c4f342Schristos addu $2,$25 83776c4f342Schristos sltu $1,$2,$25 83876c4f342Schristos addu $3,$1 83976c4f342Schristos sw $7,2*4($4) # r[2]=c3; 84076c4f342Schristos 841e0ea3921Schristos mflo ($24,$12,$11) 842e0ea3921Schristos mfhi ($25,$12,$11) 84376c4f342Schristos addu $2,$24 84476c4f342Schristos sltu $1,$2,$24 845e0ea3921Schristos multu ($13,$10) # mul_add_c(a[1],b[2],c1,c2,c3); 84676c4f342Schristos addu $25,$1 84776c4f342Schristos addu $3,$25 84876c4f342Schristos sltu $7,$3,$25 849e0ea3921Schristos mflo ($24,$13,$10) 850e0ea3921Schristos mfhi ($25,$13,$10) 85176c4f342Schristos addu $2,$24 85276c4f342Schristos sltu $1,$2,$24 853e0ea3921Schristos multu ($14,$9) # mul_add_c(a[2],b[1],c1,c2,c3); 85476c4f342Schristos addu $25,$1 85576c4f342Schristos addu $3,$25 85676c4f342Schristos sltu $1,$3,$25 85776c4f342Schristos addu $7,$1 858e0ea3921Schristos mflo ($24,$14,$9) 859e0ea3921Schristos mfhi ($25,$14,$9) 86076c4f342Schristos addu $2,$24 86176c4f342Schristos sltu $1,$2,$24 862e0ea3921Schristos multu ($15,$8) # mul_add_c(a[3],b[0],c1,c2,c3); 86376c4f342Schristos addu $25,$1 86476c4f342Schristos addu $3,$25 86576c4f342Schristos sltu $1,$3,$25 86676c4f342Schristos addu $7,$1 867e0ea3921Schristos mflo ($24,$15,$8) 868e0ea3921Schristos mfhi ($25,$15,$8) 86976c4f342Schristos addu $2,$24 87076c4f342Schristos sltu $1,$2,$24 871e0ea3921Schristos multu ($16,$8) # mul_add_c(a[4],b[0],c2,c3,c1); 87276c4f342Schristos addu $25,$1 87376c4f342Schristos addu $3,$25 87476c4f342Schristos sltu $1,$3,$25 87576c4f342Schristos addu $7,$1 87676c4f342Schristos sw $2,3*4($4) # r[3]=c1; 87776c4f342Schristos 878e0ea3921Schristos mflo ($24,$16,$8) 879e0ea3921Schristos mfhi ($25,$16,$8) 88076c4f342Schristos addu $3,$24 88176c4f342Schristos sltu $1,$3,$24 882e0ea3921Schristos multu ($15,$9) # mul_add_c(a[3],b[1],c2,c3,c1); 88376c4f342Schristos addu $25,$1 88476c4f342Schristos addu $7,$25 88576c4f342Schristos sltu $2,$7,$25 886e0ea3921Schristos mflo ($24,$15,$9) 887e0ea3921Schristos mfhi ($25,$15,$9) 88876c4f342Schristos addu $3,$24 88976c4f342Schristos sltu $1,$3,$24 890e0ea3921Schristos multu ($14,$10) # mul_add_c(a[2],b[2],c2,c3,c1); 89176c4f342Schristos addu $25,$1 89276c4f342Schristos addu $7,$25 89376c4f342Schristos sltu $1,$7,$25 89476c4f342Schristos addu $2,$1 895e0ea3921Schristos mflo ($24,$14,$10) 896e0ea3921Schristos mfhi ($25,$14,$10) 89776c4f342Schristos addu $3,$24 89876c4f342Schristos sltu $1,$3,$24 899e0ea3921Schristos multu ($13,$11) # mul_add_c(a[1],b[3],c2,c3,c1); 90076c4f342Schristos addu $25,$1 90176c4f342Schristos addu $7,$25 90276c4f342Schristos sltu $1,$7,$25 90376c4f342Schristos addu $2,$1 904e0ea3921Schristos mflo ($24,$13,$11) 905e0ea3921Schristos mfhi ($25,$13,$11) 90676c4f342Schristos addu $3,$24 90776c4f342Schristos sltu $1,$3,$24 908e0ea3921Schristos multu ($12,$17) # mul_add_c(a[0],b[4],c2,c3,c1); 90976c4f342Schristos addu $25,$1 91076c4f342Schristos addu $7,$25 91176c4f342Schristos sltu $1,$7,$25 91276c4f342Schristos addu $2,$1 913e0ea3921Schristos mflo ($24,$12,$17) 914e0ea3921Schristos mfhi ($25,$12,$17) 91576c4f342Schristos addu $3,$24 91676c4f342Schristos sltu $1,$3,$24 917e0ea3921Schristos multu ($12,$19) # mul_add_c(a[0],b[5],c3,c1,c2); 91876c4f342Schristos addu $25,$1 91976c4f342Schristos addu $7,$25 92076c4f342Schristos sltu $1,$7,$25 92176c4f342Schristos addu $2,$1 92276c4f342Schristos sw $3,4*4($4) # r[4]=c2; 92376c4f342Schristos 924e0ea3921Schristos mflo ($24,$12,$19) 925e0ea3921Schristos mfhi ($25,$12,$19) 92676c4f342Schristos addu $7,$24 92776c4f342Schristos sltu $1,$7,$24 928e0ea3921Schristos multu ($13,$17) # mul_add_c(a[1],b[4],c3,c1,c2); 92976c4f342Schristos addu $25,$1 93076c4f342Schristos addu $2,$25 93176c4f342Schristos sltu $3,$2,$25 932e0ea3921Schristos mflo ($24,$13,$17) 933e0ea3921Schristos mfhi ($25,$13,$17) 93476c4f342Schristos addu $7,$24 93576c4f342Schristos sltu $1,$7,$24 936e0ea3921Schristos multu ($14,$11) # mul_add_c(a[2],b[3],c3,c1,c2); 93776c4f342Schristos addu $25,$1 93876c4f342Schristos addu $2,$25 93976c4f342Schristos sltu $1,$2,$25 94076c4f342Schristos addu $3,$1 941e0ea3921Schristos mflo ($24,$14,$11) 942e0ea3921Schristos mfhi ($25,$14,$11) 94376c4f342Schristos addu $7,$24 94476c4f342Schristos sltu $1,$7,$24 945e0ea3921Schristos multu ($15,$10) # mul_add_c(a[3],b[2],c3,c1,c2); 94676c4f342Schristos addu $25,$1 94776c4f342Schristos addu $2,$25 94876c4f342Schristos sltu $1,$2,$25 94976c4f342Schristos addu $3,$1 950e0ea3921Schristos mflo ($24,$15,$10) 951e0ea3921Schristos mfhi ($25,$15,$10) 95276c4f342Schristos addu $7,$24 95376c4f342Schristos sltu $1,$7,$24 954e0ea3921Schristos multu ($16,$9) # mul_add_c(a[4],b[1],c3,c1,c2); 95576c4f342Schristos addu $25,$1 95676c4f342Schristos addu $2,$25 95776c4f342Schristos sltu $1,$2,$25 95876c4f342Schristos addu $3,$1 959e0ea3921Schristos mflo ($24,$16,$9) 960e0ea3921Schristos mfhi ($25,$16,$9) 96176c4f342Schristos addu $7,$24 96276c4f342Schristos sltu $1,$7,$24 963e0ea3921Schristos multu ($18,$8) # mul_add_c(a[5],b[0],c3,c1,c2); 96476c4f342Schristos addu $25,$1 96576c4f342Schristos addu $2,$25 96676c4f342Schristos sltu $1,$2,$25 96776c4f342Schristos addu $3,$1 968e0ea3921Schristos mflo ($24,$18,$8) 969e0ea3921Schristos mfhi ($25,$18,$8) 97076c4f342Schristos addu $7,$24 97176c4f342Schristos sltu $1,$7,$24 972e0ea3921Schristos multu ($20,$8) # mul_add_c(a[6],b[0],c1,c2,c3); 97376c4f342Schristos addu $25,$1 97476c4f342Schristos addu $2,$25 97576c4f342Schristos sltu $1,$2,$25 97676c4f342Schristos addu $3,$1 97776c4f342Schristos sw $7,5*4($4) # r[5]=c3; 97876c4f342Schristos 979e0ea3921Schristos mflo ($24,$20,$8) 980e0ea3921Schristos mfhi ($25,$20,$8) 98176c4f342Schristos addu $2,$24 98276c4f342Schristos sltu $1,$2,$24 983e0ea3921Schristos multu ($18,$9) # mul_add_c(a[5],b[1],c1,c2,c3); 98476c4f342Schristos addu $25,$1 98576c4f342Schristos addu $3,$25 98676c4f342Schristos sltu $7,$3,$25 987e0ea3921Schristos mflo ($24,$18,$9) 988e0ea3921Schristos mfhi ($25,$18,$9) 98976c4f342Schristos addu $2,$24 99076c4f342Schristos sltu $1,$2,$24 991e0ea3921Schristos multu ($16,$10) # mul_add_c(a[4],b[2],c1,c2,c3); 99276c4f342Schristos addu $25,$1 99376c4f342Schristos addu $3,$25 99476c4f342Schristos sltu $1,$3,$25 99576c4f342Schristos addu $7,$1 996e0ea3921Schristos mflo ($24,$16,$10) 997e0ea3921Schristos mfhi ($25,$16,$10) 99876c4f342Schristos addu $2,$24 99976c4f342Schristos sltu $1,$2,$24 1000e0ea3921Schristos multu ($15,$11) # mul_add_c(a[3],b[3],c1,c2,c3); 100176c4f342Schristos addu $25,$1 100276c4f342Schristos addu $3,$25 100376c4f342Schristos sltu $1,$3,$25 100476c4f342Schristos addu $7,$1 1005e0ea3921Schristos mflo ($24,$15,$11) 1006e0ea3921Schristos mfhi ($25,$15,$11) 100776c4f342Schristos addu $2,$24 100876c4f342Schristos sltu $1,$2,$24 1009e0ea3921Schristos multu ($14,$17) # mul_add_c(a[2],b[4],c1,c2,c3); 101076c4f342Schristos addu $25,$1 101176c4f342Schristos addu $3,$25 101276c4f342Schristos sltu $1,$3,$25 101376c4f342Schristos addu $7,$1 1014e0ea3921Schristos mflo ($24,$14,$17) 1015e0ea3921Schristos mfhi ($25,$14,$17) 101676c4f342Schristos addu $2,$24 101776c4f342Schristos sltu $1,$2,$24 1018e0ea3921Schristos multu ($13,$19) # mul_add_c(a[1],b[5],c1,c2,c3); 101976c4f342Schristos addu $25,$1 102076c4f342Schristos addu $3,$25 102176c4f342Schristos sltu $1,$3,$25 102276c4f342Schristos addu $7,$1 1023e0ea3921Schristos mflo ($24,$13,$19) 1024e0ea3921Schristos mfhi ($25,$13,$19) 102576c4f342Schristos addu $2,$24 102676c4f342Schristos sltu $1,$2,$24 1027e0ea3921Schristos multu ($12,$21) # mul_add_c(a[0],b[6],c1,c2,c3); 102876c4f342Schristos addu $25,$1 102976c4f342Schristos addu $3,$25 103076c4f342Schristos sltu $1,$3,$25 103176c4f342Schristos addu $7,$1 1032e0ea3921Schristos mflo ($24,$12,$21) 1033e0ea3921Schristos mfhi ($25,$12,$21) 103476c4f342Schristos addu $2,$24 103576c4f342Schristos sltu $1,$2,$24 1036e0ea3921Schristos multu ($12,$6) # mul_add_c(a[0],b[7],c2,c3,c1); 103776c4f342Schristos addu $25,$1 103876c4f342Schristos addu $3,$25 103976c4f342Schristos sltu $1,$3,$25 104076c4f342Schristos addu $7,$1 104176c4f342Schristos sw $2,6*4($4) # r[6]=c1; 104276c4f342Schristos 1043e0ea3921Schristos mflo ($24,$12,$6) 1044e0ea3921Schristos mfhi ($25,$12,$6) 104576c4f342Schristos addu $3,$24 104676c4f342Schristos sltu $1,$3,$24 1047e0ea3921Schristos multu ($13,$21) # mul_add_c(a[1],b[6],c2,c3,c1); 104876c4f342Schristos addu $25,$1 104976c4f342Schristos addu $7,$25 105076c4f342Schristos sltu $2,$7,$25 1051e0ea3921Schristos mflo ($24,$13,$21) 1052e0ea3921Schristos mfhi ($25,$13,$21) 105376c4f342Schristos addu $3,$24 105476c4f342Schristos sltu $1,$3,$24 1055e0ea3921Schristos multu ($14,$19) # mul_add_c(a[2],b[5],c2,c3,c1); 105676c4f342Schristos addu $25,$1 105776c4f342Schristos addu $7,$25 105876c4f342Schristos sltu $1,$7,$25 105976c4f342Schristos addu $2,$1 1060e0ea3921Schristos mflo ($24,$14,$19) 1061e0ea3921Schristos mfhi ($25,$14,$19) 106276c4f342Schristos addu $3,$24 106376c4f342Schristos sltu $1,$3,$24 1064e0ea3921Schristos multu ($15,$17) # mul_add_c(a[3],b[4],c2,c3,c1); 106576c4f342Schristos addu $25,$1 106676c4f342Schristos addu $7,$25 106776c4f342Schristos sltu $1,$7,$25 106876c4f342Schristos addu $2,$1 1069e0ea3921Schristos mflo ($24,$15,$17) 1070e0ea3921Schristos mfhi ($25,$15,$17) 107176c4f342Schristos addu $3,$24 107276c4f342Schristos sltu $1,$3,$24 1073e0ea3921Schristos multu ($16,$11) # mul_add_c(a[4],b[3],c2,c3,c1); 107476c4f342Schristos addu $25,$1 107576c4f342Schristos addu $7,$25 107676c4f342Schristos sltu $1,$7,$25 107776c4f342Schristos addu $2,$1 1078e0ea3921Schristos mflo ($24,$16,$11) 1079e0ea3921Schristos mfhi ($25,$16,$11) 108076c4f342Schristos addu $3,$24 108176c4f342Schristos sltu $1,$3,$24 1082e0ea3921Schristos multu ($18,$10) # mul_add_c(a[5],b[2],c2,c3,c1); 108376c4f342Schristos addu $25,$1 108476c4f342Schristos addu $7,$25 108576c4f342Schristos sltu $1,$7,$25 108676c4f342Schristos addu $2,$1 1087e0ea3921Schristos mflo ($24,$18,$10) 1088e0ea3921Schristos mfhi ($25,$18,$10) 108976c4f342Schristos addu $3,$24 109076c4f342Schristos sltu $1,$3,$24 1091e0ea3921Schristos multu ($20,$9) # mul_add_c(a[6],b[1],c2,c3,c1); 109276c4f342Schristos addu $25,$1 109376c4f342Schristos addu $7,$25 109476c4f342Schristos sltu $1,$7,$25 109576c4f342Schristos addu $2,$1 1096e0ea3921Schristos mflo ($24,$20,$9) 1097e0ea3921Schristos mfhi ($25,$20,$9) 109876c4f342Schristos addu $3,$24 109976c4f342Schristos sltu $1,$3,$24 1100e0ea3921Schristos multu ($5,$8) # mul_add_c(a[7],b[0],c2,c3,c1); 110176c4f342Schristos addu $25,$1 110276c4f342Schristos addu $7,$25 110376c4f342Schristos sltu $1,$7,$25 110476c4f342Schristos addu $2,$1 1105e0ea3921Schristos mflo ($24,$5,$8) 1106e0ea3921Schristos mfhi ($25,$5,$8) 110776c4f342Schristos addu $3,$24 110876c4f342Schristos sltu $1,$3,$24 1109e0ea3921Schristos multu ($5,$9) # mul_add_c(a[7],b[1],c3,c1,c2); 111076c4f342Schristos addu $25,$1 111176c4f342Schristos addu $7,$25 111276c4f342Schristos sltu $1,$7,$25 111376c4f342Schristos addu $2,$1 111476c4f342Schristos sw $3,7*4($4) # r[7]=c2; 111576c4f342Schristos 1116e0ea3921Schristos mflo ($24,$5,$9) 1117e0ea3921Schristos mfhi ($25,$5,$9) 111876c4f342Schristos addu $7,$24 111976c4f342Schristos sltu $1,$7,$24 1120e0ea3921Schristos multu ($20,$10) # mul_add_c(a[6],b[2],c3,c1,c2); 112176c4f342Schristos addu $25,$1 112276c4f342Schristos addu $2,$25 112376c4f342Schristos sltu $3,$2,$25 1124e0ea3921Schristos mflo ($24,$20,$10) 1125e0ea3921Schristos mfhi ($25,$20,$10) 112676c4f342Schristos addu $7,$24 112776c4f342Schristos sltu $1,$7,$24 1128e0ea3921Schristos multu ($18,$11) # mul_add_c(a[5],b[3],c3,c1,c2); 112976c4f342Schristos addu $25,$1 113076c4f342Schristos addu $2,$25 113176c4f342Schristos sltu $1,$2,$25 113276c4f342Schristos addu $3,$1 1133e0ea3921Schristos mflo ($24,$18,$11) 1134e0ea3921Schristos mfhi ($25,$18,$11) 113576c4f342Schristos addu $7,$24 113676c4f342Schristos sltu $1,$7,$24 1137e0ea3921Schristos multu ($16,$17) # mul_add_c(a[4],b[4],c3,c1,c2); 113876c4f342Schristos addu $25,$1 113976c4f342Schristos addu $2,$25 114076c4f342Schristos sltu $1,$2,$25 114176c4f342Schristos addu $3,$1 1142e0ea3921Schristos mflo ($24,$16,$17) 1143e0ea3921Schristos mfhi ($25,$16,$17) 114476c4f342Schristos addu $7,$24 114576c4f342Schristos sltu $1,$7,$24 1146e0ea3921Schristos multu ($15,$19) # mul_add_c(a[3],b[5],c3,c1,c2); 114776c4f342Schristos addu $25,$1 114876c4f342Schristos addu $2,$25 114976c4f342Schristos sltu $1,$2,$25 115076c4f342Schristos addu $3,$1 1151e0ea3921Schristos mflo ($24,$15,$19) 1152e0ea3921Schristos mfhi ($25,$15,$19) 115376c4f342Schristos addu $7,$24 115476c4f342Schristos sltu $1,$7,$24 1155e0ea3921Schristos multu ($14,$21) # mul_add_c(a[2],b[6],c3,c1,c2); 115676c4f342Schristos addu $25,$1 115776c4f342Schristos addu $2,$25 115876c4f342Schristos sltu $1,$2,$25 115976c4f342Schristos addu $3,$1 1160e0ea3921Schristos mflo ($24,$14,$21) 1161e0ea3921Schristos mfhi ($25,$14,$21) 116276c4f342Schristos addu $7,$24 116376c4f342Schristos sltu $1,$7,$24 1164e0ea3921Schristos multu ($13,$6) # mul_add_c(a[1],b[7],c3,c1,c2); 116576c4f342Schristos addu $25,$1 116676c4f342Schristos addu $2,$25 116776c4f342Schristos sltu $1,$2,$25 116876c4f342Schristos addu $3,$1 1169e0ea3921Schristos mflo ($24,$13,$6) 1170e0ea3921Schristos mfhi ($25,$13,$6) 117176c4f342Schristos addu $7,$24 117276c4f342Schristos sltu $1,$7,$24 1173e0ea3921Schristos multu ($14,$6) # mul_add_c(a[2],b[7],c1,c2,c3); 117476c4f342Schristos addu $25,$1 117576c4f342Schristos addu $2,$25 117676c4f342Schristos sltu $1,$2,$25 117776c4f342Schristos addu $3,$1 117876c4f342Schristos sw $7,8*4($4) # r[8]=c3; 117976c4f342Schristos 1180e0ea3921Schristos mflo ($24,$14,$6) 1181e0ea3921Schristos mfhi ($25,$14,$6) 118276c4f342Schristos addu $2,$24 118376c4f342Schristos sltu $1,$2,$24 1184e0ea3921Schristos multu ($15,$21) # mul_add_c(a[3],b[6],c1,c2,c3); 118576c4f342Schristos addu $25,$1 118676c4f342Schristos addu $3,$25 118776c4f342Schristos sltu $7,$3,$25 1188e0ea3921Schristos mflo ($24,$15,$21) 1189e0ea3921Schristos mfhi ($25,$15,$21) 119076c4f342Schristos addu $2,$24 119176c4f342Schristos sltu $1,$2,$24 1192e0ea3921Schristos multu ($16,$19) # mul_add_c(a[4],b[5],c1,c2,c3); 119376c4f342Schristos addu $25,$1 119476c4f342Schristos addu $3,$25 119576c4f342Schristos sltu $1,$3,$25 119676c4f342Schristos addu $7,$1 1197e0ea3921Schristos mflo ($24,$16,$19) 1198e0ea3921Schristos mfhi ($25,$16,$19) 119976c4f342Schristos addu $2,$24 120076c4f342Schristos sltu $1,$2,$24 1201e0ea3921Schristos multu ($18,$17) # mul_add_c(a[5],b[4],c1,c2,c3); 120276c4f342Schristos addu $25,$1 120376c4f342Schristos addu $3,$25 120476c4f342Schristos sltu $1,$3,$25 120576c4f342Schristos addu $7,$1 1206e0ea3921Schristos mflo ($24,$18,$17) 1207e0ea3921Schristos mfhi ($25,$18,$17) 120876c4f342Schristos addu $2,$24 120976c4f342Schristos sltu $1,$2,$24 1210e0ea3921Schristos multu ($20,$11) # mul_add_c(a[6],b[3],c1,c2,c3); 121176c4f342Schristos addu $25,$1 121276c4f342Schristos addu $3,$25 121376c4f342Schristos sltu $1,$3,$25 121476c4f342Schristos addu $7,$1 1215e0ea3921Schristos mflo ($24,$20,$11) 1216e0ea3921Schristos mfhi ($25,$20,$11) 121776c4f342Schristos addu $2,$24 121876c4f342Schristos sltu $1,$2,$24 1219e0ea3921Schristos multu ($5,$10) # mul_add_c(a[7],b[2],c1,c2,c3); 122076c4f342Schristos addu $25,$1 122176c4f342Schristos addu $3,$25 122276c4f342Schristos sltu $1,$3,$25 122376c4f342Schristos addu $7,$1 1224e0ea3921Schristos mflo ($24,$5,$10) 1225e0ea3921Schristos mfhi ($25,$5,$10) 122676c4f342Schristos addu $2,$24 122776c4f342Schristos sltu $1,$2,$24 1228e0ea3921Schristos multu ($5,$11) # mul_add_c(a[7],b[3],c2,c3,c1); 122976c4f342Schristos addu $25,$1 123076c4f342Schristos addu $3,$25 123176c4f342Schristos sltu $1,$3,$25 123276c4f342Schristos addu $7,$1 123376c4f342Schristos sw $2,9*4($4) # r[9]=c1; 123476c4f342Schristos 1235e0ea3921Schristos mflo ($24,$5,$11) 1236e0ea3921Schristos mfhi ($25,$5,$11) 123776c4f342Schristos addu $3,$24 123876c4f342Schristos sltu $1,$3,$24 1239e0ea3921Schristos multu ($20,$17) # mul_add_c(a[6],b[4],c2,c3,c1); 124076c4f342Schristos addu $25,$1 124176c4f342Schristos addu $7,$25 124276c4f342Schristos sltu $2,$7,$25 1243e0ea3921Schristos mflo ($24,$20,$17) 1244e0ea3921Schristos mfhi ($25,$20,$17) 124576c4f342Schristos addu $3,$24 124676c4f342Schristos sltu $1,$3,$24 1247e0ea3921Schristos multu ($18,$19) # mul_add_c(a[5],b[5],c2,c3,c1); 124876c4f342Schristos addu $25,$1 124976c4f342Schristos addu $7,$25 125076c4f342Schristos sltu $1,$7,$25 125176c4f342Schristos addu $2,$1 1252e0ea3921Schristos mflo ($24,$18,$19) 1253e0ea3921Schristos mfhi ($25,$18,$19) 125476c4f342Schristos addu $3,$24 125576c4f342Schristos sltu $1,$3,$24 1256e0ea3921Schristos multu ($16,$21) # mul_add_c(a[4],b[6],c2,c3,c1); 125776c4f342Schristos addu $25,$1 125876c4f342Schristos addu $7,$25 125976c4f342Schristos sltu $1,$7,$25 126076c4f342Schristos addu $2,$1 1261e0ea3921Schristos mflo ($24,$16,$21) 1262e0ea3921Schristos mfhi ($25,$16,$21) 126376c4f342Schristos addu $3,$24 126476c4f342Schristos sltu $1,$3,$24 1265e0ea3921Schristos multu ($15,$6) # mul_add_c(a[3],b[7],c2,c3,c1); 126676c4f342Schristos addu $25,$1 126776c4f342Schristos addu $7,$25 126876c4f342Schristos sltu $1,$7,$25 126976c4f342Schristos addu $2,$1 1270e0ea3921Schristos mflo ($24,$15,$6) 1271e0ea3921Schristos mfhi ($25,$15,$6) 127276c4f342Schristos addu $3,$24 127376c4f342Schristos sltu $1,$3,$24 1274e0ea3921Schristos multu ($16,$6) # mul_add_c(a[4],b[7],c3,c1,c2); 127576c4f342Schristos addu $25,$1 127676c4f342Schristos addu $7,$25 127776c4f342Schristos sltu $1,$7,$25 127876c4f342Schristos addu $2,$1 127976c4f342Schristos sw $3,10*4($4) # r[10]=c2; 128076c4f342Schristos 1281e0ea3921Schristos mflo ($24,$16,$6) 1282e0ea3921Schristos mfhi ($25,$16,$6) 128376c4f342Schristos addu $7,$24 128476c4f342Schristos sltu $1,$7,$24 1285e0ea3921Schristos multu ($18,$21) # mul_add_c(a[5],b[6],c3,c1,c2); 128676c4f342Schristos addu $25,$1 128776c4f342Schristos addu $2,$25 128876c4f342Schristos sltu $3,$2,$25 1289e0ea3921Schristos mflo ($24,$18,$21) 1290e0ea3921Schristos mfhi ($25,$18,$21) 129176c4f342Schristos addu $7,$24 129276c4f342Schristos sltu $1,$7,$24 1293e0ea3921Schristos multu ($20,$19) # mul_add_c(a[6],b[5],c3,c1,c2); 129476c4f342Schristos addu $25,$1 129576c4f342Schristos addu $2,$25 129676c4f342Schristos sltu $1,$2,$25 129776c4f342Schristos addu $3,$1 1298e0ea3921Schristos mflo ($24,$20,$19) 1299e0ea3921Schristos mfhi ($25,$20,$19) 130076c4f342Schristos addu $7,$24 130176c4f342Schristos sltu $1,$7,$24 1302e0ea3921Schristos multu ($5,$17) # mul_add_c(a[7],b[4],c3,c1,c2); 130376c4f342Schristos addu $25,$1 130476c4f342Schristos addu $2,$25 130576c4f342Schristos sltu $1,$2,$25 130676c4f342Schristos addu $3,$1 1307e0ea3921Schristos mflo ($24,$5,$17) 1308e0ea3921Schristos mfhi ($25,$5,$17) 130976c4f342Schristos addu $7,$24 131076c4f342Schristos sltu $1,$7,$24 1311e0ea3921Schristos multu ($5,$19) # mul_add_c(a[7],b[5],c1,c2,c3); 131276c4f342Schristos addu $25,$1 131376c4f342Schristos addu $2,$25 131476c4f342Schristos sltu $1,$2,$25 131576c4f342Schristos addu $3,$1 131676c4f342Schristos sw $7,11*4($4) # r[11]=c3; 131776c4f342Schristos 1318e0ea3921Schristos mflo ($24,$5,$19) 1319e0ea3921Schristos mfhi ($25,$5,$19) 132076c4f342Schristos addu $2,$24 132176c4f342Schristos sltu $1,$2,$24 1322e0ea3921Schristos multu ($20,$21) # mul_add_c(a[6],b[6],c1,c2,c3); 132376c4f342Schristos addu $25,$1 132476c4f342Schristos addu $3,$25 132576c4f342Schristos sltu $7,$3,$25 1326e0ea3921Schristos mflo ($24,$20,$21) 1327e0ea3921Schristos mfhi ($25,$20,$21) 132876c4f342Schristos addu $2,$24 132976c4f342Schristos sltu $1,$2,$24 1330e0ea3921Schristos multu ($18,$6) # mul_add_c(a[5],b[7],c1,c2,c3); 133176c4f342Schristos addu $25,$1 133276c4f342Schristos addu $3,$25 133376c4f342Schristos sltu $1,$3,$25 133476c4f342Schristos addu $7,$1 1335e0ea3921Schristos mflo ($24,$18,$6) 1336e0ea3921Schristos mfhi ($25,$18,$6) 133776c4f342Schristos addu $2,$24 133876c4f342Schristos sltu $1,$2,$24 1339e0ea3921Schristos multu ($20,$6) # mul_add_c(a[6],b[7],c2,c3,c1); 134076c4f342Schristos addu $25,$1 134176c4f342Schristos addu $3,$25 134276c4f342Schristos sltu $1,$3,$25 134376c4f342Schristos addu $7,$1 134476c4f342Schristos sw $2,12*4($4) # r[12]=c1; 134576c4f342Schristos 1346e0ea3921Schristos mflo ($24,$20,$6) 1347e0ea3921Schristos mfhi ($25,$20,$6) 134876c4f342Schristos addu $3,$24 134976c4f342Schristos sltu $1,$3,$24 1350e0ea3921Schristos multu ($5,$21) # mul_add_c(a[7],b[6],c2,c3,c1); 135176c4f342Schristos addu $25,$1 135276c4f342Schristos addu $7,$25 135376c4f342Schristos sltu $2,$7,$25 1354e0ea3921Schristos mflo ($24,$5,$21) 1355e0ea3921Schristos mfhi ($25,$5,$21) 135676c4f342Schristos addu $3,$24 135776c4f342Schristos sltu $1,$3,$24 1358e0ea3921Schristos multu ($5,$6) # mul_add_c(a[7],b[7],c3,c1,c2); 135976c4f342Schristos addu $25,$1 136076c4f342Schristos addu $7,$25 136176c4f342Schristos sltu $1,$7,$25 136276c4f342Schristos addu $2,$1 136376c4f342Schristos sw $3,13*4($4) # r[13]=c2; 136476c4f342Schristos 1365e0ea3921Schristos mflo ($24,$5,$6) 1366e0ea3921Schristos mfhi ($25,$5,$6) 136776c4f342Schristos addu $7,$24 136876c4f342Schristos sltu $1,$7,$24 136976c4f342Schristos addu $25,$1 137076c4f342Schristos addu $2,$25 137176c4f342Schristos sw $7,14*4($4) # r[14]=c3; 137276c4f342Schristos sw $2,15*4($4) # r[15]=c1; 137376c4f342Schristos 137476c4f342Schristos .set noreorder 137576c4f342Schristos lw $21,5*4($29) 137676c4f342Schristos lw $20,4*4($29) 137776c4f342Schristos lw $19,3*4($29) 137876c4f342Schristos lw $18,2*4($29) 137976c4f342Schristos lw $17,1*4($29) 138076c4f342Schristos lw $16,0*4($29) 138176c4f342Schristos jr $31 138276c4f342Schristos addu $29,6*4 138376c4f342Schristos.end bn_mul_comba8 138476c4f342Schristos 138576c4f342Schristos.align 5 138676c4f342Schristos.globl bn_mul_comba4 138776c4f342Schristos.ent bn_mul_comba4 138876c4f342Schristosbn_mul_comba4: 138976c4f342Schristos .set reorder 139076c4f342Schristos lw $12,0($5) 139176c4f342Schristos lw $8,0($6) 139276c4f342Schristos lw $13,4($5) 139376c4f342Schristos lw $14,2*4($5) 1394e0ea3921Schristos multu ($12,$8) # mul_add_c(a[0],b[0],c1,c2,c3); 139576c4f342Schristos lw $15,3*4($5) 139676c4f342Schristos lw $9,4($6) 139776c4f342Schristos lw $10,2*4($6) 139876c4f342Schristos lw $11,3*4($6) 1399e0ea3921Schristos mflo ($2,$12,$8) 1400e0ea3921Schristos mfhi ($3,$12,$8) 140176c4f342Schristos sw $2,0($4) 140276c4f342Schristos 1403e0ea3921Schristos multu ($12,$9) # mul_add_c(a[0],b[1],c2,c3,c1); 1404e0ea3921Schristos mflo ($24,$12,$9) 1405e0ea3921Schristos mfhi ($25,$12,$9) 140676c4f342Schristos addu $3,$24 140776c4f342Schristos sltu $1,$3,$24 1408e0ea3921Schristos multu ($13,$8) # mul_add_c(a[1],b[0],c2,c3,c1); 140976c4f342Schristos addu $7,$25,$1 1410e0ea3921Schristos mflo ($24,$13,$8) 1411e0ea3921Schristos mfhi ($25,$13,$8) 141276c4f342Schristos addu $3,$24 141376c4f342Schristos sltu $1,$3,$24 1414e0ea3921Schristos multu ($14,$8) # mul_add_c(a[2],b[0],c3,c1,c2); 141576c4f342Schristos addu $25,$1 141676c4f342Schristos addu $7,$25 141776c4f342Schristos sltu $2,$7,$25 141876c4f342Schristos sw $3,4($4) 141976c4f342Schristos 1420e0ea3921Schristos mflo ($24,$14,$8) 1421e0ea3921Schristos mfhi ($25,$14,$8) 142276c4f342Schristos addu $7,$24 142376c4f342Schristos sltu $1,$7,$24 1424e0ea3921Schristos multu ($13,$9) # mul_add_c(a[1],b[1],c3,c1,c2); 142576c4f342Schristos addu $25,$1 142676c4f342Schristos addu $2,$25 1427e0ea3921Schristos mflo ($24,$13,$9) 1428e0ea3921Schristos mfhi ($25,$13,$9) 142976c4f342Schristos addu $7,$24 143076c4f342Schristos sltu $1,$7,$24 1431e0ea3921Schristos multu ($12,$10) # mul_add_c(a[0],b[2],c3,c1,c2); 143276c4f342Schristos addu $25,$1 143376c4f342Schristos addu $2,$25 143476c4f342Schristos sltu $3,$2,$25 1435e0ea3921Schristos mflo ($24,$12,$10) 1436e0ea3921Schristos mfhi ($25,$12,$10) 143776c4f342Schristos addu $7,$24 143876c4f342Schristos sltu $1,$7,$24 1439e0ea3921Schristos multu ($12,$11) # mul_add_c(a[0],b[3],c1,c2,c3); 144076c4f342Schristos addu $25,$1 144176c4f342Schristos addu $2,$25 144276c4f342Schristos sltu $1,$2,$25 144376c4f342Schristos addu $3,$1 144476c4f342Schristos sw $7,2*4($4) 144576c4f342Schristos 1446e0ea3921Schristos mflo ($24,$12,$11) 1447e0ea3921Schristos mfhi ($25,$12,$11) 144876c4f342Schristos addu $2,$24 144976c4f342Schristos sltu $1,$2,$24 1450e0ea3921Schristos multu ($13,$10) # mul_add_c(a[1],b[2],c1,c2,c3); 145176c4f342Schristos addu $25,$1 145276c4f342Schristos addu $3,$25 145376c4f342Schristos sltu $7,$3,$25 1454e0ea3921Schristos mflo ($24,$13,$10) 1455e0ea3921Schristos mfhi ($25,$13,$10) 145676c4f342Schristos addu $2,$24 145776c4f342Schristos sltu $1,$2,$24 1458e0ea3921Schristos multu ($14,$9) # mul_add_c(a[2],b[1],c1,c2,c3); 145976c4f342Schristos addu $25,$1 146076c4f342Schristos addu $3,$25 146176c4f342Schristos sltu $1,$3,$25 146276c4f342Schristos addu $7,$1 1463e0ea3921Schristos mflo ($24,$14,$9) 1464e0ea3921Schristos mfhi ($25,$14,$9) 146576c4f342Schristos addu $2,$24 146676c4f342Schristos sltu $1,$2,$24 1467e0ea3921Schristos multu ($15,$8) # mul_add_c(a[3],b[0],c1,c2,c3); 146876c4f342Schristos addu $25,$1 146976c4f342Schristos addu $3,$25 147076c4f342Schristos sltu $1,$3,$25 147176c4f342Schristos addu $7,$1 1472e0ea3921Schristos mflo ($24,$15,$8) 1473e0ea3921Schristos mfhi ($25,$15,$8) 147476c4f342Schristos addu $2,$24 147576c4f342Schristos sltu $1,$2,$24 1476e0ea3921Schristos multu ($15,$9) # mul_add_c(a[3],b[1],c2,c3,c1); 147776c4f342Schristos addu $25,$1 147876c4f342Schristos addu $3,$25 147976c4f342Schristos sltu $1,$3,$25 148076c4f342Schristos addu $7,$1 148176c4f342Schristos sw $2,3*4($4) 148276c4f342Schristos 1483e0ea3921Schristos mflo ($24,$15,$9) 1484e0ea3921Schristos mfhi ($25,$15,$9) 148576c4f342Schristos addu $3,$24 148676c4f342Schristos sltu $1,$3,$24 1487e0ea3921Schristos multu ($14,$10) # mul_add_c(a[2],b[2],c2,c3,c1); 148876c4f342Schristos addu $25,$1 148976c4f342Schristos addu $7,$25 149076c4f342Schristos sltu $2,$7,$25 1491e0ea3921Schristos mflo ($24,$14,$10) 1492e0ea3921Schristos mfhi ($25,$14,$10) 149376c4f342Schristos addu $3,$24 149476c4f342Schristos sltu $1,$3,$24 1495e0ea3921Schristos multu ($13,$11) # mul_add_c(a[1],b[3],c2,c3,c1); 149676c4f342Schristos addu $25,$1 149776c4f342Schristos addu $7,$25 149876c4f342Schristos sltu $1,$7,$25 149976c4f342Schristos addu $2,$1 1500e0ea3921Schristos mflo ($24,$13,$11) 1501e0ea3921Schristos mfhi ($25,$13,$11) 150276c4f342Schristos addu $3,$24 150376c4f342Schristos sltu $1,$3,$24 1504e0ea3921Schristos multu ($14,$11) # mul_add_c(a[2],b[3],c3,c1,c2); 150576c4f342Schristos addu $25,$1 150676c4f342Schristos addu $7,$25 150776c4f342Schristos sltu $1,$7,$25 150876c4f342Schristos addu $2,$1 150976c4f342Schristos sw $3,4*4($4) 151076c4f342Schristos 1511e0ea3921Schristos mflo ($24,$14,$11) 1512e0ea3921Schristos mfhi ($25,$14,$11) 151376c4f342Schristos addu $7,$24 151476c4f342Schristos sltu $1,$7,$24 1515e0ea3921Schristos multu ($15,$10) # mul_add_c(a[3],b[2],c3,c1,c2); 151676c4f342Schristos addu $25,$1 151776c4f342Schristos addu $2,$25 151876c4f342Schristos sltu $3,$2,$25 1519e0ea3921Schristos mflo ($24,$15,$10) 1520e0ea3921Schristos mfhi ($25,$15,$10) 152176c4f342Schristos addu $7,$24 152276c4f342Schristos sltu $1,$7,$24 1523e0ea3921Schristos multu ($15,$11) # mul_add_c(a[3],b[3],c1,c2,c3); 152476c4f342Schristos addu $25,$1 152576c4f342Schristos addu $2,$25 152676c4f342Schristos sltu $1,$2,$25 152776c4f342Schristos addu $3,$1 152876c4f342Schristos sw $7,5*4($4) 152976c4f342Schristos 1530e0ea3921Schristos mflo ($24,$15,$11) 1531e0ea3921Schristos mfhi ($25,$15,$11) 153276c4f342Schristos addu $2,$24 153376c4f342Schristos sltu $1,$2,$24 153476c4f342Schristos addu $25,$1 153576c4f342Schristos addu $3,$25 153676c4f342Schristos sw $2,6*4($4) 153776c4f342Schristos sw $3,7*4($4) 153876c4f342Schristos 153976c4f342Schristos .set noreorder 154076c4f342Schristos jr $31 154176c4f342Schristos nop 154276c4f342Schristos.end bn_mul_comba4 154376c4f342Schristos 154476c4f342Schristos.align 5 154576c4f342Schristos.globl bn_sqr_comba8 154676c4f342Schristos.ent bn_sqr_comba8 154776c4f342Schristosbn_sqr_comba8: 154876c4f342Schristos .set reorder 154976c4f342Schristos lw $12,0($5) 155076c4f342Schristos lw $13,4($5) 155176c4f342Schristos lw $14,2*4($5) 155276c4f342Schristos lw $15,3*4($5) 155376c4f342Schristos 1554e0ea3921Schristos multu ($12,$12) # mul_add_c(a[0],b[0],c1,c2,c3); 155576c4f342Schristos lw $8,4*4($5) 155676c4f342Schristos lw $9,5*4($5) 155776c4f342Schristos lw $10,6*4($5) 155876c4f342Schristos lw $11,7*4($5) 1559e0ea3921Schristos mflo ($2,$12,$12) 1560e0ea3921Schristos mfhi ($3,$12,$12) 156176c4f342Schristos sw $2,0($4) 156276c4f342Schristos 1563e0ea3921Schristos multu ($12,$13) # mul_add_c2(a[0],b[1],c2,c3,c1); 1564e0ea3921Schristos mflo ($24,$12,$13) 1565e0ea3921Schristos mfhi ($25,$12,$13) 156676c4f342Schristos slt $2,$25,$0 156776c4f342Schristos sll $25,1 1568e0ea3921Schristos multu ($14,$12) # mul_add_c2(a[2],b[0],c3,c1,c2); 156976c4f342Schristos slt $6,$24,$0 157076c4f342Schristos addu $25,$6 157176c4f342Schristos sll $24,1 157276c4f342Schristos addu $3,$24 157376c4f342Schristos sltu $1,$3,$24 157476c4f342Schristos addu $7,$25,$1 157576c4f342Schristos sw $3,4($4) 1576*1b3d6f93Schristos sltu $1,$7,$25 1577*1b3d6f93Schristos addu $2,$1 1578e0ea3921Schristos mflo ($24,$14,$12) 1579e0ea3921Schristos mfhi ($25,$14,$12) 158076c4f342Schristos addu $7,$24 158176c4f342Schristos sltu $1,$7,$24 1582e0ea3921Schristos multu ($13,$13) # forward multiplication 158376c4f342Schristos addu $7,$24 158476c4f342Schristos addu $1,$25 158576c4f342Schristos sltu $24,$7,$24 158676c4f342Schristos addu $2,$1 158776c4f342Schristos addu $25,$24 158876c4f342Schristos sltu $3,$2,$1 158976c4f342Schristos addu $2,$25 159076c4f342Schristos sltu $25,$2,$25 159176c4f342Schristos addu $3,$25 1592e0ea3921Schristos mflo ($24,$13,$13) 1593e0ea3921Schristos mfhi ($25,$13,$13) 159476c4f342Schristos addu $7,$24 159576c4f342Schristos sltu $1,$7,$24 1596e0ea3921Schristos multu ($12,$15) # mul_add_c2(a[0],b[3],c1,c2,c3); 159776c4f342Schristos addu $25,$1 159876c4f342Schristos addu $2,$25 159976c4f342Schristos sltu $1,$2,$25 160076c4f342Schristos addu $3,$1 160176c4f342Schristos sw $7,2*4($4) 1602e0ea3921Schristos mflo ($24,$12,$15) 1603e0ea3921Schristos mfhi ($25,$12,$15) 160476c4f342Schristos addu $2,$24 160576c4f342Schristos sltu $1,$2,$24 1606e0ea3921Schristos multu ($13,$14) # forward multiplication 160776c4f342Schristos addu $2,$24 160876c4f342Schristos addu $1,$25 160976c4f342Schristos sltu $24,$2,$24 161076c4f342Schristos addu $3,$1 161176c4f342Schristos addu $25,$24 161276c4f342Schristos sltu $7,$3,$1 161376c4f342Schristos addu $3,$25 161476c4f342Schristos sltu $25,$3,$25 161576c4f342Schristos addu $7,$25 1616e0ea3921Schristos mflo ($24,$13,$14) 1617e0ea3921Schristos mfhi ($25,$13,$14) 161876c4f342Schristos addu $2,$24 161976c4f342Schristos sltu $1,$2,$24 1620e0ea3921Schristos multu ($8,$12) # forward multiplication 162176c4f342Schristos addu $2,$24 162276c4f342Schristos addu $1,$25 162376c4f342Schristos sltu $24,$2,$24 162476c4f342Schristos addu $3,$1 162576c4f342Schristos addu $25,$24 162676c4f342Schristos sltu $1,$3,$1 162776c4f342Schristos addu $3,$25 162876c4f342Schristos addu $7,$1 162976c4f342Schristos sltu $25,$3,$25 163076c4f342Schristos addu $7,$25 1631e0ea3921Schristos mflo ($24,$8,$12) 1632e0ea3921Schristos mfhi ($25,$8,$12) 163376c4f342Schristos sw $2,3*4($4) 163476c4f342Schristos addu $3,$24 163576c4f342Schristos sltu $1,$3,$24 1636e0ea3921Schristos multu ($15,$13) # forward multiplication 163776c4f342Schristos addu $3,$24 163876c4f342Schristos addu $1,$25 163976c4f342Schristos sltu $24,$3,$24 164076c4f342Schristos addu $7,$1 164176c4f342Schristos addu $25,$24 164276c4f342Schristos sltu $2,$7,$1 164376c4f342Schristos addu $7,$25 164476c4f342Schristos sltu $25,$7,$25 164576c4f342Schristos addu $2,$25 1646e0ea3921Schristos mflo ($24,$15,$13) 1647e0ea3921Schristos mfhi ($25,$15,$13) 164876c4f342Schristos addu $3,$24 164976c4f342Schristos sltu $1,$3,$24 1650e0ea3921Schristos multu ($14,$14) # forward multiplication 165176c4f342Schristos addu $3,$24 165276c4f342Schristos addu $1,$25 165376c4f342Schristos sltu $24,$3,$24 165476c4f342Schristos addu $7,$1 165576c4f342Schristos addu $25,$24 165676c4f342Schristos sltu $1,$7,$1 165776c4f342Schristos addu $7,$25 165876c4f342Schristos addu $2,$1 165976c4f342Schristos sltu $25,$7,$25 166076c4f342Schristos addu $2,$25 1661e0ea3921Schristos mflo ($24,$14,$14) 1662e0ea3921Schristos mfhi ($25,$14,$14) 166376c4f342Schristos addu $3,$24 166476c4f342Schristos sltu $1,$3,$24 1665e0ea3921Schristos multu ($12,$9) # mul_add_c2(a[0],b[5],c3,c1,c2); 166676c4f342Schristos addu $25,$1 166776c4f342Schristos addu $7,$25 166876c4f342Schristos sltu $1,$7,$25 166976c4f342Schristos addu $2,$1 167076c4f342Schristos sw $3,4*4($4) 1671e0ea3921Schristos mflo ($24,$12,$9) 1672e0ea3921Schristos mfhi ($25,$12,$9) 167376c4f342Schristos addu $7,$24 167476c4f342Schristos sltu $1,$7,$24 1675e0ea3921Schristos multu ($13,$8) # forward multiplication 167676c4f342Schristos addu $7,$24 167776c4f342Schristos addu $1,$25 167876c4f342Schristos sltu $24,$7,$24 167976c4f342Schristos addu $2,$1 168076c4f342Schristos addu $25,$24 168176c4f342Schristos sltu $3,$2,$1 168276c4f342Schristos addu $2,$25 168376c4f342Schristos sltu $25,$2,$25 168476c4f342Schristos addu $3,$25 1685e0ea3921Schristos mflo ($24,$13,$8) 1686e0ea3921Schristos mfhi ($25,$13,$8) 168776c4f342Schristos addu $7,$24 168876c4f342Schristos sltu $1,$7,$24 1689e0ea3921Schristos multu ($14,$15) # forward multiplication 169076c4f342Schristos addu $7,$24 169176c4f342Schristos addu $1,$25 169276c4f342Schristos sltu $24,$7,$24 169376c4f342Schristos addu $2,$1 169476c4f342Schristos addu $25,$24 169576c4f342Schristos sltu $1,$2,$1 169676c4f342Schristos addu $2,$25 169776c4f342Schristos addu $3,$1 169876c4f342Schristos sltu $25,$2,$25 169976c4f342Schristos addu $3,$25 1700e0ea3921Schristos mflo ($24,$14,$15) 1701e0ea3921Schristos mfhi ($25,$14,$15) 170276c4f342Schristos addu $7,$24 170376c4f342Schristos sltu $1,$7,$24 1704e0ea3921Schristos multu ($10,$12) # forward multiplication 170576c4f342Schristos addu $7,$24 170676c4f342Schristos addu $1,$25 170776c4f342Schristos sltu $24,$7,$24 170876c4f342Schristos addu $2,$1 170976c4f342Schristos addu $25,$24 171076c4f342Schristos sltu $1,$2,$1 171176c4f342Schristos addu $2,$25 171276c4f342Schristos addu $3,$1 171376c4f342Schristos sltu $25,$2,$25 171476c4f342Schristos addu $3,$25 1715e0ea3921Schristos mflo ($24,$10,$12) 1716e0ea3921Schristos mfhi ($25,$10,$12) 171776c4f342Schristos sw $7,5*4($4) 171876c4f342Schristos addu $2,$24 171976c4f342Schristos sltu $1,$2,$24 1720e0ea3921Schristos multu ($9,$13) # forward multiplication 172176c4f342Schristos addu $2,$24 172276c4f342Schristos addu $1,$25 172376c4f342Schristos sltu $24,$2,$24 172476c4f342Schristos addu $3,$1 172576c4f342Schristos addu $25,$24 172676c4f342Schristos sltu $7,$3,$1 172776c4f342Schristos addu $3,$25 172876c4f342Schristos sltu $25,$3,$25 172976c4f342Schristos addu $7,$25 1730e0ea3921Schristos mflo ($24,$9,$13) 1731e0ea3921Schristos mfhi ($25,$9,$13) 173276c4f342Schristos addu $2,$24 173376c4f342Schristos sltu $1,$2,$24 1734e0ea3921Schristos multu ($8,$14) # forward multiplication 173576c4f342Schristos addu $2,$24 173676c4f342Schristos addu $1,$25 173776c4f342Schristos sltu $24,$2,$24 173876c4f342Schristos addu $3,$1 173976c4f342Schristos addu $25,$24 174076c4f342Schristos sltu $1,$3,$1 174176c4f342Schristos addu $3,$25 174276c4f342Schristos addu $7,$1 174376c4f342Schristos sltu $25,$3,$25 174476c4f342Schristos addu $7,$25 1745e0ea3921Schristos mflo ($24,$8,$14) 1746e0ea3921Schristos mfhi ($25,$8,$14) 174776c4f342Schristos addu $2,$24 174876c4f342Schristos sltu $1,$2,$24 1749e0ea3921Schristos multu ($15,$15) # forward multiplication 175076c4f342Schristos addu $2,$24 175176c4f342Schristos addu $1,$25 175276c4f342Schristos sltu $24,$2,$24 175376c4f342Schristos addu $3,$1 175476c4f342Schristos addu $25,$24 175576c4f342Schristos sltu $1,$3,$1 175676c4f342Schristos addu $3,$25 175776c4f342Schristos addu $7,$1 175876c4f342Schristos sltu $25,$3,$25 175976c4f342Schristos addu $7,$25 1760e0ea3921Schristos mflo ($24,$15,$15) 1761e0ea3921Schristos mfhi ($25,$15,$15) 176276c4f342Schristos addu $2,$24 176376c4f342Schristos sltu $1,$2,$24 1764e0ea3921Schristos multu ($12,$11) # mul_add_c2(a[0],b[7],c2,c3,c1); 176576c4f342Schristos addu $25,$1 176676c4f342Schristos addu $3,$25 176776c4f342Schristos sltu $1,$3,$25 176876c4f342Schristos addu $7,$1 176976c4f342Schristos sw $2,6*4($4) 1770e0ea3921Schristos mflo ($24,$12,$11) 1771e0ea3921Schristos mfhi ($25,$12,$11) 177276c4f342Schristos addu $3,$24 177376c4f342Schristos sltu $1,$3,$24 1774e0ea3921Schristos multu ($13,$10) # forward multiplication 177576c4f342Schristos addu $3,$24 177676c4f342Schristos addu $1,$25 177776c4f342Schristos sltu $24,$3,$24 177876c4f342Schristos addu $7,$1 177976c4f342Schristos addu $25,$24 178076c4f342Schristos sltu $2,$7,$1 178176c4f342Schristos addu $7,$25 178276c4f342Schristos sltu $25,$7,$25 178376c4f342Schristos addu $2,$25 1784e0ea3921Schristos mflo ($24,$13,$10) 1785e0ea3921Schristos mfhi ($25,$13,$10) 178676c4f342Schristos addu $3,$24 178776c4f342Schristos sltu $1,$3,$24 1788e0ea3921Schristos multu ($14,$9) # forward multiplication 178976c4f342Schristos addu $3,$24 179076c4f342Schristos addu $1,$25 179176c4f342Schristos sltu $24,$3,$24 179276c4f342Schristos addu $7,$1 179376c4f342Schristos addu $25,$24 179476c4f342Schristos sltu $1,$7,$1 179576c4f342Schristos addu $7,$25 179676c4f342Schristos addu $2,$1 179776c4f342Schristos sltu $25,$7,$25 179876c4f342Schristos addu $2,$25 1799e0ea3921Schristos mflo ($24,$14,$9) 1800e0ea3921Schristos mfhi ($25,$14,$9) 180176c4f342Schristos addu $3,$24 180276c4f342Schristos sltu $1,$3,$24 1803e0ea3921Schristos multu ($15,$8) # forward multiplication 180476c4f342Schristos addu $3,$24 180576c4f342Schristos addu $1,$25 180676c4f342Schristos sltu $24,$3,$24 180776c4f342Schristos addu $7,$1 180876c4f342Schristos addu $25,$24 180976c4f342Schristos sltu $1,$7,$1 181076c4f342Schristos addu $7,$25 181176c4f342Schristos addu $2,$1 181276c4f342Schristos sltu $25,$7,$25 181376c4f342Schristos addu $2,$25 1814e0ea3921Schristos mflo ($24,$15,$8) 1815e0ea3921Schristos mfhi ($25,$15,$8) 181676c4f342Schristos addu $3,$24 181776c4f342Schristos sltu $1,$3,$24 1818e0ea3921Schristos multu ($11,$13) # forward multiplication 181976c4f342Schristos addu $3,$24 182076c4f342Schristos addu $1,$25 182176c4f342Schristos sltu $24,$3,$24 182276c4f342Schristos addu $7,$1 182376c4f342Schristos addu $25,$24 182476c4f342Schristos sltu $1,$7,$1 182576c4f342Schristos addu $7,$25 182676c4f342Schristos addu $2,$1 182776c4f342Schristos sltu $25,$7,$25 182876c4f342Schristos addu $2,$25 1829e0ea3921Schristos mflo ($24,$11,$13) 1830e0ea3921Schristos mfhi ($25,$11,$13) 183176c4f342Schristos sw $3,7*4($4) 183276c4f342Schristos addu $7,$24 183376c4f342Schristos sltu $1,$7,$24 1834e0ea3921Schristos multu ($10,$14) # forward multiplication 183576c4f342Schristos addu $7,$24 183676c4f342Schristos addu $1,$25 183776c4f342Schristos sltu $24,$7,$24 183876c4f342Schristos addu $2,$1 183976c4f342Schristos addu $25,$24 184076c4f342Schristos sltu $3,$2,$1 184176c4f342Schristos addu $2,$25 184276c4f342Schristos sltu $25,$2,$25 184376c4f342Schristos addu $3,$25 1844e0ea3921Schristos mflo ($24,$10,$14) 1845e0ea3921Schristos mfhi ($25,$10,$14) 184676c4f342Schristos addu $7,$24 184776c4f342Schristos sltu $1,$7,$24 1848e0ea3921Schristos multu ($9,$15) # forward multiplication 184976c4f342Schristos addu $7,$24 185076c4f342Schristos addu $1,$25 185176c4f342Schristos sltu $24,$7,$24 185276c4f342Schristos addu $2,$1 185376c4f342Schristos addu $25,$24 185476c4f342Schristos sltu $1,$2,$1 185576c4f342Schristos addu $2,$25 185676c4f342Schristos addu $3,$1 185776c4f342Schristos sltu $25,$2,$25 185876c4f342Schristos addu $3,$25 1859e0ea3921Schristos mflo ($24,$9,$15) 1860e0ea3921Schristos mfhi ($25,$9,$15) 186176c4f342Schristos addu $7,$24 186276c4f342Schristos sltu $1,$7,$24 1863e0ea3921Schristos multu ($8,$8) # forward multiplication 186476c4f342Schristos addu $7,$24 186576c4f342Schristos addu $1,$25 186676c4f342Schristos sltu $24,$7,$24 186776c4f342Schristos addu $2,$1 186876c4f342Schristos addu $25,$24 186976c4f342Schristos sltu $1,$2,$1 187076c4f342Schristos addu $2,$25 187176c4f342Schristos addu $3,$1 187276c4f342Schristos sltu $25,$2,$25 187376c4f342Schristos addu $3,$25 1874e0ea3921Schristos mflo ($24,$8,$8) 1875e0ea3921Schristos mfhi ($25,$8,$8) 187676c4f342Schristos addu $7,$24 187776c4f342Schristos sltu $1,$7,$24 1878e0ea3921Schristos multu ($14,$11) # mul_add_c2(a[2],b[7],c1,c2,c3); 187976c4f342Schristos addu $25,$1 188076c4f342Schristos addu $2,$25 188176c4f342Schristos sltu $1,$2,$25 188276c4f342Schristos addu $3,$1 188376c4f342Schristos sw $7,8*4($4) 1884e0ea3921Schristos mflo ($24,$14,$11) 1885e0ea3921Schristos mfhi ($25,$14,$11) 188676c4f342Schristos addu $2,$24 188776c4f342Schristos sltu $1,$2,$24 1888e0ea3921Schristos multu ($15,$10) # forward multiplication 188976c4f342Schristos addu $2,$24 189076c4f342Schristos addu $1,$25 189176c4f342Schristos sltu $24,$2,$24 189276c4f342Schristos addu $3,$1 189376c4f342Schristos addu $25,$24 189476c4f342Schristos sltu $7,$3,$1 189576c4f342Schristos addu $3,$25 189676c4f342Schristos sltu $25,$3,$25 189776c4f342Schristos addu $7,$25 1898e0ea3921Schristos mflo ($24,$15,$10) 1899e0ea3921Schristos mfhi ($25,$15,$10) 190076c4f342Schristos addu $2,$24 190176c4f342Schristos sltu $1,$2,$24 1902e0ea3921Schristos multu ($8,$9) # forward multiplication 190376c4f342Schristos addu $2,$24 190476c4f342Schristos addu $1,$25 190576c4f342Schristos sltu $24,$2,$24 190676c4f342Schristos addu $3,$1 190776c4f342Schristos addu $25,$24 190876c4f342Schristos sltu $1,$3,$1 190976c4f342Schristos addu $3,$25 191076c4f342Schristos addu $7,$1 191176c4f342Schristos sltu $25,$3,$25 191276c4f342Schristos addu $7,$25 1913e0ea3921Schristos mflo ($24,$8,$9) 1914e0ea3921Schristos mfhi ($25,$8,$9) 191576c4f342Schristos addu $2,$24 191676c4f342Schristos sltu $1,$2,$24 1917e0ea3921Schristos multu ($11,$15) # forward multiplication 191876c4f342Schristos addu $2,$24 191976c4f342Schristos addu $1,$25 192076c4f342Schristos sltu $24,$2,$24 192176c4f342Schristos addu $3,$1 192276c4f342Schristos addu $25,$24 192376c4f342Schristos sltu $1,$3,$1 192476c4f342Schristos addu $3,$25 192576c4f342Schristos addu $7,$1 192676c4f342Schristos sltu $25,$3,$25 192776c4f342Schristos addu $7,$25 1928e0ea3921Schristos mflo ($24,$11,$15) 1929e0ea3921Schristos mfhi ($25,$11,$15) 193076c4f342Schristos sw $2,9*4($4) 193176c4f342Schristos addu $3,$24 193276c4f342Schristos sltu $1,$3,$24 1933e0ea3921Schristos multu ($10,$8) # forward multiplication 193476c4f342Schristos addu $3,$24 193576c4f342Schristos addu $1,$25 193676c4f342Schristos sltu $24,$3,$24 193776c4f342Schristos addu $7,$1 193876c4f342Schristos addu $25,$24 193976c4f342Schristos sltu $2,$7,$1 194076c4f342Schristos addu $7,$25 194176c4f342Schristos sltu $25,$7,$25 194276c4f342Schristos addu $2,$25 1943e0ea3921Schristos mflo ($24,$10,$8) 1944e0ea3921Schristos mfhi ($25,$10,$8) 194576c4f342Schristos addu $3,$24 194676c4f342Schristos sltu $1,$3,$24 1947e0ea3921Schristos multu ($9,$9) # forward multiplication 194876c4f342Schristos addu $3,$24 194976c4f342Schristos addu $1,$25 195076c4f342Schristos sltu $24,$3,$24 195176c4f342Schristos addu $7,$1 195276c4f342Schristos addu $25,$24 195376c4f342Schristos sltu $1,$7,$1 195476c4f342Schristos addu $7,$25 195576c4f342Schristos addu $2,$1 195676c4f342Schristos sltu $25,$7,$25 195776c4f342Schristos addu $2,$25 1958e0ea3921Schristos mflo ($24,$9,$9) 1959e0ea3921Schristos mfhi ($25,$9,$9) 196076c4f342Schristos addu $3,$24 196176c4f342Schristos sltu $1,$3,$24 1962e0ea3921Schristos multu ($8,$11) # mul_add_c2(a[4],b[7],c3,c1,c2); 196376c4f342Schristos addu $25,$1 196476c4f342Schristos addu $7,$25 196576c4f342Schristos sltu $1,$7,$25 196676c4f342Schristos addu $2,$1 196776c4f342Schristos sw $3,10*4($4) 1968e0ea3921Schristos mflo ($24,$8,$11) 1969e0ea3921Schristos mfhi ($25,$8,$11) 197076c4f342Schristos addu $7,$24 197176c4f342Schristos sltu $1,$7,$24 1972e0ea3921Schristos multu ($9,$10) # forward multiplication 197376c4f342Schristos addu $7,$24 197476c4f342Schristos addu $1,$25 197576c4f342Schristos sltu $24,$7,$24 197676c4f342Schristos addu $2,$1 197776c4f342Schristos addu $25,$24 197876c4f342Schristos sltu $3,$2,$1 197976c4f342Schristos addu $2,$25 198076c4f342Schristos sltu $25,$2,$25 198176c4f342Schristos addu $3,$25 1982e0ea3921Schristos mflo ($24,$9,$10) 1983e0ea3921Schristos mfhi ($25,$9,$10) 198476c4f342Schristos addu $7,$24 198576c4f342Schristos sltu $1,$7,$24 1986e0ea3921Schristos multu ($11,$9) # forward multiplication 198776c4f342Schristos addu $7,$24 198876c4f342Schristos addu $1,$25 198976c4f342Schristos sltu $24,$7,$24 199076c4f342Schristos addu $2,$1 199176c4f342Schristos addu $25,$24 199276c4f342Schristos sltu $1,$2,$1 199376c4f342Schristos addu $2,$25 199476c4f342Schristos addu $3,$1 199576c4f342Schristos sltu $25,$2,$25 199676c4f342Schristos addu $3,$25 1997e0ea3921Schristos mflo ($24,$11,$9) 1998e0ea3921Schristos mfhi ($25,$11,$9) 199976c4f342Schristos sw $7,11*4($4) 200076c4f342Schristos addu $2,$24 200176c4f342Schristos sltu $1,$2,$24 2002e0ea3921Schristos multu ($10,$10) # forward multiplication 200376c4f342Schristos addu $2,$24 200476c4f342Schristos addu $1,$25 200576c4f342Schristos sltu $24,$2,$24 200676c4f342Schristos addu $3,$1 200776c4f342Schristos addu $25,$24 200876c4f342Schristos sltu $7,$3,$1 200976c4f342Schristos addu $3,$25 201076c4f342Schristos sltu $25,$3,$25 201176c4f342Schristos addu $7,$25 2012e0ea3921Schristos mflo ($24,$10,$10) 2013e0ea3921Schristos mfhi ($25,$10,$10) 201476c4f342Schristos addu $2,$24 201576c4f342Schristos sltu $1,$2,$24 2016e0ea3921Schristos multu ($10,$11) # mul_add_c2(a[6],b[7],c2,c3,c1); 201776c4f342Schristos addu $25,$1 201876c4f342Schristos addu $3,$25 201976c4f342Schristos sltu $1,$3,$25 202076c4f342Schristos addu $7,$1 202176c4f342Schristos sw $2,12*4($4) 2022e0ea3921Schristos mflo ($24,$10,$11) 2023e0ea3921Schristos mfhi ($25,$10,$11) 202476c4f342Schristos addu $3,$24 202576c4f342Schristos sltu $1,$3,$24 2026e0ea3921Schristos multu ($11,$11) # forward multiplication 202776c4f342Schristos addu $3,$24 202876c4f342Schristos addu $1,$25 202976c4f342Schristos sltu $24,$3,$24 203076c4f342Schristos addu $7,$1 203176c4f342Schristos addu $25,$24 203276c4f342Schristos sltu $2,$7,$1 203376c4f342Schristos addu $7,$25 203476c4f342Schristos sltu $25,$7,$25 203576c4f342Schristos addu $2,$25 2036e0ea3921Schristos mflo ($24,$11,$11) 2037e0ea3921Schristos mfhi ($25,$11,$11) 203876c4f342Schristos sw $3,13*4($4) 203976c4f342Schristos 204076c4f342Schristos addu $7,$24 204176c4f342Schristos sltu $1,$7,$24 204276c4f342Schristos addu $25,$1 204376c4f342Schristos addu $2,$25 204476c4f342Schristos sw $7,14*4($4) 204576c4f342Schristos sw $2,15*4($4) 204676c4f342Schristos 204776c4f342Schristos .set noreorder 204876c4f342Schristos jr $31 204976c4f342Schristos nop 205076c4f342Schristos.end bn_sqr_comba8 205176c4f342Schristos 205276c4f342Schristos.align 5 205376c4f342Schristos.globl bn_sqr_comba4 205476c4f342Schristos.ent bn_sqr_comba4 205576c4f342Schristosbn_sqr_comba4: 205676c4f342Schristos .set reorder 205776c4f342Schristos lw $12,0($5) 205876c4f342Schristos lw $13,4($5) 2059e0ea3921Schristos multu ($12,$12) # mul_add_c(a[0],b[0],c1,c2,c3); 206076c4f342Schristos lw $14,2*4($5) 206176c4f342Schristos lw $15,3*4($5) 2062e0ea3921Schristos mflo ($2,$12,$12) 2063e0ea3921Schristos mfhi ($3,$12,$12) 206476c4f342Schristos sw $2,0($4) 206576c4f342Schristos 2066e0ea3921Schristos multu ($12,$13) # mul_add_c2(a[0],b[1],c2,c3,c1); 2067e0ea3921Schristos mflo ($24,$12,$13) 2068e0ea3921Schristos mfhi ($25,$12,$13) 206976c4f342Schristos slt $2,$25,$0 207076c4f342Schristos sll $25,1 2071e0ea3921Schristos multu ($14,$12) # mul_add_c2(a[2],b[0],c3,c1,c2); 207276c4f342Schristos slt $6,$24,$0 207376c4f342Schristos addu $25,$6 207476c4f342Schristos sll $24,1 207576c4f342Schristos addu $3,$24 207676c4f342Schristos sltu $1,$3,$24 207776c4f342Schristos addu $7,$25,$1 207876c4f342Schristos sw $3,4($4) 2079*1b3d6f93Schristos sltu $1,$7,$25 2080*1b3d6f93Schristos addu $2,$1 2081e0ea3921Schristos mflo ($24,$14,$12) 2082e0ea3921Schristos mfhi ($25,$14,$12) 208376c4f342Schristos addu $7,$24 208476c4f342Schristos sltu $1,$7,$24 2085e0ea3921Schristos multu ($13,$13) # forward multiplication 208676c4f342Schristos addu $7,$24 208776c4f342Schristos addu $1,$25 208876c4f342Schristos sltu $24,$7,$24 208976c4f342Schristos addu $2,$1 209076c4f342Schristos addu $25,$24 209176c4f342Schristos sltu $3,$2,$1 209276c4f342Schristos addu $2,$25 209376c4f342Schristos sltu $25,$2,$25 209476c4f342Schristos addu $3,$25 2095e0ea3921Schristos mflo ($24,$13,$13) 2096e0ea3921Schristos mfhi ($25,$13,$13) 209776c4f342Schristos addu $7,$24 209876c4f342Schristos sltu $1,$7,$24 2099e0ea3921Schristos multu ($12,$15) # mul_add_c2(a[0],b[3],c1,c2,c3); 210076c4f342Schristos addu $25,$1 210176c4f342Schristos addu $2,$25 210276c4f342Schristos sltu $1,$2,$25 210376c4f342Schristos addu $3,$1 210476c4f342Schristos sw $7,2*4($4) 2105e0ea3921Schristos mflo ($24,$12,$15) 2106e0ea3921Schristos mfhi ($25,$12,$15) 210776c4f342Schristos addu $2,$24 210876c4f342Schristos sltu $1,$2,$24 2109e0ea3921Schristos multu ($13,$14) # forward multiplication 211076c4f342Schristos addu $2,$24 211176c4f342Schristos addu $1,$25 211276c4f342Schristos sltu $24,$2,$24 211376c4f342Schristos addu $3,$1 211476c4f342Schristos addu $25,$24 211576c4f342Schristos sltu $7,$3,$1 211676c4f342Schristos addu $3,$25 211776c4f342Schristos sltu $25,$3,$25 211876c4f342Schristos addu $7,$25 2119e0ea3921Schristos mflo ($24,$13,$14) 2120e0ea3921Schristos mfhi ($25,$13,$14) 212176c4f342Schristos addu $2,$24 212276c4f342Schristos sltu $1,$2,$24 2123e0ea3921Schristos multu ($15,$13) # forward multiplication 212476c4f342Schristos addu $2,$24 212576c4f342Schristos addu $1,$25 212676c4f342Schristos sltu $24,$2,$24 212776c4f342Schristos addu $3,$1 212876c4f342Schristos addu $25,$24 212976c4f342Schristos sltu $1,$3,$1 213076c4f342Schristos addu $3,$25 213176c4f342Schristos addu $7,$1 213276c4f342Schristos sltu $25,$3,$25 213376c4f342Schristos addu $7,$25 2134e0ea3921Schristos mflo ($24,$15,$13) 2135e0ea3921Schristos mfhi ($25,$15,$13) 213676c4f342Schristos sw $2,3*4($4) 213776c4f342Schristos addu $3,$24 213876c4f342Schristos sltu $1,$3,$24 2139e0ea3921Schristos multu ($14,$14) # forward multiplication 214076c4f342Schristos addu $3,$24 214176c4f342Schristos addu $1,$25 214276c4f342Schristos sltu $24,$3,$24 214376c4f342Schristos addu $7,$1 214476c4f342Schristos addu $25,$24 214576c4f342Schristos sltu $2,$7,$1 214676c4f342Schristos addu $7,$25 214776c4f342Schristos sltu $25,$7,$25 214876c4f342Schristos addu $2,$25 2149e0ea3921Schristos mflo ($24,$14,$14) 2150e0ea3921Schristos mfhi ($25,$14,$14) 215176c4f342Schristos addu $3,$24 215276c4f342Schristos sltu $1,$3,$24 2153e0ea3921Schristos multu ($14,$15) # mul_add_c2(a[2],b[3],c3,c1,c2); 215476c4f342Schristos addu $25,$1 215576c4f342Schristos addu $7,$25 215676c4f342Schristos sltu $1,$7,$25 215776c4f342Schristos addu $2,$1 215876c4f342Schristos sw $3,4*4($4) 2159e0ea3921Schristos mflo ($24,$14,$15) 2160e0ea3921Schristos mfhi ($25,$14,$15) 216176c4f342Schristos addu $7,$24 216276c4f342Schristos sltu $1,$7,$24 2163e0ea3921Schristos multu ($15,$15) # forward multiplication 216476c4f342Schristos addu $7,$24 216576c4f342Schristos addu $1,$25 216676c4f342Schristos sltu $24,$7,$24 216776c4f342Schristos addu $2,$1 216876c4f342Schristos addu $25,$24 216976c4f342Schristos sltu $3,$2,$1 217076c4f342Schristos addu $2,$25 217176c4f342Schristos sltu $25,$2,$25 217276c4f342Schristos addu $3,$25 2173e0ea3921Schristos mflo ($24,$15,$15) 2174e0ea3921Schristos mfhi ($25,$15,$15) 217576c4f342Schristos sw $7,5*4($4) 217676c4f342Schristos 217776c4f342Schristos addu $2,$24 217876c4f342Schristos sltu $1,$2,$24 217976c4f342Schristos addu $25,$1 218076c4f342Schristos addu $3,$25 218176c4f342Schristos sw $2,6*4($4) 218276c4f342Schristos sw $3,7*4($4) 218376c4f342Schristos 218476c4f342Schristos .set noreorder 218576c4f342Schristos jr $31 218676c4f342Schristos nop 218776c4f342Schristos.end bn_sqr_comba4 2188