char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Ruben Ortlamvulkan: use spec constant for matrix matrix multiplication A-type (#25773)91f6a6cf3

char/aliceai-t5-moe
53.3 KiB1495 linesraw
1
2// Each format defines a scalar dequantFunc<T> plus a V=4 dequantFunc<T>_v
3// passed as the optional vector decoder to coopMatLoadTensorNV via
4// GL_NV_cooperative_matrix_decode_vector. When the driver doesn't support
5// the extension, ggml-vulkan.cpp strips it from the compiled SPIR-V.
6#ifdef GL_NV_cooperative_matrix_decode_vector
7#extension GL_NV_cooperative_matrix_decode_vector : enable
8#endif
9
10#include "types.glsl"
11
12layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufF32 {
13   vec4 block;
14};
15
16float16_t dequantFuncF32(const in decodeBufF32 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
17{
18    const vec4 v = bl.block;
19    const uint idx = coordInBlock[1];
20    const f16vec4 vf16 = f16vec4(v);
21    return vf16[idx];
22}
23
24layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ1_0 {
25   block_q1_0 block;
26};
27
28float16_t dequantFuncQ1_0(const in decodeBufQ1_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
29{
30    const float16_t d = bl.block.d;
31    const uint idx = coordInBlock[1];
32    const uint bit = (uint(bl.block.qs[(idx & 0x78) >> 3]) >> (idx & 0x7)) & 1u;
33    return bit != 0u ? d : -d;
34}
35
36f16vec4 dequantFuncQ1_0_v(const in decodeBufQ1_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
37{
38    const float16_t d  = bl.block.d;
39    const float16_t md = -d;
40    const uint idx = coordInBlock[1];
41    const uint qs_nib = uint(bl.block.qs[idx >> 3]) >> (idx & 0x4u);
42    return f16vec4(
43        (qs_nib & 1u) != 0u ? d : md,
44        (qs_nib & 2u) != 0u ? d : md,
45        (qs_nib & 4u) != 0u ? d : md,
46        (qs_nib & 8u) != 0u ? d : md);
47}
48
49layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ2_0 {
50   block_q2_0 block;
51};
52
53float16_t dequantFuncQ2_0(const in decodeBufQ2_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
54{
55    const float16_t d = bl.block.d;
56    const uint idx = coordInBlock[1];
57    const uint bits = uint(bl.block.qs[idx >> 2]) >> (2u * (idx & 3u));
58    return (float16_t(bits & 3u) - float16_t(1.0)) * d;
59}
60
61f16vec4 dequantFuncQ2_0_v(const in decodeBufQ2_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
62{
63    const float16_t d = bl.block.d;
64    const uint idx = coordInBlock[1];
65    const uint bits = uint(bl.block.qs[idx >> 2]);
66    return f16vec4((vec4(bits & 3u, (bits >> 2u) & 3u, (bits >> 4u) & 3u, bits >> 6u) - 1.0f) * float(d));
67}
68
69layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ4_0 {
70   block_q4_0_packed16 block;
71};
72
73float16_t dequantFuncQ4_0(const in decodeBufQ4_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
74{
75    const float16_t d = bl.block.d;
76    const uint idx = coordInBlock[1];
77    const uint shift = (idx & 0x10) >> 2;
78    uint32_t qs = uint32_t(bl.block.qs[(idx & 0xE) >> 1]);
79    qs >>= shift;
80    qs &= 0x0F0F;
81    qs = unpack8(qs)[idx & 1];
82    float16_t ret = (float16_t(qs) - float16_t(8)) * d;
83    return ret;
84}
85
86f16vec4 dequantFuncQ4_0_v(const in decodeBufQ4_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
87{
88    const float16_t d = bl.block.d;
89    const uint idx = coordInBlock[1];
90    const uint shift = (idx & 0x10) >> 2;     // 0 or 4
91    const uint qs_i = (idx & 0xE) >> 1;       // even, in {0,2,4,6}
92    const uint qsw = uint32_t(bl.block.qs[qs_i    ])
93                   | (uint32_t(bl.block.qs[qs_i + 1u]) << 16);
94    // shift in {0,4}: per-byte mask 0x0F isolates the wanted nibble in each byte.
95    const uint q4   = (qsw >> shift) & 0x0F0F0F0Fu;
96    const u8vec4 q  = unpack8(q4);
97    return f16vec4((vec4(q) - vec4(8.0)) * vec4(float(d)));
98}
99
100layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufQ4_1 {
101   block_q4_1 block;
102};
103
104layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufQ4_1_packed32 {
105   block_q4_1_packed32 block;
106};
107
108float16_t dequantFuncQ4_1(const in decodeBufQ4_1 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
109{
110    const float16_t d = bl.block.d;
111    const float16_t m = bl.block.m;
112    const uint idx = coordInBlock[1];
113    const uint iqs = idx & 0xF;
114    const uint shift = (idx & 0x10) >> 2;
115    uint32_t qs = bl.block.qs[iqs];
116    qs >>= shift;
117    qs &= 0xF;
118    float16_t ret = float16_t(qs) * d + m;
119    return ret;
120}
121
122f16vec4 dequantFuncQ4_1_v(const in decodeBufQ4_1 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
123{
124    decodeBufQ4_1_packed32 bl32 = decodeBufQ4_1_packed32(bl);
125    const float16_t d = bl.block.d;
126    const float16_t m = bl.block.m;
127    const uint idx = coordInBlock[1];
128    const uint shift = (idx & 0x10) >> 2;     // 0 or 4
129    const uint qs_w  = (idx & 0xC) >> 2;      // iqs / 4 in [0,4)
130    const uint qsw   = uint32_t(bl32.block.qs[qs_w]);
131    const u8vec4 q   = unpack8((qsw >> shift) & 0x0F0F0F0Fu);
132    return f16vec4(vec4(q) * vec4(float(d)) + vec4(float(m)));
133}
134
135layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ5_0 {
136   block_q5_0 block;
137};
138
139layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ5_0_packed16 {
140   block_q5_0_packed16 block;
141};
142
143float16_t dequantFuncQ5_0(const in decodeBufQ5_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
144{
145    const float16_t d = bl.block.d;
146    const uint idx = coordInBlock[1];
147    const uint iqs = idx & 0xF;
148
149    const uint uint_qh = uint(bl.block.qh[1]) << 16 | bl.block.qh[0];
150    const uint qh = ((uint_qh >> idx) << 4) & 0x10;
151
152    const uint shift = (idx & 0x10) >> 2;
153    uint32_t qs = bl.block.qs[iqs];
154    qs >>= shift;
155    qs &= 0xF;
156
157    float16_t ret = (float16_t(qs | qh) - float16_t(16)) * d;
158    return ret;
159}
160
161f16vec4 dequantFuncQ5_0_v(const in decodeBufQ5_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
162{
163    decodeBufQ5_0_packed16 bl16 = decodeBufQ5_0_packed16(bl);
164    const float16_t d = bl.block.d;
165    const uint idx = coordInBlock[1];
166    const uint shift = (idx & 0x10) >> 2;     // 0 or 4
167    const uint qs_i  = (idx & 0xC) >> 1;      // packed16 word index, in {0,2,4,6}
168    const uint qsw = uint32_t(bl16.block.qs[qs_i    ])
169                   | (uint32_t(bl16.block.qs[qs_i + 1u]) << 16);
170    const u8vec4 ql = unpack8((qsw >> shift) & 0x0F0F0F0Fu);
171
172    const uint uint_qh = uint(bl16.block.qh[1]) << 16 | uint(bl16.block.qh[0]);
173    const uint qh_pack = uint_qh >> idx;      // bits 0..3 = element idx..idx+3 high bits
174    const uvec4 qh_high = (uvec4(qh_pack, qh_pack >> 1u, qh_pack >> 2u, qh_pack >> 3u) & uvec4(0x01u)) << 4u;
175
176    return f16vec4((vec4(ql) + vec4(qh_high) - vec4(16.0)) * vec4(float(d)));
177}
178
179layout(buffer_reference, std430, buffer_reference_align = 8) buffer decodeBufQ5_1 {
180   block_q5_1 block;
181};
182
183layout(buffer_reference, std430, buffer_reference_align = 8) buffer decodeBufQ5_1_packed32 {
184   block_q5_1_packed32 block;
185};
186
187float16_t dequantFuncQ5_1(const in decodeBufQ5_1 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
188{
189    const float16_t d = bl.block.d;
190    const float16_t m = bl.block.m;
191    const uint idx = coordInBlock[1];
192    const uint iqs = idx & 0xF;
193
194    const uint uint_qh = bl.block.qh;
195    const uint qh = ((uint_qh >> idx) << 4) & 0x10;
196
197    const uint shift = (idx & 0x10) >> 2;
198    uint32_t qs = bl.block.qs[iqs];
199    qs >>= shift;
200    qs &= 0xF;
201
202    float16_t ret = float16_t(qs | qh) * d + m;
203    return ret;
204}
205
206f16vec4 dequantFuncQ5_1_v(const in decodeBufQ5_1 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
207{
208    decodeBufQ5_1_packed32 bl32 = decodeBufQ5_1_packed32(bl);
209    const float16_t d = bl.block.d;
210    const float16_t m = bl.block.m;
211    const uint idx = coordInBlock[1];
212    const uint shift = (idx & 0x10) >> 2;     // 0 or 4
213    const uint qs_w  = (idx & 0xC) >> 2;      // iqs / 4 in [0,4)
214    const uint qsw   = uint32_t(bl32.block.qs[qs_w]);
215    const u8vec4 ql  = unpack8((qsw >> shift) & 0x0F0F0F0Fu);
216
217    const uint qh_pack = bl.block.qh >> idx;  // bits 0..3 = element idx..idx+3 high bits
218    const uvec4 qh_high = (uvec4(qh_pack, qh_pack >> 1u, qh_pack >> 2u, qh_pack >> 3u) & uvec4(0x01u)) << 4u;
219
220    return f16vec4((vec4(ql) + vec4(qh_high)) * vec4(float(d)) + vec4(float(m)));
221}
222
223layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ8_0 {
224   block_q8_0_packed16 block;
225};
226
227float16_t dequantFuncQ8_0(const in decodeBufQ8_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
228{
229    const float16_t d = bl.block.d;
230    const uint idx = coordInBlock[1];
231    const uint iqs = idx;
232
233    // Load 16b and select the byte for this element
234    int32_t qs = unpack8(bl.block.qs[(iqs & 0x1E) >> 1])[iqs & 1];
235    float16_t ret = float16_t(qs) * d;
236    return ret;
237}
238
239f16vec4 dequantFuncQ8_0_v(const in decodeBufQ8_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
240{
241    const float16_t d = bl.block.d;
242    const uint idx = coordInBlock[1];
243    const uint base = idx >> 1u;
244    const uint w =  uint(uint16_t(bl.block.qs[base]))
245                 | (uint(uint16_t(bl.block.qs[base + 1u])) << 16u);
246    const i8vec4 qi = unpack8(int32_t(w));
247    return f16vec4(vec4(qi) * vec4(float(d)));
248}
249
250layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufTQ1_0 {
251   block_tq1_0 block;
252};
253
254float16_t dequantFuncTQ1_0(const in decodeBufTQ1_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
255{
256    const uint e = coordInBlock[1];
257    const uint bidx = tq1_0_byte_of(e);
258    const uint qbyte = uint(bidx < 48u ? bl.block.qs[bidx] : bl.block.qh[bidx - 48u]);
259    const uint xi = tq1_0_trit(qbyte, tq1_0_digit_of(e));
260    return bl.block.d * (float16_t(int(xi)) - float16_t(1.0));
261}
262
263f16vec4 dequantFuncTQ1_0_v(const in decodeBufTQ1_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
264{
265    const uint e = coordInBlock[1];
266    f16vec4 v;
267    [[unroll]] for (uint k = 0u; k < 4u; ++k) {
268        const uint ee = e + k;
269        const uint bidx = tq1_0_byte_of(ee);
270        const uint qbyte = uint(bidx < 48u ? bl.block.qs[bidx] : bl.block.qh[bidx - 48u]);
271        const uint xi = tq1_0_trit(qbyte, tq1_0_digit_of(ee));
272        v[k] = bl.block.d * (float16_t(int(xi)) - float16_t(1.0));
273    }
274    return v;
275}
276
277layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufTQ2_0 {
278   block_tq2_0 block;
279};
280
281layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufTQ2_0_packed16 {
282   block_tq2_0_packed16 block;
283};
284
285float16_t dequantFuncTQ2_0(const in decodeBufTQ2_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
286{
287    decodeBufTQ2_0_packed16 bl16 = decodeBufTQ2_0_packed16(bl);
288    const uint idx = coordInBlock[1];
289
290    const uint qsshift = (idx & 0x60) >> 4;             // 0,2,4,6
291
292    uint qs = uint32_t(bl16.block.qs[((idx & 0x80) >> 3) + ((idx & 0x1E) >> 1)]);
293    qs = (qs >> qsshift) & 0x0303;
294    qs = unpack8(qs)[idx & 1];
295
296    return bl.block.d * (float16_t(int(qs)) - float16_t(1.0));
297}
298
299f16vec4 dequantFuncTQ2_0_v(const in decodeBufTQ2_0 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
300{
301    const uint idx = coordInBlock[1];
302
303    const uint qsshift = (idx & 0x60) >> 4;             // 0,2,4,6
304    const uint qsi = ((idx & 0x80) >> 2) + (idx & 0x1C); // byte index of 4-aligned group
305
306    const uint qsw = (uint(bl.block.qs[qsi]))
307                   | (uint(bl.block.qs[qsi + 1]) << 8)
308                   | (uint(bl.block.qs[qsi + 2]) << 16)
309                   | (uint(bl.block.qs[qsi + 3]) << 24);
310    const u8vec4 q = unpack8((qsw >> qsshift) & 0x03030303);
311
312    return bl.block.d * (f16vec4(q) - f16vec4(1.0));
313}
314
315layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufQ2_K {
316   block_q2_K block;
317};
318
319layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ2_K_packed16 {
320   block_q2_K_packed16 block;
321};
322
323layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufQ2_K_packed32 {
324   block_q2_K_packed32 block;
325};
326
327float16_t dequantFuncQ2_K(const in decodeBufQ2_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
328{
329    decodeBufQ2_K_packed16 bl16 = decodeBufQ2_K_packed16(bl);
330    const f16vec2 dm = bl.block.dm;
331    const uint idx = coordInBlock[1];
332
333    const uint scalesi = (idx & 0xF0) >> 4;             // 0..15
334    const uint qsshift = (idx & 0x60) >> 4;             // 0,2,4,6
335
336    uint qs = uint32_t(bl16.block.qs[((idx & 0x80) >> 3) + ((idx & 0x1E) >> 1)]);
337    qs = (qs >> qsshift) & 0x0303;
338    qs = unpack8(qs)[idx & 1];
339
340    const uint scales = bl.block.scales[scalesi];
341    float16_t ret = dm.x * float16_t(scales & 0xF) * float16_t(qs) - dm.y * float16_t(scales >> 4);
342    return ret;
343}
344
345f16vec4 dequantFuncQ2_K_v(const in decodeBufQ2_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
346{
347    decodeBufQ2_K_packed32 bl32 = decodeBufQ2_K_packed32(bl);
348    const f16vec2 dm = bl.block.dm;
349    const uint idx = coordInBlock[1];
350
351    const uint scalesi = idx >> 4;                      // 0..15
352    const uint qsshift = (idx & 0x60) >> 4;             // 0,2,4,6
353
354    // qs_i (packed16) = ((idx & 0x80) >> 3) + ((idx & 0x1E) >> 1) is even for idx % 4 == 0,
355    // so qs_w (packed32) = qs_i / 2 = ((idx & 0x80) >> 4) + ((idx & 0x1Cu) >> 2).
356    const uint qs_w   = ((idx & 0x80) >> 4) + ((idx & 0x1Cu) >> 2);
357    const uint qsw    = uint32_t(bl32.block.qs[qs_w]);
358    const uint qs4    = (qsw >> qsshift) & 0x03030303u;
359    const u8vec4 qi   = unpack8(qs4);
360
361    const uint scales      = bl.block.scales[scalesi];
362    const float16_t d_sub  = dm.x * float16_t(scales & 0xF);
363    const float16_t m_sub  = dm.y * float16_t(scales >> 4);
364    return f16vec4(vec4(qi) * vec4(float(d_sub)) - vec4(float(m_sub)));
365}
366
367layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ3_K {
368   block_q3_K block;
369};
370
371layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ3_K_packed16 {
372   block_q3_K_packed16 block;
373};
374
375float16_t dequantFuncQ3_K(const in decodeBufQ3_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
376{
377    const uint idx = coordInBlock[1];
378    const uint iqs = idx;
379
380    const uint n = iqs / 128;                    // 0,1
381    const uint qsi = n * 32 + (iqs % 32);        // 0..63
382    const uint hmi =          (iqs % 32);        // 0..31
383    const uint j = (iqs % 128) / 8;              // 0..15
384    const uint is = iqs / 16;                    // 0..15
385    const uint halfsplit = ((iqs % 128) / 32);   // 0,1,2,3
386    const uint qsshift = halfsplit * 2;          // 0,2,4,6
387    const uint m = 1 << (4 * n + halfsplit);     // 1,2,4,8,16,32,64,128
388
389    uint32_t scaleidx0 = (is < 8) ? is : (is-8);
390    uint32_t scaleidx0shift = (is < 8) ? 0 : 4;
391    uint32_t scaleidx1 = is + 8 - (is/4)*4;
392    uint32_t scaleidx1shift = (is/4)*2;
393
394    const int8_t us = int8_t(((bl.block.scales[scaleidx0] >> scaleidx0shift) & 0xF) | (((bl.block.scales[scaleidx1] >> scaleidx1shift) & 3) << 4));
395
396    const float16_t dl = bl.block.d * float16_t(us - 32);
397
398    float16_t ret = dl * float16_t(int8_t((bl.block.qs[qsi    ] >> qsshift) & 3) - (((bl.block.hmask[hmi    ] & m) != 0) ? 0 : 4));
399
400    return ret;
401}
402
403f16vec4 dequantFuncQ3_K_v(const in decodeBufQ3_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
404{
405    decodeBufQ3_K_packed16 bl16 = decodeBufQ3_K_packed16(bl);
406    const uint idx = coordInBlock[1];
407
408    const uint n         = idx >> 7;             // 0,1
409    const uint is        = idx >> 4;             // 0..15
410    const uint halfsplit = (idx & 0x60) >> 5;    // 0,1,2,3
411    const uint qsshift   = halfsplit << 1;       // 0,2,4,6
412    const uint hbit      = (n << 2) + halfsplit; // 0..7   (bit position in hmask byte)
413
414    uint32_t scaleidx0      = (is < 8) ? is : (is - 8);
415    uint32_t scaleidx0shift = (is < 8) ? 0u : 4u;
416    uint32_t scaleidx1      = is + 8 - (is / 4) * 4;
417    uint32_t scaleidx1shift = (is / 4) * 2;
418
419    const int8_t us = int8_t(
420        ((bl.block.scales[scaleidx0] >> scaleidx0shift) & 0xF) |
421        (((bl.block.scales[scaleidx1] >> scaleidx1shift) & 3) << 4));
422    const float16_t dl = bl.block.d * float16_t(int(us) - 32);
423
424    // For idx % 4 == 0: (idx & 0x1F) == (idx & 0x1C) is a multiple of 4.
425    const uint qsi = (n << 5) + (idx & 0x1Cu);
426    const uint hmi =             (idx & 0x1Cu);
427
428    // Two adjacent uint16 packed16 reads, combined into a uint32 in registers.
429    // After this: byte j of qsw / hmw holds the data for element idx+j.
430    const uint qsw = uint32_t(bl16.block.qs[qsi >> 1])
431                   | (uint32_t(bl16.block.qs[(qsi >> 1) + 1u]) << 16);
432    const uint hmw = uint32_t(bl16.block.hmask[hmi >> 1])
433                   | (uint32_t(bl16.block.hmask[(hmi >> 1) + 1u]) << 16);
434
435    // qsshift in {0,2,4,6} and hbit in {0..7}: per-byte masks isolate the wanted bits
436    // with no inter-byte leakage.
437    const uint ql4 = (qsw >> qsshift) & 0x03030303u;
438    const uint qh4 = (hmw >> hbit)    & 0x01010101u;
439
440    const ivec4 q = ivec4(unpack8(ql4 | (qh4 << 2))) - ivec4(4);
441    return f16vec4(vec4(q) * vec4(float(dl)));
442}
443
444layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ4_K {
445   block_q4_K block;
446};
447
448layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ4_K_packed16 {
449   block_q4_K_packed16 block;
450};
451
452layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ4_K_packed32 {
453   block_q4_K_packed32 block;
454};
455
456layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ4_K_packed128 {
457   block_q4_K_packed128 block;
458};
459
460#if defined(IS_MUL_MM2)
461
462// For Q4_K and Q5_K in the mat-mul shader, we decode a tile's worth of scales
463// into shared memory and then process the whole tile using those scales.
464// There is a fetch function that loads into private variables and then a store
465// function that stores into shared memory.
466// Q4_K and Q5_K have the same encoding of scales, so everything is shared except
467// the part that fetches from the structure (which has a different block layout).
468#if defined(DATA_A_Q4_K) || defined(DATA_A_Q5_K)
469const uint shAscales_stride = (BM + 2);
470// 1 scale per 32 elements -> 8 scales per block, per row
471shared vec2 shAscales[8 * shAscales_stride];
472uvec4 row_v;
473#endif
474
475#if defined(DATA_A_Q4_K)
476layout (binding = 0) readonly buffer A_Q4_K_128 {block_q4_K_packed128 data_a_q4_k_packed128[];};
477
478void fetch_scalesQ4_K(uint ir_BM, uint pos_a, uint stride_a, uint block_k, uint tid, bool in_bounds)
479{
480    uint tids_per_row = BLOCK_SIZE / BM;
481    uint is_per_tid = 8 / tids_per_row;
482    uint is_start = is_per_tid * (tid % tids_per_row);
483    uint tid_row = tid / tids_per_row;
484
485    uint row = ir_BM + tid_row;
486    uint block_index = pos_a + row * stride_a + (block_k / QUANT_K);
487    if (in_bounds || row < p.M) {
488        row_v = data_a_q4_k_packed128[block_index].q4k[0];
489    }
490}
491#endif
492#if defined(DATA_A_Q5_K)
493layout (binding = 0) readonly buffer A_Q5_K_128 {block_q5_K_packed128 data_a_q5_k_packed128[];};
494
495void fetch_scalesQ5_K(uint ir_BM, uint pos_a, uint stride_a, uint block_k, uint tid, bool in_bounds)
496{
497    uint tids_per_row = BLOCK_SIZE / BM;
498    uint is_per_tid = 8 / tids_per_row;
499    uint is_start = is_per_tid * (tid % tids_per_row);
500    uint tid_row = tid / tids_per_row;
501
502    uint row = ir_BM + tid_row;
503    uint block_index = pos_a + row * stride_a + (block_k / QUANT_K);
504    if (in_bounds || row < p.M) {
505        row_v = data_a_q5_k_packed128[block_index].q5k[0];
506    }
507}
508#endif
509
510#if defined(DATA_A_Q4_K) || defined(DATA_A_Q5_K)
511void store_scalesQ4_K(uint tid)
512{
513    barrier();
514
515    uint tids_per_row = BLOCK_SIZE / BM;
516    uint is_per_tid = 8 / tids_per_row;
517    uint is_start = is_per_tid * (tid % tids_per_row);
518    uint tid_row = tid / tids_per_row;
519
520    [[unroll]] for (uint idx = 0; idx < is_per_tid; ++idx) {
521        uint is = idx + is_start;
522        uvec4 v = row_v;
523        const vec2 loadd = vec2(unpackFloat2x16(v.x));
524
525        uint32_t sc;
526        uint32_t mbyte;
527
528        uint32_t scale0 = v.y;
529        uint32_t scale4 = v.z;
530        uint32_t scale8 = v.w;
531
532        uint32_t sc_lo = scale0;
533        uint32_t mb_lo = scale4;
534        uint32_t sc_hi = (scale8 & 0x0F0F0F0F) | ((scale0 & 0xC0C0C0C0) >> 2);
535        uint32_t mb_hi = ((scale8 & 0xF0F0F0F0) >> 4) | ((scale4 & 0xC0C0C0C0) >> 2);
536
537        sc = is < 4 ? sc_lo : sc_hi;
538        mbyte = is < 4 ? mb_lo : mb_hi;
539        sc = sc >> (8 * (is & 3));
540        mbyte = mbyte >> (8 * (is & 3));
541        sc &= 0x3F;
542        mbyte &= 0x3F;
543
544        const float d = loadd.x * float(sc);
545        const float m = loadd.y * float(mbyte);
546        shAscales[is * shAscales_stride + tid_row] = vec2(d,m);
547    }
548
549    barrier();
550}
551#endif
552
553#endif
554
555float16_t dequantFuncQ4_K(const in decodeBufQ4_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
556{
557    decodeBufQ4_K_packed16 bl16 = decodeBufQ4_K_packed16(bl);
558    decodeBufQ4_K_packed128 bl128 = decodeBufQ4_K_packed128(bl);
559    const uint idx = coordInBlock[1];
560
561    const uint b = (idx & 0x20) >> 5;            // 0,1
562    const uint is = (idx & 0xE0) >> 5;         // 0..7
563
564#if defined(IS_MUL_MM2) && defined(DATA_A_Q4_K)
565    vec2 v = shAscales[is * shAscales_stride + (blockCoords[0] % BM)];
566    float d = v.x;
567    float m = v.y;
568#else
569    uvec4 v = bl128.block.q4k[0];
570    const vec2 loadd = vec2(unpackFloat2x16(v.x));
571
572    uint32_t sc;
573    uint32_t mbyte;
574
575    uint32_t scale0 = v.y;
576    uint32_t scale4 = v.z;
577    uint32_t scale8 = v.w;
578
579    uint32_t sc_lo = scale0;
580    uint32_t mb_lo = scale4;
581    uint32_t sc_hi = (scale8 & 0x0F0F0F0F) | ((scale0 & 0xC0C0C0C0) >> 2);
582    uint32_t mb_hi = ((scale8 & 0xF0F0F0F0) >> 4) | ((scale4 & 0xC0C0C0C0) >> 2);
583
584    sc = is < 4 ? sc_lo : sc_hi;
585    mbyte = is < 4 ? mb_lo : mb_hi;
586    sc = sc >> (8 * (is & 3));
587    mbyte = mbyte >> (8 * (is & 3));
588    sc &= 0x3F;
589    mbyte &= 0x3F;
590
591    const float d = loadd.x * float(sc);
592    const float m = loadd.y * float(mbyte);
593#endif
594
595    uint qs = uint32_t(bl16.block.qs[((idx & 0xC0) >> 2) + ((idx & 0x1E) >> 1)]);
596    qs = (qs >> (b * 4 + 8 * (idx & 1))) & 0xF;
597
598    float ret = d * float(qs) - m;
599
600    return float16_t(ret);
601}
602
603f16vec4 dequantFuncQ4_K_v(const in decodeBufQ4_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
604{
605    decodeBufQ4_K_packed32 bl32 = decodeBufQ4_K_packed32(bl);
606    decodeBufQ4_K_packed128 bl128 = decodeBufQ4_K_packed128(bl);
607    const uint idx = coordInBlock[1];
608
609    const uint is = idx >> 5;                    // 0..7
610
611#if defined(IS_MUL_MM2) && defined(DATA_A_Q4_K)
612    vec2 v = shAscales[is * shAscales_stride + (blockCoords[0] % BM)];
613    float d = v.x;
614    float m = v.y;
615#else
616    uvec4 v = bl128.block.q4k[0];
617    const vec2 loadd = vec2(unpackFloat2x16(v.x));
618
619    uint32_t sc;
620    uint32_t mbyte;
621
622    uint32_t scale0 = v.y;
623    uint32_t scale4 = v.z;
624    uint32_t scale8 = v.w;
625
626    uint32_t sc_lo = scale0;
627    uint32_t mb_lo = scale4;
628    uint32_t sc_hi = (scale8 & 0x0F0F0F0F) | ((scale0 & 0xC0C0C0C0) >> 2);
629    uint32_t mb_hi = ((scale8 & 0xF0F0F0F0) >> 4) | ((scale4 & 0xC0C0C0C0) >> 2);
630
631    sc = is < 4 ? sc_lo : sc_hi;
632    mbyte = is < 4 ? mb_lo : mb_hi;
633    sc = sc >> (8 * (is & 3));
634    mbyte = mbyte >> (8 * (is & 3));
635    sc &= 0x3F;
636    mbyte &= 0x3F;
637
638    const float d = loadd.x * float(sc);
639    const float m = loadd.y * float(mbyte);
640#endif
641
642    // idx in [0,256); vector decode uses idx a multiple of 4. packed32 word index:
643    // (qs_i >> 1) == (idx >> 6) * 8 + ((idx & 0x1E) >> 2). sh is 0 or 4 only, so a
644    // single (w >> sh) & 0x0F0F0F0F isolates all four nibbles without inter-byte leakage.
645    const uint sh = (idx & 0x20u) >> 3u;
646    const uint w = uint32_t(bl32.block.qs[(idx >> 6) * 8u + ((idx & 0x1Eu) >> 2)]);
647    const u8vec4 q = unpack8((w >> sh) & 0x0F0F0F0Fu);
648
649    return f16vec4(vec4(d) * vec4(q) - vec4(m));
650}
651
652layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ5_K {
653   block_q5_K block;
654};
655
656layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ5_K_packed16 {
657   block_q5_K_packed16 block;
658};
659
660layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ5_K_packed128 {
661   block_q5_K_packed128 block;
662};
663
664layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ5_K_packed32 {
665   block_q5_K_packed32 block;
666};
667
668float16_t dequantFuncQ5_K(const in decodeBufQ5_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
669{
670    decodeBufQ5_K_packed16 bl16 = decodeBufQ5_K_packed16(bl);
671    decodeBufQ5_K_packed128 bl128 = decodeBufQ5_K_packed128(bl);
672    const uint idx = coordInBlock[1];
673
674    const uint b = (idx & 0x20) >> 5;          // 0,1
675    const uint is = (idx & 0xE0) >> 5;         // 0..7
676
677#if defined(IS_MUL_MM2) && defined(DATA_A_Q5_K)
678    vec2 v = shAscales[is * shAscales_stride + (blockCoords[0] % BM)];
679    float d = v.x;
680    float m = v.y;
681#else
682    uvec4 v = bl128.block.q5k[0];
683
684    const f16vec2 loadd = unpackFloat2x16(v.x);
685
686    uint32_t sc;
687    uint32_t mbyte;
688
689    uint32_t scale0 = v.y;
690    uint32_t scale4 = v.z;
691    uint32_t scale8 = v.w;
692
693    uint32_t sc_lo = scale0;
694    uint32_t mb_lo = scale4;
695    uint32_t sc_hi = (scale8 & 0x0F0F0F0F) | ((scale0 & 0xC0C0C0C0) >> 2);
696    uint32_t mb_hi = ((scale8 & 0xF0F0F0F0) >> 4) | ((scale4 & 0xC0C0C0C0) >> 2);
697
698    sc = is < 4 ? sc_lo : sc_hi;
699    mbyte = is < 4 ? mb_lo : mb_hi;
700    sc = sc >> (8 * (is & 3));
701    mbyte = mbyte >> (8 * (is & 3));
702    sc &= 0x3F;
703    mbyte &= 0x3F;
704
705    const float16_t d = loadd.x * float16_t(sc);
706    const float16_t m = loadd.y * float16_t(mbyte);
707#endif
708
709    uint qh = uint32_t(bl16.block.qh[(idx & 0x1E) >> 1]);
710    qh = ((qh >> is) & 0x101) << 4;
711
712    uint qs = uint32_t(bl16.block.qs[((idx & 0xC0) >> 2) + ((idx & 0x1E) >> 1)]);
713    qs = (qs >> (b * 4)) & 0x0F0F;
714    qs = unpack8(qs | qh)[idx & 1];
715
716    float ret = d * float(qs) - m;
717
718    return float16_t(ret);
719}
720
721f16vec4 dequantFuncQ5_K_v(const in decodeBufQ5_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
722{
723    decodeBufQ5_K_packed32 bl32 = decodeBufQ5_K_packed32(bl);
724    decodeBufQ5_K_packed128 bl128 = decodeBufQ5_K_packed128(bl);
725    const uint idx = coordInBlock[1];
726    const uint is = idx >> 5;
727
728#if defined(IS_MUL_MM2) && defined(DATA_A_Q5_K)
729    vec2 v = shAscales[is * shAscales_stride + (blockCoords[0] % BM)];
730    float d = v.x;
731    float m = v.y;
732#else
733    uvec4 v = bl128.block.q5k[0];
734
735    const f16vec2 loadd = unpackFloat2x16(v.x);
736
737    uint32_t sc;
738    uint32_t mbyte;
739
740    uint32_t scale0 = v.y;
741    uint32_t scale4 = v.z;
742    uint32_t scale8 = v.w;
743
744    uint32_t sc_lo = scale0;
745    uint32_t mb_lo = scale4;
746    uint32_t sc_hi = (scale8 & 0x0F0F0F0F) | ((scale0 & 0xC0C0C0C0) >> 2);
747    uint32_t mb_hi = ((scale8 & 0xF0F0F0F0) >> 4) | ((scale4 & 0xC0C0C0C0) >> 2);
748
749    sc = is < 4 ? sc_lo : sc_hi;
750    mbyte = is < 4 ? mb_lo : mb_hi;
751    sc = sc >> (8 * (is & 3));
752    mbyte = mbyte >> (8 * (is & 3));
753    sc &= 0x3F;
754    mbyte &= 0x3F;
755
756    const float16_t d = loadd.x * float16_t(sc);
757    const float16_t m = loadd.y * float16_t(mbyte);
758#endif
759
760    // sh is 0 or 4; mask 0x0F0F0F0F covers the four nibbles regardless (no inter-byte leakage).
761    const uint sh = (idx & 0x20u) >> 3u;
762    const uint qs_w = (idx >> 6) * 8u + ((idx & 0x1Eu) >> 2);
763    const uint qh_w = (idx & 0x1Eu) >> 2;
764
765    const uint ql4 = (uint32_t(bl32.block.qs[qs_w]) >> sh) & 0x0F0F0F0Fu;
766    // qh stores bit `is` per element across 4 consecutive bytes; one shift+mask handles all 4.
767    const uint qh4 = ((uint32_t(bl32.block.qh[qh_w]) >> is) & 0x01010101u) << 4u;
768
769    const u8vec4 qi = unpack8(ql4 | qh4);
770    return f16vec4(vec4(qi) * vec4(d) - vec4(m));
771}
772
773layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufQ6_K {
774   block_q6_K block;
775};
776
777layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ6_K_packed16 {
778   block_q6_K_packed16 block;
779};
780
781float16_t dequantFuncQ6_K(const in decodeBufQ6_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
782{
783    decodeBufQ6_K_packed16 bl16 = decodeBufQ6_K_packed16(bl);
784    const uint idx = coordInBlock[1];
785
786    const uint b = (idx & 0x40) >> 6;           // 0,1
787    const uint qhshift = (idx & 0x60) >> 4;    // 0,2,4,6
788    const uint is = (idx & 0xF0) >> 4;          // 0..15
789
790    const float16_t dscale = bl.block.d * float16_t(bl.block.scales[is]);
791
792    uint ql = uint32_t(bl16.block.ql[((idx & 0x80) >> 2) + ((idx & 0x3E) >> 1)]);
793    ql = (ql >> (b * 4)) & 0x0F0F;
794
795    uint qh = uint32_t(bl16.block.qh[((idx & 0x80) >> 3) + ((idx & 0x1E) >> 1)]);
796    qh = ((qh >> qhshift) & 0x0303) << 4;
797
798    int q = unpack8(ql | qh)[idx & 1];
799
800    float16_t ret = dscale * float16_t(q - 32);
801
802    return ret;
803}
804
805f16vec4 dequantFuncQ6_K_v(const in decodeBufQ6_K bl, const in uint blockCoords[2], const in uint coordInBlock[2])
806{
807    decodeBufQ6_K_packed16 bl16 = decodeBufQ6_K_packed16(bl);
808    const uint idx = coordInBlock[1];
809
810    const uint b = (idx & 0x40) >> 6;
811    const uint qhshift = (idx & 0x60) >> 4;          // 0,2,4,6
812    const uint is = idx >> 4;
813    const uint sh = b * 4;                            // 0 or 4
814
815    const float16_t dscale = bl.block.d * float16_t(bl.block.scales[is]);
816
817    const uint ql_i = ((idx & 0x80) >> 2) + ((idx & 0x3E) >> 1);
818    const uint qh_i = ((idx & 0x80) >> 3) + ((idx & 0x1E) >> 1);
819
820    // Two adjacent uint16 packed16 reads, combined into a uint32 in registers.
821    // After this: byte j of qlw / qhw holds the data for element idx+j.
822    const uint qlw = uint32_t(bl16.block.ql[ql_i    ]) | (uint32_t(bl16.block.ql[ql_i + 1]) << 16);
823    const uint qhw = uint32_t(bl16.block.qh[qh_i    ]) | (uint32_t(bl16.block.qh[qh_i + 1]) << 16);
824
825    // sh in {0,4} and qhshift in {0,2,4,6}: per-byte masks 0x0F / 0x03 keep only the
826    // wanted bits with no inter-byte leakage; place qh's 2 bits at nibble high position.
827    const uint ql4 = (qlw >> sh) & 0x0F0F0F0Fu;
828    const uint qh4 = ((qhw >> qhshift) & 0x03030303u) << 4u;
829
830    const ivec4 qi = ivec4(unpack8(ql4 | qh4));
831    return f16vec4((vec4(qi) - vec4(32.0f)) * vec4(float(dscale)));
832}
833
834#if defined(DATA_A_IQ1_S)
835layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ1_S {
836   block_iq1_s block;
837};
838
839float16_t dequantFuncIQ1_S(const in decodeBufIQ1_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
840{
841    const float16_t d = bl.block.d;
842    const uint idx = coordInBlock[1];
843
844    const uint ib32 = (idx & 0xE0) >> 5;
845    const uint ib8 = (idx & 0xF8) >> 3;
846
847    const uint qh = bl.block.qh[ib32];
848    const uint qs = bl.block.qs[ib8];
849    const float dl = d * float(2 * bitfieldExtract(qh, 12, 3) + 1);
850    const float delta = ((qh & 0x8000) != 0) ? -IQ1S_DELTA : IQ1S_DELTA;
851    const uint grid = iq1s_grid[qs | (bitfieldExtract(qh, 3 * int(ib8 & 3), 3) << 8)];
852
853    float16_t ret = float16_t(dl) * (float16_t(bitfieldExtract(int(grid), 2 * int(idx % 8), 2)) + float16_t(delta));
854    return ret;
855}
856
857f16vec4 dequantFuncIQ1_S_v(const in decodeBufIQ1_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
858{
859    const float16_t d = bl.block.d;
860    const uint idx = coordInBlock[1];
861
862    const uint ib32 = idx >> 5;
863    const uint ib8  = idx >> 3;
864    const int  i8b  = int(idx & 4);              // 0 or 4
865
866    const uint qh = bl.block.qh[ib32];
867    const uint qs = bl.block.qs[ib8];
868    const float dl    = float(d) * float(2 * bitfieldExtract(qh, 12, 3) + 1);
869    const float delta = ((qh & 0x8000u) != 0u) ? -IQ1S_DELTA : IQ1S_DELTA;
870    const uint  grid  = iq1s_grid[qs | (bitfieldExtract(qh, 3 * int(ib8 & 3), 3) << 8)];
871
872    const ivec4 q = ivec4(
873        bitfieldExtract(int(grid), 2 * (i8b + 0), 2),
874        bitfieldExtract(int(grid), 2 * (i8b + 1), 2),
875        bitfieldExtract(int(grid), 2 * (i8b + 2), 2),
876        bitfieldExtract(int(grid), 2 * (i8b + 3), 2));
877    return f16vec4((vec4(q) + vec4(delta)) * dl);
878}
879#endif
880
881#if defined(DATA_A_IQ1_M)
882layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ1_M {
883   block_iq1_m block;
884};
885
886layout(buffer_reference, std430, buffer_reference_align = 8) buffer decodeBufIQ1_M_packed64 {
887   block_iq1_m_packed64 block;
888};
889
890float16_t dequantFuncIQ1_M(const in decodeBufIQ1_M bl, const in uint blockCoords[2], const in uint coordInBlock[2])
891{
892    decodeBufIQ1_M_packed64 bl64 = decodeBufIQ1_M_packed64(bl);
893    const uint idx = coordInBlock[1];
894
895    uvec2 scales = unpack32(bl64.block.scales);
896    const float16_t d = uint16BitsToHalf(uint16_t(((scales.x & 0xF000) >> 12) | ((scales.x & 0xF0000000) >> 24) | ((scales.y & 0xF000) >> 4) | ((scales.y & 0xF0000000) >> 16)));
897
898    const uint ib8 = (idx & 0xF8) >> 3;
899    const uint ib16 = (idx & 0xF0) >> 4;
900    const int i8 = int(idx % 8);
901    const uint sc = bl.block.scales[ib8 / 8];
902    const uint qs = bl.block.qs[ib8];
903    const uint qh = bl.block.qh[ib16] >> (4 * (ib8 & 1));
904    const float dl = 2 * bitfieldExtract(sc, 3 * int(ib16 & 3), 3) + 1;
905    const float delta = ((qh & 8) != 0) ? -IQ1S_DELTA : IQ1S_DELTA;
906    const uint grid = iq1s_grid[qs | ((qh & 7) << 8)];
907
908    float16_t ret = d * float16_t(dl) * (float16_t(bitfieldExtract(int(grid), 2 * i8, 2)) + float16_t(delta));
909    return ret;
910}
911
912f16vec4 dequantFuncIQ1_M_v(const in decodeBufIQ1_M bl, const in uint blockCoords[2], const in uint coordInBlock[2])
913{
914    decodeBufIQ1_M_packed64 bl64 = decodeBufIQ1_M_packed64(bl);
915    const uint idx = coordInBlock[1];
916
917    uvec2 scales = unpack32(bl64.block.scales);
918    const float16_t d = uint16BitsToHalf(uint16_t(((scales.x & 0xF000) >> 12) | ((scales.x & 0xF0000000) >> 24) | ((scales.y & 0xF000) >> 4) | ((scales.y & 0xF0000000) >> 16)));
919
920    const uint ib8  = idx >> 3;
921    const uint ib16 = idx >> 4;
922    const int  i8b  = int(idx & 4);   // 0 or 4 -- i8 base for the V=4 group
923
924    const uint sc = bl.block.scales[ib8 / 8];
925    const uint qs = bl.block.qs[ib8];
926    const uint qh = bl.block.qh[ib16] >> (4 * (ib8 & 1));
927    const float dl    = 2.0 * float(bitfieldExtract(sc, 3 * int(ib16 & 3), 3)) + 1.0;
928    const float delta = ((qh & 8u) != 0u) ? -IQ1S_DELTA : IQ1S_DELTA;
929    const uint  grid  = iq1s_grid[qs | ((qh & 7u) << 8)];
930
931    const ivec4 q = ivec4(
932        bitfieldExtract(int(grid), 2 * (i8b + 0), 2),
933        bitfieldExtract(int(grid), 2 * (i8b + 1), 2),
934        bitfieldExtract(int(grid), 2 * (i8b + 2), 2),
935        bitfieldExtract(int(grid), 2 * (i8b + 3), 2));
936    return f16vec4((vec4(q) + vec4(delta)) * (float(d) * dl));
937}
938#endif
939
940#if defined(DATA_A_IQ2_XXS)
941layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ2_XXS {
942   block_iq2_xxs block;
943};
944
945layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ2_XXS_packed16 {
946   block_iq2_xxs_packed16 block;
947};
948
949float16_t dequantFuncIQ2_XXS(const in decodeBufIQ2_XXS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
950{
951    decodeBufIQ2_XXS_packed16 bl16 = decodeBufIQ2_XXS_packed16(bl);
952    const float16_t d = bl.block.d;
953    const uint idx = coordInBlock[1];
954
955    const uint ib32 = (idx & 0xE0) >> 5; // 0..7
956    const uint ib8 = (idx & 0x18) >> 3;  // 0..3
957    const uint iqs = 8 * ib32 + ib8;
958
959    const uint qs = bl.block.qs[iqs];
960    const uint signscale = pack32(u16vec2(bl16.block.qs[4*ib32+2], bl16.block.qs[4*ib32+3]));
961
962    const float dscale = float(bl.block.d) * 0.25 * (0.5 + float(signscale >> 28));
963    uint sign = bitfieldExtract(signscale, 7 * int(ib8), 7);
964    sign |= bitCount(sign) << 7;
965
966    uint g2 = iq2xxs_grid[qs][(idx & 4) >> 2];
967    g2 >>= (idx & 2) * 8;
968    const vec2 g = vec2(unpack8(g2));
969
970    vec2 ret = dscale * g * ((sign & (1 << (idx & 7))) != 0 ? -1.0hf : 1.0hf);
971    return float16_t(ret[idx & 1]);
972}
973
974f16vec4 dequantFuncIQ2_XXS_v(const in decodeBufIQ2_XXS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
975{
976    decodeBufIQ2_XXS_packed16 bl16 = decodeBufIQ2_XXS_packed16(bl);
977    const uint idx = coordInBlock[1];
978
979    const uint ib32 = idx >> 5;
980    const uint ib8  = (idx & 0x18) >> 3;
981    const uint iqs  = 8 * ib32 + ib8;
982
983    const uint qs        = bl.block.qs[iqs];
984    const uint signscale = pack32(u16vec2(bl16.block.qs[4*ib32+2], bl16.block.qs[4*ib32+3]));
985    const float dscale   = float(bl.block.d) * 0.25 * (0.5 + float(signscale >> 28));
986
987    uint sign = bitfieldExtract(signscale, 7 * int(ib8), 7);
988    sign |= bitCount(sign) << 7;
989    const uint sb = sign >> (idx & 7u);
990
991    const uint   g2 = iq2xxs_grid[qs][(idx & 4) >> 2];
992    const u8vec4 g  = unpack8(g2);
993
994    return f16vec4(
995        dscale * float(g.x) * ((sb & 1u) != 0u ? -1.0 : 1.0),
996        dscale * float(g.y) * ((sb & 2u) != 0u ? -1.0 : 1.0),
997        dscale * float(g.z) * ((sb & 4u) != 0u ? -1.0 : 1.0),
998        dscale * float(g.w) * ((sb & 8u) != 0u ? -1.0 : 1.0));
999}
1000#endif
1001
1002#if defined(DATA_A_IQ2_XS)
1003layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ2_XS {
1004   block_iq2_xs block;
1005};
1006
1007float16_t dequantFuncIQ2_XS(const in decodeBufIQ2_XS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1008{
1009    const float16_t d = bl.block.d;
1010    const uint idx = coordInBlock[1];
1011
1012    const uint is = (idx & 0xE0) >> 5;     // 0..8
1013    const uint sshift = (idx & 0x10) >> 2; // 0,4
1014    const uint iqs = (idx & 0xF8) >> 3;    // 0..63
1015
1016    const uint16_t qs = bl.block.qs[iqs];
1017    const float dscale = float(bl.block.d) * 0.25 * (0.5 + float((bl.block.scales[is] >> sshift) & 0xF));
1018
1019    uint sign = uint(qs >> 9);
1020    sign |= bitCount(sign) << 7;
1021    uint g2 = iq2xs_grid[qs & 0x1FF][(idx & 4) >> 2];
1022    g2 >>= (idx & 2) * 8;
1023    const vec2 g = vec2(unpack8(g2));
1024
1025    vec2 ret = dscale * g * ((sign & (1 << (idx & 7))) != 0 ? -1.0hf : 1.0hf);
1026    return float16_t(ret[idx & 1]);
1027}
1028
1029f16vec4 dequantFuncIQ2_XS_v(const in decodeBufIQ2_XS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1030{
1031    const uint idx = coordInBlock[1];
1032
1033    const uint is     = idx >> 5;
1034    const uint sshift = (idx & 0x10) >> 2;
1035    const uint iqs    = idx >> 3;
1036
1037    const uint16_t qs     = bl.block.qs[iqs];
1038    const float    dscale = float(bl.block.d) * 0.25 * (0.5 + float((bl.block.scales[is] >> sshift) & 0xF));
1039
1040    uint sign = uint(qs >> 9);
1041    sign |= bitCount(sign) << 7;
1042    const uint sb = sign >> (idx & 7u);
1043
1044    const uint   g2 = iq2xs_grid[qs & 0x1FF][(idx & 4) >> 2];
1045    const u8vec4 g  = unpack8(g2);
1046
1047    return f16vec4(
1048        dscale * float(g.x) * ((sb & 1u) != 0u ? -1.0 : 1.0),
1049        dscale * float(g.y) * ((sb & 2u) != 0u ? -1.0 : 1.0),
1050        dscale * float(g.z) * ((sb & 4u) != 0u ? -1.0 : 1.0),
1051        dscale * float(g.w) * ((sb & 8u) != 0u ? -1.0 : 1.0));
1052}
1053#endif
1054
1055#if defined(DATA_A_IQ2_S)
1056layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ2_S {
1057   block_iq2_s block;
1058};
1059
1060float16_t dequantFuncIQ2_S(const in decodeBufIQ2_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1061{
1062    uint idx = coordInBlock[1];
1063
1064    const uint ib32 = (idx & 0xE0) >> 5;        // 0..7
1065    const uint ib8 = (idx & 0xF8) >> 3;         // 0..31
1066    const uint qhshift = 2 * (ib8 % 4);
1067
1068    const uint scale = (bl.block.scales[ib32] >> ((idx & 0x10) >> 2)) & 0xf;
1069    const uint qs = bl.block.qs[ib8];
1070    const uint qh = bl.block.qh[ib32];
1071    const uint sign = bl.block.qs[QUANT_K_IQ2_S / 8 + ib8] >> (idx & 0x6);
1072
1073    const float d = float(bl.block.d);
1074    const float db = d * 0.25 * (0.5 + scale);
1075    const ivec2 sign01 = 1 - (2 & ivec2(sign << 1, sign));
1076    uint g2 = iq2s_grid[qs | ((qh << (8 - qhshift)) & 0x300)][(idx & 4) >> 2];
1077    g2 >>= (idx & 2) * 8;
1078    const vec2 v = db * vec2(sign01) * vec2(unpack8(g2));
1079    return float16_t(v[idx & 1]);
1080}
1081
1082f16vec4 dequantFuncIQ2_S_v(const in decodeBufIQ2_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1083{
1084    const uint idx = coordInBlock[1];
1085
1086    const uint ib32    = idx >> 5;
1087    const uint ib8     = idx >> 3;
1088    const uint qhshift = 2 * (ib8 % 4);
1089
1090    const uint scale = (bl.block.scales[ib32] >> ((idx & 0x10) >> 2)) & 0xf;
1091    const uint qs    = bl.block.qs[ib8];
1092    const uint qh    = bl.block.qh[ib32];
1093    const uint sb    = uint(bl.block.qs[QUANT_K_IQ2_S / 8 + ib8]) >> (idx & 0x6u);
1094
1095    const float d  = float(bl.block.d);
1096    const float db = d * 0.25 * (0.5 + scale);
1097
1098    const uint   g2 = iq2s_grid[qs | ((qh << (8 - qhshift)) & 0x300)][(idx & 4) >> 2];
1099    const u8vec4 g  = unpack8(g2);
1100
1101    return f16vec4(
1102        db * float(g.x) * ((sb & 1u) != 0u ? -1.0 : 1.0),
1103        db * float(g.y) * ((sb & 2u) != 0u ? -1.0 : 1.0),
1104        db * float(g.z) * ((sb & 4u) != 0u ? -1.0 : 1.0),
1105        db * float(g.w) * ((sb & 8u) != 0u ? -1.0 : 1.0));
1106}
1107#endif
1108
1109#if defined(DATA_A_IQ3_XXS)
1110layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ3_XXS {
1111   block_iq3_xxs block;
1112};
1113
1114layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ3_XXS_packed16 {
1115   block_iq3_xxs_packed16 block;
1116};
1117
1118float16_t dequantFuncIQ3_XXS(const in decodeBufIQ3_XXS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1119{
1120    decodeBufIQ3_XXS_packed16 bl16 = decodeBufIQ3_XXS_packed16(bl);
1121    uint idx = coordInBlock[1];
1122
1123    const uint iqs = (idx & 0xFC) >> 2;             // 0..63
1124    const uint is = QUANT_K_IQ3_XXS / 4 + ((idx & 0xE0) >> 3);// 8 values
1125
1126    const float d = float(bl.block.d);
1127    const uint qs = bl.block.qs[iqs];
1128    const uint signs = pack32(u16vec2(
1129        bl16.block.qs[is/2+0],
1130        bl16.block.qs[is/2+1]
1131    ));
1132    const float db = d * 0.5 * (0.5 + (signs >> 28));
1133    const uint32_t sign7 = bitfieldExtract(signs, 7 * (int(iqs / 2) % 4), 7);
1134    const uint sign = (sign7 | (bitCount(sign7) << 7)) >> (idx & 0x6);
1135    const ivec2 sign01 = ivec2(1 - (2 & ivec2(sign << 1, sign)));
1136    const uint grid = iq3xxs_grid[qs] >> (16 * ((idx & 2) >> 1));
1137    const vec2 v = db * vec2(sign01) * vec2(unpack8(grid).xy);
1138    return float16_t(v[idx & 1]);
1139}
1140
1141f16vec4 dequantFuncIQ3_XXS_v(const in decodeBufIQ3_XXS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1142{
1143    decodeBufIQ3_XXS_packed16 bl16 = decodeBufIQ3_XXS_packed16(bl);
1144    const uint idx = coordInBlock[1];
1145
1146    const uint iqs = idx >> 2;
1147    const uint is  = QUANT_K_IQ3_XXS / 4 + ((idx & 0xE0) >> 3);
1148
1149    const float d     = float(bl.block.d);
1150    const uint  qs    = bl.block.qs[iqs];
1151    const uint  signs = pack32(u16vec2(bl16.block.qs[is/2+0], bl16.block.qs[is/2+1]));
1152    const float db    = d * 0.5 * (0.5 + (signs >> 28));
1153
1154    const uint sign7 = bitfieldExtract(signs, 7 * (int(iqs / 2) % 4), 7);
1155    const uint sb    = (sign7 | (bitCount(sign7) << 7)) >> (idx & 0x6u);
1156
1157    const uint   grid = iq3xxs_grid[qs];
1158    const u8vec4 g    = unpack8(grid);
1159
1160    return f16vec4(
1161        db * float(g.x) * ((sb & 1u) != 0u ? -1.0 : 1.0),
1162        db * float(g.y) * ((sb & 2u) != 0u ? -1.0 : 1.0),
1163        db * float(g.z) * ((sb & 4u) != 0u ? -1.0 : 1.0),
1164        db * float(g.w) * ((sb & 8u) != 0u ? -1.0 : 1.0));
1165}
1166#endif
1167
1168#if defined(DATA_A_IQ3_S)
1169layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ3_S {
1170   block_iq3_s block;
1171};
1172
1173float16_t dequantFuncIQ3_S(const in decodeBufIQ3_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1174{
1175    uint idx = coordInBlock[1];
1176
1177    const uint iqs = (idx & 0xFC) >> 2;           // 0..63
1178    const uint iqh = (idx & 0xE0) >> 5;
1179
1180    const float d = float(bl.block.d);
1181    const uint qs = bl.block.qs[iqs];
1182    const uint qh = bl.block.qh[iqh];
1183    const int8_t sign = int8_t(bl.block.signs[iqs / 2] >> (idx & 0x6));
1184    const uint scale = bl.block.scales[iqs / 16];
1185    const ivec2 sign01 = ivec2(1 - (2 & ivec2(sign << 1, sign)));
1186    const float db = d * (1 + 2 * ((scale >> (4 * (iqh & 1))) & 0xf));
1187    const uint32_t grid = iq3s_grid[qs | ((qh << (8 - (iqs % 8))) & 256)] >> ((idx & 2) << 3);
1188    const vec2 v = db * vec2(sign01) * vec2(unpack8(grid).xy);
1189
1190    return float16_t(v[idx & 1]);
1191}
1192
1193f16vec4 dequantFuncIQ3_S_v(const in decodeBufIQ3_S bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1194{
1195    const uint idx = coordInBlock[1];
1196
1197    const uint iqs = idx >> 2;
1198    const uint iqh = idx >> 5;
1199
1200    const float d     = float(bl.block.d);
1201    const uint  qs    = bl.block.qs[iqs];
1202    const uint  qh    = bl.block.qh[iqh];
1203    const uint  sb    = uint(bl.block.signs[iqs / 2]) >> (idx & 0x6u);
1204    const uint  scale = bl.block.scales[iqs / 16];
1205    const float db    = d * (1 + 2 * ((scale >> (4 * (iqh & 1))) & 0xf));
1206
1207    const uint   grid = iq3s_grid[qs | ((qh << (8 - (iqs % 8))) & 256)];
1208    const u8vec4 g    = unpack8(grid);
1209
1210    return f16vec4(
1211        db * float(g.x) * ((sb & 1u) != 0u ? -1.0 : 1.0),
1212        db * float(g.y) * ((sb & 2u) != 0u ? -1.0 : 1.0),
1213        db * float(g.z) * ((sb & 4u) != 0u ? -1.0 : 1.0),
1214        db * float(g.w) * ((sb & 8u) != 0u ? -1.0 : 1.0));
1215}
1216#endif
1217
1218#if defined(DATA_A_IQ4_XS)
1219layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ4_XS {
1220   block_iq4_xs block;
1221};
1222
1223layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufIQ4_XS_packed32 {
1224   block_iq4_xs_packed32 block;
1225};
1226
1227float16_t dequantFuncIQ4_XS(const in decodeBufIQ4_XS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1228{
1229    const float16_t d = bl.block.d;
1230    const uint idx = coordInBlock[1];
1231
1232    const uint ib32 = (idx & 0xE0) >> 5; // 0..7
1233
1234    const uint sl = (bl.block.scales_l[ib32/2] >> (4 * (ib32 & 1))) & 0xF;
1235    const uint sh = ((bl.block.scales_h) >> (2 * ib32)) & 3;
1236    const uint qshift = (idx & 16) >> 2;
1237    const uint q = (bl.block.qs[16 * ib32 + (idx % 16)] >> qshift) & 0xF;
1238
1239    float16_t ret = d * float16_t(int(sl | (sh << 4)) - 32) * float16_t(kvalues_iq4nl[q]);
1240    return ret;
1241}
1242
1243f16vec4 dequantFuncIQ4_XS_v(const in decodeBufIQ4_XS bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1244{
1245    decodeBufIQ4_XS_packed32 bl32 = decodeBufIQ4_XS_packed32(bl);
1246    const float16_t d = bl.block.d;
1247    const uint idx = coordInBlock[1];
1248
1249    const uint ib32   = idx >> 5;                                   // 0..7
1250    const uint sl     = (bl32.block.scales_l >> (4 * ib32)) & 0xF;
1251    const uint sh     = (uint(bl32.block.scales_h) >> (2 * ib32)) & 0x3;
1252    const uint qshift = (idx & 0x10) >> 2;                          // {0, 4}
1253    const uint qs_w   = 4 * ib32 + ((idx & 0xC) >> 2);              // iqs / 4, in [0,32)
1254
1255    const float16_t dl = d * float16_t(int(sl | (sh << 4)) - 32);
1256
1257    const uint qsw  = bl32.block.qs[qs_w];
1258    const u8vec4 qv = unpack8((qsw >> qshift) & 0x0F0F0F0Fu);
1259    const vec4 ret = vec4(
1260        float(kvalues_iq4nl[qv.x]),
1261        float(kvalues_iq4nl[qv.y]),
1262        float(kvalues_iq4nl[qv.z]),
1263        float(kvalues_iq4nl[qv.w])) * float(dl);
1264    return f16vec4(ret);
1265}
1266#endif
1267
1268#if defined(DATA_A_IQ4_NL)
1269layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ4_NL {
1270   block_iq4_nl block;
1271};
1272
1273layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufIQ4_NL_packed16 {
1274   block_iq4_nl_packed16 block;
1275};
1276
1277float16_t dequantFuncIQ4_NL(const in decodeBufIQ4_NL bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1278{
1279    const float16_t d = bl.block.d;
1280    const uint idx = coordInBlock[1];
1281    const uint iqs = idx & 0xF;
1282    const uint shift = (idx & 0x10) >> 2;
1283    uint32_t qs = bl.block.qs[iqs];
1284    qs >>= shift;
1285    qs &= 0xF;
1286    float16_t ret = float16_t(kvalues_iq4nl[qs]) * d;
1287    return ret;
1288}
1289
1290f16vec4 dequantFuncIQ4_NL_v(const in decodeBufIQ4_NL bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1291{
1292    decodeBufIQ4_NL_packed16 bl16 = decodeBufIQ4_NL_packed16(bl);
1293    const float16_t d = bl.block.d;
1294    const uint idx = coordInBlock[1];
1295    const uint shift = (idx & 0x10) >> 2;     // 0 or 4
1296    const uint qs_i  = (idx & 0xC) >> 1;      // packed16 word index, in {0,2,4,6}
1297    const uint qsw = uint32_t(bl16.block.qs[qs_i    ])
1298                   | (uint32_t(bl16.block.qs[qs_i + 1u]) << 16);
1299    // shift in {0,4}: per-byte mask 0x0F isolates the wanted nibble in each byte.
1300    const u8vec4 q = unpack8((qsw >> shift) & 0x0F0F0F0Fu);
1301    return f16vec4(
1302        float(d) * float(kvalues_iq4nl[q.x]),
1303        float(d) * float(kvalues_iq4nl[q.y]),
1304        float(d) * float(kvalues_iq4nl[q.z]),
1305        float(d) * float(kvalues_iq4nl[q.w]));
1306}
1307#endif
1308
1309#if defined(DATA_A_MXFP4)
1310layout(buffer_reference, std430, buffer_reference_align = 2) buffer decodeBufMXFP4 {
1311   block_mxfp4 block;
1312};
1313
1314float16_t dequantFuncMXFP4(const in decodeBufMXFP4 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1315{
1316    const float d = e8m0_to_fp32(bl.block.e);
1317    const uint idx = coordInBlock[1];
1318    const uint iqs = idx & 0xF;
1319    const uint shift = (idx & 0x10) >> 2;
1320#ifdef USE_OCP_FP4
1321    return float16_t(bitcastExtractfe2m1EXT(bl.block.qs[iqs], shift)) * float16_t(d);
1322#else
1323    uint32_t qs = bl.block.qs[iqs];
1324    qs >>= shift;
1325    qs &= 0xF;
1326    float16_t ret = float16_t(kvalues_mxfp4[qs] * d * 0.5);
1327    return ret;
1328#endif
1329}
1330
1331f16vec4 dequantFuncMXFP4_v(const in decodeBufMXFP4 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1332{
1333    const float d = e8m0_to_fp32(bl.block.e);
1334    const uint idx = coordInBlock[1];
1335    const uint iqs = idx & 0xF;
1336    const uint shift = (idx & 0x10) >> 2;
1337#ifdef USE_OCP_FP4
1338    const fe2m1vec4 qv = bitcastExtractfe2m1EXT(
1339        u8vec4(
1340            bl.block.qs[iqs],
1341            bl.block.qs[iqs + 1u],
1342            bl.block.qs[iqs + 2u],
1343            bl.block.qs[iqs + 3u]),
1344        shift);
1345    return f16vec4(qv) * float16_t(d);
1346#else
1347    uvec4 qv = uvec4(
1348        uint(bl.block.qs[iqs]),
1349        uint(bl.block.qs[iqs + 1u]),
1350        uint(bl.block.qs[iqs + 2u]),
1351        uint(bl.block.qs[iqs + 3u]));
1352    qv = (qv >> shift) & 0xFu;
1353    const vec4 ret = vec4(
1354        float(kvalues_mxfp4[qv.x]),
1355        float(kvalues_mxfp4[qv.y]),
1356        float(kvalues_mxfp4[qv.z]),
1357        float(kvalues_mxfp4[qv.w])) * d * 0.5f;
1358    return f16vec4(ret);
1359#endif
1360}
1361#endif
1362
1363#if defined(DATA_A_NVFP4)
1364layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufNVFP4 {
1365   block_nvfp4 block;
1366};
1367
1368layout(buffer_reference, std430, buffer_reference_align = 4) buffer decodeBufNVFP4_packed32 {
1369   block_nvfp4_packed32 block;
1370};
1371
1372float16_t dequantFuncNVFP4(const in decodeBufNVFP4 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1373{
1374    const uint idx = coordInBlock[1];
1375    const uint sub = (idx & 0x30) >> 4;
1376    const uint iqs = ((idx & 0x30) >> 1) + (idx & 0x7);
1377    const uint shift = (idx & 0x8) >> 1;
1378#ifdef USE_OCP_FP4
1379    const float16_t d = float16_t(ue4m3_from_bits(bl.block.d[sub]));
1380    return float16_t(bitcastExtractfe2m1EXT(bl.block.qs[iqs], shift)) * d;
1381#else
1382    const float d = ue4m3_to_fp32(bl.block.d[sub]);
1383    uint qs = uint(bl.block.qs[iqs]);
1384    qs = (qs >> shift) & 0xF;
1385    return float16_t(kvalues_mxfp4[qs] * d * 0.5);
1386#endif
1387}
1388
1389f16vec4 dequantFuncNVFP4_v(const in decodeBufNVFP4 bl, const in uint blockCoords[2], const in uint coordInBlock[2])
1390{
1391    decodeBufNVFP4_packed32 bl32 = decodeBufNVFP4_packed32(bl);
1392    const uint idx = coordInBlock[1];
1393    const uint sub   = idx >> 4;
1394    const uint qs_w  = ((idx & 0x30) >> 3) + ((idx & 0x4u) >> 2);  // iqs / 4, in [0,8)
1395    const uint shift = (idx & 0x8) >> 1;
1396
1397    const uint qsw  = uint32_t(bl32.block.qs[qs_w]);
1398#ifdef USE_OCP_FP4
1399    const float16_t d = float16_t(ue4m3_from_bits(bl.block.d[sub]));
1400    const fe2m1vec4 qv = bitcastExtractfe2m1EXT(unpack8(qsw), shift);
1401    return f16vec4(qv) * d;
1402#else
1403    const float d = ue4m3_to_fp32(bl.block.d[sub]);
1404    const u8vec4 qv = unpack8((qsw >> shift) & 0x0F0F0F0Fu);
1405    const vec4 ret = vec4(
1406        float(kvalues_mxfp4[qv.x]),
1407        float(kvalues_mxfp4[qv.y]),
1408        float(kvalues_mxfp4[qv.z]),
1409        float(kvalues_mxfp4[qv.w])) * d * 0.5f;
1410    return f16vec4(ret);
1411#endif
1412}
1413#endif
1414
1415#if defined(DATA_A_Q1_0)
1416#define dequantFuncA dequantFuncQ1_0
1417#define dequantFuncA_v dequantFuncQ1_0_v
1418#elif defined(DATA_A_Q2_0)
1419#define dequantFuncA dequantFuncQ2_0
1420#define dequantFuncA_v dequantFuncQ2_0_v
1421#elif defined(DATA_A_Q4_0)
1422#define dequantFuncA dequantFuncQ4_0
1423#define dequantFuncA_v dequantFuncQ4_0_v
1424#elif defined(DATA_A_Q4_1)
1425#define dequantFuncA dequantFuncQ4_1
1426#define dequantFuncA_v dequantFuncQ4_1_v
1427#elif defined(DATA_A_Q5_0)
1428#define dequantFuncA dequantFuncQ5_0
1429#define dequantFuncA_v dequantFuncQ5_0_v
1430#elif defined(DATA_A_Q5_1)
1431#define dequantFuncA dequantFuncQ5_1
1432#define dequantFuncA_v dequantFuncQ5_1_v
1433#elif defined(DATA_A_Q8_0)
1434#define dequantFuncA dequantFuncQ8_0
1435#define dequantFuncA_v dequantFuncQ8_0_v
1436#elif defined(DATA_A_TQ1_0)
1437#define dequantFuncA dequantFuncTQ1_0
1438#elif defined(DATA_A_TQ2_0)
1439#define dequantFuncA dequantFuncTQ2_0
1440#define dequantFuncA_v dequantFuncTQ2_0_v
1441#elif defined(DATA_A_Q2_K)
1442#define dequantFuncA dequantFuncQ2_K
1443#define dequantFuncA_v dequantFuncQ2_K_v
1444#elif defined(DATA_A_Q3_K)
1445#define dequantFuncA dequantFuncQ3_K
1446#define dequantFuncA_v dequantFuncQ3_K_v
1447#elif defined(DATA_A_Q4_K)
1448#define dequantFuncA dequantFuncQ4_K
1449#define dequantFuncA_v dequantFuncQ4_K_v
1450#define fetch_scales fetch_scalesQ4_K
1451#define store_scales store_scalesQ4_K
1452#elif defined(DATA_A_Q5_K)
1453#define dequantFuncA dequantFuncQ5_K
1454#define dequantFuncA_v dequantFuncQ5_K_v
1455#define fetch_scales fetch_scalesQ5_K
1456#define store_scales store_scalesQ4_K
1457#elif defined(DATA_A_Q6_K)
1458#define dequantFuncA dequantFuncQ6_K
1459#define dequantFuncA_v dequantFuncQ6_K_v
1460#elif defined(DATA_A_IQ1_S)
1461#define dequantFuncA dequantFuncIQ1_S
1462#define dequantFuncA_v dequantFuncIQ1_S_v
1463#elif defined(DATA_A_IQ1_M)
1464#define dequantFuncA dequantFuncIQ1_M
1465#define dequantFuncA_v dequantFuncIQ1_M_v
1466#elif defined(DATA_A_IQ2_XXS)
1467#define dequantFuncA dequantFuncIQ2_XXS
1468#define dequantFuncA_v dequantFuncIQ2_XXS_v
1469#elif defined(DATA_A_IQ2_XS)
1470#define dequantFuncA dequantFuncIQ2_XS
1471#define dequantFuncA_v dequantFuncIQ2_XS_v
1472#elif defined(DATA_A_IQ2_S)
1473#define dequantFuncA dequantFuncIQ2_S
1474#define dequantFuncA_v dequantFuncIQ2_S_v
1475#elif defined(DATA_A_IQ3_XXS)
1476#define dequantFuncA dequantFuncIQ3_XXS
1477#define dequantFuncA_v dequantFuncIQ3_XXS_v
1478#elif defined(DATA_A_IQ3_S)
1479#define dequantFuncA dequantFuncIQ3_S
1480#define dequantFuncA_v dequantFuncIQ3_S_v
1481#elif defined(DATA_A_IQ4_XS)
1482#define dequantFuncA dequantFuncIQ4_XS
1483#define dequantFuncA_v dequantFuncIQ4_XS_v
1484#elif defined(DATA_A_IQ4_NL)
1485#define dequantFuncA dequantFuncIQ4_NL
1486#define dequantFuncA_v dequantFuncIQ4_NL_v
1487#elif defined(DATA_A_MXFP4)
1488#define dequantFuncA dequantFuncMXFP4
1489#define dequantFuncA_v dequantFuncMXFP4_v
1490#elif defined(DATA_A_NVFP4)
1491#define dequantFuncA dequantFuncNVFP4
1492#define dequantFuncA_v dequantFuncNVFP4_v
1493#elif defined(DATA_A_F32)
1494#define dequantFuncA dequantFuncF32
1495#endif