windows-nt/Source/XPSP1/NT/base/wow64/mscpu/math/axp64/frnd.s
2020-09-26 16:20:57 +08:00

90 lines
2.2 KiB
ArmAsm
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// TITLE("Floating Point Round")
//++
//
// Copyright (c) 1992 Digital Equipment Corporation
//
// Module Name:
//
// frnd.s
//
// Abstract:
//
// This module implements the floating round to integer function.
//
// Author:
//
// Thomas Van Baak (tvb) 07-Sep-1992
//
// Environment:
//
// Any mode.
//
// Revision History:
//
//--
#include "ksalpha.h"
SBTTL("Floating Round to Integer")
//++
//
// DOUBLE
// _frnd (
// IN DOUBLE x
// )
//
// Routine Description:
//
// This function rounds the given finite floating point argument to
// an integer using nearest rounding.
//
// Arguments:
//
// x (f16) - Supplies the floating point value to be rounded.
//
// Return Value:
//
// The integer rounded floating point value is returned in f0.
//
// Implementation Notes:
//
//--
LEAF_ENTRY(_frnd)
//
// If the absolute value of the argument is greater than or equal to 2^52,
// then the argument is already an integer and it can be returned as the
// function value. Note that 2^52 - 1 is the largest integer representable
// by T-format (double) floating point because the mantissa (without the
// hidden bit) is 52 bits wide.
//
fbeq f16, 10f // return if argument is 0.0
ldt f10, Two52 // get 2^52 magic constant
fabs f16, f11 // get absolute value of argument
cmptlt f10, f11, f12 // is 2^52 < arg?
fbeq f12, 20f // if eq[false], then do rounding
10: cpys f16, f16, f0 // argument is return value
ret zero, (ra) // return
20: cpys f16, f10, f10 // if argument < 0, use -2^52 instead
addt f16, f10, f0 // add [+-]2^52 (nearest rounding)
subt f0, f10, f0 // subtract [+-]2^52 (nearest rounding)
ret zero, (ra) // return
.end _frnd
//
// Define floating point constants.
//
// (avoid ldit with floating point literal due to bug in acc/as that
// creates writable .rdata sections - tvb)
//
.align 3
.rdata
Two52:
.double 4503599627370496.0 // 2^52