...

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