90 lines
2.2 KiB
ArmAsm
90 lines
2.2 KiB
ArmAsm
// 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
|