Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// 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
|