linux/arch/alpha/math-emu/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
  29        .set noreorder
  30        .set noat
  31
  32        .text
  33
  34        .globl __udiv_qrnnd
  35        .ent __udiv_qrnnd
  36__udiv_qrnnd:
  37        .frame $30,0,$26,0
  38        .prologue 0
  39
  40#define cnt     $2
  41#define tmp     $3
  42#define rem_ptr $16
  43#define n1      $17
  44#define n0      $18
  45#define d       $19
  46#define qb      $20
  47#define AT      $at
  48
  49        ldiq    cnt,16
  50        blt     d,$largedivisor
  51
  52$loop1: cmplt   n0,0,tmp
  53        addq    n1,n1,n1
  54        bis     n1,tmp,n1
  55        addq    n0,n0,n0
  56        cmpule  d,n1,qb
  57        subq    n1,d,tmp
  58        cmovne  qb,tmp,n1
  59        bis     n0,qb,n0
  60        cmplt   n0,0,tmp
  61        addq    n1,n1,n1
  62        bis     n1,tmp,n1
  63        addq    n0,n0,n0
  64        cmpule  d,n1,qb
  65        subq    n1,d,tmp
  66        cmovne  qb,tmp,n1
  67        bis     n0,qb,n0
  68        cmplt   n0,0,tmp
  69        addq    n1,n1,n1
  70        bis     n1,tmp,n1
  71        addq    n0,n0,n0
  72        cmpule  d,n1,qb
  73        subq    n1,d,tmp
  74        cmovne  qb,tmp,n1
  75        bis     n0,qb,n0
  76        cmplt   n0,0,tmp
  77        addq    n1,n1,n1
  78        bis     n1,tmp,n1
  79        addq    n0,n0,n0
  80        cmpule  d,n1,qb
  81        subq    n1,d,tmp
  82        cmovne  qb,tmp,n1
  83        bis     n0,qb,n0
  84        subq    cnt,1,cnt
  85        bgt     cnt,$loop1
  86        stq     n1,0(rem_ptr)
  87        bis     $31,n0,$0
  88        ret     $31,($26),1
  89
  90$largedivisor:
  91        and     n0,1,$4
  92
  93        srl     n0,1,n0
  94        sll     n1,63,tmp
  95        or      tmp,n0,n0
  96        srl     n1,1,n1
  97
  98        and     d,1,$6
  99        srl     d,1,$5
 100        addq    $5,$6,$5
 101
 102$loop2: cmplt   n0,0,tmp
 103        addq    n1,n1,n1
 104        bis     n1,tmp,n1
 105        addq    n0,n0,n0
 106        cmpule  $5,n1,qb
 107        subq    n1,$5,tmp
 108        cmovne  qb,tmp,n1
 109        bis     n0,qb,n0
 110        cmplt   n0,0,tmp
 111        addq    n1,n1,n1
 112        bis     n1,tmp,n1
 113        addq    n0,n0,n0
 114        cmpule  $5,n1,qb
 115        subq    n1,$5,tmp
 116        cmovne  qb,tmp,n1
 117        bis     n0,qb,n0
 118        cmplt   n0,0,tmp
 119        addq    n1,n1,n1
 120        bis     n1,tmp,n1
 121        addq    n0,n0,n0
 122        cmpule  $5,n1,qb
 123        subq    n1,$5,tmp
 124        cmovne  qb,tmp,n1
 125        bis     n0,qb,n0
 126        cmplt   n0,0,tmp
 127        addq    n1,n1,n1
 128        bis     n1,tmp,n1
 129        addq    n0,n0,n0
 130        cmpule  $5,n1,qb
 131        subq    n1,$5,tmp
 132        cmovne  qb,tmp,n1
 133        bis     n0,qb,n0
 134        subq    cnt,1,cnt
 135        bgt     cnt,$loop2
 136
 137        addq    n1,n1,n1
 138        addq    $4,n1,n1
 139        bne     $6,$Odd
 140        stq     n1,0(rem_ptr)
 141        bis     $31,n0,$0
 142        ret     $31,($26),1
 143
 144$Odd:
 145        /* q' in n0. r' in n1 */
 146        addq    n1,n0,n1
 147
 148        cmpult  n1,n0,tmp       # tmp := carry from addq
 149        subq    n1,d,AT
 150        addq    n0,tmp,n0
 151        cmovne  tmp,AT,n1
 152
 153        cmpult  n1,d,tmp
 154        addq    n0,1,AT
 155        cmoveq  tmp,AT,n0
 156        subq    n1,d,AT
 157        cmoveq  tmp,AT,n1
 158
 159        stq     n1,0(rem_ptr)
 160        bis     $31,n0,$0
 161        ret     $31,($26),1
 162
 163        .end    __udiv_qrnnd
 164