/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Netscape Portable Runtime (NSPR).
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998-2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
** File: prlong.h
** Description: Portable access to 64 bit numerics
**
** Long-long (64-bit signed integer type) support. Some C compilers
** don't support 64 bit integers yet, so we use these macros to
** support both machines that do and don't.
**/
#ifndef prlong_h___
#define prlong_h___
#include "prtypes.h"
#endif /* VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
/***********************************************************************
** DEFINES: LL_MaxInt
** LL_MinInt
** LL_Zero
** LL_MaxUint
** DESCRIPTION:
** Various interesting constants and static variable
** initializer
***********************************************************************/
#if defined(HAVE_WATCOM_BUG_2)
LL_MaxInt(void);
LL_MinInt(void);
LL_Zero(void);
LL_MaxUint(void);
#else
#endif
#if defined(HAVE_LONG_LONG)
#if PR_BYTES_PER_LONG == 8
#else
#endif
/***********************************************************************
** MACROS: LL_*
** DESCRIPTION:
** The following macros define portable access to the 64 bit
** math facilities.
**
***********************************************************************/
/***********************************************************************
** MACROS: LL_<relational operators>
**
** LL_IS_ZERO Test for zero
** LL_EQ Test for equality
** LL_NE Test for inequality
** LL_GE_ZERO Test for zero or positive
** LL_CMP Compare two values
***********************************************************************/
#define LL_IS_ZERO(a) ((a) == 0)
#define LL_EQ(a, b) ((a) == (b))
#define LL_NE(a, b) ((a) != (b))
#define LL_GE_ZERO(a) ((a) >= 0)
/***********************************************************************
** MACROS: LL_<logical operators>
**
** LL_AND Logical and
** LL_OR Logical or
** LL_XOR Logical exclusion
** LL_OR2 A disgusting deviation
** LL_NOT Negation (one's complement)
***********************************************************************/
#define LL_AND(r, a, b) ((r) = (a) & (b))
#define LL_OR(r, a, b) ((r) = (a) | (b))
#define LL_XOR(r, a, b) ((r) = (a) ^ (b))
#define LL_OR2(r, a) ((r) = (r) | (a))
#define LL_NOT(r, a) ((r) = ~(a))
/***********************************************************************
** MACROS: LL_<mathematical operators>
**
** LL_NEG Negation (two's complement)
** LL_ADD Summation (two's complement)
** LL_SUB Difference (two's complement)
***********************************************************************/
#define LL_NEG(r, a) ((r) = -(a))
#define LL_ADD(r, a, b) ((r) = (a) + (b))
#define LL_SUB(r, a, b) ((r) = (a) - (b))
/***********************************************************************
** MACROS: LL_<mathematical operators>
**
** LL_MUL Product (two's complement)
** LL_DIV Quotient (two's complement)
** LL_MOD Modulus (two's complement)
***********************************************************************/
#define LL_MUL(r, a, b) ((r) = (a) * (b))
#define LL_DIV(r, a, b) ((r) = (a) / (b))
#define LL_MOD(r, a, b) ((r) = (a) % (b))
/***********************************************************************
** MACROS: LL_<shifting operators>
**
** LL_SHL Shift left [0..64] bits
** LL_SHR Shift right [0..64] bits with sign extension
** LL_USHR Unsigned shift right [0..64] bits
** LL_ISHL Signed shift left [0..64] bits
***********************************************************************/
/***********************************************************************
** MACROS: LL_<conversion operators>
**
** LL_L2I Convert to signed 32 bit
** LL_L2UI Convert to unsigned 32 bit
** LL_L2F Convert to floating point
** LL_L2D Convert to floating point
** LL_I2L Convert signed to 64 bit
** LL_UI2L Convert unsigned to 64 bit
** LL_F2L Convert float to 64 bit
** LL_D2L Convert float to 64 bit
***********************************************************************/
/***********************************************************************
** MACROS: LL_UDIVMOD
** DESCRIPTION:
** Produce both a quotient and a remainder given an unsigned
** INPUTS: PRUint64 a: The dividend of the operation
** PRUint64 b: The quotient of the operation
** OUTPUTS: PRUint64 *qp: pointer to quotient
** PRUint64 *rp: pointer to remainder
***********************************************************************/
#else /* !HAVE_LONG_LONG */
#ifdef IS_LITTLE_ENDIAN
#else
#endif
#define LL_ADD(r, a, b) { \
}
#define LL_SUB(r, a, b) { \
}
#define LL_MUL(r, a, b) { \
}
#define LL_MUL32(r, a, b) { \
}
#define LL_DIV(r, a, b) { \
if (_negative) { \
} else { \
_a = a; \
} \
_negative ^= 1; \
} else { \
_b = b; \
} \
if (_negative) \
LL_NEG(r, r); \
}
#define LL_MOD(r, a, b) { \
if (_negative) { \
} else { \
_a = a; \
} \
} else { \
_b = b; \
} \
if (_negative) \
LL_NEG(r, r); \
}
#define LL_SHL(r, a, b) { \
if (b) { \
_a = a; \
if ((b) < 32) { \
} else { \
(r).lo = 0; \
} \
} else { \
(r) = (a); \
} \
}
/* a is an PRInt32, b is PRInt32, r is PRInt64 */
#define LL_ISHL(r, a, b) { \
if (b) { \
if ((b) < 32) { \
(r).lo = (a) << ((b) & 31); \
(r).hi = ((a) >> (32 - (b))); \
} else { \
(r).lo = 0; \
(r).hi = (a) << ((b) & 31); \
} \
} else { \
(r).lo = (a); \
(r).hi = 0; \
} \
}
#define LL_SHR(r, a, b) { \
if (b) { \
_a = a; \
if ((b) < 32) { \
} else { \
} \
} else { \
(r) = (a); \
} \
}
#define LL_USHR(r, a, b) { \
if (b) { \
_a = a; \
if ((b) < 32) { \
} else { \
(r).hi = 0; \
} \
} else { \
(r) = (a); \
} \
}
#define LL_L2D(d, l) { \
int _negative; \
\
if (_negative) { \
} else { \
_absval = l; \
} \
if (_negative) \
(d) = -(d); \
}
#define LL_D2L(l, d) { \
int _negative; \
\
_negative = ((d) < 0); \
\
(l).lo = 0; \
if (_absval < 0) { \
} else { \
} \
\
if (_negative) \
LL_NEG(l, l); \
}
#endif /* !HAVE_LONG_LONG */
#endif /* prlong_h___ */