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.
7 #define Big 0x4330000000000000 // 2**52
9 // func archFloor(x float64) float64
10 TEXT ·archFloor(SB),NOSPLIT,$0
12 MOVQ $~(1<<63), DX // sign bit mask
13 ANDQ AX,DX // DX = |x|
15 MOVQ $(Big - 1), CX // if |x| >= 2**52-1 or IsNaN(x) or |x| == 0, return x
20 CVTSQ2SD AX, X1 // X1 = float(int(x))
21 CMPSD X1, X0, 1 // compare LT; X0 = 0xffffffffffffffff or 0
23 ANDPD X2, X0 // if x < float(int(x)) {X0 = -1} else {X0 = 0}
28 MOVQ AX, ret+8(FP) // return x
31 // func archCeil(x float64) float64
32 TEXT ·archCeil(SB),NOSPLIT,$0
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
41 MOVQ DX, X2 // X2 = sign bit mask
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
49 ORPD X2, X0 // if float(int(x)) <= x {X0 = 1} else {X0 = -0}
57 // func archTrunc(x float64) float64
58 TEXT ·archTrunc(SB),NOSPLIT,$0
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
67 MOVQ DX, X2 // X2 = sign bit mask
69 ANDNPD X0, X2 // X2 = sign
70 CVTSQ2SD AX, X0 // X0 = float(int(x))
71 ORPD X2, X0 // if X0 = 0.0, incorporate sign
75 MOVQ AX, ret+8(FP) // return x