1*e0ea3921Schristos#include "mips_arch.h" 2*e0ea3921Schristos 376c4f342Schristos.text 476c4f342Schristos 576c4f342Schristos.set noat 676c4f342Schristos.set noreorder 776c4f342Schristos 876c4f342Schristos.align 5 976c4f342Schristos.globl bn_mul_mont 1076c4f342Schristos.ent bn_mul_mont 1176c4f342Schristosbn_mul_mont: 126410c867Schristos lw $8,16($29) 136410c867Schristos lw $9,20($29) 1476c4f342Schristos slt $1,$9,4 1576c4f342Schristos bnez $1,1f 1676c4f342Schristos li $2,0 1776c4f342Schristos slt $1,$9,17 # on in-order CPU 1876c4f342Schristos bnez $1,bn_mul_mont_internal 1976c4f342Schristos nop 2076c4f342Schristos1: jr $31 2176c4f342Schristos li $4,0 2276c4f342Schristos.end bn_mul_mont 2376c4f342Schristos 2476c4f342Schristos.align 5 2576c4f342Schristos.ent bn_mul_mont_internal 2676c4f342Schristosbn_mul_mont_internal: 2776c4f342Schristos .frame $30,14*4,$31 2876c4f342Schristos .mask 0x40000000|16711680,-4 29*e0ea3921Schristos subu $29,14*4 3076c4f342Schristos sw $30,(14-1)*4($29) 3176c4f342Schristos sw $23,(14-2)*4($29) 3276c4f342Schristos sw $22,(14-3)*4($29) 3376c4f342Schristos sw $21,(14-4)*4($29) 3476c4f342Schristos sw $20,(14-5)*4($29) 3576c4f342Schristos sw $19,(14-6)*4($29) 3676c4f342Schristos sw $18,(14-7)*4($29) 3776c4f342Schristos sw $17,(14-8)*4($29) 3876c4f342Schristos sw $16,(14-9)*4($29) 3976c4f342Schristos move $30,$29 4076c4f342Schristos 4176c4f342Schristos .set reorder 4276c4f342Schristos lw $8,0($8) 4376c4f342Schristos lw $13,0($6) # bp[0] 4476c4f342Schristos lw $12,0($5) # ap[0] 4576c4f342Schristos lw $14,0($7) # np[0] 4676c4f342Schristos 47*e0ea3921Schristos subu $29,2*4 # place for two extra words 4876c4f342Schristos sll $9,2 4976c4f342Schristos li $1,-4096 50*e0ea3921Schristos subu $29,$9 5176c4f342Schristos and $29,$1 5276c4f342Schristos 53*e0ea3921Schristos multu ($12,$13) 54*e0ea3921Schristos lw $17,4($5) 55*e0ea3921Schristos lw $19,4($7) 56*e0ea3921Schristos mflo ($10,$12,$13) 57*e0ea3921Schristos mfhi ($11,$12,$13) 58*e0ea3921Schristos multu ($10,$8) 59*e0ea3921Schristos mflo ($23,$10,$8) 6076c4f342Schristos 61*e0ea3921Schristos multu ($17,$13) 62*e0ea3921Schristos mflo ($16,$17,$13) 63*e0ea3921Schristos mfhi ($17,$17,$13) 6476c4f342Schristos 65*e0ea3921Schristos multu ($14,$23) 66*e0ea3921Schristos mflo ($24,$14,$23) 67*e0ea3921Schristos mfhi ($25,$14,$23) 68*e0ea3921Schristos multu ($19,$23) 6976c4f342Schristos addu $24,$10 7076c4f342Schristos sltu $1,$24,$10 7176c4f342Schristos addu $25,$1 72*e0ea3921Schristos mflo ($18,$19,$23) 73*e0ea3921Schristos mfhi ($19,$19,$23) 7476c4f342Schristos 7576c4f342Schristos move $15,$29 7676c4f342Schristos li $22,2*4 7776c4f342Schristos.align 4 7876c4f342Schristos.L1st: 7976c4f342Schristos .set noreorder 80*e0ea3921Schristos addu $12,$5,$22 81*e0ea3921Schristos addu $14,$7,$22 8276c4f342Schristos lw $12,($12) 8376c4f342Schristos lw $14,($14) 8476c4f342Schristos 85*e0ea3921Schristos multu ($12,$13) 8676c4f342Schristos addu $10,$16,$11 8776c4f342Schristos addu $24,$18,$25 8876c4f342Schristos sltu $1,$10,$11 8976c4f342Schristos sltu $2,$24,$25 9076c4f342Schristos addu $11,$17,$1 9176c4f342Schristos addu $25,$19,$2 92*e0ea3921Schristos mflo ($16,$12,$13) 93*e0ea3921Schristos mfhi ($17,$12,$13) 9476c4f342Schristos 9576c4f342Schristos addu $24,$10 9676c4f342Schristos sltu $1,$24,$10 97*e0ea3921Schristos multu ($14,$23) 9876c4f342Schristos addu $25,$1 9976c4f342Schristos addu $22,4 10076c4f342Schristos sw $24,($15) 10176c4f342Schristos sltu $2,$22,$9 102*e0ea3921Schristos mflo ($18,$14,$23) 103*e0ea3921Schristos mfhi ($19,$14,$23) 10476c4f342Schristos 10576c4f342Schristos bnez $2,.L1st 106*e0ea3921Schristos addu $15,4 10776c4f342Schristos .set reorder 10876c4f342Schristos 10976c4f342Schristos addu $10,$16,$11 11076c4f342Schristos sltu $1,$10,$11 11176c4f342Schristos addu $11,$17,$1 11276c4f342Schristos 11376c4f342Schristos addu $24,$18,$25 11476c4f342Schristos sltu $2,$24,$25 11576c4f342Schristos addu $25,$19,$2 11676c4f342Schristos addu $24,$10 11776c4f342Schristos sltu $1,$24,$10 11876c4f342Schristos addu $25,$1 11976c4f342Schristos 12076c4f342Schristos sw $24,($15) 12176c4f342Schristos 12276c4f342Schristos addu $25,$11 12376c4f342Schristos sltu $1,$25,$11 12476c4f342Schristos sw $25,4($15) 12576c4f342Schristos sw $1,2*4($15) 12676c4f342Schristos 12776c4f342Schristos li $21,4 12876c4f342Schristos.align 4 12976c4f342Schristos.Louter: 130*e0ea3921Schristos addu $13,$6,$21 13176c4f342Schristos lw $13,($13) 13276c4f342Schristos lw $12,($5) 133*e0ea3921Schristos lw $17,4($5) 13476c4f342Schristos lw $20,($29) 13576c4f342Schristos 136*e0ea3921Schristos multu ($12,$13) 13776c4f342Schristos lw $14,($7) 138*e0ea3921Schristos lw $19,4($7) 139*e0ea3921Schristos mflo ($10,$12,$13) 140*e0ea3921Schristos mfhi ($11,$12,$13) 14176c4f342Schristos addu $10,$20 142*e0ea3921Schristos multu ($10,$8) 14376c4f342Schristos sltu $1,$10,$20 14476c4f342Schristos addu $11,$1 145*e0ea3921Schristos mflo ($23,$10,$8) 14676c4f342Schristos 147*e0ea3921Schristos multu ($17,$13) 148*e0ea3921Schristos mflo ($16,$17,$13) 149*e0ea3921Schristos mfhi ($17,$17,$13) 15076c4f342Schristos 151*e0ea3921Schristos multu ($14,$23) 152*e0ea3921Schristos mflo ($24,$14,$23) 153*e0ea3921Schristos mfhi ($25,$14,$23) 15476c4f342Schristos 155*e0ea3921Schristos multu ($19,$23) 15676c4f342Schristos addu $24,$10 15776c4f342Schristos sltu $1,$24,$10 15876c4f342Schristos addu $25,$1 159*e0ea3921Schristos mflo ($18,$19,$23) 160*e0ea3921Schristos mfhi ($19,$19,$23) 16176c4f342Schristos 16276c4f342Schristos move $15,$29 16376c4f342Schristos li $22,2*4 16476c4f342Schristos lw $20,4($15) 16576c4f342Schristos.align 4 16676c4f342Schristos.Linner: 16776c4f342Schristos .set noreorder 168*e0ea3921Schristos addu $12,$5,$22 169*e0ea3921Schristos addu $14,$7,$22 17076c4f342Schristos lw $12,($12) 17176c4f342Schristos lw $14,($14) 17276c4f342Schristos 173*e0ea3921Schristos multu ($12,$13) 17476c4f342Schristos addu $10,$16,$11 17576c4f342Schristos addu $24,$18,$25 17676c4f342Schristos sltu $1,$10,$11 17776c4f342Schristos sltu $2,$24,$25 17876c4f342Schristos addu $11,$17,$1 17976c4f342Schristos addu $25,$19,$2 180*e0ea3921Schristos mflo ($16,$12,$13) 181*e0ea3921Schristos mfhi ($17,$12,$13) 18276c4f342Schristos 18376c4f342Schristos addu $10,$20 18476c4f342Schristos addu $22,4 185*e0ea3921Schristos multu ($14,$23) 18676c4f342Schristos sltu $1,$10,$20 18776c4f342Schristos addu $24,$10 18876c4f342Schristos addu $11,$1 18976c4f342Schristos sltu $2,$24,$10 19076c4f342Schristos lw $20,2*4($15) 19176c4f342Schristos addu $25,$2 19276c4f342Schristos sltu $1,$22,$9 193*e0ea3921Schristos mflo ($18,$14,$23) 194*e0ea3921Schristos mfhi ($19,$14,$23) 19576c4f342Schristos sw $24,($15) 19676c4f342Schristos bnez $1,.Linner 197*e0ea3921Schristos addu $15,4 19876c4f342Schristos .set reorder 19976c4f342Schristos 20076c4f342Schristos addu $10,$16,$11 20176c4f342Schristos sltu $1,$10,$11 20276c4f342Schristos addu $11,$17,$1 20376c4f342Schristos addu $10,$20 20476c4f342Schristos sltu $2,$10,$20 20576c4f342Schristos addu $11,$2 20676c4f342Schristos 20776c4f342Schristos lw $20,2*4($15) 20876c4f342Schristos addu $24,$18,$25 20976c4f342Schristos sltu $1,$24,$25 21076c4f342Schristos addu $25,$19,$1 21176c4f342Schristos addu $24,$10 21276c4f342Schristos sltu $2,$24,$10 21376c4f342Schristos addu $25,$2 21476c4f342Schristos sw $24,($15) 21576c4f342Schristos 21676c4f342Schristos addu $24,$25,$11 21776c4f342Schristos sltu $25,$24,$11 21876c4f342Schristos addu $24,$20 21976c4f342Schristos sltu $1,$24,$20 22076c4f342Schristos addu $25,$1 22176c4f342Schristos sw $24,4($15) 22276c4f342Schristos sw $25,2*4($15) 22376c4f342Schristos 22476c4f342Schristos addu $21,4 22576c4f342Schristos sltu $2,$21,$9 22676c4f342Schristos bnez $2,.Louter 22776c4f342Schristos 22876c4f342Schristos .set noreorder 229*e0ea3921Schristos addu $20,$29,$9 # &tp[num] 23076c4f342Schristos move $15,$29 23176c4f342Schristos move $5,$29 23276c4f342Schristos li $11,0 # clear borrow bit 23376c4f342Schristos 23476c4f342Schristos.align 4 23576c4f342Schristos.Lsub: lw $10,($15) 23676c4f342Schristos lw $24,($7) 237*e0ea3921Schristos addu $15,4 238*e0ea3921Schristos addu $7,4 23976c4f342Schristos subu $24,$10,$24 # tp[i]-np[i] 24076c4f342Schristos sgtu $1,$24,$10 24176c4f342Schristos subu $10,$24,$11 24276c4f342Schristos sgtu $11,$10,$24 24376c4f342Schristos sw $10,($4) 24476c4f342Schristos or $11,$1 24576c4f342Schristos sltu $1,$15,$20 24676c4f342Schristos bnez $1,.Lsub 247*e0ea3921Schristos addu $4,4 24876c4f342Schristos 24976c4f342Schristos subu $11,$25,$11 # handle upmost overflow bit 25076c4f342Schristos move $15,$29 251*e0ea3921Schristos subu $4,$9 # restore rp 25276c4f342Schristos not $25,$11 25376c4f342Schristos 254*e0ea3921Schristos.Lcopy: lw $14,($15) # conditional move 255*e0ea3921Schristos lw $12,($4) 25676c4f342Schristos sw $0,($15) 257*e0ea3921Schristos addu $15,4 258*e0ea3921Schristos and $14,$11 259*e0ea3921Schristos and $12,$25 260*e0ea3921Schristos or $12,$14 26176c4f342Schristos sltu $1,$15,$20 26276c4f342Schristos sw $12,($4) 26376c4f342Schristos bnez $1,.Lcopy 264*e0ea3921Schristos addu $4,4 26576c4f342Schristos 26676c4f342Schristos li $4,1 26776c4f342Schristos li $2,1 26876c4f342Schristos 26976c4f342Schristos .set noreorder 27076c4f342Schristos move $29,$30 27176c4f342Schristos lw $30,(14-1)*4($29) 27276c4f342Schristos lw $23,(14-2)*4($29) 27376c4f342Schristos lw $22,(14-3)*4($29) 27476c4f342Schristos lw $21,(14-4)*4($29) 27576c4f342Schristos lw $20,(14-5)*4($29) 27676c4f342Schristos lw $19,(14-6)*4($29) 27776c4f342Schristos lw $18,(14-7)*4($29) 27876c4f342Schristos lw $17,(14-8)*4($29) 27976c4f342Schristos lw $16,(14-9)*4($29) 28076c4f342Schristos jr $31 281*e0ea3921Schristos addu $29,14*4 28276c4f342Schristos.end bn_mul_mont_internal 28376c4f342Schristos.rdata 28476c4f342Schristos.asciiz "Montgomery Multiplication for MIPS, CRYPTOGAMS by <appro@openssl.org>" 285