fpu: Export unpack_canonical and round_pack_canonical routines
Export the unpacking and repacking into the various formats. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Richard Henderson committed
Apr 25, 2026 at 20:57 UTC
5511af9044ec751f064683c26b6978bf4a85b89f
2 files changed
+49
-28
fpu/softfloat.c
+19
-28
@@ -1296,21 +1296,21 @@ static const uint16_t rsqrt_tab[128] = {
1296
* Pack/unpack routines with a specific FloatFmt.
1297
*/
1298
1299
-static FloatParts64 float4_e2m1_unpack_canonical(float4_e2m1 f, float_status *s)
1299
+FloatParts64 float4_e2m1_unpack_canonical(float4_e2m1 f, float_status *s)
1300
{
1301
FloatParts64 p = unpack_raw64(&float4_e2m1_params, f);
1302
parts64_canonicalize(&p, s, &float4_e2m1_params);
1303
return p;
1304
}
1305
1306
-static FloatParts64 float8_e4m3_unpack_canonical(float8_e4m3 f, float_status *s)
1306
+FloatParts64 float8_e4m3_unpack_canonical(float8_e4m3 f, float_status *s)
1307
{
1308
FloatParts64 p = unpack_raw64(&float8_e4m3_params, f);
1309
parts64_canonicalize(&p, s, &float8_e4m3_params);
1310
return p;
1311
}
1312
1313
-static FloatParts64 float8_e5m2_unpack_canonical(float8_e5m2 f, float_status *s)
1313
+FloatParts64 float8_e5m2_unpack_canonical(float8_e5m2 f, float_status *s)
1314
{
1315
FloatParts64 p = unpack_raw64(&float8_e5m2_params, f);
1316
parts64_canonicalize(&p, s, &float8_e5m2_params);
@@ -1325,29 +1325,27 @@ static FloatParts64 float16a_unpack_canonical(float16 f, float_status *s,
1325
return p;
1326
}
1327
1328
-static FloatParts64 float16_unpack_canonical(float16 f, float_status *s)
1328
+FloatParts64 float16_unpack_canonical(float16 f, float_status *s)
1329
{
1330
return float16a_unpack_canonical(f, s, &float16_params);
1331
}
1332
1333
-static FloatParts64 bfloat16_unpack_canonical(bfloat16 f, float_status *s)
1333
+FloatParts64 bfloat16_unpack_canonical(bfloat16 f, float_status *s)
1334
{
1335
FloatParts64 p = unpack_raw64(&bfloat16_params, f);
1336
parts64_canonicalize(&p, s, &bfloat16_params);
1337
return p;
1338
}
1339
1340
-static float8_e4m3 float8_e4m3_round_pack_canonical(FloatParts64 *p,
1341
- float_status *s,
1342
- bool saturate)
1340
+float8_e4m3 float8_e4m3_round_pack_canonical(FloatParts64 *p, float_status *s,
1341
+ bool saturate)
1342
{
1343
parts64_uncanon(p, s, &float8_e4m3_params, saturate);
1344
return pack_raw64(p, &float8_e4m3_params);
1345
}
1346
1348
-static float8_e5m2 float8_e5m2_round_pack_canonical(FloatParts64 *p,
1349
- float_status *s,
1350
- bool saturate)
1347
+float8_e5m2 float8_e5m2_round_pack_canonical(FloatParts64 *p, float_status *s,
1348
+ bool saturate)
1349
{
1350
parts64_uncanon(p, s, &float8_e5m2_params, saturate);
1351
return pack_raw64(p, &float8_e5m2_params);
@@ -1361,42 +1359,38 @@ static float16 float16a_round_pack_canonical(FloatParts64 *p,
1359
return pack_raw64(p, &float16_params);
1360
}
1361
1364
-static float16 float16_round_pack_canonical(FloatParts64 *p,
1365
- float_status *s)
1362
+float16 float16_round_pack_canonical(FloatParts64 *p, float_status *s)
1363
{
1364
return float16a_round_pack_canonical(p, s, &float16_params);
1365
}
1366
1370
-static bfloat16 bfloat16_round_pack_canonical(FloatParts64 *p,
1371
- float_status *s)
1367
+bfloat16 bfloat16_round_pack_canonical(FloatParts64 *p, float_status *s)
1368
{
1369
parts64_uncanon(p, s, &bfloat16_params, false);
1370
return pack_raw64(p, &bfloat16_params);
1371
}
1372
1377
-static FloatParts64 float32_unpack_canonical(float32 f, float_status *s)
1373
+FloatParts64 float32_unpack_canonical(float32 f, float_status *s)
1374
{
1375
FloatParts64 p = unpack_raw64(&float32_params, f);
1376
parts64_canonicalize(&p, s, &float32_params);
1377
return p;
1378
}
1379
1384
-static float32 float32_round_pack_canonical(FloatParts64 *p,
1385
- float_status *s)
1380
+float32 float32_round_pack_canonical(FloatParts64 *p, float_status *s)
1381
{
1382
parts64_uncanon(p, s, &float32_params, false);
1383
return pack_raw64(p, &float32_params);
1384
}
1385
1391
-static FloatParts64 float64_unpack_canonical(float64 f, float_status *s)
1386
+FloatParts64 float64_unpack_canonical(float64 f, float_status *s)
1387
{
1388
FloatParts64 p = unpack_raw64(&float64_params, f);
1389
parts64_canonicalize(&p, s, &float64_params);
1390
return p;
1391
}
1392
1398
-static float64 float64_round_pack_canonical(FloatParts64 *p,
1399
- float_status *s)
1393
+float64 float64_round_pack_canonical(FloatParts64 *p, float_status *s)
1394
{
1395
parts64_uncanon(p, s, &float64_params, false);
1396
return pack_raw64(p, &float64_params);
@@ -1451,23 +1445,21 @@ static float64 float64r32_round_pack_canonical(FloatParts64 *p,
1445
return float64r32_pack_raw(p);
1446
}
1447
1454
-static FloatParts128 float128_unpack_canonical(float128 f, float_status *s)
1448
+FloatParts128 float128_unpack_canonical(float128 f, float_status *s)
1449
{
1450
FloatParts128 p = float128_unpack_raw(f);
1451
parts128_canonicalize(&p, s, &float128_params);
1452
return p;
1453
}
1454
1461
-static float128 float128_round_pack_canonical(FloatParts128 *p,
1462
- float_status *s)
1455
+float128 float128_round_pack_canonical(FloatParts128 *p, float_status *s)
1456
{
1457
parts128_uncanon(p, s, &float128_params, false);
1458
return float128_pack_raw(p);
1459
}
1460
1461
/* Returns false if the encoding is invalid. */
1469
-static bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f,
1470
- float_status *s)
1462
+bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f, float_status *s)
1463
{
1464
/* Ensure rounding precision is set before beginning. */
1465
switch (s->floatx80_rounding_precision) {
@@ -1503,8 +1495,7 @@ static bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f,
1495
return true;
1496
}
1497
1506
-static floatx80 floatx80_round_pack_canonical(FloatParts128 *p,
1507
- float_status *s)
1498
+floatx80 floatx80_round_pack_canonical(FloatParts128 *p, float_status *s)
1499
{
1500
const FloatFmt *fmt = &floatx80_params[s->floatx80_rounding_precision];
1501
uint64_t frac;
include/fpu/softfloat-parts.h
+30
@@ -133,4 +133,34 @@ typedef struct {
133
uint64_t frac_lo;
134
} FloatParts128;
135
136
+/*
137
+ * Unpack routines from a specific floating-point format.
138
+ */
139
+
140
+FloatParts64 float4_e2m1_unpack_canonical(float4_e2m1 f, float_status *s);
141
+FloatParts64 float8_e4m3_unpack_canonical(float8_e4m3 f, float_status *s);
142
+FloatParts64 float8_e5m2_unpack_canonical(float8_e5m2 f, float_status *s);
143
+FloatParts64 float16_unpack_canonical(float16 f, float_status *s);
144
+FloatParts64 bfloat16_unpack_canonical(bfloat16 f, float_status *s);
145
+FloatParts64 float32_unpack_canonical(float32 f, float_status *s);
146
+FloatParts64 float64_unpack_canonical(float64 f, float_status *s);
147
+FloatParts128 float128_unpack_canonical(float128 f, float_status *s);
148
+/* Returns false if the encoding is invalid. */
149
+bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f, float_status *s);
150
+
151
+/*
152
+ * Pack routines to a specific floating-point format.
153
+ */
154
+
155
+float8_e4m3 float8_e4m3_round_pack_canonical(FloatParts64 *p, float_status *s,
156
+ bool saturate);
157
+float8_e5m2 float8_e5m2_round_pack_canonical(FloatParts64 *p, float_status *s,
158
+ bool saturate);
159
+float16 float16_round_pack_canonical(FloatParts64 *p, float_status *s);
160
+bfloat16 bfloat16_round_pack_canonical(FloatParts64 *p, float_status *s);
161
+float32 float32_round_pack_canonical(FloatParts64 *p, float_status *s);
162
+float64 float64_round_pack_canonical(FloatParts64 *p, float_status *s);
163
+float128 float128_round_pack_canonical(FloatParts128 *p, float_status *s);
164
+floatx80 floatx80_round_pack_canonical(FloatParts128 *p, float_status *s);
165
+
166
#endif