#version 450
#if defined(GL_AMD_gpu_shader_half_float)
#extension GL_AMD_gpu_shader_half_float : require
#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16)
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
#else
#error No extension available for FP16.
#endif
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require
#extension GL_EXT_bfloat16 : require
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(constant_id = 0) const bfloat16_t SPEC = bfloat16_t(4.5);
const float _64 = float(SPEC);
const double _70 = double(SPEC);
const float16_t _75 = float16_t(SPEC);

layout(set = 0, binding = 0, std430) buffer SSBO
{
    f16vec4 fp16[64];
    i16vec4 i16[64];
    u16vec4 u16[64];
} _23;

void main()
{
    bf16vec4 a = bf16vec4(_23.fp16[gl_LocalInvocationIndex]);
    bfloat16_t dot2 = dot(a.xy, a.zw);
    bfloat16_t dot3 = dot(a.xyz, a.zwx);
    bfloat16_t dot4 = dot(a, a);
    bf16vec4 constants = bf16vec4(bfloat16_t(1.0), bfloat16_t(2.0), bfloat16_t(-4.0), bfloat16_t(-8.0));
    float to_f32 = float(dot2);
    to_f32 = _64;
    double to_f64 = double(dot3);
    to_f64 = _70;
    float16_t to_f16 = float16_t(dot2);
    to_f16 = _75;
    i16vec4 i16cast = bfloat16BitsToIntEXT(bf16vec4(dot4));
    u16vec4 u16cast = bfloat16BitsToUintEXT(bf16vec4(dot4));
    dot4 = intBitsToBFloat16EXT(_23.i16[gl_LocalInvocationIndex]).x;
    dot4 = uintBitsToBFloat16EXT(u16cast).y;
}

