alpha: move __udiv_qrnnd library function to arch/alpha/lib/
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Sep 2021 21:45:48 +0000 (14:45 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Sep 2021 21:45:48 +0000 (14:45 -0700)
We already had the implementation for __udiv_qrnnd (unsigned divide for
multi-precision arithmetic) as part of the alpha math emulation code.

But you can disable the math emulation code - even if you shouldn't -
and then the MPI code that actually wants this functionality (and is
needed by various crypto functions) will fail to build.

So move the extended-precision divide code to be a regular library
function, just like all the regular division code is.  That way ie is
available regardless of math-emulation.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/alpha/include/asm/asm-prototypes.h
arch/alpha/lib/Makefile
arch/alpha/lib/udiv-qrnnd.S [new file with mode: 0644]
arch/alpha/math-emu/Makefile
arch/alpha/math-emu/math.c
arch/alpha/math-emu/qrnnd.S [deleted file]

index b34cc1f..c8ae46f 100644 (file)
@@ -16,3 +16,4 @@ extern void __divlu(void);
 extern void __remlu(void);
 extern void __divqu(void);
 extern void __remqu(void);
+extern unsigned long __udiv_qrnnd(unsigned long *, unsigned long, unsigned long , unsigned long);
index 854d5e7..1cc74f7 100644 (file)
@@ -14,6 +14,7 @@ ev6-$(CONFIG_ALPHA_EV6) := ev6-
 ev67-$(CONFIG_ALPHA_EV67) := ev67-
 
 lib-y =        __divqu.o __remqu.o __divlu.o __remlu.o \
+       udiv-qrnnd.o \
        udelay.o \
        $(ev6-y)memset.o \
        $(ev6-y)memcpy.o \
diff --git a/arch/alpha/lib/udiv-qrnnd.S b/arch/alpha/lib/udiv-qrnnd.S
new file mode 100644 (file)
index 0000000..b887aa5
--- /dev/null
@@ -0,0 +1,165 @@
+ # Alpha 21064 __udiv_qrnnd
+ # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
+
+ # This file is part of GCC.
+
+ # The GNU MP Library is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or (at your
+ # option) any later version.
+
+ # In addition to the permissions in the GNU General Public License, the
+ # Free Software Foundation gives you unlimited permission to link the
+ # compiled version of this file with other programs, and to distribute
+ # those programs without any restriction coming from the use of this
+ # file.  (The General Public License restrictions do apply in other
+ # respects; for example, they cover modification of the file, and
+ # distribution when not linked into another program.)
+
+ # This file 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 Library General Public
+ # License for more details.
+
+ # You should have received a copy of the GNU General Public License
+ # along with GCC; see the file COPYING.  If not, write to the 
+ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ # MA 02111-1307, USA.
+#include <asm/export.h>
+
+        .set noreorder
+        .set noat
+
+       .text
+
+       .globl __udiv_qrnnd
+       .ent __udiv_qrnnd
+__udiv_qrnnd:
+       .frame $30,0,$26,0
+       .prologue 0
+
+#define cnt    $2
+#define tmp    $3
+#define rem_ptr        $16
+#define n1     $17
+#define n0     $18
+#define d      $19
+#define qb     $20
+#define AT     $at
+
+       ldiq    cnt,16
+       blt     d,$largedivisor
+
+$loop1:        cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       subq    cnt,1,cnt
+       bgt     cnt,$loop1
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+$largedivisor:
+       and     n0,1,$4
+
+       srl     n0,1,n0
+       sll     n1,63,tmp
+       or      tmp,n0,n0
+       srl     n1,1,n1
+
+       and     d,1,$6
+       srl     d,1,$5
+       addq    $5,$6,$5
+
+$loop2:        cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       subq    cnt,1,cnt
+       bgt     cnt,$loop2
+
+       addq    n1,n1,n1
+       addq    $4,n1,n1
+       bne     $6,$Odd
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+$Odd:
+       /* q' in n0. r' in n1 */
+       addq    n1,n0,n1
+
+       cmpult  n1,n0,tmp       # tmp := carry from addq
+       subq    n1,d,AT
+       addq    n0,tmp,n0
+       cmovne  tmp,AT,n1
+
+       cmpult  n1,d,tmp
+       addq    n0,1,AT
+       cmoveq  tmp,AT,n0
+       subq    n1,d,AT
+       cmoveq  tmp,AT,n1
+
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+       .end    __udiv_qrnnd
+EXPORT_SYMBOL(__udiv_qrnnd)
index 6eda097..3206402 100644 (file)
@@ -7,4 +7,4 @@ ccflags-y := -w
 
 obj-$(CONFIG_MATHEMU) += math-emu.o
 
-math-emu-objs := math.o qrnnd.o
+math-emu-objs := math.o
index f7cef66..4212258 100644 (file)
@@ -403,5 +403,3 @@ alpha_fp_emul_imprecise (struct pt_regs *regs, unsigned long write_mask)
 egress:
        return si_code;
 }
