## Root/

1 | /*-␊ |

2 | * Copyright (c) 1992, 1993␊ |

3 | *␉The Regents of the University of California. 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␉8.1 (Berkeley) 6/4/93␊ |

38 | * $FreeBSD: src/sys/libkern/quad.h,v 1.9 1999/08/28 00:46:36 peter Exp $␊ |

39 | */␊ |

40 | ␊ |

41 | /*␊ |

42 | * Quad arithmetic.␊ |

43 | *␊ |

44 | * This library makes the following assumptions:␊ |

45 | *␊ |

46 | * - The type long long (aka quad_t) exists.␊ |

47 | *␊ |

48 | * - A quad variable is exactly twice as long as `long'.␊ |

49 | *␊ |

50 | * - The machine's arithmetic is two's complement.␊ |

51 | *␊ |

52 | * This library can provide 128-bit arithmetic on a machine with 128-bit␊ |

53 | * quads and 64-bit longs, for instance, or 96-bit arithmetic on machines␊ |

54 | * with 48-bit longs.␊ |

55 | */␊ |

56 | ␊ |

57 | #include <sys/cdefs.h>␊ |

58 | #include <sys/types.h>␊ |

59 | #include <limits.h>␊ |

60 | ␊ |

61 | /*␊ |

62 | * Depending on the desired operation, we view a `long long' (aka quad_t) in␊ |

63 | * one or more of the following formats.␊ |

64 | */␊ |

65 | union uu {␊ |

66 | ␉quad_t␉q;␉␉/* as a (signed) quad */␊ |

67 | ␉quad_t␉uq;␉␉/* as an unsigned quad */␊ |

68 | ␉long␉sl[2];␉␉/* as two signed longs */␊ |

69 | ␉u_long␉ul[2];␉␉/* as two unsigned longs */␊ |

70 | };␊ |

71 | ␊ |

72 | /*␊ |

73 | * Define high and low longwords.␊ |

74 | */␊ |

75 | #define␉Hi␉␉_QUAD_HIGHWORD␊ |

76 | #define␉Lo␉␉_QUAD_LOWWORD␊ |

77 | ␊ |

78 | /*␊ |

79 | * Total number of bits in a quad_t and in the pieces that make it up.␊ |

80 | * These are used for shifting, and also below for halfword extraction␊ |

81 | * and assembly.␊ |

82 | */␊ |

83 | #define␉QUAD_BITS␉(sizeof(quad_t) * CHAR_BIT)␊ |

84 | #define␉LONG_BITS␉(sizeof(long) * CHAR_BIT)␊ |

85 | #define␉HALF_BITS␉(sizeof(long) * CHAR_BIT / 2)␊ |

86 | ␊ |

87 | /*␊ |

88 | * Extract high and low shortwords from longword, and move low shortword of␊ |

89 | * longword to upper half of long, i.e., produce the upper longword of␊ |

90 | * ((quad_t)(x) << (number_of_bits_in_long/2)). (`x' must actually be u_long.)␊ |

91 | *␊ |

92 | * These are used in the multiply code, to split a longword into upper␊ |

93 | * and lower halves, and to reassemble a product as a quad_t, shifted left␊ |

94 | * (sizeof(long)*CHAR_BIT/2).␊ |

95 | */␊ |

96 | #define␉HHALF(x)␉((x) >> HALF_BITS)␊ |

97 | #define␉LHALF(x)␉((x) & ((1 << HALF_BITS) - 1))␊ |

98 | #define␉LHUP(x)␉␉((x) << HALF_BITS)␊ |

99 | ␊ |

100 | quad_t␉␉__divdi3 __P((quad_t a, quad_t b));␊ |

101 | quad_t␉␉__moddi3 __P((quad_t a, quad_t b));␊ |

102 | u_quad_t␉__qdivrem __P((u_quad_t u, u_quad_t v, u_quad_t *rem));␊ |

103 | u_quad_t␉__udivdi3 __P((u_quad_t a, u_quad_t b));␊ |

104 | u_quad_t␉__umoddi3 __P((u_quad_t a, u_quad_t b));␊ |

105 | ␊ |

106 | /*␊ |

107 | * XXX␊ |

108 | * Compensate for gcc 1 vs gcc 2. Gcc 1 defines ?sh?di3's second argument␊ |

109 | * as u_quad_t, while gcc 2 correctly uses int. Unfortunately, we still use␊ |

110 | * both compilers.␊ |

111 | */␊ |

112 | #if __GNUC__ >= 2␊ |

113 | typedef unsigned int␉qshift_t;␊ |

114 | #else␊ |

115 | typedef u_quad_t␉qshift_t;␊ |

116 | #endif␊ |

117 | ␊ |

118 | ␊ |

119 | ␊ |

120 | ␊ |

121 | ␊ |

122 | ␊ |

123 | ␊ |

124 | ␊ |

125 | ␊ |

126 |