/* This testcase is part of GDB, the GNU debugger. Copyright 2025 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #define CHECK(cmd) \ { \ hipError_t error = cmd; \ if (error != hipSuccess) { \ fprintf(stderr, "error: '%s'(%d) at %s:%d\n", \ hipGetErrorString(error), error, __FILE__, __LINE__); \ exit(EXIT_FAILURE); \ } \ } __host__ __device__ void fp8e4m3_values () { /* FP8 E4M3 format +---------------+--------------------+ | Attribute | E4M3 | +---------------+--------------------+ | Inf | N/A | | NAN | S-1111-111 | | Zero | S-0000-000 | | Max Normal | S-1111-110: +-448 | | Min Normal | S-0001-000: +-2^-6 | | Max Subnorm | S-0000-111 | | Min Subnorm | S-0000-001 | +---------------+--------------------+ */ union u_e4m3 { /* type punning, interpret same memory as different types */ __amd_fp8x2_storage_t s; __hipext_ocp_fp8x2_e4m3 e; }; /* fp8_e4m3 +/- zero */ union u_e4m3 fp8e4m3zero {0x00 | 0x80 << 8}; /* nan */ union u_e4m3 fp8e4m3nan {0x7F | 0xFF << 8}; /* +/- normal maximum */ union u_e4m3 fp8e4m3nmax {0x7E | 0xFE << 8}; /* +/- normal minimum */ union u_e4m3 fp8e4m3nmin {0x08 | 0x88 << 8}; /* +/- normal random */ union u_e4m3 fp8e4m3nrndm {0x53 | 0xC9 << 8}; /* +/- subnormal maximum */ union u_e4m3 fp8e4m3smax {0x07 | 0x87 << 8}; /* +/- subnormal minimum */ union u_e4m3 fp8e4m3smin {0x01 | 0x81 << 8}; /* +/- subnormal random */ union u_e4m3 fp8e4m3srndm {0x09 | 0x85 << 8}; /* builtin fp8e4m3 +/- (sub)normal randoms */ __hipext_ocp_fp8_e4m3 e4m3 {112.00}; __hipext_ocp_fp8x2_e4m3 e4m3n {224.00, -128.00}; __hipext_ocp_fp8x2_e4m3 e4m3s {0.02734375, -0.00390625}; /* builtin uint8e8m0 */ __amd_scale_t e8m0 {-127}; /* break here 1 */ return; } __host__ __device__ void fp8e5m2_values () { /* FP8 E5M2 format +---------------+----------------------+ | Attribute | E5M2 | +---------------+----------------------+ | Inf | S-11111-00 | | NAN | S-11111-** | | Zero | S-00000-00 | | Max Normal | S-11110-11: +-57,344 | | Min Normal | S-00001-00: +-2^-14 | | Max Subnorm | S-00000-11 | | Min Subnorm | S-00000-01 | +---------------+----------------------+ */ union u_e5m2 { __amd_fp8x2_storage_t s; __hipext_ocp_fp8x2_e5m2 e; } u_e4m3; /* fp8_e5m2 +/- zero */ union u_e5m2 fp8e5m2zero {0x00 | 0x80 << 8}; /* fp8_e5m2 +/- infinity */ union u_e5m2 fp8e5m2inf {0x7C | 0xFC << 8}; /* fp8_e5m2 nan(s) */ union u_e5m2 fp8e5m2nan0 {0x7D | 0xFD << 8}; union u_e5m2 fp8e5m2nan1 {0x7E | 0xFE << 8}; union u_e5m2 fp8e5m2nan2 {0x7F | 0xFF << 8}; /* fp8_e5m2 +/- normal maximum */ union u_e5m2 fp8e5m2nmax {0x7B | 0xFB << 8}; /* fp8_e5m2 +/- normal minimum */ union u_e5m2 fp8e5m2nmin {0x04 | 0x84 << 8}; /* fp8_e5m2 +/- normal random */ union u_e5m2 fp8e5m2nrndm {0x41 | 0xA8 << 8}; /* fp8_e5m2 +/- subnormal maximum */ union u_e5m2 fp8e5m2smax {0x03 | 0x83 << 8}; /* fp8_e5m2 +/- subnormal minimum */ union u_e5m2 fp8e5m2smin {0x01 | 0x81 << 8}; /* fp8_e5m2 +/- subnormal random */ union u_e5m2 fp8e5m2srndm {0x02 | 0x82 << 8}; /* builtin fp8e5m2 +/- (sub)normal randoms */ __hipext_ocp_fp8_e5m2 e5m2 {-224.00}; __hipext_ocp_fp8x2_e5m2 e5m2n {28672.0, -3072.0}; __hipext_ocp_fp8x2_e5m2 e5m2s {0.000091552734375, -0.000030517578125}; /* builtin uint8e8m0 */ __amd_scale_t e8m0 {-126}; /* break here 2 */ return; } __host__ __device__ void fp6e2m3_values () { /* FP6 format +---------------+------------------------------------+ | Attribute | E2M3 | +---------------+------------------------------------+ | Infinities | N/A | | NaN | N/A | | Zeros | S-00-000 | | Max normal | S-11-111 = +-2^2 ×1.875 = +-7.5 | | Min normal | S-01-000 = +-2^0 ×1.0 = +-1.0 | | Max subnorm | S-00-111 = +-2^0 ×0.875 = +-0.875 | | Min subnorm | S-00-001 = +-2^0 ×0.125 = +-0.125 | +---------------+------------------------------------+ */ union u_e2m3 { __amd_fp6x32_storage_t s; __hipext_ocp_fp6x32_e2m3 e; }; /* fp6_e2m3 zeroes */ union u_e2m3 fp6e2m3zero {0x00 | 0x8 << 8}; /* fp6_e2m3 +/- normal maximum */ union u_e2m3 fp6e2m3nmax {0xDF | 0xF << 8}; /* fp6_e2m3 +/- normal minimum */ union u_e2m3 fp6e2m3nmin {0x08 | 0xA << 8}; /* fp6_e2m3 +/- normal random */ union u_e2m3 fp6e2m3nrndm {0x1A | 0xB << 8}; /* fp6_e2m3 +/- subnormal maximum */ union u_e2m3 fp6e2m3smax {0xC7 | 0x9 << 8}; /* fp6_e2m3 +/- subnormal minimum */ union u_e2m3 fp6e2m3smin {0x41 | 0x8 << 8}; /* fp6_e2m3 +/- subnormal random */ union u_e2m3 fp6e2m3srndm {0xC5 | 0x8 << 8}; /* builtin fp6e2m3 +/- (sub)normal randoms */ __amd_fp16x32_storage_t n {7.5, -1.25}; __hipext_ocp_fp6x32_e2m3 e2m3n {n, 0}; __amd_fp16x32_storage_t s {0.375, -0.125}; __hipext_ocp_fp6x32_e2m3 e2m3s {s, 0}; /* builtin uint8e8m0 */ __amd_scale_t e8m0 {-125}; /* break here 3 */ return; } __host__ __device__ void fp6e3m2_values () { /* FP6 format +---------------+-------------------------------------+ | Attribute | E3M2 | +---------------+-------------------------------------+ | Infinities | N/A | | NaN | N/A | | Zeros | S-000-00 | | Max normal | S-111-11 = +-2^4 ×1.75 = +-28.0 | | Min normal | S-001-00 = +-2^-2 ×1.0 = +-0.25 | | Max subnorm | S-000-11 = +-2^-2 ×0.75 = +-0.1875 | | Min subnorm | S-000-01 = +-2^-2 ×0.25 = +-0.0625 | +---------------+-------------------------------------+ */ union u_e3m2 { __amd_fp6x32_storage_t s; __hipext_ocp_fp6x32_e3m2 e; }; /* fp6_e3m2 zeroes */ union u_e3m2 fp6e3m2zero {0x00 | 0x8 << 8}; /* fp6_e3m2 +/- normal maximum */ union u_e3m2 fp6e3m2nmax {0xDF | 0xF << 8}; /* fp6_e3m2 +/- normal minimum */ union u_e3m2 fp6e3m2nmin {0x04 | 0x9 << 8}; /* fp6_e3m2 +/- normal random */ union u_e3m2 fp6e3m2nrndm {0x4B | 0xC << 8}; /* fp6_e3m2 +/- subnormal maximum */ union u_e3m2 fp6e3m2smax {0xC3 | 0x8 << 8}; /* fp6_e3m2 +/- subnormal minimum */ union u_e3m2 fp6e3m2smin {0x41 | 0x8 << 8}; /* fp6_e3m2 +/- subnormal random */ union u_e3m2 fp6e3m2srndm {0x82 | 0x8 << 8}; /* builtin fp6e3m2 +/- (sub)normal randoms */ __amd_fp16x32_storage_t n {14.0, -1.25}; __hipext_ocp_fp6x32_e3m2 e3m2n {n, 0}; __amd_fp16x32_storage_t s {0.125, -0.75}; __hipext_ocp_fp6x32_e3m2 e3m2s {s, 0}; /* builtin uint8e8m0 */ __amd_scale_t e8m0 {-124}; /* break here 4 */ return; } __host__ __device__ void fp4e2m1_values () { /* FP4 format +---------------+------------------------------+ | Attribute | E2M1 | +---------------+------------------------------+ | Infinities | N/A | | NaN | N/A | | Zeros | S-00-0 | | Max normal | S-11-1 = +-2^2 ×1.5 = +-6.0 | | Min normal | S-01-0 = +-2^0 ×1.0 = +-1.0 | | Max subnorm | S-00-1 = +-2^0 ×0.5 = +-0.5 | | Min subnorm | S-00-1 = +-2^0 ×0.5 = +-0.5 | +---------------+------------------------------+ */ union u_e2m1 { __amd_fp4x2_storage_t s; __hipext_ocp_fp4x2_e2m1 e; }; /* fp4_e2mi zeroes */ union u_e2m1 fp4e2m1zero {0x80}; /* fp4_e2mi +/- normal maximum */ union u_e2m1 fp4e2m1nmax {0xF7}; /* fp4_e2mi +/- normal minimum */ union u_e2m1 fp4e2m1nmin {0xA2}; /* fp4_e2mi +/- normal random */ union u_e2m1 fp4e2m1nrndm {0xC5}; /* fp4_e2mi +/- subnormal maximum */ union u_e2m1 fp4e2m1smax {0x91}; /* fp4_e2mi +/- subnormal minimum */ union u_e2m1 fp4e2m1smin {0x91}; /* fp4_e2mi +/- subnormal random */ union u_e2m1 fp4e2m1srndm {0x91}; /* builtin fp4 +/- (sub)normal randoms */ __amd_floatx2_storage_t n {3.0, -1.5}; __hipext_ocp_fp4x2_e2m1 e2m1n {n, 0}; __amd_floatx2_storage_t s {0.5, -0.5}; __hipext_ocp_fp4x2_e2m1 e2m1s {s, 0}; /* builtin uint8e8m0 */ __amd_scale_t e8m0 {-123}; /* break here 5 */ return; } __host__ __device__ void do_fpmx_pretty_printer () { fp8e4m3_values (); fp8e5m2_values (); fp6e2m3_values (); fp6e3m2_values (); fp4e2m1_values (); } __global__ void do_fpmx_pretty_printer_device () { do_fpmx_pretty_printer (); } void do_fpmx_pretty_printer_host () { do_fpmx_pretty_printer (); } int main () { do_fpmx_pretty_printer_device<<>> (); CHECK (hipDeviceSynchronize ()); do_fpmx_pretty_printer_host (); return 0; }