@@ -101,6 +101,8 @@ enum class fltNanEncoding {
101
101
102
102
/* Represents floating point arithmetic semantics. */
103
103
struct fltSemantics {
104
+ APFloat::Semantics name;
105
+
104
106
/* The largest E such that 2^E is representable; this matches the
105
107
definition of IEEE 754. */
106
108
APFloatBase::ExponentType maxExponent;
@@ -135,75 +137,54 @@ struct fltSemantics {
135
137
}
136
138
};
137
139
138
- static constexpr fltSemantics semIEEEhalf = {15 , -14 , 11 , 16 };
139
- static constexpr fltSemantics semBFloat = {127 , -126 , 8 , 16 };
140
- static constexpr fltSemantics semIEEEsingle = {127 , -126 , 24 , 32 };
141
- static constexpr fltSemantics semIEEEdouble = {1023 , -1022 , 53 , 64 };
142
- static constexpr fltSemantics semIEEEquad = {16383 , -16382 , 113 , 128 };
143
- static constexpr fltSemantics semFloat8E5M2 = {15 , -14 , 3 , 8 };
140
+ static constexpr fltSemantics semIEEEhalf = {
141
+ APFloatBase::S_IEEEhalf, 15 , -14 , 11 , 16 };
142
+ static constexpr fltSemantics semBFloat = {
143
+ APFloatBase::S_BFloat, 127 , -126 , 8 , 16 };
144
+ static constexpr fltSemantics semIEEEsingle = {
145
+ APFloatBase::S_IEEEsingle, 127 , -126 , 24 , 32 };
146
+ static constexpr fltSemantics semIEEEdouble = {
147
+ APFloatBase::S_IEEEdouble, 1023 , -1022 , 53 , 64 };
148
+ static constexpr fltSemantics semIEEEquad = {
149
+ APFloatBase::S_IEEEquad, 16383 , -16382 , 113 , 128 };
150
+ static constexpr fltSemantics semFloat8E5M2 = {
151
+ APFloatBase::S_Float8E5M2, 15 , -14 , 3 , 8 };
144
152
static constexpr fltSemantics semFloat8E5M2FNUZ = {
145
- 15 , -15 , 3 , 8 , fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};
146
- static constexpr fltSemantics semFloat8E4M3 = {7 , -6 , 4 , 8 };
153
+ APFloatBase::S_Float8E5M2FNUZ, 15 , -15 , 3 , 8 , fltNonfiniteBehavior::NanOnly,
154
+ fltNanEncoding::NegativeZero};
155
+ static constexpr fltSemantics semFloat8E4M3 = {
156
+ APFloatBase::S_Float8E4M3, 7 , -6 , 4 , 8 };
147
157
static constexpr fltSemantics semFloat8E4M3FN = {
148
- 8 , -6 , 4 , 8 , fltNonfiniteBehavior::NanOnly, fltNanEncoding::AllOnes};
158
+ APFloatBase::S_Float8E4M3FN, 8 , -6 , 4 , 8 , fltNonfiniteBehavior::NanOnly,
159
+ fltNanEncoding::AllOnes};
149
160
static constexpr fltSemantics semFloat8E4M3FNUZ = {
150
- 7 , -7 , 4 , 8 , fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};
161
+ APFloatBase::S_Float8E4M3FNUZ, 7 , -7 , 4 , 8 , fltNonfiniteBehavior::NanOnly,
162
+ fltNanEncoding::NegativeZero};
151
163
static constexpr fltSemantics semFloat8E4M3B11FNUZ = {
152
- 4 , -10 , 4 , 8 , fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};
153
- static constexpr fltSemantics semFloat8E3M4 = {3 , -2 , 5 , 8 };
154
- static constexpr fltSemantics semFloatTF32 = {127 , -126 , 11 , 19 };
164
+ APFloatBase::S_Float8E4M3B11FNUZ, 4 , -10 , 4 , 8 , fltNonfiniteBehavior::NanOnly,
165
+ fltNanEncoding::NegativeZero};
166
+ static constexpr fltSemantics semFloat8E3M4 = {
167
+ APFloatBase::S_Float8E3M4, 3 , -2 , 5 , 8 };
168
+ static constexpr fltSemantics semFloatTF32 = {
169
+ APFloatBase::S_FloatTF32, 127 , -126 , 11 , 19 };
155
170
static constexpr fltSemantics semFloat8E8M0FNU = {
156
- 127 , -127 , 1 , 8 , fltNonfiniteBehavior::NanOnly, fltNanEncoding::AllOnes,
157
- false , false };
158
-
171
+ APFloatBase::S_Float8E8M0FNU, 127 , -127 , 1 , 8 , fltNonfiniteBehavior::NanOnly,
172
+ fltNanEncoding::AllOnes, false , false };
159
173
static constexpr fltSemantics semFloat6E3M2FN = {
160
- 4 , -2 , 3 , 6 , fltNonfiniteBehavior::FiniteOnly};
174
+ APFloatBase::S_Float6E3M2FN, 4 , -2 , 3 , 6 , fltNonfiniteBehavior::FiniteOnly};
161
175
static constexpr fltSemantics semFloat6E2M3FN = {
162
- 2 , 0 , 4 , 6 , fltNonfiniteBehavior::FiniteOnly};
176
+ APFloatBase::S_Float6E2M3FN, 2 , 0 , 4 , 6 , fltNonfiniteBehavior::FiniteOnly};
163
177
static constexpr fltSemantics semFloat4E2M1FN = {
164
- 2 , 0 , 2 , 4 , fltNonfiniteBehavior::FiniteOnly};
165
- static constexpr fltSemantics semX87DoubleExtended = {16383 , -16382 , 64 , 80 };
166
- static constexpr fltSemantics semBogus = {0 , 0 , 0 , 0 };
167
-
168
- /* The IBM double-double semantics. Such a number consists of a pair of IEEE
169
- 64-bit doubles (Hi, Lo), where |Hi| > |Lo|, and if normal,
170
- (double)(Hi + Lo) == Hi. The numeric value it's modeling is Hi + Lo.
171
- Therefore it has two 53-bit mantissa parts that aren't necessarily adjacent
172
- to each other, and two 11-bit exponents.
173
-
174
- Note: we need to make the value different from semBogus as otherwise
175
- an unsafe optimization may collapse both values to a single address,
176
- and we heavily rely on them having distinct addresses. */
177
- static constexpr fltSemantics semPPCDoubleDouble = {-1 , 0 , 0 , 128 };
178
-
179
- /* These are legacy semantics for the fallback, inaccrurate implementation of
180
- IBM double-double, if the accurate semPPCDoubleDouble doesn't handle the
181
- operation. It's equivalent to having an IEEE number with consecutive 106
182
- bits of mantissa and 11 bits of exponent.
183
-
184
- It's not equivalent to IBM double-double. For example, a legit IBM
185
- double-double, 1 + epsilon:
178
+ APFloatBase::S_Float4E2M1FN, 2 , 0 , 2 , 4 , fltNonfiniteBehavior::FiniteOnly};
179
+ static constexpr fltSemantics semX87DoubleExtended = {
180
+ APFloatBase::S_x87DoubleExtended, 16383 , -16382 , 64 , 80 };
181
+ static constexpr fltSemantics semBogus = {APFloatBase::S_Bogus, 0 , 0 , 0 , 0 };
182
+ static constexpr fltSemantics semPPCDoubleDouble = {APFloatBase::S_PPCDoubleDouble, -1 , 0 , 0 , 128 };
186
183
187
- 1 + epsilon = 1 + (1 >> 1076)
188
-
189
- is not representable by a consecutive 106 bits of mantissa.
190
-
191
- Currently, these semantics are used in the following way:
192
-
193
- semPPCDoubleDouble -> (IEEEdouble, IEEEdouble) ->
194
- (64-bit APInt, 64-bit APInt) -> (128-bit APInt) ->
195
- semPPCDoubleDoubleLegacy -> IEEE operations
196
-
197
- We use bitcastToAPInt() to get the bit representation (in APInt) of the
198
- underlying IEEEdouble, then use the APInt constructor to construct the
199
- legacy IEEE float.
200
-
201
- TODO: Implement all operations in semPPCDoubleDouble, and delete these
202
- semantics. */
203
- static constexpr fltSemantics semPPCDoubleDoubleLegacy = {1023 , -1022 + 53 ,
184
+ static constexpr fltSemantics semPPCDoubleDoubleLegacy = {APFloatBase::S_PPCDoubleDoubleLegacy, 1023 , -1022 + 53 ,
204
185
53 + 53 , 128 };
205
186
206
- const llvm::fltSemantics &APFloatBase::EnumToSemantics (Semantics S) {
187
+ const llvm::fltSemantics &APFloatBase::getSemantics (Semantics S) {
207
188
switch (S) {
208
189
case S_IEEEhalf:
209
190
return IEEEhalf ();
@@ -217,6 +198,8 @@ const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) {
217
198
return IEEEquad ();
218
199
case S_PPCDoubleDouble:
219
200
return PPCDoubleDouble ();
201
+ case S_PPCDoubleDoubleLegacy:
202
+ return semPPCDoubleDoubleLegacy;
220
203
case S_Float8E5M2:
221
204
return Float8E5M2 ();
222
205
case S_Float8E5M2FNUZ:
@@ -243,52 +226,15 @@ const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) {
243
226
return Float4E2M1FN ();
244
227
case S_x87DoubleExtended:
245
228
return x87DoubleExtended ();
229
+ case S_Bogus:
230
+ return Bogus ();
246
231
}
247
232
llvm_unreachable (" Unrecognised floating semantics" );
248
233
}
249
234
250
235
APFloatBase::Semantics
251
236
APFloatBase::SemanticsToEnum (const llvm::fltSemantics &Sem) {
252
- if (&Sem == &llvm::APFloat::IEEEhalf ())
253
- return S_IEEEhalf;
254
- else if (&Sem == &llvm::APFloat::BFloat ())
255
- return S_BFloat;
256
- else if (&Sem == &llvm::APFloat::IEEEsingle ())
257
- return S_IEEEsingle;
258
- else if (&Sem == &llvm::APFloat::IEEEdouble ())
259
- return S_IEEEdouble;
260
- else if (&Sem == &llvm::APFloat::IEEEquad ())
261
- return S_IEEEquad;
262
- else if (&Sem == &llvm::APFloat::PPCDoubleDouble ())
263
- return S_PPCDoubleDouble;
264
- else if (&Sem == &llvm::APFloat::Float8E5M2 ())
265
- return S_Float8E5M2;
266
- else if (&Sem == &llvm::APFloat::Float8E5M2FNUZ ())
267
- return S_Float8E5M2FNUZ;
268
- else if (&Sem == &llvm::APFloat::Float8E4M3 ())
269
- return S_Float8E4M3;
270
- else if (&Sem == &llvm::APFloat::Float8E4M3FN ())
271
- return S_Float8E4M3FN;
272
- else if (&Sem == &llvm::APFloat::Float8E4M3FNUZ ())
273
- return S_Float8E4M3FNUZ;
274
- else if (&Sem == &llvm::APFloat::Float8E4M3B11FNUZ ())
275
- return S_Float8E4M3B11FNUZ;
276
- else if (&Sem == &llvm::APFloat::Float8E3M4 ())
277
- return S_Float8E3M4;
278
- else if (&Sem == &llvm::APFloat::FloatTF32 ())
279
- return S_FloatTF32;
280
- else if (&Sem == &llvm::APFloat::Float8E8M0FNU ())
281
- return S_Float8E8M0FNU;
282
- else if (&Sem == &llvm::APFloat::Float6E3M2FN ())
283
- return S_Float6E3M2FN;
284
- else if (&Sem == &llvm::APFloat::Float6E2M3FN ())
285
- return S_Float6E2M3FN;
286
- else if (&Sem == &llvm::APFloat::Float4E2M1FN ())
287
- return S_Float4E2M1FN;
288
- else if (&Sem == &llvm::APFloat::x87DoubleExtended ())
289
- return S_x87DoubleExtended;
290
- else
291
- llvm_unreachable (" Unknown floating semantics" );
237
+ return Sem.name ;
292
238
}
293
239
294
240
const fltSemantics &APFloatBase::IEEEhalf () { return semIEEEhalf; }
@@ -3038,7 +2984,7 @@ IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,
3038
2984
unsigned sigPartCount, int exp,
3039
2985
roundingMode rounding_mode) {
3040
2986
unsigned int parts, pow5PartCount;
3041
- fltSemantics calcSemantics = { 32767 , -32767 , 0 , 0 };
2987
+ fltSemantics calcSemantics = { APFloatBase::S_MaxSemantics, 32767 , -32767 , 0 , 0 };
3042
2988
integerPart pow5Parts[maxPowerOfFiveParts];
3043
2989
bool isNearest;
3044
2990
0 commit comments