@@ -1364,8 +1364,8 @@ inline static void ggml_vec_dot_q4_0(const int n, float * restrict s, const void
1364
1364
const int8x16_t v0_1hs = vsubq_s8(v0_1h, s8b);
1365
1365
const int8x16_t v1_1hs = vsubq_s8(v1_1h, s8b);
1366
1366
1367
+ #if defined(__ARM_FEATURE_DOTPROD)
1367
1368
// dot product into int16x8_t
1368
- // assume that vdotq_s32 is always available, if not, should check for __ARM_FEATURE_DOTPROD
1369
1369
int32x4_t p_0 = vdotq_s32(vdupq_n_s32(0), v0_0ls, v1_0ls);
1370
1370
int32x4_t p_1 = vdotq_s32(vdupq_n_s32(0), v0_1ls, v1_1ls);
1371
1371
@@ -1379,6 +1379,37 @@ inline static void ggml_vec_dot_q4_0(const int n, float * restrict s, const void
1379
1379
#else
1380
1380
sum0 += d0_0*d1_0*(vgetq_lane_s32(p_0, 0) + vgetq_lane_s32(p_0, 1) + vgetq_lane_s32(p_0, 2) + vgetq_lane_s32(p_0, 3));
1381
1381
sum1 += d0_1*d1_1*(vgetq_lane_s32(p_1, 0) + vgetq_lane_s32(p_1, 1) + vgetq_lane_s32(p_1, 2) + vgetq_lane_s32(p_1, 3));
1382
+ #endif
1383
+ #else
1384
+ const int16x8_t pl0l = vmull_s8(vget_low_s8 (v0_0ls), vget_low_s8 (v1_0ls));
1385
+ const int16x8_t pl0h = vmull_s8(vget_high_s8(v0_0ls), vget_high_s8(v1_0ls));
1386
+
1387
+ const int16x8_t ph0l = vmull_s8(vget_low_s8 (v0_0hs), vget_low_s8 (v1_0hs));
1388
+ const int16x8_t ph0h = vmull_s8(vget_high_s8(v0_0hs), vget_high_s8(v1_0hs));
1389
+
1390
+ const int16x8_t pl1l = vmull_s8(vget_low_s8 (v0_1ls), vget_low_s8 (v1_1ls));
1391
+ const int16x8_t pl1h = vmull_s8(vget_high_s8(v0_1ls), vget_high_s8(v1_1ls));
1392
+
1393
+ const int16x8_t ph1l = vmull_s8(vget_low_s8 (v0_1hs), vget_low_s8 (v1_1hs));
1394
+ const int16x8_t ph1h = vmull_s8(vget_high_s8(v0_1hs), vget_high_s8(v1_1hs));
1395
+
1396
+ const int16x8_t pl_0 = vaddq_s16(pl0l, pl0h);
1397
+ const int16x8_t ph_0 = vaddq_s16(ph0l, ph0h);
1398
+
1399
+ const int16x8_t pl_1 = vaddq_s16(pl1l, pl1h);
1400
+ const int16x8_t ph_1 = vaddq_s16(ph1l, ph1h);
1401
+
1402
+ const int16x8_t p_0 = vaddq_s16(pl_0, ph_0);
1403
+ const int16x8_t p_1 = vaddq_s16(pl_1, ph_1);
1404
+
1405
+ // scalar
1406
+ #if defined(__ARM_FEATURE_QRDMX)
1407
+ sum0 += d0_0*d1_0*vaddvq_s16(p_0);
1408
+ sum1 += d0_1*d1_1*vaddvq_s16(p_1);
1409
+ #else
1410
+ sum0 += d0_0*d1_0*(vgetq_lane_s16(p_0, 0) + vgetq_lane_s16(p_0, 1) + vgetq_lane_s16(p_0, 2) + vgetq_lane_s16(p_0, 3) + vgetq_lane_s16(p_0, 4) + vgetq_lane_s16(p_0, 5) + vgetq_lane_s16(p_0, 6) + vgetq_lane_s16(p_0, 7));
1411
+ sum1 += d0_1*d1_1*(vgetq_lane_s16(p_1, 0) + vgetq_lane_s16(p_1, 1) + vgetq_lane_s16(p_1, 2) + vgetq_lane_s16(p_1, 3) + vgetq_lane_s16(p_1, 4) + vgetq_lane_s16(p_1, 5) + vgetq_lane_s16(p_1, 6) + vgetq_lane_s16(p_1, 7));
1412
+ #endif
1382
1413
#endif
1383
1414
}
1384
1415
0 commit comments