# Text file src/math/floor_amd64.s

```     1  // Copyright 2012 The Go Authors. All rights reserved.
2  // Use of this source code is governed by a BSD-style
4
5  #include "textflag.h"
6
7  #define Big		0x4330000000000000 // 2**52
8
9  // func archFloor(x float64) float64
10  TEXT ·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}
25  	MOVSD	X0, ret+8(FP)
26  	RET
27  isBig_floor:
28  	MOVQ    AX, ret+8(FP) // return x
29  	RET
30
31  // func archCeil(x float64) float64
32  TEXT ·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}
51  	MOVSD	X0, ret+8(FP)
52  	RET
53  isBig_ceil:
54  	MOVQ	AX, ret+8(FP)
55  	RET
56
57  // func archTrunc(x float64) float64
58  TEXT ·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
74  isBig_trunc:
75  	MOVQ    AX, ret+8(FP) // return x
76  	RET
77
```

View as plain text