]>
Commit | Line | Data |
---|---|---|
7def3d92 RM |
1 | # Alpha 21064 __mpn_submul_1 -- Multiply a limb vector with a limb and |
2 | # subtract the result from a second limb vector. | |
3 | ||
b168057a | 4 | # Copyright (C) 1992-2015 Free Software Foundation, Inc. |
7def3d92 RM |
5 | |
6 | # This file is part of the GNU MP Library. | |
7 | ||
8 | # The GNU MP Library is free software; you can redistribute it and/or modify | |
f01ec467 AJ |
9 | # it under the terms of the GNU Lesser General Public License as published by |
10 | # the Free Software Foundation; either version 2.1 of the License, or (at your | |
7def3d92 RM |
11 | # option) any later version. |
12 | ||
13 | # The GNU MP Library is distributed in the hope that it will be useful, but | |
14 | # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
f01ec467 | 15 | # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
7def3d92 RM |
16 | # License for more details. |
17 | ||
f01ec467 | 18 | # You should have received a copy of the GNU Lesser General Public License |
ab84e3ff | 19 | # along with the GNU MP Library. If not, see <http://www.gnu.org/licenses/>. |
7def3d92 RM |
20 | |
21 | ||
22 | # INPUT PARAMETERS | |
23 | # res_ptr r16 | |
24 | # s1_ptr r17 | |
25 | # size r18 | |
26 | # s2_limb r19 | |
27 | ||
3de9f02e | 28 | # This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5. |
7def3d92 RM |
29 | |
30 | .set noreorder | |
31 | .set noat | |
32 | .text | |
33 | .align 3 | |
34 | .globl __mpn_submul_1 | |
35 | .ent __mpn_submul_1 2 | |
36 | __mpn_submul_1: | |
37 | .frame $30,0,$26 | |
38 | ||
39 | ldq $2,0($17) # $2 = s1_limb | |
40 | addq $17,8,$17 # s1_ptr++ | |
41 | subq $18,1,$18 # size-- | |
42 | mulq $2,$19,$3 # $3 = prod_low | |
43 | ldq $5,0($16) # $5 = *res_ptr | |
44 | umulh $2,$19,$0 # $0 = prod_high | |
3de9f02e | 45 | beq $18,.Lend1 # jump if size was == 1 |
7def3d92 RM |
46 | ldq $2,0($17) # $2 = s1_limb |
47 | addq $17,8,$17 # s1_ptr++ | |
48 | subq $18,1,$18 # size-- | |
49 | subq $5,$3,$3 | |
50 | cmpult $5,$3,$4 | |
51 | stq $3,0($16) | |
52 | addq $16,8,$16 # res_ptr++ | |
3de9f02e | 53 | beq $18,.Lend2 # jump if size was == 2 |
7def3d92 RM |
54 | |
55 | .align 3 | |
3de9f02e | 56 | .Loop: mulq $2,$19,$3 # $3 = prod_low |
7def3d92 RM |
57 | ldq $5,0($16) # $5 = *res_ptr |
58 | addq $4,$0,$0 # cy_limb = cy_limb + 'cy' | |
59 | subq $18,1,$18 # size-- | |
60 | umulh $2,$19,$4 # $4 = cy_limb | |
61 | ldq $2,0($17) # $2 = s1_limb | |
62 | addq $17,8,$17 # s1_ptr++ | |
63 | addq $3,$0,$3 # $3 = cy_limb + prod_low | |
64 | cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low) | |
65 | subq $5,$3,$3 | |
66 | cmpult $5,$3,$5 | |
67 | stq $3,0($16) | |
68 | addq $16,8,$16 # res_ptr++ | |
69 | addq $5,$0,$0 # combine carries | |
3de9f02e | 70 | bne $18,.Loop |
7def3d92 | 71 | |
3de9f02e | 72 | .Lend2: mulq $2,$19,$3 # $3 = prod_low |
7def3d92 RM |
73 | ldq $5,0($16) # $5 = *res_ptr |
74 | addq $4,$0,$0 # cy_limb = cy_limb + 'cy' | |
75 | umulh $2,$19,$4 # $4 = cy_limb | |
76 | addq $3,$0,$3 # $3 = cy_limb + prod_low | |
77 | cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low) | |
78 | subq $5,$3,$3 | |
79 | cmpult $5,$3,$5 | |
80 | stq $3,0($16) | |
81 | addq $5,$0,$0 # combine carries | |
82 | addq $4,$0,$0 # cy_limb = prod_high + cy | |
83 | ret $31,($26),1 | |
3de9f02e | 84 | .Lend1: subq $5,$3,$3 |
7def3d92 RM |
85 | cmpult $5,$3,$5 |
86 | stq $3,0($16) | |
87 | addq $0,$5,$0 | |
88 | ret $31,($26),1 | |
89 | ||
90 | .end __mpn_submul_1 |