123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /* MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and
- add the product to a second limb vector.
- Copyright (C) 1995-2019 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)
|