]> Cypherpunks.ru repositories - gostls13.git/blob - src/math/hypot_386.s
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / src / math / hypot_386.s
1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include "textflag.h"
6
7 // func archHypot(p, q float64) float64
8 TEXT Â·archHypot(SB),NOSPLIT,$0
9 // test bits for not-finite
10         MOVL    p_hi+4(FP), AX   // high word p
11         ANDL    $0x7ff00000, AX
12         CMPL    AX, $0x7ff00000
13         JEQ     not_finite
14         MOVL    q_hi+12(FP), AX   // high word q
15         ANDL    $0x7ff00000, AX
16         CMPL    AX, $0x7ff00000
17         JEQ     not_finite
18         FMOVD   p+0(FP), F0  // F0=p
19         FABS                 // F0=|p|
20         FMOVD   q+8(FP), F0  // F0=q, F1=|p|
21         FABS                 // F0=|q|, F1=|p|
22         FUCOMI  F0, F1       // compare F0 to F1
23         JCC     2(PC)        // jump if F0 >= F1
24         FXCHD   F0, F1       // F0=|p| (larger), F1=|q| (smaller)
25         FTST                 // compare F0 to 0
26         FSTSW   AX
27         ANDW    $0x4000, AX
28         JNE     10(PC)       // jump if F0 = 0
29         FXCHD   F0, F1       // F0=q (smaller), F1=p (larger)
30         FDIVD   F1, F0       // F0=q(=q/p), F1=p
31         FMULD   F0, F0       // F0=q*q, F1=p
32         FLD1                 // F0=1, F1=q*q, F2=p
33         FADDDP  F0, F1       // F0=1+q*q, F1=p
34         FSQRT                // F0=sqrt(1+q*q), F1=p
35         FMULDP  F0, F1       // F0=p*sqrt(1+q*q)
36         FMOVDP  F0, ret+16(FP)
37         RET
38         FMOVDP  F0, F1       // F0=0
39         FMOVDP  F0, ret+16(FP)
40         RET
41 not_finite:
42 // test bits for -Inf or +Inf
43         MOVL    p_hi+4(FP), AX  // high word p
44         ORL     p_lo+0(FP), AX  // low word p
45         ANDL    $0x7fffffff, AX
46         CMPL    AX, $0x7ff00000
47         JEQ     is_inf
48         MOVL    q_hi+12(FP), AX  // high word q
49         ORL     q_lo+8(FP), AX   // low word q
50         ANDL    $0x7fffffff, AX
51         CMPL    AX, $0x7ff00000
52         JEQ     is_inf
53         MOVL    $0x7ff80000, ret_hi+20(FP)  // return NaN = 0x7FF8000000000001
54         MOVL    $0x00000001, ret_lo+16(FP)
55         RET
56 is_inf:
57         MOVL    AX, ret_hi+20(FP)  // return +Inf = 0x7FF0000000000000
58         MOVL    $0x00000000, ret_lo+16(FP)
59         RET