Commit | Line | Data |
---|---|---|

984263bc MD |
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 $ | |

c5bf2c80 | 39 | * $DragonFly: src/sys/libkern/quad.h,v 1.5 2003/11/09 05:15:32 dillon Exp $ |

984263bc MD |
40 | */ |

41 | ||

42 | /* | |

43 | * Quad arithmetic. | |

44 | * | |

45 | * This library makes the following assumptions: | |

46 | * | |

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

48 | * | |

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

50 | * | |

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

52 | * | |

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

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

55 | * with 48-bit longs. | |

56 | */ | |

57 | ||

58 | #include <sys/cdefs.h> | |

59 | #include <sys/types.h> | |

1f2de5d4 MD |
60 | #include <machine/endian.h> |

61 | #include <machine/limits.h> | |

984263bc MD |
62 | |

63 | /* | |

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

65 | * one or more of the following formats. | |

66 | */ | |

67 | union uu { | |

68 | quad_t q; /* as a (signed) quad */ | |

69 | quad_t uq; /* as an unsigned quad */ | |

70 | long sl[2]; /* as two signed longs */ | |

71 | u_long ul[2]; /* as two unsigned longs */ | |

72 | }; | |

73 | ||

74 | /* | |

75 | * Define high and low longwords. | |

76 | */ | |

77 | #define H _QUAD_HIGHWORD | |

78 | #define L _QUAD_LOWWORD | |

79 | ||

80 | /* | |

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

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

83 | * and assembly. | |

84 | */ | |

85 | #define QUAD_BITS (sizeof(quad_t) * CHAR_BIT) | |

86 | #define LONG_BITS (sizeof(long) * CHAR_BIT) | |

87 | #define HALF_BITS (sizeof(long) * CHAR_BIT / 2) | |

88 | ||

89 | /* | |

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

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

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

93 | * | |

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

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

96 | * (sizeof(long)*CHAR_BIT/2). | |

97 | */ | |

98 | #define HHALF(x) ((x) >> HALF_BITS) | |

99 | #define LHALF(x) ((x) & ((1 << HALF_BITS) - 1)) | |

100 | #define LHUP(x) ((x) << HALF_BITS) | |

101 | ||

3ff6852f RG |
102 | quad_t __divdi3 (quad_t a, quad_t b); |

103 | quad_t __moddi3 (quad_t a, quad_t b); | |

104 | u_quad_t __qdivrem (u_quad_t u, u_quad_t v, u_quad_t *rem); | |

105 | u_quad_t __udivdi3 (u_quad_t a, u_quad_t b); | |

106 | u_quad_t __umoddi3 (u_quad_t a, u_quad_t b); | |

c5bf2c80 MD |
107 | int __ucmpdi2(u_quad_t a, u_quad_t b); |

108 | int __cmpdi2(quad_t a, quad_t b); | |

109 | ||

984263bc MD |
110 | |

111 | /* | |

112 | * XXX | |

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

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

115 | * both compilers. | |

116 | */ | |

117 | #if __GNUC__ >= 2 | |

118 | typedef unsigned int qshift_t; | |

119 | #else | |

120 | typedef u_quad_t qshift_t; | |

121 | #endif |