diff options
| -rw-r--r-- | libc/sysdeps/linux/hppa/Makefile.arch | 3 | ||||
| -rw-r--r-- | libc/sysdeps/linux/hppa/add_n.S | 58 | ||||
| -rw-r--r-- | libc/sysdeps/linux/hppa/lshift.S | 66 | ||||
| -rw-r--r-- | libc/sysdeps/linux/hppa/rshift.S | 63 | ||||
| -rw-r--r-- | libc/sysdeps/linux/hppa/sub_n.S | 59 | ||||
| -rw-r--r-- | libc/sysdeps/linux/hppa/udiv_qrnnd.S | 286 | 
6 files changed, 534 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/hppa/Makefile.arch b/libc/sysdeps/linux/hppa/Makefile.arch index 26aeb7f8c..3509f6900 100644 --- a/libc/sysdeps/linux/hppa/Makefile.arch +++ b/libc/sysdeps/linux/hppa/Makefile.arch @@ -7,6 +7,7 @@  CSRC := __syscall_error.c brk.c mmap.c syscall.c -SSRC := __longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S setjmp.S +SSRC := __longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S setjmp.S \ +	add_n.S lshift.S rshift.S sub_n.S udiv_qrnnd.S  include $(top_srcdir)libc/sysdeps/linux/Makefile.arch diff --git a/libc/sysdeps/linux/hppa/add_n.S b/libc/sysdeps/linux/hppa/add_n.S new file mode 100644 index 000000000..a396b3471 --- /dev/null +++ b/libc/sysdeps/linux/hppa/add_n.S @@ -0,0 +1,58 @@ +;! HP-PA  __mpn_add_n -- Add two limb vectors of the same length > 0 and store +;! sum in a third limb vector. + +;! Copyright (C) 1992, 1994 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; see the file COPYING.LIB.  If not, write to +;! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;! MA 02111-1307, USA. + + +;! INPUT PARAMETERS +;! res_ptr	gr26 +;! s1_ptr	gr25 +;! s2_ptr	gr24 +;! size		gr23 + +;! One might want to unroll this as for other processors, but it turns +;! out that the data cache contention after a store makes such +;! unrolling useless.  We can't come under 5 cycles/limb anyway. + +	.text +	.export		__mpn_add_n +__mpn_add_n: +	.proc +	.callinfo	frame=0,no_calls +	.entry + +	ldws,ma		4(%r25),%r21 +	ldws,ma		4(%r24),%r20 + +	addib,=		-1,%r23,L$end	;! check for (SIZE == 1) +	 add		%r21,%r20,%r28	;! add first limbs ignoring cy + +L$loop:	ldws,ma		4(%r25),%r21 +	ldws,ma		4(%r24),%r20 +	stws,ma		%r28,4(%r26) +	addib,<>	-1,%r23,L$loop +	 addc		%r21,%r20,%r28 + +L$end:	stws		%r28,0(%r26) +	bv		0(%r2) +	 addc		%r0,%r0,%r28 + +	.exit +	.procend diff --git a/libc/sysdeps/linux/hppa/lshift.S b/libc/sysdeps/linux/hppa/lshift.S new file mode 100644 index 000000000..151b283e5 --- /dev/null +++ b/libc/sysdeps/linux/hppa/lshift.S @@ -0,0 +1,66 @@ +;! HP-PA  __mpn_lshift -- + +;! Copyright (C) 1992, 1994 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; see the file COPYING.LIB.  If not, write to +;! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;! MA 02111-1307, USA. + + +;! INPUT PARAMETERS +;! res_ptr	gr26 +;! s_ptr	gr25 +;! size		gr24 +;! cnt		gr23 + +	.text +	.export		__mpn_lshift +__mpn_lshift: +	.proc +	.callinfo	frame=64,no_calls +	.entry + +	sh2add		%r24,%r25,%r25 +	sh2add		%r24,%r26,%r26 +	ldws,mb		-4(%r25),%r22 +	subi		32,%r23,%r1 +	mtsar		%r1 +	addib,=		-1,%r24,L$0004 +	vshd		%r0,%r22,%r28		;! compute carry out limb +	ldws,mb		-4(%r25),%r29 +	addib,=		-1,%r24,L$0002 +	vshd		%r22,%r29,%r20 + +L$loop:	ldws,mb		-4(%r25),%r22 +	stws,mb		%r20,-4(%r26) +	addib,=		-1,%r24,L$0003 +	vshd		%r29,%r22,%r20 +	ldws,mb		-4(%r25),%r29 +	stws,mb		%r20,-4(%r26) +	addib,<>	-1,%r24,L$loop +	vshd		%r22,%r29,%r20 + +L$0002:	stws,mb		%r20,-4(%r26) +	vshd		%r29,%r0,%r20 +	bv		0(%r2) +	stw		%r20,-4(%r26) +L$0003:	stws,mb		%r20,-4(%r26) +L$0004:	vshd		%r22,%r0,%r20 +	bv		0(%r2) +	stw		%r20,-4(%r26) + +	.exit +	.procend diff --git a/libc/sysdeps/linux/hppa/rshift.S b/libc/sysdeps/linux/hppa/rshift.S new file mode 100644 index 000000000..dff189dc4 --- /dev/null +++ b/libc/sysdeps/linux/hppa/rshift.S @@ -0,0 +1,63 @@ +;! HP-PA  __mpn_rshift --  + +;! Copyright (C) 1992, 1994 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; see the file COPYING.LIB.  If not, write to +;! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;! MA 02111-1307, USA. + + +;! INPUT PARAMETERS +;! res_ptr	gr26 +;! s_ptr	gr25 +;! size		gr24 +;! cnt		gr23 + +	.text +	.export		__mpn_rshift +__mpn_rshift: +	.proc +	.callinfo	frame=64,no_calls +	.entry + +	ldws,ma		4(%r25),%r22 +	mtsar		%r23 +	addib,=		-1,%r24,L$0004 +	vshd		%r22,%r0,%r28		;! compute carry out limb +	ldws,ma		4(%r25),%r29 +	addib,=		-1,%r24,L$0002 +	vshd		%r29,%r22,%r20 + +L$loop:	ldws,ma		4(%r25),%r22 +	stws,ma		%r20,4(%r26) +	addib,=		-1,%r24,L$0003 +	vshd		%r22,%r29,%r20 +	ldws,ma		4(%r25),%r29 +	stws,ma		%r20,4(%r26) +	addib,<>	-1,%r24,L$loop +	vshd		%r29,%r22,%r20 + +L$0002:	stws,ma		%r20,4(%r26) +	vshd		%r0,%r29,%r20 +	bv		0(%r2) +	stw		%r20,0(%r26) +L$0003:	stws,ma		%r20,4(%r26) +L$0004:	vshd		%r0,%r22,%r20 +	bv		0(%r2) +	stw		%r20,0(%r26) + +	.exit +	.procend diff --git a/libc/sysdeps/linux/hppa/sub_n.S b/libc/sysdeps/linux/hppa/sub_n.S new file mode 100644 index 000000000..7764961a2 --- /dev/null +++ b/libc/sysdeps/linux/hppa/sub_n.S @@ -0,0 +1,59 @@ +;! HP-PA  __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and +;! store difference in a third limb vector. + +;! Copyright (C) 1992, 1994 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; see the file COPYING.LIB.  If not, write to +;! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;! MA 02111-1307, USA. + + +;! INPUT PARAMETERS +;! res_ptr	gr26 +;! s1_ptr	gr25 +;! s2_ptr	gr24 +;! size		gr23 + +;! One might want to unroll this as for other processors, but it turns +;! out that the data cache contention after a store makes such +;! unrolling useless.  We can't come under 5 cycles/limb anyway. + +	.text +	.export		__mpn_sub_n +__mpn_sub_n: +	.proc +	.callinfo	frame=0,no_calls +	.entry + +	ldws,ma		4(%r25),%r21 +	ldws,ma		4(%r24),%r20 + +	addib,=		-1,%r23,L$end	;! check for (SIZE == 1) +	 sub		%r21,%r20,%r28	;! subtract first limbs ignoring cy + +L$loop:	ldws,ma		4(%r25),%r21 +	ldws,ma		4(%r24),%r20 +	stws,ma		%r28,4(%r26) +	addib,<>	-1,%r23,L$loop +	 subb		%r21,%r20,%r28 + +L$end:	stws		%r28,0(%r26) +	addc		%r0,%r0,%r28 +	bv		0(%r2) +	 subi		1,%r28,%r28 + +	.exit +	.procend diff --git a/libc/sysdeps/linux/hppa/udiv_qrnnd.S b/libc/sysdeps/linux/hppa/udiv_qrnnd.S new file mode 100644 index 000000000..8e9c07a20 --- /dev/null +++ b/libc/sysdeps/linux/hppa/udiv_qrnnd.S @@ -0,0 +1,286 @@ +;! HP-PA  __udiv_qrnnd division support, used from longlong.h. +;! This version runs fast on pre-PA7000 CPUs. + +;! Copyright (C) 1993, 1994 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; see the file COPYING.LIB.  If not, write to +;! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;! MA 02111-1307, USA. + + +;! INPUT PARAMETERS +;! rem_ptr	gr26 +;! n1		gr25 +;! n0		gr24 +;! d		gr23 + +;! The code size is a bit excessive.  We could merge the last two ds;addc +;! sequences by simply moving the "bb,< Odd" instruction down.  The only +;! trouble is the FFFFFFFF code that would need some hacking. + +	.text +	.export		__udiv_qrnnd +__udiv_qrnnd: +	.proc +	.callinfo	frame=0,no_calls +	.entry + +	comb,<		%r23,%r0,L$largedivisor +	 sub		%r0,%r23,%r1		;! clear cy as side-effect +	ds		%r0,%r1,%r0 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r23,%r25 +	addc		%r24,%r24,%r28 +	ds		%r25,%r23,%r25 +	comclr,>=	%r25,%r0,%r0 +	addl		%r25,%r23,%r25 +	stws		%r25,0(%r26) +	bv		0(%r2) +	 addc		%r28,%r28,%r28 + +L$largedivisor: +	extru		%r24,31,1,%r20		;! r20 = n0 & 1 +	bb,<		%r23,31,L$odd +	 extru		%r23,30,31,%r22		;! r22 = d >> 1 +	shd		%r25,%r24,1,%r24	;! r24 = new n0 +	extru		%r25,30,31,%r25		;! r25 = new n1 +	sub		%r0,%r22,%r21 +	ds		%r0,%r21,%r0 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	comclr,>=	%r25,%r0,%r0 +	addl		%r25,%r22,%r25 +	sh1addl		%r25,%r20,%r25 +	stws		%r25,0(%r26) +	bv		0(%r2) +	 addc		%r24,%r24,%r28 + +L$odd:	addib,sv,n	1,%r22,L$FF..		;! r22 = (d / 2 + 1) +	shd		%r25,%r24,1,%r24	;! r24 = new n0 +	extru		%r25,30,31,%r25		;! r25 = new n1 +	sub		%r0,%r22,%r21 +	ds		%r0,%r21,%r0 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r24 +	ds		%r25,%r22,%r25 +	addc		%r24,%r24,%r28 +	comclr,>=	%r25,%r0,%r0 +	addl		%r25,%r22,%r25 +	sh1addl		%r25,%r20,%r25 +;! We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25 +	add,nuv		%r28,%r25,%r25 +	addl		%r25,%r1,%r25 +	addc		%r0,%r28,%r28 +	sub,<<		%r25,%r23,%r0 +	addl		%r25,%r1,%r25 +	stws		%r25,0(%r26) +	bv		0(%r2) +	 addc		%r0,%r28,%r28 + +;! This is just a special case of the code above. +;! We come here when d == 0xFFFFFFFF +L$FF..:	add,uv		%r25,%r24,%r24 +	sub,<<		%r24,%r23,%r0 +	ldo		1(%r24),%r24 +	stws		%r24,0(%r26) +	bv		0(%r2) +	 addc		%r0,%r25,%r28 + +	.exit +	.procend  | 
