@@ -69,8 +69,8 @@ enum class fltNonfiniteBehavior {
69
69
// encodings do not distinguish between signalling and quiet NaN.
70
70
NanOnly,
71
71
72
- // This behavior is present in Float6E3M2FN and Float6E2M3FN types,
73
- // which do not support Inf or NaN values.
72
+ // This behavior is present in Float6E3M2FN, Float6E2M3FN and
73
+ // Float4E2M1FN types, which do not support Inf or NaN values.
74
74
FiniteOnly,
75
75
};
76
76
@@ -147,6 +147,8 @@ static constexpr fltSemantics semFloat6E3M2FN = {
147
147
4 , -2 , 3 , 6 , fltNonfiniteBehavior::FiniteOnly};
148
148
static constexpr fltSemantics semFloat6E2M3FN = {
149
149
2 , 0 , 4 , 6 , fltNonfiniteBehavior::FiniteOnly};
150
+ static constexpr fltSemantics semFloat4E2M1FN = {
151
+ 2 , 0 , 2 , 4 , fltNonfiniteBehavior::FiniteOnly};
150
152
static constexpr fltSemantics semX87DoubleExtended = {16383 , -16382 , 64 , 80 };
151
153
static constexpr fltSemantics semBogus = {0 , 0 , 0 , 0 };
152
154
@@ -218,6 +220,8 @@ const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) {
218
220
return Float6E3M2FN ();
219
221
case S_Float6E2M3FN:
220
222
return Float6E2M3FN ();
223
+ case S_Float4E2M1FN:
224
+ return Float4E2M1FN ();
221
225
case S_x87DoubleExtended:
222
226
return x87DoubleExtended ();
223
227
}
@@ -254,6 +258,8 @@ APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) {
254
258
return S_Float6E3M2FN;
255
259
else if (&Sem == &llvm::APFloat::Float6E2M3FN ())
256
260
return S_Float6E2M3FN;
261
+ else if (&Sem == &llvm::APFloat::Float4E2M1FN ())
262
+ return S_Float4E2M1FN;
257
263
else if (&Sem == &llvm::APFloat::x87DoubleExtended ())
258
264
return S_x87DoubleExtended;
259
265
else
@@ -278,6 +284,7 @@ const fltSemantics &APFloatBase::Float8E4M3B11FNUZ() {
278
284
const fltSemantics &APFloatBase::FloatTF32 () { return semFloatTF32; }
279
285
const fltSemantics &APFloatBase::Float6E3M2FN () { return semFloat6E3M2FN; }
280
286
const fltSemantics &APFloatBase::Float6E2M3FN () { return semFloat6E2M3FN; }
287
+ const fltSemantics &APFloatBase::Float4E2M1FN () { return semFloat4E2M1FN; }
281
288
const fltSemantics &APFloatBase::x87DoubleExtended () {
282
289
return semX87DoubleExtended;
283
290
}
@@ -3640,6 +3647,11 @@ APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt() const {
3640
3647
return convertIEEEFloatToAPInt<semFloat6E2M3FN>();
3641
3648
}
3642
3649
3650
+ APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt () const {
3651
+ assert (partCount () == 1 );
3652
+ return convertIEEEFloatToAPInt<semFloat4E2M1FN>();
3653
+ }
3654
+
3643
3655
// This function creates an APInt that is just a bit map of the floating
3644
3656
// point constant as it would appear in memory. It is not a conversion,
3645
3657
// and treating the result as a normal integer is unlikely to be useful.
@@ -3687,6 +3699,9 @@ APInt IEEEFloat::bitcastToAPInt() const {
3687
3699
if (semantics == (const llvm::fltSemantics *)&semFloat6E2M3FN)
3688
3700
return convertFloat6E2M3FNAPFloatToAPInt ();
3689
3701
3702
+ if (semantics == (const llvm::fltSemantics *)&semFloat4E2M1FN)
3703
+ return convertFloat4E2M1FNAPFloatToAPInt ();
3704
+
3690
3705
assert (semantics == (const llvm::fltSemantics*)&semX87DoubleExtended &&
3691
3706
" unknown format!" );
3692
3707
return convertF80LongDoubleAPFloatToAPInt ();
@@ -3911,6 +3926,10 @@ void IEEEFloat::initFromFloat6E2M3FNAPInt(const APInt &api) {
3911
3926
initFromIEEEAPInt<semFloat6E2M3FN>(api);
3912
3927
}
3913
3928
3929
+ void IEEEFloat::initFromFloat4E2M1FNAPInt (const APInt &api) {
3930
+ initFromIEEEAPInt<semFloat4E2M1FN>(api);
3931
+ }
3932
+
3914
3933
// / Treat api as containing the bits of a floating point number.
3915
3934
void IEEEFloat::initFromAPInt (const fltSemantics *Sem, const APInt &api) {
3916
3935
assert (api.getBitWidth () == Sem->sizeInBits );
@@ -3944,6 +3963,8 @@ void IEEEFloat::initFromAPInt(const fltSemantics *Sem, const APInt &api) {
3944
3963
return initFromFloat6E3M2FNAPInt (api);
3945
3964
if (Sem == &semFloat6E2M3FN)
3946
3965
return initFromFloat6E2M3FNAPInt (api);
3966
+ if (Sem == &semFloat4E2M1FN)
3967
+ return initFromFloat4E2M1FNAPInt (api);
3947
3968
3948
3969
llvm_unreachable (nullptr );
3949
3970
}
0 commit comments