Fix hypot sNaN handling (bug 20940).
[glibc.git] / sysdeps / alpha / sub_n.S
bloba916ef1d72d46c4168813b3cb3b710bedf9f9b0f
1  # Alpha __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
2  # store difference in a third limb vector.
4  # Copyright (C) 1995-2016 Free Software Foundation, Inc.
6  # This file is part of the GNU MP Library.
8  # The GNU MP Library is free software; you can redistribute it and/or modify
9  # it under the terms of the GNU Lesser General Public License as published by
10  # the Free Software Foundation; either version 2.1 of the License, or (at your
11  # option) any later version.
13  # The GNU MP Library is distributed in the hope that it will be useful, but
14  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15  # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16  # License for more details.
18  # You should have received a copy of the GNU Lesser General Public License
19  # along with the GNU MP Library.  If not, see <http://www.gnu.org/licenses/>.
22  # INPUT PARAMETERS
23  # res_ptr      $16
24  # s1_ptr       $17
25  # s2_ptr       $18
26  # size         $19
28         .set    noreorder
29         .set    noat
30 .text
31         .align  3
32         .globl  __mpn_sub_n
33         .ent    __mpn_sub_n
34 __mpn_sub_n:
35         .frame  $30,0,$26,0
37         ldq     $3,0($17)
38         ldq     $4,0($18)
40         subq    $19,1,$19
41         and     $19,4-1,$2      # number of limbs in first loop
42         bis     $31,$31,$0
43         beq     $2,.L0          # if multiple of 4 limbs, skip first loop
45         subq    $19,$2,$19
47 .Loop0: subq    $2,1,$2
48         ldq     $5,8($17)
49         addq    $4,$0,$4
50         ldq     $6,8($18)
51         cmpult  $4,$0,$1
52         subq    $3,$4,$4
53         cmpult  $3,$4,$0
54         stq     $4,0($16)
55         or      $0,$1,$0
57         addq    $17,8,$17
58         addq    $18,8,$18
59         bis     $5,$5,$3
60         bis     $6,$6,$4
61         addq    $16,8,$16
62         bne     $2,.Loop0
64 .L0:    beq     $19,.Lend
66         .align  3
67 .Loop:  subq    $19,4,$19
69         ldq     $5,8($17)
70         addq    $4,$0,$4
71         ldq     $6,8($18)
72         cmpult  $4,$0,$1
73         subq    $3,$4,$4
74         cmpult  $3,$4,$0
75         stq     $4,0($16)
76         or      $0,$1,$0
78         ldq     $3,16($17)
79         addq    $6,$0,$6
80         ldq     $4,16($18)
81         cmpult  $6,$0,$1
82         subq    $5,$6,$6
83         cmpult  $5,$6,$0
84         stq     $6,8($16)
85         or      $0,$1,$0
87         ldq     $5,24($17)
88         addq    $4,$0,$4
89         ldq     $6,24($18)
90         cmpult  $4,$0,$1
91         subq    $3,$4,$4
92         cmpult  $3,$4,$0
93         stq     $4,16($16)
94         or      $0,$1,$0
96         ldq     $3,32($17)
97         addq    $6,$0,$6
98         ldq     $4,32($18)
99         cmpult  $6,$0,$1
100         subq    $5,$6,$6
101         cmpult  $5,$6,$0
102         stq     $6,24($16)
103         or      $0,$1,$0
105         addq    $17,32,$17
106         addq    $18,32,$18
107         addq    $16,32,$16
108         bne     $19,.Loop
110 .Lend:  addq    $4,$0,$4
111         cmpult  $4,$0,$1
112         subq    $3,$4,$4
113         cmpult  $3,$4,$0
114         stq     $4,0($16)
115         or      $0,$1,$0
116         ret     $31,($26),1
118         .end    __mpn_sub_n