Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

176 lines
5.2 KiB

// TITLE("Floating Point Integer Functions")
//++
//
// Copyright (c) 1993 Digital Equipment Corporation
//
// Module Name:
//
// fpint.s
//
// Abstract:
//
// This module implements routines floor, ceiling, and integer fraction
// for normal, finite operands.
//
// Author:
//
// Thomas Van Baak (tvb) 30-Jul-1993
//
// Environment:
//
// Any mode.
//
// Revision History:
//
//--
#include "ksalpha.h"
//
// Define floating point constants.
//
.align 3
.rdata
__one:
.double 1.0
__two_52:
.double 4503599627370496.0 // 2**52
SBTTL("Floating Point Integer Ceiling")
//++
//
// double
// _finite_ceil (
// double Value
// )
//
// Routine Description:
//
// This function computes the smallest integer no less than the given
// finite normal floating point value.
//
// Arguments:
//
// Value (f16) - Supplies the value to be converted.
//
// Return Value:
//
// The integer value is returned as the function value.
//
//--
LEAF_ENTRY(_finite_ceil)
fbeq f16, 10f // if zero, retain sign of zero
ldt f30, __two_52 // get largest fraction-free integer
fabs f16, f0 // get absolute value of argument
cmptlt f0, f30, f11 // is |x| < 2**52 ?
fbeq f11, 10f // no, all |x| >= 2**52 are integers
cpys f16, f30, f30 // if argument < 0, use -2**52 instead
ldt f10, __one // get increment value
addt f16, f30, f0 // add 2**52 to drop fraction bits
subt f0, f30, f0 // subtract same to restore integer part
cmptlt f0, f16, f11 // is result less than argument?
fcmoveq f11, f31, f10 // if eq[no], then no adjustment
addt f0, f10, f0 // otherwise, must add 1
ret zero, (ra) // return
10:
fmov f16, f0 // argument is return value
ret zero, (ra) // return
.end _finite_ceil
SBTTL("Floating Point Integer Floor")
//++
//
// double
// _finite_floor (
// double Value
// )
//
// Routine Description:
//
// This function computes the largest integer no greater than the given
// finite normal floating point value.
//
// Arguments:
//
// Value (f16) - Supplies the value to be converted.
//
// Return Value:
//
// The integer value is returned as the function value.
//
//--
LEAF_ENTRY(_finite_floor)
fbeq f16, 10f // if zero, retain sign of zero
ldt f30, __two_52 // get largest fraction-free integer
fabs f16, f0 // get absolute value of argument
cmptlt f0, f30, f11 // is |x| < 2**52 ?
fbeq f11, 10f // no, all |x| >= 2**52 are integers
cpys f16, f30, f30 // if argument < 0, use -2**52 instead
ldt f10, __one // get increment value
addt f16, f30, f0 // add 2**52 to drop fraction bits
subt f0, f30, f0 // subtract same to restore integer part
cmptle f0, f16, f11 // is result less or equal to argument?
fcmovne f11, f31, f10 // if ne[yes], then no adjustment
subt f0, f10, f0 // otherwise, must subtract 1
ret zero, (ra) // return
10:
fmov f16, f0 // argument is return value
ret zero, (ra) // return
.end _finite_floor
SBTTL("Floating Point Integer and Fraction")
//++
//
// double
// _finite_modf (
// double Value,
// double *IntegerPart
// )
//
// Routine Description:
//
// This function computes the integer and fractional parts of the given
// finite normal floating point value.
//
// Arguments:
//
// Value (f16) - Supplies the value to be converted.
//
// IntegerPart (a1) - Supplies a pointer to the location that is to
// receive the integer part of the operation.
//
// Return Value:
//
// The fractional value is returned as the function value.
//
//--
LEAF_ENTRY(_finite_modf)
fbeq f16, 10f // if zero, retain sign of zero
ldt f30, __two_52 // get largest fraction-free integer
fabs f16, f0 // get absolute value of argument
cmptlt f0, f30, f11 // is |x| < 2**52 ?
fbeq f11, 10f // no fraction when |x| >= 2**52
cpys f16, f30, f30 // if argument < 0, use -2**52 instead
addtc f16, f30, f0 // add +-2**52 to drop fraction bits
subtc f0, f30, f10 // subtract same to restore integer part
subt f16, f10, f0 // calculate fractional part
stt f10, 0(a1) // store integer part
ret zero, (ra) // return
10:
fmov f31, f0 // set fraction to zero
stt f16, 0(a1) // set integer part to argument
ret zero, (ra) // return
.end _finite_modf