@@ -1682,21 +1682,6 @@ void ggml_vec_dot_tq2_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const vo
16821682#endif
16831683}
16841684
1685- // repack q8_K qs from contiguous to planar layout (in-place, per 64-byte chunk)
1686- // after repack, vld1q_s8 reads produce the same values as vld4q_s8 de-interleave
1687- void stq1_0_repack_q8_K_inplace (void * vy , int nb ) {
1688- block_q8_K * y = (block_q8_K * ) vy ;
1689- for (int i = 0 ; i < nb ; ++ i ) {
1690- for (int j = 0 ; j < QK_K ; j += 64 ) {
1691- const int8x16x4_t v = vld4q_s8 (y [i ].qs + j );
1692- vst1q_s8 (y [i ].qs + j + 0 , v .val [0 ]);
1693- vst1q_s8 (y [i ].qs + j + 16 , v .val [1 ]);
1694- vst1q_s8 (y [i ].qs + j + 32 , v .val [2 ]);
1695- vst1q_s8 (y [i ].qs + j + 48 , v .val [3 ]);
1696- }
1697- }
1698- }
1699-
17001685void ggml_vec_dot_stq1_0_q8_K (int n , float * GGML_RESTRICT s , size_t bs , const void * GGML_RESTRICT vx , size_t bx , const void * GGML_RESTRICT vy , size_t by , int nrc ) {
17011686 assert (nrc == 1 );
17021687 UNUSED (nrc );
@@ -1714,7 +1699,7 @@ void ggml_vec_dot_stq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
17141699
17151700 const uint8x16_t m3 = vdupq_n_u8 (3 );
17161701 const uint8x16_t mask_0f = vdupq_n_u8 (0x0F );
1717- const uint8_t ( * sign_lut_16 )[ 8 ] = (const uint8_t ( * )[ 8 ] ) table_b2b_0 ;
1702+ const uint8_t * sign_lut_16 = (const uint8_t * )( const void * ) table_b2b_0 ;
17181703
17191704#if defined(__ARM_FEATURE_DOTPROD )
17201705 // dotprod path: single 32-byte tbl lookup + native vdotq.
@@ -1736,20 +1721,20 @@ void ggml_vec_dot_stq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
17361721#endif
17371722
17381723 // Each half processes 16 bytes of x.qs (32 codes), 4 bytes of x.sign,
1739- // and 128 bytes of y.qs (4 lanes × 16 bytes × 2 wide-blocks).
1740- // sumi0..sumi3, mask_0f, sign_lut_16, m3, STQ1_0_LOOKUP, STQ1_0_DOT are
1741- // captured from the enclosing scope .
1724+ // and 128 bytes of y.qs (2 chunks of 64 B). Stride-16 grouping lets each
1725+ // lane plane be a contiguous 16-byte slice of y (offsets 0/16/32/48 within
1726+ // a chunk), so we read it with plain vld1q_s8 — no deinterleave needed .
17421727#define STQ1_0_DOT_HALF (QS_PTR , SIGN_PTR , YP_PTR ) do { \
17431728 const uint8x16_t packed = vld1q_u8(QS_PTR); \
17441729 const uint8x16_t lo = vandq_u8(packed, mask_0f); \
17451730 const uint8x16_t hi = vshrq_n_u8(packed, 4); \
17461731 const uint8x16_t idx0 = vzip1q_u8(lo, hi); \
17471732 const uint8x16_t idx1 = vzip2q_u8(lo, hi); \
17481733 const uint8_t * sp = (SIGN_PTR); \
1749- const uint8x16_t s0 = vcombine_u8(vld1_u8(sign_lut_16[ sp[0]]), \
1750- vld1_u8(sign_lut_16[ sp[1]] )); \
1751- const uint8x16_t s1 = vcombine_u8(vld1_u8(sign_lut_16[ sp[2]]), \
1752- vld1_u8(sign_lut_16[ sp[3]] )); \
1734+ const uint8x16_t s0 = vcombine_u8(vld1_u8(sign_lut_16 + 8* sp[0]), \
1735+ vld1_u8(sign_lut_16 + 8* sp[1])); \
1736+ const uint8x16_t s1 = vcombine_u8(vld1_u8(sign_lut_16 + 8* sp[2]), \
1737+ vld1_u8(sign_lut_16 + 8* sp[3])); \
17531738 const uint8x16_t sel_0 = STQ1_0_LOOKUP(vorrq_u8(idx0, s0)); \
17541739 const uint8x16_t sel_1 = STQ1_0_LOOKUP(vorrq_u8(idx1, s1)); \
17551740 const int8x16_t sqx0 = vreinterpretq_s8_u8(vandq_u8(sel_0, m3)); \
@@ -1761,14 +1746,14 @@ void ggml_vec_dot_stq1_0_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const v
17611746 const int8x16_t sqx6 = vreinterpretq_s8_u8(vandq_u8(vshrq_n_u8(sel_1, 4), m3)); \
17621747 const int8x16_t sqx7 = vreinterpretq_s8_u8(vshrq_n_u8(sel_1, 6)); \
17631748 const int8_t * yp = (YP_PTR); \
1764- sumi0 = STQ1_0_DOT(sumi0, sqx0, vld1q_s8(yp + 0)); \
1765- sumi1 = STQ1_0_DOT(sumi1, sqx1, vld1q_s8(yp + 16)); \
1766- sumi2 = STQ1_0_DOT(sumi2, sqx2, vld1q_s8(yp + 32)); \
1767- sumi3 = STQ1_0_DOT(sumi3, sqx3, vld1q_s8(yp + 48)); \
1768- sumi0 = STQ1_0_DOT(sumi0, sqx4, vld1q_s8(yp + 64)); \
1769- sumi1 = STQ1_0_DOT(sumi1, sqx5, vld1q_s8(yp + 80)); \
1770- sumi2 = STQ1_0_DOT(sumi2, sqx6, vld1q_s8(yp + 96)); \
1771- sumi3 = STQ1_0_DOT(sumi3, sqx7, vld1q_s8(yp + 112)); \
1749+ sumi0 = STQ1_0_DOT(sumi0, sqx0, vld1q_s8(yp + 0)); \
1750+ sumi1 = STQ1_0_DOT(sumi1, sqx1, vld1q_s8(yp + 16)); \
1751+ sumi2 = STQ1_0_DOT(sumi2, sqx2, vld1q_s8(yp + 32)); \
1752+ sumi3 = STQ1_0_DOT(sumi3, sqx3, vld1q_s8(yp + 48)); \
1753+ sumi0 = STQ1_0_DOT(sumi0, sqx4, vld1q_s8(yp + 64)); \
1754+ sumi1 = STQ1_0_DOT(sumi1, sqx5, vld1q_s8(yp + 80)); \
1755+ sumi2 = STQ1_0_DOT(sumi2, sqx6, vld1q_s8(yp + 96)); \
1756+ sumi3 = STQ1_0_DOT(sumi3, sqx7, vld1q_s8(yp + 112)); \
17721757} while (0)
17731758
17741759 for (int i = 0 ; i < nb ; ++ i ) {
0 commit comments