Support QC8 DWCONV microkernels

- Minimal set of 8-bit fixed-point microkernels with per-channel quantization
(QC8) optimized for AVX2.
- Extend packing functions to allow extra space after the kernel data.
Per-channel quantization parameters are later packed into that space.
- Extend DWConvMicrokernelTester to support unit testing of QC8 DWCONV.

PiperOrigin-RevId: 377620717
diff --git a/BUILD.bazel b/BUILD.bazel
index 54fd96e..209c8c2 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -3649,6 +3649,18 @@
     "src/math/sigmoid-avx2-rr2-p5-div.c",
     "src/math/sigmoid-avx2-rr2-p5-nr1fma.c",
     "src/math/sigmoid-avx2-rr2-p5-nr2fma.c",
+    "src/qc8-dwconv/gen/up8x9-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up8x25-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul16.c",
+    "src/qc8-dwconv/gen/up16x9-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul16.c",
+    "src/qc8-dwconv/gen/up16x25-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up24x9-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up24x25-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul16.c",
+    "src/qc8-dwconv/gen/up32x9-minmax-fp32-avx2-mul32.c",
+    "src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul16.c",
+    "src/qc8-dwconv/gen/up32x25-minmax-fp32-avx2-mul32.c",
     "src/qc8-gemm/gen/1x8c8-minmax-fp32-avx2.c",
     "src/qc8-gemm/gen/1x8c8-xw-minmax-fp32-avx2.c",
     "src/qc8-gemm/gen/2x8c8-minmax-fp32-avx2.c",
@@ -7235,6 +7247,17 @@
 )
 
 xnnpack_unit_test(
+    name = "qc8_dwconv_minmax_fp32_test",
+    timeout = "moderate",
+    srcs = [
+        "test/qc8-dwconv-minmax-fp32.cc",
+        "test/dwconv-microkernel-tester.h",
+        "src/xnnpack/AlignedAllocator.h",
+    ] + WEIGHTS_PACK_HDRS + MICROKERNEL_TEST_HDRS,
+    deps = MICROKERNEL_TEST_DEPS + [":packing"],
+)
+
+xnnpack_unit_test(
     name = "qc8_gemm_minmax_fp32_test",
     timeout = "moderate",
     srcs = [