Text file
src/math/floor_amd64.s
Documentation: math
1// Copyright 2012 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#define Big 0x4330000000000000 // 2**52
8
9// func archFloor(x float64) float64
10TEXT ·archFloor(SB),NOSPLIT,$0
11 MOVQ x+0(FP), AX
12 MOVQ $~(1<<63), DX // sign bit mask
13 ANDQ AX,DX // DX = |x|
14 SUBQ $1,DX
15 MOVQ $(Big - 1), CX // if |x| >= 2**52-1 or IsNaN(x) or |x| == 0, return x
16 CMPQ DX,CX
17 JAE isBig_floor
18 MOVQ AX, X0 // X0 = x
19 CVTTSD2SQ X0, AX
20 CVTSQ2SD AX, X1 // X1 = float(int(x))
21 CMPSD X1, X0, 1 // compare LT; X0 = 0xffffffffffffffff or 0
22 MOVSD $(-1.0), X2
23 ANDPD X2, X0 // if x < float(int(x)) {X0 = -1} else {X0 = 0}
24 ADDSD X1, X0
25 MOVSD X0, ret+8(FP)
26 RET
27isBig_floor:
28 MOVQ AX, ret+8(FP) // return x
29 RET
30
31// func archCeil(x float64) float64
32TEXT ·archCeil(SB),NOSPLIT,$0
33 MOVQ x+0(FP), AX
34 MOVQ $~(1<<63), DX // sign bit mask
35 MOVQ AX, BX // BX = copy of x
36 ANDQ DX, BX // BX = |x|
37 MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x
38 CMPQ BX, CX
39 JAE isBig_ceil
40 MOVQ AX, X0 // X0 = x
41 MOVQ DX, X2 // X2 = sign bit mask
42 CVTTSD2SQ X0, AX
43 ANDNPD X0, X2 // X2 = sign
44 CVTSQ2SD AX, X1 // X1 = float(int(x))
45 CMPSD X1, X0, 2 // compare LE; X0 = 0xffffffffffffffff or 0
46 ORPD X2, X1 // if X1 = 0.0, incorporate sign
47 MOVSD $1.0, X3
48 ANDNPD X3, X0
49 ORPD X2, X0 // if float(int(x)) <= x {X0 = 1} else {X0 = -0}
50 ADDSD X1, X0
51 MOVSD X0, ret+8(FP)
52 RET
53isBig_ceil:
54 MOVQ AX, ret+8(FP)
55 RET
56
57// func archTrunc(x float64) float64
58TEXT ·archTrunc(SB),NOSPLIT,$0
59 MOVQ x+0(FP), AX
60 MOVQ $~(1<<63), DX // sign bit mask
61 MOVQ AX, BX // BX = copy of x
62 ANDQ DX, BX // BX = |x|
63 MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x
64 CMPQ BX, CX
65 JAE isBig_trunc
66 MOVQ AX, X0
67 MOVQ DX, X2 // X2 = sign bit mask
68 CVTTSD2SQ X0, AX
69 ANDNPD X0, X2 // X2 = sign
70 CVTSQ2SD AX, X0 // X0 = float(int(x))
71 ORPD X2, X0 // if X0 = 0.0, incorporate sign
72 MOVSD X0, ret+8(FP)
73 RET
74isBig_trunc:
75 MOVQ AX, ret+8(FP) // return x
76 RET
View as plain text