linux/arch/alpha/lib/udiv-qrnnd.S
<<
>>
Prefs
   1 # Alpha 21064 __udiv_qrnnd
   2 # Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc.
   3
   4 # This file is part of GCC.
   5
   6 # The GNU MP Library is free software; you can redistribute it and/or modify
   7 # it under the terms of the GNU General Public License as published by
   8 # the Free Software Foundation; either version 2 of the License, or (at your
   9 # option) any later version.
  10
  11 # In addition to the permissions in the GNU General Public License, the
  12 # Free Software Foundation gives you unlimited permission to link the
  13 # compiled version of this file with other programs, and to distribute
  14 # those programs without any restriction coming from the use of this
  15 # file.  (The General Public License restrictions do apply in other
  16 # respects; for example, they cover modification of the file, and
  17 # distribution when not linked into another program.)
  18
  19 # This file is distributed in the hope that it will be useful, but
  20 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  21 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  22 # License for more details.
  23
  24 # You should have received a copy of the GNU General Public License
  25 # along with GCC; see the file COPYING.  If not, write to the 
  26 # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  27 # MA 02111-1307, USA.
  28#include <asm/export.h>
  29
  30        .set noreorder
  31        .set noat
  32
  33        .text
  34
  35        .globl __udiv_qrnnd
  36        .ent __udiv_qrnnd
  37__udiv_qrnnd:
  38        .frame $30,0,$26,0
  39        .prologue 0
  40
  41#define cnt     $2
  42#define tmp     $3
  43#define rem_ptr $16
  44#define n1      $17
  45#define n0      $18
  46#define d       $19
  47#define qb      $20
  48#define AT      $at
  49
  50        ldiq    cnt,16
  51        blt     d,$largedivisor
  52
  53$loop1: cmplt   n0,0,tmp
  54        addq    n1,n1,n1
  55        bis     n1,tmp,n1
  56        addq    n0,n0,n0
  57        cmpule  d,n1,qb
  58        subq    n1,d,tmp
  59        cmovne  qb,tmp,n1
  60        bis     n0,qb,n0
  61        cmplt   n0,0,tmp
  62        addq    n1,n1,n1
  63        bis     n1,tmp,n1
  64        addq    n0,n0,n0
  65        cmpule  d,n1,qb
  66        subq    n1,d,tmp
  67        cmovne  qb,tmp,n1
  68        bis     n0,qb,n0
  69        cmplt   n0,0,tmp
  70        addq    n1,n1,n1
  71        bis     n1,tmp,n1
  72        addq    n0,n0,n0
  73        cmpule  d,n1,qb
  74        subq    n1,d,tmp
  75        cmovne  qb,tmp,n1
  76        bis     n0,qb,n0
  77        cmplt   n0,0,tmp
  78        addq    n1,n1,n1
  79        bis     n1,tmp,n1
  80        addq    n0,n0,n0
  81        cmpule  d,n1,qb
  82        subq    n1,d,tmp
  83        cmovne  qb,tmp,n1
  84        bis     n0,qb,n0
  85        subq    cnt,1,cnt
  86        bgt     cnt,$loop1
  87        stq     n1,0(rem_ptr)
  88        bis     $31,n0,$0
  89        ret     $31,($26),1
  90
  91$largedivisor:
  92        and     n0,1,$4
  93
  94        srl     n0,1,n0
  95        sll     n1,63,tmp
  96        or      tmp,n0,n0
  97        srl     n1,1,n1
  98
  99        and     d,1,$6
 100        srl     d,1,$5
 101        addq    $5,$6,$5
 102
 103$loop2: cmplt   n0,0,tmp
 104        addq    n1,n1,n1
 105        bis     n1,tmp,n1
 106        addq    n0,n0,n0
 107        cmpule  $5,n1,qb
 108        subq    n1,$5,tmp
 109        cmovne  qb,tmp,n1
 110        bis     n0,qb,n0
 111        cmplt   n0,0,tmp
 112        addq    n1,n1,n1
 113        bis     n1,tmp,n1
 114        addq    n0,n0,n0
 115        cmpule  $5,n1,qb
 116        subq    n1,$5,tmp
 117        cmovne  qb,tmp,n1
 118        bis     n0,qb,n0
 119        cmplt   n0,0,tmp
 120        addq    n1,n1,n1
 121        bis     n1,tmp,n1
 122        addq    n0,n0,n0
 123        cmpule  $5,n1,qb
 124        subq    n1,$5,tmp
 125        cmovne  qb,tmp,n1
 126        bis     n0,qb,n0
 127        cmplt   n0,0,tmp
 128        addq    n1,n1,n1
 129        bis     n1,tmp,n1
 130        addq    n0,n0,n0
 131        cmpule  $5,n1,qb
 132        subq    n1,$5,tmp
 133        cmovne  qb,tmp,n1
 134        bis     n0,qb,n0
 135        subq    cnt,1,cnt
 136        bgt     cnt,$loop2
 137
 138        addq    n1,n1,n1
 139        addq    $4,n1,n1
 140        bne     $6,$Odd
 141        stq     n1,0(rem_ptr)
 142        bis     $31,n0,$0
 143        ret     $31,($26),1
 144
 145$Odd:
 146        /* q' in n0. r' in n1 */
 147        addq    n1,n0,n1
 148
 149        cmpult  n1,n0,tmp       # tmp := carry from addq
 150        subq    n1,d,AT
 151        addq    n0,tmp,n0
 152        cmovne  tmp,AT,n1
 153
 154        cmpult  n1,d,tmp
 155        addq    n0,1,AT
 156        cmoveq  tmp,AT,n0
 157        subq    n1,d,AT
 158        cmoveq  tmp,AT,n1
 159
 160        stq     n1,0(rem_ptr)
 161        bis     $31,n0,$0
 162        ret     $31,($26),1
 163
 164        .end    __udiv_qrnnd
 165EXPORT_SYMBOL(__udiv_qrnnd)
 166