codekingpro/portable-devtools
114k
1// Copyright 2012 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4 5#include "textflag.h"6 7#define Big 0x4330000000000000 // 2**528 9// func archFloor(x float64) float6410TEXT ·archFloor(SB),NOSPLIT,$011 MOVQ x+0(FP), AX12 MOVQ $~(1<<63), DX // sign bit mask13 ANDQ AX,DX // DX = |x|14 SUBQ $1,DX15 MOVQ $(Big - 1), CX // if |x| >= 2**52-1 or IsNaN(x) or |x| == 0, return x16 CMPQ DX,CX17 JAE isBig_floor18 MOVQ AX, X0 // X0 = x19 CVTTSD2SQ X0, AX20 CVTSQ2SD AX, X1 // X1 = float(int(x))21 CMPSD X1, X0, 1 // compare LT; X0 = 0xffffffffffffffff or 022 MOVSD $(-1.0), X223 ANDPD X2, X0 // if x < float(int(x)) {X0 = -1} else {X0 = 0}24 ADDSD X1, X025 MOVSD X0, ret+8(FP)26 RET27isBig_floor:28 MOVQ AX, ret+8(FP) // return x29 RET30 31// func archCeil(x float64) float6432TEXT ·archCeil(SB),NOSPLIT,$033 MOVQ x+0(FP), AX34 MOVQ $~(1<<63), DX // sign bit mask35 MOVQ AX, BX // BX = copy of x36 ANDQ DX, BX // BX = |x|37 MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x38 CMPQ BX, CX39 JAE isBig_ceil40 MOVQ AX, X0 // X0 = x41 MOVQ DX, X2 // X2 = sign bit mask42 CVTTSD2SQ X0, AX43 ANDNPD X0, X2 // X2 = sign44 CVTSQ2SD AX, X1 // X1 = float(int(x))45 CMPSD X1, X0, 2 // compare LE; X0 = 0xffffffffffffffff or 046 ORPD X2, X1 // if X1 = 0.0, incorporate sign47 MOVSD $1.0, X348 ANDNPD X3, X049 ORPD X2, X0 // if float(int(x)) <= x {X0 = 1} else {X0 = -0}50 ADDSD X1, X051 MOVSD X0, ret+8(FP)52 RET53isBig_ceil:54 MOVQ AX, ret+8(FP)55 RET56 57// func archTrunc(x float64) float6458TEXT ·archTrunc(SB),NOSPLIT,$059 MOVQ x+0(FP), AX60 MOVQ $~(1<<63), DX // sign bit mask61 MOVQ AX, BX // BX = copy of x62 ANDQ DX, BX // BX = |x|63 MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x64 CMPQ BX, CX65 JAE isBig_trunc66 MOVQ AX, X067 MOVQ DX, X2 // X2 = sign bit mask68 CVTTSD2SQ X0, AX69 ANDNPD X0, X2 // X2 = sign70 CVTSQ2SD AX, X0 // X0 = float(int(x))71 ORPD X2, X0 // if X0 = 0.0, incorporate sign72 MOVSD X0, ret+8(FP)73 RET74isBig_trunc:75 MOVQ AX, ret+8(FP) // return x76 RET77 