mirror of
https://github.com/golang/go
synced 2024-11-19 15:24:46 -07:00
519474451a
This is a subset of https://golang.org/cl/20022 with only the copyright header lines, so the next CL will be smaller and more reviewable. Go policy has been single space after periods in comments for some time. The copyright header template at: https://golang.org/doc/contribute.html#copyright also uses a single space. Make them all consistent. Change-Id: Icc26c6b8495c3820da6b171ca96a74701b4a01b0 Reviewed-on: https://go-review.googlesource.com/20111 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
100 lines
2.4 KiB
ArmAsm
100 lines
2.4 KiB
ArmAsm
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
#include "textflag.h"
|
|
|
|
#define Big 0x4330000000000000 // 2**52
|
|
|
|
// func hasSSE4() bool
|
|
// returns whether SSE4.1 is supported
|
|
TEXT ·hasSSE4(SB),NOSPLIT,$0
|
|
XORQ AX, AX
|
|
INCL AX
|
|
CPUID
|
|
SHRQ $19, CX
|
|
ANDQ $1, CX
|
|
MOVB CX, ret+0(FP)
|
|
RET
|
|
|
|
// func Floor(x float64) float64
|
|
TEXT ·Floor(SB),NOSPLIT,$0
|
|
CMPB math·useSSE4(SB), $1
|
|
JNE nosse4
|
|
ROUNDSD $1, x+0(FP), X0
|
|
MOVQ X0, ret+8(FP)
|
|
RET
|
|
nosse4:
|
|
MOVQ x+0(FP), AX
|
|
MOVQ $~(1<<63), DX // sign bit mask
|
|
ANDQ AX,DX // DX = |x|
|
|
SUBQ $1,DX
|
|
MOVQ $(Big - 1), CX // if |x| >= 2**52-1 or IsNaN(x) or |x| == 0, return x
|
|
CMPQ DX,CX
|
|
JAE isBig_floor
|
|
MOVQ AX, X0 // X0 = x
|
|
CVTTSD2SQ X0, AX
|
|
CVTSQ2SD AX, X1 // X1 = float(int(x))
|
|
CMPSD X1, X0, 1 // compare LT; X0 = 0xffffffffffffffff or 0
|
|
MOVSD $(-1.0), X2
|
|
ANDPD X2, X0 // if x < float(int(x)) {X0 = -1} else {X0 = 0}
|
|
ADDSD X1, X0
|
|
MOVSD X0, ret+8(FP)
|
|
RET
|
|
isBig_floor:
|
|
MOVQ AX, ret+8(FP) // return x
|
|
RET
|
|
|
|
// func Ceil(x float64) float64
|
|
TEXT ·Ceil(SB),NOSPLIT,$0
|
|
CMPB math·useSSE4(SB), $1
|
|
JNE nosse4
|
|
ROUNDSD $2, x+0(FP), X0
|
|
MOVQ X0, ret+8(FP)
|
|
RET
|
|
nosse4:
|
|
MOVQ x+0(FP), AX
|
|
MOVQ $~(1<<63), DX // sign bit mask
|
|
MOVQ AX, BX // BX = copy of x
|
|
ANDQ DX, BX // BX = |x|
|
|
MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x
|
|
CMPQ BX, CX
|
|
JAE isBig_ceil
|
|
MOVQ AX, X0 // X0 = x
|
|
MOVQ DX, X2 // X2 = sign bit mask
|
|
CVTTSD2SQ X0, AX
|
|
ANDNPD X0, X2 // X2 = sign
|
|
CVTSQ2SD AX, X1 // X1 = float(int(x))
|
|
CMPSD X1, X0, 2 // compare LE; X0 = 0xffffffffffffffff or 0
|
|
ORPD X2, X1 // if X1 = 0.0, incorporate sign
|
|
MOVSD $1.0, X3
|
|
ANDNPD X3, X0
|
|
ORPD X2, X0 // if float(int(x)) <= x {X0 = 1} else {X0 = -0}
|
|
ADDSD X1, X0
|
|
MOVSD X0, ret+8(FP)
|
|
RET
|
|
isBig_ceil:
|
|
MOVQ AX, ret+8(FP)
|
|
RET
|
|
|
|
// func Trunc(x float64) float64
|
|
TEXT ·Trunc(SB),NOSPLIT,$0
|
|
MOVQ x+0(FP), AX
|
|
MOVQ $~(1<<63), DX // sign bit mask
|
|
MOVQ AX, BX // BX = copy of x
|
|
ANDQ DX, BX // BX = |x|
|
|
MOVQ $Big, CX // if |x| >= 2**52 or IsNaN(x), return x
|
|
CMPQ BX, CX
|
|
JAE isBig_trunc
|
|
MOVQ AX, X0
|
|
MOVQ DX, X2 // X2 = sign bit mask
|
|
CVTTSD2SQ X0, AX
|
|
ANDNPD X0, X2 // X2 = sign
|
|
CVTSQ2SD AX, X0 // X0 = float(int(x))
|
|
ORPD X2, X0 // if X0 = 0.0, incorporate sign
|
|
MOVSD X0, ret+8(FP)
|
|
RET
|
|
isBig_trunc:
|
|
MOVQ AX, ret+8(FP) // return x
|
|
RET
|