windows-nt/Source/XPSP1/NT/base/ntos/rtl/ia64/largeint.s

96 lines
2.2 KiB
ArmAsm
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
***
*** The information and source code contained herein is the exclusive
*** property of Intel Corporation and may not be disclosed, examined
*** or reproduced in whole or in part without explicit written authorization
*** from the company.
**/
// TITLE("Large Integer Arithmetic")
//++
//
// Module Name:
//
// largeint.s
//
// Abstract:
//
// This module implements routines for performing extended integer
// arithmetic.
//
// Author:
//
// William K. Cheung (wcheung) 08-Feb-1996
//
// Environment:
//
// Any mode.
//
// Revision History:
//
// 09-Feb-1996 Updated to EAS 2.1
//
//--
#include "ksia64.h"
.file "largeint.s"
//++
//
// LARGE_INTEGER
// RtlExtendedMagicDivide (
// IN LARGE_INTEGER Dividend,
// IN LARGE_INTEGER MagicDivisor,
// IN CCHAR ShiftCount
// )
//
// Routine Description:
//
// This function divides a signed large integer by an unsigned large integer
// and returns the signed large integer result. The division is performed
// using reciprocal multiplication of a signed large integer value by an
// unsigned large integer fraction which represents the most significant
// 64-bits of the reciprocal divisor rounded up in its least significant bit
// and normalized with respect to bit 63. A shift count is also provided
// which is used to truncate the fractional bits from the result value.
//
// Arguments:
//
// Dividend (a0) - Supplies the dividend value.
//
// MagicDivisor (a1) - Supplies the magic divisor value which
// is a 64-bit multiplicative reciprocal.
//
// Shiftcount (a2) - Supplies the right shift adjustment value.
//
// Return Value:
//
// The large integer result is returned as the function value in v0.
//
//--
LEAF_ENTRY(RtlExtendedMagicDivide)
cmp.gt pt0, pt1 = r0, a0
;;
(pt0) sub a0 = r0, a0
;;
setf.sig ft0 = a0
setf.sig ft1 = a1
;;
zxt1 a2 = a2
xma.hu ft2 = ft0, ft1, f0
;;
getf.sig v0 = ft2
;;
shr v0 = v0, a2
;;
(pt0) sub v0 = r0, v0
LEAF_RETURN
LEAF_EXIT(RtlExtendedMagicDivide)