diff options
Diffstat (limited to 'REORG.TODO/sysdeps/mips/addmul_1.S')
-rw-r--r-- | REORG.TODO/sysdeps/mips/addmul_1.S | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/mips/addmul_1.S b/REORG.TODO/sysdeps/mips/addmul_1.S new file mode 100644 index 0000000000..7a664934b2 --- /dev/null +++ b/REORG.TODO/sysdeps/mips/addmul_1.S @@ -0,0 +1,128 @@ +/* MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and +add the product to a second limb vector. + +Copyright (C) 1995-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* INPUT PARAMETERS + res_ptr $4 + s1_ptr $5 + size $6 + s2_limb $7 +*/ +#ifdef __PIC__ + .option pic2 +#endif +ENTRY (__mpn_addmul_1) + .set noreorder +#ifdef __PIC__ + .cpload t9 +#endif + .set nomacro + + /* warm up phase 0 */ + lw $8,0($5) + + /* warm up phase 1 */ + addiu $5,$5,4 +#if __mips_isa_rev < 6 + multu $8,$7 +#else + mulu $11,$8,$7 + muhu $12,$8,$7 +#endif + + addiu $6,$6,-1 + beq $6,$0,L(LC0) + move $2,$0 /* zero cy2 */ + + addiu $6,$6,-1 + beq $6,$0,L(LC1) + lw $8,0($5) /* load new s1 limb as early as possible */ + +L(Loop): lw $10,0($4) +#if __mips_isa_rev < 6 + mflo $3 + mfhi $9 +#else + move $3,$11 + move $9,$12 +#endif + addiu $5,$5,4 + addu $3,$3,$2 /* add old carry limb to low product limb */ +#if __mips_isa_rev < 6 + multu $8,$7 +#else + mulu $11,$8,$7 + muhu $12,$8,$7 +#endif + lw $8,0($5) /* load new s1 limb as early as possible */ + addiu $6,$6,-1 /* decrement loop counter */ + sltu $2,$3,$2 /* carry from previous addition -> $2 */ + addu $3,$10,$3 + sltu $10,$3,$10 + addu $2,$2,$10 + sw $3,0($4) + addiu $4,$4,4 + bne $6,$0,L(Loop) /* should be "bnel" */ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 1 */ +L(LC1): lw $10,0($4) +#if __mips_isa_rev < 6 + mflo $3 + mfhi $9 +#else + move $3,$11 + move $9,$12 +#endif + addu $3,$3,$2 + sltu $2,$3,$2 +#if __mips_isa_rev < 6 + multu $8,$7 +#else + mulu $11,$8,$7 + muhu $12,$8,$7 +#endif + addu $3,$10,$3 + sltu $10,$3,$10 + addu $2,$2,$10 + sw $3,0($4) + addiu $4,$4,4 + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 0 */ +L(LC0): lw $10,0($4) +#if __mips_isa_rev < 6 + mflo $3 + mfhi $9 +#else + move $3,$11 + move $9,$12 +#endif + addu $3,$3,$2 + sltu $2,$3,$2 + addu $3,$10,$3 + sltu $10,$3,$10 + addu $2,$2,$10 + sw $3,0($4) + j $31 + addu $2,$9,$2 /* add high product limb and carry from addition */ + END (__mpn_addmul_1) |