]> git.ipfire.org Git - thirdparty/gcc.git/blame - libdecnumber/decQuad.h
[Ada] Improved support for aspect alignment in CCG
[thirdparty/gcc.git] / libdecnumber / decQuad.h
CommitLineData
2533577f 1/* decQuad module header for the decNumber C Library.
8d9254fc 2 Copyright (C) 2007-2020 Free Software Foundation, Inc.
2533577f
JJ
3 Contributed by IBM Corporation. Author Mike Cowlishaw.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
748086b7 9 Software Foundation; either version 3, or (at your option) any later
2533577f
JJ
10 version.
11
2533577f
JJ
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
748086b7
JJ
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
2533577f
JJ
25
26/* ------------------------------------------------------------------ */
27/* decQuad.h -- Decimal 128-bit format module header */
28/* ------------------------------------------------------------------ */
2533577f 29/* This include file is always included by decSingle and decDouble, */
7bd36a9c 30/* and therefore also holds useful constants used by all three. */
2533577f
JJ
31
32#if !defined(DECQUAD)
33 #define DECQUAD
34
35 #define DECQUADNAME "decimalQuad" /* Short name */
36 #define DECQUADTITLE "Decimal 128-bit datum" /* Verbose name */
7bd36a9c 37 #define DECQUADAUTHOR "Mike Cowlishaw" /* Who to blame */
2533577f
JJ
38
39 /* parameters for decQuads */
7bd36a9c 40 #define DECQUAD_Bytes 16 /* length */
2533577f 41 #define DECQUAD_Pmax 34 /* maximum precision (digits) */
7bd36a9c
BE
42 #define DECQUAD_Emin -6143 /* minimum adjusted exponent */
43 #define DECQUAD_Emax 6144 /* maximum adjusted exponent */
44 #define DECQUAD_EmaxD 4 /* maximum exponent digits */
2533577f 45 #define DECQUAD_Bias 6176 /* bias for the exponent */
7bd36a9c
BE
46 #define DECQUAD_String 43 /* maximum string length, +1 */
47 #define DECQUAD_EconL 12 /* exponent continuation length */
2533577f
JJ
48 #define DECQUAD_Declets 11 /* count of declets */
49 /* highest biased exponent (Elimit-1) */
50 #define DECQUAD_Ehigh (DECQUAD_Emax + DECQUAD_Bias - (DECQUAD_Pmax-1))
51
52 /* Required include */
53 #include "decContext.h"
54
7bd36a9c 55 /* The decQuad decimal 128-bit type, accessible by all sizes */
4a44abab 56 typedef union {
7bd36a9c 57 uint8_t bytes[DECQUAD_Bytes]; /* fields: 1, 5, 12, 110 bits */
4a44abab 58 uint16_t shorts[DECQUAD_Bytes/2];
7bd36a9c
BE
59 uint32_t words[DECQUAD_Bytes/4];
60 #if DECUSE64
61 uint64_t longs[DECQUAD_Bytes/8];
62 #endif
2533577f
JJ
63 } decQuad;
64
65 /* ---------------------------------------------------------------- */
66 /* Shared constants */
67 /* ---------------------------------------------------------------- */
68
69 /* sign and special values [top 32-bits; last two bits are don't-care
70 for Infinity on input, last bit don't-care for NaNs] */
7bd36a9c 71 #define DECFLOAT_Sign 0x80000000 /* 1 00000 00 Sign */
2533577f 72 #define DECFLOAT_NaN 0x7c000000 /* 0 11111 00 NaN generic */
7bd36a9c
BE
73 #define DECFLOAT_qNaN 0x7c000000 /* 0 11111 00 qNaN */
74 #define DECFLOAT_sNaN 0x7e000000 /* 0 11111 10 sNaN */
2533577f
JJ
75 #define DECFLOAT_Inf 0x78000000 /* 0 11110 00 Infinity */
76 #define DECFLOAT_MinSp 0x78000000 /* minimum special value */
77 /* [specials are all >=MinSp] */
78 /* Sign nibble constants */
79 #if !defined(DECPPLUSALT)
7bd36a9c
BE
80 #define DECPPLUSALT 0x0A /* alternate plus nibble */
81 #define DECPMINUSALT 0x0B /* alternate minus nibble */
82 #define DECPPLUS 0x0C /* preferred plus nibble */
83 #define DECPMINUS 0x0D /* preferred minus nibble */
84 #define DECPPLUSALT2 0x0E /* alternate plus nibble */
85 #define DECPUNSIGNED 0x0F /* alternate plus nibble (unsigned) */
2533577f
JJ
86 #endif
87
88 /* ---------------------------------------------------------------- */
89 /* Routines -- implemented as decFloat routines in common files */
90 /* ---------------------------------------------------------------- */
91
92 #include "decQuadSymbols.h"
93
94 /* Utilities and conversions, extractors, etc.) */
95 extern decQuad * decQuadFromBCD(decQuad *, int32_t, const uint8_t *, int32_t);
96 extern decQuad * decQuadFromInt32(decQuad *, int32_t);
97 extern decQuad * decQuadFromPacked(decQuad *, int32_t, const uint8_t *);
7bd36a9c 98 extern decQuad * decQuadFromPackedChecked(decQuad *, int32_t, const uint8_t *);
2533577f
JJ
99 extern decQuad * decQuadFromString(decQuad *, const char *, decContext *);
100 extern decQuad * decQuadFromUInt32(decQuad *, uint32_t);
101 extern int32_t decQuadGetCoefficient(const decQuad *, uint8_t *);
102 extern int32_t decQuadGetExponent(const decQuad *);
103 extern decQuad * decQuadSetCoefficient(decQuad *, const uint8_t *, int32_t);
104 extern decQuad * decQuadSetExponent(decQuad *, decContext *, int32_t);
105 extern void decQuadShow(const decQuad *, const char *);
106 extern int32_t decQuadToBCD(const decQuad *, int32_t *, uint8_t *);
107 extern char * decQuadToEngString(const decQuad *, char *);
108 extern int32_t decQuadToInt32(const decQuad *, decContext *, enum rounding);
109 extern int32_t decQuadToInt32Exact(const decQuad *, decContext *, enum rounding);
110 extern int32_t decQuadToPacked(const decQuad *, int32_t *, uint8_t *);
111 extern char * decQuadToString(const decQuad *, char *);
112 extern uint32_t decQuadToUInt32(const decQuad *, decContext *, enum rounding);
113 extern uint32_t decQuadToUInt32Exact(const decQuad *, decContext *, enum rounding);
114 extern decQuad * decQuadZero(decQuad *);
115
116 /* Computational (result is a decQuad) */
117 extern decQuad * decQuadAbs(decQuad *, const decQuad *, decContext *);
118 extern decQuad * decQuadAdd(decQuad *, const decQuad *, const decQuad *, decContext *);
119 extern decQuad * decQuadAnd(decQuad *, const decQuad *, const decQuad *, decContext *);
120 extern decQuad * decQuadDivide(decQuad *, const decQuad *, const decQuad *, decContext *);
121 extern decQuad * decQuadDivideInteger(decQuad *, const decQuad *, const decQuad *, decContext *);
122 extern decQuad * decQuadFMA(decQuad *, const decQuad *, const decQuad *, const decQuad *, decContext *);
123 extern decQuad * decQuadInvert(decQuad *, const decQuad *, decContext *);
124 extern decQuad * decQuadLogB(decQuad *, const decQuad *, decContext *);
125 extern decQuad * decQuadMax(decQuad *, const decQuad *, const decQuad *, decContext *);
126 extern decQuad * decQuadMaxMag(decQuad *, const decQuad *, const decQuad *, decContext *);
127 extern decQuad * decQuadMin(decQuad *, const decQuad *, const decQuad *, decContext *);
128 extern decQuad * decQuadMinMag(decQuad *, const decQuad *, const decQuad *, decContext *);
129 extern decQuad * decQuadMinus(decQuad *, const decQuad *, decContext *);
130 extern decQuad * decQuadMultiply(decQuad *, const decQuad *, const decQuad *, decContext *);
131 extern decQuad * decQuadNextMinus(decQuad *, const decQuad *, decContext *);
132 extern decQuad * decQuadNextPlus(decQuad *, const decQuad *, decContext *);
133 extern decQuad * decQuadNextToward(decQuad *, const decQuad *, const decQuad *, decContext *);
134 extern decQuad * decQuadOr(decQuad *, const decQuad *, const decQuad *, decContext *);
135 extern decQuad * decQuadPlus(decQuad *, const decQuad *, decContext *);
136 extern decQuad * decQuadQuantize(decQuad *, const decQuad *, const decQuad *, decContext *);
137 extern decQuad * decQuadReduce(decQuad *, const decQuad *, decContext *);
138 extern decQuad * decQuadRemainder(decQuad *, const decQuad *, const decQuad *, decContext *);
139 extern decQuad * decQuadRemainderNear(decQuad *, const decQuad *, const decQuad *, decContext *);
140 extern decQuad * decQuadRotate(decQuad *, const decQuad *, const decQuad *, decContext *);
141 extern decQuad * decQuadScaleB(decQuad *, const decQuad *, const decQuad *, decContext *);
142 extern decQuad * decQuadShift(decQuad *, const decQuad *, const decQuad *, decContext *);
143 extern decQuad * decQuadSubtract(decQuad *, const decQuad *, const decQuad *, decContext *);
144 extern decQuad * decQuadToIntegralValue(decQuad *, const decQuad *, decContext *, enum rounding);
145 extern decQuad * decQuadToIntegralExact(decQuad *, const decQuad *, decContext *);
146 extern decQuad * decQuadXor(decQuad *, const decQuad *, const decQuad *, decContext *);
147
148 /* Comparisons */
149 extern decQuad * decQuadCompare(decQuad *, const decQuad *, const decQuad *, decContext *);
150 extern decQuad * decQuadCompareSignal(decQuad *, const decQuad *, const decQuad *, decContext *);
151 extern decQuad * decQuadCompareTotal(decQuad *, const decQuad *, const decQuad *);
152 extern decQuad * decQuadCompareTotalMag(decQuad *, const decQuad *, const decQuad *);
153
154 /* Copies */
155 extern decQuad * decQuadCanonical(decQuad *, const decQuad *);
156 extern decQuad * decQuadCopy(decQuad *, const decQuad *);
157 extern decQuad * decQuadCopyAbs(decQuad *, const decQuad *);
158 extern decQuad * decQuadCopyNegate(decQuad *, const decQuad *);
159 extern decQuad * decQuadCopySign(decQuad *, const decQuad *, const decQuad *);
160
161 /* Non-computational */
162 extern enum decClass decQuadClass(const decQuad *);
163 extern const char * decQuadClassString(const decQuad *);
164 extern uint32_t decQuadDigits(const decQuad *);
165 extern uint32_t decQuadIsCanonical(const decQuad *);
166 extern uint32_t decQuadIsFinite(const decQuad *);
167 extern uint32_t decQuadIsInteger(const decQuad *);
168 extern uint32_t decQuadIsInfinite(const decQuad *);
169 extern uint32_t decQuadIsNaN(const decQuad *);
170 extern uint32_t decQuadIsNormal(const decQuad *);
171 extern uint32_t decQuadIsSignaling(const decQuad *);
172 extern uint32_t decQuadIsSignalling(const decQuad *);
173 extern uint32_t decQuadIsSigned(const decQuad *);
174 extern uint32_t decQuadIsSubnormal(const decQuad *);
175 extern uint32_t decQuadIsZero(const decQuad *);
176 extern uint32_t decQuadRadix(const decQuad *);
177 extern uint32_t decQuadSameQuantum(const decQuad *, const decQuad *);
178 extern const char * decQuadVersion(void);
179
180 /* decNumber conversions; these are implemented as macros so as not */
181 /* to force a dependency on decimal128 and decNumber in decQuad. */
7bd36a9c 182 /* decQuadFromNumber returns a decimal128 * to avoid warnings. */
2533577f 183 #define decQuadToNumber(dq, dn) decimal128ToNumber((decimal128 *)(dq), dn)
7bd36a9c 184 #define decQuadFromNumber(dq, dn, set) decimal128FromNumber((decimal128 *)(dq), dn, set)
2533577f
JJ
185
186#endif