1289848Sjkim.rdata 2289848Sjkim.asciiz "mips3.s, Version 1.1" 3289848Sjkim.asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>" 4289848Sjkim 5289848Sjkim/* 6289848Sjkim * ==================================================================== 7289848Sjkim * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL 8289848Sjkim * project. 9289848Sjkim * 10289848Sjkim * Rights for redistribution and usage in source and binary forms are 11289848Sjkim * granted according to the OpenSSL license. Warranty of any kind is 12289848Sjkim * disclaimed. 13289848Sjkim * ==================================================================== 14289848Sjkim */ 15289848Sjkim 16289848Sjkim/* 17289848Sjkim * This is my modest contributon to the OpenSSL project (see 18289848Sjkim * http://www.openssl.org/ for more information about it) and is 19289848Sjkim * a drop-in MIPS III/IV ISA replacement for crypto/bn/bn_asm.c 20289848Sjkim * module. For updates see http://fy.chalmers.se/~appro/hpe/. 21289848Sjkim * 22289848Sjkim * The module is designed to work with either of the "new" MIPS ABI(5), 23289848Sjkim * namely N32 or N64, offered by IRIX 6.x. It's not ment to work under 24289848Sjkim * IRIX 5.x not only because it doesn't support new ABIs but also 25289848Sjkim * because 5.x kernels put R4x00 CPU into 32-bit mode and all those 26289848Sjkim * 64-bit instructions (daddu, dmultu, etc.) found below gonna only 27289848Sjkim * cause illegal instruction exception:-( 28289848Sjkim * 29289848Sjkim * In addition the code depends on preprocessor flags set up by MIPSpro 30289848Sjkim * compiler driver (either as or cc) and therefore (probably?) can't be 31289848Sjkim * compiled by the GNU assembler. GNU C driver manages fine though... 32289848Sjkim * I mean as long as -mmips-as is specified or is the default option, 33289848Sjkim * because then it simply invokes /usr/bin/as which in turn takes 34289848Sjkim * perfect care of the preprocessor definitions. Another neat feature 35289848Sjkim * offered by the MIPSpro assembler is an optimization pass. This gave 36289848Sjkim * me the opportunity to have the code looking more regular as all those 37289848Sjkim * architecture dependent instruction rescheduling details were left to 38289848Sjkim * the assembler. Cool, huh? 39289848Sjkim * 40289848Sjkim * Performance improvement is astonishing! 'apps/openssl speed rsa dsa' 41289848Sjkim * goes way over 3 times faster! 42289848Sjkim * 43289848Sjkim * <appro@fy.chalmers.se> 44289848Sjkim */ 45289848Sjkim#include <asm.h> 46289848Sjkim#include <regdef.h> 47289848Sjkim 48289848Sjkim#if _MIPS_ISA>=4 49289848Sjkim#define MOVNZ(cond,dst,src) \ 50289848Sjkim movn dst,src,cond 51289848Sjkim#else 52289848Sjkim#define MOVNZ(cond,dst,src) \ 53289848Sjkim .set noreorder; \ 54289848Sjkim bnezl cond,.+8; \ 55289848Sjkim move dst,src; \ 56289848Sjkim .set reorder 57289848Sjkim#endif 58289848Sjkim 59289848Sjkim.text 60289848Sjkim 61289848Sjkim.set noat 62289848Sjkim.set reorder 63289848Sjkim 64289848Sjkim#define MINUS4 v1 65289848Sjkim 66289848Sjkim.align 5 67289848SjkimLEAF(bn_mul_add_words) 68289848Sjkim .set noreorder 69289848Sjkim bgtzl a2,.L_bn_mul_add_words_proceed 70289848Sjkim ld t0,0(a1) 71289848Sjkim jr ra 72289848Sjkim move v0,zero 73289848Sjkim .set reorder 74289848Sjkim 75289848Sjkim.L_bn_mul_add_words_proceed: 76289848Sjkim li MINUS4,-4 77289848Sjkim and ta0,a2,MINUS4 78289848Sjkim move v0,zero 79289848Sjkim beqz ta0,.L_bn_mul_add_words_tail 80289848Sjkim 81289848Sjkim.L_bn_mul_add_words_loop: 82289848Sjkim dmultu t0,a3 83289848Sjkim ld t1,0(a0) 84289848Sjkim ld t2,8(a1) 85289848Sjkim ld t3,8(a0) 86289848Sjkim ld ta0,16(a1) 87289848Sjkim ld ta1,16(a0) 88289848Sjkim daddu t1,v0 89289848Sjkim sltu v0,t1,v0 /* All manuals say it "compares 32-bit 90289848Sjkim * values", but it seems to work fine 91289848Sjkim * even on 64-bit registers. */ 92289848Sjkim mflo AT 93289848Sjkim mfhi t0 94289848Sjkim daddu t1,AT 95289848Sjkim daddu v0,t0 96289848Sjkim sltu AT,t1,AT 97289848Sjkim sd t1,0(a0) 98289848Sjkim daddu v0,AT 99289848Sjkim 100289848Sjkim dmultu t2,a3 101289848Sjkim ld ta2,24(a1) 102289848Sjkim ld ta3,24(a0) 103289848Sjkim daddu t3,v0 104289848Sjkim sltu v0,t3,v0 105289848Sjkim mflo AT 106289848Sjkim mfhi t2 107289848Sjkim daddu t3,AT 108289848Sjkim daddu v0,t2 109289848Sjkim sltu AT,t3,AT 110289848Sjkim sd t3,8(a0) 111289848Sjkim daddu v0,AT 112289848Sjkim 113289848Sjkim dmultu ta0,a3 114289848Sjkim subu a2,4 115289848Sjkim PTR_ADD a0,32 116289848Sjkim PTR_ADD a1,32 117289848Sjkim daddu ta1,v0 118289848Sjkim sltu v0,ta1,v0 119289848Sjkim mflo AT 120289848Sjkim mfhi ta0 121289848Sjkim daddu ta1,AT 122289848Sjkim daddu v0,ta0 123289848Sjkim sltu AT,ta1,AT 124289848Sjkim sd ta1,-16(a0) 125289848Sjkim daddu v0,AT 126289848Sjkim 127289848Sjkim 128289848Sjkim dmultu ta2,a3 129289848Sjkim and ta0,a2,MINUS4 130289848Sjkim daddu ta3,v0 131289848Sjkim sltu v0,ta3,v0 132289848Sjkim mflo AT 133289848Sjkim mfhi ta2 134289848Sjkim daddu ta3,AT 135289848Sjkim daddu v0,ta2 136289848Sjkim sltu AT,ta3,AT 137289848Sjkim sd ta3,-8(a0) 138289848Sjkim daddu v0,AT 139289848Sjkim .set noreorder 140289848Sjkim bgtzl ta0,.L_bn_mul_add_words_loop 141289848Sjkim ld t0,0(a1) 142289848Sjkim 143289848Sjkim bnezl a2,.L_bn_mul_add_words_tail 144289848Sjkim ld t0,0(a1) 145289848Sjkim .set reorder 146289848Sjkim 147289848Sjkim.L_bn_mul_add_words_return: 148289848Sjkim jr ra 149289848Sjkim 150289848Sjkim.L_bn_mul_add_words_tail: 151289848Sjkim dmultu t0,a3 152289848Sjkim ld t1,0(a0) 153289848Sjkim subu a2,1 154289848Sjkim daddu t1,v0 155289848Sjkim sltu v0,t1,v0 156289848Sjkim mflo AT 157289848Sjkim mfhi t0 158289848Sjkim daddu t1,AT 159289848Sjkim daddu v0,t0 160289848Sjkim sltu AT,t1,AT 161289848Sjkim sd t1,0(a0) 162289848Sjkim daddu v0,AT 163289848Sjkim beqz a2,.L_bn_mul_add_words_return 164289848Sjkim 165289848Sjkim ld t0,8(a1) 166289848Sjkim dmultu t0,a3 167289848Sjkim ld t1,8(a0) 168289848Sjkim subu a2,1 169289848Sjkim daddu t1,v0 170289848Sjkim sltu v0,t1,v0 171289848Sjkim mflo AT 172289848Sjkim mfhi t0 173289848Sjkim daddu t1,AT 174289848Sjkim daddu v0,t0 175289848Sjkim sltu AT,t1,AT 176289848Sjkim sd t1,8(a0) 177289848Sjkim daddu v0,AT 178289848Sjkim beqz a2,.L_bn_mul_add_words_return 179289848Sjkim 180289848Sjkim ld t0,16(a1) 181289848Sjkim dmultu t0,a3 182289848Sjkim ld t1,16(a0) 183289848Sjkim daddu t1,v0 184289848Sjkim sltu v0,t1,v0 185289848Sjkim mflo AT 186289848Sjkim mfhi t0 187289848Sjkim daddu t1,AT 188289848Sjkim daddu v0,t0 189289848Sjkim sltu AT,t1,AT 190289848Sjkim sd t1,16(a0) 191289848Sjkim daddu v0,AT 192289848Sjkim jr ra 193289848SjkimEND(bn_mul_add_words) 194289848Sjkim 195289848Sjkim.align 5 196289848SjkimLEAF(bn_mul_words) 197289848Sjkim .set noreorder 198289848Sjkim bgtzl a2,.L_bn_mul_words_proceed 199289848Sjkim ld t0,0(a1) 200289848Sjkim jr ra 201289848Sjkim move v0,zero 202289848Sjkim .set reorder 203289848Sjkim 204289848Sjkim.L_bn_mul_words_proceed: 205289848Sjkim li MINUS4,-4 206289848Sjkim and ta0,a2,MINUS4 207289848Sjkim move v0,zero 208289848Sjkim beqz ta0,.L_bn_mul_words_tail 209289848Sjkim 210289848Sjkim.L_bn_mul_words_loop: 211289848Sjkim dmultu t0,a3 212289848Sjkim ld t2,8(a1) 213289848Sjkim ld ta0,16(a1) 214289848Sjkim ld ta2,24(a1) 215289848Sjkim mflo AT 216289848Sjkim mfhi t0 217289848Sjkim daddu v0,AT 218289848Sjkim sltu t1,v0,AT 219289848Sjkim sd v0,0(a0) 220289848Sjkim daddu v0,t1,t0 221289848Sjkim 222289848Sjkim dmultu t2,a3 223289848Sjkim subu a2,4 224289848Sjkim PTR_ADD a0,32 225289848Sjkim PTR_ADD a1,32 226289848Sjkim mflo AT 227289848Sjkim mfhi t2 228289848Sjkim daddu v0,AT 229289848Sjkim sltu t3,v0,AT 230289848Sjkim sd v0,-24(a0) 231289848Sjkim daddu v0,t3,t2 232289848Sjkim 233289848Sjkim dmultu ta0,a3 234289848Sjkim mflo AT 235289848Sjkim mfhi ta0 236289848Sjkim daddu v0,AT 237289848Sjkim sltu ta1,v0,AT 238289848Sjkim sd v0,-16(a0) 239289848Sjkim daddu v0,ta1,ta0 240289848Sjkim 241289848Sjkim 242289848Sjkim dmultu ta2,a3 243289848Sjkim and ta0,a2,MINUS4 244289848Sjkim mflo AT 245289848Sjkim mfhi ta2 246289848Sjkim daddu v0,AT 247289848Sjkim sltu ta3,v0,AT 248289848Sjkim sd v0,-8(a0) 249289848Sjkim daddu v0,ta3,ta2 250289848Sjkim .set noreorder 251289848Sjkim bgtzl ta0,.L_bn_mul_words_loop 252289848Sjkim ld t0,0(a1) 253289848Sjkim 254289848Sjkim bnezl a2,.L_bn_mul_words_tail 255289848Sjkim ld t0,0(a1) 256289848Sjkim .set reorder 257289848Sjkim 258289848Sjkim.L_bn_mul_words_return: 259289848Sjkim jr ra 260289848Sjkim 261289848Sjkim.L_bn_mul_words_tail: 262289848Sjkim dmultu t0,a3 263289848Sjkim subu a2,1 264289848Sjkim mflo AT 265289848Sjkim mfhi t0 266289848Sjkim daddu v0,AT 267289848Sjkim sltu t1,v0,AT 268289848Sjkim sd v0,0(a0) 269289848Sjkim daddu v0,t1,t0 270289848Sjkim beqz a2,.L_bn_mul_words_return 271289848Sjkim 272289848Sjkim ld t0,8(a1) 273289848Sjkim dmultu t0,a3 274289848Sjkim subu a2,1 275289848Sjkim mflo AT 276289848Sjkim mfhi t0 277289848Sjkim daddu v0,AT 278289848Sjkim sltu t1,v0,AT 279289848Sjkim sd v0,8(a0) 280289848Sjkim daddu v0,t1,t0 281289848Sjkim beqz a2,.L_bn_mul_words_return 282289848Sjkim 283289848Sjkim ld t0,16(a1) 284289848Sjkim dmultu t0,a3 285289848Sjkim mflo AT 286289848Sjkim mfhi t0 287289848Sjkim daddu v0,AT 288289848Sjkim sltu t1,v0,AT 289289848Sjkim sd v0,16(a0) 290289848Sjkim daddu v0,t1,t0 291289848Sjkim jr ra 292289848SjkimEND(bn_mul_words) 293289848Sjkim 294289848Sjkim.align 5 295289848SjkimLEAF(bn_sqr_words) 296289848Sjkim .set noreorder 297289848Sjkim bgtzl a2,.L_bn_sqr_words_proceed 298289848Sjkim ld t0,0(a1) 299289848Sjkim jr ra 300289848Sjkim move v0,zero 301289848Sjkim .set reorder 302289848Sjkim 303289848Sjkim.L_bn_sqr_words_proceed: 304289848Sjkim li MINUS4,-4 305289848Sjkim and ta0,a2,MINUS4 306289848Sjkim move v0,zero 307289848Sjkim beqz ta0,.L_bn_sqr_words_tail 308289848Sjkim 309289848Sjkim.L_bn_sqr_words_loop: 310289848Sjkim dmultu t0,t0 311289848Sjkim ld t2,8(a1) 312289848Sjkim ld ta0,16(a1) 313289848Sjkim ld ta2,24(a1) 314289848Sjkim mflo t1 315289848Sjkim mfhi t0 316289848Sjkim sd t1,0(a0) 317289848Sjkim sd t0,8(a0) 318289848Sjkim 319289848Sjkim dmultu t2,t2 320289848Sjkim subu a2,4 321289848Sjkim PTR_ADD a0,64 322289848Sjkim PTR_ADD a1,32 323289848Sjkim mflo t3 324289848Sjkim mfhi t2 325289848Sjkim sd t3,-48(a0) 326289848Sjkim sd t2,-40(a0) 327289848Sjkim 328289848Sjkim dmultu ta0,ta0 329289848Sjkim mflo ta1 330289848Sjkim mfhi ta0 331289848Sjkim sd ta1,-32(a0) 332289848Sjkim sd ta0,-24(a0) 333289848Sjkim 334289848Sjkim 335289848Sjkim dmultu ta2,ta2 336289848Sjkim and ta0,a2,MINUS4 337289848Sjkim mflo ta3 338289848Sjkim mfhi ta2 339289848Sjkim sd ta3,-16(a0) 340289848Sjkim sd ta2,-8(a0) 341289848Sjkim 342289848Sjkim .set noreorder 343289848Sjkim bgtzl ta0,.L_bn_sqr_words_loop 344289848Sjkim ld t0,0(a1) 345289848Sjkim 346289848Sjkim bnezl a2,.L_bn_sqr_words_tail 347289848Sjkim ld t0,0(a1) 348289848Sjkim .set reorder 349289848Sjkim 350289848Sjkim.L_bn_sqr_words_return: 351289848Sjkim move v0,zero 352289848Sjkim jr ra 353289848Sjkim 354289848Sjkim.L_bn_sqr_words_tail: 355289848Sjkim dmultu t0,t0 356289848Sjkim subu a2,1 357289848Sjkim mflo t1 358289848Sjkim mfhi t0 359289848Sjkim sd t1,0(a0) 360289848Sjkim sd t0,8(a0) 361289848Sjkim beqz a2,.L_bn_sqr_words_return 362289848Sjkim 363289848Sjkim ld t0,8(a1) 364289848Sjkim dmultu t0,t0 365289848Sjkim subu a2,1 366289848Sjkim mflo t1 367289848Sjkim mfhi t0 368289848Sjkim sd t1,16(a0) 369289848Sjkim sd t0,24(a0) 370289848Sjkim beqz a2,.L_bn_sqr_words_return 371289848Sjkim 372289848Sjkim ld t0,16(a1) 373289848Sjkim dmultu t0,t0 374289848Sjkim mflo t1 375289848Sjkim mfhi t0 376289848Sjkim sd t1,32(a0) 377289848Sjkim sd t0,40(a0) 378289848Sjkim jr ra 379289848SjkimEND(bn_sqr_words) 380289848Sjkim 381289848Sjkim.align 5 382289848SjkimLEAF(bn_add_words) 383289848Sjkim .set noreorder 384289848Sjkim bgtzl a3,.L_bn_add_words_proceed 385289848Sjkim ld t0,0(a1) 386289848Sjkim jr ra 387289848Sjkim move v0,zero 388289848Sjkim .set reorder 389289848Sjkim 390289848Sjkim.L_bn_add_words_proceed: 391289848Sjkim li MINUS4,-4 392289848Sjkim and AT,a3,MINUS4 393289848Sjkim move v0,zero 394289848Sjkim beqz AT,.L_bn_add_words_tail 395289848Sjkim 396289848Sjkim.L_bn_add_words_loop: 397289848Sjkim ld ta0,0(a2) 398289848Sjkim subu a3,4 399289848Sjkim ld t1,8(a1) 400289848Sjkim and AT,a3,MINUS4 401289848Sjkim ld t2,16(a1) 402289848Sjkim PTR_ADD a2,32 403289848Sjkim ld t3,24(a1) 404289848Sjkim PTR_ADD a0,32 405289848Sjkim ld ta1,-24(a2) 406289848Sjkim PTR_ADD a1,32 407289848Sjkim ld ta2,-16(a2) 408289848Sjkim ld ta3,-8(a2) 409289848Sjkim daddu ta0,t0 410289848Sjkim sltu t8,ta0,t0 411289848Sjkim daddu t0,ta0,v0 412289848Sjkim sltu v0,t0,ta0 413289848Sjkim sd t0,-32(a0) 414289848Sjkim daddu v0,t8 415289848Sjkim 416289848Sjkim daddu ta1,t1 417289848Sjkim sltu t9,ta1,t1 418289848Sjkim daddu t1,ta1,v0 419289848Sjkim sltu v0,t1,ta1 420289848Sjkim sd t1,-24(a0) 421289848Sjkim daddu v0,t9 422289848Sjkim 423289848Sjkim daddu ta2,t2 424289848Sjkim sltu t8,ta2,t2 425289848Sjkim daddu t2,ta2,v0 426289848Sjkim sltu v0,t2,ta2 427289848Sjkim sd t2,-16(a0) 428289848Sjkim daddu v0,t8 429289848Sjkim 430289848Sjkim daddu ta3,t3 431289848Sjkim sltu t9,ta3,t3 432289848Sjkim daddu t3,ta3,v0 433289848Sjkim sltu v0,t3,ta3 434289848Sjkim sd t3,-8(a0) 435289848Sjkim daddu v0,t9 436289848Sjkim 437289848Sjkim .set noreorder 438289848Sjkim bgtzl AT,.L_bn_add_words_loop 439289848Sjkim ld t0,0(a1) 440289848Sjkim 441289848Sjkim bnezl a3,.L_bn_add_words_tail 442289848Sjkim ld t0,0(a1) 443289848Sjkim .set reorder 444289848Sjkim 445289848Sjkim.L_bn_add_words_return: 446289848Sjkim jr ra 447289848Sjkim 448289848Sjkim.L_bn_add_words_tail: 449289848Sjkim ld ta0,0(a2) 450289848Sjkim daddu ta0,t0 451289848Sjkim subu a3,1 452289848Sjkim sltu t8,ta0,t0 453289848Sjkim daddu t0,ta0,v0 454289848Sjkim sltu v0,t0,ta0 455289848Sjkim sd t0,0(a0) 456289848Sjkim daddu v0,t8 457289848Sjkim beqz a3,.L_bn_add_words_return 458289848Sjkim 459289848Sjkim ld t1,8(a1) 460289848Sjkim ld ta1,8(a2) 461289848Sjkim daddu ta1,t1 462289848Sjkim subu a3,1 463289848Sjkim sltu t9,ta1,t1 464289848Sjkim daddu t1,ta1,v0 465289848Sjkim sltu v0,t1,ta1 466289848Sjkim sd t1,8(a0) 467289848Sjkim daddu v0,t9 468289848Sjkim beqz a3,.L_bn_add_words_return 469289848Sjkim 470289848Sjkim ld t2,16(a1) 471289848Sjkim ld ta2,16(a2) 472289848Sjkim daddu ta2,t2 473289848Sjkim sltu t8,ta2,t2 474289848Sjkim daddu t2,ta2,v0 475289848Sjkim sltu v0,t2,ta2 476289848Sjkim sd t2,16(a0) 477289848Sjkim daddu v0,t8 478289848Sjkim jr ra 479289848SjkimEND(bn_add_words) 480289848Sjkim 481289848Sjkim.align 5 482289848SjkimLEAF(bn_sub_words) 483289848Sjkim .set noreorder 484289848Sjkim bgtzl a3,.L_bn_sub_words_proceed 485289848Sjkim ld t0,0(a1) 486289848Sjkim jr ra 487289848Sjkim move v0,zero 488289848Sjkim .set reorder 489289848Sjkim 490289848Sjkim.L_bn_sub_words_proceed: 491289848Sjkim li MINUS4,-4 492289848Sjkim and AT,a3,MINUS4 493289848Sjkim move v0,zero 494289848Sjkim beqz AT,.L_bn_sub_words_tail 495289848Sjkim 496289848Sjkim.L_bn_sub_words_loop: 497289848Sjkim ld ta0,0(a2) 498289848Sjkim subu a3,4 499289848Sjkim ld t1,8(a1) 500289848Sjkim and AT,a3,MINUS4 501289848Sjkim ld t2,16(a1) 502289848Sjkim PTR_ADD a2,32 503289848Sjkim ld t3,24(a1) 504289848Sjkim PTR_ADD a0,32 505289848Sjkim ld ta1,-24(a2) 506289848Sjkim PTR_ADD a1,32 507289848Sjkim ld ta2,-16(a2) 508289848Sjkim ld ta3,-8(a2) 509289848Sjkim sltu t8,t0,ta0 510289848Sjkim dsubu t0,ta0 511289848Sjkim dsubu ta0,t0,v0 512289848Sjkim sd ta0,-32(a0) 513289848Sjkim MOVNZ (t0,v0,t8) 514289848Sjkim 515289848Sjkim sltu t9,t1,ta1 516289848Sjkim dsubu t1,ta1 517289848Sjkim dsubu ta1,t1,v0 518289848Sjkim sd ta1,-24(a0) 519289848Sjkim MOVNZ (t1,v0,t9) 520289848Sjkim 521289848Sjkim 522289848Sjkim sltu t8,t2,ta2 523289848Sjkim dsubu t2,ta2 524289848Sjkim dsubu ta2,t2,v0 525289848Sjkim sd ta2,-16(a0) 526289848Sjkim MOVNZ (t2,v0,t8) 527289848Sjkim 528289848Sjkim sltu t9,t3,ta3 529289848Sjkim dsubu t3,ta3 530289848Sjkim dsubu ta3,t3,v0 531289848Sjkim sd ta3,-8(a0) 532289848Sjkim MOVNZ (t3,v0,t9) 533289848Sjkim 534289848Sjkim .set noreorder 535289848Sjkim bgtzl AT,.L_bn_sub_words_loop 536289848Sjkim ld t0,0(a1) 537289848Sjkim 538289848Sjkim bnezl a3,.L_bn_sub_words_tail 539289848Sjkim ld t0,0(a1) 540289848Sjkim .set reorder 541289848Sjkim 542289848Sjkim.L_bn_sub_words_return: 543289848Sjkim jr ra 544289848Sjkim 545289848Sjkim.L_bn_sub_words_tail: 546289848Sjkim ld ta0,0(a2) 547289848Sjkim subu a3,1 548289848Sjkim sltu t8,t0,ta0 549289848Sjkim dsubu t0,ta0 550289848Sjkim dsubu ta0,t0,v0 551289848Sjkim MOVNZ (t0,v0,t8) 552289848Sjkim sd ta0,0(a0) 553289848Sjkim beqz a3,.L_bn_sub_words_return 554289848Sjkim 555289848Sjkim ld t1,8(a1) 556289848Sjkim subu a3,1 557289848Sjkim ld ta1,8(a2) 558289848Sjkim sltu t9,t1,ta1 559289848Sjkim dsubu t1,ta1 560289848Sjkim dsubu ta1,t1,v0 561289848Sjkim MOVNZ (t1,v0,t9) 562289848Sjkim sd ta1,8(a0) 563289848Sjkim beqz a3,.L_bn_sub_words_return 564289848Sjkim 565289848Sjkim ld t2,16(a1) 566289848Sjkim ld ta2,16(a2) 567289848Sjkim sltu t8,t2,ta2 568289848Sjkim dsubu t2,ta2 569289848Sjkim dsubu ta2,t2,v0 570289848Sjkim MOVNZ (t2,v0,t8) 571289848Sjkim sd ta2,16(a0) 572289848Sjkim jr ra 573289848SjkimEND(bn_sub_words) 574289848Sjkim 575289848Sjkim#undef MINUS4 576289848Sjkim 577289848Sjkim.align 5 578289848SjkimLEAF(bn_div_3_words) 579289848Sjkim .set reorder 580289848Sjkim move a3,a0 /* we know that bn_div_words doesn't 581289848Sjkim * touch a3, ta2, ta3 and preserves a2 582289848Sjkim * so that we can save two arguments 583289848Sjkim * and return address in registers 584289848Sjkim * instead of stack:-) 585289848Sjkim */ 586289848Sjkim ld a0,(a3) 587289848Sjkim move ta2,a1 588289848Sjkim ld a1,-8(a3) 589289848Sjkim bne a0,a2,.L_bn_div_3_words_proceed 590289848Sjkim li v0,-1 591289848Sjkim jr ra 592289848Sjkim.L_bn_div_3_words_proceed: 593289848Sjkim move ta3,ra 594289848Sjkim bal bn_div_words 595289848Sjkim move ra,ta3 596289848Sjkim dmultu ta2,v0 597289848Sjkim ld t2,-16(a3) 598289848Sjkim move ta0,zero 599289848Sjkim mfhi t1 600289848Sjkim mflo t0 601289848Sjkim sltu t8,t1,v1 602289848Sjkim.L_bn_div_3_words_inner_loop: 603289848Sjkim bnez t8,.L_bn_div_3_words_inner_loop_done 604289848Sjkim sgeu AT,t2,t0 605289848Sjkim seq t9,t1,v1 606289848Sjkim and AT,t9 607289848Sjkim sltu t3,t0,ta2 608289848Sjkim daddu v1,a2 609289848Sjkim dsubu t1,t3 610289848Sjkim dsubu t0,ta2 611289848Sjkim sltu t8,t1,v1 612289848Sjkim sltu ta0,v1,a2 613289848Sjkim or t8,ta0 614289848Sjkim .set noreorder 615289848Sjkim beqzl AT,.L_bn_div_3_words_inner_loop 616289848Sjkim dsubu v0,1 617289848Sjkim .set reorder 618289848Sjkim.L_bn_div_3_words_inner_loop_done: 619289848Sjkim jr ra 620289848SjkimEND(bn_div_3_words) 621289848Sjkim 622289848Sjkim.align 5 623289848SjkimLEAF(bn_div_words) 624289848Sjkim .set noreorder 625289848Sjkim bnezl a2,.L_bn_div_words_proceed 626289848Sjkim move v1,zero 627289848Sjkim jr ra 628289848Sjkim li v0,-1 /* I'd rather signal div-by-zero 629289848Sjkim * which can be done with 'break 7' */ 630289848Sjkim 631289848Sjkim.L_bn_div_words_proceed: 632289848Sjkim bltz a2,.L_bn_div_words_body 633289848Sjkim move t9,v1 634289848Sjkim dsll a2,1 635289848Sjkim bgtz a2,.-4 636289848Sjkim addu t9,1 637289848Sjkim 638289848Sjkim .set reorder 639289848Sjkim negu t1,t9 640289848Sjkim li t2,-1 641289848Sjkim dsll t2,t1 642289848Sjkim and t2,a0 643289848Sjkim dsrl AT,a1,t1 644289848Sjkim .set noreorder 645289848Sjkim bnezl t2,.+8 646289848Sjkim break 6 /* signal overflow */ 647289848Sjkim .set reorder 648289848Sjkim dsll a0,t9 649289848Sjkim dsll a1,t9 650289848Sjkim or a0,AT 651289848Sjkim 652289848Sjkim#define QT ta0 653289848Sjkim#define HH ta1 654289848Sjkim#define DH v1 655289848Sjkim.L_bn_div_words_body: 656289848Sjkim dsrl DH,a2,32 657289848Sjkim sgeu AT,a0,a2 658289848Sjkim .set noreorder 659289848Sjkim bnezl AT,.+8 660289848Sjkim dsubu a0,a2 661289848Sjkim .set reorder 662289848Sjkim 663289848Sjkim li QT,-1 664289848Sjkim dsrl HH,a0,32 665289848Sjkim dsrl QT,32 /* q=0xffffffff */ 666289848Sjkim beq DH,HH,.L_bn_div_words_skip_div1 667289848Sjkim ddivu zero,a0,DH 668289848Sjkim mflo QT 669289848Sjkim.L_bn_div_words_skip_div1: 670289848Sjkim dmultu a2,QT 671289848Sjkim dsll t3,a0,32 672289848Sjkim dsrl AT,a1,32 673289848Sjkim or t3,AT 674289848Sjkim mflo t0 675289848Sjkim mfhi t1 676289848Sjkim.L_bn_div_words_inner_loop1: 677289848Sjkim sltu t2,t3,t0 678289848Sjkim seq t8,HH,t1 679289848Sjkim sltu AT,HH,t1 680289848Sjkim and t2,t8 681289848Sjkim sltu v0,t0,a2 682289848Sjkim or AT,t2 683289848Sjkim .set noreorder 684289848Sjkim beqz AT,.L_bn_div_words_inner_loop1_done 685289848Sjkim dsubu t1,v0 686289848Sjkim dsubu t0,a2 687289848Sjkim b .L_bn_div_words_inner_loop1 688289848Sjkim dsubu QT,1 689289848Sjkim .set reorder 690289848Sjkim.L_bn_div_words_inner_loop1_done: 691289848Sjkim 692289848Sjkim dsll a1,32 693289848Sjkim dsubu a0,t3,t0 694289848Sjkim dsll v0,QT,32 695289848Sjkim 696289848Sjkim li QT,-1 697289848Sjkim dsrl HH,a0,32 698289848Sjkim dsrl QT,32 /* q=0xffffffff */ 699289848Sjkim beq DH,HH,.L_bn_div_words_skip_div2 700289848Sjkim ddivu zero,a0,DH 701289848Sjkim mflo QT 702289848Sjkim.L_bn_div_words_skip_div2: 703289848Sjkim#undef DH 704289848Sjkim dmultu a2,QT 705289848Sjkim dsll t3,a0,32 706289848Sjkim dsrl AT,a1,32 707289848Sjkim or t3,AT 708289848Sjkim mflo t0 709289848Sjkim mfhi t1 710289848Sjkim.L_bn_div_words_inner_loop2: 711289848Sjkim sltu t2,t3,t0 712289848Sjkim seq t8,HH,t1 713289848Sjkim sltu AT,HH,t1 714289848Sjkim and t2,t8 715289848Sjkim sltu v1,t0,a2 716289848Sjkim or AT,t2 717289848Sjkim .set noreorder 718289848Sjkim beqz AT,.L_bn_div_words_inner_loop2_done 719289848Sjkim dsubu t1,v1 720289848Sjkim dsubu t0,a2 721289848Sjkim b .L_bn_div_words_inner_loop2 722289848Sjkim dsubu QT,1 723289848Sjkim .set reorder 724289848Sjkim.L_bn_div_words_inner_loop2_done: 725289848Sjkim#undef HH 726289848Sjkim 727289848Sjkim dsubu a0,t3,t0 728289848Sjkim or v0,QT 729289848Sjkim dsrl v1,a0,t9 /* v1 contains remainder if anybody wants it */ 730289848Sjkim dsrl a2,t9 /* restore a2 */ 731289848Sjkim jr ra 732289848Sjkim#undef QT 733289848SjkimEND(bn_div_words) 734289848Sjkim 735289848Sjkim#define a_0 t0 736289848Sjkim#define a_1 t1 737289848Sjkim#define a_2 t2 738289848Sjkim#define a_3 t3 739289848Sjkim#define b_0 ta0 740289848Sjkim#define b_1 ta1 741289848Sjkim#define b_2 ta2 742289848Sjkim#define b_3 ta3 743289848Sjkim 744289848Sjkim#define a_4 s0 745289848Sjkim#define a_5 s2 746289848Sjkim#define a_6 s4 747289848Sjkim#define a_7 a1 /* once we load a[7] we don't need a anymore */ 748289848Sjkim#define b_4 s1 749289848Sjkim#define b_5 s3 750289848Sjkim#define b_6 s5 751289848Sjkim#define b_7 a2 /* once we load b[7] we don't need b anymore */ 752289848Sjkim 753289848Sjkim#define t_1 t8 754289848Sjkim#define t_2 t9 755289848Sjkim 756289848Sjkim#define c_1 v0 757289848Sjkim#define c_2 v1 758289848Sjkim#define c_3 a3 759289848Sjkim 760289848Sjkim#define FRAME_SIZE 48 761289848Sjkim 762289848Sjkim.align 5 763289848SjkimLEAF(bn_mul_comba8) 764289848Sjkim .set noreorder 765289848Sjkim PTR_SUB sp,FRAME_SIZE 766289848Sjkim .frame sp,64,ra 767289848Sjkim .set reorder 768289848Sjkim ld a_0,0(a1) /* If compiled with -mips3 option on 769289848Sjkim * R5000 box assembler barks on this 770289848Sjkim * line with "shouldn't have mult/div 771289848Sjkim * as last instruction in bb (R10K 772289848Sjkim * bug)" warning. If anybody out there 773289848Sjkim * has a clue about how to circumvent 774289848Sjkim * this do send me a note. 775289848Sjkim * <appro@fy.chalmers.se> 776289848Sjkim */ 777289848Sjkim ld b_0,0(a2) 778289848Sjkim ld a_1,8(a1) 779289848Sjkim ld a_2,16(a1) 780289848Sjkim ld a_3,24(a1) 781289848Sjkim ld b_1,8(a2) 782289848Sjkim ld b_2,16(a2) 783289848Sjkim ld b_3,24(a2) 784289848Sjkim dmultu a_0,b_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */ 785289848Sjkim sd s0,0(sp) 786289848Sjkim sd s1,8(sp) 787289848Sjkim sd s2,16(sp) 788289848Sjkim sd s3,24(sp) 789289848Sjkim sd s4,32(sp) 790289848Sjkim sd s5,40(sp) 791289848Sjkim mflo c_1 792289848Sjkim mfhi c_2 793289848Sjkim 794289848Sjkim dmultu a_0,b_1 /* mul_add_c(a[0],b[1],c2,c3,c1); */ 795289848Sjkim ld a_4,32(a1) 796289848Sjkim ld a_5,40(a1) 797289848Sjkim ld a_6,48(a1) 798289848Sjkim ld a_7,56(a1) 799289848Sjkim ld b_4,32(a2) 800289848Sjkim ld b_5,40(a2) 801289848Sjkim mflo t_1 802289848Sjkim mfhi t_2 803289848Sjkim daddu c_2,t_1 804289848Sjkim sltu AT,c_2,t_1 805289848Sjkim daddu c_3,t_2,AT 806289848Sjkim dmultu a_1,b_0 /* mul_add_c(a[1],b[0],c2,c3,c1); */ 807289848Sjkim ld b_6,48(a2) 808289848Sjkim ld b_7,56(a2) 809289848Sjkim sd c_1,0(a0) /* r[0]=c1; */ 810289848Sjkim mflo t_1 811289848Sjkim mfhi t_2 812289848Sjkim daddu c_2,t_1 813289848Sjkim sltu AT,c_2,t_1 814289848Sjkim daddu t_2,AT 815289848Sjkim daddu c_3,t_2 816289848Sjkim sltu c_1,c_3,t_2 817289848Sjkim sd c_2,8(a0) /* r[1]=c2; */ 818289848Sjkim 819289848Sjkim dmultu a_2,b_0 /* mul_add_c(a[2],b[0],c3,c1,c2); */ 820289848Sjkim mflo t_1 821289848Sjkim mfhi t_2 822289848Sjkim daddu c_3,t_1 823289848Sjkim sltu AT,c_3,t_1 824289848Sjkim daddu t_2,AT 825289848Sjkim daddu c_1,t_2 826289848Sjkim dmultu a_1,b_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 827289848Sjkim mflo t_1 828289848Sjkim mfhi t_2 829289848Sjkim daddu c_3,t_1 830289848Sjkim sltu AT,c_3,t_1 831289848Sjkim daddu t_2,AT 832289848Sjkim daddu c_1,t_2 833289848Sjkim sltu c_2,c_1,t_2 834289848Sjkim dmultu a_0,b_2 /* mul_add_c(a[0],b[2],c3,c1,c2); */ 835289848Sjkim mflo t_1 836289848Sjkim mfhi t_2 837289848Sjkim daddu c_3,t_1 838289848Sjkim sltu AT,c_3,t_1 839289848Sjkim daddu t_2,AT 840289848Sjkim daddu c_1,t_2 841289848Sjkim sltu AT,c_1,t_2 842289848Sjkim daddu c_2,AT 843289848Sjkim sd c_3,16(a0) /* r[2]=c3; */ 844289848Sjkim 845289848Sjkim dmultu a_0,b_3 /* mul_add_c(a[0],b[3],c1,c2,c3); */ 846289848Sjkim mflo t_1 847289848Sjkim mfhi t_2 848289848Sjkim daddu c_1,t_1 849289848Sjkim sltu AT,c_1,t_1 850289848Sjkim daddu t_2,AT 851289848Sjkim daddu c_2,t_2 852289848Sjkim sltu c_3,c_2,t_2 853289848Sjkim dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */ 854289848Sjkim mflo t_1 855289848Sjkim mfhi t_2 856289848Sjkim daddu c_1,t_1 857289848Sjkim sltu AT,c_1,t_1 858289848Sjkim daddu t_2,AT 859289848Sjkim daddu c_2,t_2 860289848Sjkim sltu AT,c_2,t_2 861289848Sjkim daddu c_3,AT 862289848Sjkim dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */ 863289848Sjkim mflo t_1 864289848Sjkim mfhi t_2 865289848Sjkim daddu c_1,t_1 866289848Sjkim sltu AT,c_1,t_1 867289848Sjkim daddu t_2,AT 868289848Sjkim daddu c_2,t_2 869289848Sjkim sltu AT,c_2,t_2 870289848Sjkim daddu c_3,AT 871289848Sjkim dmultu a_3,b_0 /* mul_add_c(a[3],b[0],c1,c2,c3); */ 872289848Sjkim mflo t_1 873289848Sjkim mfhi t_2 874289848Sjkim daddu c_1,t_1 875289848Sjkim sltu AT,c_1,t_1 876289848Sjkim daddu t_2,AT 877289848Sjkim daddu c_2,t_2 878289848Sjkim sltu AT,c_2,t_2 879289848Sjkim daddu c_3,AT 880289848Sjkim sd c_1,24(a0) /* r[3]=c1; */ 881289848Sjkim 882289848Sjkim dmultu a_4,b_0 /* mul_add_c(a[4],b[0],c2,c3,c1); */ 883289848Sjkim mflo t_1 884289848Sjkim mfhi t_2 885289848Sjkim daddu c_2,t_1 886289848Sjkim sltu AT,c_2,t_1 887289848Sjkim daddu t_2,AT 888289848Sjkim daddu c_3,t_2 889289848Sjkim sltu c_1,c_3,t_2 890289848Sjkim dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */ 891289848Sjkim mflo t_1 892289848Sjkim mfhi t_2 893289848Sjkim daddu c_2,t_1 894289848Sjkim sltu AT,c_2,t_1 895289848Sjkim daddu t_2,AT 896289848Sjkim daddu c_3,t_2 897289848Sjkim sltu AT,c_3,t_2 898289848Sjkim daddu c_1,AT 899289848Sjkim dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 900289848Sjkim mflo t_1 901289848Sjkim mfhi t_2 902289848Sjkim daddu c_2,t_1 903289848Sjkim sltu AT,c_2,t_1 904289848Sjkim daddu t_2,AT 905289848Sjkim daddu c_3,t_2 906289848Sjkim sltu AT,c_3,t_2 907289848Sjkim daddu c_1,AT 908289848Sjkim dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */ 909289848Sjkim mflo t_1 910289848Sjkim mfhi t_2 911289848Sjkim daddu c_2,t_1 912289848Sjkim sltu AT,c_2,t_1 913289848Sjkim daddu t_2,AT 914289848Sjkim daddu c_3,t_2 915289848Sjkim sltu AT,c_3,t_2 916289848Sjkim daddu c_1,AT 917289848Sjkim dmultu a_0,b_4 /* mul_add_c(a[0],b[4],c2,c3,c1); */ 918289848Sjkim mflo t_1 919289848Sjkim mfhi t_2 920289848Sjkim daddu c_2,t_1 921289848Sjkim sltu AT,c_2,t_1 922289848Sjkim daddu t_2,AT 923289848Sjkim daddu c_3,t_2 924289848Sjkim sltu AT,c_3,t_2 925289848Sjkim daddu c_1,AT 926289848Sjkim sd c_2,32(a0) /* r[4]=c2; */ 927289848Sjkim 928289848Sjkim dmultu a_0,b_5 /* mul_add_c(a[0],b[5],c3,c1,c2); */ 929289848Sjkim mflo t_1 930289848Sjkim mfhi t_2 931289848Sjkim daddu c_3,t_1 932289848Sjkim sltu AT,c_3,t_1 933289848Sjkim daddu t_2,AT 934289848Sjkim daddu c_1,t_2 935289848Sjkim sltu c_2,c_1,t_2 936289848Sjkim dmultu a_1,b_4 /* mul_add_c(a[1],b[4],c3,c1,c2); */ 937289848Sjkim mflo t_1 938289848Sjkim mfhi t_2 939289848Sjkim daddu c_3,t_1 940289848Sjkim sltu AT,c_3,t_1 941289848Sjkim daddu t_2,AT 942289848Sjkim daddu c_1,t_2 943289848Sjkim sltu AT,c_1,t_2 944289848Sjkim daddu c_2,AT 945289848Sjkim dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */ 946289848Sjkim mflo t_1 947289848Sjkim mfhi t_2 948289848Sjkim daddu c_3,t_1 949289848Sjkim sltu AT,c_3,t_1 950289848Sjkim daddu t_2,AT 951289848Sjkim daddu c_1,t_2 952289848Sjkim sltu AT,c_1,t_2 953289848Sjkim daddu c_2,AT 954289848Sjkim dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */ 955289848Sjkim mflo t_1 956289848Sjkim mfhi t_2 957289848Sjkim daddu c_3,t_1 958289848Sjkim sltu AT,c_3,t_1 959289848Sjkim daddu t_2,AT 960289848Sjkim daddu c_1,t_2 961289848Sjkim sltu AT,c_1,t_2 962289848Sjkim daddu c_2,AT 963289848Sjkim dmultu a_4,b_1 /* mul_add_c(a[4],b[1],c3,c1,c2); */ 964289848Sjkim mflo t_1 965289848Sjkim mfhi t_2 966289848Sjkim daddu c_3,t_1 967289848Sjkim sltu AT,c_3,t_1 968289848Sjkim daddu t_2,AT 969289848Sjkim daddu c_1,t_2 970289848Sjkim sltu AT,c_1,t_2 971289848Sjkim daddu c_2,AT 972289848Sjkim dmultu a_5,b_0 /* mul_add_c(a[5],b[0],c3,c1,c2); */ 973289848Sjkim mflo t_1 974289848Sjkim mfhi t_2 975289848Sjkim daddu c_3,t_1 976289848Sjkim sltu AT,c_3,t_1 977289848Sjkim daddu t_2,AT 978289848Sjkim daddu c_1,t_2 979289848Sjkim sltu AT,c_1,t_2 980289848Sjkim daddu c_2,AT 981289848Sjkim sd c_3,40(a0) /* r[5]=c3; */ 982289848Sjkim 983289848Sjkim dmultu a_6,b_0 /* mul_add_c(a[6],b[0],c1,c2,c3); */ 984289848Sjkim mflo t_1 985289848Sjkim mfhi t_2 986289848Sjkim daddu c_1,t_1 987289848Sjkim sltu AT,c_1,t_1 988289848Sjkim daddu t_2,AT 989289848Sjkim daddu c_2,t_2 990289848Sjkim sltu c_3,c_2,t_2 991289848Sjkim dmultu a_5,b_1 /* mul_add_c(a[5],b[1],c1,c2,c3); */ 992289848Sjkim mflo t_1 993289848Sjkim mfhi t_2 994289848Sjkim daddu c_1,t_1 995289848Sjkim sltu AT,c_1,t_1 996289848Sjkim daddu t_2,AT 997289848Sjkim daddu c_2,t_2 998289848Sjkim sltu AT,c_2,t_2 999289848Sjkim daddu c_3,AT 1000289848Sjkim dmultu a_4,b_2 /* mul_add_c(a[4],b[2],c1,c2,c3); */ 1001289848Sjkim mflo t_1 1002289848Sjkim mfhi t_2 1003289848Sjkim daddu c_1,t_1 1004289848Sjkim sltu AT,c_1,t_1 1005289848Sjkim daddu t_2,AT 1006289848Sjkim daddu c_2,t_2 1007289848Sjkim sltu AT,c_2,t_2 1008289848Sjkim daddu c_3,AT 1009289848Sjkim dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 1010289848Sjkim mflo t_1 1011289848Sjkim mfhi t_2 1012289848Sjkim daddu c_1,t_1 1013289848Sjkim sltu AT,c_1,t_1 1014289848Sjkim daddu t_2,AT 1015289848Sjkim daddu c_2,t_2 1016289848Sjkim sltu AT,c_2,t_2 1017289848Sjkim daddu c_3,AT 1018289848Sjkim dmultu a_2,b_4 /* mul_add_c(a[2],b[4],c1,c2,c3); */ 1019289848Sjkim mflo t_1 1020289848Sjkim mfhi t_2 1021289848Sjkim daddu c_1,t_1 1022289848Sjkim sltu AT,c_1,t_1 1023289848Sjkim daddu t_2,AT 1024289848Sjkim daddu c_2,t_2 1025289848Sjkim sltu AT,c_2,t_2 1026289848Sjkim daddu c_3,AT 1027289848Sjkim dmultu a_1,b_5 /* mul_add_c(a[1],b[5],c1,c2,c3); */ 1028289848Sjkim mflo t_1 1029289848Sjkim mfhi t_2 1030289848Sjkim daddu c_1,t_1 1031289848Sjkim sltu AT,c_1,t_1 1032289848Sjkim daddu t_2,AT 1033289848Sjkim daddu c_2,t_2 1034289848Sjkim sltu AT,c_2,t_2 1035289848Sjkim daddu c_3,AT 1036289848Sjkim dmultu a_0,b_6 /* mul_add_c(a[0],b[6],c1,c2,c3); */ 1037289848Sjkim mflo t_1 1038289848Sjkim mfhi t_2 1039289848Sjkim daddu c_1,t_1 1040289848Sjkim sltu AT,c_1,t_1 1041289848Sjkim daddu t_2,AT 1042289848Sjkim daddu c_2,t_2 1043289848Sjkim sltu AT,c_2,t_2 1044289848Sjkim daddu c_3,AT 1045289848Sjkim sd c_1,48(a0) /* r[6]=c1; */ 1046289848Sjkim 1047289848Sjkim dmultu a_0,b_7 /* mul_add_c(a[0],b[7],c2,c3,c1); */ 1048289848Sjkim mflo t_1 1049289848Sjkim mfhi t_2 1050289848Sjkim daddu c_2,t_1 1051289848Sjkim sltu AT,c_2,t_1 1052289848Sjkim daddu t_2,AT 1053289848Sjkim daddu c_3,t_2 1054289848Sjkim sltu c_1,c_3,t_2 1055289848Sjkim dmultu a_1,b_6 /* mul_add_c(a[1],b[6],c2,c3,c1); */ 1056289848Sjkim mflo t_1 1057289848Sjkim mfhi t_2 1058289848Sjkim daddu c_2,t_1 1059289848Sjkim sltu AT,c_2,t_1 1060289848Sjkim daddu t_2,AT 1061289848Sjkim daddu c_3,t_2 1062289848Sjkim sltu AT,c_3,t_2 1063289848Sjkim daddu c_1,AT 1064289848Sjkim dmultu a_2,b_5 /* mul_add_c(a[2],b[5],c2,c3,c1); */ 1065289848Sjkim mflo t_1 1066289848Sjkim mfhi t_2 1067289848Sjkim daddu c_2,t_1 1068289848Sjkim sltu AT,c_2,t_1 1069289848Sjkim daddu t_2,AT 1070289848Sjkim daddu c_3,t_2 1071289848Sjkim sltu AT,c_3,t_2 1072289848Sjkim daddu c_1,AT 1073289848Sjkim dmultu a_3,b_4 /* mul_add_c(a[3],b[4],c2,c3,c1); */ 1074289848Sjkim mflo t_1 1075289848Sjkim mfhi t_2 1076289848Sjkim daddu c_2,t_1 1077289848Sjkim sltu AT,c_2,t_1 1078289848Sjkim daddu t_2,AT 1079289848Sjkim daddu c_3,t_2 1080289848Sjkim sltu AT,c_3,t_2 1081289848Sjkim daddu c_1,AT 1082289848Sjkim dmultu a_4,b_3 /* mul_add_c(a[4],b[3],c2,c3,c1); */ 1083289848Sjkim mflo t_1 1084289848Sjkim mfhi t_2 1085289848Sjkim daddu c_2,t_1 1086289848Sjkim sltu AT,c_2,t_1 1087289848Sjkim daddu t_2,AT 1088289848Sjkim daddu c_3,t_2 1089289848Sjkim sltu AT,c_3,t_2 1090289848Sjkim daddu c_1,AT 1091289848Sjkim dmultu a_5,b_2 /* mul_add_c(a[5],b[2],c2,c3,c1); */ 1092289848Sjkim mflo t_1 1093289848Sjkim mfhi t_2 1094289848Sjkim daddu c_2,t_1 1095289848Sjkim sltu AT,c_2,t_1 1096289848Sjkim daddu t_2,AT 1097289848Sjkim daddu c_3,t_2 1098289848Sjkim sltu AT,c_3,t_2 1099289848Sjkim daddu c_1,AT 1100289848Sjkim dmultu a_6,b_1 /* mul_add_c(a[6],b[1],c2,c3,c1); */ 1101289848Sjkim mflo t_1 1102289848Sjkim mfhi t_2 1103289848Sjkim daddu c_2,t_1 1104289848Sjkim sltu AT,c_2,t_1 1105289848Sjkim daddu t_2,AT 1106289848Sjkim daddu c_3,t_2 1107289848Sjkim sltu AT,c_3,t_2 1108289848Sjkim daddu c_1,AT 1109289848Sjkim dmultu a_7,b_0 /* mul_add_c(a[7],b[0],c2,c3,c1); */ 1110289848Sjkim mflo t_1 1111289848Sjkim mfhi t_2 1112289848Sjkim daddu c_2,t_1 1113289848Sjkim sltu AT,c_2,t_1 1114289848Sjkim daddu t_2,AT 1115289848Sjkim daddu c_3,t_2 1116289848Sjkim sltu AT,c_3,t_2 1117289848Sjkim daddu c_1,AT 1118289848Sjkim sd c_2,56(a0) /* r[7]=c2; */ 1119289848Sjkim 1120289848Sjkim dmultu a_7,b_1 /* mul_add_c(a[7],b[1],c3,c1,c2); */ 1121289848Sjkim mflo t_1 1122289848Sjkim mfhi t_2 1123289848Sjkim daddu c_3,t_1 1124289848Sjkim sltu AT,c_3,t_1 1125289848Sjkim daddu t_2,AT 1126289848Sjkim daddu c_1,t_2 1127289848Sjkim sltu c_2,c_1,t_2 1128289848Sjkim dmultu a_6,b_2 /* mul_add_c(a[6],b[2],c3,c1,c2); */ 1129289848Sjkim mflo t_1 1130289848Sjkim mfhi t_2 1131289848Sjkim daddu c_3,t_1 1132289848Sjkim sltu AT,c_3,t_1 1133289848Sjkim daddu t_2,AT 1134289848Sjkim daddu c_1,t_2 1135289848Sjkim sltu AT,c_1,t_2 1136289848Sjkim daddu c_2,AT 1137289848Sjkim dmultu a_5,b_3 /* mul_add_c(a[5],b[3],c3,c1,c2); */ 1138289848Sjkim mflo t_1 1139289848Sjkim mfhi t_2 1140289848Sjkim daddu c_3,t_1 1141289848Sjkim sltu AT,c_3,t_1 1142289848Sjkim daddu t_2,AT 1143289848Sjkim daddu c_1,t_2 1144289848Sjkim sltu AT,c_1,t_2 1145289848Sjkim daddu c_2,AT 1146289848Sjkim dmultu a_4,b_4 /* mul_add_c(a[4],b[4],c3,c1,c2); */ 1147289848Sjkim mflo t_1 1148289848Sjkim mfhi t_2 1149289848Sjkim daddu c_3,t_1 1150289848Sjkim sltu AT,c_3,t_1 1151289848Sjkim daddu t_2,AT 1152289848Sjkim daddu c_1,t_2 1153289848Sjkim sltu AT,c_1,t_2 1154289848Sjkim daddu c_2,AT 1155289848Sjkim dmultu a_3,b_5 /* mul_add_c(a[3],b[5],c3,c1,c2); */ 1156289848Sjkim mflo t_1 1157289848Sjkim mfhi t_2 1158289848Sjkim daddu c_3,t_1 1159289848Sjkim sltu AT,c_3,t_1 1160289848Sjkim daddu t_2,AT 1161289848Sjkim daddu c_1,t_2 1162289848Sjkim sltu AT,c_1,t_2 1163289848Sjkim daddu c_2,AT 1164289848Sjkim dmultu a_2,b_6 /* mul_add_c(a[2],b[6],c3,c1,c2); */ 1165289848Sjkim mflo t_1 1166289848Sjkim mfhi t_2 1167289848Sjkim daddu c_3,t_1 1168289848Sjkim sltu AT,c_3,t_1 1169289848Sjkim daddu t_2,AT 1170289848Sjkim daddu c_1,t_2 1171289848Sjkim sltu AT,c_1,t_2 1172289848Sjkim daddu c_2,AT 1173289848Sjkim dmultu a_1,b_7 /* mul_add_c(a[1],b[7],c3,c1,c2); */ 1174289848Sjkim mflo t_1 1175289848Sjkim mfhi t_2 1176289848Sjkim daddu c_3,t_1 1177289848Sjkim sltu AT,c_3,t_1 1178289848Sjkim daddu t_2,AT 1179289848Sjkim daddu c_1,t_2 1180289848Sjkim sltu AT,c_1,t_2 1181289848Sjkim daddu c_2,AT 1182289848Sjkim sd c_3,64(a0) /* r[8]=c3; */ 1183289848Sjkim 1184289848Sjkim dmultu a_2,b_7 /* mul_add_c(a[2],b[7],c1,c2,c3); */ 1185289848Sjkim mflo t_1 1186289848Sjkim mfhi t_2 1187289848Sjkim daddu c_1,t_1 1188289848Sjkim sltu AT,c_1,t_1 1189289848Sjkim daddu t_2,AT 1190289848Sjkim daddu c_2,t_2 1191289848Sjkim sltu c_3,c_2,t_2 1192289848Sjkim dmultu a_3,b_6 /* mul_add_c(a[3],b[6],c1,c2,c3); */ 1193289848Sjkim mflo t_1 1194289848Sjkim mfhi t_2 1195289848Sjkim daddu c_1,t_1 1196289848Sjkim sltu AT,c_1,t_1 1197289848Sjkim daddu t_2,AT 1198289848Sjkim daddu c_2,t_2 1199289848Sjkim sltu AT,c_2,t_2 1200289848Sjkim daddu c_3,AT 1201289848Sjkim dmultu a_4,b_5 /* mul_add_c(a[4],b[5],c1,c2,c3); */ 1202289848Sjkim mflo t_1 1203289848Sjkim mfhi t_2 1204289848Sjkim daddu c_1,t_1 1205289848Sjkim sltu AT,c_1,t_1 1206289848Sjkim daddu t_2,AT 1207289848Sjkim daddu c_2,t_2 1208289848Sjkim sltu AT,c_2,t_2 1209289848Sjkim daddu c_3,AT 1210289848Sjkim dmultu a_5,b_4 /* mul_add_c(a[5],b[4],c1,c2,c3); */ 1211289848Sjkim mflo t_1 1212289848Sjkim mfhi t_2 1213289848Sjkim daddu c_1,t_1 1214289848Sjkim sltu AT,c_1,t_1 1215289848Sjkim daddu t_2,AT 1216289848Sjkim daddu c_2,t_2 1217289848Sjkim sltu AT,c_2,t_2 1218289848Sjkim daddu c_3,AT 1219289848Sjkim dmultu a_6,b_3 /* mul_add_c(a[6],b[3],c1,c2,c3); */ 1220289848Sjkim mflo t_1 1221289848Sjkim mfhi t_2 1222289848Sjkim daddu c_1,t_1 1223289848Sjkim sltu AT,c_1,t_1 1224289848Sjkim daddu t_2,AT 1225289848Sjkim daddu c_2,t_2 1226289848Sjkim sltu AT,c_2,t_2 1227289848Sjkim daddu c_3,AT 1228289848Sjkim dmultu a_7,b_2 /* mul_add_c(a[7],b[2],c1,c2,c3); */ 1229289848Sjkim mflo t_1 1230289848Sjkim mfhi t_2 1231289848Sjkim daddu c_1,t_1 1232289848Sjkim sltu AT,c_1,t_1 1233289848Sjkim daddu t_2,AT 1234289848Sjkim daddu c_2,t_2 1235289848Sjkim sltu AT,c_2,t_2 1236289848Sjkim daddu c_3,AT 1237289848Sjkim sd c_1,72(a0) /* r[9]=c1; */ 1238289848Sjkim 1239289848Sjkim dmultu a_7,b_3 /* mul_add_c(a[7],b[3],c2,c3,c1); */ 1240289848Sjkim mflo t_1 1241289848Sjkim mfhi t_2 1242289848Sjkim daddu c_2,t_1 1243289848Sjkim sltu AT,c_2,t_1 1244289848Sjkim daddu t_2,AT 1245289848Sjkim daddu c_3,t_2 1246289848Sjkim sltu c_1,c_3,t_2 1247289848Sjkim dmultu a_6,b_4 /* mul_add_c(a[6],b[4],c2,c3,c1); */ 1248289848Sjkim mflo t_1 1249289848Sjkim mfhi t_2 1250289848Sjkim daddu c_2,t_1 1251289848Sjkim sltu AT,c_2,t_1 1252289848Sjkim daddu t_2,AT 1253289848Sjkim daddu c_3,t_2 1254289848Sjkim sltu AT,c_3,t_2 1255289848Sjkim daddu c_1,AT 1256289848Sjkim dmultu a_5,b_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */ 1257289848Sjkim mflo t_1 1258289848Sjkim mfhi t_2 1259289848Sjkim daddu c_2,t_1 1260289848Sjkim sltu AT,c_2,t_1 1261289848Sjkim daddu t_2,AT 1262289848Sjkim daddu c_3,t_2 1263289848Sjkim sltu AT,c_3,t_2 1264289848Sjkim daddu c_1,AT 1265289848Sjkim dmultu a_4,b_6 /* mul_add_c(a[4],b[6],c2,c3,c1); */ 1266289848Sjkim mflo t_1 1267289848Sjkim mfhi t_2 1268289848Sjkim daddu c_2,t_1 1269289848Sjkim sltu AT,c_2,t_1 1270289848Sjkim daddu t_2,AT 1271289848Sjkim daddu c_3,t_2 1272289848Sjkim sltu AT,c_3,t_2 1273289848Sjkim daddu c_1,AT 1274289848Sjkim dmultu a_3,b_7 /* mul_add_c(a[3],b[7],c2,c3,c1); */ 1275289848Sjkim mflo t_1 1276289848Sjkim mfhi t_2 1277289848Sjkim daddu c_2,t_1 1278289848Sjkim sltu AT,c_2,t_1 1279289848Sjkim daddu t_2,AT 1280289848Sjkim daddu c_3,t_2 1281289848Sjkim sltu AT,c_3,t_2 1282289848Sjkim daddu c_1,AT 1283289848Sjkim sd c_2,80(a0) /* r[10]=c2; */ 1284289848Sjkim 1285289848Sjkim dmultu a_4,b_7 /* mul_add_c(a[4],b[7],c3,c1,c2); */ 1286289848Sjkim mflo t_1 1287289848Sjkim mfhi t_2 1288289848Sjkim daddu c_3,t_1 1289289848Sjkim sltu AT,c_3,t_1 1290289848Sjkim daddu t_2,AT 1291289848Sjkim daddu c_1,t_2 1292289848Sjkim sltu c_2,c_1,t_2 1293289848Sjkim dmultu a_5,b_6 /* mul_add_c(a[5],b[6],c3,c1,c2); */ 1294289848Sjkim mflo t_1 1295289848Sjkim mfhi t_2 1296289848Sjkim daddu c_3,t_1 1297289848Sjkim sltu AT,c_3,t_1 1298289848Sjkim daddu t_2,AT 1299289848Sjkim daddu c_1,t_2 1300289848Sjkim sltu AT,c_1,t_2 1301289848Sjkim daddu c_2,AT 1302289848Sjkim dmultu a_6,b_5 /* mul_add_c(a[6],b[5],c3,c1,c2); */ 1303289848Sjkim mflo t_1 1304289848Sjkim mfhi t_2 1305289848Sjkim daddu c_3,t_1 1306289848Sjkim sltu AT,c_3,t_1 1307289848Sjkim daddu t_2,AT 1308289848Sjkim daddu c_1,t_2 1309289848Sjkim sltu AT,c_1,t_2 1310289848Sjkim daddu c_2,AT 1311289848Sjkim dmultu a_7,b_4 /* mul_add_c(a[7],b[4],c3,c1,c2); */ 1312289848Sjkim mflo t_1 1313289848Sjkim mfhi t_2 1314289848Sjkim daddu c_3,t_1 1315289848Sjkim sltu AT,c_3,t_1 1316289848Sjkim daddu t_2,AT 1317289848Sjkim daddu c_1,t_2 1318289848Sjkim sltu AT,c_1,t_2 1319289848Sjkim daddu c_2,AT 1320289848Sjkim sd c_3,88(a0) /* r[11]=c3; */ 1321289848Sjkim 1322289848Sjkim dmultu a_7,b_5 /* mul_add_c(a[7],b[5],c1,c2,c3); */ 1323289848Sjkim mflo t_1 1324289848Sjkim mfhi t_2 1325289848Sjkim daddu c_1,t_1 1326289848Sjkim sltu AT,c_1,t_1 1327289848Sjkim daddu t_2,AT 1328289848Sjkim daddu c_2,t_2 1329289848Sjkim sltu c_3,c_2,t_2 1330289848Sjkim dmultu a_6,b_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */ 1331289848Sjkim mflo t_1 1332289848Sjkim mfhi t_2 1333289848Sjkim daddu c_1,t_1 1334289848Sjkim sltu AT,c_1,t_1 1335289848Sjkim daddu t_2,AT 1336289848Sjkim daddu c_2,t_2 1337289848Sjkim sltu AT,c_2,t_2 1338289848Sjkim daddu c_3,AT 1339289848Sjkim dmultu a_5,b_7 /* mul_add_c(a[5],b[7],c1,c2,c3); */ 1340289848Sjkim mflo t_1 1341289848Sjkim mfhi t_2 1342289848Sjkim daddu c_1,t_1 1343289848Sjkim sltu AT,c_1,t_1 1344289848Sjkim daddu t_2,AT 1345289848Sjkim daddu c_2,t_2 1346289848Sjkim sltu AT,c_2,t_2 1347289848Sjkim daddu c_3,AT 1348289848Sjkim sd c_1,96(a0) /* r[12]=c1; */ 1349289848Sjkim 1350289848Sjkim dmultu a_6,b_7 /* mul_add_c(a[6],b[7],c2,c3,c1); */ 1351289848Sjkim mflo t_1 1352289848Sjkim mfhi t_2 1353289848Sjkim daddu c_2,t_1 1354289848Sjkim sltu AT,c_2,t_1 1355289848Sjkim daddu t_2,AT 1356289848Sjkim daddu c_3,t_2 1357289848Sjkim sltu c_1,c_3,t_2 1358289848Sjkim dmultu a_7,b_6 /* mul_add_c(a[7],b[6],c2,c3,c1); */ 1359289848Sjkim mflo t_1 1360289848Sjkim mfhi t_2 1361289848Sjkim daddu c_2,t_1 1362289848Sjkim sltu AT,c_2,t_1 1363289848Sjkim daddu t_2,AT 1364289848Sjkim daddu c_3,t_2 1365289848Sjkim sltu AT,c_3,t_2 1366289848Sjkim daddu c_1,AT 1367289848Sjkim sd c_2,104(a0) /* r[13]=c2; */ 1368289848Sjkim 1369289848Sjkim dmultu a_7,b_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */ 1370289848Sjkim ld s0,0(sp) 1371289848Sjkim ld s1,8(sp) 1372289848Sjkim ld s2,16(sp) 1373289848Sjkim ld s3,24(sp) 1374289848Sjkim ld s4,32(sp) 1375289848Sjkim ld s5,40(sp) 1376289848Sjkim mflo t_1 1377289848Sjkim mfhi t_2 1378289848Sjkim daddu c_3,t_1 1379289848Sjkim sltu AT,c_3,t_1 1380289848Sjkim daddu t_2,AT 1381289848Sjkim daddu c_1,t_2 1382289848Sjkim sd c_3,112(a0) /* r[14]=c3; */ 1383289848Sjkim sd c_1,120(a0) /* r[15]=c1; */ 1384289848Sjkim 1385289848Sjkim PTR_ADD sp,FRAME_SIZE 1386289848Sjkim 1387289848Sjkim jr ra 1388289848SjkimEND(bn_mul_comba8) 1389289848Sjkim 1390289848Sjkim.align 5 1391289848SjkimLEAF(bn_mul_comba4) 1392289848Sjkim .set reorder 1393289848Sjkim ld a_0,0(a1) 1394289848Sjkim ld b_0,0(a2) 1395289848Sjkim ld a_1,8(a1) 1396289848Sjkim ld a_2,16(a1) 1397289848Sjkim dmultu a_0,b_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */ 1398289848Sjkim ld a_3,24(a1) 1399289848Sjkim ld b_1,8(a2) 1400289848Sjkim ld b_2,16(a2) 1401289848Sjkim ld b_3,24(a2) 1402289848Sjkim mflo c_1 1403289848Sjkim mfhi c_2 1404289848Sjkim sd c_1,0(a0) 1405289848Sjkim 1406289848Sjkim dmultu a_0,b_1 /* mul_add_c(a[0],b[1],c2,c3,c1); */ 1407289848Sjkim mflo t_1 1408289848Sjkim mfhi t_2 1409289848Sjkim daddu c_2,t_1 1410289848Sjkim sltu AT,c_2,t_1 1411289848Sjkim daddu c_3,t_2,AT 1412289848Sjkim dmultu a_1,b_0 /* mul_add_c(a[1],b[0],c2,c3,c1); */ 1413289848Sjkim mflo t_1 1414289848Sjkim mfhi t_2 1415289848Sjkim daddu c_2,t_1 1416289848Sjkim sltu AT,c_2,t_1 1417289848Sjkim daddu t_2,AT 1418289848Sjkim daddu c_3,t_2 1419289848Sjkim sltu c_1,c_3,t_2 1420289848Sjkim sd c_2,8(a0) 1421289848Sjkim 1422289848Sjkim dmultu a_2,b_0 /* mul_add_c(a[2],b[0],c3,c1,c2); */ 1423289848Sjkim mflo t_1 1424289848Sjkim mfhi t_2 1425289848Sjkim daddu c_3,t_1 1426289848Sjkim sltu AT,c_3,t_1 1427289848Sjkim daddu t_2,AT 1428289848Sjkim daddu c_1,t_2 1429289848Sjkim dmultu a_1,b_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 1430289848Sjkim mflo t_1 1431289848Sjkim mfhi t_2 1432289848Sjkim daddu c_3,t_1 1433289848Sjkim sltu AT,c_3,t_1 1434289848Sjkim daddu t_2,AT 1435289848Sjkim daddu c_1,t_2 1436289848Sjkim sltu c_2,c_1,t_2 1437289848Sjkim dmultu a_0,b_2 /* mul_add_c(a[0],b[2],c3,c1,c2); */ 1438289848Sjkim mflo t_1 1439289848Sjkim mfhi t_2 1440289848Sjkim daddu c_3,t_1 1441289848Sjkim sltu AT,c_3,t_1 1442289848Sjkim daddu t_2,AT 1443289848Sjkim daddu c_1,t_2 1444289848Sjkim sltu AT,c_1,t_2 1445289848Sjkim daddu c_2,AT 1446289848Sjkim sd c_3,16(a0) 1447289848Sjkim 1448289848Sjkim dmultu a_0,b_3 /* mul_add_c(a[0],b[3],c1,c2,c3); */ 1449289848Sjkim mflo t_1 1450289848Sjkim mfhi t_2 1451289848Sjkim daddu c_1,t_1 1452289848Sjkim sltu AT,c_1,t_1 1453289848Sjkim daddu t_2,AT 1454289848Sjkim daddu c_2,t_2 1455289848Sjkim sltu c_3,c_2,t_2 1456289848Sjkim dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */ 1457289848Sjkim mflo t_1 1458289848Sjkim mfhi t_2 1459289848Sjkim daddu c_1,t_1 1460289848Sjkim sltu AT,c_1,t_1 1461289848Sjkim daddu t_2,AT 1462289848Sjkim daddu c_2,t_2 1463289848Sjkim sltu AT,c_2,t_2 1464289848Sjkim daddu c_3,AT 1465289848Sjkim dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */ 1466289848Sjkim mflo t_1 1467289848Sjkim mfhi t_2 1468289848Sjkim daddu c_1,t_1 1469289848Sjkim sltu AT,c_1,t_1 1470289848Sjkim daddu t_2,AT 1471289848Sjkim daddu c_2,t_2 1472289848Sjkim sltu AT,c_2,t_2 1473289848Sjkim daddu c_3,AT 1474289848Sjkim dmultu a_3,b_0 /* mul_add_c(a[3],b[0],c1,c2,c3); */ 1475289848Sjkim mflo t_1 1476289848Sjkim mfhi t_2 1477289848Sjkim daddu c_1,t_1 1478289848Sjkim sltu AT,c_1,t_1 1479289848Sjkim daddu t_2,AT 1480289848Sjkim daddu c_2,t_2 1481289848Sjkim sltu AT,c_2,t_2 1482289848Sjkim daddu c_3,AT 1483289848Sjkim sd c_1,24(a0) 1484289848Sjkim 1485289848Sjkim dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */ 1486289848Sjkim mflo t_1 1487289848Sjkim mfhi t_2 1488289848Sjkim daddu c_2,t_1 1489289848Sjkim sltu AT,c_2,t_1 1490289848Sjkim daddu t_2,AT 1491289848Sjkim daddu c_3,t_2 1492289848Sjkim sltu c_1,c_3,t_2 1493289848Sjkim dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 1494289848Sjkim mflo t_1 1495289848Sjkim mfhi t_2 1496289848Sjkim daddu c_2,t_1 1497289848Sjkim sltu AT,c_2,t_1 1498289848Sjkim daddu t_2,AT 1499289848Sjkim daddu c_3,t_2 1500289848Sjkim sltu AT,c_3,t_2 1501289848Sjkim daddu c_1,AT 1502289848Sjkim dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */ 1503289848Sjkim mflo t_1 1504289848Sjkim mfhi t_2 1505289848Sjkim daddu c_2,t_1 1506289848Sjkim sltu AT,c_2,t_1 1507289848Sjkim daddu t_2,AT 1508289848Sjkim daddu c_3,t_2 1509289848Sjkim sltu AT,c_3,t_2 1510289848Sjkim daddu c_1,AT 1511289848Sjkim sd c_2,32(a0) 1512289848Sjkim 1513289848Sjkim dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */ 1514289848Sjkim mflo t_1 1515289848Sjkim mfhi t_2 1516289848Sjkim daddu c_3,t_1 1517289848Sjkim sltu AT,c_3,t_1 1518289848Sjkim daddu t_2,AT 1519289848Sjkim daddu c_1,t_2 1520289848Sjkim sltu c_2,c_1,t_2 1521289848Sjkim dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */ 1522289848Sjkim mflo t_1 1523289848Sjkim mfhi t_2 1524289848Sjkim daddu c_3,t_1 1525289848Sjkim sltu AT,c_3,t_1 1526289848Sjkim daddu t_2,AT 1527289848Sjkim daddu c_1,t_2 1528289848Sjkim sltu AT,c_1,t_2 1529289848Sjkim daddu c_2,AT 1530289848Sjkim sd c_3,40(a0) 1531289848Sjkim 1532289848Sjkim dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 1533289848Sjkim mflo t_1 1534289848Sjkim mfhi t_2 1535289848Sjkim daddu c_1,t_1 1536289848Sjkim sltu AT,c_1,t_1 1537289848Sjkim daddu t_2,AT 1538289848Sjkim daddu c_2,t_2 1539289848Sjkim sd c_1,48(a0) 1540289848Sjkim sd c_2,56(a0) 1541289848Sjkim 1542289848Sjkim jr ra 1543289848SjkimEND(bn_mul_comba4) 1544289848Sjkim 1545289848Sjkim#undef a_4 1546289848Sjkim#undef a_5 1547289848Sjkim#undef a_6 1548289848Sjkim#undef a_7 1549289848Sjkim#define a_4 b_0 1550289848Sjkim#define a_5 b_1 1551289848Sjkim#define a_6 b_2 1552289848Sjkim#define a_7 b_3 1553289848Sjkim 1554289848Sjkim.align 5 1555289848SjkimLEAF(bn_sqr_comba8) 1556289848Sjkim .set reorder 1557289848Sjkim ld a_0,0(a1) 1558289848Sjkim ld a_1,8(a1) 1559289848Sjkim ld a_2,16(a1) 1560289848Sjkim ld a_3,24(a1) 1561289848Sjkim 1562289848Sjkim dmultu a_0,a_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */ 1563289848Sjkim ld a_4,32(a1) 1564289848Sjkim ld a_5,40(a1) 1565289848Sjkim ld a_6,48(a1) 1566289848Sjkim ld a_7,56(a1) 1567289848Sjkim mflo c_1 1568289848Sjkim mfhi c_2 1569289848Sjkim sd c_1,0(a0) 1570289848Sjkim 1571289848Sjkim dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */ 1572289848Sjkim mflo t_1 1573289848Sjkim mfhi t_2 1574289848Sjkim slt c_1,t_2,zero 1575289848Sjkim dsll t_2,1 1576289848Sjkim slt a2,t_1,zero 1577289848Sjkim daddu t_2,a2 1578289848Sjkim dsll t_1,1 1579289848Sjkim daddu c_2,t_1 1580289848Sjkim sltu AT,c_2,t_1 1581289848Sjkim daddu c_3,t_2,AT 1582289848Sjkim sd c_2,8(a0) 1583289848Sjkim 1584289848Sjkim dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */ 1585289848Sjkim mflo t_1 1586289848Sjkim mfhi t_2 1587289848Sjkim slt c_2,t_2,zero 1588289848Sjkim dsll t_2,1 1589289848Sjkim slt a2,t_1,zero 1590289848Sjkim daddu t_2,a2 1591289848Sjkim dsll t_1,1 1592289848Sjkim daddu c_3,t_1 1593289848Sjkim sltu AT,c_3,t_1 1594289848Sjkim daddu t_2,AT 1595289848Sjkim daddu c_1,t_2 1596289848Sjkim sltu AT,c_1,t_2 1597289848Sjkim daddu c_2,AT 1598289848Sjkim dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 1599289848Sjkim mflo t_1 1600289848Sjkim mfhi t_2 1601289848Sjkim daddu c_3,t_1 1602289848Sjkim sltu AT,c_3,t_1 1603289848Sjkim daddu t_2,AT 1604289848Sjkim daddu c_1,t_2 1605289848Sjkim sltu AT,c_1,t_2 1606289848Sjkim daddu c_2,AT 1607289848Sjkim sd c_3,16(a0) 1608289848Sjkim 1609289848Sjkim dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */ 1610289848Sjkim mflo t_1 1611289848Sjkim mfhi t_2 1612289848Sjkim slt c_3,t_2,zero 1613289848Sjkim dsll t_2,1 1614289848Sjkim slt a2,t_1,zero 1615289848Sjkim daddu t_2,a2 1616289848Sjkim dsll t_1,1 1617289848Sjkim daddu c_1,t_1 1618289848Sjkim sltu AT,c_1,t_1 1619289848Sjkim daddu t_2,AT 1620289848Sjkim daddu c_2,t_2 1621289848Sjkim sltu AT,c_2,t_2 1622289848Sjkim daddu c_3,AT 1623289848Sjkim dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */ 1624289848Sjkim mflo t_1 1625289848Sjkim mfhi t_2 1626289848Sjkim slt AT,t_2,zero 1627289848Sjkim daddu c_3,AT 1628289848Sjkim dsll t_2,1 1629289848Sjkim slt a2,t_1,zero 1630289848Sjkim daddu t_2,a2 1631289848Sjkim dsll t_1,1 1632289848Sjkim daddu c_1,t_1 1633289848Sjkim sltu AT,c_1,t_1 1634289848Sjkim daddu t_2,AT 1635289848Sjkim daddu c_2,t_2 1636289848Sjkim sltu AT,c_2,t_2 1637289848Sjkim daddu c_3,AT 1638289848Sjkim sd c_1,24(a0) 1639289848Sjkim 1640289848Sjkim dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */ 1641289848Sjkim mflo t_1 1642289848Sjkim mfhi t_2 1643289848Sjkim slt c_1,t_2,zero 1644289848Sjkim dsll t_2,1 1645289848Sjkim slt a2,t_1,zero 1646289848Sjkim daddu t_2,a2 1647289848Sjkim dsll t_1,1 1648289848Sjkim daddu c_2,t_1 1649289848Sjkim sltu AT,c_2,t_1 1650289848Sjkim daddu t_2,AT 1651289848Sjkim daddu c_3,t_2 1652289848Sjkim sltu AT,c_3,t_2 1653289848Sjkim daddu c_1,AT 1654289848Sjkim dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */ 1655289848Sjkim mflo t_1 1656289848Sjkim mfhi t_2 1657289848Sjkim slt AT,t_2,zero 1658289848Sjkim daddu c_1,AT 1659289848Sjkim dsll t_2,1 1660289848Sjkim slt a2,t_1,zero 1661289848Sjkim daddu t_2,a2 1662289848Sjkim dsll t_1,1 1663289848Sjkim daddu c_2,t_1 1664289848Sjkim sltu AT,c_2,t_1 1665289848Sjkim daddu t_2,AT 1666289848Sjkim daddu c_3,t_2 1667289848Sjkim sltu AT,c_3,t_2 1668289848Sjkim daddu c_1,AT 1669289848Sjkim dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 1670289848Sjkim mflo t_1 1671289848Sjkim mfhi t_2 1672289848Sjkim daddu c_2,t_1 1673289848Sjkim sltu AT,c_2,t_1 1674289848Sjkim daddu t_2,AT 1675289848Sjkim daddu c_3,t_2 1676289848Sjkim sltu AT,c_3,t_2 1677289848Sjkim daddu c_1,AT 1678289848Sjkim sd c_2,32(a0) 1679289848Sjkim 1680289848Sjkim dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */ 1681289848Sjkim mflo t_1 1682289848Sjkim mfhi t_2 1683289848Sjkim slt c_2,t_2,zero 1684289848Sjkim dsll t_2,1 1685289848Sjkim slt a2,t_1,zero 1686289848Sjkim daddu t_2,a2 1687289848Sjkim dsll t_1,1 1688289848Sjkim daddu c_3,t_1 1689289848Sjkim sltu AT,c_3,t_1 1690289848Sjkim daddu t_2,AT 1691289848Sjkim daddu c_1,t_2 1692289848Sjkim sltu AT,c_1,t_2 1693289848Sjkim daddu c_2,AT 1694289848Sjkim dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */ 1695289848Sjkim mflo t_1 1696289848Sjkim mfhi t_2 1697289848Sjkim slt AT,t_2,zero 1698289848Sjkim daddu c_2,AT 1699289848Sjkim dsll t_2,1 1700289848Sjkim slt a2,t_1,zero 1701289848Sjkim daddu t_2,a2 1702289848Sjkim dsll t_1,1 1703289848Sjkim daddu c_3,t_1 1704289848Sjkim sltu AT,c_3,t_1 1705289848Sjkim daddu t_2,AT 1706289848Sjkim daddu c_1,t_2 1707289848Sjkim sltu AT,c_1,t_2 1708289848Sjkim daddu c_2,AT 1709289848Sjkim dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */ 1710289848Sjkim mflo t_1 1711289848Sjkim mfhi t_2 1712289848Sjkim slt AT,t_2,zero 1713289848Sjkim daddu c_2,AT 1714289848Sjkim dsll t_2,1 1715289848Sjkim slt a2,t_1,zero 1716289848Sjkim daddu t_2,a2 1717289848Sjkim dsll t_1,1 1718289848Sjkim daddu c_3,t_1 1719289848Sjkim sltu AT,c_3,t_1 1720289848Sjkim daddu t_2,AT 1721289848Sjkim daddu c_1,t_2 1722289848Sjkim sltu AT,c_1,t_2 1723289848Sjkim daddu c_2,AT 1724289848Sjkim sd c_3,40(a0) 1725289848Sjkim 1726289848Sjkim dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */ 1727289848Sjkim mflo t_1 1728289848Sjkim mfhi t_2 1729289848Sjkim slt c_3,t_2,zero 1730289848Sjkim dsll t_2,1 1731289848Sjkim slt a2,t_1,zero 1732289848Sjkim daddu t_2,a2 1733289848Sjkim dsll t_1,1 1734289848Sjkim daddu c_1,t_1 1735289848Sjkim sltu AT,c_1,t_1 1736289848Sjkim daddu t_2,AT 1737289848Sjkim daddu c_2,t_2 1738289848Sjkim sltu AT,c_2,t_2 1739289848Sjkim daddu c_3,AT 1740289848Sjkim dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */ 1741289848Sjkim mflo t_1 1742289848Sjkim mfhi t_2 1743289848Sjkim slt AT,t_2,zero 1744289848Sjkim daddu c_3,AT 1745289848Sjkim dsll t_2,1 1746289848Sjkim slt a2,t_1,zero 1747289848Sjkim daddu t_2,a2 1748289848Sjkim dsll t_1,1 1749289848Sjkim daddu c_1,t_1 1750289848Sjkim sltu AT,c_1,t_1 1751289848Sjkim daddu t_2,AT 1752289848Sjkim daddu c_2,t_2 1753289848Sjkim sltu AT,c_2,t_2 1754289848Sjkim daddu c_3,AT 1755289848Sjkim dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */ 1756289848Sjkim mflo t_1 1757289848Sjkim mfhi t_2 1758289848Sjkim slt AT,t_2,zero 1759289848Sjkim daddu c_3,AT 1760289848Sjkim dsll t_2,1 1761289848Sjkim slt a2,t_1,zero 1762289848Sjkim daddu t_2,a2 1763289848Sjkim dsll t_1,1 1764289848Sjkim daddu c_1,t_1 1765289848Sjkim sltu AT,c_1,t_1 1766289848Sjkim daddu t_2,AT 1767289848Sjkim daddu c_2,t_2 1768289848Sjkim sltu AT,c_2,t_2 1769289848Sjkim daddu c_3,AT 1770289848Sjkim dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 1771289848Sjkim mflo t_1 1772289848Sjkim mfhi t_2 1773289848Sjkim daddu c_1,t_1 1774289848Sjkim sltu AT,c_1,t_1 1775289848Sjkim daddu t_2,AT 1776289848Sjkim daddu c_2,t_2 1777289848Sjkim sltu AT,c_2,t_2 1778289848Sjkim daddu c_3,AT 1779289848Sjkim sd c_1,48(a0) 1780289848Sjkim 1781289848Sjkim dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */ 1782289848Sjkim mflo t_1 1783289848Sjkim mfhi t_2 1784289848Sjkim slt c_1,t_2,zero 1785289848Sjkim dsll t_2,1 1786289848Sjkim slt a2,t_1,zero 1787289848Sjkim daddu t_2,a2 1788289848Sjkim dsll t_1,1 1789289848Sjkim daddu c_2,t_1 1790289848Sjkim sltu AT,c_2,t_1 1791289848Sjkim daddu t_2,AT 1792289848Sjkim daddu c_3,t_2 1793289848Sjkim sltu AT,c_3,t_2 1794289848Sjkim daddu c_1,AT 1795289848Sjkim dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */ 1796289848Sjkim mflo t_1 1797289848Sjkim mfhi t_2 1798289848Sjkim slt AT,t_2,zero 1799289848Sjkim daddu c_1,AT 1800289848Sjkim dsll t_2,1 1801289848Sjkim slt a2,t_1,zero 1802289848Sjkim daddu t_2,a2 1803289848Sjkim dsll t_1,1 1804289848Sjkim daddu c_2,t_1 1805289848Sjkim sltu AT,c_2,t_1 1806289848Sjkim daddu t_2,AT 1807289848Sjkim daddu c_3,t_2 1808289848Sjkim sltu AT,c_3,t_2 1809289848Sjkim daddu c_1,AT 1810289848Sjkim dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */ 1811289848Sjkim mflo t_1 1812289848Sjkim mfhi t_2 1813289848Sjkim slt AT,t_2,zero 1814289848Sjkim daddu c_1,AT 1815289848Sjkim dsll t_2,1 1816289848Sjkim slt a2,t_1,zero 1817289848Sjkim daddu t_2,a2 1818289848Sjkim dsll t_1,1 1819289848Sjkim daddu c_2,t_1 1820289848Sjkim sltu AT,c_2,t_1 1821289848Sjkim daddu t_2,AT 1822289848Sjkim daddu c_3,t_2 1823289848Sjkim sltu AT,c_3,t_2 1824289848Sjkim daddu c_1,AT 1825289848Sjkim dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */ 1826289848Sjkim mflo t_1 1827289848Sjkim mfhi t_2 1828289848Sjkim slt AT,t_2,zero 1829289848Sjkim daddu c_1,AT 1830289848Sjkim dsll t_2,1 1831289848Sjkim slt a2,t_1,zero 1832289848Sjkim daddu t_2,a2 1833289848Sjkim dsll t_1,1 1834289848Sjkim daddu c_2,t_1 1835289848Sjkim sltu AT,c_2,t_1 1836289848Sjkim daddu t_2,AT 1837289848Sjkim daddu c_3,t_2 1838289848Sjkim sltu AT,c_3,t_2 1839289848Sjkim daddu c_1,AT 1840289848Sjkim sd c_2,56(a0) 1841289848Sjkim 1842289848Sjkim dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */ 1843289848Sjkim mflo t_1 1844289848Sjkim mfhi t_2 1845289848Sjkim slt c_2,t_2,zero 1846289848Sjkim dsll t_2,1 1847289848Sjkim slt a2,t_1,zero 1848289848Sjkim daddu t_2,a2 1849289848Sjkim dsll t_1,1 1850289848Sjkim daddu c_3,t_1 1851289848Sjkim sltu AT,c_3,t_1 1852289848Sjkim daddu t_2,AT 1853289848Sjkim daddu c_1,t_2 1854289848Sjkim sltu AT,c_1,t_2 1855289848Sjkim daddu c_2,AT 1856289848Sjkim dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */ 1857289848Sjkim mflo t_1 1858289848Sjkim mfhi t_2 1859289848Sjkim slt AT,t_2,zero 1860289848Sjkim daddu c_2,AT 1861289848Sjkim dsll t_2,1 1862289848Sjkim slt a2,t_1,zero 1863289848Sjkim daddu t_2,a2 1864289848Sjkim dsll t_1,1 1865289848Sjkim daddu c_3,t_1 1866289848Sjkim sltu AT,c_3,t_1 1867289848Sjkim daddu t_2,AT 1868289848Sjkim daddu c_1,t_2 1869289848Sjkim sltu AT,c_1,t_2 1870289848Sjkim daddu c_2,AT 1871289848Sjkim dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */ 1872289848Sjkim mflo t_1 1873289848Sjkim mfhi t_2 1874289848Sjkim slt AT,t_2,zero 1875289848Sjkim daddu c_2,AT 1876289848Sjkim dsll t_2,1 1877289848Sjkim slt a2,t_1,zero 1878289848Sjkim daddu t_2,a2 1879289848Sjkim dsll t_1,1 1880289848Sjkim daddu c_3,t_1 1881289848Sjkim sltu AT,c_3,t_1 1882289848Sjkim daddu t_2,AT 1883289848Sjkim daddu c_1,t_2 1884289848Sjkim sltu AT,c_1,t_2 1885289848Sjkim daddu c_2,AT 1886289848Sjkim dmultu a_4,a_4 /* mul_add_c(a[4],b[4],c3,c1,c2); */ 1887289848Sjkim mflo t_1 1888289848Sjkim mfhi t_2 1889289848Sjkim daddu c_3,t_1 1890289848Sjkim sltu AT,c_3,t_1 1891289848Sjkim daddu t_2,AT 1892289848Sjkim daddu c_1,t_2 1893289848Sjkim sltu AT,c_1,t_2 1894289848Sjkim daddu c_2,AT 1895289848Sjkim sd c_3,64(a0) 1896289848Sjkim 1897289848Sjkim dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */ 1898289848Sjkim mflo t_1 1899289848Sjkim mfhi t_2 1900289848Sjkim slt c_3,t_2,zero 1901289848Sjkim dsll t_2,1 1902289848Sjkim slt a2,t_1,zero 1903289848Sjkim daddu t_2,a2 1904289848Sjkim dsll t_1,1 1905289848Sjkim daddu c_1,t_1 1906289848Sjkim sltu AT,c_1,t_1 1907289848Sjkim daddu t_2,AT 1908289848Sjkim daddu c_2,t_2 1909289848Sjkim sltu AT,c_2,t_2 1910289848Sjkim daddu c_3,AT 1911289848Sjkim dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */ 1912289848Sjkim mflo t_1 1913289848Sjkim mfhi t_2 1914289848Sjkim slt AT,t_2,zero 1915289848Sjkim daddu c_3,AT 1916289848Sjkim dsll t_2,1 1917289848Sjkim slt a2,t_1,zero 1918289848Sjkim daddu t_2,a2 1919289848Sjkim dsll t_1,1 1920289848Sjkim daddu c_1,t_1 1921289848Sjkim sltu AT,c_1,t_1 1922289848Sjkim daddu t_2,AT 1923289848Sjkim daddu c_2,t_2 1924289848Sjkim sltu AT,c_2,t_2 1925289848Sjkim daddu c_3,AT 1926289848Sjkim dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */ 1927289848Sjkim mflo t_1 1928289848Sjkim mfhi t_2 1929289848Sjkim slt AT,t_2,zero 1930289848Sjkim daddu c_3,AT 1931289848Sjkim dsll t_2,1 1932289848Sjkim slt a2,t_1,zero 1933289848Sjkim daddu t_2,a2 1934289848Sjkim dsll t_1,1 1935289848Sjkim daddu c_1,t_1 1936289848Sjkim sltu AT,c_1,t_1 1937289848Sjkim daddu t_2,AT 1938289848Sjkim daddu c_2,t_2 1939289848Sjkim sltu AT,c_2,t_2 1940289848Sjkim daddu c_3,AT 1941289848Sjkim sd c_1,72(a0) 1942289848Sjkim 1943289848Sjkim dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */ 1944289848Sjkim mflo t_1 1945289848Sjkim mfhi t_2 1946289848Sjkim slt c_1,t_2,zero 1947289848Sjkim dsll t_2,1 1948289848Sjkim slt a2,t_1,zero 1949289848Sjkim daddu t_2,a2 1950289848Sjkim dsll t_1,1 1951289848Sjkim daddu c_2,t_1 1952289848Sjkim sltu AT,c_2,t_1 1953289848Sjkim daddu t_2,AT 1954289848Sjkim daddu c_3,t_2 1955289848Sjkim sltu AT,c_3,t_2 1956289848Sjkim daddu c_1,AT 1957289848Sjkim dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */ 1958289848Sjkim mflo t_1 1959289848Sjkim mfhi t_2 1960289848Sjkim slt AT,t_2,zero 1961289848Sjkim daddu c_1,AT 1962289848Sjkim dsll t_2,1 1963289848Sjkim slt a2,t_1,zero 1964289848Sjkim daddu t_2,a2 1965289848Sjkim dsll t_1,1 1966289848Sjkim daddu c_2,t_1 1967289848Sjkim sltu AT,c_2,t_1 1968289848Sjkim daddu t_2,AT 1969289848Sjkim daddu c_3,t_2 1970289848Sjkim sltu AT,c_3,t_2 1971289848Sjkim daddu c_1,AT 1972289848Sjkim dmultu a_5,a_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */ 1973289848Sjkim mflo t_1 1974289848Sjkim mfhi t_2 1975289848Sjkim daddu c_2,t_1 1976289848Sjkim sltu AT,c_2,t_1 1977289848Sjkim daddu t_2,AT 1978289848Sjkim daddu c_3,t_2 1979289848Sjkim sltu AT,c_3,t_2 1980289848Sjkim daddu c_1,AT 1981289848Sjkim sd c_2,80(a0) 1982289848Sjkim 1983289848Sjkim dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */ 1984289848Sjkim mflo t_1 1985289848Sjkim mfhi t_2 1986289848Sjkim slt c_2,t_2,zero 1987289848Sjkim dsll t_2,1 1988289848Sjkim slt a2,t_1,zero 1989289848Sjkim daddu t_2,a2 1990289848Sjkim dsll t_1,1 1991289848Sjkim daddu c_3,t_1 1992289848Sjkim sltu AT,c_3,t_1 1993289848Sjkim daddu t_2,AT 1994289848Sjkim daddu c_1,t_2 1995289848Sjkim sltu AT,c_1,t_2 1996289848Sjkim daddu c_2,AT 1997289848Sjkim dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */ 1998289848Sjkim mflo t_1 1999289848Sjkim mfhi t_2 2000289848Sjkim slt AT,t_2,zero 2001289848Sjkim daddu c_2,AT 2002289848Sjkim dsll t_2,1 2003289848Sjkim slt a2,t_1,zero 2004289848Sjkim daddu t_2,a2 2005289848Sjkim dsll t_1,1 2006289848Sjkim daddu c_3,t_1 2007289848Sjkim sltu AT,c_3,t_1 2008289848Sjkim daddu t_2,AT 2009289848Sjkim daddu c_1,t_2 2010289848Sjkim sltu AT,c_1,t_2 2011289848Sjkim daddu c_2,AT 2012289848Sjkim sd c_3,88(a0) 2013289848Sjkim 2014289848Sjkim dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */ 2015289848Sjkim mflo t_1 2016289848Sjkim mfhi t_2 2017289848Sjkim slt c_3,t_2,zero 2018289848Sjkim dsll t_2,1 2019289848Sjkim slt a2,t_1,zero 2020289848Sjkim daddu t_2,a2 2021289848Sjkim dsll t_1,1 2022289848Sjkim daddu c_1,t_1 2023289848Sjkim sltu AT,c_1,t_1 2024289848Sjkim daddu t_2,AT 2025289848Sjkim daddu c_2,t_2 2026289848Sjkim sltu AT,c_2,t_2 2027289848Sjkim daddu c_3,AT 2028289848Sjkim dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */ 2029289848Sjkim mflo t_1 2030289848Sjkim mfhi t_2 2031289848Sjkim daddu c_1,t_1 2032289848Sjkim sltu AT,c_1,t_1 2033289848Sjkim daddu t_2,AT 2034289848Sjkim daddu c_2,t_2 2035289848Sjkim sltu AT,c_2,t_2 2036289848Sjkim daddu c_3,AT 2037289848Sjkim sd c_1,96(a0) 2038289848Sjkim 2039289848Sjkim dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */ 2040289848Sjkim mflo t_1 2041289848Sjkim mfhi t_2 2042289848Sjkim slt c_1,t_2,zero 2043289848Sjkim dsll t_2,1 2044289848Sjkim slt a2,t_1,zero 2045289848Sjkim daddu t_2,a2 2046289848Sjkim dsll t_1,1 2047289848Sjkim daddu c_2,t_1 2048289848Sjkim sltu AT,c_2,t_1 2049289848Sjkim daddu t_2,AT 2050289848Sjkim daddu c_3,t_2 2051289848Sjkim sltu AT,c_3,t_2 2052289848Sjkim daddu c_1,AT 2053289848Sjkim sd c_2,104(a0) 2054289848Sjkim 2055289848Sjkim dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */ 2056289848Sjkim mflo t_1 2057289848Sjkim mfhi t_2 2058289848Sjkim daddu c_3,t_1 2059289848Sjkim sltu AT,c_3,t_1 2060289848Sjkim daddu t_2,AT 2061289848Sjkim daddu c_1,t_2 2062289848Sjkim sd c_3,112(a0) 2063289848Sjkim sd c_1,120(a0) 2064289848Sjkim 2065289848Sjkim jr ra 2066289848SjkimEND(bn_sqr_comba8) 2067289848Sjkim 2068289848Sjkim.align 5 2069289848SjkimLEAF(bn_sqr_comba4) 2070289848Sjkim .set reorder 2071289848Sjkim ld a_0,0(a1) 2072289848Sjkim ld a_1,8(a1) 2073289848Sjkim ld a_2,16(a1) 2074289848Sjkim ld a_3,24(a1) 2075289848Sjkim dmultu a_0,a_0 /* mul_add_c(a[0],b[0],c1,c2,c3); */ 2076289848Sjkim mflo c_1 2077289848Sjkim mfhi c_2 2078289848Sjkim sd c_1,0(a0) 2079289848Sjkim 2080289848Sjkim dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */ 2081289848Sjkim mflo t_1 2082289848Sjkim mfhi t_2 2083289848Sjkim slt c_1,t_2,zero 2084289848Sjkim dsll t_2,1 2085289848Sjkim slt a2,t_1,zero 2086289848Sjkim daddu t_2,a2 2087289848Sjkim dsll t_1,1 2088289848Sjkim daddu c_2,t_1 2089289848Sjkim sltu AT,c_2,t_1 2090289848Sjkim daddu c_3,t_2,AT 2091289848Sjkim sd c_2,8(a0) 2092289848Sjkim 2093289848Sjkim dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */ 2094289848Sjkim mflo t_1 2095289848Sjkim mfhi t_2 2096289848Sjkim slt c_2,t_2,zero 2097289848Sjkim dsll t_2,1 2098289848Sjkim slt a2,t_1,zero 2099289848Sjkim daddu t_2,a2 2100289848Sjkim dsll t_1,1 2101289848Sjkim daddu c_3,t_1 2102289848Sjkim sltu AT,c_3,t_1 2103289848Sjkim daddu t_2,AT 2104289848Sjkim daddu c_1,t_2 2105289848Sjkim sltu AT,c_1,t_2 2106289848Sjkim daddu c_2,AT 2107289848Sjkim dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 2108289848Sjkim mflo t_1 2109289848Sjkim mfhi t_2 2110289848Sjkim daddu c_3,t_1 2111289848Sjkim sltu AT,c_3,t_1 2112289848Sjkim daddu t_2,AT 2113289848Sjkim daddu c_1,t_2 2114289848Sjkim sltu AT,c_1,t_2 2115289848Sjkim daddu c_2,AT 2116289848Sjkim sd c_3,16(a0) 2117289848Sjkim 2118289848Sjkim dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */ 2119289848Sjkim mflo t_1 2120289848Sjkim mfhi t_2 2121289848Sjkim slt c_3,t_2,zero 2122289848Sjkim dsll t_2,1 2123289848Sjkim slt a2,t_1,zero 2124289848Sjkim daddu t_2,a2 2125289848Sjkim dsll t_1,1 2126289848Sjkim daddu c_1,t_1 2127289848Sjkim sltu AT,c_1,t_1 2128289848Sjkim daddu t_2,AT 2129289848Sjkim daddu c_2,t_2 2130289848Sjkim sltu AT,c_2,t_2 2131289848Sjkim daddu c_3,AT 2132289848Sjkim dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */ 2133289848Sjkim mflo t_1 2134289848Sjkim mfhi t_2 2135289848Sjkim slt AT,t_2,zero 2136289848Sjkim daddu c_3,AT 2137289848Sjkim dsll t_2,1 2138289848Sjkim slt a2,t_1,zero 2139289848Sjkim daddu t_2,a2 2140289848Sjkim dsll t_1,1 2141289848Sjkim daddu c_1,t_1 2142289848Sjkim sltu AT,c_1,t_1 2143289848Sjkim daddu t_2,AT 2144289848Sjkim daddu c_2,t_2 2145289848Sjkim sltu AT,c_2,t_2 2146289848Sjkim daddu c_3,AT 2147289848Sjkim sd c_1,24(a0) 2148289848Sjkim 2149289848Sjkim dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */ 2150289848Sjkim mflo t_1 2151289848Sjkim mfhi t_2 2152289848Sjkim slt c_1,t_2,zero 2153289848Sjkim dsll t_2,1 2154289848Sjkim slt a2,t_1,zero 2155289848Sjkim daddu t_2,a2 2156289848Sjkim dsll t_1,1 2157289848Sjkim daddu c_2,t_1 2158289848Sjkim sltu AT,c_2,t_1 2159289848Sjkim daddu t_2,AT 2160289848Sjkim daddu c_3,t_2 2161289848Sjkim sltu AT,c_3,t_2 2162289848Sjkim daddu c_1,AT 2163289848Sjkim dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 2164289848Sjkim mflo t_1 2165289848Sjkim mfhi t_2 2166289848Sjkim daddu c_2,t_1 2167289848Sjkim sltu AT,c_2,t_1 2168289848Sjkim daddu t_2,AT 2169289848Sjkim daddu c_3,t_2 2170289848Sjkim sltu AT,c_3,t_2 2171289848Sjkim daddu c_1,AT 2172289848Sjkim sd c_2,32(a0) 2173289848Sjkim 2174289848Sjkim dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */ 2175289848Sjkim mflo t_1 2176289848Sjkim mfhi t_2 2177289848Sjkim slt c_2,t_2,zero 2178289848Sjkim dsll t_2,1 2179289848Sjkim slt a2,t_1,zero 2180289848Sjkim daddu t_2,a2 2181289848Sjkim dsll t_1,1 2182289848Sjkim daddu c_3,t_1 2183289848Sjkim sltu AT,c_3,t_1 2184289848Sjkim daddu t_2,AT 2185289848Sjkim daddu c_1,t_2 2186289848Sjkim sltu AT,c_1,t_2 2187289848Sjkim daddu c_2,AT 2188289848Sjkim sd c_3,40(a0) 2189289848Sjkim 2190289848Sjkim dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 2191289848Sjkim mflo t_1 2192289848Sjkim mfhi t_2 2193289848Sjkim daddu c_1,t_1 2194289848Sjkim sltu AT,c_1,t_1 2195289848Sjkim daddu t_2,AT 2196289848Sjkim daddu c_2,t_2 2197289848Sjkim sd c_1,48(a0) 2198289848Sjkim sd c_2,56(a0) 2199289848Sjkim 2200289848Sjkim jr ra 2201289848SjkimEND(bn_sqr_comba4) 2202