Home | History | Annotate | Line # | Download | only in m88k
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