home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / lib / libc / quad / quad.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-28  |  4.0 KB  |  111 lines

  1. /*-
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This software was developed by the Computer Systems Engineering group
  6.  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
  7.  * contributed to Berkeley.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *    must display the following acknowledgement:
  19.  *    This product includes software developed by the University of
  20.  *    California, Berkeley and its contributors.
  21.  * 4. Neither the name of the University nor the names of its contributors
  22.  *    may be used to endorse or promote products derived from this software
  23.  *    without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  *
  37.  *    @(#)quad.h    5.9 (Berkeley) 7/28/92
  38.  */
  39.  
  40. /*
  41.  * Quad arithmetic.
  42.  *
  43.  * This library makes the following assumptions:
  44.  *
  45.  *  - The type long long (aka quad_t) exists.
  46.  *
  47.  *  - A quad variable is exactly twice as long as `long'.
  48.  *
  49.  *  - The machine's arithmetic is two's complement.
  50.  *
  51.  * This library can provide 128-bit arithmetic on a machine with 128-bit
  52.  * quads and 64-bit longs, for instance, or 96-bit arithmetic on machines
  53.  * with 48-bit longs.
  54.  */
  55.  
  56. #include <sys/types.h>
  57. #include <limits.h>
  58.  
  59. /*
  60.  * Depending on the desired operation, we view a `long long' (aka quad_t) in
  61.  * one or more of the following formats.
  62.  */
  63. union uu {
  64.     quad_t    q;        /* as a (signed) quad */
  65.     quad_t    uq;        /* as an unsigned quad */
  66.     long    sl[2];        /* as two signed longs */
  67.     u_long    ul[2];        /* as two unsigned longs */
  68. };
  69.  
  70. /*
  71.  * Define high and low longwords.
  72.  */
  73. #define    H        _QUAD_HIGHWORD
  74. #define    L        _QUAD_LOWWORD
  75.  
  76. /*
  77.  * Total number of bits in a quad_t and in the pieces that make it up.
  78.  * These are used for shifting, and also below for halfword extraction
  79.  * and assembly.
  80.  */
  81. #define    QUAD_BITS    (sizeof(quad_t) * CHAR_BIT)
  82. #define    LONG_BITS    (sizeof(long) * CHAR_BIT)
  83. #define    HALF_BITS    (sizeof(long) * CHAR_BIT / 2)
  84.  
  85. /*
  86.  * Extract high and low shortwords from longword, and move low shortword of
  87.  * longword to upper half of long, i.e., produce the upper longword of
  88.  * ((quad_t)(x) << (number_of_bits_in_long/2)).  (`x' must actually be u_long.)
  89.  *
  90.  * These are used in the multiply code, to split a longword into upper
  91.  * and lower halves, and to reassemble a product as a quad_t, shifted left
  92.  * (sizeof(long)*CHAR_BIT/2).
  93.  */
  94. #define    HHALF(x)    ((x) >> HALF_BITS)
  95. #define    LHALF(x)    ((x) & ((1 << HALF_BITS) - 1))
  96. #define    LHUP(x)        ((x) << HALF_BITS)
  97.  
  98. extern u_quad_t __qdivrem __P((u_quad_t u, u_quad_t v, u_quad_t *rem));
  99.  
  100. /*
  101.  * XXX
  102.  * Compensate for gcc 1 vs gcc 2.  Gcc 1 defines ?sh?di3's second argument
  103.  * as u_quad_t, while gcc 2 correctly uses int.  Unfortunately, we still use
  104.  * both compilers.
  105.  */
  106. #if __GNUC__ >= 2
  107. typedef unsigned int    qshift_t;
  108. #else
  109. typedef u_quad_t    qshift_t;
  110. #endif
  111.