sub_n.s revision 1.1 1 1.1 mrg ; mc88100 mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
2 1.1 mrg ; store difference in a third limb vector.
3 1.1 mrg
4 1.1 mrg ; Copyright 1992, 1994, 1996, 2000 Free Software Foundation, Inc.
5 1.1 mrg
6 1.1 mrg ; This file is part of the GNU MP Library.
7 1.1 mrg
8 1.1 mrg ; The GNU MP Library is free software; you can redistribute it and/or modify
9 1.1 mrg ; it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg ; the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg ; option) any later version.
12 1.1 mrg
13 1.1 mrg ; The GNU MP Library is distributed in the hope that it will be useful, but
14 1.1 mrg ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg ; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg ; License for more details.
17 1.1 mrg
18 1.1 mrg ; You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg ; along with the GNU MP Library. If not, see http://www.gnu.org/licenses/.
20 1.1 mrg
21 1.1 mrg
22 1.1 mrg ; INPUT PARAMETERS
23 1.1 mrg ; res_ptr r2
24 1.1 mrg ; s1_ptr r3
25 1.1 mrg ; s2_ptr r4
26 1.1 mrg ; size r5
27 1.1 mrg
28 1.1 mrg ; This code has been optimized to run one instruction per clock, avoiding
29 1.1 mrg ; load stalls and writeback contention. As a result, the instruction
30 1.1 mrg ; order is not always natural.
31 1.1 mrg
32 1.1 mrg ; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100,
33 1.1 mrg ; but on the 88110, it seems to run much slower, 6.6 clocks/limb.
34 1.1 mrg
35 1.1 mrg text
36 1.1 mrg align 16
37 1.1 mrg global ___gmpn_sub_n
38 1.1 mrg ___gmpn_sub_n:
39 1.1 mrg ld r6,r3,0 ; read first limb from s1_ptr
40 1.1 mrg extu r10,r5,3
41 1.1 mrg ld r7,r4,0 ; read first limb from s2_ptr
42 1.1 mrg
43 1.1 mrg subu r5,r0,r5
44 1.1 mrg mak r5,r5,3<4>
45 1.1 mrg bcnd.n eq0,r5,Lzero
46 1.1 mrg subu.co r0,r0,r0 ; initialize carry
47 1.1 mrg
48 1.1 mrg or r12,r0,lo16(Lbase)
49 1.1 mrg or.u r12,r12,hi16(Lbase)
50 1.1 mrg addu r12,r12,r5 ; r12 is address for entering in loop
51 1.1 mrg
52 1.1 mrg extu r5,r5,2 ; divide by 4
53 1.1 mrg subu r2,r2,r5 ; adjust res_ptr
54 1.1 mrg subu r3,r3,r5 ; adjust s1_ptr
55 1.1 mrg subu r4,r4,r5 ; adjust s2_ptr
56 1.1 mrg
57 1.1 mrg or r8,r6,r0
58 1.1 mrg
59 1.1 mrg jmp.n r12
60 1.1 mrg or r9,r7,r0
61 1.1 mrg
62 1.1 mrg Loop: addu r3,r3,32
63 1.1 mrg st r8,r2,28
64 1.1 mrg addu r4,r4,32
65 1.1 mrg ld r6,r3,0
66 1.1 mrg addu r2,r2,32
67 1.1 mrg ld r7,r4,0
68 1.1 mrg Lzero: subu r10,r10,1 ; subtract 0 + 8r limbs (adj loop cnt)
69 1.1 mrg Lbase: ld r8,r3,4
70 1.1 mrg subu.cio r6,r6,r7
71 1.1 mrg ld r9,r4,4
72 1.1 mrg st r6,r2,0
73 1.1 mrg ld r6,r3,8 ; subtract 7 + 8r limbs
74 1.1 mrg subu.cio r8,r8,r9
75 1.1 mrg ld r7,r4,8
76 1.1 mrg st r8,r2,4
77 1.1 mrg ld r8,r3,12 ; subtract 6 + 8r limbs
78 1.1 mrg subu.cio r6,r6,r7
79 1.1 mrg ld r9,r4,12
80 1.1 mrg st r6,r2,8
81 1.1 mrg ld r6,r3,16 ; subtract 5 + 8r limbs
82 1.1 mrg subu.cio r8,r8,r9
83 1.1 mrg ld r7,r4,16
84 1.1 mrg st r8,r2,12
85 1.1 mrg ld r8,r3,20 ; subtract 4 + 8r limbs
86 1.1 mrg subu.cio r6,r6,r7
87 1.1 mrg ld r9,r4,20
88 1.1 mrg st r6,r2,16
89 1.1 mrg ld r6,r3,24 ; subtract 3 + 8r limbs
90 1.1 mrg subu.cio r8,r8,r9
91 1.1 mrg ld r7,r4,24
92 1.1 mrg st r8,r2,20
93 1.1 mrg ld r8,r3,28 ; subtract 2 + 8r limbs
94 1.1 mrg subu.cio r6,r6,r7
95 1.1 mrg ld r9,r4,28
96 1.1 mrg st r6,r2,24
97 1.1 mrg bcnd.n ne0,r10,Loop ; subtract 1 + 8r limbs
98 1.1 mrg subu.cio r8,r8,r9
99 1.1 mrg
100 1.1 mrg st r8,r2,28 ; store most significant limb
101 1.1 mrg
102 1.1 mrg addu.ci r2,r0,r0 ; return carry-out from most sign. limb
103 1.1 mrg jmp.n r1
104 1.1 mrg xor r2,r2,1
105