-
-EXPORT_SYMBOL(__udiv_qrnnd);
diff --git a/arch/alpha/math-emu/qrnnd.S b/arch/alpha/math-emu/qrnnd.S
deleted file mode 100644 (file)
index d6373ec..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
- # Alpha 21064 __udiv_qrnnd
- # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
-
- # This file is part of GCC.
-
- # The GNU MP Library is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or (at your
- # option) any later version.
-
- # In addition to the permissions in the GNU General Public License, the
- # Free Software Foundation gives you unlimited permission to link the
- # compiled version of this file with other programs, and to distribute
- # those programs without any restriction coming from the use of this
- # file.  (The General Public License restrictions do apply in other
- # respects; for example, they cover modification of the file, and
- # distribution when not linked into another program.)
-
- # This file 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 Library General Public
- # License for more details.
-
- # You should have received a copy of the GNU General Public License
- # along with GCC; see the file COPYING.  If not, write to the 
- # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- # MA 02111-1307, USA.
-
-        .set noreorder
-        .set noat
-
-       .text
-
-       .globl __udiv_qrnnd
-       .ent __udiv_qrnnd
-__udiv_qrnnd:
-       .frame $30,0,$26,0
-       .prologue 0
-
-#define cnt    $2
-#define tmp    $3
-#define rem_ptr        $16
-#define n1     $17
-#define n0     $18
-#define d      $19
-#define qb     $20
-#define AT     $at
-
-       ldiq    cnt,16
-       blt     d,$largedivisor
-
-$loop1:        cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  d,n1,qb
-       subq    n1,d,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  d,n1,qb
-       subq    n1,d,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  d,n1,qb
-       subq    n1,d,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  d,n1,qb
-       subq    n1,d,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       subq    cnt,1,cnt
-       bgt     cnt,$loop1
-       stq     n1,0(rem_ptr)
-       bis     $31,n0,$0
-       ret     $31,($26),1
-
-$largedivisor:
-       and     n0,1,$4
-
-       srl     n0,1,n0
-       sll     n1,63,tmp
-       or      tmp,n0,n0
-       srl     n1,1,n1
-
-       and     d,1,$6
-       srl     d,1,$5
-       addq    $5,$6,$5
-
-$loop2:        cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  $5,n1,qb
-       subq    n1,$5,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  $5,n1,qb
-       subq    n1,$5,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  $5,n1,qb
-       subq    n1,$5,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       cmplt   n0,0,tmp
-       addq    n1,n1,n1
-       bis     n1,tmp,n1
-       addq    n0,n0,n0
-       cmpule  $5,n1,qb
-       subq    n1,$5,tmp
-       cmovne  qb,tmp,n1
-       bis     n0,qb,n0
-       subq    cnt,1,cnt
-       bgt     cnt,$loop2
-
-       addq    n1,n1,n1
-       addq    $4,n1,n1
-       bne     $6,$Odd
-       stq     n1,0(rem_ptr)
-       bis     $31,n0,$0
-       ret     $31,($26),1
-
-$Odd:
-       /* q' in n0. r' in n1 */
-       addq    n1,n0,n1
-
-       cmpult  n1,n0,tmp       # tmp := carry from addq
-       subq    n1,d,AT
-       addq    n0,tmp,n0
-       cmovne  tmp,AT,n1
-
-       cmpult  n1,d,tmp
-       addq    n0,1,AT
-       cmoveq  tmp,AT,n0
-       subq    n1,d,AT
-       cmoveq  tmp,AT,n1
-
-       stq     n1,0(rem_ptr)
-       bis     $31,n0,$0
-       ret     $31,($26),1
-
-       .end    __udiv_qrnnd