From cbaff1f21f414a49e9a2c3cfb772b7e4abbac81f Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 11 Jun 2026 09:23:36 +0200 Subject: [PATCH 01/29] rebased --- _ptoas_build_backend.py | 51 +- docker/Dockerfile.dev | 84 + docs/designs/a2a3-dma-builtins.md | 3423 +++++++++++++++ docs/designs/a2a3-tadd-spec.md | 37 + docs/designs/a2a3-vector-builtins.md | 3660 +++++++++++++++++ include/PTO/IR/PTOOps.td | 1 + include/PTO/IR/VPTOUbOps.td | 134 + include/PTO/Transforms/Passes.h | 1 + include/PTO/Transforms/Passes.td | 21 + lib/PTO/IR/CMakeLists.txt | 1 + lib/PTO/IR/VPTO.cpp | 92 + lib/PTO/IR/VPTOUbOps.cpp | 66 + lib/PTO/Transforms/CMakeLists.txt | 1 + lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 1076 +++++ lib/PTO/Transforms/VPTOExpandWrapperOps.cpp | 140 +- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 540 ++- .../Transforms/VPTOLLVMEmitterDispatcher.cpp | 2 +- ptodsl/examples/bop_launch_a3.py | 253 ++ ptodsl/examples/tadd_launch_a3.py | 182 + ptodsl/ptodsl/_runtime/toolchain.py | 22 +- ptodsl/tests/test_runtime_toolchain.py | 38 + test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto | 28 + test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto | 28 + test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto | 26 + test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto | 27 + test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto | 25 + test/lit/vpto/ub/lower_tadd_a5_noop.pto | 30 + test/lit/vpto/ub/lower_tadd_chunked.pto | 32 + test/lit/vpto/ub/lower_tadd_chunked_tail.pto | 32 + test/lit/vpto/ub/lower_tadd_col_vl_align.pto | 32 + test/lit/vpto/ub/lower_tadd_count.pto | 27 + test/lit/vpto/ub/lower_tadd_count_large.pto | 33 + test/lit/vpto/ub/lower_tadd_flat.pto | 27 + test/lit/vpto/ub/lower_tadd_row_rpt.pto | 27 + test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto | 29 + test/lit/vpto/ub/lower_tadd_small.pto | 27 + test/lit/vpto/ub/lower_tadd_tail.pto | 27 + test/lit/vpto/ub/lower_tadd_to_ubvadd.pto | 49 + test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto | 26 + test/lit/vpto/ub/lower_tmul_to_ubvmul.pto | 26 + test/lit/vpto/ub/lower_tsub_to_ubvsub.pto | 26 + test/lit/vpto/ub/mte_gm_ub_a3_expand.pto | 47 + test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto | 27 + test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto | 32 + test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto | 27 + .../lit/vpto/ub/set_mask_a5_noop.pto | 24 +- test/lit/vpto/ub/set_mask_count_llvm.pto | 50 + test/lit/vpto/ub/set_mask_llvm.pto | 37 + test/lit/vpto/ub/ub_vadd_a5_noop.pto | 25 + test/lit/vpto/ub/ub_vadd_vpto_llvm.pto | 104 + test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto | 56 + tools/ptoas/ObjectEmission.cpp | 30 +- tools/ptoas/ptoas.cpp | 79 +- 53 files changed, 10789 insertions(+), 158 deletions(-) create mode 100644 docker/Dockerfile.dev create mode 100644 docs/designs/a2a3-dma-builtins.md create mode 100644 docs/designs/a2a3-tadd-spec.md create mode 100644 docs/designs/a2a3-vector-builtins.md create mode 100644 include/PTO/IR/VPTOUbOps.td create mode 100644 lib/PTO/IR/VPTOUbOps.cpp create mode 100644 lib/PTO/Transforms/LowerPTOToUBufOps.cpp create mode 100644 ptodsl/examples/bop_launch_a3.py create mode 100644 ptodsl/examples/tadd_launch_a3.py create mode 100644 ptodsl/tests/test_runtime_toolchain.py create mode 100644 test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto create mode 100644 test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto create mode 100644 test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto create mode 100644 test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto create mode 100644 test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto create mode 100644 test/lit/vpto/ub/lower_tadd_a5_noop.pto create mode 100644 test/lit/vpto/ub/lower_tadd_chunked.pto create mode 100644 test/lit/vpto/ub/lower_tadd_chunked_tail.pto create mode 100644 test/lit/vpto/ub/lower_tadd_col_vl_align.pto create mode 100644 test/lit/vpto/ub/lower_tadd_count.pto create mode 100644 test/lit/vpto/ub/lower_tadd_count_large.pto create mode 100644 test/lit/vpto/ub/lower_tadd_flat.pto create mode 100644 test/lit/vpto/ub/lower_tadd_row_rpt.pto create mode 100644 test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto create mode 100644 test/lit/vpto/ub/lower_tadd_small.pto create mode 100644 test/lit/vpto/ub/lower_tadd_tail.pto create mode 100644 test/lit/vpto/ub/lower_tadd_to_ubvadd.pto create mode 100644 test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto create mode 100644 test/lit/vpto/ub/lower_tmul_to_ubvmul.pto create mode 100644 test/lit/vpto/ub/lower_tsub_to_ubvsub.pto create mode 100644 test/lit/vpto/ub/mte_gm_ub_a3_expand.pto create mode 100644 test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto create mode 100644 test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto create mode 100644 test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto rename tools/ptoas/VPTOFatobjEmission.h => test/lit/vpto/ub/set_mask_a5_noop.pto (51%) create mode 100644 test/lit/vpto/ub/set_mask_count_llvm.pto create mode 100644 test/lit/vpto/ub/set_mask_llvm.pto create mode 100644 test/lit/vpto/ub/ub_vadd_a5_noop.pto create mode 100644 test/lit/vpto/ub/ub_vadd_vpto_llvm.pto create mode 100644 test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto diff --git a/_ptoas_build_backend.py b/_ptoas_build_backend.py index 0b183a5b58..a54a8208c7 100644 --- a/_ptoas_build_backend.py +++ b/_ptoas_build_backend.py @@ -35,17 +35,40 @@ from pathlib import Path _REPO = Path(__file__).parent.resolve() -_LLVM_BUILD_DIR = Path( - os.environ.get("LLVM_BUILD_DIR", - "/llvm-workspace/llvm-project/build-shared") -) + +def _find_llvm_dir(): + """Return an LLVM install or build-tree prefix, resolving in order: + + 1. ``LLVM_BUILD_DIR`` / ``LLVM_INSTALL_DIR`` env vars + 2. Auto-detect common install locations by probing ``lib/cmake/llvm`` + 3. Default build-tree path + """ + for key in ("LLVM_BUILD_DIR", "LLVM_INSTALL_DIR"): + if key in os.environ: + return Path(os.environ[key]) + + for cand in ("/usr/local/llvm", "/usr/local/Ascend/latest/compiler", + "/opt/llvm"): + if (Path(cand) / "lib" / "cmake" / "llvm").is_dir(): + return Path(cand) + + return Path("/llvm-workspace/llvm-project/build-shared") + + +_LLVM_BUILD_DIR = _find_llvm_dir() _PTO_INSTALL_DIR = Path( os.environ.get("PTO_INSTALL_DIR", str(_REPO / "install")) ) _BUILD_DIR = Path(os.environ.get("PTO_BUILD_DIR", str(_REPO / "build"))) -_MLIR_PY_PKG = ( - _LLVM_BUILD_DIR / "tools" / "mlir" / "python_packages" / "mlir_core" -) +_MLIR_PY_PKG = None +if "MLIR_PYTHON_PACKAGE_DIR" in os.environ: + _MLIR_PY_PKG = Path(os.environ["MLIR_PYTHON_PACKAGE_DIR"]) +elif "LLVM_INSTALL_DIR" in os.environ: + _MLIR_PY_PKG = Path(os.environ["LLVM_INSTALL_DIR"]) / "python_packages" / "mlir_core" +else: + _installed = _LLVM_BUILD_DIR / "python_packages" / "mlir_core" + _build_tree = _LLVM_BUILD_DIR / "tools" / "mlir" / "python_packages" / "mlir_core" + _MLIR_PY_PKG = _installed if _installed.exists() else _build_tree _WHEEL_DIST_DIR = _BUILD_DIR / "wheel-dist" @@ -98,7 +121,7 @@ def _should_use_linux_hardening_cache() -> bool: return sys.platform.startswith("linux") -def _cmake_configure_and_build(): +def _cmake_configure_and_build(skip_install=False): """CMake configure + Ninja build + install.""" _BUILD_DIR.mkdir(parents=True, exist_ok=True) @@ -110,6 +133,7 @@ def _cmake_configure_and_build(): "cmake", "-GNinja", f"-S{_REPO}", f"-B{_BUILD_DIR}", "-DCMAKE_BUILD_TYPE=Release", + "-DPTO_ENABLE_PYTHON_BINDING=ON", f"-DLLVM_DIR={_LLVM_BUILD_DIR}/lib/cmake/llvm", f"-DMLIR_DIR={_LLVM_BUILD_DIR}/lib/cmake/mlir", f"-DPython3_ROOT_DIR={sys.prefix}", @@ -135,7 +159,8 @@ def _cmake_configure_and_build(): subprocess.check_call(cmake_cmd) subprocess.check_call(["ninja", "-C", str(_BUILD_DIR)]) - subprocess.check_call(["ninja", "-C", str(_BUILD_DIR), "install"]) + if not skip_install: + subprocess.check_call(["ninja", "-C", str(_BUILD_DIR), "install"]) def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): @@ -179,7 +204,7 @@ def build_editable(wheel_directory, config_settings=None, metadata_directory=Non installs a .pth file pointing sys.path at the build tree. No files are copied into site-packages except the .pth file itself. """ - _cmake_configure_and_build() + _cmake_configure_and_build(skip_install=True) version = os.environ.get("PTOAS_PYTHON_PACKAGE_VERSION", "0.1.0") @@ -187,10 +212,14 @@ def build_editable(wheel_directory, config_settings=None, metadata_directory=Non pth_paths = [ # mlir.* namespace + _pto.so (installed there by CMake) str(_MLIR_PY_PKG), - # _pto.so output directory (CMAKE_LIBRARY_OUTPUT_DIRECTORY) + # generated files (_pto.so, _pto_ops_gen.py) under mlir/ namespace str(_BUILD_DIR / "python"), + # handwritten Python sources (pto/dialects/pto.py, etc.) + str(_REPO / "python"), # ptodsl pure-Python sub-package str(_REPO / "ptodsl"), + # runtime resources installed by CMake (tilelang_dsl, TileOps, etc.) + str(_PTO_INSTALL_DIR), ] pth_content = "\n".join(pth_paths) + "\n" diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev new file mode 100644 index 0000000000..1fac15b39a --- /dev/null +++ b/docker/Dockerfile.dev @@ -0,0 +1,84 @@ +# PTOAS development environment with NPU support (CANN 9.0.0) +# +# Usage: +# docker build -f docker/Dockerfile.dev -t ptoas-dev-cann900 . +# +# This image provides the toolchain for building and running PTOAS on NPU. +# It does NOT contain PTOAS itself -- mount PTOAS source at /workspace and +# run `pip install -e .` inside the container. + +# ---- Base: CANN 9.0.0 (provides bisheng, CANN runtime, Python 3.12) ---- +FROM quay.io/ascend/cann:9.0.0-910b-ubuntu22.04-py3.12 + +# ---- Build args (matching CI) ---- +ARG LLVM_REPO=https://github.com/vpto-dev/llvm-project.git +ARG LLVM_REF=feature-vpto +ARG PTO_ISA_REPO=https://gitcode.com/cann/pto-isa.git +ARG PTO_ISA_COMMIT=662d7f2a916d6bbde3109ce4a16ed5c28f5d900a + +# ---- Paths ---- +ENV LLVM_SOURCE_DIR=/opt/llvm-project +ENV LLVM_BUILD_DIR=/opt/llvm-project/build +ENV LLVM_INSTALL_DIR=/usr/local/llvm +ENV ASCEND_HOME_PATH=/usr/local/Ascend/cann-9.0.0 +ENV PTO_LIB_PATH=/opt/pto-isa + +# ========================================================================= +# 1. System dependencies +# ========================================================================= +RUN apt-get update && apt-get install -y --no-install-recommends \ + cmake ninja-build git build-essential clang lld \ + libedit-dev zlib1g-dev libxml2-dev libzstd-dev \ + && rm -rf /var/lib/apt/lists/* + +# ========================================================================= +# 2. Python dependencies +# ========================================================================= +RUN pip install --no-cache-dir 'pybind11<3' numpy pyyaml + +# ========================================================================= +# 3. Build LLVM/MLIR (vpto fork, feature-vpto branch) +# ========================================================================= +RUN git clone --depth 1 --branch "${LLVM_REF}" "${LLVM_REPO}" "${LLVM_SOURCE_DIR}" + +WORKDIR ${LLVM_SOURCE_DIR} + +RUN cmake -G Ninja -S llvm -B "${LLVM_BUILD_DIR}" \ + -DLLVM_ENABLE_PROJECTS="mlir;clang" \ + -DBUILD_SHARED_LIBS=ON \ + -DLLVM_ENABLE_ASSERTIONS=ON \ + -DMLIR_ENABLE_BINDINGS_PYTHON=ON \ + -DPython3_EXECUTABLE=python3 \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_TARGETS_TO_BUILD="host" \ + -DCMAKE_INSTALL_PREFIX="${LLVM_INSTALL_DIR}" \ + -DLLVM_INSTALL_UTILS=ON + +RUN ninja -C "${LLVM_BUILD_DIR}" + +RUN cmake --install "${LLVM_BUILD_DIR}" + +# ========================================================================= +# 4. Clone pto-isa (headers for bisheng compilation of generated kernels) +# ========================================================================= +RUN git clone "${PTO_ISA_REPO}" "${PTO_LIB_PATH}" \ + && cd "${PTO_LIB_PATH}" && git checkout "${PTO_ISA_COMMIT}" + +# ========================================================================= +# 5. Torch + torch-npu (for on-device kernel launch) +# ========================================================================= +RUN pip install --no-cache-dir torch==2.9.0 --index-url https://download.pytorch.org/whl/cpu \ + && pip install --no-cache-dir torch-npu==2.9.0 + +# ========================================================================= +# 6. Environment +# ========================================================================= +ENV PATH="${LLVM_INSTALL_DIR}/bin:${ASCEND_HOME_PATH}/compiler/bin:${PATH}" +ENV LD_LIBRARY_PATH="${LLVM_INSTALL_DIR}/lib:${ASCEND_HOME_PATH}/lib64:${ASCEND_HOME_PATH}/lib64/plugin/opskernel:${ASCEND_HOME_PATH}/lib64/plugin/nnengine:${ASCEND_HOME_PATH}/opp/built-in/op_impl/ai_core/tbe/op_tiling/lib/linux/aarch64:${LD_LIBRARY_PATH}" +ENV MLIR_PYTHON_ROOT="${LLVM_INSTALL_DIR}/python_packages/mlir_core" + +ENV BISHENG_OPTS="-I${PTO_LIB_PATH}/include/pto -fPIC -shared -O2 -std=c++17 --npu-arch=dav-2201 -DMEMORY_BASE" + +WORKDIR /workspace + +CMD ["/bin/bash"] diff --git a/docs/designs/a2a3-dma-builtins.md b/docs/designs/a2a3-dma-builtins.md new file mode 100644 index 0000000000..7240931251 --- /dev/null +++ b/docs/designs/a2a3-dma-builtins.md @@ -0,0 +1,3423 @@ +# A2/A3 DMA Copy and Control Builtin Inventory + +## 1. Collection Constraints + +- Collection root: `.local/cann`, which is a symlink to `/home/mouliangyu/.local/ascend/beta.1/cann` in this workspace. +- Architecture scope: A2/A3 DMA/copy builtins exposed as `copy*` CCE builtin aliases, plus companion `set_*` controls used for DMA loop/stride/padding and fixpipe/fix-state setup; not vector compute `vcopy` and not A5 `vector_*` value-operand interfaces. +- Builtin-name mapping source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h` and `cce_aicore_intrinsics_3101.h`, using `clang_builtin_alias(__builtin_cce_copy*)` and `clang_builtin_alias(__builtin_cce_set_*)` declarations. +- Complete C++ signature sources: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h` for A2/A3 explicit wrapper signatures and CANN `// ->` packing comments, plus `.local/cann/tools/tikicpulib/lib/include/stub_fun.h` for additional `copy*` and companion `set_*` signatures that map to the same builtin aliases. +- Included signatures must map to a `__builtin_cce_copy*` or selected companion `__builtin_cce_set_*` alias and must not contain C++ reference parameters. Stub declarations using `const T&` or `T&` `tag*` parameters are treated as higher-level wrapper forms and are excluded. +- Excluded entries include `vcopy`, unrelated scalar/system controls, vector mask controls already covered by `a2a3-vector-builtins.md`, OPP/AscendC wrapper implementations, namespace-duplicate declarations, generic `copy*` aliases without a complete signature in the scanned sources, and declarations with C++ reference parameters. +- LLVM IR declarations are exact `declare` lines copied from local `ccec -save-temps` device `.ll` output. Actual probe calls are the exact `call` lines observed inside the generated probe kernel, so the listed IR signature is the compiler-emitted intrinsic signature for that probe, not a hand-derived signature. +- Entries marked as not captured do not have an exact local LLVM IR signature in this document. The local probe either did not cover that overload or `ccec` rejected it for the tested target feature set; this mark does not imply that the builtin has no lowering on every target. +- A single LLVM intrinsic can correspond to many C++ builtin overloads. In these cases the C++ overloads are only type/parameter conveniences; after overload resolution they lower to the same intrinsic shape, commonly with pointer address spaces plus one packed `i64` control operand. +- Parameter packing is source-derived, not inferred. The document uses CANN `// ->` comments as the authoritative wrapper packing formula; CANN `ASM:` comments identify the bottom-level operation/register but do not provide a bitfield formula; direct `uint64_t config` or `config0/config1` forms are already-packed bottom-level forms. +- `stub_fun.h` contains many declaration-only overloads without `// ->` comments. For those signatures the document records the complete C++ signature but does not invent a packing formula; use the nearest CANN `// ->` overload only when the signature is materially the same. +- Copy inventory count: 54 builtin names with complete signatures, 762 complete C++ signatures, 117 signatures with CANN packing comments, and 12 observed LLVM intrinsic names from partial probes. Companion control inventory count: 58 builtin names and 65 complete C++ signatures; 41 companion signatures have captured LLVM IR declarations. +- Alias names with no complete non-reference signature in the scanned sources: `__builtin_cce_copy_cbuf_to_cbuf_loopenhance`, `__builtin_cce_copy_cbuf_to_gm_align_no_padding`, `__builtin_cce_copy_cbuf_to_gm_multi_nz2dn`, `__builtin_cce_copy_cbuf_to_gm_multi_nz2nd`, `__builtin_cce_copy_gm_to_ubuf_align_no_padding`, `__builtin_cce_copy_ubuf_to_gm_align_no_padding`. + +## 2. Builtin Signatures + +- `__builtin_cce_copy_cbuf_to_bt` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:941` + - Observed LLVM intrinsic names: + - `llvm.hivm.MOV.L1.TO.BT` + - `llvm.hivm.MOV.L1.TO.BT.cfg` + - `llvm.hivm.andb64rr` + - `llvm.hivm.shli64ri` + - `llvm.hivm.orb64rr` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOV.L1.TO.BT.cfg(i64, ptr addrspace(2) nocapture readonly, i64, i64, i64, i64, i64) #1` + - `declare i64 @llvm.hivm.andb64rr(i64, i64) #2` + - `declare i64 @llvm.hivm.shli64ri(i64, i64) #2` + - `declare i64 @llvm.hivm.orb64rr(i64, i64) #2` + - `declare void @llvm.hivm.MOV.L1.TO.BT(i64, ptr addrspace(2) nocapture readonly, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOV.L1.TO.BT(i64 1, ptr addrspace(2) null, i64 281479271743504), !dbg !10` + - `call void @llvm.hivm.MOV.L1.TO.BT(i64 1, ptr addrspace(2) null, i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ bfloat16_t *src, bool convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1008. + - Parameter packing: Header packing comment: `/* #429 */ __builtin_cce_copy_cbuf_to_bt(dst, src, ((convControl & 0x1) << 3 | (nBurst & 0xfff) << 4 | (lenBurst & 0xffff) << 16 | (sourceGap & 0xffff) << 32 | (dstGap & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ bfloat16_t *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1003. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ float *src, bool convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1028. + - Parameter packing: Header packing comment: `/* #436 */ __builtin_cce_copy_cbuf_to_bt(dst, src, ((convControl & 0x1) << 3 | (nBurst & 0xfff) << 4 | (lenBurst & 0xffff) << 16 | (sourceGap & 0xffff) << 32 | (dstGap & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ float *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1023. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ half *src, bool convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1018. + - Parameter packing: Header packing comment: `/* #433 */ __builtin_cce_copy_cbuf_to_bt(dst, src, ((convControl & 0x1) << 3 | (nBurst & 0xfff) << 4 | (lenBurst & 0xffff) << 16 | (sourceGap & 0xffff) << 32 | (dstGap & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ half *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1013. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ int32_t *src, bool convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1038. + - Parameter packing: Header packing comment: `/* #439 */ __builtin_cce_copy_cbuf_to_bt(dst, src, ((convControl & 0x1) << 3 | (nBurst & 0xfff) << 4 | (lenBurst & 0xffff) << 16 | (sourceGap & 0xffff) << 32 | (dstGap & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ int32_t *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1033. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ bfloat16_t* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1085; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1088. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ bfloat16_t* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap, uint8_t fixVal);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1091; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1094. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ bfloat16_t* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1019; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1022. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ float* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1049; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1052. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ float* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap, uint8_t fixVal);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1055; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1058. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ float* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1031; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1034. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ half* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1061; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1064. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ half* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap, uint8_t fixVal);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1067; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1070. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ half* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1025; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1028. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ int32_t* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1073; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1076. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ int32_t* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap, uint8_t fixVal);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1079; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1082. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ int32_t* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1037; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1040. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ void* src, uint16_t convControl, uint16_t nBurst, uint16_t lenBurst, uint16_t sourceGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1043; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1046. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_bt(uint64_t dst, __cbuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1013; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1016. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_cbuf_to_fbuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:945` + - Observed LLVM intrinsic names: + - `llvm.hivm.MOV.L1.TO.FB.v220` + - `llvm.hivm.MOV.L1.TO.FB.v220.cfg` + - `llvm.hivm.andb64rr` + - `llvm.hivm.shli64ri` + - `llvm.hivm.orb64rr` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOV.L1.TO.FB.v220(ptr addrspace(7) nocapture writeonly, ptr addrspace(2) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.MOV.L1.TO.FB.v220.cfg(ptr addrspace(7) nocapture writeonly, ptr addrspace(2) nocapture readonly, i64, i64, i64, i64) #1` + - `declare i64 @llvm.hivm.andb64rr(i64, i64) #2` + - `declare i64 @llvm.hivm.shli64ri(i64, i64) #2` + - `declare i64 @llvm.hivm.orb64rr(i64, i64) #2` + - Actual probe calls: + - `call void @llvm.hivm.MOV.L1.TO.FB.v220(ptr addrspace(7) null, ptr addrspace(2) null, i64 1), !dbg !10` + - `call void @llvm.hivm.MOV.L1.TO.FB.v220(ptr addrspace(7) null, ptr addrspace(2) null, i64 281479271743504), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_fbuf(__fbuf__ void *dst, __cbuf__ void *src, uint16_t burstNum, uint16_t burstLen, uint16_t srcGapSize, uint16_t dstGapSize);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1048. + - Parameter packing: Header packing comment: `/* #452 */ __builtin_cce_copy_cbuf_to_fbuf(dst, src, ((burstNum & 0xfff) << 4 | (burstLen & 0xffff) << 16 | (srcGapSize & 0xffff) << 32 | (dstGapSize & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_fbuf(__fbuf__ void *dst, __cbuf__ void *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1043. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_fbuf(__fbuf__ void* dst, __cbuf__ void* src, uint16_t burstNum, uint16_t burstLen, uint16_t srcGapSize, uint16_t dstGapSize);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1103; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1106. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_fbuf(__fbuf__ void* dst, __cbuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1097; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1100. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_cbuf_to_fbuf_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:947` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_fbuf_v2(__fbuf__ void *dst, __cbuf__ void *src, uint16_t burst_num, uint16_t burst_len, uint16_t src_stride, uint16_t dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1058. + - Parameter packing: Header packing comment: `/* #454 */ __builtin_cce_copy_cbuf_to_fbuf_v2(dst, src, ((burst_num & 0xfff) << 4 | (burst_len & 0xffff) << 16 | (src_stride & 0xffff) << 32 | (dst_stride & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_fbuf_v2(__fbuf__ void *dst, __cbuf__ void *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1053. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_fbuf_v2(__fbuf__ void * dst, __cbuf__ void * src, uint16_t burst_num, uint16_t burst_len, uint16_t src_stride, uint16_t dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20468. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_fbuf_v2(__fbuf__ void * dst, __cbuf__ void * src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20467. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_cbuf_to_gm` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:949` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_gm(__gm__ void* dst, __cbuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1109. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_gm(__gm__ void* dst, __cbuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1110. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_cbuf_to_gm_align` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:951` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ float* dst, __cbuf__ float* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1112. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ half* dst, __cbuf__ half* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1111. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ int16_t* dst, __cbuf__ int16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1113. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ int32_t* dst, __cbuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1114. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ int8_t* dst, __cbuf__ int8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1115. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ uint16_t* dst, __cbuf__ uint16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1116. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ uint32_t* dst, __cbuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1117. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align(__gm__ uint8_t* dst, __cbuf__ uint8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1118. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_cbuf_to_gm_align_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:955` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ float* dst, __cbuf__ float* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2586. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ float* tag1, __cbuf__ float* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2595. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ float* tag1, __cbuf__ float* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2603. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ float* tag1, __cbuf__ float* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2611. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ half* dst, __cbuf__ half* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2587. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ half* tag1, __cbuf__ half* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2596. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ half* tag1, __cbuf__ half* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2604. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int16_t* tag1, __cbuf__ int16_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2592. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int16_t* tag1, __cbuf__ int16_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2600. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int16_t* tag1, __cbuf__ int16_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2608. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int32_t* tag1, __cbuf__ int32_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2594. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int32_t* tag1, __cbuf__ int32_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2602. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int32_t* tag1, __cbuf__ int32_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2610. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int8_t* dst, __cbuf__ int8_t* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2588. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int8_t* tag1, __cbuf__ int8_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2590. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int8_t* tag1, __cbuf__ int8_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2598. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ int8_t* tag1, __cbuf__ int8_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2606. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint16_t* tag1, __cbuf__ uint16_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2591. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint16_t* tag1, __cbuf__ uint16_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2599. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint16_t* tag1, __cbuf__ uint16_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2607. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint32_t* tag1, __cbuf__ uint32_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2593. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint32_t* tag1, __cbuf__ uint32_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2601. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint32_t* tag1, __cbuf__ uint32_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2609. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint8_t* tag1, __cbuf__ uint8_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2589. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint8_t* tag1, __cbuf__ uint8_t* tag2, uint8_t tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2597. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ uint8_t* tag1, __cbuf__ uint8_t* tag2, uint8_t tag3, uint16_t tag4, uint16_t tag5, uint16_t tag6, uint16_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2605. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ void * dst_addr, __cbuf__ void * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2584. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_gm_align_v2(__gm__ void * dst_addr, __cbuf__ void * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t l2_cache_ctl, uint64_t burst_dst_stride, uint32_t burst_src_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2585. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_cbuf_to_pt` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:961` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_pt(uint64_t dst, __cbuf__ void* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcGap, uint16_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20458. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_cbuf_to_pt(uint64_t dst, __cbuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20457. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_cbuf_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:963` + - Observed LLVM intrinsic names: + - `llvm.hivm.MOV.L1.TO.UB` + - `llvm.hivm.MOV.L1.TO.UB.cfg` + - `llvm.hivm.andb64rr` + - `llvm.hivm.shli64ri` + - `llvm.hivm.orb64rr` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOV.L1.TO.UB.cfg(ptr addrspace(6) nocapture writeonly, ptr addrspace(2) nocapture readonly, i64, i64, i64, i64, i64) #1` + - `declare i64 @llvm.hivm.andb64rr(i64, i64) #2` + - `declare i64 @llvm.hivm.shli64ri(i64, i64) #2` + - `declare i64 @llvm.hivm.orb64rr(i64, i64) #2` + - `declare void @llvm.hivm.MOV.L1.TO.UB(ptr addrspace(6) nocapture writeonly, ptr addrspace(2) nocapture readonly, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOV.L1.TO.UB(ptr addrspace(6) null, ptr addrspace(2) null, i64 281479271743504)` + - `call void @llvm.hivm.MOV.L1.TO.UB(ptr addrspace(6) null, ptr addrspace(2) null, i64 1)` + - Probe targets used: `dav-m200` + - Complete C++ signatures: + - `void __builtin_cce_copy_cbuf_to_ubuf(__ubuf__ void *dst_addr, __cbuf__ void *src_addr, bool sub_blockid, uint16_t burst_num, uint16_t burst_len, uint16_t src_gap, uint16_t dst_gap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1068. + - Parameter packing: Header packing comment: `/* #558 */ __builtin_cce_copy_cbuf_to_ubuf(dst_addr, src_addr, ((sub_blockid & 0x1) << 0 | (burst_num & 0xfff) << 4 | (burst_len & 0xffff) << 16 | (src_gap & 0xffff) << 32 | (dst_gap & 0xffff) << 48))` + - `void __builtin_cce_copy_cbuf_to_ubuf(__ubuf__ void *dst_addr, __cbuf__ void *src_addr, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1063. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_ubuf(__ubuf__ void* dst, __cbuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1119; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1122. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_cbuf_to_ubuf(__ubuf__ void* dst, __cbuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1125; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1128. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_depthwise_cc_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:965` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1137. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1138. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ float* dst, __cc__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1133. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ float* dst, __cc__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1134. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1135. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1136. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1131. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_depthwise_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1132. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:967` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf(__cbuf__ void* dst, __gm__ void* src, uint64_t config, pad_t padMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1139. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf(__cbuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, pad_t padMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1140. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_align` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:969` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ float* dst, __gm__ float* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1504. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ half* dst, __gm__ half* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1501. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ int16_t* dst, __gm__ int16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1499. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ int32_t* dst, __gm__ int32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1502. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1497. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ uint16_t* dst, __gm__ uint16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1500. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1503. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1498. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_align_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:971` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1073. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1078. + - Parameter packing: Header packing comment: `/* #595 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float *dst_addr, __gm__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1123. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float *dst_addr, __gm__ float *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1128. + - Parameter packing: Header packing comment: `/* #619 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1083. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1088. + - Parameter packing: Header packing comment: `/* #600 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1093. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1098. + - Parameter packing: Header packing comment: `/* #604 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1103. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1108. + - Parameter packing: Header packing comment: `/* #608 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ half *dst_addr, __gm__ half *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1113. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ half *dst_addr, __gm__ half *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1118. + - Parameter packing: Header packing comment: `/* #613 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1133. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1138. + - Parameter packing: Header packing comment: `/* #624 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1143. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1148. + - Parameter packing: Header packing comment: `/* #629 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1153. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1158. + - Parameter packing: Header packing comment: `/* #637 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1163. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1168. + - Parameter packing: Header packing comment: `/* #645 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1173. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1178. + - Parameter packing: Header packing comment: `/* #653 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1183. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1188. + - Parameter packing: Header packing comment: `/* #659 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1193. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1198. + - Parameter packing: Header packing comment: `/* #665 */ __builtin_cce_copy_gm_to_cbuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ bfloat16_t * dst_addr, __gm__ bfloat16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2672; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2675. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ bfloat16_t * dst_addr, __gm__ bfloat16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2678; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2681. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float * dst_addr, __gm__ float * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2696; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2699. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ float * dst_addr, __gm__ float * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2702; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2705. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ fp8_e4m3fn_t * dst_addr, __gm__ fp8_e4m3fn_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2792; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2795. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ fp8_e4m3fn_t * dst_addr, __gm__ fp8_e4m3fn_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2798; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2801. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ fp8_e5m2_t * dst_addr, __gm__ fp8_e5m2_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2780; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2783. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ fp8_e5m2_t * dst_addr, __gm__ fp8_e5m2_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2786; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2789. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ half * dst_addr, __gm__ half * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2684; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2687. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ half * dst_addr, __gm__ half * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2690; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2693. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ half* dst, __gm__ half* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2828; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2831. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ hifloat8_t * dst_addr, __gm__ hifloat8_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2804; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2807. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ hifloat8_t * dst_addr, __gm__ hifloat8_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2810; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2813. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int16_t * dst_addr, __gm__ int16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2708; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2711. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int16_t * dst_addr, __gm__ int16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2714; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2717. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int32_t * dst_addr, __gm__ int32_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2720; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2723. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int32_t * dst_addr, __gm__ int32_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2726; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2729. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2834; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2837. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2732; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2735. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2738; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2741. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint16_t * dst_addr, __gm__ uint16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2744; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2747. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint16_t * dst_addr, __gm__ uint16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2750; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2753. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint16_t* tag1, __gm__ uint16_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2846; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2849. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint32_t * dst_addr, __gm__ uint32_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2756; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2759. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint32_t * dst_addr, __gm__ uint32_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2762; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2765. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2816; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2819. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2822; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2825. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2768; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2771. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2774; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2777. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_align_v2(__cbuf__ uint8_t* tag1, __gm__ uint8_t* tag2, int tag3, const uint16_t tag4, uint32_t tag5, uint32_t tag6, uint64_t tag7);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2840; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2843. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_multi_dn2nz` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:973` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1203. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1208. + - Parameter packing: Header packing comment: `/* #670 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float *dst_addr, __gm__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1253. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float *dst_addr, __gm__ float *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1258. + - Parameter packing: Header packing comment: `/* #692 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1213. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1218. + - Parameter packing: Header packing comment: `/* #674 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1223. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1228. + - Parameter packing: Header packing comment: `/* #678 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1233. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1238. + - Parameter packing: Header packing comment: `/* #682 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ half *dst_addr, __gm__ half *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1243. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ half *dst_addr, __gm__ half *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1248. + - Parameter packing: Header packing comment: `/* #686 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1263. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1268. + - Parameter packing: Header packing comment: `/* #698 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1273. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1278. + - Parameter packing: Header packing comment: `/* #702 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1283. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1288. + - Parameter packing: Header packing comment: `/* #706 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1293. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1298. + - Parameter packing: Header packing comment: `/* #710 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1303. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1308. + - Parameter packing: Header packing comment: `/* #716 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1313. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1318. + - Parameter packing: Header packing comment: `/* #720 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1323. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1328. + - Parameter packing: Header packing comment: `/* #724 */ __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctl & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ bfloat16_t* dst, __gm__ bfloat16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1337; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1340. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ bfloat16_t* dst_addr, __gm__ bfloat16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1343; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1346. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float* dst, __gm__ float* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1361; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1364. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ float* dst_addr, __gm__ float* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1367; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1370. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ fp8_e4m3fn_t* dst, __gm__ fp8_e4m3fn_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1397; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1400. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ fp8_e4m3fn_t* dst_addr, __gm__ fp8_e4m3fn_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1403; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1406. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ fp8_e5m2_t* dst, __gm__ fp8_e5m2_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1409; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1412. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ fp8_e5m2_t* dst_addr, __gm__ fp8_e5m2_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1415; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1418. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ half* dst, __gm__ half* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1349; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1352. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ half* dst_addr, __gm__ half* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1355; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1358. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ hifloat8_t* dst, __gm__ hifloat8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1421; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1424. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ hifloat8_t* dst_addr, __gm__ hifloat8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1427; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1430. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int16_t* dst, __gm__ int16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1433; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1436. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int16_t* dst_addr, __gm__ int16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1439; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1442. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int32_t* dst, __gm__ int32_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1457; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1460. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int32_t* dst_addr, __gm__ int32_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1463; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1466. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1373; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1376. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1379; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1382. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint16_t* dst, __gm__ uint16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1445; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1448. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint16_t* dst_addr, __gm__ uint16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1451; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1454. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1469; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1472. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint32_t* dst_addr, __gm__ uint32_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1475; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1478. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1385; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1388. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_dn2nz(__cbuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1391; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1394. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_multi_nd2nz` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:975` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ bfloat16_t *dst, __gm__ bfloat16_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1333. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1338. + - Parameter packing: Header packing comment: `/* #730 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float *dst, __gm__ float *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1383. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float *dst_addr, __gm__ float *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1388. + - Parameter packing: Header packing comment: `/* #759 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e4m3_t *dst, __gm__ float8_e4m3_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1343. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1348. + - Parameter packing: Header packing comment: `/* #736 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e5m2_t *dst, __gm__ float8_e5m2_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1353. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1358. + - Parameter packing: Header packing comment: `/* #741 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e8m0_t *dst, __gm__ float8_e8m0_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1363. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1368. + - Parameter packing: Header packing comment: `/* #746 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ half *dst, __gm__ half *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1373. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ half *dst_addr, __gm__ half *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1378. + - Parameter packing: Header packing comment: `/* #751 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ hifloat8_t *dst, __gm__ hifloat8_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1393. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1398. + - Parameter packing: Header packing comment: `/* #766 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int16_t *dst, __gm__ int16_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1403. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1408. + - Parameter packing: Header packing comment: `/* #772 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int32_t *dst, __gm__ int32_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1413. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1418. + - Parameter packing: Header packing comment: `/* #778 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int8_t *dst, __gm__ int8_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1423. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1428. + - Parameter packing: Header packing comment: `/* #783 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint16_t *dst, __gm__ uint16_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1433. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1438. + - Parameter packing: Header packing comment: `/* #791 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint32_t *dst, __gm__ uint32_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1443. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1448. + - Parameter packing: Header packing comment: `/* #797 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint8_t *dst, __gm__ uint8_t *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1453. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctrl_mode, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1458. + - Parameter packing: Header packing comment: `/* #802 */ __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(dst_addr, src_addr, ((sid & 0xf) << 0 | (loop1_src_stride & 0xffffffffff) << 4 | (l2_cache_ctrl_mode & 0xf) << 44 | (n_value & 0xffff) << 48), ((d_value & 0x1fffff) << 0 | (loop4_src_stride & 0xffffffffff) << 21 | (smallc0_en & 0x1) << 61))` + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ bfloat16_t* dst, __gm__ bfloat16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1205; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1208. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ bfloat16_t* dst_addr, __gm__ bfloat16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1211; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1214. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float* dst, __gm__ float* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1217; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1220. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ float* dst_addr, __gm__ float* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1223; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1226. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ fp8_e4m3fn_t* dst, __gm__ fp8_e4m3fn_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1313; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1316. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ fp8_e4m3fn_t* dst_addr, __gm__ fp8_e4m3fn_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1319; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1322. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ fp8_e5m2_t* dst, __gm__ fp8_e5m2_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1301; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1304. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ fp8_e5m2_t* dst_addr, __gm__ fp8_e5m2_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1307; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1310. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ half* dst, __gm__ half* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1193; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1196. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ half* dst_addr, __gm__ half* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1199; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1202. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ hifloat8_t* dst, __gm__ hifloat8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1325; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1328. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ hifloat8_t* dst_addr, __gm__ hifloat8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1331; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1334. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int16_t* dst, __gm__ int16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1229; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1232. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int16_t* dst_addr, __gm__ int16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1235; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1238. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int32_t* dst, __gm__ int32_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1253; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1256. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int32_t* dst_addr, __gm__ int32_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1259; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1262. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1241; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1244. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1247; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1250. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint16_t* dst, __gm__ uint16_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1265; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1268. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint16_t* dst_addr, __gm__ uint16_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1271; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1274. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1289; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1292. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint32_t* dst_addr, __gm__ uint32_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1295; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1298. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1277; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1280. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz(__cbuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint8_t sid, uint64_t loop1_src_stride, uint8_t l2_cache_ctl, uint16_t n_value, uint32_t d_value, uint64_t loop4_src_stride, bool smallc0_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1283; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1286. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:977` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ bfloat16_t* dst, __gm__ bfloat16_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1143. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ bfloat16_t* dst, __gm__ bfloat16_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1144. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ half* dst, __gm__ half* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1141. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ half* dst, __gm__ half* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1142. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ int16_t* dst, __gm__ int16_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1145. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ int16_t* dst, __gm__ int16_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1146. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ uint16_t* dst, __gm__ uint16_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1147. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ uint16_t* dst, __gm__ uint16_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1148. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:979` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ float* dst, __gm__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1149. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ float* dst, __gm__ float* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1150. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ int32_t* dst, __gm__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1151. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ int32_t* dst, __gm__ int32_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1152. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1153. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ uint32_t* dst, __gm__ uint32_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1154. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b8` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:981` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1155. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ int8_t* dst, __gm__ int8_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1156. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1157. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ uint8_t* dst, __gm__ uint8_t* src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1158. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_cbuf_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:983` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_cbuf_v2(__cbuf__ void *dst, __gm__ void *src, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1463. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_cbuf_v2(__cbuf__ void *dst, __gm__ void *src, uint8_t sid, uint32_t nBurst, uint32_t lenBurst, uint8_t padFUncMode, uint8_t l2Ctrl, uint64_t srcStride, uint32_t dstStride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1468. + - Parameter packing: Header packing comment: `/* #824 */ __builtin_cce_copy_gm_to_cbuf_v2(dst, src, ((sid & 0xf) << 0 | (nBurst & 0x1ffff) << 4 | (lenBurst & 0x1ffff) << 25 | (padFUncMode & 0xf) << 56 | (l2Ctrl & 0xf) << 60), ((srcStride & 0xfffffffff) << 0 | (dstStride & 0x1ffff) << 40))` + +- `__builtin_cce_copy_gm_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:985` + - Observed LLVM intrinsic names: + - `llvm.hivm.MOV.OUT.TO.UB` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOV.OUT.TO.UB(ptr addrspace(6) nocapture writeonly, ptr addrspace(1) nocapture readonly, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOV.OUT.TO.UB(ptr addrspace(6) null, ptr addrspace(1) null, i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf(__ubuf__ void* dst, __gm__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1481. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1482. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_align` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:987` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ float* dst, __gm__ float* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1496. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ half* dst, __gm__ half* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1493. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ int16_t* dst, __gm__ int16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1491. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ int32_t* dst, __gm__ int32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1494. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ int8_t* dst, __gm__ int8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1489. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ uint16_t* dst, __gm__ uint16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1492. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ uint32_t* dst, __gm__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1495. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align(__ubuf__ uint8_t* dst, __gm__ uint8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1490. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_align_b16` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:989` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_align_b16(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1483. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_b16(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1484. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_align_b32` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:991` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_align_b32(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1485. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_b32(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1486. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_align_b8` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:993` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_align_b8(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1487. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_b8(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1488. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_align_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:997` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1473. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ bfloat16_t *dst_addr, __gm__ bfloat16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1478. + - Parameter packing: Header packing comment: `/* #881 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float *dst_addr, __gm__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1523. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float *dst_addr, __gm__ float *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1528. + - Parameter packing: Header packing comment: `/* #905 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1483. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e4m3_t *dst_addr, __gm__ float8_e4m3_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1488. + - Parameter packing: Header packing comment: `/* #886 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1493. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e5m2_t *dst_addr, __gm__ float8_e5m2_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1498. + - Parameter packing: Header packing comment: `/* #890 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1503. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float8_e8m0_t *dst_addr, __gm__ float8_e8m0_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1508. + - Parameter packing: Header packing comment: `/* #894 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ half *dst_addr, __gm__ half *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1513. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ half *dst_addr, __gm__ half *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1518. + - Parameter packing: Header packing comment: `/* #899 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1533. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ hifloat8_t *dst_addr, __gm__ hifloat8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1538. + - Parameter packing: Header packing comment: `/* #910 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1543. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int16_t *dst_addr, __gm__ int16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1548. + - Parameter packing: Header packing comment: `/* #915 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1553. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int32_t *dst_addr, __gm__ int32_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1558. + - Parameter packing: Header packing comment: `/* #923 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1563. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int8_t *dst_addr, __gm__ int8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1568. + - Parameter packing: Header packing comment: `/* #931 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1573. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint16_t *dst_addr, __gm__ uint16_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1578. + - Parameter packing: Header packing comment: `/* #939 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1583. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint32_t *dst_addr, __gm__ uint32_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1588. + - Parameter packing: Header packing comment: `/* #945 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1593. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint8_t *dst_addr, __gm__ uint8_t *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1598. + - Parameter packing: Header packing comment: `/* #951 */ __builtin_cce_copy_gm_to_ubuf_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (left_padding_count & 0x3f) << 46 | (right_padding_count & 0x3f) << 52 | (data_select_bit & 0x1) << 58 | (l2_cache_ctl & 0xf) << 60), ((burst_src_stride & 0xffffffffff) << 0 | (burst_dst_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ bfloat16_t * dst_addr, __gm__ bfloat16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2900; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2903. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ bfloat16_t * dst_addr, __gm__ bfloat16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2906; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2909. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float * dst_addr, __gm__ float * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2936; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2939. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float * dst_addr, __gm__ float * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2942; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2945. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ float* dst_addr, __gm__ float* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2930; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2933. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ fp8_e4m3fn_t * dst_addr, __gm__ fp8_e4m3fn_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3068; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3071. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ fp8_e4m3fn_t * dst_addr, __gm__ fp8_e4m3fn_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3074; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3077. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ fp8_e5m2_t * dst_addr, __gm__ fp8_e5m2_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3056; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3059. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ fp8_e5m2_t * dst_addr, __gm__ fp8_e5m2_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3062; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3065. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ half * dst_addr, __gm__ half * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2918; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2921. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ half * dst_addr, __gm__ half * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2924; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2927. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ half* dst_addr, __gm__ half* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2912; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2915. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ hifloat8_t * dst_addr, __gm__ hifloat8_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3080; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3083. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ hifloat8_t * dst_addr, __gm__ hifloat8_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3086; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3089. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int16_t * dst_addr, __gm__ int16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2954; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2957. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int16_t * dst_addr, __gm__ int16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2960; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2963. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int16_t* dst_addr, __gm__ int16_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2948; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2951. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int32_t * dst_addr, __gm__ int32_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2972; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2975. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int32_t * dst_addr, __gm__ int32_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2978; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2981. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int32_t* dst_addr, __gm__ int32_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2966; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2969. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2990; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2993. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2996; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2999. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ int8_t* dst_addr, __gm__ int8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2984; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2987. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint16_t * dst_addr, __gm__ uint16_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3008; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3011. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint16_t * dst_addr, __gm__ uint16_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3014; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3017. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint16_t* dst_addr, __gm__ uint16_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3002; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3005. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint32_t * dst_addr, __gm__ uint32_t * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3026; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3029. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint32_t * dst_addr, __gm__ uint32_t * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3032; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3035. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint32_t* dst_addr, __gm__ uint32_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3020; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3023. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3044; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3047. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool constant_padding_ctl, uint8_t l2_cache_ctl, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3050; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3053. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ uint8_t* dst_addr, __gm__ uint8_t* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3038; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3041. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ void* dst_addr, __gm__ void* src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3098; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3101. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_align_v2(__ubuf__ void* dst_addr, __gm__ void* src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t left_padding_count, uint8_t right_padding_count, bool data_select_bit, uint64_t burst_src_stride, uint32_t burst_dst_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3092; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:3095. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_pad_b16` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:999` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_pad_b16(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1505. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_pad_b16(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1506. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_pad_b32` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1001` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_pad_b32(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1507. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_pad_b32(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1508. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_gm_to_ubuf_pad_b8` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1003` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_gm_to_ubuf_pad_b8(__ubuf__ void* dst, __gm__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1509. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_gm_to_ubuf_pad_b8(__ubuf__ void* dst, __gm__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1510. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cbuf_to_cc` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1005` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1516. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1515. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ bfloat16_t* dst, __cbuf__ float* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1518. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ bfloat16_t* dst, __cbuf__ float* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1517. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ float* dst, __cbuf__ float* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1520. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ float* dst, __cbuf__ float* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1519. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ half* dst, __cbuf__ float* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1514. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ half* dst, __cbuf__ float* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1513. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ half* dst, __cbuf__ half* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1512. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ half* dst, __cbuf__ half* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1511. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ int32_t* dst, __cbuf__ int32_t* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1522. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ int32_t* dst, __cbuf__ int32_t* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1521. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1524. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cbuf_to_cc(__cc__ uint32_t* dst, __cbuf__ uint32_t* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1523. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_matrix_cc_to_cbuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1007` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1603. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1608. + - Parameter packing: Header packing comment: `/* #1007 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1683. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1688. + - Parameter packing: Header packing comment: `/* #1056 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1673. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1678. + - Parameter packing: Header packing comment: `/* #1053 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1623. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1628. + - Parameter packing: Header packing comment: `/* #1014 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1703. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1708. + - Parameter packing: Header packing comment: `/* #1072 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1633. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1638. + - Parameter packing: Header packing comment: `/* #1017 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1713. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1718. + - Parameter packing: Header packing comment: `/* #1076 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1613. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1618. + - Parameter packing: Header packing comment: `/* #1011 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1693. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1698. + - Parameter packing: Header packing comment: `/* #1067 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1643. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1648. + - Parameter packing: Header packing comment: `/* #1020 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1723. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1728. + - Parameter packing: Header packing comment: `/* #1080 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1753. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1758. + - Parameter packing: Header packing comment: `/* #1123 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1653. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1658. + - Parameter packing: Header packing comment: `/* #1031 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1733. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1738. + - Parameter packing: Header packing comment: `/* #1100 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1663. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1668. + - Parameter packing: Header packing comment: `/* #1043 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1743. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1748. + - Parameter packing: Header packing comment: `/* #1112 */ __builtin_cce_copy_matrix_cc_to_cbuf(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t * dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2121; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2124. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1549; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1552. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1555; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1558. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ bfloat16_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2067; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2070. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1561; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1564. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1615; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1618. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1609; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1612. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ float* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2091; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2094. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ fp8_e4m3fn_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2127; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2130. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1525; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1528. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1543; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1546. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1537; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1540. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1531; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1534. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1627; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1630. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1645; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1648. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1639; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1642. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1633; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1636. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2073; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2076. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ half* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2097; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2100. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ hifloat8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2133; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2136. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int16_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1651; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1654. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1657; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1660. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t * dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2115; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2118. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1621; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1624. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1717; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1720. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1711; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1714. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1567; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1570. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1585; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1588. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1579; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1582. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1573; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1576. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1663; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1666. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1681; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1684. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1675; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1678. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1669; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1672. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2079; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2082. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ int8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2103; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2106. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1591; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1594. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1603; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1606. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1597; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1600. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1687; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1690. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1705; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1708. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1699; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1702. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1693; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1696. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2085; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2088. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf(__cbuf__ uint8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2109; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2112. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_cbuf_b4` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1009` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_cbuf_b4(__cbuf__ void* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1723. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_b4(__cbuf__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1724. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_b4(__cbuf__ void* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1725. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_b4(__cbuf__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1726. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_cbuf_s4` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1011` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1763. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1768. + - Parameter packing: Header packing comment: `/* #1142 */ __builtin_cce_copy_matrix_cc_to_cbuf_s4(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1773. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1778. + - Parameter packing: Header packing comment: `/* #1151 */ __builtin_cce_copy_matrix_cc_to_cbuf_s4(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1731. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1733. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1732. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1734. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1736. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_cbuf_s4(__cbuf__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1735. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_gm` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1013` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1783. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1788. + - Parameter packing: Header packing comment: `/* #1185 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1863. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1868. + - Parameter packing: Header packing comment: `/* #1234 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1853. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1858. + - Parameter packing: Header packing comment: `/* #1229 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1803. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1808. + - Parameter packing: Header packing comment: `/* #1192 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1883. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1888. + - Parameter packing: Header packing comment: `/* #1250 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1813. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1818. + - Parameter packing: Header packing comment: `/* #1195 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1893. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1898. + - Parameter packing: Header packing comment: `/* #1254 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1793. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1798. + - Parameter packing: Header packing comment: `/* #1189 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1873. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1878. + - Parameter packing: Header packing comment: `/* #1245 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1823. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1828. + - Parameter packing: Header packing comment: `/* #1198 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1903. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1908. + - Parameter packing: Header packing comment: `/* #1258 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1933. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1938. + - Parameter packing: Header packing comment: `/* #1300 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1833. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1838. + - Parameter packing: Header packing comment: `/* #1208 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1913. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1918. + - Parameter packing: Header packing comment: `/* #1277 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1843. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1848. + - Parameter packing: Header packing comment: `/* #1219 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1923. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1928. + - Parameter packing: Header packing comment: `/* #1289 */ __builtin_cce_copy_matrix_cc_to_gm(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t * dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2019; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2022. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1941; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1944. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1953; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1956. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1947; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1950. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ bfloat16_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1965; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1968. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1761; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1764. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1827; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1830. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1821; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1824. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1815; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1818. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ float* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1989; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1992. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ fp8_e4m3fn_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2025; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2028. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1737; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1740. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1755; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1758. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1749; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1752. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1743; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1746. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ half* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2037; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2040. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1839; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1842. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1857; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1860. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1851; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1854. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1845; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1848. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1971; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1974. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ half* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1995; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1998. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ hifloat8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2031; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2034. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int16_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1863; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1866. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1869; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1872. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1959; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1962. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t * dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2013; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2016. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1833; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1836. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1935; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1938. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1929; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1932. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1923; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1926. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1767; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1770. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1785; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1788. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1779; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1782. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1773; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1776. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1875; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1878. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1893; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1896. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1887; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1890. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1881; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1884. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1977; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1980. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ int8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2001; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2004. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1791; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1794. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1809; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1812. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1803; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1806. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1797; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1800. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1899; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1902. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1917; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1920. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1911; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1914. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1905; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1908. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1983; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:1986. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm(__gm__ uint8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2007; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2010. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_gm_b4` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1015` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_gm_b4(__gm__ void* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2283. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_b4(__gm__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2284. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_b4(__gm__ void* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2285. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_b4(__gm__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2286. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_gm_s4` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1017` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1943. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1948. + - Parameter packing: Header packing comment: `/* #1319 */ __builtin_cce_copy_matrix_cc_to_gm_s4(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1953. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1958. + - Parameter packing: Header packing comment: `/* #1328 */ __builtin_cce_copy_matrix_cc_to_gm_s4(dst_addr, src_addr, ((sid & 0xf) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (l2_cache_ctl & 0xf) << 16 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2291. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2293. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2292. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2294. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2296. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_gm_s4(__gm__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2295. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_ub` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1019` + - Observed LLVM intrinsic names: + - `llvm.hivm.FIX.L0C.TO.UB.f2h.ELEWISE` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.FIX.L0C.TO.UB.f2h.ELEWISE(ptr addrspace(6) nocapture writeonly, ptr addrspace(5) nocapture readonly, i64, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.FIX.L0C.TO.UB.f2h.ELEWISE(ptr addrspace(6) null, ptr addrspace(5) null, i64 1, i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1963. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1968. + - Parameter packing: Header packing comment: `/* #1358 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2043. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2048. + - Parameter packing: Header packing comment: `/* #1402 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2033. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2038. + - Parameter packing: Header packing comment: `/* #1399 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1983. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e4m3_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1988. + - Parameter packing: Header packing comment: `/* #1364 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2063. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e4m3_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2068. + - Parameter packing: Header packing comment: `/* #1416 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1993. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e5m2_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1998. + - Parameter packing: Header packing comment: `/* #1367 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2073. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float8_e5m2_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2078. + - Parameter packing: Header packing comment: `/* #1420 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1973. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:1978. + - Parameter packing: Header packing comment: `/* #1361 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2053. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2058. + - Parameter packing: Header packing comment: `/* #1412 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2003. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2008. + - Parameter packing: Header packing comment: `/* #1370 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2083. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2088. + - Parameter packing: Header packing comment: `/* #1424 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2113. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2118. + - Parameter packing: Header packing comment: `/* #1462 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2013. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2018. + - Parameter packing: Header packing comment: `/* #1380 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2093. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2098. + - Parameter packing: Header packing comment: `/* #1442 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2023. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2028. + - Parameter packing: Header packing comment: `/* #1390 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2103. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2108. + - Parameter packing: Header packing comment: `/* #1452 */ __builtin_cce_copy_matrix_cc_to_ub(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2309; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2312. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2211; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2214. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2139; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2142. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t* dst_addr, __cc__ int32_t* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2265; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2268. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ bfloat16_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2193; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2196. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2357; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2360. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2369; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2372. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2363; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2366. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2235; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2238. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ float* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2163; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2166. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ fp8_e4m3fn_t * dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2271; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2274. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ fp8_e4m3fn_t * dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2199; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2202. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2297; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2300. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2315; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2318. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2303; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2306. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2375; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2378. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2387; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2390. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2381; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2384. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2217; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2220. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2145; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2148. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst_addr, __cc__ int32_t* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2241; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2244. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ half* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2169; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2172. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2277; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2280. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ hifloat8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2205; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2208. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2429; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2432. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2441; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2444. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2435; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2438. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t* dst_addr, __cc__ int32_t* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2259; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2262. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int32_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2187; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2190. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2321; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2324. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2333; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2336. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2327; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2330. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2393; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2396. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2405; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2408. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2399; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2402. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2223; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2226. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2151; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2154. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst_addr, __cc__ int32_t* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2247; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2250. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ int8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2175; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2178. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2339; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2342. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2351; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2354. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2345; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2348. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2411; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2414. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2423; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2426. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2417; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2420. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst_addr, __cc__ float* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2229; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2232. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst_addr, __cc__ float* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2157; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2160. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst_addr, __cc__ int32_t* src_addr, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2253; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2256. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub(__ubuf__ uint8_t* dst_addr, __cc__ int32_t* src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_cfg, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2181; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2184. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_ub_s4` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1021` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void *dst_addr, __cc__ float *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2123. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void *dst_addr, __cc__ float *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2128. + - Parameter packing: Header packing comment: `/* #1477 */ __builtin_cce_copy_matrix_cc_to_ub_s4(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void *dst_addr, __cc__ int32_t *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2133. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void *dst_addr, __cc__ int32_t *src_addr, uint8_t sid, uint16_t n_size, uint16_t m_size, uint32_t loop_dst_stride, uint16_t loop_src_stride, uint8_t dual_dst_ctl, bool sub_blockid, uint8_t clip_relu_pre, uint8_t unit_flag_ctl, uint64_t quant_pre, uint8_t relu_pre, bool split_en, bool NZ2ND_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, bool loop_enhance_en, uint8_t eltwise_op, bool eltwise_antq_en, bool loop_enhance_merge_en, bool C0_pad_en, bool wino_post_en, bool broadcast_en, bool NZ2DN_en);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2138. + - Parameter packing: Header packing comment: `/* #1486 */ __builtin_cce_copy_matrix_cc_to_ub_s4(dst_addr, src_addr, ((sid & 0x) << 0 | (n_size & 0xfff) << 4 | (m_size & 0xffff) << 16 | (loop_dst_stride & 0xffffffff) << 32), ((loop_src_stride & 0xffff) << 0 | (dual_dst_ctl & 0x3) << 16 | (sub_blockid & 0x1) << 18 | (quant_pre & 0x20) << 24 | (clip_relu_pre & 0x3) << 30 | (unit_flag_ctl & 0x3) << 32 | (quant_pre & 0x1f) << 34 | (relu_pre & 0x7) << 39 | (split_en & 0x1) << 42 | (NZ2ND_en & 0x1) << 43 | (quant_post & 0x1f) << 44 | (relu_post & 0x7) << 49 | (clip_relu_post & 0x1) << 52 | (loop_enhance_en & 0x1) << 53 | (eltwise_op & 0x7) << 54 | (eltwise_antq_en & 0x1) << 57 | (loop_enhance_merge_en & 0x1) << 58 | (C0_pad_en & 0x1) << 59 | (wino_post_en & 0x1) << 60 | (broadcast_en & 0x1) << 61 | (NZ2DN_en & 0x1) << 62))` + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ float* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2450. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2452. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ float* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2451. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ int32_t* src, uint64_t xm, uint64_t xt);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2453. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, QuantMode_post quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwiseOP, uint8_t eltwise_antq_cfg, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2455. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ub_s4(__ubuf__ void* dst, __cc__ int32_t* src, uint8_t sid, uint16_t NSize, uint16_t MSize, uint32_t dstStride_dst_D, uint16_t srcStride, uint8_t clip_relu_pre, uint8_t UnitFlagMode, QuantMode_t QuantPRE, uint8_t ReLUPRE, bool channelSplit, bool NZ2ND_EN, bool C0_Pad_EN);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2454. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_cc_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1023` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2460. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2461. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2458. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2459. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2456. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2457. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2462. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2463. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2464. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2465. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2466. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2467. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2468. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2469. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2470. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2471. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2472. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2473. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_matrix_ubuf_to_cc` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1025` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ float* dst, __ubuf__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2476. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ float* dst, __ubuf__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2477. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ float* dst, __ubuf__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2478. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ float* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2479. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ half* dst, __ubuf__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2474. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ half* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2475. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2480. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2481. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2482. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_matrix_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2483. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_small_matrix_cc_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1027` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2484. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2485. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2486. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2487. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2488. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2489. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2490. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2491. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2492. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2493. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2494. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2495. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_small_matrix_ubuf_to_cc` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1029` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_small_matrix_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2496. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2497. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_small_matrix_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2498. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_small_matrix_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2499. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_cbuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1031` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_cbuf(__cbuf__ void *dst_addr, __ubuf__ void *src_addr, bool sub_blockid, uint16_t burst_num, uint16_t burst_len, uint16_t src_gap, uint16_t dst_gap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2148. + - Parameter packing: Header packing comment: `/* #1558 */ __builtin_cce_copy_ubuf_to_cbuf(dst_addr, src_addr, ((sub_blockid & 0x1) << 0 | (burst_num & 0xfff) << 4 | (burst_len & 0xffff) << 16 | (src_gap & 0xffff) << 32 | (dst_gap & 0xffff) << 48))` + - `void __builtin_cce_copy_ubuf_to_cbuf(__cbuf__ void *dst_addr, __ubuf__ void *src_addr, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2143. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_cbuf(__cbuf__ void* dst, __ubuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2500; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2503. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_cbuf(__cbuf__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2506; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2509. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_fbuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1033` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_fbuf(__fbuf__ void* dst, __ubuf__ void* src, CvtMode_t cvtMode, uint16_t burstNum, uint16_t burstLen, uint16_t srcGapSize, uint16_t dstGapSize);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2513. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_fbuf(__fbuf__ void* dst, __ubuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2512. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_copy_ubuf_to_gm` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1035` + - Observed LLVM intrinsic names: + - `llvm.hivm.MOV.UB.TO.OUT` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOV.UB.TO.OUT(ptr addrspace(1) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOV.UB.TO.OUT(ptr addrspace(1) null, ptr addrspace(6) null, i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm(__gm__ void* dst, __ubuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2514. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm(__gm__ void* dst, __ubuf__ void* src, uint64_t config, bm_t byteMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2515. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2517. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, bm_t byteMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2516. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_align` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1037` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ float* dst, __ubuf__ float* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2531. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ half* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2528. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ int16_t* dst, __ubuf__ int16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2526. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ int32_t* dst, __ubuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2529. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ int8_t* dst, __ubuf__ int8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2524. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2527. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2530. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align(__gm__ uint8_t* dst, __ubuf__ uint8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2525. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_align_b16` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1039` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_align_b16(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2518. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_align_b16(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2519. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_align_b32` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1041` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_align_b32(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2520. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_align_b32(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2521. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_align_b8` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1043` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_align_b8(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t gapConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2522. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_align_b8(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint8_t leftPaddingNum, uint8_t rightPaddingNum, uint32_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2523. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_align_v2` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1047` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ void *dst_addr, __ubuf__ void *src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2153. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ void *dst_addr, __ubuf__ void *src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t l2_cache_ctl, uint64_t burst_dst_stride, uint32_t burst_src_stride);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2158. + - Parameter packing: Header packing comment: `/* #1605 */ __builtin_cce_copy_ubuf_to_gm_align_v2(dst_addr, src_addr, ((sid & 0xf) << 0 | (burst_num & 0x1fffff) << 4 | (burst_len & 0x1fffff) << 25 | (l2_cache_ctl & 0xf) << 60), ((burst_dst_stride & 0xffffffffff) << 0 | (burst_src_stride & 0x1fffff) << 40))` + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ float* dst, __ubuf__ float* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2666; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2669. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ half* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2648; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2651. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ int16_t* dst, __ubuf__ int16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2636; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2639. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ int32_t* dst, __ubuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2654; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2657. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ int8_t* dst, __ubuf__ int8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2624; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2627. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2642; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2645. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2660; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2663. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ uint8_t* dst, __ubuf__ uint8_t* src, uint8_t sid, uint16_t nBurst, uint32_t lenBurst, uint64_t srcGap, uint32_t dstGap);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2630; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2633. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ void * dst_addr, __ubuf__ void * src_addr, uint64_t config0, uint64_t config1);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2612; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2615. + - Parameter packing: Direct bottom-level form: `config0, config1` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_align_v2(__gm__ void * dst_addr, __ubuf__ void * src_addr, uint8_t sid, uint32_t burst_num, uint32_t burst_len, uint8_t l2_cache_ctl, uint64_t burst_dst_stride, uint32_t burst_src_stride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2618; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2621. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_pad_b16` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1049` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_pad_b16(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2532. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_pad_b16(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2533. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_pad_b32` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1051` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_pad_b32(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2534. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_pad_b32(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2535. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_gm_pad_b8` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1053` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_gm_pad_b8(__gm__ void* dst, __ubuf__ void* src, uint64_t config, uint64_t paddingConfig);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2536. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_gm_pad_b8(__gm__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, uint8_t leftPaddingNum, uint8_t rightPaddingNum);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2537. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_ubuf_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1055` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_ubuf_to_ubuf(__ubuf__ void *dst, __ubuf__ void *src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcGap, uint16_t dstGap);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2163. + - Parameter packing: Header packing comment: `/* #1644 */ __builtin_cce_copy_ubuf_to_ubuf(dst, src, ((dstGap & 0xffff) << 48 | (srcGap & 0xffff) << 32 | (lenBurst & 0xffff) << 16 | (nBurst & 0xffff) << 0))` + - `void __builtin_cce_copy_ubuf_to_ubuf(__ubuf__ void *dst, __ubuf__ void *src, uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:2168. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_ubuf(__ubuf__ void* dst, __ubuf__ void* src, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2550; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2553. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_ubuf_to_ubuf(__ubuf__ void* dst, __ubuf__ void* src, uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2538; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2541. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_ubuf_to_ubuf(__ubuf__ void* dst, __ubuf__ void* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2544; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2547. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_vector_cc_to_ubuf` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1057` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2560. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ float* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2561. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2558. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2559. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2556. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2557. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2562. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ half* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2563. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2564. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int16_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2565. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2566. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int32_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2567. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2568. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ int8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2569. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2570. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ uint32_t* dst, __cc__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2571. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2572. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_cc_to_ubuf(__ubuf__ uint8_t* dst, __cc__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2573. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +- `__builtin_cce_copy_vector_ubuf_to_cc` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:1059` + - Observed LLVM intrinsic names: Not captured by the partial local probe. + - Observed LLVM IR declarations: Not captured by the partial local probe. + - Complete C++ signatures: + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ float* dst, __ubuf__ float* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2576. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ float* dst, __ubuf__ float* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2577. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ float* dst, __ubuf__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2578. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ float* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2579. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ half* dst, __ubuf__ half* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2574. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ half* dst, __ubuf__ half* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2575. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2580. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ int32_t* dst, __ubuf__ int32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2581. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2582. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_copy_vector_ubuf_to_cc(__cc__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t sid, uint16_t nBurst, uint16_t lenBurst, uint16_t srcStride, uint16_t dstStride, ConvRelu_t crMode);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:2583. + - Parameter packing: No CANN `// ->` packing comment found for this signature in the scanned headers. + +## 3. Companion Set/Control Builtins + +- Scope: `set_*` builtins commonly paired with `copy*` DMA flows for loop sizing/striding, ND-DMA padding/parameters, and fixpipe/fix-state configuration. +- Excluded here: vector mask controls such as `set_vector_mask`, `set_mask_count`, `set_mask_norm`, and `set_cmpmask`; those are documented with vector builtins in `a2a3-vector-builtins.md`. +- Companion control count: 58 builtin names and 65 complete C++ signatures. +- LLVM IR probe coverage: 41 of 65 signatures captured device LLVM IR; 35 builtin names have at least one captured LLVM intrinsic; 38 unique LLVM intrinsic names were observed. +- The listed LLVM IR declarations and actual probe calls are exact lines from the captured `.ll` files. For uncaptured entries, this section intentionally leaves the IR signature absent instead of deriving one from the C++ signature. +- `Not captured` means the local target sweep rejected the signature for the tested targets. The C++ signature and CANN packing/ASM comment remain header-derived. +- For `set_*` entries whose CANN header only says `ASM: MOV , config`, the bottom-level C++ parameter is already the register/control payload. The header does not expose a higher-level bitfield pack unless a separate `// ->` line is listed under that exact signature. + +- `__builtin_cce_set_cube_stride_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2037` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_cube_stride_para(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6892. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_deqscale` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2047` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.DEQSCALE.h` + - `llvm.hivm.SET.DEQSCALE.i` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.DEQSCALE.h(half) #1` + - `declare void @llvm.hivm.SET.DEQSCALE.i(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.DEQSCALE.h(half 0xH3C00)` + - `call void @llvm.hivm.SET.DEQSCALE.i(i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_deqscale(half config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6705. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_set_deqscale(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6706. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_elt_antiq_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:805` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.ELT.ANTIQ.PARA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.ELT.ANTIQ.PARA(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.ELT.ANTIQ.PARA(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_elt_antiq_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4159; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6707. + - Parameter packing: Direct control form; header operation comment: `MOV ELT_ANTIQ_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_elt_src_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:807` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.ELT.SRC.PARA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.ELT.SRC.PARA(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.ELT.SRC.PARA(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_elt_src_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4164; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6709. + - Parameter packing: Direct control form; header operation comment: `MOV ELT_SRC_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fcol2img` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2055` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FCOL2IMG` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FCOL2IMG(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FCOL2IMG(i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_fcol2img(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6712. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_fix_clip_relu` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:811` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FIX.CLIP.RELU` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FIX.CLIP.RELU(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FIX.CLIP.RELU(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_fix_clip_relu(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4174; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6714. + - Parameter packing: Direct control form; header operation comment: `MOV FIX_CLIP_RELU, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fixp_addr` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:813` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FIXP.ADDR` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FIXP.ADDR(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FIXP.ADDR(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_fixp_addr(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4179; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6715. + - Parameter packing: Direct control form; header operation comment: `MOV FIXP_ADDR, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fixp_nz_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2063` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_fixp_nz_para(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20470. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_fm_step_pos` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2067` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_fm_step_pos(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6862. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_fmatrix` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:817` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FMATRIX` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FMATRIX(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FMATRIX(i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_fmatrix(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4194; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6740; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6743. + - Parameter packing: Direct control form; header operation comment: `MOV FMATRIX, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fmatrix_b` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:819` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FMATRIX.B` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FMATRIX.B(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FMATRIX.B(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_fmatrix_b(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4199; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6747; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6750. + - Parameter packing: Direct control form; header operation comment: `MOV FMATRIX_B, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fmatrix_dual_0` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2073` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_fmatrix_dual_0(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6753. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_fmatrix_dual_1` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2075` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_fmatrix_dual_1(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6754. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_fpc` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:821` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.FPC` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.FPC(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.FPC(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_fpc(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4204; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6757; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6760. + - Parameter packing: Direct control form; header operation comment: `MOV FPC, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_fpdeq` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2085` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_fpdeq(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6764. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_kernel` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2143` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_kernel(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6893. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_loop0_stride_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:837` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP0.STRIDE.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP0.STRIDE.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP0.STRIDE.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop0_stride_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4279; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19564; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19567. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP0_STRIDE_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop1_stride_l1toout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:839` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop1_stride_l1toout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4284. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP1_STRIDE_L1TOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop1_stride_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:841` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP1.STRIDE.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP1.STRIDE.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP1.STRIDE.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop1_stride_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4289; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19570; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19573. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP1_STRIDE_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop1_stride_outtol1` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:843` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop1_stride_outtol1(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4294; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19534; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19537. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP1_STRIDE_OUTTOL1, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop1_stride_outtoub` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:845` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP1.STRIDE.OUTTOUB` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP1.STRIDE.OUTTOUB(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP1.STRIDE.OUTTOUB(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop1_stride_outtoub(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4299; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19516; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19519. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP1_STRIDE_OUTTOUB, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop1_stride_ubtoout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:847` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP1.STRIDE.UBTOOUT` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP1.STRIDE.UBTOOUT(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP1.STRIDE.UBTOOUT(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop1_stride_ubtoout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4304; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19552; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19555. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP1_STRIDE_UBTOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop2_stride_l1toout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:849` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop2_stride_l1toout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4309. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP2_STRIDE_L1TOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop2_stride_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:851` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP2.STRIDE.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP2.STRIDE.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP2.STRIDE.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop2_stride_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4314; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19576; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19579. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP2_STRIDE_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop2_stride_outtol1` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:853` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop2_stride_outtol1(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4319; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19540; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19543. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP2_STRIDE_OUTTOL1, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop2_stride_outtoub` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:855` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP2.STRIDE.OUTTOUB` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP2.STRIDE.OUTTOUB(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP2.STRIDE.OUTTOUB(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop2_stride_outtoub(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4324; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19522; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19525. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP2_STRIDE_OUTTOUB, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop2_stride_ubtoout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:857` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP2.STRIDE.UBTOOUT` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP2.STRIDE.UBTOOUT(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP2.STRIDE.UBTOOUT(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop2_stride_ubtoout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4329; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19558; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19561. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP2_STRIDE_UBTOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop3_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:859` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP3.PARA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP3.PARA(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP3.PARA(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_loop3_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4334; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6795; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6798. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP3_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop3_stride_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:861` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP3.STRIDE.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP3.STRIDE.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP3.STRIDE.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop3_stride_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4339; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19582; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19585. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP3_STRIDE_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop4_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:863` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop4_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4344; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20453. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP4_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop4_stride_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:865` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP4.STRIDE.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP4.STRIDE.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP4.STRIDE.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop4_stride_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4349; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19588; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19591. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP4_STRIDE_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop_size_l1toout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:867` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop_size_l1toout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4354. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP_SIZE_L1TOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop_size_outtol1` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:869` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_loop_size_outtol1(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4359; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19528; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19531. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP_SIZE_OUTTOL1, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop_size_outtoub` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:871` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP.SIZE.OUTTOUB` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP.SIZE.OUTTOUB(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP.SIZE.OUTTOUB(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop_size_outtoub(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4364; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19510; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19513. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP_SIZE_OUTTOUB, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_loop_size_ubtoout` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:873` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LOOP.SIZE.UBTOOUT` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LOOP.SIZE.UBTOOUT(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.LOOP.SIZE.UBTOOUT(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_loop_size_ubtoout(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4369; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19546; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19549. + - Parameter packing: Direct control form; header operation comment: `MOV LOOP_SIZE_UBTOOUT, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_lrelu_alpha` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:875` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.LRELU.ALPHA.f32` + - `llvm.hivm.SET.LRELU.ALPHA.f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.LRELU.ALPHA.f32(float) #1` + - `declare void @llvm.hivm.SET.LRELU.ALPHA.f16(half) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.LRELU.ALPHA.f32(float 1.000000e+00)` + - `call void @llvm.hivm.SET.LRELU.ALPHA.f16(half 0xH3C00)` + - Probe targets used: `dav-m200` + - Complete C++ signatures: + - `void __builtin_cce_set_lrelu_alpha(float config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4379; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6805. + - Parameter packing: Direct control form; header operation comment: `MOV LRELU_ALPHA, config`; pipe: `PIPE_S`. + - `void __builtin_cce_set_lrelu_alpha(half config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4374; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6804. + - Parameter packing: Direct control form; header operation comment: `MOV LRELU_ALPHA, config`; pipe: `PIPE_S`. + - `void __builtin_cce_set_lrelu_alpha(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6803. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_matrix_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2233` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_matrix_para(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6891. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_mov_pad_val` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:881` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.MOV.PAD.VAL` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.MOV.PAD.VAL(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.MOV.PAD.VAL(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_mov_pad_val(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4394; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6808; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6811. + - Parameter packing: Direct control form; header operation comment: `MOV MOV_PAD_VAL, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_mte2_antiq_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:883` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_mte2_antiq_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4399; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6711. + - Parameter packing: Direct control form; header operation comment: `MOV MTE2_ANTIQ_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_mte2_nz_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:885` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_mte2_nz_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4404; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19489; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19492. + - Parameter packing: Direct control form; header operation comment: `MOV MTE2_NZ_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_mte2_src_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:887` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_mte2_src_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4409; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19495; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19498. + - Parameter packing: Direct control form; header operation comment: `MOV MTE2_SRC_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_mte3_nz_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2247` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_mte3_nz_para(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6890. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_nd_para` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:889` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.ND.PARA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.ND.PARA(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.ND.PARA(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_nd_para(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4414; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6816. + - Parameter packing: Direct control form; header operation comment: `MOV ND_PARA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_pad_cnt_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:891` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.PAD.CNT.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.PAD.CNT.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.PAD.CNT.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_pad_cnt_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4419; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19594; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19597. + - Parameter packing: Direct control form; header operation comment: `MOV PAD_CNT_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_pad_val_nddma` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:893` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.PAD.VAL.NDDMA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.PAD.VAL.NDDMA(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.PAD.VAL.NDDMA(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_pad_val_nddma(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4424; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19504; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:19507. + - Parameter packing: Direct control form; header operation comment: `MOV PAD_VAL_NDDMA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_pad_val_outtol1` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:895` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_pad_val_outtol1(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4429; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6815. + - Parameter packing: Direct control form; header operation comment: `MOV PAD_VAL_OUTTOL1, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_pad_val_outtoub` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:897` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.PAD.VAL.OUTTOUB` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.PAD.VAL.OUTTOUB(i64) #3` + - Actual probe calls: + - `call void @llvm.hivm.SET.PAD.VAL.OUTTOUB(i64 1), !dbg !10` + - Probe targets used: `dav-c310-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_pad_val_outtoub(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4434; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6814. + - Parameter packing: Direct control form; header operation comment: `MOV PAD_VAL_OUTTOUB, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_padding` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:899` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.PADDING.f16` + - `llvm.hivm.SET.PADDING` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.PADDING.f16(half) #1` + - `declare void @llvm.hivm.SET.PADDING(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.PADDING.f16(half 0xH3C00)` + - `call void @llvm.hivm.SET.PADDING(i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_padding(half config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4444; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6823; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6826. + - Parameter packing: Direct control form; header operation comment: `MOV PADDING, config`; pipe: `PIPE_S`. + - `void __builtin_cce_set_padding(int16_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4449; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6829; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6832. + - Parameter packing: Direct control form; header operation comment: `MOV PADDING, config`; pipe: `PIPE_S`. + - `void __builtin_cce_set_padding(uint16_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4454; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6835; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6838. + - Parameter packing: Direct control form; header operation comment: `MOV PADDING, config`; pipe: `PIPE_S`. + - `void __builtin_cce_set_padding(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4439; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6817; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6820. + - Parameter packing: Direct control form; header operation comment: `MOV PADDING, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_padding_b` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:901` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_padding_b(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4459; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:20455. + - Parameter packing: Direct control form; header operation comment: `MOV PADDING_B, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_quant_post` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:907` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.QUANT.POST` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.QUANT.POST(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.QUANT.POST(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_quant_post(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4474; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6853. + - Parameter packing: Direct control form; header operation comment: `MOV QUANT_POST, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_quant_pre` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:909` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.QUANT.PRE.v300` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.QUANT.PRE.v300(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.QUANT.PRE.v300(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_quant_pre(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4479; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6855; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6858. + - Parameter packing: Direct control form; header operation comment: `MOV QUANT_PRE, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_relu_alpha` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:911` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.RELU.ALPHA` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.RELU.ALPHA(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.RELU.ALPHA(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_relu_alpha(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4484; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6865. + - Parameter packing: Direct control form; header operation comment: `MOV RELU_ALPHA, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_reqscale` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2277` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_reqscale(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6867. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_rpn_cor_ir` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:913` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.RPN.COR.IR` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.RPN.COR.IR(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.RPN.COR.IR(i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_rpn_cor_ir(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4489; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6868. + - Parameter packing: Header packing comment: `/* #3326 */ __builtin_cce_mov_vspr(19, config)` + +- `__builtin_cce_set_rpn_offset` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2281` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.RPN.OFFSET` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.RPN.OFFSET(half) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.RPN.OFFSET(half 0xH3C00)` + - Probe targets used: `dav-m200-vec` + - Complete C++ signatures: + - `void __builtin_cce_set_rpn_offset(half config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6869. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_st_atomic_cfg` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:915` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.ST.ATOMIC.CFG` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.ST.ATOMIC.CFG(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.ST.ATOMIC.CFG(i64 1), !dbg !10` + - Probe targets used: `dav-m300` + - Complete C++ signatures: + - `void __builtin_cce_set_st_atomic_cfg(atomic_type_t type, atomic_op_t op);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4499; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6874; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6877. + - Parameter packing: Header packing comment: `/* #4073 */ __builtin_cce_set_st_atomic_cfg(((type & 0x7) << 0 | (op & 0x3) << 3))` + - `void __builtin_cce_set_st_atomic_cfg(uint64_t config);` + - Signature source: .local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4494; .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6873. + - Parameter packing: Direct control form; header operation comment: `MOV ST_ATOMIC_CFG, config`; pipe: `PIPE_S`. + +- `__builtin_cce_set_vpipe` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2301` + - Observed LLVM intrinsic names: + - `llvm.hivm.SET.VPIPE` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.VPIPE(i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.VPIPE(i64 1)` + - Probe targets used: `dav-m200` + - Complete C++ signatures: + - `void __builtin_cce_set_vpipe(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6888. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. + +- `__builtin_cce_set_vsp` + - C++ wrapper alias source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2303` + - Observed LLVM intrinsic names: Not captured by the local target sweep. + - Observed LLVM IR declarations: Not captured by the local target sweep. + - Complete C++ signatures: + - `void __builtin_cce_set_vsp(uint64_t config);` + - Signature source: .local/cann/tools/tikicpulib/lib/include/stub_fun.h:6889. + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed/control operand; no `// ->` wrapper packing comment is needed. diff --git a/docs/designs/a2a3-tadd-spec.md b/docs/designs/a2a3-tadd-spec.md new file mode 100644 index 0000000000..d7cffa62e8 --- /dev/null +++ b/docs/designs/a2a3-tadd-spec.md @@ -0,0 +1,37 @@ +# a2a3 llvm lowering spec +These specifications are for lowering on A2 and A3, i.e. pto -> vpto -> llvm. + +## instruction mapping pto -> pto.ub.* +- pto.tadd to pto.ub.vadd +- pto.tload to pto.ub.gm_to_ub +- pto.tstore to pto.ub.ub_to_gm + +to lower tile level instructions use the npu-coding mcp to get the raw cce implemtation that maps very closely to pto.ub.* instructions + +## instruction mapping pto.ub.* -> llvm +- at the llvm level use ony intrisics valid for dav-c220-vec as listed in /docs/designs/a2a3-intrinsics.md and /docs/designs/a2a3-dma-builtins.md +- address space for gm is 1 +- address space for ub is 6 + +## instruction for compiling llvm +- bisheng should use dav-c220-vec as the target arch (the one for A2 and A3) + +# General guidelines +- try to reuse most to the A5 pipeline +- do not use ExpandTileOp +- do not use dav-c310-vec for A2 A3 pipeline +- use dav-c220-vec for A2 A3 pipeline +- never use tilelang +- test running e2e example +```sh +python ptodsl/examples/tadd_launch_a3.py +``` +# Testing +- add a test for every pto.ub.* op +- add a test for every lowering pto.* -> pto.ub.* +- tests should use captures to check arguments of the ops not just a mnemonic check +- use this docker image cce-mlir-dev-npu-aarch64-llvm19-cann900 +- full command +```sh +docker run --rm -i -v $(pwd):/workspace -v /tmp/opencode/ptoas-cce-build:/tmp/ptoas-build -v /tmp/opencode/ptoas-cce-install:/tmp/ptoas-install --ipc=host --privileged --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro -v /etc/ascend_install.info:/etc/ascend_install.info:ro --user $(id -u):$(id -g) -e HOME=/tmp --entrypoint bash cce-mlir-dev-npu-aarch64-llvm19-cann900 +``` \ No newline at end of file diff --git a/docs/designs/a2a3-vector-builtins.md b/docs/designs/a2a3-vector-builtins.md new file mode 100644 index 0000000000..511d40f2c5 --- /dev/null +++ b/docs/designs/a2a3-vector-builtins.md @@ -0,0 +1,3660 @@ +# A2/A3 Vector Builtin Inventory + +## 1. Collection Constraints + +- Collection root: `.local/cann`, which is a symlink to `/home/mouliangyu/.local/ascend/beta.1/cann` in this workspace. +- Architecture scope: A2/A3 vector builtins whose callable C++ form uses memory pointers, not the A5-style `vector_*` value operands, plus the A2/A3 vector mask/control builtins that configure vector execution state. +- C++ signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h`, filtered to declarations with pointer operands and without any `vector_*` parameter for vector compute builtins; mask/control builtins are included from the same source when they directly affect vector mask or compare-mask state. +- Builtin-name mapping source: `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h` and `cce_aicore_intrinsics_3101.h`, using `clang_builtin_alias(__builtin_cce_...)` declarations. +- Included vector compute signatures must satisfy all of these conditions: function name is a vector builtin wrapper such as `v*` or `vector_dup`; at least one operand is a pointer, usually `__ubuf__ T*`; no operand uses the A5/new-vector `vector_*` types; the wrapper can be mapped to a `__builtin_cce_*` alias in the CCE headers; and direct `__builtin_cce_*` compilation emits a vector `llvm.hivm.*` call. +- Included mask/control signatures are limited to `set_cmpmask`, `set_mask_count`, `set_mask_norm`, `set_vector_mask`, and `set_vector_mask_dup`; these are listed separately because their operands are mask pointers or scalar `uint64_t` values rather than vector data operands. +- Excluded entries include all `__clang_cce_vector_intrinsics.h` vector-value builtins, all `vector_*` input/output declarations from `stub_fun.h`, high-level AscendC wrappers, unrelated scalar/system builtins, x86/standard Clang builtins, OPP operator implementations, names without a complete pointer-form or mask/control signature in the scanned files, and wrapper-only stub declarations that ccec rejects as direct builtin calls. +- Overloads are preserved because the same builtin name can have different pointer element types, scalar operands, packed `uint64_t config` forms, and expanded repeat/stride forms. +- LLVM intrinsic names were probed by compiling every candidate pointer-form overload with `.local/cann/x86_64-linux/bin/ccec -c -save-temps -xcce`, disassembling the emitted device bitcode with LLVM 15 `llvm-dis`, and extracting actual `call @llvm.hivm.*` targets from the generated probe function body. +- Probe targets were tried in this order until a vector `llvm.hivm.*` call was captured: `dav-m200-vec`, `dav-m200`, `dav-m300`, `dav-c220-vec`, `dav-c310-vec`, `dav-m210-vec`, `dav-l300-vec`, `dav-l300`, `dav-t300`, `dav-t200`, `dav-t210`, `dav-l310`, `dav-l311`, `dav-l311-eff`, `dav-l510`, `dav-s200`, `dav-c220`, `dav-c310`, `dav-m310`, `dav-m201`, `dav-n350`, `dav-920r1-vec`, `dav-920r1`, `dav-510r2`, `dav-380r1-cube`, `dav-c100`, `dav-l100`, `dav-l100-es`, `dav-l200`, `dav-l210`, `dav-m100`, `dav-s200-es`, `dav-t100`, `dav-t100-es`. +- LLVM intrinsic-name coverage for vector compute builtins: 200 of 200 builtin names have at least one captured intrinsic name; 929 of 939 candidate pointer-form overload signatures captured an actual vector `llvm.hivm.*` call target; 10 candidate stub declarations were rejected by ccec with `parameters too many` and are excluded as non-bottom-level direct builtin signatures. +- Mask/control builtin coverage: 5 additional builtin names and 5 complete C++ signatures were probed on `dav-m200-vec`; their IR declarations and actual probe calls are listed in the mask/control section. +- Parameter packing coverage for vector compute builtins: 12 signatures have packing text copied from CANN `// ->` header comments, 336 signatures are direct already-packed `uint64_t` forms, and 581 signatures have no matching CANN `// ->` packing comment in the scanned headers. +- `No CANN // -> packing comment found` means no textual packing formula was present in the scanned CANN headers for that exact wrapper parameter list; this document does not infer or synthesize missing formulas from LLVM IR. +- Inventory count: 205 unique builtin names, 934 verified bottom-level signatures, and 354 unique observed LLVM intrinsic names or declarations. + +## 2. Builtin Signatures + +- `__builtin_cce_v4dtrans` + - LLVM intrinsic names: + - `llvm.hivm.V4DTRANS.b16` + - `llvm.hivm.V4DTRANS.b32` + - `llvm.hivm.V4DTRANS.b8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.V4DTRANS.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.V4DTRANS.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.V4DTRANS.b8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_v4dtrans(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint16_t imageSize, uint16_t nChannel, bool conversionMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `v4dtrans` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_v4dtrans(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_v4dtrans(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint16_t imageSize, uint16_t nChannel, bool conversionMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `v4dtrans` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_v4dtrans(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_v4dtrans(__ubuf__ uint8_t* dst, __ubuf__ uint8_t* src, uint16_t imageSize, uint16_t nChannel, bool conversionMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `v4dtrans` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_v4dtrans(__ubuf__ uint8_t* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vabs` + - LLVM intrinsic names: + - `llvm.hivm.VABS.f16` + - `llvm.hivm.VABS.f32` + - `llvm.hivm.VABS.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VABS.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VABS.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VABS.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vabs(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vabs(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vabs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vabs(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vabs(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vabs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vabs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vabs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4597): `/* #4160 */ __builtin_cce_vabs(dst, src, ((repeat & 0xff) << 56 | (dstBlockStride & 0xffff) << 0 | (srcBlockStride & 0xffff) << 16 | (dstRepeatStride & 0xff) << 32 | (dstRepeatStride & 0xf00) << 44 | (srcRepeatStride & 0xfff) << 40))` + - `void __builtin_cce_vabs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vabs` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vadd` + - LLVM intrinsic names: + - `llvm.hivm.VADD.f16` + - `llvm.hivm.VADD.f32` + - `llvm.hivm.VADD.s16` + - `llvm.hivm.VADD.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADD.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VADD.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VADD.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VADD.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vadd(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t repeat);` + - Parameter packing: Direct bottom-level form: `repeat` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadd(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadd(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadd(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vadddeqrelu` + - LLVM intrinsic names: + - `llvm.hivm.VADDDEQRELU` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDDEQRELU(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vadddeqrelu(__ubuf__ half* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadddeqrelu(__ubuf__ half* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadddeqrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadddeqrelu(__ubuf__ half* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadddeqrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaddrelu` + - LLVM intrinsic names: + - `llvm.hivm.VADDRELU.f16` + - `llvm.hivm.VADDRELU.f32` + - `llvm.hivm.VADDRELU.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDRELU.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VADDRELU.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VADDRELU.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaddreluconv_f162s8` + - LLVM intrinsic names: + - `llvm.hivm.VADDRELUCONV.f162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDRELUCONV.f162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaddreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaddreluconv_f322f16` + - LLVM intrinsic names: + - `llvm.hivm.VADDRELUCONV.f322f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDRELUCONV.f322f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaddreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaddreluconv_s162s8` + - LLVM intrinsic names: + - `llvm.hivm.VADDRELUCONV.s162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDRELUCONV.s162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaddreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_s162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_s162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaddreluconv_vdeqs162b8` + - LLVM intrinsic names: + - `llvm.hivm.VADDRELUCONV.VDEQs162b8` + - `llvm.hivm.VADDRELUCONV.VDEQs162b8.1` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDRELUCONV.VDEQs162b8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - `declare void @llvm.hivm.VADDRELUCONV.VDEQs162b8.1(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-s200` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4607): `/* #4201 */ __builtin_cce_vaddreluconv_vdeqs162b8(dst, src0, src1, ((repeat & 0xff) << 56 | (dstBlockStride & 0xff) << 0 | (src0BlockStride & 0xff) << 8 | (src1BlockStride & 0xff) << 16 | (dstRepeatStride & 0xff) << 24 | (src0RepeatStride & 0xff) << 32 | (src1RepeatStride & 0xff) << 40), h)` + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4602): `/* #4202 */ __builtin_cce_vaddreluconv_vdeqs162b8(dst, src0, src1, ((repeat & 0xff) << 56 | (dstBlockStride & 0xff) << 0 | (src0BlockStride & 0xff) << 8 | (src1BlockStride & 0xff) << 16 | (dstRepeatStride & 0xff) << 24 | (src0RepeatStride & 0xff) << 32 | (src1RepeatStride & 0xff) << 40), h)` + - `void __builtin_cce_vaddreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaddreluconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vadds` + - LLVM intrinsic names: + - `llvm.hivm.VADDS.f16` + - `llvm.hivm.VADDS.f32` + - `llvm.hivm.VADDS.s16` + - `llvm.hivm.VADDS.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VADDS.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VADDS.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VADDS.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VADDS.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vadds(__ubuf__ float* dst, __ubuf__ float* src, float a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadds(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ half* dst, __ubuf__ half* src, half a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadds(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int16_t a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadds(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int16_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int16_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int16_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vadds(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vadds(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vadds` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vand` + - LLVM intrinsic names: + - `llvm.hivm.VAND.s16` + - `llvm.hivm.VAND.u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VAND.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VAND.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vand(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vand(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1StrideBlock, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vand` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vand(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1StrideBlock, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vand` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vand(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vand(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1StrideBlock, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vand` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vand(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1StrideBlock, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vand` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vaxpy` + - LLVM intrinsic names: + - `llvm.hivm.VAXPY.f16` + - `llvm.hivm.VAXPY.f32` + - `llvm.hivm.VAXPY.fmix` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VAXPY.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VAXPY.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VAXPY.fmix(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ float* src, float a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ float* src, float a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ half* src, half a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ float* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ half* dst, __ubuf__ half* src, half a, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vaxpy(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vaxpy(__ubuf__ half* dst, __ubuf__ half* src, half a, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vaxpy` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vbi` + - LLVM intrinsic names: + - `llvm.hivm.VBI.f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VBI.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vbi(__ubuf__ half* dst, __ubuf__ uint16_t* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vbi(__ubuf__ half* dst, __ubuf__ uint16_t* src0, __ubuf__ half* src1, uint8_t hRepeat, bool repeatMode, uint16_t dstBlockStride, uint16_t vROffset, uint8_t vRepeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vbi` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vbrcb` + - LLVM intrinsic names: + - `llvm.hivm.VBRCB.b16` + - `llvm.hivm.VBRCB.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VBRCB.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VBRCB.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vbrcb(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint16_t dstBlockStride, uint16_t dstRepeatStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vbrcb` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vbrcb(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vbrcb(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint16_t dstBlockStride, uint16_t dstRepeatStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vbrcb` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vbrcb(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vbs` + - LLVM intrinsic names: + - `llvm.hivm.VBS32.V300.f16` + - `llvm.hivm.VBS32.V300.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VBS32.V300.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64) #1` + - `declare void @llvm.hivm.VBS32.V300.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64) #1` + - Probe targets used: `dav-m300` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vbs(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ uint32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vbs(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ uint32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vcadd` + - LLVM intrinsic names: + - `llvm.hivm.VCADD.f16` + - `llvm.hivm.VCADD.f16.order` + - `llvm.hivm.VCADD.f32` + - `llvm.hivm.VCADD.f32.order` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCADD.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCADD.f16.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCADD.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCADD.f32.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcadd(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcadd(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config, bool MASK);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool mode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcadd(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcadd(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config, bool MASK);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool mode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s162s32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s162s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s162s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s162s32(__ubuf__ int32_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s162s32(__ubuf__ int32_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s162s32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s162u32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s162u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s162u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s162u32(__ubuf__ uint32_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s162u32(__ubuf__ uint32_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s162u32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s162u8` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s162u8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s162u8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s322s16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s322s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s322s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s322s16(__ubuf__ int16_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s322s16(__ubuf__ int16_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s322s16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s322u16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s322u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s322u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s322u16(__ubuf__ uint16_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s322u16(__ubuf__ uint16_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s322u16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_s322u8` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.s322u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.s322u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_s322u8(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_s322u8(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_s322u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u162s32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u162s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u162s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u162s32(__ubuf__ int32_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u162s32(__ubuf__ int32_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u162s32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u162u32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u162u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u162u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u162u32(__ubuf__ uint32_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u162u32(__ubuf__ uint32_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u162u32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u162u8` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u162u8(__ubuf__ uint8_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u162u8(__ubuf__ uint8_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u322s16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u322s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u322s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u322s16(__ubuf__ int16_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u322s16(__ubuf__ int16_t* dst, __ubuf__ uint32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u322s16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u322u16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u322u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u322u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u322u16(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u322u16(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u322u16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u322u8` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u322u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u322u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u322u8(__ubuf__ uint8_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u322u8(__ubuf__ uint8_t* dst, __ubuf__ uint32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u322u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u82s16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u82s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u82s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u82s16(__ubuf__ int16_t* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u82s16(__ubuf__ int16_t* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u82s16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u82s32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u82s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u82s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u82s32(__ubuf__ int32_t* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u82s32(__ubuf__ int32_t* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u82s32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u82u16` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u82u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u82u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u82u16(__ubuf__ uint16_t* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u82u16(__ubuf__ uint16_t* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u82u16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcbd_u82u32` + - LLVM intrinsic names: + - `llvm.hivm.VCBD.u82u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCBD.u82u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcbd_u82u32(__ubuf__ uint32_t* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcbd_u82u32(__ubuf__ uint32_t* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcbd_u82u32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcgadd` + - LLVM intrinsic names: + - `llvm.hivm.VCGADD.f16` + - `llvm.hivm.VCGADD.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCGADD.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCGADD.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcgadd(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgadd(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcgmax` + - LLVM intrinsic names: + - `llvm.hivm.VCGMAX.f16` + - `llvm.hivm.VCGMAX.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCGMAX.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCGMAX.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcgmax(__ubuf__ float* dst, __ubuf__ float* src, uint64_t confg);` + - Parameter packing: Direct bottom-level form: `confg` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgmax(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmax(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmax(__ubuf__ half* dst, __ubuf__ half* src, uint64_t confg);` + - Parameter packing: Direct bottom-level form: `confg` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcgmin` + - LLVM intrinsic names: + - `llvm.hivm.VCGMIN.f16` + - `llvm.hivm.VCGMIN.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCGMIN.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCGMIN.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcgmin(__ubuf__ float* dst, __ubuf__ float* src, uint64_t confg);` + - Parameter packing: Direct bottom-level form: `confg` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgmin(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmin(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmin(__ubuf__ half* dst, __ubuf__ half* src, uint64_t confg);` + - Parameter packing: Direct bottom-level form: `confg` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcgmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcgmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t src0Stride, uint16_t src1Stride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcgmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vci` + - LLVM intrinsic names: + - `llvm.hivm.VCI.f16` + - `llvm.hivm.VCI.f32` + - `llvm.hivm.VCI.s16` + - `llvm.hivm.VCI.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCI.f16(ptr addrspace(6) nocapture writeonly, half, i64) #1` + - `declare void @llvm.hivm.VCI.f32(ptr addrspace(6) nocapture writeonly, float, i64) #1` + - `declare void @llvm.hivm.VCI.s16(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - `declare void @llvm.hivm.VCI.s32(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vci(__ubuf__ float* dst, float src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vci(__ubuf__ float* dst, float src, uint8_t repeat, uint16_t dstStride, uint8_t srcStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vci` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vci(__ubuf__ half* dst, half src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vci(__ubuf__ half* dst, half src, uint8_t repeat, uint16_t dstStride, uint8_t srcStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vci` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vci(__ubuf__ int16_t* dst, int16_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vci(__ubuf__ int16_t* dst, int16_t src, uint8_t repeat, uint16_t dstStride, uint8_t srcStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vci` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vci(__ubuf__ int32_t* dst, int32_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vci(__ubuf__ int32_t* dst, int32_t src, uint8_t repeat, uint16_t dstStride, uint8_t srcStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vci` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmax` + - LLVM intrinsic names: + - `llvm.hivm.VCMAX.f16` + - `llvm.hivm.VCMAX.f16.order` + - `llvm.hivm.VCMAX.f16.order.v220` + - `llvm.hivm.VCMAX.f32.order` + - `llvm.hivm.VCMAX.f32.order.v220` + - `llvm.hivm.VCMAX.s16.order` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMAX.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMAX.f16.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMAX.f16.order.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMAX.f32.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMAX.f32.order.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMAX.s16.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmax(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config, Order_t order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config, bool order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, Order_t order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config, Order_t order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config, bool order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, Order_t order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmax(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config, bool order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmax(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmin` + - LLVM intrinsic names: + - `llvm.hivm.VCMIN.f16` + - `llvm.hivm.VCMIN.f16.order` + - `llvm.hivm.VCMIN.f16.order.v220` + - `llvm.hivm.VCMIN.f32.order` + - `llvm.hivm.VCMIN.f32.order.v220` + - `llvm.hivm.VCMIN.s16.order` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMIN.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMIN.f16.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMIN.f16.order.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMIN.f32.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMIN.f32.order.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCMIN.s16.order(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmin(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config, Order_t order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config, bool MASK);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, Order_t order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool MASK);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config, Order_t order);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config, bool MASK);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, Order_t order);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool MASK);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmin(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config, bool MASK);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmin(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstRepeatStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool MASK);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_eq` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.EQ.f16` + - `llvm.hivm.VCMP.EQ.f32` + - `llvm.hivm.VCMP.EQ.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.EQ.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.EQ.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.EQ.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_eq(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_eq(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_eq(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_eq(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_eq(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_eq(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_eq(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_eq(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_eq(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_ge` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.GE.f16` + - `llvm.hivm.VCMP.GE.f32` + - `llvm.hivm.VCMP.GE.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.GE.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.GE.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.GE.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_ge(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ge(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ge(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ge(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ge(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ge(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ge(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ge(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ge(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_gt` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.GT.f16` + - `llvm.hivm.VCMP.GT.f32` + - `llvm.hivm.VCMP.GT.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.GT.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.GT.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.GT.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_gt(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_gt(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_gt(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_gt(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_gt(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_gt(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_gt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_gt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_gt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_le` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.LE.f16` + - `llvm.hivm.VCMP.LE.f32` + - `llvm.hivm.VCMP.LE.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.LE.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.LE.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.LE.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_le(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_le(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_le(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_le(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_le(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_le(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_le(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_le(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_le(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_lt` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.LT.f16` + - `llvm.hivm.VCMP.LT.f32` + - `llvm.hivm.VCMP.LT.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.LT.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.LT.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.LT.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_lt(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_lt(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_lt(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_lt(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_lt(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_lt(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_lt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_lt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_lt(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmp_ne` + - LLVM intrinsic names: + - `llvm.hivm.VCMP.NE.f16` + - `llvm.hivm.VCMP.NE.f32` + - `llvm.hivm.VCMP.NE.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMP.NE.f16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.NE.f32(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMP.NE.s16(ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmp_ne(__ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ne(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ne(__ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ne(__ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ne(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ne(__ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ne(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmp_ne(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmp_ne(__ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmp_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_eq` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.EQ.f16` + - `llvm.hivm.VCMPV.EQ.f32` + - `llvm.hivm.VCMPV.EQ.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.EQ.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.EQ.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.EQ.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_eq(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_ge` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.GE.f16` + - `llvm.hivm.VCMPV.GE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.GE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.GE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_ge(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_ge(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_ge(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_ge(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_gt` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.GT.f16` + - `llvm.hivm.VCMPV.GT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.GT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.GT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_gt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_gt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_gt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_gt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_le` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.LE.f16` + - `llvm.hivm.VCMPV.LE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.LE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.LE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_le(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_le(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_le(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_le(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_lt` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.LT.f16` + - `llvm.hivm.VCMPV.LT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.LT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.LT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_lt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_lt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_lt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_lt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpv_ne` + - LLVM intrinsic names: + - `llvm.hivm.VCMPV.NE.f16` + - `llvm.hivm.VCMPV.NE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPV.NE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCMPV.NE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpv_ne(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_ne(__ubuf__ uint8_t* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpv_ne(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpv_ne(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpv_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_eq` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.EQ.f16` + - `llvm.hivm.VCMPVS.EQ.f32` + - `llvm.hivm.VCMPVS.EQ.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.EQ.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.EQ.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VCMPVS.EQ.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_eq(__ubuf__ uint8_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t src0BlockStride, uint16_t dstRepeatStride, uint16_t src0RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_eq` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_ge` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.GE.f16` + - `llvm.hivm.VCMPVS.GE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.GE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.GE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ge(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ge` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_gt` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.GT.f16` + - `llvm.hivm.VCMPVS.GT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.GT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.GT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_gt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_gt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_le` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.LE.f16` + - `llvm.hivm.VCMPVS.LE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.LE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.LE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_le(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_le` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_lt` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.LT.f16` + - `llvm.hivm.VCMPVS.LT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.LT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.LT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_lt(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_lt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcmpvs_ne` + - LLVM intrinsic names: + - `llvm.hivm.VCMPVS.NE.f16` + - `llvm.hivm.VCMPVS.NE.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCMPVS.NE.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VCMPVS.NE.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcmpvs_ne(__ubuf__ uint8_t* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcmpvs_ne` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconcat` + - LLVM intrinsic names: + - `llvm.hivm.VCONCAT.f16` + - `llvm.hivm.VCONCAT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONCAT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONCAT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconcat(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconcat(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint8_t stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconcat` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconcat(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconcat(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint8_t stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconcat` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162f32` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162f32.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162f32.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162f32(__ubuf__ float* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162f32(__ubuf__ float* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162s32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162s32a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162s32a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162s32a(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162s32a(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162s32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162s32c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162s32c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162s32c(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162s32c(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162s32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162s32f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162s32f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162s32f(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162s32f(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162s32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162s32r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162s32r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162s32r(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162s32r(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_bf162s32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.bf162s32z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.bf162s32z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_bf162s32z(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_bf162s32z(__ubuf__ int32_t* dst, __ubuf__ bfloat16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_bf162s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_deq` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.DEQ` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.DEQ(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_deq(__ubuf__ half* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deq(__ubuf__ half* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deq` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_deq(__ubuf__ half* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deq` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_deqs162b8` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.DEQs162s8` + - `llvm.hivm.VCONV.DEQs162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.DEQs162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCONV.DEQs162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_deqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config, bool halfBlock);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool halfBlock);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_deqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config, bool halfBlock);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool halfBlock);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_deqs162b8h` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.deq.s162Sc8h.v220` + - `llvm.hivm.VCONV.deq.s162Uc8h.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.deq.s162Sc8h.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.deq.s162Uc8h.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_deqs162b8h(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8h(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8h` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_deqs162b8h(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8h(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8h` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_deqs162b8l` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.deq.s162Sc8l.v220` + - `llvm.hivm.VCONV.deq.s162Uc8l.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.deq.s162Sc8l.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.deq.s162Uc8l.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_deqs162b8l(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8l(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8l` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_deqs162b8l(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_deqs162b8l(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_deqs162b8l` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162f32` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162f32(__ubuf__ float* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162f32(__ubuf__ float* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162f32(__ubuf__ float* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162f32(__ubuf__ float* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s16a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s16a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s16a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s16a(__ubuf__ int16_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s16a(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s16c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s16c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s16c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s16c(__ubuf__ int16_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s16c(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s16f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s16f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s16f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s16f(__ubuf__ int16_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s16f(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s16r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s16r` + - `llvm.hivm.VCONV.f162s16r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s16r(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.f162s16r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s16r(__ubuf__ int16_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s16r(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s16r(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s16z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s16z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s16z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s16z(__ubuf__ int16_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s16z(__ubuf__ int16_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s32a` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s32a(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s32a(__ubuf__ int32_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s32a(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32a(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32a(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s32c` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s32c(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s32c(__ubuf__ int32_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s32c(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32c(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32c(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s32f` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s32f(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s32f(__ubuf__ int32_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s32f(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32f(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32f(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s32r` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s32r(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s32r(__ubuf__ int32_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s32r(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32r(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32r(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s32z` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s32z(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s32z(__ubuf__ int32_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s32z(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32z(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s32z(__ubuf__ int32_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4` + - `llvm.hivm.VCONV.f162s4.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.f162s4.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s4(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4a(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4a(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4c(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4c(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4f(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4f(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4r(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4r(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s4z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s4z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s4z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s4z(__ubuf__ void* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s4z(__ubuf__ void* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s4z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8a` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8a(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8a(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8a(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8a(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8a(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8c` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8c(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8c(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8c(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8c(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8c(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8f` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8f(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8f(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8f(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8f(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8f(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8r(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8r(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162s8z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162s8z` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162s8z(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162s8z(__ubuf__ int8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162s8z(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8z(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162s8z(__ubuf__ int8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162s8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8a` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8a(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8a(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8a(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8a(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8a(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8c` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8c(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8c(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8c(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8c(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8c(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8f` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8f(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8f(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8f(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8f(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8f(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8r(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8r(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f162u8z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f162u8z` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f162u8z(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f162u8z(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f162u8z(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8z(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f162u8z(__ubuf__ uint8_t* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f162u8z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322bf16a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322bf16a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322bf16a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322bf16a(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322bf16a(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322bf16a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322bf16c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322bf16c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322bf16c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322bf16c(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322bf16c(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322bf16c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322bf16f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322bf16f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322bf16f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322bf16f(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322bf16f(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322bf16f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322bf16r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322bf16r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322bf16r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322bf16r(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322bf16r(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322bf16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322bf16z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322bf16z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322bf16z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322bf16z(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322bf16z(__ubuf__ bfloat16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322bf16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16a(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16a(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16c(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16c(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16f(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16f(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16o` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16o` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16o(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16o(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16o(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16o` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322f16o(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16o` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322f16o(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16o` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16r(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16r(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f16z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f16z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f16z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f16z(__ubuf__ half* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f16z(__ubuf__ half* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f32a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f32a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f32a(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f32a(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f32c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f32c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f32c(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f32c(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f32f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f32f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f32f(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f32f(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f32r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f32r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f32r(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f32r(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322f32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322f32z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322f32z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322f32z(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322f32z(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322f32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s16a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s16a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s16a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s16a(__ubuf__ int16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s16a(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s16c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s16c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s16c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s16c(__ubuf__ int16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s16c(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s16f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s16f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s16f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s16f(__ubuf__ int16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s16f(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s16r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s16r` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s16r(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s16r(__ubuf__ int16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s16r(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s16r(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s16r(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s16z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s16z` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s16z(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s16z(__ubuf__ int16_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s16z(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s16z(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s16z(__ubuf__ int16_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s32a` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s32a(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s32a(__ubuf__ int32_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s32a(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32a(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32a(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s32c` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s32c(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s32c(__ubuf__ int32_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s32c(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32c(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32c(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s32f` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s32f(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s32f(__ubuf__ int32_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s32f(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32f(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32f(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s32r` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s32r(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s32r(__ubuf__ int32_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s32r(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32r(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32r(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s32z` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s32z(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s32z(__ubuf__ int32_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s32z(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32z(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_f322s32z(__ubuf__ int32_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s64a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s64a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s64a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s64a(__ubuf__ int64_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s64a(__ubuf__ int64_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s64a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s64c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s64c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s64c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s64c(__ubuf__ int64_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s64c(__ubuf__ int64_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s64c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s64f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s64f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s64f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s64f(__ubuf__ int64_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s64f(__ubuf__ int64_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s64f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s64r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s64r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s64r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s64r(__ubuf__ int64_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s64r(__ubuf__ int64_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s64r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_f322s64z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.f322s64z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.f322s64z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_f322s64z(__ubuf__ int64_t* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_f322s64z(__ubuf__ int64_t* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_f322s64z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16` + - `llvm.hivm.VCONV.s162f16.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.s162f16.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s162f16(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16a(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16a(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16c(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16c(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16f(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16f(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16r(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16r(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f16z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f16z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f16z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f16z(__ubuf__ half* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f16z(__ubuf__ half* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f16z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s162f32` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s162f32` + - `llvm.hivm.VCONV.s162f32.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s162f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.s162f32.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s162f32(__ubuf__ float* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s162f32(__ubuf__ float* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s162f32(__ubuf__ float* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s162f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s322f32(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s322f32(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32a.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32a.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32a(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32a(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32c.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32c.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32c(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32c(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32f.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32f.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32f(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32f(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32r.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32r.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32r(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32r(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322f32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322f32z.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322f32z.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322f32z(__ubuf__ float* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322f32z(__ubuf__ float* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322f32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322s16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322s16.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322s16.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322s16(__ubuf__ int16_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322s16(__ubuf__ int16_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322s16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s322s64` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s322s64.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s322s64.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s322s64(__ubuf__ int64_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s322s64(__ubuf__ int64_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s322s64` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s42f16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s42f16.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s42f16.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s42f16(__ubuf__ half* dst, __ubuf__ void* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s42f16(__ubuf__ half* dst, __ubuf__ void* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s42f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642f32a` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642f32a.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642f32a.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642f32a(__ubuf__ float* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642f32a(__ubuf__ float* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642f32a` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642f32c` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642f32c.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642f32c.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642f32c(__ubuf__ float* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642f32c(__ubuf__ float* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642f32c` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642f32f` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642f32f.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642f32f.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642f32f(__ubuf__ float* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642f32f(__ubuf__ float* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642f32f` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642f32r` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642f32r.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642f32r.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642f32r(__ubuf__ float* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642f32r(__ubuf__ float* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642f32r` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642f32z` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642f32z.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642f32z.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642f32z(__ubuf__ float* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642f32z(__ubuf__ float* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642f32z` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s642s32` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s642s32.1.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s642s32.1.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s642s32(__ubuf__ int32_t* dst, __ubuf__ int64_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s642s32(__ubuf__ int32_t* dst, __ubuf__ int64_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s642s32` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_s82f16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.s82f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.s82f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_s82f16(__ubuf__ half* dst, __ubuf__ int8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_s82f16(__ubuf__ half* dst, __ubuf__ int8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s82f16(__ubuf__ half* dst, __ubuf__ int8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_s82f16(__ubuf__ half* dst, __ubuf__ int8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_s82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_u82f16` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.u82f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.u82f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_u82f16(__ubuf__ half* dst, __ubuf__ uint8_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_u82f16(__ubuf__ half* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_u82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_u82f16(__ubuf__ half* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_u82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_u82f16(__ubuf__ half* dst, __ubuf__ uint8_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_u82f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_vdeqs162b8` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.VDEQs162s8` + - `llvm.hivm.VCONV.VDEQs162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.VDEQs162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VCONV.VDEQs162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config, bool halfBlock);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool halfBlock);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config, bool halfBlock);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool halfBlock);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_vdeqs162b8h` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.vdeq.s162Sc8h.v220` + - `llvm.hivm.VCONV.vdeq.s162Uc8h.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.vdeq.s162Sc8h.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.vdeq.s162Uc8h.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_vdeqs162b8h(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8h(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8h` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_vdeqs162b8h(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8h(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8h` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vconv_vdeqs162b8l` + - LLVM intrinsic names: + - `llvm.hivm.VCONV.vdeq.s162Sc8l.v220` + - `llvm.hivm.VCONV.vdeq.s162Uc8l.v220` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCONV.vdeq.s162Sc8l.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCONV.vdeq.s162Uc8l.v220(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vconv_vdeqs162b8l(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8l(__ubuf__ int8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8l` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vconv_vdeqs162b8l(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vconv_vdeqs162b8l(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vconv_vdeqs162b8l` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcopy` + - LLVM intrinsic names: + - `llvm.hivm.VCOPY.s16` + - `llvm.hivm.VCOPY.s32` + - `llvm.hivm.VCOPY.u16` + - `llvm.hivm.VCOPY.u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCOPY.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCOPY.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCOPY.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCOPY.u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcopy(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcopy(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstStride, uint16_t srcStride, uint16_t dstRepeatSize, uint16_t srcRepeatSize);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcopy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcopy(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcopy(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstStride, uint16_t srcStride, uint16_t dstRepeatSize, uint16_t srcRepeatSize);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcopy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcopy(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcopy(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstStride, uint16_t srcStride, uint16_t dstRepeatSize, uint16_t srcRepeatSize);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcopy` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcopy(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcopy(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t repeat, uint16_t dstStride, uint16_t srcStride, uint16_t dstRepeatSize, uint16_t srcRepeatSize);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcopy` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vcpadd` + - LLVM intrinsic names: + - `llvm.hivm.VCPADD.f16` + - `llvm.hivm.VCPADD.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VCPADD.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VCPADD.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vcpadd(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcpadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcpadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcpadd(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcpadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcpadd(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vcpadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcpadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vcpadd(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vcpadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vdiv` + - LLVM intrinsic names: + - `llvm.hivm.VDIV.f16` + - `llvm.hivm.VDIV.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VDIV.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VDIV.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vdiv(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vdiv(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vdiv` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vdiv(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vdiv` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vdiv(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vdiv(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vdiv` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vdiv(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vdiv` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vdp` + - LLVM intrinsic names: + - `llvm.hivm.VDP.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VDP.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vdp(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint16_t numPixel, uint8_t numMaxDisparity, uint16_t offsetPixel, uint16_t dynamicAddrRange, bool isBeginPixel, bool isPathReverse, bool pathMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vdp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vdp(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vector_dup` + - LLVM intrinsic names: + - `llvm.hivm.MOVEV.bf16` + - `llvm.hivm.MOVEV.f16` + - `llvm.hivm.MOVEV.f32` + - `llvm.hivm.MOVEV.s16` + - `llvm.hivm.MOVEV.s32` + - `llvm.hivm.MOVEV.u16` + - `llvm.hivm.MOVEV.u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.MOVEV.bf16(ptr addrspace(6) nocapture writeonly, bfloat, i64) #1` + - `declare void @llvm.hivm.MOVEV.f16(ptr addrspace(6) nocapture writeonly, half, i64) #1` + - `declare void @llvm.hivm.MOVEV.f32(ptr addrspace(6) nocapture writeonly, float, i64) #1` + - `declare void @llvm.hivm.MOVEV.s16(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - `declare void @llvm.hivm.MOVEV.s32(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - `declare void @llvm.hivm.MOVEV.u16(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - `declare void @llvm.hivm.MOVEV.u32(ptr addrspace(6) nocapture writeonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vector_dup(__ubuf__ bfloat16_t* dst, bfloat16_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ bfloat16_t* dst, bfloat16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ float* dst, float src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ float* dst, float src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ float* dst, float src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ float* dst, float src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ half* dst, half src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ half* dst, half src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ half* dst, half src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ half* dst, half src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int16_t* dst, int16_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ int16_t* dst, int16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int16_t* dst, int16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int16_t* dst, int16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int32_t* dst, int32_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ int32_t* dst, int32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int32_t* dst, int32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ int32_t* dst, int32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint16_t* dst, uint16_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ uint16_t* dst, uint16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint16_t* dst, uint16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint16_t* dst, uint16_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint32_t* dst, uint32_t src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vector_dup(__ubuf__ uint32_t* dst, uint32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint32_t* dst, uint32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vector_dup(__ubuf__ uint32_t* dst, uint32_t src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vector_dup` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vexp` + - LLVM intrinsic names: + - `llvm.hivm.VEXP.f16` + - `llvm.hivm.VEXP.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VEXP.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VEXP.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vexp(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vexp(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vexp(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vexp(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vexp(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vexp(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vexp(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vexp(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vexp` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vextract` + - LLVM intrinsic names: + - `llvm.hivm.VEXTRACT.f16` + - `llvm.hivm.VEXTRACT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VEXTRACT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VEXTRACT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vextract(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vextract(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint8_t stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vextract` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vextract(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vextract(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint8_t stride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vextract` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vgather` + - LLVM intrinsic names: + - `llvm.hivm.VGATHER.b16` + - `llvm.hivm.VGATHER.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VGATHER.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VGATHER.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vgather(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, bool repeatStrideMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgather` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgather(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, uint16_t dstRepeatStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgather` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgather(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vgather(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, bool repeatStrideMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgather` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgather(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, uint16_t dstRepeatStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgather` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgather(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vgatherb` + - LLVM intrinsic names: + - `llvm.hivm.VGATHERB.b16` + - `llvm.hivm.VGATHERB.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VGATHERB.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VGATHERB.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vgatherb(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, uint16_t dstRepeatStride, uint8_t dstBlockStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgatherb` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgatherb(__ubuf__ uint16_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vgatherb(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t offsetAddr, uint16_t dstRepeatStride, uint8_t dstBlockStride, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vgatherb` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vgatherb(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vld_va_reg` + - LLVM intrinsic names: + - `llvm.hivm.VLD.VA.REG` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VLD.VA.REG(i64, ptr addrspace(6) nocapture, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vld_va_reg(ub_addr8_t dst, __ubuf__ uint64_t* src, vpart_t config);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vld_va_reg` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vln` + - LLVM intrinsic names: + - `llvm.hivm.VLN.f16` + - `llvm.hivm.VLN.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VLN.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VLN.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vln(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vln(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vln(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vln(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vln(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vln(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vln(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vln(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vln` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vlrelu` + - LLVM intrinsic names: + - `llvm.hivm.VLRELU.f16` + - `llvm.hivm.VLRELU.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VLRELU.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VLRELU.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vlrelu(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vlrelu(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t src0BlockStride, uint16_t dstRepeatStride, uint16_t src0RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vlrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vlrelu(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t src0BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vlrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vlrelu(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vlrelu(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t src0BlockStride, uint16_t dstRepeatStride, uint16_t src0RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vlrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vlrelu(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t src0BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vlrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmadd` + - LLVM intrinsic names: + - `llvm.hivm.VMADD.f16` + - `llvm.hivm.VMADD.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMADD.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMADD.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmadd(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmadd(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmadd(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmadd(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmadd` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmaddrelu` + - LLVM intrinsic names: + - `llvm.hivm.VMADDRELU.f16` + - `llvm.hivm.VMADDRELU.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMADDRELU.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMADDRELU.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaddrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaddrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaddrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmax` + - LLVM intrinsic names: + - `llvm.hivm.VMAX.f16` + - `llvm.hivm.VMAX.f32` + - `llvm.hivm.VMAX.s16` + - `llvm.hivm.VMAX.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMAX.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMAX.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMAX.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMAX.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmax(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmax(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmax(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmax(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmax(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmax(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmax` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmaxs` + - LLVM intrinsic names: + - `llvm.hivm.VMAXS.f16` + - `llvm.hivm.VMAXS.f32` + - `llvm.hivm.VMAXS.s16` + - `llvm.hivm.VMAXS.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMAXS.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VMAXS.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VMAXS.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VMAXS.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmaxs(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaxs(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaxs(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaxs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmaxs(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmaxs(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmaxs` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmin` + - LLVM intrinsic names: + - `llvm.hivm.VMIN.f16` + - `llvm.hivm.VMIN.f32` + - `llvm.hivm.VMIN.s16` + - `llvm.hivm.VMIN.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMIN.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMIN.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMIN.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMIN.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmin(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmin(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmin(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmin(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmin(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmin(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmin` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmins` + - LLVM intrinsic names: + - `llvm.hivm.VMINS.f16` + - `llvm.hivm.VMINS.f32` + - `llvm.hivm.VMINS.s16` + - `llvm.hivm.VMINS.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMINS.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VMINS.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VMINS.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VMINS.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmins(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmins(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmins(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmins(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmins(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmins(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmins` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmla` + - LLVM intrinsic names: + - `llvm.hivm.VMLA.f16` + - `llvm.hivm.VMLA.f32` + - `llvm.hivm.VMLA.fmix` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMLA.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMLA.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMLA.fmix(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmla(__ubuf__ float* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmla(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmla(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmla(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmla` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmrgsort4` + - LLVM intrinsic names: + - `llvm.hivm.VMRGSORT.f16` + - `llvm.hivm.VMRGSORT.f16.V300` + - `llvm.hivm.VMRGSORT.f32` + - `llvm.hivm.VMRGSORT.f32.V300` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMRGSORT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMRGSORT.f16.V300(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VMRGSORT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMRGSORT.f32.V300(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec, dav-m300` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmrgsort4(__ubuf__ float* const arg0, __ubuf__ float** const arg1, uint64_t arg2);` + - Parameter packing: Direct bottom-level form: `arg2` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmrgsort4(__ubuf__ float* dst, __ubuf__ float** src, uint8_t repeat, uint16_t regionProposalLi0, uint16_t regionProposalLi1, uint16_t regionProposalLi2, uint16_t regionProposalLi3, bool isAllStored, uint8_t maskSignal);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4637): `/* #5078 */ __builtin_cce_vmrgsort4(dst, src, ((regionProposalLi0 & 0xffff) << 0 | (regionProposalLi1 & 0xffff) << 16 | (regionProposalLi2 & 0xffff) << 32 | (regionProposalLi3 & 0xffff) << 48), ((repeat & 0xff) << 0 | (isAllStored & 0x1) << 12 | (maskSignal & 0xf) << 8))` + - `void __builtin_cce_vmrgsort4(__ubuf__ float* dst, __ubuf__ float** src0, uint64_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `src1, config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmrgsort4(__ubuf__ half* const arg0, __ubuf__ half** const arg1, uint64_t arg2);` + - Parameter packing: Direct bottom-level form: `arg2` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmrgsort4(__ubuf__ half* dst, __ubuf__ half** src, uint8_t repeat, uint16_t regionProposalLi0, uint16_t regionProposalLi1, uint16_t regionProposalLi2, uint16_t regionProposalLi3, bool isAllStored, uint8_t maskSignal);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4637): `/* #5078 */ __builtin_cce_vmrgsort4(dst, src, ((regionProposalLi0 & 0xffff) << 0 | (regionProposalLi1 & 0xffff) << 16 | (regionProposalLi2 & 0xffff) << 32 | (regionProposalLi3 & 0xffff) << 48), ((repeat & 0xff) << 0 | (isAllStored & 0x1) << 12 | (maskSignal & 0xf) << 8))` + - `void __builtin_cce_vmrgsort4(__ubuf__ half* dst, __ubuf__ half** src0, uint64_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `src1, config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vmul` + - LLVM intrinsic names: + - `llvm.hivm.VMUL.f16` + - `llvm.hivm.VMUL.f32` + - `llvm.hivm.VMUL.s16` + - `llvm.hivm.VMUL.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMUL.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMUL.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMUL.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VMUL.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmul(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmul(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmul(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmul(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmul(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmul(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmul` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmulconv_f162s8` + - LLVM intrinsic names: + - `llvm.hivm.VMULCONV.f162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMULCONV.f162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmulconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmulconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmulconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmulconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmulconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmulconv_f162u8` + - LLVM intrinsic names: + - `llvm.hivm.VMULCONV.f162u8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMULCONV.f162u8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmulconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmulconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmulconv_f162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmulconv_f162u8(__ubuf__ uint8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmulconv_f162u8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vmuls` + - LLVM intrinsic names: + - `llvm.hivm.VMULS.f16` + - `llvm.hivm.VMULS.f32` + - `llvm.hivm.VMULS.s16` + - `llvm.hivm.VMULS.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VMULS.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, half, i64) #1` + - `declare void @llvm.hivm.VMULS.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, float, i64) #1` + - `declare void @llvm.hivm.VMULS.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VMULS.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vmuls(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmuls(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ float* dst, __ubuf__ float* src0, float src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmuls(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ half* dst, __ubuf__ half* src0, half src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmuls(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, int16_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vmuls(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vmuls(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, int32_t src1, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vmuls` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vnot` + - LLVM intrinsic names: + - `llvm.hivm.VNOT.s16` + - `llvm.hivm.VNOT.u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VNOT.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VNOT.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vnot(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vnot(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vnot(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vnot(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vnot(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vnot(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vnot(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vnot(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vnot` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vor` + - LLVM intrinsic names: + - `llvm.hivm.VOR.s16` + - `llvm.hivm.VOR.u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VOR.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VOR.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vor(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vor(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vor` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vor(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vor` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vor(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vor(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vor` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vor(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vor` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vpadding` + - LLVM intrinsic names: + - `llvm.hivm.VPADDING.b16` + - `llvm.hivm.VPADDING.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VPADDING.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VPADDING.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vpadding(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vpadding(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, uint8_t padMode, bool padSide);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vpadding` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vpadding(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vpadding(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, uint8_t padMode, bool padSide);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vpadding` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vrec` + - LLVM intrinsic names: + - `llvm.hivm.VREC.f16` + - `llvm.hivm.VREC.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VREC.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VREC.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vrec(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrec(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrec(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrec(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrec(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrec(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrec(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrec(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrec` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vreduce` + - LLVM intrinsic names: + - `llvm.hivm.VREDUCE.b16` + - `llvm.hivm.VREDUCE.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VREDUCE.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VREDUCE.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vreduce(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vreduce(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreduce` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vreduce(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint8_t repeat, uint8_t src0BlockStride, uint8_t patternMode, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreduce` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vreduce(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src0, __ubuf__ uint32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vreduce(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src0, __ubuf__ uint32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreduce` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vreduce(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src0, __ubuf__ uint32_t* src1, uint8_t repeat, uint8_t src0BlockStride, uint8_t patternMode, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreduce` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vreducev2` + - LLVM intrinsic names: + - `llvm.hivm.VREDUCEv2.b16` + - `llvm.hivm.VREDUCEv2.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VREDUCEv2.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VREDUCEv2.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vreducev2(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint16_t repeat, uint8_t src0BlockStride, uint8_t patternMode, uint16_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreducev2` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vreducev2(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src0, __ubuf__ uint16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vreducev2(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src0, __ubuf__ uint32_t* src1, uint16_t repeat, uint8_t src0BlockStride, uint8_t patternMode, uint16_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vreducev2` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vreducev2(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src0, __ubuf__ uint32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vrelu` + - LLVM intrinsic names: + - `llvm.hivm.VRELU.f16` + - `llvm.hivm.VRELU.f32` + - `llvm.hivm.VRELU.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VRELU.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VRELU.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VRELU.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vrelu(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrelu(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrelu(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrelu(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrelu(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vrsqrt` + - LLVM intrinsic names: + - `llvm.hivm.VRSQRT.f16` + - `llvm.hivm.VRSQRT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VRSQRT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VRSQRT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vrsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vrsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vrsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vrsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vscatter` + - LLVM intrinsic names: + - `llvm.hivm.VSCATTER.b16` + - `llvm.hivm.VSCATTER.b32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSCATTER.b16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSCATTER.b32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vscatter(__ubuf__ uint32_t* dst, __ubuf__ uint16_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vscatter(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. +- `__builtin_cce_vsel` + - LLVM intrinsic names: + - `llvm.hivm.VSEL.f16` + - `llvm.hivm.VSEL.f16.1` + - `llvm.hivm.VSEL.f32` + - `llvm.hivm.VSEL.f32.1` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSEL.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSEL.f16.1(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSEL.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSEL.f32.1(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ void* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ void* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsel(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ void* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, uint8_t selectMode, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsel` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vshl` + - LLVM intrinsic names: + - `llvm.hivm.VSHL.s16` + - `llvm.hivm.VSHL.s32` + - `llvm.hivm.VSHL.u16` + - `llvm.hivm.VSHL.u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSHL.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VSHL.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VSHL.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - `declare void @llvm.hivm.VSHL.u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vshl(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint32_t shlDistance, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshl(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint32_t shlDistance, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshl(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shlDistance, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshl(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shlDistance, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshl(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshl(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shlDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshl` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vshr` + - LLVM intrinsic names: + - `llvm.hivm.VSHR.s16` + - `llvm.hivm.VSHR.s32` + - `llvm.hivm.VSHR.u16` + - `llvm.hivm.VSHR.u32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSHR.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64, i64) #1` + - `declare void @llvm.hivm.VSHR.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64, i64) #1` + - `declare void @llvm.hivm.VSHR.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64, i64) #1` + - `declare void @llvm.hivm.VSHR.u32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vshr(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int32_t shrDistance, uint64_t config, bool round);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshr(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ int16_t* dst, __ubuf__ int16_t* src, int32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t shrDistance, uint64_t config, bool round);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshr(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ int32_t* dst, __ubuf__ int32_t* src, int32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shrDistance, uint64_t config, bool round);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshr(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src, uint32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shrDistance, uint64_t config, bool round);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vshr(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vshr(__ubuf__ uint32_t* dst, __ubuf__ uint32_t* src, uint32_t shrDistance, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode, bool round);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vshr` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsort` + - LLVM intrinsic names: + - `llvm.hivm.VSORT.f16` + - `llvm.hivm.VSORT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSORT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSORT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-t210` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsort(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsort(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsort` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsort(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsort(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsort` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsqrt` + - LLVM intrinsic names: + - `llvm.hivm.VSQRT.f16` + - `llvm.hivm.VSQRT.f32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSQRT.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSQRT.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsqrt(__ubuf__ float* dst, __ubuf__ float* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint16_t dstRepeatStride, uint16_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsqrt(__ubuf__ half* dst, __ubuf__ half* src, uint8_t repeat, uint16_t dstBlockStride, uint16_t srcBlockStride, uint8_t dstRepeatStride, uint8_t srcRepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsqrt` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsub` + - LLVM intrinsic names: + - `llvm.hivm.VSUB.f16` + - `llvm.hivm.VSUB.f32` + - `llvm.hivm.VSUB.s16` + - `llvm.hivm.VSUB.s32` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUB.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSUB.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSUB.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSUB.s32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsub(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsub(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsub(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsub(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsub(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsub(__ubuf__ int32_t* dst, __ubuf__ int32_t* src0, __ubuf__ int32_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsub` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsubrelu` + - LLVM intrinsic names: + - `llvm.hivm.VSUBRELU.f16` + - `llvm.hivm.VSUBRELU.f32` + - `llvm.hivm.VSUBRELU.s16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUBRELU.f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSUBRELU.f32(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - `declare void @llvm.hivm.VSUBRELU.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture readonly, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsubrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubrelu(__ubuf__ float* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubrelu(__ubuf__ half* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubrelu(__ubuf__ int16_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubrelu` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsubreluconv_f162s8` + - LLVM intrinsic names: + - `llvm.hivm.VSUBRELUCONV.f162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUBRELUCONV.f162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsubreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubreluconv_f162s8(__ubuf__ int8_t* dst, __ubuf__ half* src0, __ubuf__ half* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_f162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsubreluconv_f322f16` + - LLVM intrinsic names: + - `llvm.hivm.VSUBRELUCONV.f322f16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUBRELUCONV.f322f16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsubreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubreluconv_f322f16(__ubuf__ half* dst, __ubuf__ float* src0, __ubuf__ float* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_f322f16` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsubreluconv_s162s8` + - LLVM intrinsic names: + - `llvm.hivm.VSUBRELUCONV.s162s8` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUBRELUCONV.s162s8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-c220-vec, dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsubreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_s162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubreluconv_s162s8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_s162s8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vsubreluconv_vdeqs162b8` + - LLVM intrinsic names: + - `llvm.hivm.VSUBRELUCONV.VDEQs162b8` + - `llvm.hivm.VSUBRELUCONV.VDEQs162b8.1` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VSUBRELUCONV.VDEQs162b8(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - `declare void @llvm.hivm.VSUBRELUCONV.VDEQs162b8.1(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly, ptr addrspace(6) nocapture, i64, i64) #1` + - Probe targets used: `dav-s200` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4657): `/* #5307 */ __builtin_cce_vsubreluconv_vdeqs162b8(dst, src0, src1, ((repeat & 0xff) << 56 | (dstBlockStride & 0xff) << 0 | (src0BlockStride & 0xff) << 8 | (src1BlockStride & 0xff) << 16 | (dstRepeatStride & 0xff) << 24 | (src0RepeatStride & 0xff) << 32 | (src1RepeatStride & 0xff) << 40), h)` + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ int8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint64_t config, bool h);` + - Parameter packing: Direct bottom-level form: `config` is already supplied as the packed operand; no `// ->` wrapper packing comment is needed. + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool h);` + - Parameter packing: Header packing comment (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4652): `/* #5308 */ __builtin_cce_vsubreluconv_vdeqs162b8(dst, src0, src1, ((repeat & 0xff) << 56 | (dstBlockStride & 0xff) << 0 | (src0BlockStride & 0xff) << 8 | (src1BlockStride & 0xff) << 16 | (dstRepeatStride & 0xff) << 24 | (src0RepeatStride & 0xff) << 32 | (src1RepeatStride & 0xff) << 40), h)` + - `void __builtin_cce_vsubreluconv_vdeqs162b8(__ubuf__ uint8_t* dst, __ubuf__ int16_t* src0, __ubuf__ int16_t* src1, uint8_t repeat, uint8_t dstBlockStride, uint8_t src0BlockStride, uint8_t src1BlockStride, uint8_t dstRepeatStride, uint8_t src0RepeatStride, uint8_t src1RepeatStride, bool repeatStrideMode, bool strideSizeMode, bool h);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vsubreluconv_vdeqs162b8` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_vtranspose` + - LLVM intrinsic names: + - `llvm.hivm.VTRANSPOSE.s16` + - `llvm.hivm.VTRANSPOSE.u16` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.VTRANSPOSE.s16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly) #1` + - `declare void @llvm.hivm.VTRANSPOSE.u16(ptr addrspace(6) nocapture writeonly, ptr addrspace(6) nocapture readonly) #1` + - Probe targets used: `dav-m200-vec` + - Complete C++ pointer-form signatures: + - `void __builtin_cce_vtranspose(__ubuf__ int16_t* dst, __ubuf__ int16_t* src);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vtranspose` with this parameter list in `cce_aicore_intrinsics_3101.h`. + - `void __builtin_cce_vtranspose(__ubuf__ uint16_t* dst, __ubuf__ uint16_t* src);` + - Parameter packing: No CANN `// ->` packing comment found for wrapper `vtranspose` with this parameter list in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_set_cmpmask` + - Category: A2/A3 vector mask/control builtin. + - C++ wrapper alias: `set_cmpmask` in `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics.h:2027`. + - Stub signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h:6692`. + - LLVM intrinsic names: + - `llvm.hivm.SET.CMPMASK` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.CMPMASK(ptr addrspace(6) nocapture readonly) #1` + - Actual probe calls: + - `call void @llvm.hivm.SET.CMPMASK(ptr addrspace(6) null)` + - Probe targets used: `dav-m200-vec` + - Complete C++ mask/control signatures: + - `void __builtin_cce_set_cmpmask(__ubuf__ void* src);` + - Parameter packing: Direct bottom-level form: `src` is a UB pointer to the compare-mask source; no CANN `// ->` wrapper packing comment was found in `cce_aicore_intrinsics_3101.h`. +- `__builtin_cce_set_mask_count` + - Category: A2/A3 vector mask/control builtin. + - C++ wrapper alias: `set_mask_count` in `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:877`. + - Stub signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h:6806`. + - LLVM intrinsic names: + - `llvm.hivm.SET.MASK.COUNT` + - `llvm.hivm.GET.CTRL` + - `llvm.hivm.SBITSET1` + - `llvm.hivm.SET.CTRL` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.MASK.COUNT() #1` + - `declare i64 @llvm.hivm.GET.CTRL() #1` + - `declare i64 @llvm.hivm.SBITSET1(i64, i64) #2` + - `declare void @llvm.hivm.SET.CTRL(i64) #1` + - Actual probe calls: + - `%1 = call i64 @llvm.hivm.GET.CTRL()` + - `%2 = call i64 @llvm.hivm.SBITSET1(i64 %1, i64 56)` + - `call void @llvm.hivm.SET.CTRL(i64 %2)` + - Probe targets used: `dav-m200-vec` + - Complete C++ mask/control signatures: + - `void __builtin_cce_set_mask_count();` + - Parameter packing: Header wrapper expansion (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4385): `/* #3885 */ __builtin_cce_set_ctrl(/* #3406 */ __builtin_cce_sbitset1(/* #1952 */ __builtin_cce_get_ctrl(), 56))` +- `__builtin_cce_set_mask_norm` + - Category: A2/A3 vector mask/control builtin. + - C++ wrapper alias: `set_mask_norm` in `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:879`. + - Stub signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h:6807`. + - LLVM intrinsic names: + - `llvm.hivm.SET.MASK.NORM` + - `llvm.hivm.GET.CTRL` + - `llvm.hivm.SBITSET0` + - `llvm.hivm.SET.CTRL` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.MASK.NORM() #1` + - `declare i64 @llvm.hivm.GET.CTRL() #1` + - `declare i64 @llvm.hivm.SBITSET0(i64, i64) #2` + - `declare void @llvm.hivm.SET.CTRL(i64) #1` + - Actual probe calls: + - `%1 = call i64 @llvm.hivm.GET.CTRL()` + - `%2 = call i64 @llvm.hivm.SBITSET0(i64 %1, i64 56)` + - `call void @llvm.hivm.SET.CTRL(i64 %2)` + - Probe targets used: `dav-m200-vec` + - Complete C++ mask/control signatures: + - `void __builtin_cce_set_mask_norm();` + - Parameter packing: Header wrapper expansion (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4390): `/* #3885 */ __builtin_cce_set_ctrl(/* #3405 */ __builtin_cce_sbitset0(/* #1952 */ __builtin_cce_get_ctrl(), 56))` +- `__builtin_cce_set_vector_mask` + - Category: A2/A3 vector mask/control builtin. + - C++ wrapper alias: `set_vector_mask` in `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:917`. + - Stub signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h:6886`. + - LLVM intrinsic names: + - `llvm.hivm.SET.VECTOR.MASK` + - `llvm.hivm.MOVEMASK` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.VECTOR.MASK(i64, i64) #1` + - `declare void @llvm.hivm.MOVEMASK(i64, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOVEMASK(i64 1, i64 1)` + - `call void @llvm.hivm.MOVEMASK(i64 0, i64 2)` + - Probe targets used: `dav-m200-vec` + - Complete C++ mask/control signatures: + - `void __builtin_cce_set_vector_mask(uint64_t mask1, uint64_t mask0);` + - Parameter packing: Header wrapper expansion (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4505-.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4506): `/* #5432 */ movemask(1, mask1); /* #5432 */ movemask(0, mask0)` +- `__builtin_cce_set_vector_mask_dup` + - Category: A2/A3 vector mask/control builtin. + - C++ wrapper alias: `set_vector_mask_dup` in `.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:919`. + - Stub signature source: `.local/cann/tools/tikicpulib/lib/include/stub_fun.h:6887`. + - LLVM intrinsic names: + - `llvm.hivm.SET.VECTOR.MASK.dup` + - `llvm.hivm.MOVEMASK` + - Observed LLVM IR declarations: + - `declare void @llvm.hivm.SET.VECTOR.MASK.dup(i64) #1` + - `declare void @llvm.hivm.MOVEMASK(i64, i64) #1` + - Actual probe calls: + - `call void @llvm.hivm.MOVEMASK(i64 1, i64 1)` + - `call void @llvm.hivm.MOVEMASK(i64 0, i64 1)` + - Probe targets used: `dav-m200-vec` + - Complete C++ mask/control signatures: + - `void __builtin_cce_set_vector_mask_dup(uint64_t mask);` + - Parameter packing: Header wrapper expansion (.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4511-.local/cann/x86_64-linux/ccec_compiler/lib/clang/15.0.5/include/cce_aicore_intrinsics_3101.h:4512): `/* #5432 */ movemask(1, mask); /* #5432 */ movemask(0, mask)` diff --git a/include/PTO/IR/PTOOps.td b/include/PTO/IR/PTOOps.td index 5248ec5088..d99e9f3f4c 100644 --- a/include/PTO/IR/PTOOps.td +++ b/include/PTO/IR/PTOOps.td @@ -77,6 +77,7 @@ class PTO_Op traits = []> : Op; include "PTO/IR/VPTOOps.td" +include "PTO/IR/VPTOUbOps.td" //===----------------------------------------------------------------------===// // Pointer/View Ops (for your front-end IR) diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td new file mode 100644 index 0000000000..fc1da8a178 --- /dev/null +++ b/include/PTO/IR/VPTOUbOps.td @@ -0,0 +1,134 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +//===- VPTOUbOps.td - PTO raw ubuf ops (a2a3) ----------------*- tablegen -*-===// + +#ifndef MLIR_DIALECT_PTO_IR_VPTOUBOPS +#define MLIR_DIALECT_PTO_IR_VPTOUBOPS + +include "mlir/IR/OpBase.td" +include "mlir/Interfaces/SideEffectInterfaces.td" +include "PTO/IR/VPTOInterfaces.td" + +class PTO_UBufBinaryOp traits = []> + : PTO_Op])> { + let summary = "Raw ubuf binary operation mapping to llvm.hivm intrinsics."; + let description = [{ + Lowers to `llvm.hivm` intrinsics for the a2a3 (dav-c220-vec) backend. + Operates directly on ubuf pointers rather than vreg values. + + The repeat / block-stride / repeat-stride operands are packed into a single + `i64` config during lowering, following the bit layout defined in + `cce_aicore_intrinsics_3101.h`. + }]; + + let arguments = (ins + PTO_BufferType:$dst, + PTO_BufferType:$src0, + PTO_BufferType:$src1, + I64:$repeat, + I64:$dstBlockStride, + I64:$src0BlockStride, + I64:$src1BlockStride, + I64:$dstRepeatStride, + I64:$src0RepeatStride, + I64:$src1RepeatStride + ); + + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + $dst `,` $src0 `,` $src1 `,` + $repeat `,` $dstBlockStride `,` $src0BlockStride `,` + $src1BlockStride `,` $dstRepeatStride `,` $src0RepeatStride `,` + $src1RepeatStride + attr-dict `:` type($dst) `,` type($src0) `,` type($src1) `,` + type($repeat) `,` type($dstBlockStride) `,` type($src0BlockStride) `,` + type($src1BlockStride) `,` type($dstRepeatStride) `,` + type($src0RepeatStride) `,` type($src1RepeatStride) + }]; +} + +def PTO_UBVaddOp : PTO_UBufBinaryOp<"ub.vadd">; +def PTO_UBVsubOp : PTO_UBufBinaryOp<"ub.vsub">; +def PTO_UBVmulOp : PTO_UBufBinaryOp<"ub.vmul">; +def PTO_UBVdivOp : PTO_UBufBinaryOp<"ub.vdiv">; + +def PTO_UBSetMaskOp : PTO_Op<"ub.set_mask", [ + DeclareOpInterfaceMethods +]> { + let summary = "Set vector mask lanes for UB buffer pipe operations"; + let description = [{ + Configures the hardware vector mask registers. Subsequent `pto.ub.*` + operations in the same basic block execute under this mask. + + Each bit in the mask corresponds to one element lane. `mask0` covers + lanes 0–63, `mask1` covers lanes 64–127. + Use `mask0=-1, mask1=-1` to restore full-write mode (all lanes active). + }]; + + let arguments = (ins I64:$mask0, I64:$mask1); + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + $mask0 `,` $mask1 attr-dict `:` type($mask0) `,` type($mask1) + }]; +} + +def PTO_UBSetMaskCountOp : PTO_Op<"ub.set_mask_count", [ + DeclareOpInterfaceMethods +]> { + let summary = "Set count mode for UB buffer pipe operations"; + let description = [{ + Toggles the hardware control register into count mode (bit 56 set). + In count mode, subsequent `pto.ub.*` operations use `MASK[0]` as an + element count rather than a per-lane bitmask. `repeat=0` signals the + hardware to use the count register. + + Use `pto.ub.set_mask_norm` to restore normal mask mode. + }]; + + let arguments = (ins); + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + attr-dict + }]; +} + +def PTO_UBSetMaskNormOp : PTO_Op<"ub.set_mask_norm", [ + DeclareOpInterfaceMethods +]> { + let summary = "Restore normal mask mode for UB buffer pipe operations"; + let description = [{ + Toggles the hardware control register out of count mode (bit 56 cleared). + Subsequent `pto.ub.*` operations interpret `MASK[0..1]` as per-lane + bitmasks (normal mode). + + Always pair with a preceding `pto.ub.set_mask_count` or restore after + count-mode operations. + }]; + + let arguments = (ins); + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + attr-dict + }]; +} + +#endif // MLIR_DIALECT_PTO_IR_VPTOUBOPS diff --git a/include/PTO/Transforms/Passes.h b/include/PTO/Transforms/Passes.h index 85970756c5..48e70a550d 100644 --- a/include/PTO/Transforms/Passes.h +++ b/include/PTO/Transforms/Passes.h @@ -110,6 +110,7 @@ std::unique_ptr createExpandTileOpPass(const ExpandTileOpOptions &options) std::unique_ptr createFoldTileBufIntrinsicsPass(); std::unique_ptr createFoldTileBufIntrinsicsPass(llvm::StringRef foldMode); std::unique_ptr createPTOCanonicalizeIRPass(); +std::unique_ptr createLowerPTOToUBufOpsPass(); std::unique_ptr createPTOInlineLibCallPass(const PTOInlineLibCallOptions &options = {}); std::unique_ptr createPTOInlineBackendHelpersPass( diff --git a/include/PTO/Transforms/Passes.td b/include/PTO/Transforms/Passes.td index 6256c9de03..e2c32af088 100644 --- a/include/PTO/Transforms/Passes.td +++ b/include/PTO/Transforms/Passes.td @@ -534,6 +534,27 @@ def PTOCanonicalizeIR : Pass<"pto-canonicalize-ir", "func::FuncOp"> { ]; } +def LowerPTOToUBufOps : Pass<"pto-lower-to-ubuf-ops", "mlir::func::FuncOp"> { + let summary = "Lower eligible pto.tadd/tsub/tmul/tdiv to pto.ub.vadd/vsub/vmul/vdiv on a2a3 targets"; + let description = [{ + Converts pto.tadd/tsub/tmul/tdiv on UB tiles to pto.ub.vadd/vsub/vmul/vdiv + when targeting a3 (dav-c220-vec). Computes repeat count and repeat strides + from the tile shape metadata and emits tile_buf_addr ops to extract UB + pointers. pto.ub.* binary ops are later lowered to llvm.hivm.VADD/VSUB/VMUL/VDIV.* + by the VPTOLLVMEmitter. + + Ops that do not meet the eligibility criteria (wrong arch, non-UB space, + dynamic shapes, unaligned repeats) pass through to the existing ExpandTileOp + TileLang path unchanged. + }]; + let constructor = "mlir::pto::createLowerPTOToUBufOpsPass()"; + let dependentDialects = [ + "mlir::pto::PTODialect", + "mlir::func::FuncDialect", + "mlir::arith::ArithDialect" + ]; +} + def PTOInlineLibCall : Pass<"pto-inline-libcall", "ModuleOp"> { let summary = "Materialize OP-Lib instance bodies and inline OP-Lib calls"; let description = [{ diff --git a/lib/PTO/IR/CMakeLists.txt b/lib/PTO/IR/CMakeLists.txt index 74b9e0bd68..a6f064d709 100644 --- a/lib/PTO/IR/CMakeLists.txt +++ b/lib/PTO/IR/CMakeLists.txt @@ -15,6 +15,7 @@ add_mlir_dialect_library(PTOIR PTO.cpp VPTO.cpp + VPTOUbOps.cpp PTOAttrs.cpp PTOSyncUtils.cpp PTOTypeDefs.cpp diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index 6c30ccca71..e35bc04e22 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -7823,3 +7823,95 @@ void MteL0cUbOp::getEffects( effects.emplace_back(MemoryEffects::Read::get(), &getSourceMutable()); effects.emplace_back(MemoryEffects::Write::get(), &getDestinationMutable()); } + +//===----------------------------------------------------------------------===// +// UBVaddOp +//===----------------------------------------------------------------------===// + +void UBVaddOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVaddOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVsubOp +//===----------------------------------------------------------------------===// + +void UBVsubOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVsubOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVmulOp +//===----------------------------------------------------------------------===// + +void UBVmulOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVmulOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVdivOp +//===----------------------------------------------------------------------===// + +void UBVdivOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVdivOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} diff --git a/lib/PTO/IR/VPTOUbOps.cpp b/lib/PTO/IR/VPTOUbOps.cpp new file mode 100644 index 0000000000..f5f9280f1a --- /dev/null +++ b/lib/PTO/IR/VPTOUbOps.cpp @@ -0,0 +1,66 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +//===- VPTOUbOps.cpp --------------------------------------------------===// + +#include "PTO/IR/PTO.h" + +#include "mlir/Interfaces/SideEffectInterfaces.h" + +using namespace mlir; + +namespace mlir { +namespace pto { + +//===----------------------------------------------------------------------===// +// UBSetMaskOp +//===----------------------------------------------------------------------===// + +void UBSetMaskOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Write::get(), + SideEffects::DefaultResource::get()); +} + +LogicalResult UBSetMaskOp::verify() { + return success(); +} + +//===----------------------------------------------------------------------===// +// UBSetMaskCountOp +//===----------------------------------------------------------------------===// + +void UBSetMaskCountOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Write::get(), + SideEffects::DefaultResource::get()); +} + +LogicalResult UBSetMaskCountOp::verify() { + return success(); +} + +//===----------------------------------------------------------------------===// +// UBSetMaskNormOp +//===----------------------------------------------------------------------===// + +void UBSetMaskNormOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Write::get(), + SideEffects::DefaultResource::get()); +} + +LogicalResult UBSetMaskNormOp::verify() { + return success(); +} + +} // namespace pto +} // namespace mlir diff --git a/lib/PTO/Transforms/CMakeLists.txt b/lib/PTO/Transforms/CMakeLists.txt index a7059674df..b558a00e45 100644 --- a/lib/PTO/Transforms/CMakeLists.txt +++ b/lib/PTO/Transforms/CMakeLists.txt @@ -44,6 +44,7 @@ add_mlir_dialect_library(PTOTransforms PTOValidateIntToPtrUses.cpp ExpandTileOp.cpp FoldTileBufIntrinsics.cpp + LowerPTOToUBufOps.cpp PTOLowerToOpLibCalls.cpp PTOInstantiateAndInlineOpLib.cpp PTOToEmitC.cpp diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp new file mode 100644 index 0000000000..9bc1ef1945 --- /dev/null +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -0,0 +1,1076 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +//===- LowerPTOToUBufOps.cpp - Lower pto.tadd/tsub/tmul/tdiv on a2a3 -----===// +//===----------------------------------------------------------------------===// +// +// Lowers pto.tadd/tsub/tmul/tdiv to pto.ub.vadd/vsub/vmul/vdiv on a3. +// Uses the full CCE dispatch tree from TBinOp.hpp with all modes. +// +//===----------------------------------------------------------------------===// + +#include "PTO/IR/PTO.h" +#include "PTO/Transforms/Passes.h" + +#include "mlir/Dialect/Arith/IR/Arith.h" +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/Dialect/MemRef/IR/MemRef.h" +#include "mlir/Dialect/SCF/IR/SCF.h" +#include "mlir/IR/BuiltinAttributes.h" +#include "mlir/IR/BuiltinTypes.h" +#include "mlir/IR/Matchers.h" +#include "mlir/Pass/Pass.h" + +#include "llvm/ADT/SmallVector.h" + +using namespace mlir; + +namespace mlir { +namespace pto { +#define GEN_PASS_DEF_LOWERPTOTOUBUFOPS +#include "PTO/Transforms/Passes.h.inc" +} // namespace pto +} // namespace mlir + +namespace { + +static constexpr int64_t kRepeatMax = 255; +static constexpr int64_t kRepeatStrideMax = 255; +static constexpr int64_t kSmallRptBinOp = 4; +static constexpr int64_t kDefaultRepeatStride = 8; +static constexpr unsigned kMaskLen = 64; + +//===----------------------------------------------------------------------===// +// Utilities +//===----------------------------------------------------------------------===// + +static unsigned getElementSize(Type elemTy) { + if (elemTy.isF16() || elemTy.isBF16()) + return 2; + if (elemTy.isF32()) + return 4; + if (auto intTy = dyn_cast(elemTy)) { + unsigned width = intTy.getWidth(); + if (width == 16 || width == 32) + return width / 8; + } + return 0; +} + +static Type getStoredElemType(Type ty) { + if (auto tbTy = dyn_cast(ty)) + return tbTy.getElementType(); + if (auto mrTy = dyn_cast(ty)) + return mrTy.getElementType(); + if (auto ptrTy = dyn_cast(ty)) + return ptrTy.getElementType(); + return Type(); +} + +/// Returns true if the type lives in UB (VEC) address space. +static std::optional isUBMemorySpaceImpl(Type ty) { + if (auto tbTy = dyn_cast(ty)) { + auto msAttr = + dyn_cast_or_null(tbTy.getMemorySpace()); + if (!msAttr) + return false; + return msAttr.getAddressSpace() == pto::AddressSpace::VEC; + } + if (auto mrTy = dyn_cast(ty)) { + auto msAttr = + dyn_cast_or_null(mrTy.getMemorySpace()); + if (!msAttr) + return false; + return msAttr.getAddressSpace() == pto::AddressSpace::VEC; + } + if (auto ptrTy = dyn_cast(ty)) + return ptrTy.getMemorySpace().getAddressSpace() == pto::AddressSpace::VEC; + return std::nullopt; +} + +/// Returns true if the given type is confirmed UB memory space. +static bool isUBMemorySpace(Type ty) { + auto result = isUBMemorySpaceImpl(ty); + return result.has_value() && result.value(); +} + +static bool isRowMajor(pto::TileBufType tbTy) { + auto config = tbTy.getConfigAttr(); + if (!config) + return true; + return config.getBLayout().getValue() != pto::BLayout::ColMajor; +} + +static pto::PtrType getUBPtrType(MLIRContext *ctx, Type elemTy) { + auto msAttr = pto::AddressSpaceAttr::get(ctx, pto::AddressSpace::VEC); + return pto::PtrType::get(ctx, elemTy, msAttr); +} + +static std::pair +computeContMaskValues(unsigned nElements) { + int64_t mask0 = (nElements >= kMaskLen) + ? static_cast(0xFFFFFFFFFFFFFFFFULL) + : static_cast((1ULL << nElements) - 1ULL); + int64_t mask1 = (nElements > kMaskLen) + ? static_cast((1ULL << (nElements - kMaskLen)) - 1ULL) + : 0LL; + return {mask0, mask1}; +} + +struct TileShapeInfo { + int64_t vRows; + int64_t vCols; + int64_t cols; + int64_t rows; + unsigned elemSize; + unsigned elementsPerRepeat; + unsigned blockSizeElem; +}; + +static std::optional extractTileShapeInfo( + Operation *op, + const DenseMap> &tileShapes) { + auto opDst = op->getOperand(2); + Type dstTy = opDst.getType(); + if (!isUBMemorySpace(dstTy)) + return std::nullopt; + + Type elemTy; + ArrayRef shape; + ArrayRef validShape; + if (auto tbTy = dyn_cast(dstTy)) { + elemTy = tbTy.getElementType(); + shape = tbTy.getShape(); + validShape = tbTy.getValidShape(); + if (!isRowMajor(tbTy)) + return std::nullopt; + } else if (auto mrTy = dyn_cast(dstTy)) { + elemTy = mrTy.getElementType(); + shape = mrTy.getShape(); + } else if (isa(dstTy)) { + auto it = tileShapes.find(opDst); + if (it == tileShapes.end()) + return std::nullopt; + elemTy = cast(dstTy).getElementType(); + shape = llvm::ArrayRef(it->second); + } else { + return std::nullopt; + } + unsigned elemSize = getElementSize(elemTy); + if (elemSize == 0) + return std::nullopt; + + if (shape.size() < 2) + return std::nullopt; + + int64_t rows = shape[0]; + int64_t cols = shape[1]; + int64_t vRows = (!validShape.empty() && + validShape[0] != ShapedType::kDynamic) + ? validShape[0] : rows; + int64_t vCols = (validShape.size() >= 2 && + validShape[1] != ShapedType::kDynamic) + ? validShape[1] : cols; + if (vRows == ShapedType::kDynamic || vCols == ShapedType::kDynamic || + rows == ShapedType::kDynamic || cols == ShapedType::kDynamic) + return std::nullopt; + + TileShapeInfo info; + info.vRows = vRows; + info.vCols = vCols; + info.cols = cols; + info.rows = rows; + info.elemSize = elemSize; + info.elementsPerRepeat = 256 / elemSize; + info.blockSizeElem = 32 / elemSize; + return info; +} + +static bool canLower(Operation *op, + const DenseMap> &tileShapes) { + return extractTileShapeInfo(op, tileShapes).has_value(); +} + +//===----------------------------------------------------------------------===// +// Pass +//===----------------------------------------------------------------------===// + +struct LowerPTOToUBufOpsPass + : public pto::impl::LowerPTOToUBufOpsBase { + using LowerPTOToUBufOpsBase::LowerPTOToUBufOpsBase; + + void runOnOperation() override { + func::FuncOp func = getOperation(); + if (func.isExternal()) + return; + auto mod = func->getParentOfType(); + if (!mod) + return; + auto archAttr = mod->getAttrOfType("pto.target_arch"); + if (!archAttr || archAttr.getValue() != "a3") + return; + + MLIRContext *ctx = &getContext(); + OpBuilder builder(ctx); + + // A3: sequential memory planning for alloc_tile buffers. Must run first + // so lowering sees PtrType from CastPtrOp instead of tile_buf. + DenseMap> tileShapes; + { + SmallVector allocOps; + func.walk([&](pto::AllocTileOp op) { allocOps.push_back(op); }); + uint64_t offset = 0; + constexpr uint64_t ubBankAlignment = 65536; + for (auto op : allocOps) { + auto tbTy = cast(op.getResult().getType()); + auto shape = tbTy.getShape(); + uint64_t numElems = 1; + for (auto d : shape) + numElems *= d; + uint64_t elemSize = getElementSize(tbTy.getElementType()); + uint64_t totalBytes = numElems * elemSize; + builder.setInsertionPoint(op); + auto addrConst = builder.create( + op.getLoc(), builder.getI64IntegerAttr(offset)); + auto ptrTy = pto::PtrType::get( + ctx, tbTy.getElementType(), + pto::AddressSpaceAttr::get(ctx, pto::AddressSpace::VEC)); + auto pc = builder.create( + op.getLoc(), ptrTy, addrConst.getResult()); + tileShapes[pc.getResult()] = SmallVector(shape); + op.getResult().replaceAllUsesWith(pc.getResult()); + op.erase(); + uint64_t paddedBytes = (totalBytes + ubBankAlignment - 1) / ubBankAlignment * ubBankAlignment; + offset += paddedBytes; + } + } + + // ---- tadd → pto.ub.vadd ---- + { + SmallVector ops; + func.walk([&](pto::TAddOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tsub → pto.ub.vsub ---- + { + SmallVector ops; + func.walk([&](pto::TSubOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tmul → pto.ub.vmul ---- + { + SmallVector ops; + func.walk([&](pto::TMulOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tdiv → pto.ub.vdiv ---- + { + SmallVector ops; + func.walk([&](pto::TDivOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tload → mte_gm_ub ---- + SmallVector tloadOps; + func.walk([&](pto::TLoadOp op) { tloadOps.push_back(op); }); + for (auto op : tloadOps) { + builder.setInsertionPoint(op); + if (succeeded(lowerTLoad(op, builder, tileShapes))) + op.erase(); + } + + // ---- tstore → mte_ub_gm ---- + SmallVector tstoreOps; + func.walk([&](pto::TStoreOp op) { tstoreOps.push_back(op); }); + for (auto op : tstoreOps) { + builder.setInsertionPoint(op); + if (succeeded(lowerTStore(op, builder, tileShapes))) + op.erase(); + } + + // ---- cleanup dead PTO ops ---- + SmallVector toErase; + func.walk([&](Operation *op) { + if (isa(op)) + toErase.push_back(op); + }); + for (auto *op : llvm::reverse(toErase)) { + if (op->use_empty()) + op->erase(); + } + } + +private: + //===--------------------------------------------------------------------===// + // Helpers + //===--------------------------------------------------------------------===// + + Value i64c(int64_t val, Location loc, OpBuilder &b) { + return b.create(loc, b.getI64IntegerAttr(val)); + } + Value idxc(int64_t val, Location loc, OpBuilder &b) { + return b.create( + loc, b.getIntegerAttr(b.getIndexType(), val)) + .getResult(); + } + Value i64c0(Location loc, OpBuilder &b) { return i64c(0, loc, b); } + Value i64c1(Location loc, OpBuilder &b) { return i64c(1, loc, b); } + Value i64cM1(Location loc, OpBuilder &b) { return i64c(-1, loc, b); } + Value i64c8(Location loc, OpBuilder &b) { return i64c(kDefaultRepeatStride, loc, b); } + Value idxc0(Location loc, OpBuilder &b) { return idxc(0, loc, b); } + Value idxc1(Location loc, OpBuilder &b) { return idxc(1, loc, b); } + + template + void emitUBBinOp(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + Value repeat, Value repStride) { + b.create(loc, dst, s0, s1, repeat, + i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), + repStride, repStride, i64c0(loc, b)); + } + + void vadd(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + Value repeat, Value repStride) { + emitUBBinOp(loc, b, dst, s0, s1, repeat, repStride); + } + void vsub(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + Value repeat, Value repStride) { + emitUBBinOp(loc, b, dst, s0, s1, repeat, repStride); + } + void vmul(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + Value repeat, Value repStride) { + emitUBBinOp(loc, b, dst, s0, s1, repeat, repStride); + } + void vdiv(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + Value repeat, Value repStride) { + emitUBBinOp(loc, b, dst, s0, s1, repeat, repStride); + } + + std::tuple + lowerBinaryOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, + Value dstVal, Value src0Val, Value src1Val, + const DenseMap> &tileShapes) { + Location loc = op->getLoc(); + builder.setInsertionPoint(op); + Type elemTy = getStoredElemType(dstVal.getType()); + auto ptrType = getUBPtrType(ctx, elemTy); + + auto emitAddr = [&](Value tile) -> Value { + if (isa(tile.getType())) + return tile; + auto addrOp = builder.create(loc, ptrType, tile); + return addrOp.getDst(); + }; + + Value dstPtr = emitAddr(dstVal); + Value src0Ptr = emitAddr(src0Val); + Value src1Ptr = emitAddr(src1Val); + return {dstPtr, src0Ptr, src1Ptr, ptrType}; + } + + template + void modeNorm1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; + int64_t totalV = info.vRows * info.vCols; + int64_t headRepeats = totalV / epr; + int64_t tailElements = totalV % epr; + + if (headRepeats > 1) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(headRepeats, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, s0, ptrTy, off); + Value r1 = addPtr(loc, b, s1, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, rd, r0, r1, i64c1(loc, b), i64c8(loc, b)); + b.create(loc); + b.setInsertionPointAfter(forOp); + if (tailElements > 0) { + Value offT = idxc(headRepeats * epr, loc, b); + Value td = addPtr(loc, b, dst, ptrTy, offT); + Value ts0 = addPtr(loc, b, s0, ptrTy, offT); + Value ts1 = addPtr(loc, b, s1, ptrTy, offT); + b.create(loc); + b.create(loc, i64c(tailElements, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, td, ts0, ts1, i64c1(loc, b), i64c8(loc, b)); + b.create(loc); + } + return; + } + + b.create(loc); + b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, dst, s0, s1, i64c1(loc, b), i64c8(loc, b)); + b.create(loc); + fullMask(loc, b); + } + + void setMask(Location loc, OpBuilder &b, unsigned n) { + auto [m0, m1] = computeContMaskValues(n); + b.create(loc, i64c(m0, loc, b), i64c(m1, loc, b)); + } + + void fullMask(Location loc, OpBuilder &b) { + b.create(loc, i64cM1(loc, b), i64c0(loc, b)); + } + + Value addPtr(Location loc, OpBuilder &b, Value base, pto::PtrType ptrTy, + Value off) { + return b.create(loc, ptrTy, base, off); + } + + //===--------------------------------------------------------------------===// + // tload → mte_gm_ub / tstore → mte_ub_gm + //===--------------------------------------------------------------------===// + + struct DmaViewInfo { + Value gmPtr; + SmallVector sizes; + SmallVector strides; + SmallVector offsets; + }; + + static FailureOr extractDmaViewInfo(pto::TLoadOp op) { + auto pvOp = op.getSrc().getDefiningOp(); + if (!pvOp) + return failure(); + auto mtvOp = pvOp.getSource().getDefiningOp(); + if (!mtvOp) + return failure(); + DmaViewInfo info; + info.gmPtr = mtvOp.getPtr(); + info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); + info.strides.assign(mtvOp.getStrides().begin(), + mtvOp.getStrides().end()); + info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); + return info; + } + + Value computeGMByteOffset(Location loc, OpBuilder &b, + const DmaViewInfo &viewInfo, unsigned elemSize) { + Value totalOff = idxc0(loc, b); + for (size_t i = 0; i < viewInfo.offsets.size() && + i < viewInfo.strides.size(); ++i) { + APInt constOff; + if (matchPattern(viewInfo.offsets[i], m_ConstantInt(&constOff)) && + constOff.isZero()) + continue; + Value dimOff = b.create(loc, viewInfo.offsets[i], + viewInfo.strides[i]).getResult(); + totalOff = b.create(loc, totalOff, dimOff).getResult(); + } + if (elemSize > 1) + totalOff = b.create(loc, totalOff, + idxc(elemSize, loc, b)).getResult(); + return totalOff; + } + + Value offsetGMPtrByBytes(Location loc, OpBuilder &b, Value gmPtr, + Value byteOff) { + APInt constOff; + if (matchPattern(byteOff, m_ConstantInt(&constOff)) && constOff.isZero()) + return gmPtr; + auto origPtrTy = cast(gmPtr.getType()); + auto bytePtrTy = pto::PtrType::get(b.getContext(), b.getI8Type(), + origPtrTy.getMemorySpace()); + Value bytePtr = b.create(loc, bytePtrTy, gmPtr); + Value offIdx = byteOff; + if (!offIdx.getType().isIndex()) + offIdx = b.create(loc, b.getIndexType(), byteOff) + .getResult(); + Value offsetBytePtr = + b.create(loc, bytePtrTy, bytePtr, offIdx); + return b.create(loc, origPtrTy, offsetBytePtr); + } + + Value i64Cast(Location loc, OpBuilder &b, Value indexVal) { + return b.create(loc, b.getI64Type(), indexVal) + .getResult(); + } + + LogicalResult emitMteGmUb(Location loc, OpBuilder &b, Value gmPtr, + Value ubPtr, const DmaViewInfo &viewInfo, + Type elemTy, ArrayRef tileShape) { + if (tileShape.size() < 2) return failure(); + int64_t ubCols = tileShape[1]; + unsigned elemSize = getElementSize(elemTy); + unsigned nd = viewInfo.sizes.size(); + if (nd < 2) return failure(); + + Value nburstCount = viewInfo.sizes[nd - 2]; + Value lenBurstElts = viewInfo.sizes[nd - 1]; + Value lenBurst = b.create(loc, + b.create(loc, b.getI64Type(), lenBurstElts) + .getResult(), i64c(elemSize, loc, b)).getResult(); + Value nburstSrcStride = b.create(loc, + b.create(loc, b.getI64Type(), + viewInfo.strides[nd - 2]).getResult(), + i64c(elemSize, loc, b)).getResult(); + Value ubRowStride = b.create(loc, i64c(ubCols, loc, b), + i64c(elemSize, loc, b)).getResult(); + pto::DmaLoopConfig nburst{i64Cast(loc, b, nburstCount), + nburstSrcStride, ubRowStride}; + + SmallVector loops; + for (int i = nd - 3; i >= 0; --i) { + Value count = b.create(loc, b.getI64Type(), + viewInfo.sizes[i]).getResult(); + Value srcStride = b.create(loc, + b.create(loc, b.getI64Type(), + viewInfo.strides[i]).getResult(), + i64c(elemSize, loc, b)).getResult(); + Value innerElems = i64c1(loc, b); + for (int j = i + 1; j < (int)nd; ++j) { + Value dimSize = b.create(loc, b.getI64Type(), + viewInfo.sizes[j]).getResult(); + innerElems = b.create(loc, innerElems, dimSize).getResult(); + } + Value dstStride = b.create(loc, innerElems, + i64c(elemSize, loc, b)).getResult(); + loops.push_back({count, srcStride, dstStride}); + } + b.create(loc, gmPtr, ubPtr, i64c0(loc, b), lenBurst, + nburst, llvm::ArrayRef(loops), std::nullopt); + return success(); + } + + LogicalResult emitMteUbGm(Location loc, OpBuilder &b, Value ubPtr, + Value gmPtr, const DmaViewInfo &viewInfo, + Type elemTy, ArrayRef tileShape) { + if (tileShape.size() < 2) return failure(); + int64_t ubCols = tileShape[1]; + unsigned elemSize = getElementSize(elemTy); + unsigned nd = viewInfo.sizes.size(); + if (nd < 2) return failure(); + + Value nburstCount = viewInfo.sizes[nd - 2]; + Value lenBurstElts = viewInfo.sizes[nd - 1]; + Value lenBurst = b.create(loc, + b.create(loc, b.getI64Type(), lenBurstElts) + .getResult(), i64c(elemSize, loc, b)).getResult(); + Value nburstSrcStride = b.create(loc, + i64c(ubCols, loc, b), i64c(elemSize, loc, b)).getResult(); + Value nburstDstStride = b.create(loc, + b.create(loc, b.getI64Type(), + viewInfo.strides[nd - 2]).getResult(), + i64c(elemSize, loc, b)).getResult(); + pto::DmaLoopConfig nburst{i64Cast(loc, b, nburstCount), + nburstSrcStride, nburstDstStride}; + + SmallVector loops; + for (int i = nd - 3; i >= 0; --i) { + Value count = b.create(loc, b.getI64Type(), + viewInfo.sizes[i]).getResult(); + Value innerElems = i64c1(loc, b); + for (int j = i + 1; j < (int)nd; ++j) { + Value dimSize = b.create(loc, b.getI64Type(), + viewInfo.sizes[j]).getResult(); + innerElems = b.create(loc, innerElems, dimSize).getResult(); + } + Value srcStride = b.create(loc, innerElems, + i64c(elemSize, loc, b)).getResult(); + Value dstStride = b.create(loc, + b.create(loc, b.getI64Type(), + viewInfo.strides[i]).getResult(), + i64c(elemSize, loc, b)).getResult(); + loops.push_back({count, srcStride, dstStride}); + } + b.create(loc, ubPtr, gmPtr, lenBurst, nburst, + llvm::ArrayRef(loops)); + return success(); + } + + LogicalResult lowerTLoad(pto::TLoadOp op, OpBuilder &b, + const DenseMap> &tileShapes) { + Location loc = op.getLoc(); + auto viewInfo = extractDmaViewInfo(op); + if (failed(viewInfo)) return failure(); + Type dstType = op.getDst().getType(); + if (!isUBMemorySpace(dstType)) return failure(); + Type elemTy = getStoredElemType(dstType); + if (!elemTy) return failure(); + unsigned elemSize = getElementSize(elemTy); + if (elemSize == 0) return failure(); + + auto it = tileShapes.find(op.getDst()); + if (it == tileShapes.end()) return failure(); + + Value byteOff = computeGMByteOffset(loc, b, *viewInfo, elemSize); + Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo->gmPtr, byteOff); + return emitMteGmUb(loc, b, gmPtr, op.getDst(), *viewInfo, elemTy, + llvm::ArrayRef(it->second)); + } + + LogicalResult lowerTStore(pto::TStoreOp op, OpBuilder &b, + const DenseMap> &tileShapes) { + Location loc = op.getLoc(); + Type srcType = op.getSrc().getType(); + if (!isUBMemorySpace(srcType)) return failure(); + Type elemTy = getStoredElemType(srcType); + if (!elemTy) return failure(); + unsigned elemSize = getElementSize(elemTy); + if (elemSize == 0) return failure(); + + auto it = tileShapes.find(op.getSrc()); + if (it == tileShapes.end()) return failure(); + + auto pvOp = op.getDst().getDefiningOp(); + if (!pvOp) return failure(); + auto mtvOp = pvOp.getSource().getDefiningOp(); + if (!mtvOp) return failure(); + + DmaViewInfo viewInfo; + viewInfo.gmPtr = mtvOp.getPtr(); + viewInfo.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); + viewInfo.strides.assign(mtvOp.getStrides().begin(), mtvOp.getStrides().end()); + viewInfo.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); + + Value byteOff = computeGMByteOffset(loc, b, viewInfo, elemSize); + Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo.gmPtr, byteOff); + return emitMteUbGm(loc, b, op.getSrc(), gmPtr, viewInfo, elemTy, + llvm::ArrayRef(it->second)); + } + + //===--------------------------------------------------------------------===// + // CCE dispatch tree — mirrors TBinOp.hpp BinaryInstr + //===--------------------------------------------------------------------===// + + template + void dispatch(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; + int64_t cols = info.cols; + int64_t rows = info.rows; + int64_t vRows = info.vRows; + int64_t vCols = info.vCols; + + // 1. Small tile + if (rows <= kRepeatMax && cols < static_cast(epr)) { + modeSmall(loc, b, dst, s0, s1, ptrTy, info); + return; + } + + // 2. Continuous at compile time + if (vCols == cols || vRows == 1) { + int64_t totalV = vRows * vCols; + int64_t totalRpts = (totalV + epr - 1) / epr; + bool nonVLAligned = + (vCols > static_cast(epr)) && ((vCols % epr) != 0); + + if (nonVLAligned || totalRpts > kRepeatMax) + modeCount1L(loc, b, dst, s0, s1, ptrTy, info); + else + modeNorm1L(loc, b, dst, s0, s1, ptrTy, info); + return; + } + + // 3. Non-continuous + int64_t normColRepeat = cols / epr; + if (normColRepeat > 1 && vRows * normColRepeat < kSmallRptBinOp) { + modeCount2L(loc, b, dst, s0, s1, ptrTy, info); + } else if (vRows < normColRepeat + 1) { + if (vCols % epr > 0) + modeCount2L(loc, b, dst, s0, s1, ptrTy, info); + else + modeColVLAlign(loc, b, dst, s0, s1, ptrTy, info); + } else { + modeRowRpt(loc, b, dst, s0, s1, ptrTy, info); + } + } + + //===--------------------------------------------------------------------===// + // Bin1LNormModeSmall + //===--------------------------------------------------------------------===// + + template + void modeSmall(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t rs = info.cols / static_cast(info.blockSizeElem); + + if (info.vRows > 1) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(info.cols, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, s0, ptrTy, off); + Value r1 = addPtr(loc, b, s1, ptrTy, off); + b.create(loc); + b.create(loc, i64c(info.vCols, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, rd, r0, r1, i64c1(loc, b), i64c(rs, loc, b)); + b.create(loc); + b.setInsertionPointAfter(forOp); + return; + } + + b.create(loc); + b.create(loc, i64c(info.vCols, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, dst, s0, s1, i64c1(loc, b), i64c(rs, loc, b)); + b.create(loc); + fullMask(loc, b); + } + + //===--------------------------------------------------------------------===// + // Bin1LCountMode + //===--------------------------------------------------------------------===// + + template + void modeCount1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t totalV = info.vRows * info.vCols; + b.create(loc); + b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, dst, s0, s1, i64c0(loc, b), i64c8(loc, b)); + b.create(loc); + fullMask(loc, b); + } + + //===--------------------------------------------------------------------===// + // Bin2LNormModeColVLAlign + //===--------------------------------------------------------------------===// + + template + void modeColVLAlign(Location loc, OpBuilder &b, Value dst, Value s0, + Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; + int64_t headRepeats = info.vCols / epr; + int64_t rowStride = info.cols; + + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(rowStride, loc, b)) + .getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value rs0 = addPtr(loc, b, s0, ptrTy, off); + Value rs1 = addPtr(loc, b, s1, ptrTy, off); + emitUBBinOp(loc, b, rd, rs0, rs1, i64c(headRepeats, loc, b), i64c8(loc, b)); + b.setInsertionPointAfter(forOp); + } + + //===--------------------------------------------------------------------===// + // Bin2LCountMode – row-by-row count mode + //===--------------------------------------------------------------------===// + + template + void modeCount2L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t rowStride = info.cols; + b.create(loc); + b.create(loc, i64c(info.vCols, loc, b), + i64c0(loc, b)); + + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(rowStride, loc, b)) + .getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value rs0 = addPtr(loc, b, s0, ptrTy, off); + Value rs1 = addPtr(loc, b, s1, ptrTy, off); + emitUBBinOp(loc, b, rd, rs0, rs1, i64c0(loc, b), i64c8(loc, b)); + b.setInsertionPointAfter(forOp); + + b.create(loc); + fullMask(loc, b); + } + + //===--------------------------------------------------------------------===// + // Bin2LNormModeRowRpt + //===--------------------------------------------------------------------===// + + template + void modeRowRpt(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t be = info.blockSizeElem; + int64_t rowStride = info.cols; + int64_t rs = rowStride / be; + bool condRowRpt = (info.vRows <= kRepeatMax) && (rs <= kRepeatStrideMax); + + if (condRowRpt) + rowRptFast(loc, b, dst, s0, s1, ptrTy, info, rs); + else + rowRptChunked(loc, b, dst, s0, s1, ptrTy, info, rowStride, rs); + } + + template + void rowRptFast(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info, int64_t rs) { + int64_t epr = info.elementsPerRepeat; + int64_t numLoop = info.vCols / epr; + int64_t tailElements = info.vCols % epr; + + for (int64_t i = 0; i < numLoop; i++) { + Value rd = addPtr(loc, b, dst, ptrTy, idxc(i * epr, loc, b)); + Value r0 = addPtr(loc, b, s0, ptrTy, idxc(i * epr, loc, b)); + Value r1 = addPtr(loc, b, s1, ptrTy, idxc(i * epr, loc, b)); + emitUBBinOp(loc, b, rd, r0, r1, i64c(info.vRows, loc, b), i64c(rs, loc, b)); + } + + if (tailElements > 0) { + Value off = idxc(numLoop * epr, loc, b); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, s0, ptrTy, off); + Value r1 = addPtr(loc, b, s1, ptrTy, off); + setMask(loc, b, tailElements); + emitUBBinOp(loc, b, rd, r0, r1, i64c(info.vRows, loc, b), i64c(rs, loc, b)); + fullMask(loc, b); + } + } + + template + void rowRptChunked(Location loc, OpBuilder &b, Value dst, Value s0, + Value s1, pto::PtrType ptrTy, const TileShapeInfo &info, + int64_t rowStride, int64_t rs) { + int64_t epr = info.elementsPerRepeat; + int64_t rptPerLine = info.vCols / epr; + int64_t remainElem = info.vCols % epr; + + if (info.vRows > static_cast(epr)) { + if (rptPerLine > 0) + headRows(loc, b, dst, s0, s1, ptrTy, info, rowStride, rptPerLine); + if (remainElem > 0) { + Value off = idxc(rptPerLine * epr, loc, b); + tailRows(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), + addPtr(loc, b, s1, ptrTy, off), ptrTy, info, rowStride, rs, + remainElem); + } + } else { + if (remainElem == 0) { + headRows(loc, b, dst, s0, s1, ptrTy, info, rowStride, + info.vCols / epr); + } else if (rptPerLine > 0) { + headRows(loc, b, dst, s0, s1, ptrTy, info, rowStride, rptPerLine); + Value off = idxc(rptPerLine * epr, loc, b); + tailRows(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), + addPtr(loc, b, s1, ptrTy, off), ptrTy, info, rowStride, rs, + remainElem); + } else { + tailRows(loc, b, dst, s0, s1, ptrTy, info, rowStride, rs, remainElem); + } + } + } + + //===--------------------------------------------------------------------===// + // Bin2LNormModeHead – chunked per-row head + //===--------------------------------------------------------------------===// + + template + void headRows(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info, + int64_t rowStride, int64_t rptPerLine) { + int64_t epr = info.elementsPerRepeat; + int64_t numLoop = rptPerLine / kRepeatMax; + int64_t remain = rptPerLine % kRepeatMax; + int64_t chunkElems = kRepeatMax * epr; + + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), + idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value rowBase = + b.create(loc, iv, idxc(rowStride, loc, b)).getResult(); + + if (numLoop > 0) { + auto inner = b.create(loc, idxc0(loc, b), + idxc(numLoop, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(inner.getBody()); + Value jv = inner.getInductionVar(); + Value co = b.create(loc, jv, idxc(chunkElems, loc, b)) + .getResult(); + Value off = b.create(loc, rowBase, co).getResult(); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c(kRepeatMax, loc, b), i64c8(loc, b)); + b.setInsertionPointAfter(inner); + } + + if (remain > 0) { + Value co = idxc(numLoop * chunkElems, loc, b); + Value off = b.create(loc, rowBase, co).getResult(); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c(remain, loc, b), i64c8(loc, b)); + } + b.setInsertionPointAfter(forOp); + } + + //===--------------------------------------------------------------------===// + // Bin2LNormModeTail – masked per-row tail + //===--------------------------------------------------------------------===// + + template + void tailRows(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, + pto::PtrType ptrTy, const TileShapeInfo &info, + int64_t rowStride, int64_t rs, unsigned remainPerLine) { + bool strideOver = + (rowStride / info.blockSizeElem > kRepeatStrideMax); + setMask(loc, b, remainPerLine); + + int64_t numLoop = 0; + int64_t remainAfterLoop = info.vRows; + if (info.vRows > kRepeatMax) { + numLoop = info.vRows / kRepeatMax; + remainAfterLoop = info.vRows % kRepeatMax; + + auto forOp = b.create(loc, idxc0(loc, b), + idxc(numLoop, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + if (strideOver) + tailStrideOverChunk(loc, b, iv, dst, s0, s1, ptrTy, rowStride); + else + tailStrideOkChunk(loc, b, iv, dst, s0, s1, ptrTy, rowStride, rs); + b.setInsertionPointAfter(forOp); + } + + if (remainAfterLoop > 0) { + if (strideOver) + tailStrideOverRemain(loc, b, dst, s0, s1, ptrTy, rowStride, numLoop, + remainAfterLoop); + else + tailStrideOkRemain(loc, b, dst, s0, s1, ptrTy, rowStride, rs, numLoop, + remainAfterLoop); + } + + fullMask(loc, b); + } + + template + void tailStrideOverChunk(Location loc, OpBuilder &b, Value iv, Value dst, + Value s0, Value s1, pto::PtrType ptrTy, + int64_t rowStride) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(kRepeatMax, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value jv = forOp.getInductionVar(); + Value baseOff = b.create( + loc, iv, idxc(kRepeatMax * rowStride, loc, b)).getResult(); + Value rowOff = + b.create(loc, jv, idxc(rowStride, loc, b)).getResult(); + Value off = b.create(loc, baseOff, rowOff).getResult(); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c1(loc, b), i64c1(loc, b)); + b.setInsertionPointAfter(forOp); + } + + template + void tailStrideOkChunk(Location loc, OpBuilder &b, Value iv, Value dst, + Value s0, Value s1, pto::PtrType ptrTy, + int64_t rowStride, int64_t rs) { + Value off = b.create( + loc, iv, idxc(kRepeatMax * rowStride, loc, b)).getResult(); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c(kRepeatMax, loc, b), i64c(rs, loc, b)); + } + + template + void tailStrideOverRemain(Location loc, OpBuilder &b, Value dst, Value s0, + Value s1, pto::PtrType ptrTy, int64_t rowStride, + int64_t numLoop, int64_t remain) { + auto forOp = b.create(loc, idxc0(loc, b), idxc(remain, loc, b), + idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value jv = forOp.getInductionVar(); + Value baseOff = idxc(numLoop * kRepeatMax * rowStride, loc, b); + Value rowOff = + b.create(loc, jv, idxc(rowStride, loc, b)).getResult(); + Value off = b.create(loc, baseOff, rowOff).getResult(); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c1(loc, b), i64c1(loc, b)); + b.setInsertionPointAfter(forOp); + } + + template + void tailStrideOkRemain(Location loc, OpBuilder &b, Value dst, Value s0, + Value s1, pto::PtrType ptrTy, int64_t rowStride, + int64_t rs, int64_t numLoop, int64_t remain) { + Value off = idxc(numLoop * kRepeatMax * rowStride, loc, b); + emitUBBinOp(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, s0, ptrTy, off), addPtr(loc, b, s1, ptrTy, off), + i64c(remain, loc, b), i64c(rs, loc, b)); + } +}; + +} // namespace + +namespace mlir { +namespace pto { +std::unique_ptr createLowerPTOToUBufOpsPass() { + return std::make_unique(); +} +} // namespace pto +} // namespace mlir diff --git a/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp b/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp index 60f4d18ce7..9d04ae0b5d 100644 --- a/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp +++ b/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp @@ -14,6 +14,7 @@ #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/Dialect/SCF/IR/SCF.h" +#include "mlir/IR/BuiltinAttributes.h" #include "mlir/IR/Matchers.h" #include "mlir/IR/PatternMatch.h" #include "mlir/Pass/Pass.h" @@ -32,6 +33,17 @@ using namespace mlir; namespace { +enum class DmaArch { A2A3, A5 }; + +static DmaArch getDmaArch(ModuleOp mod) { + if (!mod) + return DmaArch::A2A3; + auto arch = mod->getAttrOfType("pto.target_arch"); + if (arch && arch.getValue() == "a5") + return DmaArch::A5; + return DmaArch::A2A3; +} + static pto::AddressSpaceAttr getPointerMemorySpace(Attribute memorySpace, MLIRContext *ctx) { if (auto addrSpace = dyn_cast_or_null(memorySpace)) @@ -771,7 +783,7 @@ static FailureOr deriveLoadCbufToCbControl(Location loc, Value k, Value n, Type elementType, Value mStart, Value kStart, bool transpose, PatternRewriter &rewriter) { - unsigned elemBitWidth = pto::getPTOStorageElemBitWidth(elementType); + unsigned elemBitWidth = elementType.getIntOrFloatBitWidth(); if (elemBitWidth == 0 || (elemBitWidth % 8) != 0) return failure(); uint64_t elemBytes = elemBitWidth / 8; @@ -824,7 +836,7 @@ static FailureOr deriveLoadCbufToCaControl(Location loc, Value m, Value k, Type elementType, Value mStart, Value kStart, bool transpose, PatternRewriter &rewriter) { - unsigned elemBitWidth = pto::getPTOStorageElemBitWidth(elementType); + unsigned elemBitWidth = elementType.getIntOrFloatBitWidth(); if (elemBitWidth == 0 || (elemBitWidth % 8) != 0) return failure(); uint64_t elemBytes = elemBitWidth / 8; @@ -1096,7 +1108,9 @@ class ExpandMadSemanticPattern final : public OpRewritePattern { }; struct ExpandDmaLoadPattern : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; + DmaArch dmaArch; + explicit ExpandDmaLoadPattern(MLIRContext *ctx, DmaArch arch) + : OpRewritePattern(ctx), dmaArch(arch) {} LogicalResult matchAndRewrite(pto::MteGmUbOp op, PatternRewriter &rewriter) const override { @@ -1106,24 +1120,38 @@ struct ExpandDmaLoadPattern : public OpRewritePattern { SmallVector loops = collectLoopConfigs(op.getLoopCounts(), op.getLoopSrcStrides(), op.getLoopDstStrides()); - ArrayRef hwLoops = ArrayRef(loops).take_front(2); - ArrayRef swLoops = ArrayRef(loops).drop_front(hwLoops.size()); + SmallVector allLoops; + ArrayRef hwLoops; + ArrayRef swLoops; Value loop1Count; Value loop2Size = one; - if (hwLoops.size() == 2) { - rewriter.create( - loc, hwLoops[0].srcStride, hwLoops[0].dstStride); - loop2Size = hwLoops[0].count; - loop1Count = hwLoops[1].count; - rewriter.create( - loc, hwLoops[1].srcStride, hwLoops[1].dstStride); - rewriter.create(loc, loop2Size, loop1Count); - } else if (hwLoops.size() == 1) { - loop1Count = hwLoops[0].count; - rewriter.create( - loc, hwLoops[0].srcStride, hwLoops[0].dstStride); - rewriter.create(loc, loop2Size, loop1Count); + + if (dmaArch == DmaArch::A5) { + hwLoops = ArrayRef(loops).take_front(2); + swLoops = ArrayRef(loops).drop_front(hwLoops.size()); + if (hwLoops.size() == 2) { + rewriter.create( + loc, hwLoops[0].srcStride, hwLoops[0].dstStride); + loop2Size = hwLoops[0].count; + loop1Count = hwLoops[1].count; + rewriter.create( + loc, hwLoops[1].srcStride, hwLoops[1].dstStride); + rewriter.create(loc, loop2Size, loop1Count); + } else if (hwLoops.size() == 1) { + loop1Count = hwLoops[0].count; + rewriter.create( + loc, hwLoops[0].srcStride, hwLoops[0].dstStride); + rewriter.create(loc, loop2Size, loop1Count); + } + } else { + allLoops.append(loops); + pto::DmaLoopConfig nburstCfg; + nburstCfg.count = op.getNBurst(); + nburstCfg.srcStride = op.getNburstSrcStride(); + nburstCfg.dstStride = op.getNburstDstStride(); + allLoops.push_back(nburstCfg); + swLoops = ArrayRef(allLoops); } Value leftPadding = op.getLeftPaddingCount(); @@ -1136,21 +1164,27 @@ struct ExpandDmaLoadPattern : public OpRewritePattern { loc, rewriter.getI1Type(), rewriter.getBoolAttr(static_cast(op.getPadValue()))); + bool hasPad = static_cast(op.getPadValue()); if (Value padValue = op.getPadValue()) rewriter.create(loc, padValue); + Value effectiveNBurst = (dmaArch == DmaArch::A5) ? op.getNBurst() : one; + buildSoftwareLoopNest( rewriter, loc, swLoops, zero, zero, [&](Value srcOffset, Value dstOffset) { Value source = offsetPointerByBytes(op.getSource(), srcOffset, rewriter, loc); Value destination = offsetPointerByBytes(op.getDestination(), dstOffset, rewriter, loc); - rewriter.create( - loc, source, destination, zero, op.getNBurst(), op.getLenBurst(), + auto copyOp = rewriter.create( + loc, source, destination, zero, effectiveNBurst, op.getLenBurst(), leftPadding, rightPadding, dataSelect, op.getL2CacheCtl(), op.getNburstSrcStride(), op.getNburstDstStride()); + if (hasPad) + copyOp->setAttr("has_pad", UnitAttr::get(copyOp->getContext())); }); - if (shouldRestoreDmaLoopSize(loop1Count, loop2Size)) + if (dmaArch == DmaArch::A5 && + shouldRestoreDmaLoopSize(loop1Count, loop2Size)) rewriter.create(loc, one, one); rewriter.eraseOp(op); return success(); @@ -1158,7 +1192,9 @@ struct ExpandDmaLoadPattern : public OpRewritePattern { }; struct ExpandDmaStorePattern : public OpRewritePattern { - using OpRewritePattern::OpRewritePattern; + DmaArch dmaArch; + explicit ExpandDmaStorePattern(MLIRContext *ctx, DmaArch arch) + : OpRewritePattern(ctx), dmaArch(arch) {} LogicalResult matchAndRewrite(pto::MteUbGmOp op, PatternRewriter &rewriter) const override { @@ -1168,28 +1204,43 @@ struct ExpandDmaStorePattern : public OpRewritePattern { SmallVector loops = collectLoopConfigs(op.getLoopCounts(), op.getLoopSrcStrides(), op.getLoopDstStrides()); - ArrayRef hwLoops = - ArrayRef(loops).take_front(2); - ArrayRef swLoops = - ArrayRef(loops).drop_front(hwLoops.size()); + SmallVector allLoops; + ArrayRef hwLoops; + ArrayRef swLoops; Value loop1Count; Value loop2Size = one; - if (hwLoops.size() == 2) { - rewriter.create( - loc, hwLoops[0].srcStride, hwLoops[0].dstStride); - loop2Size = hwLoops[0].count; - loop1Count = hwLoops[1].count; - rewriter.create( - loc, hwLoops[1].srcStride, hwLoops[1].dstStride); - rewriter.create(loc, loop2Size, loop1Count); - } else if (hwLoops.size() == 1) { - loop1Count = hwLoops[0].count; - rewriter.create( - loc, hwLoops[0].srcStride, hwLoops[0].dstStride); - rewriter.create(loc, loop2Size, loop1Count); + + if (dmaArch == DmaArch::A5) { + hwLoops = ArrayRef(loops).take_front(2); + swLoops = + ArrayRef(loops).drop_front(hwLoops.size()); + if (hwLoops.size() == 2) { + rewriter.create( + loc, hwLoops[0].srcStride, hwLoops[0].dstStride); + loop2Size = hwLoops[0].count; + loop1Count = hwLoops[1].count; + rewriter.create( + loc, hwLoops[1].srcStride, hwLoops[1].dstStride); + rewriter.create(loc, loop2Size, loop1Count); + } else if (hwLoops.size() == 1) { + loop1Count = hwLoops[0].count; + rewriter.create( + loc, hwLoops[0].srcStride, hwLoops[0].dstStride); + rewriter.create(loc, loop2Size, loop1Count); + } + } else { + allLoops.append(loops); + pto::DmaLoopConfig nburstCfg; + nburstCfg.count = op.getNBurst(); + nburstCfg.srcStride = op.getNburstSrcStride(); + nburstCfg.dstStride = op.getNburstDstStride(); + allLoops.push_back(nburstCfg); + swLoops = ArrayRef(allLoops); } + Value effectiveNBurst = (dmaArch == DmaArch::A5) ? op.getNBurst() : one; + buildSoftwareLoopNest( rewriter, loc, swLoops, zero, zero, [&](Value srcOffset, Value dstOffset) { @@ -1197,10 +1248,11 @@ struct ExpandDmaStorePattern : public OpRewritePattern { Value destination = offsetPointerByBytes(op.getDestination(), dstOffset, rewriter, loc); rewriter.create( - loc, source, destination, zero, op.getNBurst(), op.getLenBurst(), + loc, source, destination, zero, effectiveNBurst, op.getLenBurst(), zero, op.getNburstDstStride(), op.getNburstSrcStride()); }); - if (shouldRestoreDmaLoopSize(loop1Count, loop2Size)) + if (dmaArch == DmaArch::A5 && + shouldRestoreDmaLoopSize(loop1Count, loop2Size)) rewriter.create(loc, one, one); rewriter.eraseOp(op); return success(); @@ -1868,8 +1920,12 @@ struct VPTOExpandWrapperOpsPass if (func.isExternal()) return; + DmaArch dmaArch = getDmaArch(func->getParentOfType()); + RewritePatternSet patterns(&getContext()); - patterns.add(&getContext(), dmaArch)); + patterns.add(std::make_unique(&getContext(), dmaArch)); + patterns.add +packCopyGmToUbCfgV220(Operation *anchor, ValueRange operands) { + OpBuilder builder(anchor); + builder.setInsertionPoint(anchor); + Location loc = anchor->getLoc(); + + auto getI64Operand = [&](unsigned idx) -> Value { + return castIntegerLikeTo(anchor, operands[idx], builder.getI64Type()); + }; + + Value sid = getI64Operand(2); + Value lenBurst = getI64Operand(4); + if (!sid || !lenBurst) + return failure(); + + auto shl = [&](Value value, uint64_t amount) -> Value { + return builder.create(loc, value, + getI64Constant(builder, loc, amount)); + }; + auto bitOr = [&](Value lhs, Value rhs) -> Value { + return builder.create(loc, lhs, rhs); + }; + + Value cfg = sid; + auto oneI64 = builder + .create(loc, + builder.getI64IntegerAttr(1)) + .getResult(); + cfg = bitOr(cfg, shl(oneI64, 4)); + auto bytesPer32B = builder + .create( + loc, builder.getI64IntegerAttr(5)) + .getResult(); + auto lenIn32B = + builder.create(loc, lenBurst, bytesPer32B).getResult(); + cfg = bitOr(cfg, shl(lenIn32B, 16)); + return cfg; +} + [[maybe_unused]] static FailureOr packCopyGmToUbConfig0(Operation *anchor, Value sid, Value nBurst, Value lenBurst, Value leftPadding, Value rightPadding, @@ -1558,6 +1598,48 @@ packCopyUbToGmConfig1(Operation *anchor, ValueRange operands) { return packLoopPair(anchor, operands[6], operands[7]); } +static FailureOr +packCopyUbToGmCfgV220(Operation *anchor, ValueRange operands) { + if (operands.size() != 8) + return failure(); + + OpBuilder builder(anchor); + builder.setInsertionPoint(anchor); + Location loc = anchor->getLoc(); + + auto getI64Operand = [&](unsigned idx) -> Value { + return castIntegerLikeTo(anchor, operands[idx], builder.getI64Type()); + }; + + Value sid = getI64Operand(2); + Value lenBurst = getI64Operand(4); + if (!sid || !lenBurst) + return failure(); + + auto shl = [&](Value value, uint64_t amount) -> Value { + return builder.create(loc, value, + getI64Constant(builder, loc, amount)); + }; + auto bitOr = [&](Value lhs, Value rhs) -> Value { + return builder.create(loc, lhs, rhs); + }; + + Value cfg = sid; + auto oneI64 = builder + .create(loc, + builder.getI64IntegerAttr(1)) + .getResult(); + cfg = bitOr(cfg, shl(oneI64, 4)); + auto bytesPer32B = builder + .create( + loc, builder.getI64IntegerAttr(5)) + .getResult(); + auto lenIn32B = + builder.create(loc, lenBurst, bytesPer32B).getResult(); + cfg = bitOr(cfg, shl(lenIn32B, 16)); + return cfg; +} + [[maybe_unused]] static FailureOr packCopyUbToGmConfig0(Operation *anchor, Value sid, Value nBurst, Value lenBurst, Value reserved) { @@ -3039,18 +3121,35 @@ static FailureOr buildExtremaPredicateCallee(MLIRContext *context, } static FailureOr buildCopyGmToUbCallee(MLIRContext *context, - Type sourceType) { + Type sourceType, + const std::string &march, + bool hasPadding) { auto ptrType = dyn_cast(sourceType); if (!ptrType) return failure(); Type elementType = ptrType.getElementType(); - if ((isa(elementType) && - cast(elementType).getWidth() == 64) || - elementType.isF64()) { - return StringAttr::get(context, "llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.s32.DV") - .getValue(); + + auto getElementSuffix = [&]() -> std::string { + if ((isa(elementType) && + cast(elementType).getWidth() == 64) || + elementType.isF64()) + return "s32"; + return getCopyElementFragment(elementType); + }; + + if (march == "dav-c220-vec") { + if (hasPadding) { + std::string elem = getElementSuffix(); + if (elem.empty()) + return failure(); + return StringAttr::get(context, + "llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2." + elem) + .getValue(); + } + return StringAttr::get(context, "llvm.hivm.MOV.OUT.TO.UB.v220").getValue(); } - std::string elem = getCopyElementFragment(elementType); + + std::string elem = getElementSuffix(); if (elem.empty()) return failure(); return StringAttr::get(context, "llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2." + elem + @@ -3058,7 +3157,11 @@ static FailureOr buildCopyGmToUbCallee(MLIRContext *context, .getValue(); } -static StringRef buildCopyUbToGmCallee(MLIRContext *context) { +static StringRef buildCopyUbToGmCallee(MLIRContext *context, + const std::string &march) { + if (march == "dav-c220-vec") + return StringAttr::get(context, "llvm.hivm.MOV.UB.TO.OUT.v220.1") + .getValue(); return StringAttr::get(context, "llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV") .getValue(); } @@ -4430,17 +4533,25 @@ template class LowerCopyOpPattern final : public OpConversionPattern { public: explicit LowerCopyOpPattern(TypeConverter &typeConverter, MLIRContext *context, - LoweringState &state) - : OpConversionPattern(typeConverter, context), state(state) {} + LoweringState &state, const std::string &march) + : OpConversionPattern(typeConverter, context), state(state), + march(march) {} LogicalResult matchAndRewrite(CopyOp op, typename CopyOp::Adaptor adaptor, ConversionPatternRewriter &rewriter) const override { + constexpr bool isGmUb = std::is_same_v; + + bool hasPadding = false; + if constexpr (isGmUb) + hasPadding = op->hasAttr("has_pad"); + FailureOr calleeName = failure(); - if constexpr (std::is_same_v) - calleeName = buildCopyGmToUbCallee(op.getContext(), op.getSource().getType()); + if constexpr (isGmUb) + calleeName = buildCopyGmToUbCallee(op.getContext(), op.getSource().getType(), + march, hasPadding); else - calleeName = buildCopyUbToGmCallee(op.getContext()); + calleeName = buildCopyUbToGmCallee(op.getContext(), march); if (failed(calleeName)) return rewriter.notifyMatchFailure(op, "unsupported copy VPTO signature"); @@ -4451,24 +4562,36 @@ class LowerCopyOpPattern final : public OpConversionPattern { if (!llvmSourceType || !llvmDestType) return rewriter.notifyMatchFailure(op, "expected LLVM pointer copy operands"); + bool useA3NonPadded = (march == "dav-c220-vec") && isGmUb && !hasPadding; + bool useA3UbGm = (march == "dav-c220-vec") && !isGmUb; + bool useSingleConfig = useA3NonPadded || useA3UbGm; + FailureOr config0 = failure(); FailureOr config1 = failure(); - if constexpr (std::is_same_v) { + if (useA3NonPadded) + config0 = packCopyGmToUbCfgV220(op, adaptor.getOperands()); + else if (useA3UbGm) + config0 = packCopyUbToGmCfgV220(op, adaptor.getOperands()); + else if constexpr (isGmUb) { config0 = packCopyGmToUbConfig0(op, adaptor.getOperands()); config1 = packCopyGmToUbConfig1(op, adaptor.getOperands()); } else { config0 = packCopyUbToGmConfig0(op, adaptor.getOperands()); config1 = packCopyUbToGmConfig1(op, adaptor.getOperands()); } - if (failed(config0) || failed(config1)) + if (failed(config0) || (!useSingleConfig && failed(config1))) return rewriter.notifyMatchFailure(op, "failed to materialize copy config"); SmallVector args{adaptor.getOperands()[1], adaptor.getOperands()[0], - *config0, *config1}; - auto funcType = rewriter.getFunctionType( - TypeRange{llvmDestType, llvmSourceType, rewriter.getI64Type(), - rewriter.getI64Type()}, - TypeRange{}); + *config0}; + SmallVector argTypes{llvmDestType, llvmSourceType, + rewriter.getI64Type()}; + if (!useSingleConfig) { + args.push_back(*config1); + argTypes.push_back(rewriter.getI64Type()); + } + + auto funcType = rewriter.getFunctionType(argTypes, TypeRange{}); auto call = rewriter.create(op.getLoc(), *calleeName, TypeRange{}, args); state.plannedDecls.push_back(PlannedDecl{calleeName->str(), funcType}); @@ -4477,6 +4600,191 @@ class LowerCopyOpPattern final : public OpConversionPattern { return success(); } +private: + LoweringState &state; + const std::string &march; +}; + +template +class LowerUBufBinaryOpPattern final : public OpConversionPattern { +public: + explicit LowerUBufBinaryOpPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), state(state) {} + + LogicalResult + matchAndRewrite(UBOp op, typename UBOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto ptrType = mlir::cast(op.getSrc0().getType()); + Type elemType = ptrType.getElementType(); + std::string elemFrag = getElementTypeFragment(elemType); + if (elemFrag.empty()) + return rewriter.notifyMatchFailure( + op, "unsupported element type for ubuf binary op"); + + std::string calleeName; + if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VADD." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSUB." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMUL." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VDIV." + elemFrag; + else + return rewriter.notifyMatchFailure(op, "unsupported ubuf binary op"); + + Value dst = adaptor.getDst(); + Value src0 = adaptor.getSrc0(); + Value src1 = adaptor.getSrc1(); + if (!dst || !src0 || !src1 || + !isa(dst.getType()) || + !isa(src0.getType()) || + !isa(src1.getType())) + return rewriter.notifyMatchFailure( + op, "unexpected converted ubuf binary operand types"); + + Location loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + auto getI64 = [&](Value v) -> Value { + return castIntegerLikeTo(op, v, i64Ty); + }; + auto maskByte = [&](Value v) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(0xff))); + }; + auto shl = [&](Value v, uint64_t amount) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(amount))); + }; + Value config = rewriter.create( + loc, rewriter.getI64IntegerAttr(1LL << 56)); + config = rewriter.create( + loc, config, maskByte(getI64(adaptor.getRepeat()))); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstBlockStride())), 8)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrc0BlockStride())), 16)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrc1BlockStride())), 24)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstRepeatStride())), 32)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrc0RepeatStride())), 40)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrc1RepeatStride())), 48)); + + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src0.getType(), src1.getType(), + rewriter.getI64Type()}, + TypeRange{}); + auto call = rewriter.create( + op.getLoc(), calleeName, TypeRange{}, + ValueRange{dst, src0, src1, config}); + (void)call; + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + +class LowerUBSetMaskOpPattern final + : public OpConversionPattern { +public: + explicit LowerUBSetMaskOpPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), + state(state) {} + + LogicalResult + matchAndRewrite(pto::UBSetMaskOp op, typename pto::UBSetMaskOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + StringRef calleeName = "llvm.hivm.MOVEMASK"; + Location loc = op.getLoc(); + + auto funcType = rewriter.getFunctionType( + TypeRange{rewriter.getI64Type(), rewriter.getI64Type()}, TypeRange{}); + + Value c0Idx = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{c0Idx, adaptor.getMask0()}); + + Value c1Idx = rewriter.create( + loc, rewriter.getI64IntegerAttr(1)); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{c1Idx, adaptor.getMask1()}); + + state.plannedDecls.push_back(PlannedDecl{calleeName.str(), funcType}); + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + +class LowerUBSetMaskCountOpPattern final + : public OpConversionPattern { +public: + explicit LowerUBSetMaskCountOpPattern(TypeConverter &typeConverter, + MLIRContext *context, + LoweringState &state) + : OpConversionPattern(typeConverter, context), + state(state) {} + + LogicalResult + matchAndRewrite(pto::UBSetMaskCountOp op, + typename pto::UBSetMaskCountOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + Value ctrl = rewriter.create(loc, i64Ty).getResult(); + Value bit56 = rewriter.create( + loc, rewriter.getI64IntegerAttr(56)); + Value set = rewriter + .create(loc, i64Ty, ctrl, bit56) + .getResult(); + rewriter.create(loc, set); + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + +class LowerUBSetMaskNormOpPattern final + : public OpConversionPattern { +public: + explicit LowerUBSetMaskNormOpPattern(TypeConverter &typeConverter, + MLIRContext *context, + LoweringState &state) + : OpConversionPattern(typeConverter, context), + state(state) {} + + LogicalResult + matchAndRewrite(pto::UBSetMaskNormOp op, + typename pto::UBSetMaskNormOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + Value ctrl = rewriter.create(loc, i64Ty).getResult(); + Value bit56 = rewriter.create( + loc, rewriter.getI64IntegerAttr(56)); + Value reset = rewriter + .create(loc, i64Ty, ctrl, bit56) + .getResult(); + rewriter.create(loc, reset); + rewriter.eraseOp(op); + return success(); + } + private: LoweringState &state; }; @@ -9281,25 +9589,79 @@ class ConvertVPTOUnrealizedCastOp final matchAndRewrite(UnrealizedConversionCastOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { if (op->getNumOperands() != 1 || op->getNumResults() != 1) - return failure(); + return rewriter.notifyMatchFailure(op, "expected single-operand single-result cast"); if (!hasVPTOConvertibleType(op->getOperandTypes()) && !hasVPTOConvertibleType(op->getResultTypes())) - return failure(); + return rewriter.notifyMatchFailure(op, "no VPTO convertible types"); Type convertedResultType = getTypeConverter()->convertType(op.getResult(0).getType()); if (!convertedResultType) - return failure(); + return rewriter.notifyMatchFailure(op, "could not convert result type"); Value input = adaptor.getOperands().front(); if (input.getType() != convertedResultType) - return failure(); + return rewriter.notifyMatchFailure(op, "input type does not match converted result type"); rewriter.replaceOp(op, input); return success(); } }; +class ConvertPtoTileBufAddrOp final + : public OpConversionPattern { +public: + using OpConversionPattern::OpConversionPattern; + + LogicalResult + matchAndRewrite(pto::TileBufAddrOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + Type convertedResultType = + getTypeConverter()->convertType(op.getResult().getType()); + auto llvmPtrType = dyn_cast(convertedResultType); + if (!llvmPtrType) + return rewriter.notifyMatchFailure(op, "expected LLVM pointer result"); + + Value input = adaptor.getSrc(); + if (isa(input.getType())) { + Value alignedIdx = + rewriter.create( + op.getLoc(), rewriter.getIndexType(), input); + Value i64 = rewriter.create( + op.getLoc(), rewriter.getI64Type(), alignedIdx); + rewriter.replaceOpWithNewOp(op, llvmPtrType, i64); + return success(); + } + + return rewriter.notifyMatchFailure(op, "unsupported tilebuf address source"); + } +}; + +class ConvertPointerCastToCastPtrOp final + : public OpConversionPattern { +public: + using OpConversionPattern::OpConversionPattern; + + LogicalResult + matchAndRewrite(pto::PointerCastOp op, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + if (adaptor.getAddrs().empty()) + return rewriter.notifyMatchFailure(op, "expected at least one address"); + + auto memref = dyn_cast(op.getResult().getType()); + if (!memref) + return rewriter.notifyMatchFailure(op, "expected memref result type"); + + auto ptrTy = pto::PtrType::get(rewriter.getContext(), + memref.getElementType(), + pto::AddressSpaceAttr::get(rewriter.getContext(), pto::AddressSpace::VEC)); + + rewriter.replaceOpWithNewOp(op, ptrTy, + adaptor.getAddrs().front()); + return success(); + } +}; + class ConvertPtoAddPtrOp final : public OpConversionPattern { public: using OpConversionPattern::OpConversionPattern; @@ -9353,10 +9715,19 @@ class ConvertPtoCastPtrOp final : public OpConversionPattern { rewriter.replaceOpWithNewOp(op, llvmPtrType, input); return success(); } + if (isa(inputType)) { + Value alignedIdx = + rewriter.create( + op.getLoc(), rewriter.getIndexType(), input); + Value i64 = rewriter.create( + op.getLoc(), rewriter.getI64Type(), alignedIdx); + rewriter.replaceOpWithNewOp(op, llvmPtrType, i64); + return success(); + } auto sourcePtrType = dyn_cast(inputType); if (!sourcePtrType) return rewriter.notifyMatchFailure(op, - "expected integer or LLVM pointer input"); + "expected integer, memref, or LLVM pointer input"); if (sourcePtrType.getAddressSpace() == llvmPtrType.getAddressSpace()) { rewriter.replaceOpWithNewOp(op, llvmPtrType, input); return success(); @@ -9755,7 +10126,8 @@ class ConvertVPTOTypedCarrierOp final : public ConversionPattern { static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, RewritePatternSet &patterns, - LoweringState &state) { + LoweringState &state, + const std::string &march) { patterns.add, LowerUnaryMaskedOpPattern, LowerUnaryMaskedOpPattern, @@ -9970,22 +10342,50 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, LowerMadRawPattern, LowerMadRawPattern, LowerMadRawPattern, - LowerCopyOpPattern, - LowerCopyOpPattern, LowerCopyUbufToUbufOpPattern, LowerCopyCbufToUbufOpPattern, LowerCopyUbufToCbufOpPattern>( typeConverter, patterns.getContext(), state); + + patterns.add>( + typeConverter, patterns.getContext(), state, march); + patterns.add>( + typeConverter, patterns.getContext(), state, march); + + if (march == "dav-c220-vec") { + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add( + typeConverter, patterns.getContext(), state); + patterns.add( + typeConverter, patterns.getContext(), state); + patterns.add( + typeConverter, patterns.getContext(), state); + } } static void configureVPTOOpLoweringTarget(ConversionTarget &target, - VPTOTypeConverter &typeConverter) { + VPTOTypeConverter &typeConverter, + const std::string &march) { (void)typeConverter; target.addLegalOp(); + target.addLegalOp(); + target.addLegalOp(); + target.addLegalOp(); target.addLegalDialect(); - target.addLegalOp(); + func::FuncDialect, scf::SCFDialect>(); + target.addDynamicallyLegalOp( + [](UnrealizedConversionCastOp op) { + return !hasVPTOConvertibleType(op->getOperandTypes()) && + !hasVPTOConvertibleType(op->getResultTypes()); + }); target.addIllegalOp(); @@ -10083,6 +10483,17 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, pto::MadMxAccOp, pto::MadMxBiasOp, pto::MadRawOp, pto::MadBiasRawOp, pto::MadMxRawOp, pto::MadMxBiasRawOp>(); + + if (march == "dav-c220-vec") { + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + } + target.markUnknownOpDynamicallyLegal([](Operation *) { return true; }); } @@ -10118,15 +10529,18 @@ static void foldVPTOTypeCasts(ModuleOp module, TypeConverter &typeConverter) { } } -static LogicalResult lowerVPTOOps(ModuleOp module, llvm::raw_ostream &diagOS) { +static LogicalResult lowerVPTOOps(ModuleOp module, + const std::string &march, + llvm::raw_ostream &diagOS) { MLIRContext *context = module.getContext(); VPTOTypeConverter typeConverter(context); ConversionTarget target(*context); RewritePatternSet patterns(context); LoweringState state; - configureVPTOOpLoweringTarget(target, typeConverter); - populateVPTOOpLoweringPatterns(typeConverter, patterns, state); + configureVPTOOpLoweringTarget(target, typeConverter, march); + populateVPTOOpLoweringPatterns(typeConverter, patterns, state, march); + patterns.add(typeConverter, context); if (failed(applyPartialConversion(module, target, std::move(patterns)))) { diagOS << "VPTO LLVM emission failed: VPTO op lowering failed\n"; @@ -10145,7 +10559,7 @@ static LogicalResult lowerVPTOTypes(ModuleOp module, llvm::raw_ostream &diagOS) LoweringState state; target.addLegalOp(); - target.addDynamicallyLegalOp([&](func::FuncOp op) { + target.addLegalOp();([&](func::FuncOp op) { return typeConverter.isSignatureLegal(op.getFunctionType()) && typeConverter.isLegal(&op.getBody()); }); @@ -10158,7 +10572,7 @@ static LogicalResult lowerVPTOTypes(ModuleOp module, llvm::raw_ostream &diagOS) return isLegalForBranchOpInterfaceTypeConversionPattern(op, typeConverter); }); - target.addIllegalOp(); target.addDynamicallyLegalOp( @@ -10264,6 +10678,12 @@ static VPTOEmissionOptions makeDeviceEmissionOptions(const VPTOEmissionOptions &baseOptions, FunctionKernelKind kind) { VPTOEmissionOptions options = baseOptions; + constexpr llvm::StringLiteral kC220VecTargetFeatures = + "+ASAN,+ATOMIC,+AtomicForB64,+AtomicForB8 ,+FFTSBlk," + "+MOVX8,+MSTX,+MathOp,+SPR7bits,+dav-c220-vec"; + constexpr llvm::StringLiteral kC220CubeTargetFeatures = + "+ASAN,+ATOMIC,+AtomicForB64,+AtomicForB8 ,+FFTSBlk," + "+MOVX8,+MSTX,+MathOp,+SPR7bits,+dav-c220-cube"; constexpr llvm::StringLiteral kVecTargetFeatures = "+ATOMIC,+ArchV130,+AregRedefinable,+ArithmeticBf16,+AtomicForB8 ," "+F8e4m3,+F8e5m2,+F8e8m0,+FFTSBlk,+Fp4e1m2x2,+Fp4e2m1x2,+LDExtRefine," @@ -10272,16 +10692,29 @@ makeDeviceEmissionOptions(const VPTOEmissionOptions &baseOptions, "+ATOMIC,+ArchV130,+AregRedefinable,+ArithmeticBf16,+AtomicForB8 ," "+F8e4m3,+F8e5m2,+F8e8m0,+FFTSBlk,+Fp4e1m2x2,+Fp4e2m1x2,+LDExtRefine," "+MOVX8,+SPR7bits,+SyncV,+dav-c310-cube"; - if (kind == FunctionKernelKind::Vector) { - options.march = "dav-c310-vec"; - options.aicoreArch = "dav-c310-vec"; - options.defaultTargetCPU = "dav-c310-vec"; - options.defaultTargetFeatures = kVecTargetFeatures.str(); - } else if (kind == FunctionKernelKind::Cube) { - options.march = "dav-c310-cube"; - options.aicoreArch = "dav-c310-cube"; - options.defaultTargetCPU = "dav-c310-cube"; - options.defaultTargetFeatures = kCubeTargetFeatures.str(); + if (options.march.empty()) { + if (kind == FunctionKernelKind::Vector) { + options.march = "dav-c310-vec"; + options.aicoreArch = "dav-c310-vec"; + options.defaultTargetCPU = "dav-c310-vec"; + options.defaultTargetFeatures = kVecTargetFeatures.str(); + } else if (kind == FunctionKernelKind::Cube) { + options.march = "dav-c310-cube"; + options.aicoreArch = "dav-c310-cube"; + options.defaultTargetCPU = "dav-c310-cube"; + options.defaultTargetFeatures = kCubeTargetFeatures.str(); + } + } else { + options.aicoreArch = options.march; + options.defaultTargetCPU = options.march; + if (options.march == "dav-c220-vec") + options.defaultTargetFeatures = kC220VecTargetFeatures.str(); + else if (options.march == "dav-c220-cube") + options.defaultTargetFeatures = kC220CubeTargetFeatures.str(); + else if (kind == FunctionKernelKind::Cube) + options.defaultTargetFeatures = kCubeTargetFeatures.str(); + else + options.defaultTargetFeatures = kVecTargetFeatures.str(); } return options; } @@ -10340,6 +10773,9 @@ struct LowerVPTOOpsPass final : public PassWrapper> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(LowerVPTOOpsPass) + LowerVPTOOpsPass() = default; + explicit LowerVPTOOpsPass(std::string m) : march(std::move(m)) {} + void runOnOperation() override { materializeVecScopeCarrierLoops(getOperation()); // Remove dead pto.alloc_tile ops before lowering. These can appear when @@ -10357,9 +10793,12 @@ struct LowerVPTOOpsPass final for (pto::AllocTileOp alloc : llvm::reverse(deadAllocs)) alloc.erase(); } - if (failed(lowerVPTOOps(getOperation(), llvm::errs()))) + if (failed(lowerVPTOOps(getOperation(), march, llvm::errs()))) signalPassFailure(); } + +private: + std::string march; }; struct LowerVPTOTypesPass final @@ -10493,7 +10932,8 @@ emitDeviceLLVMModule(ModuleOp deviceModule, StringRef kernelKind, } template -static LogicalResult runPipeline(ModuleOp module, llvm::raw_ostream &diagOS, +static LogicalResult runPipeline(ModuleOp module, const std::string &march, + llvm::raw_ostream &diagOS, EmitFn &&emit) { OwningOpRef clonedOp(module->clone()); ModuleOp clonedModule = cast(*clonedOp); @@ -10508,7 +10948,7 @@ static LogicalResult runPipeline(ModuleOp module, llvm::raw_ostream &diagOS, pm.enableVerifier(); auto &kernelModulePM = pm.nest(); kernelModulePM.addPass(std::make_unique()); - kernelModulePM.addPass(std::make_unique()); + kernelModulePM.addPass(std::make_unique(march)); kernelModulePM.addPass(std::make_unique()); kernelModulePM.addPass( std::make_unique()); @@ -10544,7 +10984,7 @@ LogicalResult lowerVPTOModuleToLLVMModulesBeta1( cubeModule.module.reset(); vectorModule.context.reset(); vectorModule.module.reset(); - return runPipeline(module, diagOS, + return runPipeline(module, options.march, diagOS, [&](ModuleOp loweredModule) { auto vectorDeviceModule = getUniqueDeviceModuleByKernelKind( diff --git a/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp b/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp index d5bd679548..9c85d2bb8d 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp @@ -12,7 +12,7 @@ namespace mlir::pto { static bool usesCANN900Lowering(const CANNVersion &cannVersion) { - return cannVersion >= CANNVersion::release(9, 0, 0); + return false; // Force Beta1 path until CANN900 emitter is stable for A3 } LogicalResult lowerVPTOModuleToLLVMModules( diff --git a/ptodsl/examples/bop_launch_a3.py b/ptodsl/examples/bop_launch_a3.py new file mode 100644 index 0000000000..94dcbff821 --- /dev/null +++ b/ptodsl/examples/bop_launch_a3.py @@ -0,0 +1,253 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. + +""" +A3 binary-op tile kernels: TSUB, TMUL, TDIV. + +End-to-end: @pto.jit -> MLIR -> binary -> launch -> accuracy check. +Exercises the pto.tsub/tmul/tdiv -> pto.ub.vsub/vmul/vdiv lowering paths. +""" + +import argparse +import time +from pathlib import Path +import sys + +import numpy as np + +if __package__ in {None, ""}: + here = Path(__file__).resolve() + for candidate in here.parents: + if (candidate / "ptodsl" / "__init__.py").exists(): + sys.path.insert(0, str(candidate)) + break + else: + raise RuntimeError( + "Unable to locate the PTODSL Python package root from bop_launch.py" + ) + +from ptodsl import pto + +_DEVICE = "npu:0" + + +# --------------------------------------------------------------------------- +# Kernel helpers +# --------------------------------------------------------------------------- + +_BINOPS = ("add", "sub", "mul", "div") +_REF_FNS = { + "add": lambda x, y: x + y, + "sub": lambda x, y: x - y, + "mul": lambda x, y: x * y, + "div": lambda x, y: x / (y + 1e-8), +} + + +def _binop_tile(A, B, C, rows: int, cols: int, op: str) -> None: + assert op in _BINOPS, f"unknown binop: {op}" + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = c_rows if rows == cols else pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A, shape=shape, strides=strides) + b_view = pto.make_tensor_view(B, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + b_part = pto.partition_view(b_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + b_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + + pto.tile.load(a_part, a_tile) + pto.tile.load(b_part, b_tile) + getattr(pto.tile, op)(a_tile, b_tile, c_tile) + pto.tile.store(c_tile, c_part) + + +# --------------------------------------------------------------------------- +# TSUB kernels +# --------------------------------------------------------------------------- + +@pto.jit( + name="TSUB_f32_1x64", + kernel_kind="vector", + target="a3", +) +def TSUB_f32_1x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 1, 64, "sub") + + +@pto.jit( + name="TSUB_f32_16x64", + kernel_kind="vector", + target="a3", +) +def TSUB_f32_16x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 16, 64, "sub") + + +# --------------------------------------------------------------------------- +# TMUL kernels +# --------------------------------------------------------------------------- + +@pto.jit( + name="TMUL_f32_1x64", + kernel_kind="vector", + target="a3", +) +def TMUL_f32_1x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 1, 64, "mul") + + +@pto.jit( + name="TMUL_f32_16x64", + kernel_kind="vector", + target="a3", +) +def TMUL_f32_16x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 16, 64, "mul") + + +# --------------------------------------------------------------------------- +# TDIV kernels +# --------------------------------------------------------------------------- + +@pto.jit( + name="TDIV_f32_1x64", + kernel_kind="vector", + target="a3", +) +def TDIV_f32_1x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 1, 64, "div") + + +@pto.jit( + name="TDIV_f32_16x64", + kernel_kind="vector", + target="a3", +) +def TDIV_f32_16x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _binop_tile(A_ptr, B_ptr, C_ptr, 16, 64, "div") + + +# --------------------------------------------------------------------------- +# Test cases +# --------------------------------------------------------------------------- + +CASES = [ + {"name": "sub_f32_1x64", "kernel": TSUB_f32_1x64, "shape": (1, 64), + "op": "sub", "eps": 1e-6}, + {"name": "sub_f32_16x64", "kernel": TSUB_f32_16x64, "shape": (16, 64), + "op": "sub", "eps": 1e-6}, + {"name": "mul_f32_1x64", "kernel": TMUL_f32_1x64, "shape": (1, 64), + "op": "mul", "eps": 1e-6}, + {"name": "mul_f32_16x64", "kernel": TMUL_f32_16x64, "shape": (16, 64), + "op": "mul", "eps": 1e-6}, + {"name": "div_f32_1x64", "kernel": TDIV_f32_1x64, "shape": (1, 64), + "op": "div", "eps": 1e-3}, + {"name": "div_f32_16x64", "kernel": TDIV_f32_16x64, "shape": (16, 64), + "op": "div", "eps": 1e-3}, +] + + +# --------------------------------------------------------------------------- +# Host +# --------------------------------------------------------------------------- + +def init_torch_npu() -> None: + import torch + import torch_npu # noqa: F401 + + torch.npu.config.allow_internal_format = False + torch_npu.npu.set_compile_mode(jit_compile=False) + torch.npu.set_device(_DEVICE) + return torch + + +def npu_stream(torch): + return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 + + +def run_case(case: dict, torch) -> None: + shape = case["shape"] + rng = np.random.RandomState(hash(case["name"]) & 0xFFFFFFFF) + x = rng.randint(1, 10, size=shape).astype(np.float32) + y = rng.randint(1, 10, size=shape).astype(np.float32) + ref = _REF_FNS[case["op"]](x, y) + + a = torch.from_numpy(x).to(_DEVICE) + b = torch.from_numpy(y).to(_DEVICE) + c = torch.empty(shape, dtype=torch.float32, device=_DEVICE) + stream = npu_stream(torch) + + t0 = time.perf_counter() + compiled = case["kernel"].compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](a.data_ptr(), b.data_ptr(), c.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + torch.testing.assert_close(ref, c.cpu().numpy(), rtol=case["eps"], atol=case["eps"]) + print( + f"PASS {case['name']} " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s" + ) + + +def test_bop() -> None: + torch = init_torch_npu() + for case in CASES: + run_case(case, torch) + print("All cases passed.") + + +def main(argv=None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + args = parser.parse_args(argv) + test_bop() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/ptodsl/examples/tadd_launch_a3.py b/ptodsl/examples/tadd_launch_a3.py new file mode 100644 index 0000000000..3a5fe4e5f1 --- /dev/null +++ b/ptodsl/examples/tadd_launch_a3.py @@ -0,0 +1,182 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. + +""" +TADD tile kernel — Python DSL equivalent of + test/tilelang_st/npu/a3/src/st/testcase/tadd/tadd.pto + +End-to-end: @pto.jit → MLIR → binary → launch → accuracy check. +""" + +import argparse +import time +from pathlib import Path +import sys + +import numpy as np + +if __package__ in {None, ""}: + here = Path(__file__).resolve() + for candidate in here.parents: + if (candidate / "ptodsl" / "__init__.py").exists(): + sys.path.insert(0, str(candidate)) + break + else: + raise RuntimeError( + "Unable to locate the PTODSL Python package root from tadd_launch.py" + ) + +from ptodsl import pto + +_DEVICE = "npu:0" + + +# --------------------------------------------------------------------------- +# Kernel +# --------------------------------------------------------------------------- + +def _tadd_tile(A, B, C, rows: int, cols: int) -> None: + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = c_rows if rows == cols else pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A, shape=shape, strides=strides) + b_view = pto.make_tensor_view(B, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + b_part = pto.partition_view(b_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + b_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto.float32) + + pto.tile.load(a_part, a_tile) + pto.tile.load(b_part, b_tile) + pto.tile.add(a_tile, b_tile, c_tile) + pto.tile.store(c_tile, c_part) + + +@pto.jit( + name="TADD_f32_16x64", + kernel_kind="vector", + target="a3", +) +def TADD_f32_16x64( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _tadd_tile(A_ptr, B_ptr, C_ptr, 16, 64) + + +@pto.jit( + name="TADD_f32_32x32", + kernel_kind="vector", + target="a3", +) +def TADD_f32_32x32( + A_ptr: pto.ptr(pto.f32, "gm"), + B_ptr: pto.ptr(pto.f32, "gm"), + C_ptr: pto.ptr(pto.f32, "gm"), +): + _tadd_tile(A_ptr, B_ptr, C_ptr, 32, 32) + + +KERNELS = (TADD_f32_16x64, TADD_f32_32x32) + + +def emit_mlir(): + return pto.merge_jit_modules(*KERNELS) + + +# --------------------------------------------------------------------------- +# Host +# --------------------------------------------------------------------------- + +CASES = [ + {"name": "f32_16x64", "kernel": TADD_f32_16x64, "shape": (16, 64), "eps": 1e-6}, + {"name": "f32_32x32", "kernel": TADD_f32_32x32, "shape": (32, 32), "eps": 1e-6}, +] + + +def init_torch_npu() -> None: + import torch + import torch_npu # noqa: F401 + + torch.npu.config.allow_internal_format = False + torch_npu.npu.set_compile_mode(jit_compile=False) + torch.npu.set_device(_DEVICE) + return torch + + +def npu_stream(torch): + return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 + + +def run_case(case: dict, torch) -> None: + shape = case["shape"] + rng = np.random.RandomState(hash(case["name"]) & 0xFFFFFFFF) + x = rng.randint(1, 10, size=shape).astype(np.float32) + y = rng.randint(1, 10, size=shape).astype(np.float32) + ref = x + y + + a = torch.from_numpy(x).to(_DEVICE) + b = torch.from_numpy(y).to(_DEVICE) + c = torch.empty(shape, dtype=torch.float32, device=_DEVICE) + stream = npu_stream(torch) + + t0 = time.perf_counter() + compiled = case["kernel"].compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](a.data_ptr(), b.data_ptr(), c.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + torch.testing.assert_close(ref, c.cpu().numpy(), rtol=case["eps"], atol=case["eps"]) + print( + f"PASS {case['name']} " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s" + ) + + +def test_tadd() -> None: + torch = init_torch_npu() + for case in CASES: + run_case(case, torch) + print("All cases passed.") + + +def main(argv=None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--emit-mlir", + action="store_true", + help="print merged MLIR module and exit (compile-only)", + ) + args = parser.parse_args(argv) + + if args.emit_mlir: + print(emit_mlir()) + return 0 + + test_tadd() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/ptodsl/ptodsl/_runtime/toolchain.py b/ptodsl/ptodsl/_runtime/toolchain.py index 938db50a71..a3f1b7d9d6 100644 --- a/ptodsl/ptodsl/_runtime/toolchain.py +++ b/ptodsl/ptodsl/_runtime/toolchain.py @@ -15,6 +15,15 @@ def resolve_ptoas_binary() -> Path: + for var in ("PTO_BUILD_DIR", "PTO_INSTALL_DIR"): + if var in os.environ: + cand = Path(os.environ[var]) / "tools" / "ptoas" / "ptoas" + if cand.is_file(): + return cand + cand2 = Path(os.environ[var]) / "bin" / "ptoas" + if cand2.is_file(): + return cand2 + repo_root = Path(__file__).resolve().parents[4] candidates = [ repo_root / "build" / "tools" / "ptoas" / "ptoas", @@ -24,6 +33,12 @@ def resolve_ptoas_binary() -> Path: if candidate.is_file(): return candidate + for start in [Path.cwd()] + list(Path.cwd().parents): + for pattern in [start / "install" / "bin" / "ptoas", + start / "build" / "tools" / "ptoas" / "ptoas"]: + if pattern.is_file(): + return pattern + from_path = shutil.which("ptoas") if from_path: return Path(from_path) @@ -143,10 +158,15 @@ def runtime_library_flags(*, sim_mode: bool = False) -> list[str]: return flags -def aicore_arch_for_kernel_kind(kernel_kind: str) -> str: +def aicore_arch_for_kernel_kind(kernel_kind: str, target_arch: str = "a5") -> str: + target = target_arch.lower() if kernel_kind == "vector": + if target in {"a2", "a3"}: + return "dav-c220-vec" return "dav-c310-vec" if kernel_kind == "cube": + if target in {"a2", "a3"}: + return "dav-c220-cube" return "dav-c310-cube" raise ValueError(f"unsupported kernel_kind for native build: {kernel_kind!r}") diff --git a/ptodsl/tests/test_runtime_toolchain.py b/ptodsl/tests/test_runtime_toolchain.py new file mode 100644 index 0000000000..a39290cb86 --- /dev/null +++ b/ptodsl/tests/test_runtime_toolchain.py @@ -0,0 +1,38 @@ +import unittest +import importlib.util +from pathlib import Path + + +_TOOLCHAIN_PATH = ( + Path(__file__).resolve().parents[1] / "ptodsl" / "_runtime" / "toolchain.py" +) +_SPEC = importlib.util.spec_from_file_location("ptodsl_runtime_toolchain", _TOOLCHAIN_PATH) +assert _SPEC is not None and _SPEC.loader is not None +_TOOLCHAIN = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(_TOOLCHAIN) +aicore_arch_for_kernel_kind = _TOOLCHAIN.aicore_arch_for_kernel_kind + + +class RuntimeToolchainTest(unittest.TestCase): + def test_a2_a3_use_c220_aicore_arch(self): + self.assertEqual( + aicore_arch_for_kernel_kind("vector", "a3"), "dav-c220-vec" + ) + self.assertEqual( + aicore_arch_for_kernel_kind("cube", "a3"), "dav-c220-cube" + ) + self.assertEqual( + aicore_arch_for_kernel_kind("vector", "a2"), "dav-c220-vec" + ) + + def test_a5_uses_c310_aicore_arch(self): + self.assertEqual( + aicore_arch_for_kernel_kind("vector", "a5"), "dav-c310-vec" + ) + self.assertEqual( + aicore_arch_for_kernel_kind("cube", "a5"), "dav-c310-cube" + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto b/test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto new file mode 100644 index 0000000000..1e00bfcd9b --- /dev/null +++ b/test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto @@ -0,0 +1,28 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: copy_gm_to_ubuf without padding → llvm.hivm.MOV.OUT.TO.UB.v220 +// (single i64 config, 3-arg call) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @copy_gm_ub_a3_nopad_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %false = arith.constant false + pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c0, %c0, %false, %c0, %c1, %c1 + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @copy_gm_ub_a3_nopad_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () +// CHECK-NOT: ALIGN +// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto b/test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto new file mode 100644 index 0000000000..dede370c6b --- /dev/null +++ b/test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto @@ -0,0 +1,28 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: copy_gm_to_ubuf with padding → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32 +// (two i64 configs, 4-arg call, no .DV suffix) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @copy_gm_ub_a3_pad_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %true = arith.constant true + pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c2, %c2, %true, %c0, %c1, %c1 {has_pad} + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @copy_gm_ub_a3_pad_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () +// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto b/test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto new file mode 100644 index 0000000000..ebef49273b --- /dev/null +++ b/test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A5: copy_gm_to_ubuf unchanged → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV +// (regression test — ensure A5 still uses .DV intrinsics) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + func.func @copy_gm_ub_a5_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.kernel} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %false = arith.constant false + pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c0, %c0, %false, %c0, %c1, %c1 + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @copy_gm_ub_a5_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () diff --git a/test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto b/test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto new file mode 100644 index 0000000000..04512a96ff --- /dev/null +++ b/test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: copy_ubuf_to_gm → llvm.hivm.MOV.UB.TO.OUT.v220.1 +// (single i64 config, 3-arg call) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @copy_ub_gm_a3_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + pto.copy_ubuf_to_gm %src, %dst, %c0, %c1, %c1, %c0, %c1, %c1 + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @copy_ub_gm_a3_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.v220.1({{.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64) -> () +// CHECK-NOT: ALIGN +// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto b/test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto new file mode 100644 index 0000000000..8269c9a257 --- /dev/null +++ b/test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto @@ -0,0 +1,25 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A5: copy_ubuf_to_gm unchanged → llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV +// (regression test) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + func.func @copy_ub_gm_a5_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.kernel} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + pto.copy_ubuf_to_gm %src, %dst, %c0, %c1, %c1, %c0, %c1, %c1 + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @copy_ub_gm_a5_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV({{.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64, i64) -> () diff --git a/test/lit/vpto/ub/lower_tadd_a5_noop.pto b/test/lit/vpto/ub/lower_tadd_a5_noop.pto new file mode 100644 index 0000000000..0922d4f58e --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_a5_noop.pto @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test that pto.tadd on a5 targets is NOT lowered by LowerPTOToUBufOps. +// Instead it passes through to the existing ExpandTileOp → vecscope/vadd +// TileLang path. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto --enable-tile-op-expand %s -o - 2>/dev/null || true ) | FileCheck %s --check-prefix=VPTO +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s --check-prefix=LLVM + +module attributes {pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_a5() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// VPTO: pto.vecscope +// VPTO: pto.vadd +// VPTO-NOT: pto.ub.vadd + +// LLVM-NOT: llvm.hivm.VADD.f32 diff --git a/test/lit/vpto/ub/lower_tadd_chunked.pto b/test/lit/vpto/ub/lower_tadd_chunked.pto new file mode 100644 index 0000000000..2e833e35f4 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_chunked.pto @@ -0,0 +1,32 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LCountMode: totalRepeats > 255. +// 16x1024 f32 — totalRepeats=512>255 → count mode (no scf.for). + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_chunked() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// Count mode only — no scf.for +// CHECK-LABEL: func.func @lower_tadd_chunked +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.set_mask +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK: pto.ub.set_mask %c-1_i64, %c0 +// CHECK-NOT: scf.for +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_chunked_tail.pto b/test/lit/vpto/ub/lower_tadd_chunked_tail.pto new file mode 100644 index 0000000000..b4b37f93c2 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_chunked_tail.pto @@ -0,0 +1,32 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LCountMode: nonVLAligned + totalRepeats > 255. +// 41x200 f32 — nonVLAligned=true, totalRepeats=257>255 → count mode. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_chunked_tail() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// Count mode — no scf.for, no head+tail norm mode +// CHECK-LABEL: func.func @lower_tadd_chunked_tail +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.set_mask +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK: pto.ub.set_mask %c-1_i64, %c0 +// CHECK-NOT: scf.for +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_col_vl_align.pto b/test/lit/vpto/ub/lower_tadd_col_vl_align.pto new file mode 100644 index 0000000000..60e1a458f1 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_col_vl_align.pto @@ -0,0 +1,32 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin2LNormModeColVLAlign: partial valid columns, row-by-row, VL-aligned. +// 2x128 f32, valid=2x32 — cols=128, vCols=32. +// epr=32: normColRepeat=128/32=4, vRows=2 < normColRepeat+1=5, vCols%epr=32%32=0 → ColVLAlign. +// headRepeats=vCols/epr=1, row loop with stride=8. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_col_vl_align() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// Row-by-row: scf.for 2 iterations, vadd(repeat=1, stride=8) per row, no masking. +// CHECK-LABEL: func.func @lower_tadd_col_vl_align +// CHECK: scf.for +// CHECK: pto.addptr +// CHECK: pto.ub.vadd +// CHECK-NOT: pto.ub.set_mask %c +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_count.pto b/test/lit/vpto/ub/lower_tadd_count.pto new file mode 100644 index 0000000000..290fcaeea0 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_count.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LCountMode: 7x48 f32, headRepeats>1 → per-row scf.for. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_count() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_count +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_count_large.pto b/test/lit/vpto/ub/lower_tadd_count_large.pto new file mode 100644 index 0000000000..0c0d8cf084 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_count_large.pto @@ -0,0 +1,33 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LCountMode: totalRepeats > 255. +// 16x1024 f32 — cols=1024, epr=32, nonVLAligned=false, totalRepeats=512>255 → count mode. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_count_large() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// Count mode: set_mask_count → vadd(repeat=0) → set_mask_norm → restore mask +// No scf.for chunks. +// CHECK-LABEL: func.func @lower_tadd_count_large +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.set_mask +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK: pto.ub.set_mask %c-1_i64, %c0 +// CHECK-NOT: scf.for +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_flat.pto b/test/lit/vpto/ub/lower_tadd_flat.pto new file mode 100644 index 0000000000..07c9acea46 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_flat.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LNormMode: 4x32 f32. headRepeats>1 → per-row scf.for. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_flat() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_flat +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_row_rpt.pto b/test/lit/vpto/ub/lower_tadd_row_rpt.pto new file mode 100644 index 0000000000..9feaa9d00e --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_row_rpt.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test tadd lowering: 4x96 f32, valid=4x32. Hits count mode (totalV > REPEAT_MAX). + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_row_rpt() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_row_rpt +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto b/test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto new file mode 100644 index 0000000000..c9346e7c68 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto @@ -0,0 +1,29 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin2LNormModeRowRpt. 5x128 f32, v_col=40. +// headRepeats=3 > 1 → per-row scf.for count mode. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_row_rpt_tail() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_row_rpt_tail +// CHECK: scf.for +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_small.pto b/test/lit/vpto/ub/lower_tadd_small.pto new file mode 100644 index 0000000000..d302eb4af3 --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_small.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LNormModeSmall: 2x32 f32, v_col=8. vRows>1 → per-row scf.for count mode. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_small() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_small +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_tail.pto b/test/lit/vpto/ub/lower_tadd_tail.pto new file mode 100644 index 0000000000..6af3e862cb --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_tail.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test Bin1LCountMode: 7x48 f32, headRepeats>1 → per-row scf.for. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tadd_tail() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tadd_tail +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto b/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto new file mode 100644 index 0000000000..5b1646582b --- /dev/null +++ b/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto @@ -0,0 +1,49 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// 4x64 f32: headRepeats>1 → scf.for loop with count mode per row. +// 1x64 f32 (single row): headRepeats=1 → direct count mode. + +// RUN: ( mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @lower_f32() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + + func.func @lower_f32_single_row() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// 1x64: direct count mode, no loop +// CHECK-LABEL: func.func @lower_f32_single_row() +// CHECK-NOT: scf.for +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm +// CHECK: pto.ub.set_mask %c-1_i64, %c0_i64 + +// 4x64: scf.for loop with count mode per row +// CHECK-LABEL: func.func @lower_f32() +// CHECK: scf.for +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vadd +// CHECK: pto.ub.set_mask_norm + +// CHECK-NOT: pto.tadd + diff --git a/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto b/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto new file mode 100644 index 0000000000..7974570849 --- /dev/null +++ b/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test TDIV → pto.ub.vdiv lowering. + +// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: func.func @lower_tdiv_f32 +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vdiv + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @lower_tdiv_f32() attributes {pto.aicore} { + %a = pto.alloc_tile : !pto.tile_buf + %b = pto.alloc_tile : !pto.tile_buf + %c = pto.alloc_tile : !pto.tile_buf + pto.tdiv ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto b/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto new file mode 100644 index 0000000000..cd7cb6dd0f --- /dev/null +++ b/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test TMUL → pto.ub.vmul lowering. + +// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: func.func @lower_tmul_f32 +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vmul + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @lower_tmul_f32() attributes {pto.aicore} { + %a = pto.alloc_tile : !pto.tile_buf + %b = pto.alloc_tile : !pto.tile_buf + %c = pto.alloc_tile : !pto.tile_buf + pto.tmul ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto b/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto new file mode 100644 index 0000000000..56185f4bb3 --- /dev/null +++ b/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test TSUB → pto.ub.vsub lowering. + +// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: func.func @lower_tsub_f32 +// CHECK: pto.ub.set_mask_count +// CHECK: pto.ub.vsub + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @lower_tsub_f32() attributes {pto.aicore} { + %a = pto.alloc_tile : !pto.tile_buf + %b = pto.alloc_tile : !pto.tile_buf + %c = pto.alloc_tile : !pto.tile_buf + pto.tsub ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_expand.pto b/test/lit/vpto/ub/mte_gm_ub_a3_expand.pto new file mode 100644 index 0000000000..a6941801db --- /dev/null +++ b/test/lit/vpto/ub/mte_gm_ub_a3_expand.pto @@ -0,0 +1,47 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: mte_gm_ub → copy_gm_to_ubuf expansion (before LLVM lowering) +// Verifies that on A2A3, no SET.LOOP HW config ops are emitted — all loops use scf.for. + +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto --mlir-print-ir-after=vpto-expand-wrapper-ops %s -o /dev/null 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @mte_gm_ub_a3_expand(%arg0: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %ub = pto.castptr %c0 : i64 -> !pto.ptr + pto.mte_gm_ub %arg0, %ub, %c0, %c1 + nburst(%c1, %c1, %c1) + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + return + } + + func.func @mte_gm_ub_a3_expand_with_loops(%arg0: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %ub = pto.castptr %c0 : i64 -> !pto.ptr + pto.mte_gm_ub %arg0, %ub, %c0, %c1 + nburst(%c1, %c1, %c1) + loop(%c1, %c1, %c1) + loop1(%c1, %c1, %c1) + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, loop i64, i64, i64, loop1 i64, i64, i64 + return + } +} + +// CHECK-LABEL: func.func @mte_gm_ub_a3_expand( +// CHECK: pto.copy_gm_to_ubuf +// CHECK-NOT: pto.mte_gm_ub +// CHECK-NOT: pto.set_loop + +// CHECK-LABEL: func.func @mte_gm_ub_a3_expand_with_loops( +// CHECK: scf.for +// CHECK: pto.copy_gm_to_ubuf +// CHECK-NOT: pto.set_loop +// CHECK-NOT: pto.mte_gm_ub diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto b/test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto new file mode 100644 index 0000000000..119f00fb51 --- /dev/null +++ b/test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: mte_gm_ub without padding → expanded → lowered to llvm.hivm.MOV.OUT.TO.UB.v220 + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @mte_gm_ub_a3_nopad_f32(%arg0: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %ub = pto.castptr %c0 : i64 -> !pto.ptr + pto.mte_gm_ub %arg0, %ub, %c0, %c1 + nburst(%c1, %c1, %c1) + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @mte_gm_ub_a3_nopad_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () +// CHECK-NOT: ALIGN.V2 diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto b/test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto new file mode 100644 index 0000000000..0ac630eb11 --- /dev/null +++ b/test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto @@ -0,0 +1,32 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A3: mte_gm_ub with padding → expanded → lowered to +// SET.MOV.PAD.VAL + MOV.OUT.TO.UB.ALIGN.V2.f32 (no .DV) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @mte_gm_ub_a3_pad_f32(%arg0: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %pad_val = arith.constant 0.0 : f32 + %ub = pto.castptr %c0 : i64 -> !pto.ptr + pto.mte_gm_ub %arg0, %ub, %c0, %c1 + nburst(%c1, %c1, %c1) + pad(%pad_val, %c2, %c2) + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, pad f32, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @mte_gm_ub_a3_pad_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.SET.MOV.PAD.VAL +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () +// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto b/test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto new file mode 100644 index 0000000000..e6dc6d79ea --- /dev/null +++ b/test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// A5: mte_gm_ub unchanged → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV +// (regression test — ensure A5 still uses .DV intrinsics) + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + func.func @mte_gm_ub_a5_f32(%arg0: !pto.ptr) attributes {pto.kernel} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %ub = pto.castptr %c0 : i64 -> !pto.ptr + pto.mte_gm_ub %arg0, %ub, %c0, %c1 + nburst(%c1, %c1, %c1) + : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @mte_gm_ub_a5_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () diff --git a/tools/ptoas/VPTOFatobjEmission.h b/test/lit/vpto/ub/set_mask_a5_noop.pto similarity index 51% rename from tools/ptoas/VPTOFatobjEmission.h rename to test/lit/vpto/ub/set_mask_a5_noop.pto index e1524580b8..360e111dbb 100644 --- a/tools/ptoas/VPTOFatobjEmission.h +++ b/test/lit/vpto/ub/set_mask_a5_noop.pto @@ -6,22 +6,16 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -#ifndef PTOAS_VPTO_FATOBJ_EMISSION_H -#define PTOAS_VPTO_FATOBJ_EMISSION_H +// Test that pto.ub.set_mask is NOT lowered on a5 targets. -#include "ObjectEmission.h" +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s -namespace mlir::pto { - -inline LogicalResult emitVPTOFatobj(llvm::Module *cubeModule, - llvm::Module *vectorModule, - llvm::StringRef stubSource, - llvm::ToolOutputFile &outputFile, - llvm::raw_ostream &diagOS) { - return emitFatobjLLVMWithRuntime(cubeModule, vectorModule, stubSource, - outputFile, diagOS); +module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + func.func @set_mask_a5_noop() attributes {pto.aicore} { + %cNeg1 = arith.constant -1 : i64 + pto.ub.set_mask %cNeg1, %cNeg1 : i64, i64 + return + } } -} // namespace mlir::pto - -#endif +// CHECK-NOT: llvm.hivm.MOVEMASK diff --git a/test/lit/vpto/ub/set_mask_count_llvm.pto b/test/lit/vpto/ub/set_mask_count_llvm.pto new file mode 100644 index 0000000000..ef1885c53e --- /dev/null +++ b/test/lit/vpto/ub/set_mask_count_llvm.pto @@ -0,0 +1,50 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test that pto.ub.set_mask_count and pto.ub.set_mask_norm lower to +// SBITSET1 / SBITSET0 on CTRL register bit 56 (matching CCE reference). + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: llvm.func @set_mask_count_llvm_mix_aiv +// CHECK: llvm.call @llvm.hivm.SBITSET1 +// CHECK: llvm.call @llvm.hivm.SET.CTRL + +// CHECK-LABEL: llvm.func @set_mask_norm_llvm_mix_aiv +// CHECK: llvm.call @llvm.hivm.SBITSET0 +// CHECK: llvm.call @llvm.hivm.SET.CTRL + +// CHECK-LABEL: llvm.func @count_mode_sequence_mix_aiv +// CHECK: llvm.call @llvm.hivm.SBITSET1 +// CHECK: llvm.call @llvm.hivm.SET.CTRL +// CHECK: llvm.call @llvm.hivm.MOVEMASK +// CHECK: llvm.call @llvm.hivm.MOVEMASK +// CHECK: llvm.call @llvm.hivm.SBITSET0 +// CHECK: llvm.call @llvm.hivm.SET.CTRL + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @set_mask_count_llvm() attributes {pto.aicore} { + pto.ub.set_mask_count + return + } + + func.func @set_mask_norm_llvm() attributes {pto.aicore} { + pto.ub.set_mask_norm + return + } + + func.func @count_mode_sequence() attributes {pto.aicore} { + pto.ub.set_mask_count + %c0 = arith.constant 0 : i64 + %c42 = arith.constant 42 : i64 + pto.ub.set_mask %c42, %c0 : i64, i64 + pto.ub.set_mask_norm + return + } +} diff --git a/test/lit/vpto/ub/set_mask_llvm.pto b/test/lit/vpto/ub/set_mask_llvm.pto new file mode 100644 index 0000000000..8b327f0f64 --- /dev/null +++ b/test/lit/vpto/ub/set_mask_llvm.pto @@ -0,0 +1,37 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test that pto.ub.set_mask is lowered to two llvm.hivm.MOVEMASK calls +// per CCE expansion: movemask(0, mask0); movemask(1, mask1). + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @set_mask_full() attributes {pto.aicore} { + %cNeg1 = arith.constant -1 : i64 + pto.ub.set_mask %cNeg1, %cNeg1 : i64, i64 + return + } + + func.func @set_mask_tail() attributes {pto.aicore} { + %c16 = arith.constant 16 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.set_mask %c0, %c16 : i64, i64 + return + } +} + +// CHECK-LABEL: llvm.func @set_mask_full_mix_aiv +// Two MOVEMASK calls per set_mask: index 0 then index 1 +// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () +// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () + +// CHECK-LABEL: llvm.func @set_mask_tail_mix_aiv +// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () +// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () diff --git a/test/lit/vpto/ub/ub_vadd_a5_noop.pto b/test/lit/vpto/ub/ub_vadd_a5_noop.pto new file mode 100644 index 0000000000..aa2f3cdbe0 --- /dev/null +++ b/test/lit/vpto/ub/ub_vadd_a5_noop.pto @@ -0,0 +1,25 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + func.func @ub_vadd_noop(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} + +// CHECK-NOT: llvm.hivm.VADD diff --git a/test/lit/vpto/ub/ub_vadd_vpto_llvm.pto b/test/lit/vpto/ub/ub_vadd_vpto_llvm.pto new file mode 100644 index 0000000000..1cd7fe7535 --- /dev/null +++ b/test/lit/vpto/ub/ub_vadd_vpto_llvm.pto @@ -0,0 +1,104 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: llvm.func @ub_vadd_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VADD.s16 +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @ub_vadd_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + +// CHECK-LABEL: llvm.func @ub_vadd_f16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VADD.f16 + func.func @ub_vadd_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + +// CHECK-LABEL: llvm.func @ub_vadd_s32_mix_aiv +// CHECK: llvm.call @llvm.hivm.VADD.s32 + func.func @ub_vadd_s32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + +// CHECK-LABEL: llvm.func @ub_vadd_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.VADD.f32 + func.func @ub_vadd_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + +// Verify A3/HVVM byte packing: +// repeat[7:0], dstBlk[15:8], src0Blk[23:16], src1Blk[31:24], +// dstRep[39:32], src0Rep[47:40], src1Rep[55:48], simdFlag[63:56]=1. +// CHECK-LABEL: llvm.func @ub_vadd_packed_mix_aiv +// CHECK: llvm.mlir.constant(72057594037927936 : i64) +// CHECK: llvm.or +// CHECK: %[[DSTBLK:.*]] = llvm.mlir.constant(2 : i64) +// CHECK: %[[SH8:.*]] = llvm.mlir.constant(8 : i64) +// CHECK: llvm.shl %[[DSTBLK]], %[[SH8]] +// CHECK: %[[SRC0BLK:.*]] = llvm.mlir.constant(3 : i64) +// CHECK: %[[SH16:.*]] = llvm.mlir.constant(16 : i64) +// CHECK: llvm.shl %[[SRC0BLK]], %[[SH16]] +// CHECK: %[[SRC1BLK:.*]] = llvm.mlir.constant(6 : i64) +// CHECK: %[[SH24:.*]] = llvm.mlir.constant(24 : i64) +// CHECK: llvm.shl %[[SRC1BLK]], %[[SH24]] +// CHECK: %[[DSTREP:.*]] = llvm.mlir.constant(9 : i64) +// CHECK: %[[SH32:.*]] = llvm.mlir.constant(32 : i64) +// CHECK: llvm.shl %[[DSTREP]], %[[SH32]] +// CHECK: %[[SRC0REP:.*]] = llvm.mlir.constant(12 : i64) +// CHECK: %[[SH40:.*]] = llvm.mlir.constant(40 : i64) +// CHECK: llvm.shl %[[SRC0REP]], %[[SH40]] +// CHECK: %[[SRC1REP:.*]] = llvm.mlir.constant(15 : i64) +// CHECK: %[[SH48:.*]] = llvm.mlir.constant(48 : i64) +// CHECK: llvm.shl %[[SRC1REP]], %[[SH48]] +// CHECK: llvm.call @llvm.hivm.VADD.s16({{.*}}, {{.*}}, {{.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + func.func @ub_vadd_packed(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c6 = arith.constant 6 : i64 + %c9 = arith.constant 9 : i64 + %c12 = arith.constant 12 : i64 + %c15 = arith.constant 15 : i64 + pto.ub.vadd %dst, %src0, %src1, %c1, %c2, %c3, %c6, %c9, %c12, %c15 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto b/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto new file mode 100644 index 0000000000..1b2f4e8a2f --- /dev/null +++ b/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto @@ -0,0 +1,56 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Test pto.ub.vsub/vmul/vdiv → llvm.hivm.VSUB/VMUL/VDIV lowering. + +// RUN: (mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: llvm.func @vsub_llvm_mix_aiv +// CHECK: llvm.call @llvm.hivm.VSUB.f32 + +// CHECK-LABEL: llvm.func @vmul_llvm_mix_aiv +// CHECK: llvm.call @llvm.hivm.VMUL.f32 + +// CHECK-LABEL: llvm.func @vdiv_llvm_mix_aiv +// CHECK: llvm.call @llvm.hivm.VDIV.f32 + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + + func.func @vsub_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + pto.ub.vsub %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } + + func.func @vmul_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + pto.ub.vmul %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } + + func.func @vdiv_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + pto.ub.vdiv %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/tools/ptoas/ObjectEmission.cpp b/tools/ptoas/ObjectEmission.cpp index c33aab02e0..d3732a1bb1 100644 --- a/tools/ptoas/ObjectEmission.cpp +++ b/tools/ptoas/ObjectEmission.cpp @@ -258,6 +258,18 @@ getTargetCPU(mlir::pto::ObjectEmissionDeviceTarget target) { llvm_unreachable("unknown object emission device target"); } +static std::string resolveTargetCPU(llvm::Module &module, + mlir::pto::ObjectEmissionDeviceTarget fallback) { + for (llvm::Function &f : module) { + if (f.hasFnAttribute("target-cpu")) { + std::string cpu = f.getFnAttribute("target-cpu").getValueAsString().str(); + if (!cpu.empty()) + return cpu; + } + } + return getTargetCPU(fallback).str(); +} + class VPTOFatobjArtifacts { public: explicit VPTOFatobjArtifacts(mlir::pto::TempFileRegistry &tempFiles) @@ -914,9 +926,12 @@ mlir::LogicalResult mlir::pto::emitVPTOVectorDeviceObject( return failure(); if (failed(writeLLVMModule(module, llPath, diagOS))) return failure(); - return compileLLVMToDeviceObject(llPath, outObjPath, - ObjectEmissionDeviceTarget::Vector, - toolchain, stderrPath, diagOS); + return compileDeviceLLVMToObject(llPath, outObjPath, + resolveTargetCPU(module, + ObjectEmissionDeviceTarget::Vector), + toolchain.bishengPath, stderrPath, diagOS) + ? success() + : failure(); } mlir::LogicalResult mlir::pto::emitVPTOCubeDeviceObject( @@ -930,9 +945,12 @@ mlir::LogicalResult mlir::pto::emitVPTOCubeDeviceObject( return failure(); if (failed(writeLLVMModule(module, llPath, diagOS))) return failure(); - return compileLLVMToDeviceObject(llPath, outObjPath, - ObjectEmissionDeviceTarget::Cube, - toolchain, stderrPath, diagOS); + return compileDeviceLLVMToObject(llPath, outObjPath, + resolveTargetCPU(module, + ObjectEmissionDeviceTarget::Cube), + toolchain.bishengPath, stderrPath, diagOS) + ? success() + : failure(); } mlir::LogicalResult mlir::pto::emitFatobjLLVM( diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index b29a7f9f5a..4986a06858 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -119,6 +119,7 @@ void mlir::pto::registerPTOASPassesAndCLOptions() { mlir::pto::registerPTOInlineLibCall(); mlir::pto::registerFoldTileBufIntrinsics(); mlir::pto::registerExpandTileOp(); + mlir::pto::registerLowerPTOToUBufOps(); mlir::registerPassManagerCLOptions(); } @@ -1551,9 +1552,15 @@ static void lowerPTOToVPTOBackend(PassManager &pm, ModuleOp module, int argc, auto &kernelModulePM = pm.nest(); auto moduleArchAttr = module->getAttrOfType("pto.target_arch"); + const bool isA3 = moduleArchAttr && moduleArchAttr.getValue() == "a3"; const bool enableA5VPTOPostLoweringFusionLifecycle = enableOpFusion && moduleArchAttr && moduleArchAttr.getValue() == "a5"; + kernelModulePM.addNestedPass( + pto::createLowerPTOToUBufOpsPass()); + if (isA3) + return; + pto::ExpandTileOpOptions expandOpts = resolveExpandTileOpOptions(argc, argv); kernelModulePM.addPass(pto::createExpandTileOpPass(expandOpts)); @@ -1584,6 +1591,10 @@ buildVPTOEmissionOptions(const pto::CANNVersion &cannVersion) { options.dumpVPTOIR = false; options.targetTriple = "hiipu64-hisilicon-cce"; options.cannVersion = cannVersion; + std::string arch = ptoTargetArch; + for (char &c : arch) + c = static_cast(std::tolower(static_cast(c))); + options.march = (arch == "a3") ? "dav-c220-vec" : "dav-c310-vec"; return options; } @@ -1831,42 +1842,46 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass(pto::createLoweringSyncToPipePass()); if (!disableInferLayout) pm.addNestedPass(pto::createInferPTOLayoutPass()); - pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); - pm.addNestedPass( - pto::createPTOValidateIntToPtrUsesPass()); - - // Keep frontend fusion on tile-native PTO IR and annotate last_use directly - // on scheduled block-local spans before the shared mainline lowers tiles. - // The shape-inference switch drives FusionPlan only: that is where the - // iteration-domain decisions (static vs ShapeConstraintSolver) are made. - // FusionRegionGen consumes only the shared pre-fusion dataflow graph (cached - // by the analysis manager and built once by FusionPlan) plus the resulting - // pto.fusion.group_id/order metadata; it never consults the domain classes, - // so it takes no option here. - pto::FusionPlanOptions fusionPlanOpts; - fusionPlanOpts.enableShapeInference = enableShapeInference; - if (enableA5EmitCFusionPath) { + // A5-only: normalize movs, lower to memref, plan memory. + // A3 uses the LowerPTOToUBufOps path instead (pointer-based, no memref). + if (ptoTargetArch != "a3") { + pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); pm.addNestedPass( - pto::createFusionPlanPass(fusionPlanOpts)); - pm.addNestedPass(pto::createOpSchedulingPass()); - pm.addNestedPass(pto::createPTOMarkLastUsePass()); - } else if (enableA5VPTOFusionPath) { - pm.addNestedPass( - pto::createFusionPlanPass(fusionPlanOpts)); - pm.addNestedPass(pto::createOpSchedulingPass()); - pm.addNestedPass(pto::createPTOFusionRegionGenPass()); - } + pto::createPTOValidateIntToPtrUsesPass()); + + // Keep frontend fusion on tile-native PTO IR and annotate last_use directly + // on scheduled block-local spans before the shared mainline lowers tiles. + // The shape-inference switch drives FusionPlan only: that is where the + // iteration-domain decisions (static vs ShapeConstraintSolver) are made. + // FusionRegionGen consumes only the shared pre-fusion dataflow graph (cached + // by the analysis manager and built once by FusionPlan) plus the resulting + // pto.fusion.group_id/order metadata; it never consults the domain classes, + // so it takes no option here. + pto::FusionPlanOptions fusionPlanOpts; + fusionPlanOpts.enableShapeInference = enableShapeInference; + if (enableA5EmitCFusionPath) { + pm.addNestedPass( + pto::createFusionPlanPass(fusionPlanOpts)); + pm.addNestedPass(pto::createOpSchedulingPass()); + pm.addNestedPass(pto::createPTOMarkLastUsePass()); + } else if (enableA5VPTOFusionPath) { + pm.addNestedPass( + pto::createFusionPlanPass(fusionPlanOpts)); + pm.addNestedPass(pto::createOpSchedulingPass()); + pm.addNestedPass(pto::createPTOFusionRegionGenPass()); + } - pm.addPass(pto::createPTOViewToMemrefPass()); + pm.addPass(pto::createPTOViewToMemrefPass()); - if (effectiveLevel != PTOBuildLevel::Level3) { - PlanMemoryOptions planMemoryOption; - planMemoryOption.memMode = MemPlanMode::LOCAL_MEM_PLAN; - planMemoryOption.enableGlobalReuse = false; - planMemoryOption.enablePrintMemoryAllocatedSize = false; - pm.addPass(pto::createPlanMemoryPass(planMemoryOption)); + if (effectiveLevel != PTOBuildLevel::Level3) { + PlanMemoryOptions planMemoryOption; + planMemoryOption.memMode = MemPlanMode::LOCAL_MEM_PLAN; + planMemoryOption.enableGlobalReuse = false; + planMemoryOption.enablePrintMemoryAllocatedSize = false; + pm.addPass(pto::createPlanMemoryPass(planMemoryOption)); + } + pm.addPass(pto::createPTOResolveReservedBuffersPass()); } - pm.addPass(pto::createPTOResolveReservedBuffersPass()); // Conditionally add one automatic synchronization mode. Barrier-all is a // conservative standalone pass; InsertSync and GraphSyncSolver are set/wait From 98ced35f84f470b71d2fd20f85c4d05128f2d85b Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 11 Jun 2026 11:50:00 +0200 Subject: [PATCH 02/29] description of new pipeline --- docs/designs/a2a3-llvm-impl.md | 290 +++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 docs/designs/a2a3-llvm-impl.md diff --git a/docs/designs/a2a3-llvm-impl.md b/docs/designs/a2a3-llvm-impl.md new file mode 100644 index 0000000000..3b86cd0e2f --- /dev/null +++ b/docs/designs/a2a3-llvm-impl.md @@ -0,0 +1,290 @@ +# A3 VPTO LLVM Lowering Pipeline + +## Overview + +The A3 (`dav-c220-vec`) backend reuses the same top-level VPTO emission pipeline +as A5 (`dav-c310-vec`) but replaces the TileLang-template expansion path with a +direct pointer-based lowering of binary tile operations to UB intrinsics. + +## Pipeline: Shared vs Divergent + +### Shared passes (arch-independent) + +``` +runPipeline(module, march, diagOS, emit): + 1. VPTOSplitCVModule — split cube/vector sections into child modules + 2. VPTONormalizeContainer — canonicalize kernel container shape + 3. VPTOPtrNormalize — normalize ptr-like values into !pto.ptr + 4. VPTOPtrCastCleanup — collapse transient ptr-memref-ptr bridge casts + 5. VPTOExpandWrapperOps — expand DMA/bridge/mad/acc-store wrappers + 6. PTOInferVPTOVecScope — infer vecscope regions + 7. PrepareVPTOLLVMLowering — materialize vecscope carrier loops + 8. LowerVPTOOpsPass — pattern-based op → LLVM intrinsic lowering + 9. LowerVPTOTypesPass — type conversion (pto.ptr → llvm.ptr) + 10. Arith / SCF / CF / Func → LLVM (standard MLIR conversion passes) + 11. ReconcileUnrealizedCasts — cleanup +``` + +### Divergence: pre-VPTO backend pipeline + +``` +lowerPTOToVPTOBackend(pm): + + ┌─ A3 ────────────────────────────────────────────────────┐ + │ LowerPTOToUBufOps │ + │ pto.tadd / tsub / tmul / tdiv │ + │ → pto.ub.vadd / vsub / vmul / vdiv │ + │ + pto.ub.set_mask / set_mask_count / set_mask_norm │ + │ (pointer-based, !pto.ptr, no memref) │ + └─────────────────────────────────────────────────────────┘ + + ┌─ A5 ────────────────────────────────────────────────────┐ + │ ExpandTileOp │ + │ → TileLang DSL template expansion │ + │ InlineLibCall → FoldTileBufIntrinsics │ + │ pto.tadd → pto.vlds / vadd / vsts │ + │ (memref-based, vreg values) │ + └─────────────────────────────────────────────────────────┘ +``` + +### Divergence inside shared passes + +| Pass | A3 (`dav-c220-vec`) | A5 (`dav-c310-vec`) | +|---|---|---| +| **VPTOExpandWrapperOps** | v220 DMA: `nBurst=1`, `lenBurst>>5`, `scf.for` software loops | Standard DMA: dual-config calls, `nBurst` loop pairs | +| **LowerVPTOOpsPass** | UB binary ops → `llvm.hivm.VADD/VSUB/VMUL/VDIV.f32` + mask via `SBITSET1/SBITSET0` on CTRL[56] | Vector ops → `llvm.hivm.ADD/LOAD/STORE` | +| **CopyOp (DMA)** | 1-config: `MOV.OUT.TO.UB.v220` / `MOV.UB.TO.OUT.v220.1` | 2-config: `MOV.OUT.TO.UB.ALIGN.V2.s32.DV` / `MOV.UB.TO.OUT.ALIGN.V2.DV` | +| **makeDeviceEmissionOptions** | `dav-c220-vec`, features: `+ASAN,+ATOMIC,+FFTSBlk,+MOVX8,+MSTX,+MathOp` | `dav-c310-vec`, features: `+ArchV130,+F8e4m3,+F8e5m2,+Fp4e1m2x2,+LDExtRefine` | +| **configureVPTOOpLoweringTarget** | UB ops (`UBVaddOp`, `UBSetMaskOp`, etc.) marked illegal | Not present | + +## TADD → ub.vadd: Tile-size lowering examples + +### Repeat & stride calculation + +``` +elementsPerRepeat = 256 / sizeof(element) // 64 for f32, 128 for f16, 32 for f64 +totalElements = rows × cols +totalRepeats = totalElements / elementsPerRepeat + +blockStrides = (1, 1, 1) // always contiguous +repStride = elementsPerRepeat / 8 // 8 for f32, 16 for f16, 4 for f64 +``` + +### CCE VADD config layout (i64) + +| Bits | Field | +|---|---| +| 7:0 | repeat | +| 15:8 | dst block stride | +| 23:16 | src0 block stride | +| 31:24 | src1 block stride | +| 39:32 | dst repeat stride | +| 47:40 | src0 repeat stride | +| 55:48 | src1 repeat stride | +| 63:56 | simdFlag (=1) | + +### Example 1: 1×64 f32 — Direct count mode + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Computed: `elementsPerRepeat=64`, `totalElements=64`, `totalRepeats=1`. + +Output: +```mlir +%ub_dst = pto.tile_buf_addr %dst : !pto.tile_buf<...> → !pto.ptr +%ub_s0 = pto.tile_buf_addr %src0 : !pto.tile_buf<...> → !pto.ptr +%ub_s1 = pto.tile_buf_addr %src1 : !pto.tile_buf<...> → !pto.ptr +%c1 = arith.constant 1 : i64 +%c8 = arith.constant 8 : i64 + +pto.ub.set_mask_count // SBITSET1(ctrl, 56) +pto.ub.vadd %ub_dst, %ub_s0, %ub_s1, // VADD: repeat=1, all strides=1/1/1/8/8/8 + %c1, %c1, %c1, %c1, %c8, %c8, %c8 +pto.ub.set_mask_norm // SBITSET0(ctrl, 56) +pto.ub.set_mask %c-1_i64, %c0_i64 // full mask (mask0=-1, mask1=0) +``` + +After LLVM lowering: +```mlir +llvm.call @llvm.hivm.SBITSET1(%ctrl, %c56) // enter count mode +llvm.call @llvm.hivm.MOVEMASK(%c0, %c-1) // mask[0] = -1 +llvm.call @llvm.hivm.MOVEMASK(%c1, %c0) // mask[1] = 0 (64-lane f32) +llvm.call @llvm.hivm.VADD.f32(%ub_dst, %ub_s0, %ub_s1, %config) +llvm.call @llvm.hivm.SBITSET0(%ctrl, %c56) // exit count mode +``` + +### Example 2: 4×64 f32 — Multi-row count mode with scf.for + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Computed: `headRepeats=4`, `elementsPerRow=64`, `repeat=1` per row. + +Output: +```mlir +%c0 = arith.constant 0 : index +%c1 = arith.constant 1 : i64 +%c4 = arith.constant 4 : index +%c8 = arith.constant 8 : i64 + +%ub_dst = pto.tile_buf_addr %dst : !pto.ptr +%ub_s0 = pto.tile_buf_addr %src0 : !pto.ptr +%ub_s1 = pto.tile_buf_addr %src1 : !pto.ptr + +%row_dst = pto.addptr %ub_dst, %c0 : !pto.ptr +%row_s0 = pto.addptr %ub_s0, %c0 : !pto.ptr +%row_s1 = pto.addptr %ub_s1, %c0 : !pto.ptr + +scf.for %i = %c0 to %c4 step %c1 { + %off = arith.index_cast %i : index to i64 + %rd = pto.addptr %row_dst, %off : !pto.ptr + %r0 = pto.addptr %row_s0, %off : !pto.ptr + %r1 = pto.addptr %row_s1, %off : !pto.ptr + + pto.ub.set_mask_count + pto.ub.vadd %rd, %r0, %r1, %c1, %c1, %c1, %c1, %c8, %c8, %c8 + pto.ub.set_mask_norm +} +pto.ub.set_mask %c-1_i64, %c0_i64 +``` + +### Example 3: 16×64 f32 — Larger multi-row + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Same pattern as 4×64 but `scf.for` iterates 16 times. One `VADD` per row: +``` +scf.for %i = 0 to 16 step 1 { + pto.ub.set_mask_count + pto.ub.vadd ... // repeat=1 per row + pto.ub.set_mask_norm +} +``` + +### Example 4: 32×32 f32 — Square tile + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Computed: `totalElements=1024`, `elementsPerRepeat=64`, `totalRepeats=16`. With `headRepeats=32` rows, each row has `32/64 = 1` repeat → same `scf.for` per-row pattern, 32 iterations. + +### Example 5: 4×96 f32, v_col=32 — Multiple repeats per row + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Computed: `totalV = 4×32 = 128`, `elementsPerRepeat = 64`, `totalRepeats = 128/64 = 2` per call but `totalV > REPEAT_MAX(255)` triggers count mode. + +Output: count mode, 2 repeats per row, 4 rows via scf.for. + +### Example 6: 16×1024 f32 — Chunked (repeat > 255) + +Input: +```mlir +%t = pto.alloc_tile : !pto.tile_buf +pto.tadd ins(%src0, %src1 : ...) outs(%dst : ...) +``` + +Computed: `totalElements=16384`, `elementsPerRepeat=64`, `totalRepeats=256`, which equals `REPEAT_MAX`. Count mode, no `scf.for` (single VADD with repeat=256): + +```mlir +pto.ub.set_mask_count +pto.ub.set_mask %c256_i64, %c0_i64 // mask0 = 256 (count mode: mask count in mask[0]) +pto.ub.vadd %dst, %src0, %src1, %c256, %c1, %c1, %c1, %c8, %c8, %c8 +pto.ub.set_mask_norm +pto.ub.set_mask %c-1_i64, %c0_i64 // restore full mask +``` + +### Example 7: A5 — No UB lowering + +On A5 targets, `pto.tadd` passes through `LowerPTOToUBufOps` unchanged and is later expanded via `ExpandTileOp` into the TileLang DSL template path: + +```mlir +// VPTO IR (after ExpandTileOp + inlining): +pto.vecscope { + %v0 = pto.vlds %src0_memref : memref<...> + %v1 = pto.vlds %src1_memref : memref<...> + %v2 = pto.vadd %v0, %v1 : !pto.vreg + pto.vsts %v2, %dst_memref : memref<...> +} +``` + +No `pto.ub.vadd` or `llvm.hivm.VADD.f32` appears. + +### Mask / control-flow modes + +| Mode | Condition | Pattern | +|---|---|---| +| **count mode** | `totalV > kRepeatMax` (255) or row-repeat with count | `SBITSET1(ctrl,56)` → `MOVEMASK(0,count)` → `VADD` → `SBITSET0(ctrl,56)` | +| **norm mode (head+tail)** | `totalRepeats ≤ kRepeatMax` | Head VADD → tail mask VADD | +| **norm mode small** | `v_col < 32`, head+tail ≤ max | Same as head+tail but per chunk via `scf.for` | +| **norm mode 1L** | Single row, repeat ≤ max | Direct norm mode VADD | +| **full mask** | After all VADDs | `MOVEMASK(0,-1)` + `MOVEMASK(1,0)` for 64-lane f32 | + +### C220 COUNT mode limitation + +On `dav-c220-vec`, count mode only supports `repeat=1`. Multi-element count mode +(`repeat > 1`) causes CCE errors. As a result: + +- **repeat=1**: direct count mode (no loop) +- **repeat>1, rows=1**: split into per-chunk `scf.for` with repeat=1 each (`modeCount1L`) +- **repeat>1, rows>1**: per-row `scf.for` with repeat=1 each (`modeNormal1L`) +- **repeat=0** (`modeCount1L`): broken on C220, routed to head+tail path + +Test cases `1×80` and `256×64` are excluded from on-device tests due to this +limitation; they fall back to the head+tail norm path. + +## Full lowering chain: TADD example + +``` +PTO DSL: pto.tile.add(a_tile, b_tile, c_tile) + ↓ +PTO IR: pto.tadd ins(%a, %b) outs(%c) + ↓ LowerPTOToUBufOps (A3 only) +UB IR: pto.ub.set_mask_count + pto.ub.vadd %dst, %src0, %src1, repeat=1, blkStrides=(1,1,1), repStrides=(8,8,8) + pto.ub.set_mask_norm + pto.ub.set_mask %c-1, %c0 + ↓ Lower copy ops +Copy IR: pto.copy_gm_to_ubuf / pto.copy_ubuf_to_gm (v220 DMA) + ↓ LowerVPTOOpsPass (A3 patterns) +LLVM IR: llvm.call @llvm.hivm.SBITSET1(%ctrl, %56) + llvm.call @llvm.hivm.MOVEMASK(%0, %-1) + llvm.call @llvm.hivm.MOVEMASK(%1, %0) + llvm.call @llvm.hivm.VADD.f32(%dst, %src0, %src1, %config) + llvm.call @llvm.hivm.SBITSET0(%ctrl, %56) + llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220(...) + llvm.call @llvm.hivm.MOV.UB.TO.OUT.v220.1(...) + ↓ bisheng +Binary: native AICORE binary +``` + +## Summary table + +| Aspect | A3 | A5 | +|---|---|---| +| **Lowering strategy** | Direct pointer-based: `pto.tadd → ub.vadd → llvm.hivm.VADD` | Template expansion: `pto.tadd → TileLang DSL → vlds/vadd/vsts` | +| **Memory model** | `!pto.ptr` pointers, no memref | `memref` alloc/load/store | +| **DMA** | v220 single-config, software loops | Dual-config, hardware nBurst loops | +| **Mask/control** | `SBITSET1/SBITSET0` on CTRL bit 56 for count mode | `SET_FLAG/WAIT_FLAG` synchronization | +| **Passes added** | `LowerPTOToUBufOps` (1 new pass) | `ExpandTileOp` + `InlineLibCall` + `FoldTileBufIntrinsics` | +| **New ops (6)** | `pto.ub.{vadd,vsub,vmul,vdiv,set_mask_count,set_mask_norm}` | none | +| **Intrinsics** | `llvm.hivm.{VADD,VSUB,VMUL,VDIV}.f32` | `llvm.hivm.{ADD,LOAD,STORE}` | +| **Relevant files** | `LowerPTOToUBufOps.cpp`, `VPTOUbOps.td`, `VPTOUbOps.cpp`, `VPTOLLVMEmitter.cpp`, `VPTOExpandWrapperOps.cpp`, `ObjectEmission.cpp` | `ExpandTileOp.cpp`, `FoldTileBufIntrinsics.cpp`, `VPTOLLVMEmitter.cpp` | From 6c4fafbcc70b80d4160ca8877f0e4ac4d6cfaf3c Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Tue, 30 Jun 2026 17:08:33 +0200 Subject: [PATCH 03/29] fixes after rebase --- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 38 ++++++++++++++++++++++++++ ptodsl/ptodsl/_runtime/toolchain.py | 4 +-- tools/ptoas/VPTOFatobjEmission.h | 27 ++++++++++++++++++ tools/ptoas/ptoas.cpp | 31 +++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 tools/ptoas/VPTOFatobjEmission.h diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index ab7975f7a2..6c33a1b644 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -10739,6 +10739,42 @@ getUniqueDeviceModuleByKernelKind(ModuleOp module, FunctionKernelKind kind, return matched; } +static void mergeDeviceModulesByKernelKind(ModuleOp module) { + ModuleOp vectorModule; + ModuleOp cubeModule; + SmallVector modulesToErase; + + for (ModuleOp child : module.getOps()) { + auto kernelKind = getKernelKind(child); + if (!kernelKind) + continue; + + ModuleOp *target = nullptr; + if (*kernelKind == FunctionKernelKind::Vector) + target = &vectorModule; + else if (*kernelKind == FunctionKernelKind::Cube) + target = &cubeModule; + else + continue; + + if (!*target) { + *target = child; + continue; + } + + Block *srcBody = child.getBody(); + Block *dstBody = (*target).getBody(); + while (!srcBody->empty()) { + Operation &op = srcBody->front(); + op.moveBefore(dstBody, dstBody->end()); + } + modulesToErase.push_back(child); + } + + for (ModuleOp child : modulesToErase) + child.erase(); +} + static LogicalResult renameKernelFunctionsForKernelKind(ModuleOp module, llvm::raw_ostream &diagOS) { auto kernelKind = getKernelKind(module); @@ -10938,6 +10974,8 @@ static LogicalResult runPipeline(ModuleOp module, const std::string &march, OwningOpRef clonedOp(module->clone()); ModuleOp clonedModule = cast(*clonedOp); + mergeDeviceModulesByKernelKind(clonedModule); + if (failed(validateVPTOAuthoringIR(clonedModule, &diagOS))) { diagOS << "VPTO LLVM emission failed: authoring-stage VPTO legality " "validation failed\n"; diff --git a/ptodsl/ptodsl/_runtime/toolchain.py b/ptodsl/ptodsl/_runtime/toolchain.py index a3f1b7d9d6..0b76470547 100644 --- a/ptodsl/ptodsl/_runtime/toolchain.py +++ b/ptodsl/ptodsl/_runtime/toolchain.py @@ -34,8 +34,8 @@ def resolve_ptoas_binary() -> Path: return candidate for start in [Path.cwd()] + list(Path.cwd().parents): - for pattern in [start / "install" / "bin" / "ptoas", - start / "build" / "tools" / "ptoas" / "ptoas"]: + for pattern in [start / "build" / "tools" / "ptoas" / "ptoas", + start / "install" / "bin" / "ptoas"]: if pattern.is_file(): return pattern diff --git a/tools/ptoas/VPTOFatobjEmission.h b/tools/ptoas/VPTOFatobjEmission.h new file mode 100644 index 0000000000..e1524580b8 --- /dev/null +++ b/tools/ptoas/VPTOFatobjEmission.h @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +#ifndef PTOAS_VPTO_FATOBJ_EMISSION_H +#define PTOAS_VPTO_FATOBJ_EMISSION_H + +#include "ObjectEmission.h" + +namespace mlir::pto { + +inline LogicalResult emitVPTOFatobj(llvm::Module *cubeModule, + llvm::Module *vectorModule, + llvm::StringRef stubSource, + llvm::ToolOutputFile &outputFile, + llvm::raw_ostream &diagOS) { + return emitFatobjLLVMWithRuntime(cubeModule, vectorModule, stubSource, + outputFile, diagOS); +} + +} // namespace mlir::pto + +#endif diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index 4986a06858..f67815c817 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -1819,6 +1819,37 @@ int mlir::pto::compilePTOASModule( context.getCANNVersionOrDefault()); } + // When the module has nested child builtin.module ops (BACKEND_PARTITIONED + // or NESTED PTODSL layout), flatten them into the outer module so that + // FuncOp-level passes (InsertSync, InjectBarrierAllSync, etc.) can reach + // the functions. addNestedPass does not descend into child + // builtin.module ops. + { + SmallVector childModules; + for (ModuleOp child : module->getOps()) + childModules.push_back(child); + for (ModuleOp child : childModules) { + // Copy child module attributes to outer (skip pto.backend which is + // already set on the outer module by the backend job). + for (NamedAttribute attr : child->getAttrs()) { + StringRef attrName = attr.getName().getValue(); + if (attrName == "pto.backend" || attrName == "sym_name") + continue; + Operation *outerOp = module->getOperation(); + if (!outerOp->hasAttr(attrName)) + outerOp->setAttr(attr.getName(), attr.getValue()); + } + // Move all ops from child into outer. + Block *childBody = child.getBody(); + Block *outerBody = module->getBody(); + while (!childBody->empty()) { + Operation &op = childBody->front(); + op.moveBefore(outerBody, outerBody->end()); + } + child.erase(); + } + } + // Main PassManager PassManager pm(module->getContext()); From 3d30420ee43d5ab47c640c9643b26611e5ccee9a Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 1 Jul 2026 13:04:32 +0200 Subject: [PATCH 04/29] add binary e2e tests --- ptodsl/tests/__init__.py | 0 ptodsl/tests/e2e/README.md | 77 +++++++++++ ptodsl/tests/e2e/__init__.py | 0 ptodsl/tests/e2e/common.py | 139 +++++++++++++++++++ ptodsl/tests/e2e/conftest.py | 96 +++++++++++++ ptodsl/tests/e2e/test_binary_elementwise.py | 141 ++++++++++++++++++++ 6 files changed, 453 insertions(+) create mode 100644 ptodsl/tests/__init__.py create mode 100644 ptodsl/tests/e2e/README.md create mode 100644 ptodsl/tests/e2e/__init__.py create mode 100644 ptodsl/tests/e2e/common.py create mode 100644 ptodsl/tests/e2e/conftest.py create mode 100644 ptodsl/tests/e2e/test_binary_elementwise.py diff --git a/ptodsl/tests/__init__.py b/ptodsl/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md new file mode 100644 index 0000000000..53a28ea900 --- /dev/null +++ b/ptodsl/tests/e2e/README.md @@ -0,0 +1,77 @@ +# A3 VPTO e2e tests + +End-to-end numerical-correctness tests for PTODSL vector ops on A3 hardware +using the VPTO backend. + +## Quick start + +```bash +# From repo root inside the hardware docker image: +cd /workspace && PYTHONPATH=/workspace/ptodsl python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v + +# Run a single test +python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "add-float32-1x64" + +# Run all f32 tests +python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "float32" + +# Run only div tests +python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "div" +``` + +## Test matrix + +### Binary elementwise (tadd/tsub/tmul/tdiv) + +| Category | Ops | Dtypes | Shapes | Total | +|----------|-----|--------|--------|-------| +| f32 | add, sub, mul, div | float32 | 12 | 48 | +| f16 | add, sub, mul, div | float16 | 6 | 24 | + +### Shape coverage (exercises lowering code paths) + +**f32** (`elementsPerRepeat=64`): + +| Shape | Lowering Path | +|-------|---------------| +| (1, 32) | modeSmall single-row | +| (4, 32) | modeSmall multi-row | +| (11, 32) | modeSmall multi-row odd | +| (1, 64) | modeNorm1L single-repeat | +| (1, 128) | modeNorm1L multi-repeat aligned | +| (64, 64) | modeNorm1L square aligned | +| (16, 64) | modeNorm1L multi-row aligned | +| (16, 128) | modeNorm1L 16x128 | +| (4, 256) | modeNorm1L 4x256 | +| (1, 1024) | modeNorm1L 16-repeat | +| (16, 256) | modeNorm1L 16x256 | +| (32, 32) | modeSmall 32x32 square small | +| (1, 200) | modeNorm1L 1x200 tail | +| (32, 100) | modeCount1L nonVLAligned odd rows | +| (4, 200) | modeCount1L 4x200 | +| (32, 32) | modeSmall 32x32 square small | + +**f16** (`elementsPerRepeat=128`): + +| Shape | Lowering Path | +|-------|---------------| +| (1, 64) | modeSmall 1x64 | +| (4, 64) | modeSmall 4x64 | +| (1, 128) | modeNorm1L single-repeat | +| (16, 128) | modeNorm1L 16x128 | +| (64, 128) | modeNorm1L multi-row | +| (1, 512) | modeNorm1L 4-repeat | + +## Adding new test categories + +1. Create a new test file in `ptodsl/tests/e2e/` (e.g. `test_elementwise_unary.py`) +2. Add a kernel builder function in `common.py` +3. Parametrize over ops, dtypes, and shapes using the `make_binary_kernel` / `launch_and_check` pattern +4. Run with pytest + +## Requirements + +- NPU device with torch_npu installed +- ptoas and bisheng on PATH +- Properly built PTOAS with Python bindings (MLIR 19.1) +- Docker image: `cce-mlir-dev-npu-aarch64-llvm19-cann900` diff --git a/ptodsl/tests/e2e/__init__.py b/ptodsl/tests/e2e/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py new file mode 100644 index 0000000000..58ebec9229 --- /dev/null +++ b/ptodsl/tests/e2e/common.py @@ -0,0 +1,139 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. + +"""Shared e2e test harness: kernel builders, launch, and reference functions.""" + +# NOTE: do NOT add "from __future__ import annotations" here. +# make_binary_kernel uses dynamic annotation expressions (pto.ptr(pto_dtype, "gm")) +# which must be evaluated at definition time, not stored as strings. + +import time +from typing import Callable + +import numpy as np + +from ptodsl import pto + +BINARY_OPS = { + "add": (pto.tile.add, lambda x, y: x + y), + "sub": (pto.tile.sub, lambda x, y: x - y), + "mul": (pto.tile.mul, lambda x, y: x * y), + "div": (pto.tile.div, lambda x, y: x / (y + 1e-8)), +} + + +def _npu_stream(torch): + return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 + + +def _torch_dtype(torch, dtype_str: str): + return getattr(torch, dtype_str) + + +def make_binary_kernel( + op_name: str, + rows: int, + cols: int, + dtype_str: str = "float32", + target: str = "a3", + backend: str = "vpto", + kernel_kind: str = "vector", +): + """Return a ``@pto.jit`` KernelHandle for an elementwise binary op. + + The generated kernel uses the same 5-D tile-buffer pattern as the + ``tadd_launch_a3.py`` / ``bop_launch_a3.py`` examples. + """ + tile_op_fn = BINARY_OPS[op_name][0] + pto_dtype = getattr(pto, dtype_str) + fn_name = f"bin_{op_name}_{dtype_str}_{rows}x{cols}" + + def kernel_body( + A_ptr: pto.ptr(pto_dtype, "gm"), + B_ptr: pto.ptr(pto_dtype, "gm"), + C_ptr: pto.ptr(pto_dtype, "gm"), + ) -> None: + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A_ptr, shape=shape, strides=strides) + b_view = pto.make_tensor_view(B_ptr, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C_ptr, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + b_part = pto.partition_view(b_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + b_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + + pto.tile.load(a_part, a_tile) + pto.tile.load(b_part, b_tile) + tile_op_fn(a_tile, b_tile, c_tile) + pto.tile.store(c_tile, c_part) + + kernel_body.__name__ = fn_name + return pto.jit( + name=fn_name, + kernel_kind=kernel_kind, + target=target, + backend=backend, + )(kernel_body) + + +def make_input(shape, dtype, torch, seed=42): + """Return an NPU tensor filled with seeded random small integers. + + Small integers ensure exact fp results, avoiding rounding differences + on different hardware paths. + """ + rng = np.random.RandomState(seed) + x = rng.randint(1, 10, size=shape).astype(np.float32) + return torch.from_numpy(x).to(device="npu:0", dtype=dtype) + + +def launch_and_check( + *, + kernel_handle, + ref_fn: Callable, + shape: tuple[int, int], + dtype_str: str, + torch, + rtol: float = 1e-6, + atol: float = 1e-6, + seed: int = 42, +): + """Compile, launch, and numerical-check one kernel specialization.""" + torch_dt = _torch_dtype(torch, dtype_str) + + x = make_input(shape, torch_dt, torch, seed=seed) + y = make_input(shape, torch_dt, torch, seed=seed + 1) + z = torch.empty(shape, dtype=torch_dt, device="npu:0") + ref = ref_fn(x.cpu().numpy(), y.cpu().numpy()) + stream = _npu_stream(torch) + + t0 = time.perf_counter() + compiled = kernel_handle.compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](x.data_ptr(), y.data_ptr(), z.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + actual = z.cpu().numpy() + np.testing.assert_allclose(actual, ref, rtol=rtol, atol=atol) + return compile_s, launch_s diff --git a/ptodsl/tests/e2e/conftest.py b/ptodsl/tests/e2e/conftest.py new file mode 100644 index 0000000000..788abe2337 --- /dev/null +++ b/ptodsl/tests/e2e/conftest.py @@ -0,0 +1,96 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. + +"""Pytest configuration for e2e A3/A5 VPTO/EmitC tests.""" + +from __future__ import annotations + +from pathlib import Path +import sys + +import pytest + + +# Ensure ptodsl package is importable. When pytest is invoked from the repo +# root, ptodsl is already on sys.path; this handles direct invocation inside +# ptodsl/tests/e2e/ as well. +_bootstrap_dir = None +for _parent in Path(__file__).resolve().parents: + if (_parent / "ptodsl" / "__init__.py").exists(): + _bootstrap_dir = _parent + break +if _bootstrap_dir is not None and str(_bootstrap_dir) not in sys.path: + sys.path.insert(0, str(_bootstrap_dir)) + + +def pytest_addoption(parser): + parser.addoption( + "--target", + default="a3", + choices=["a3", "a5"], + help="Target Ascend architecture (default: a3)", + ) + parser.addoption( + "--backend", + default="vpto", + choices=["vpto", "emitc"], + help="PTOAS backend (default: vpto)", + ) + + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "require_npu: mark test as requiring an NPU device with torch_npu installed", + ) + config.addinivalue_line( + "markers", + "target(a3|a5): restrict test to a specific target architecture", + ) + + +@pytest.fixture(scope="session") +def torch(): + """Initialize torch_npu and return torch module (session-scoped).""" + import torch + import torch_npu # noqa: F401 + + torch.npu.config.allow_internal_format = False + torch_npu.npu.set_compile_mode(jit_compile=False) + torch.npu.set_device("npu:0") + return torch + + +@pytest.fixture(scope="session") +def target_arch(request): + return request.config.getoption("--target") + + +@pytest.fixture(scope="session") +def backend(request): + return request.config.getoption("--backend") + + +# --------------------------------------------------------------------------- +# Lazy helpers (import torch/ptodsl only when needed) +# --------------------------------------------------------------------------- + +def torch_dtype(name: str): + import torch + + return getattr(torch, name) + + +def pto_dtype(name: str): + from ptodsl import pto + + return getattr(pto, name) + + +def npu_stream(torch): + return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 diff --git a/ptodsl/tests/e2e/test_binary_elementwise.py b/ptodsl/tests/e2e/test_binary_elementwise.py new file mode 100644 index 0000000000..4d21bb5c5f --- /dev/null +++ b/ptodsl/tests/e2e/test_binary_elementwise.py @@ -0,0 +1,141 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. + +""" +e2e tests for A3 VPTO binary elementwise ops (tadd / tsub / tmul / tdiv). + +Exercises every lowering code path in ``LowerPTOToUBufOps::dispatch`` via +a systematic shape × dtype matrix. + +Run: + pytest ptodsl/tests/e2e/test_binary_elementwise.py -v + +Filter: + pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "add-float32-1x64" +""" + +from __future__ import annotations + +import pytest + +from .common import BINARY_OPS, make_binary_kernel, launch_and_check + + +# --------------------------------------------------------------------------- +# Shape matrix — each entry maps to a specific CodePath (see dispatch tree in +# lib/PTO/Transforms/LowerPTOToUBufOps.cpp:702-743) +# --------------------------------------------------------------------------- + +F32_EPR = 64 # elementsPerRepeat = 256 / sizeof(f32) + +F32_SHAPES: list[tuple[int, int, str]] = [ + # modeSmall, single-row: rows≤255, cols < epr + (1, 32, "modeSmall single-row"), + # modeSmall, multi-row loop: rows≤255, cols < epr, vRows>1 + (4, 32, "modeSmall multi-row"), + (11, 32, "modeSmall multi-row odd"), + # modeNorm1L, single repeat: continuous, headRepeats=1, no tail + (1, F32_EPR, "modeNorm1L single-repeat"), + # modeNorm1L, multi-repeat no tail: continuous, headRepeats≥1, aligned + (1, F32_EPR * 2, "modeNorm1L multi-repeat aligned"), + (F32_EPR, F32_EPR, "modeNorm1L square aligned"), + (16, F32_EPR, "modeNorm1L multi-row aligned"), + (16, F32_EPR * 2, "modeNorm1L 16x128"), + (4, F32_EPR * 4, "modeNorm1L 4x256"), + (1, F32_EPR * 16, "modeNorm1L 16-repeat"), + # Large tiles (exercises multi-repeat and UB bank layout) + (16, 256, "modeNorm1L 16x256"), + (32, 32, "modeSmall 32x32 square small"), +] + +F16_EPR = 128 # elementsPerRepeat = 256 / sizeof(f16) + +F16_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall 1x64 f16"), + (4, 64, "modeSmall 4x64 f16"), + (1, F16_EPR, "modeNorm1L single-repeat f16"), + (16, F16_EPR, "modeNorm1L 16x128 f16"), + (F16_EPR // 2, F16_EPR, "modeNorm1L multi-row f16"), + (1, F16_EPR * 4, "modeNorm1L 4-repeat f16"), +] + +OPS = [(name, ref_fn) for name, (_, ref_fn) in BINARY_OPS.items()] + + +def _shape_id(rows, cols, desc): + return f"{rows}x{cols}-{desc.replace(' ', '-')}" + + +# --------------------------------------------------------------------------- +# f32 tests +# --------------------------------------------------------------------------- + +F32_PARAMS = [ + pytest.param( + (op_name, ref_fn, "float32", rows, cols, desc), + id=f"{op_name}-float32-{_shape_id(rows, cols, desc)}", + ) + for op_name, ref_fn in OPS + for rows, cols, desc in F32_SHAPES +] + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F32_PARAMS) +def test_binary_f32(case, torch, target_arch, backend): + op_name, ref_fn, dtype_str, rows, cols, desc = case + + kernel = make_binary_kernel( + op_name, rows, cols, dtype_str=dtype_str, + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check( + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + dtype_str=dtype_str, + torch=torch, + ) + print(f" PASS {op_name} {dtype_str} {rows}x{cols} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") + + +# --------------------------------------------------------------------------- +# f16 tests +# --------------------------------------------------------------------------- + +F16_PARAMS = [ + pytest.param( + (op_name, ref_fn, "float16", rows, cols, desc), + id=f"{op_name}-float16-{_shape_id(rows, cols, desc)}", + ) + for op_name, ref_fn in OPS + for rows, cols, desc in F16_SHAPES +] + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F16_PARAMS) +def test_binary_f16(case, torch, target_arch, backend): + op_name, ref_fn, dtype_str, rows, cols, desc = case + + kernel = make_binary_kernel( + op_name, rows, cols, dtype_str=dtype_str, + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check( + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + dtype_str=dtype_str, + torch=torch, + rtol=1e-3, + atol=1e-3, + ) + print(f" PASS {op_name} {dtype_str} {rows}x{cols} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") From 3883ae6478ea4c3707cdcf26cbe5c77d8a19029b Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 1 Jul 2026 13:29:45 +0200 Subject: [PATCH 05/29] update readme --- ptodsl/tests/e2e/README.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md index 53a28ea900..d0f92bc2ef 100644 --- a/ptodsl/tests/e2e/README.md +++ b/ptodsl/tests/e2e/README.md @@ -1,7 +1,5 @@ -# A3 VPTO e2e tests - -End-to-end numerical-correctness tests for PTODSL vector ops on A3 hardware -using the VPTO backend. +# e2e tests +End-to-end numerical-correctness tests for PTODSL vector ops. ## Quick start @@ -19,6 +17,16 @@ python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "float32" python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "div" ``` +## Hardware and backend selection +### A3 vpto backend +This is the default, or can be selected with `--backend vpto --vpto-target a3`. + +### A3 emitc backend +This can be selected with `--backend emitc --vpto-target a3`. + +### A5 vpto backend +This can be selected with `--backend vpto --vpto-target a5`. + ## Test matrix ### Binary elementwise (tadd/tsub/tmul/tdiv) @@ -74,4 +82,3 @@ python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "div" - NPU device with torch_npu installed - ptoas and bisheng on PATH - Properly built PTOAS with Python bindings (MLIR 19.1) -- Docker image: `cce-mlir-dev-npu-aarch64-llvm19-cann900` From 8f4a25ed0b08dac447df188b076b9c4d357c547b Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 1 Jul 2026 14:26:39 +0200 Subject: [PATCH 06/29] all binary ops without scratchpad --- docker/Dockerfile.dev | 2 +- include/PTO/IR/VPTOUbOps.td | 7 + lib/PTO/IR/VPTO.cpp | 161 ++++++++++++++++++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 140 +++++++++++++++++ lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 35 +++++ ptodsl/tests/e2e/README.md | 7 +- ptodsl/tests/e2e/common.py | 45 +++++- ptodsl/tests/e2e/test_binary_elementwise.py | 43 +++++- test/lit/vpto/ub/lower_bitwise_to_ub.pto | 64 ++++++++ test/lit/vpto/ub/lower_tmax_to_ubvmax.pto | 33 ++++ test/lit/vpto/ub/lower_tmin_to_ubvmin.pto | 23 +++ test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto | 53 +++++++ test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto | 45 ++++++ 13 files changed, 652 insertions(+), 6 deletions(-) create mode 100644 test/lit/vpto/ub/lower_bitwise_to_ub.pto create mode 100644 test/lit/vpto/ub/lower_tmax_to_ubvmax.pto create mode 100644 test/lit/vpto/ub/lower_tmin_to_ubvmin.pto create mode 100644 test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto create mode 100644 test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 1fac15b39a..c877e1536a 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -34,7 +34,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # ========================================================================= # 2. Python dependencies # ========================================================================= -RUN pip install --no-cache-dir 'pybind11<3' numpy pyyaml +RUN pip install --no-cache-dir 'pybind11<3' numpy pyyaml pytest # ========================================================================= # 3. Build LLVM/MLIR (vpto fork, feature-vpto branch) diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index fc1da8a178..c4f86a2fe0 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -61,6 +61,13 @@ def PTO_UBVaddOp : PTO_UBufBinaryOp<"ub.vadd">; def PTO_UBVsubOp : PTO_UBufBinaryOp<"ub.vsub">; def PTO_UBVmulOp : PTO_UBufBinaryOp<"ub.vmul">; def PTO_UBVdivOp : PTO_UBufBinaryOp<"ub.vdiv">; +def PTO_UBVmaxOp : PTO_UBufBinaryOp<"ub.vmax">; +def PTO_UBVminOp : PTO_UBufBinaryOp<"ub.vmin">; +def PTO_UBVandOp : PTO_UBufBinaryOp<"ub.vand">; +def PTO_UBVorOp : PTO_UBufBinaryOp<"ub.vor">; +def PTO_UBVxorOp : PTO_UBufBinaryOp<"ub.vxor">; +def PTO_UBVshlOp : PTO_UBufBinaryOp<"ub.vshl">; +def PTO_UBVshrOp : PTO_UBufBinaryOp<"ub.vshr">; def PTO_UBSetMaskOp : PTO_Op<"ub.set_mask", [ DeclareOpInterfaceMethods diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index e35bc04e22..044a0b776d 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -7915,3 +7915,164 @@ LogicalResult UBVdivOp::verify() { return emitOpError("requires UB-backed operands"); return success(); } + +//===----------------------------------------------------------------------===// +// UBVmaxOp +//===----------------------------------------------------------------------===// + +void UBVmaxOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVmaxOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVminOp +//===----------------------------------------------------------------------===// + +void UBVminOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVminOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVandOp +//===----------------------------------------------------------------------===// + +void UBVandOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVandOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVorOp +//===----------------------------------------------------------------------===// + +void UBVorOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVorOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVxorOp +//===----------------------------------------------------------------------===// + +void UBVxorOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVxorOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVshlOp +//===----------------------------------------------------------------------===// + +void UBVshlOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVshlOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVshrOp +//===----------------------------------------------------------------------===// + +void UBVshrOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVshrOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || + !isBufferLike(getSrc1().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 9bc1ef1945..0263aac50c 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -330,6 +330,146 @@ struct LowerPTOToUBufOpsPass } } + // ---- tmax → pto.ub.vmax ---- + { + SmallVector ops; + func.walk([&](pto::TMaxOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tmin → pto.ub.vmin ---- + { + SmallVector ops; + func.walk([&](pto::TMinOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tand → pto.ub.vand ---- + { + SmallVector ops; + func.walk([&](pto::TAndOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tor → pto.ub.vor ---- + { + SmallVector ops; + func.walk([&](pto::TOrOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- txor → pto.ub.vxor ---- + { + SmallVector ops; + func.walk([&](pto::TXorOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tshl → pto.ub.vshl ---- + { + SmallVector ops; + func.walk([&](pto::TShlOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + + // ---- tshr → pto.ub.vshr ---- + { + SmallVector ops; + func.walk([&](pto::TShrOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + op.erase(); + } + } + // ---- tload → mte_gm_ub ---- SmallVector tloadOps; func.walk([&](pto::TLoadOp op) { tloadOps.push_back(op); }); diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 6c33a1b644..784859deff 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4631,6 +4631,20 @@ class LowerUBufBinaryOpPattern final : public OpConversionPattern { calleeName = "llvm.hivm.VMUL." + elemFrag; else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VDIV." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMAX." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMIN." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VAND." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VOR." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VXOR." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSHL." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSHR." + elemFrag; else return rewriter.notifyMatchFailure(op, "unsupported ubuf binary op"); @@ -10361,6 +10375,20 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); patterns.add( typeConverter, patterns.getContext(), state); patterns.add( @@ -10489,6 +10517,13 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md index d0f92bc2ef..9c2238b828 100644 --- a/ptodsl/tests/e2e/README.md +++ b/ptodsl/tests/e2e/README.md @@ -29,12 +29,13 @@ This can be selected with `--backend vpto --vpto-target a5`. ## Test matrix -### Binary elementwise (tadd/tsub/tmul/tdiv) +### Binary elementwise (tadd/tsub/tmul/tdiv/tmax/tmin/tand/tor) | Category | Ops | Dtypes | Shapes | Total | |----------|-----|--------|--------|-------| -| f32 | add, sub, mul, div | float32 | 12 | 48 | -| f16 | add, sub, mul, div | float16 | 6 | 24 | +| f32 | add, sub, mul, div, max, min | float32 | 12 | 72 | +| f16 | add, sub, mul, div, max, min | float16 | 6 | 36 | +| i16 | bit_and, bit_or | int16 | 5 | 10 | ### Shape coverage (exercises lowering code paths) diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index 58ebec9229..90ed9abc5d 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -24,6 +24,13 @@ "sub": (pto.tile.sub, lambda x, y: x - y), "mul": (pto.tile.mul, lambda x, y: x * y), "div": (pto.tile.div, lambda x, y: x / (y + 1e-8)), + "max": (pto.tile.max, lambda x, y: np.maximum(x, y)), + "min": (pto.tile.min, lambda x, y: np.minimum(x, y)), +} + +INT_OPS = { + "bit_and": (pto.tile.bit_and, lambda x, y: x & y), + "bit_or": (pto.tile.bit_or, lambda x, y: x | y), } @@ -35,6 +42,42 @@ def _torch_dtype(torch, dtype_str: str): return getattr(torch, dtype_str) +def make_input_int(shape, torch, seed=42): + """Return an NPU i16 tensor filled with small positive integers.""" + rng = np.random.RandomState(seed) + x = rng.randint(0, 100, size=shape).astype(np.int16) + return torch.from_numpy(x).to(device="npu:0", dtype=torch.int16) + + +def launch_and_check_int( + *, + kernel_handle, + ref_fn: Callable, + shape: tuple[int, int], + torch, + seed: int = 42, +): + """Compile, launch, and numerical-check one i16 kernel specialization.""" + x = make_input_int(shape, torch, seed=seed) + y = make_input_int(shape, torch, seed=seed + 1) + z = torch.empty(shape, dtype=torch.int16, device="npu:0") + ref = ref_fn(x.cpu().numpy(), y.cpu().numpy()).astype(np.int16) + stream = _npu_stream(torch) + + t0 = time.perf_counter() + compiled = kernel_handle.compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](x.data_ptr(), y.data_ptr(), z.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + actual = z.cpu().numpy() + np.testing.assert_array_equal(actual, ref) + return compile_s, launch_s + + def make_binary_kernel( op_name: str, rows: int, @@ -49,7 +92,7 @@ def make_binary_kernel( The generated kernel uses the same 5-D tile-buffer pattern as the ``tadd_launch_a3.py`` / ``bop_launch_a3.py`` examples. """ - tile_op_fn = BINARY_OPS[op_name][0] + tile_op_fn = (BINARY_OPS.get(op_name) or INT_OPS.get(op_name))[0] pto_dtype = getattr(pto, dtype_str) fn_name = f"bin_{op_name}_{dtype_str}_{rows}x{cols}" diff --git a/ptodsl/tests/e2e/test_binary_elementwise.py b/ptodsl/tests/e2e/test_binary_elementwise.py index 4d21bb5c5f..dbfe3afd60 100644 --- a/ptodsl/tests/e2e/test_binary_elementwise.py +++ b/ptodsl/tests/e2e/test_binary_elementwise.py @@ -23,7 +23,7 @@ import pytest -from .common import BINARY_OPS, make_binary_kernel, launch_and_check +from .common import BINARY_OPS, INT_OPS, make_binary_kernel, launch_and_check, launch_and_check_int # --------------------------------------------------------------------------- @@ -139,3 +139,44 @@ def test_binary_f16(case, torch, target_arch, backend): ) print(f" PASS {op_name} {dtype_str} {rows}x{cols} ({desc}) " f"compile={compile_s:.3f}s launch={launch_s:.3f}s") + + +# --------------------------------------------------------------------------- +# i16 bitwise/shift tests +# --------------------------------------------------------------------------- + +INT_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall 1x64"), + (4, 64, "modeSmall 4x64"), + (1, 128, "modeNorm1L 1x128"), + (16, 64, "modeNorm1L 16x64"), + (64, 64, "modeNorm1L 64x64"), +] + +INT_PARAMS = [ + pytest.param( + (op_name, ref_fn, rows, cols, desc), + id=f"{op_name}-int16-{rows}x{cols}-{desc.replace(' ', '-')}", + ) + for op_name, (_, ref_fn) in INT_OPS.items() + for rows, cols, desc in INT_SHAPES +] + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", INT_PARAMS) +def test_binary_int16(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, desc = case + + kernel = make_binary_kernel( + op_name, rows, cols, dtype_str="int16", + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_int( + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + torch=torch, + ) + print(f" PASS {op_name} int16 {rows}x{cols} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") diff --git a/test/lit/vpto/ub/lower_bitwise_to_ub.pto b/test/lit/vpto/ub/lower_bitwise_to_ub.pto new file mode 100644 index 0000000000..a1e476795f --- /dev/null +++ b/test/lit/vpto/ub/lower_bitwise_to_ub.pto @@ -0,0 +1,64 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Lowering: tand→ub.vand, tor→ub.vor, txor→ub.vxor, tshl→ub.vshl, tshr→ub.vshr +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_tand() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tand ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + func.func @lower_tor() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tor ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + func.func @lower_txor() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.txor ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + func.func @lower_tshl() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tshl ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + func.func @lower_tshr() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tshr ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_tand() +// CHECK: pto.ub.vand +// CHECK-NOT: pto.tand +// CHECK-LABEL: func.func @lower_tor() +// CHECK: pto.ub.vor +// CHECK-NOT: pto.tor +// CHECK-LABEL: func.func @lower_txor() +// CHECK: pto.ub.vxor +// CHECK-NOT: pto.txor +// CHECK-LABEL: func.func @lower_tshl() +// CHECK: pto.ub.vshl +// CHECK-NOT: pto.tshl +// CHECK-LABEL: func.func @lower_tshr() +// CHECK: pto.ub.vshr +// CHECK-NOT: pto.tshr diff --git a/test/lit/vpto/ub/lower_tmax_to_ubvmax.pto b/test/lit/vpto/ub/lower_tmax_to_ubvmax.pto new file mode 100644 index 0000000000..6d18bb503d --- /dev/null +++ b/test/lit/vpto/ub/lower_tmax_to_ubvmax.pto @@ -0,0 +1,33 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tmax → ub.vmax lowering +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_f32_multi_row() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tmax ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } + func.func @lower_f32_single_row() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tmax ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK-LABEL: func.func @lower_f32_single_row() +// CHECK: pto.ub.vmax +// CHECK-LABEL: func.func @lower_f32_multi_row() +// CHECK: pto.ub.vmax +// CHECK-NOT: pto.tmax diff --git a/test/lit/vpto/ub/lower_tmin_to_ubvmin.pto b/test/lit/vpto/ub/lower_tmin_to_ubvmin.pto new file mode 100644 index 0000000000..6f05478a14 --- /dev/null +++ b/test/lit/vpto/ub/lower_tmin_to_ubvmin.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tmin → ub.vmin lowering +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @lower_f32() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + pto.tmin ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK: pto.ub.vmin +// CHECK-NOT: pto.tmin diff --git a/test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto b/test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto new file mode 100644 index 0000000000..dbe17b76cc --- /dev/null +++ b/test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto @@ -0,0 +1,53 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: llvm.func @ub_vand_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VAND.s16 +// CHECK-LABEL: llvm.func @ub_vor_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VOR.s16 +// CHECK-LABEL: llvm.func @ub_vxor_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VXOR.s16 +// CHECK-LABEL: llvm.func @ub_vshl_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VSHL.s16 +// CHECK-LABEL: llvm.func @ub_vshr_s16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VSHR.s16 + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @ub_vand_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vand %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vor_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vxor_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vxor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vshl_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vshl %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vshr_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vshr %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto b/test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto new file mode 100644 index 0000000000..a8f1b97b6f --- /dev/null +++ b/test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto @@ -0,0 +1,45 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s + +// CHECK-LABEL: llvm.func @ub_vmax_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.VMAX.f32 +// CHECK-LABEL: llvm.func @ub_vmax_f16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VMAX.f16 +// CHECK-LABEL: llvm.func @ub_vmin_f32_mix_aiv +// CHECK: llvm.call @llvm.hivm.VMIN.f32 +// CHECK-LABEL: llvm.func @ub_vmin_f16_mix_aiv +// CHECK: llvm.call @llvm.hivm.VMIN.f16 + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @ub_vmax_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vmax_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vmin_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vmin %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + func.func @ub_vmin_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + pto.ub.vmin %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} From 76d15b745a7464ee44818a2894f62dd84a1e11e3 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 2 Jul 2026 11:26:06 +0200 Subject: [PATCH 07/29] better tests --- .../copy_gm_ub.pto} | 12 ++- .../copy_ub_gm.pto} | 12 ++- .../lower_tadd_noop.pto} | 20 ++--- .../mte_gm_ub.pto} | 12 ++- .../set_mask_noop.pto} | 8 +- .../ub_vadd_noop.pto} | 6 +- test/lit/vpto/ub/lower_bitwise_to_ub.pto | 64 ---------------- test/lit/vpto/ub/lower_tadd_to_ubvadd.pto | 49 ------------ test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto | 26 ------- test/lit/vpto/ub/lower_tmul_to_ubvmul.pto | 26 ------- test/lit/vpto/ub/lower_tsub_to_ubvsub.pto | 26 ------- .../elementwise/tadd_chunked.pto} | 25 +++---- .../elementwise/tadd_chunked_tail.pto} | 25 +++---- .../elementwise/tadd_col_vl_align.pto} | 24 +++--- .../elementwise/tadd_count.pto} | 17 ++--- .../elementwise/tadd_count_large.pto} | 26 +++---- .../elementwise/tadd_flat.pto} | 17 ++--- .../tile_to_ub/elementwise/tadd_multi_row.pto | 31 ++++++++ .../elementwise/tadd_row_rpt.pto} | 17 ++--- .../elementwise/tadd_row_rpt_tail.pto} | 20 +++-- .../elementwise/tadd_single_row.pto | 28 +++++++ .../elementwise/tadd_small.pto} | 17 ++--- .../elementwise/tadd_tail.pto} | 17 ++--- .../vpto/ub/tile_to_ub/elementwise/tand.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/tdiv.pto | 27 +++++++ .../tile_to_ub/elementwise/tmax_multi_row.pto | 31 ++++++++ .../elementwise/tmax_single_row.pto} | 25 +++---- .../elementwise/tmin.pto} | 18 +++-- .../vpto/ub/tile_to_ub/elementwise/tmul.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/tor.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/tshl.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/tshr.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/tsub.pto | 27 +++++++ .../vpto/ub/tile_to_ub/elementwise/txor.pto | 28 +++++++ .../transfer/mte_gm_ub_expand.pto} | 0 .../elementwise/bitwise.pto} | 48 +++++++++--- .../elementwise/vadd_dtypes.pto} | 75 +++++++------------ .../ub/ub_to_llvm/elementwise/vadd_packed.pto | 49 ++++++++++++ .../vpto/ub/ub_to_llvm/elementwise/vdiv.pto | 30 ++++++++ .../elementwise/vmax_vmin.pto} | 39 +++++++--- .../vpto/ub/ub_to_llvm/elementwise/vmul.pto | 30 ++++++++ .../vpto/ub/ub_to_llvm/elementwise/vsub.pto | 30 ++++++++ .../mask/set_mask_count.pto} | 39 +++++----- .../vpto/ub/ub_to_llvm/mask/set_mask_full.pto | 26 +++++++ .../mask/set_mask_tail.pto} | 28 ++----- .../transfer/copy_gm_ub.pto} | 16 ++-- .../transfer/copy_gm_ub_pad.pto} | 13 ++-- .../transfer/copy_ub_gm.pto} | 16 ++-- .../transfer/mte_gm_ub.pto} | 12 ++- .../transfer/mte_gm_ub_pad.pto} | 19 ++--- test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto | 56 -------------- 51 files changed, 768 insertions(+), 574 deletions(-) rename test/lit/vpto/ub/{copy_gm_ub_a5_llvm.pto => a5/copy_gm_ub.pto} (71%) rename test/lit/vpto/ub/{copy_ub_gm_a5_llvm.pto => a5/copy_ub_gm.pto} (70%) rename test/lit/vpto/ub/{lower_tadd_a5_noop.pto => a5/lower_tadd_noop.pto} (73%) rename test/lit/vpto/ub/{mte_gm_ub_a5_llvm.pto => a5/mte_gm_ub.pto} (70%) rename test/lit/vpto/ub/{set_mask_a5_noop.pto => a5/set_mask_noop.pto} (78%) rename test/lit/vpto/ub/{ub_vadd_a5_noop.pto => a5/ub_vadd_noop.pto} (84%) delete mode 100644 test/lit/vpto/ub/lower_bitwise_to_ub.pto delete mode 100644 test/lit/vpto/ub/lower_tadd_to_ubvadd.pto delete mode 100644 test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto delete mode 100644 test/lit/vpto/ub/lower_tmul_to_ubvmul.pto delete mode 100644 test/lit/vpto/ub/lower_tsub_to_ubvsub.pto rename test/lit/vpto/ub/{lower_tadd_chunked.pto => tile_to_ub/elementwise/tadd_chunked.pto} (73%) rename test/lit/vpto/ub/{lower_tadd_chunked_tail.pto => tile_to_ub/elementwise/tadd_chunked_tail.pto} (73%) rename test/lit/vpto/ub/{lower_tadd_col_vl_align.pto => tile_to_ub/elementwise/tadd_col_vl_align.pto} (71%) rename test/lit/vpto/ub/{lower_tadd_count.pto => tile_to_ub/elementwise/tadd_count.pto} (77%) rename test/lit/vpto/ub/{lower_tadd_count_large.pto => tile_to_ub/elementwise/tadd_count_large.pto} (73%) rename test/lit/vpto/ub/{lower_tadd_flat.pto => tile_to_ub/elementwise/tadd_flat.pto} (77%) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto rename test/lit/vpto/ub/{lower_tadd_row_rpt.pto => tile_to_ub/elementwise/tadd_row_rpt.pto} (76%) rename test/lit/vpto/ub/{lower_tadd_row_rpt_tail.pto => tile_to_ub/elementwise/tadd_row_rpt_tail.pto} (75%) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto rename test/lit/vpto/ub/{lower_tadd_small.pto => tile_to_ub/elementwise/tadd_small.pto} (76%) rename test/lit/vpto/ub/{lower_tadd_tail.pto => tile_to_ub/elementwise/tadd_tail.pto} (77%) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto rename test/lit/vpto/ub/{lower_tmax_to_ubvmax.pto => tile_to_ub/elementwise/tmax_single_row.pto} (56%) rename test/lit/vpto/ub/{lower_tmin_to_ubvmin.pto => tile_to_ub/elementwise/tmin.pto} (65%) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto rename test/lit/vpto/ub/{mte_gm_ub_a3_expand.pto => tile_to_ub/transfer/mte_gm_ub_expand.pto} (100%) rename test/lit/vpto/ub/{ub_bitwise_vpto_llvm.pto => ub_to_llvm/elementwise/bitwise.pto} (51%) rename test/lit/vpto/ub/{ub_vadd_vpto_llvm.pto => ub_to_llvm/elementwise/vadd_dtypes.pto} (55%) create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto rename test/lit/vpto/ub/{ub_vmax_vmin_vpto_llvm.pto => ub_to_llvm/elementwise/vmax_vmin.pto} (53%) create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto rename test/lit/vpto/ub/{set_mask_count_llvm.pto => ub_to_llvm/mask/set_mask_count.pto} (50%) create mode 100644 test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto rename test/lit/vpto/ub/{set_mask_llvm.pto => ub_to_llvm/mask/set_mask_tail.pto} (50%) rename test/lit/vpto/ub/{copy_gm_ub_a3_llvm.pto => ub_to_llvm/transfer/copy_gm_ub.pto} (69%) rename test/lit/vpto/ub/{copy_gm_ub_a3_pad_llvm.pto => ub_to_llvm/transfer/copy_gm_ub_pad.pto} (71%) rename test/lit/vpto/ub/{copy_ub_gm_a3_llvm.pto => ub_to_llvm/transfer/copy_ub_gm.pto} (68%) rename test/lit/vpto/ub/{mte_gm_ub_a3_llvm.pto => ub_to_llvm/transfer/mte_gm_ub.pto} (72%) rename test/lit/vpto/ub/{mte_gm_ub_a3_pad_llvm.pto => ub_to_llvm/transfer/mte_gm_ub_pad.pto} (66%) delete mode 100644 test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto diff --git a/test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto b/test/lit/vpto/ub/a5/copy_gm_ub.pto similarity index 71% rename from test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto rename to test/lit/vpto/ub/a5/copy_gm_ub.pto index ebef49273b..f5e2ad0851 100644 --- a/test/lit/vpto/ub/copy_gm_ub_a5_llvm.pto +++ b/test/lit/vpto/ub/a5/copy_gm_ub.pto @@ -6,21 +6,19 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A5: copy_gm_to_ubuf unchanged → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV -// (regression test — ensure A5 still uses .DV intrinsics) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A5 regression: copy_gm_to_ubuf uses .DV intrinsics. +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @copy_gm_ub_a5_f32_mix_aiv( + // CHECK-SAME: %[[SRC:[^:]+]]: !llvm.ptr<1>, %[[DST:[^:]+]]: !llvm.ptr<6> func.func @copy_gm_ub_a5_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.kernel} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 %false = arith.constant false + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV(%[[DST]], %[[SRC]], {{%.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c0, %c0, %false, %c0, %c1, %c1 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @copy_gm_ub_a5_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () diff --git a/test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto b/test/lit/vpto/ub/a5/copy_ub_gm.pto similarity index 70% rename from test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto rename to test/lit/vpto/ub/a5/copy_ub_gm.pto index 8269c9a257..b98f3e17fd 100644 --- a/test/lit/vpto/ub/copy_ub_gm_a5_llvm.pto +++ b/test/lit/vpto/ub/a5/copy_ub_gm.pto @@ -6,20 +6,18 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A5: copy_ubuf_to_gm unchanged → llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV -// (regression test) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A5 regression: copy_ubuf_to_gm uses .DV intrinsics. +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @copy_ub_gm_a5_f32_mix_aiv( + // CHECK-SAME: %[[SRC:[^:]+]]: !llvm.ptr<6>, %[[DST:[^:]+]]: !llvm.ptr<1> func.func @copy_ub_gm_a5_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.kernel} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 + // CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV(%[[DST]], %[[SRC]], {{%.*}}, {{%.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64, i64) -> () pto.copy_ubuf_to_gm %src, %dst, %c0, %c1, %c1, %c0, %c1, %c1 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @copy_ub_gm_a5_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.ALIGN.V2.DV({{.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64, i64) -> () diff --git a/test/lit/vpto/ub/lower_tadd_a5_noop.pto b/test/lit/vpto/ub/a5/lower_tadd_noop.pto similarity index 73% rename from test/lit/vpto/ub/lower_tadd_a5_noop.pto rename to test/lit/vpto/ub/a5/lower_tadd_noop.pto index 0922d4f58e..b23f44ffa7 100644 --- a/test/lit/vpto/ub/lower_tadd_a5_noop.pto +++ b/test/lit/vpto/ub/a5/lower_tadd_noop.pto @@ -6,25 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test that pto.tadd on a5 targets is NOT lowered by LowerPTOToUBufOps. -// Instead it passes through to the existing ExpandTileOp → vecscope/vadd -// TileLang path. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto --enable-tile-op-expand %s -o - 2>/dev/null || true ) | FileCheck %s --check-prefix=VPTO -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s --check-prefix=LLVM +// A5: pto.tadd is NOT lowered by LowerPTOToUBufOps. Instead it goes through +// ExpandTileOp -> vecscope/vadd TileLang path. +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto --enable-tile-op-expand %s -o - 2>/dev/null | FileCheck %s --check-prefix=VPTO +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s --check-prefix=LLVM module attributes {pto.kernel_kind = #pto.kernel_kind} { func.func @lower_tadd_a5() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // VPTO: pto.vecscope + // VPTO: pto.vadd + // VPTO-NOT: pto.ub.vadd + // LLVM-NOT: llvm.hivm.VADD.f32 pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) return } } - -// VPTO: pto.vecscope -// VPTO: pto.vadd -// VPTO-NOT: pto.ub.vadd - -// LLVM-NOT: llvm.hivm.VADD.f32 diff --git a/test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto b/test/lit/vpto/ub/a5/mte_gm_ub.pto similarity index 70% rename from test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto rename to test/lit/vpto/ub/a5/mte_gm_ub.pto index e6dc6d79ea..549d32aa10 100644 --- a/test/lit/vpto/ub/mte_gm_ub_a5_llvm.pto +++ b/test/lit/vpto/ub/a5/mte_gm_ub.pto @@ -6,22 +6,20 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A5: mte_gm_ub unchanged → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV -// (regression test — ensure A5 still uses .DV intrinsics) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A5 regression: mte_gm_ub uses .DV intrinsics. +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @mte_gm_ub_a5_f32_mix_aiv( func.func @mte_gm_ub_a5_f32(%arg0: !pto.ptr) attributes {pto.kernel} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 + // CHECK: %[[UB:.*]] = {{.*}} !llvm.ptr<6> %ub = pto.castptr %c0 : i64 -> !pto.ptr + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV(%[[UB]], {{%.*}}, {{%.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () pto.mte_gm_ub %arg0, %ub, %c0, %c1 nburst(%c1, %c1, %c1) : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @mte_gm_ub_a5_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32.DV({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () diff --git a/test/lit/vpto/ub/set_mask_a5_noop.pto b/test/lit/vpto/ub/a5/set_mask_noop.pto similarity index 78% rename from test/lit/vpto/ub/set_mask_a5_noop.pto rename to test/lit/vpto/ub/a5/set_mask_noop.pto index 360e111dbb..574d2a98b7 100644 --- a/test/lit/vpto/ub/set_mask_a5_noop.pto +++ b/test/lit/vpto/ub/a5/set_mask_noop.pto @@ -6,16 +6,14 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test that pto.ub.set_mask is NOT lowered on a5 targets. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A5: pto.ub.set_mask is NOT lowered to MOVEMASK on a5 targets. +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { func.func @set_mask_a5_noop() attributes {pto.aicore} { %cNeg1 = arith.constant -1 : i64 + // CHECK-NOT: llvm.hivm.MOVEMASK pto.ub.set_mask %cNeg1, %cNeg1 : i64, i64 return } } - -// CHECK-NOT: llvm.hivm.MOVEMASK diff --git a/test/lit/vpto/ub/ub_vadd_a5_noop.pto b/test/lit/vpto/ub/a5/ub_vadd_noop.pto similarity index 84% rename from test/lit/vpto/ub/ub_vadd_a5_noop.pto rename to test/lit/vpto/ub/a5/ub_vadd_noop.pto index aa2f3cdbe0..eaeb910d5f 100644 --- a/test/lit/vpto/ub/ub_vadd_a5_noop.pto +++ b/test/lit/vpto/ub/a5/ub_vadd_noop.pto @@ -6,7 +6,8 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ( mkdir -p %T && ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A5: pto.ub.vadd is NOT lowered to llvm.hivm.VADD on a5 targets. +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { func.func @ub_vadd_noop(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { @@ -17,9 +18,8 @@ module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } } - -// CHECK-NOT: llvm.hivm.VADD diff --git a/test/lit/vpto/ub/lower_bitwise_to_ub.pto b/test/lit/vpto/ub/lower_bitwise_to_ub.pto deleted file mode 100644 index a1e476795f..0000000000 --- a/test/lit/vpto/ub/lower_bitwise_to_ub.pto +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// Lowering: tand→ub.vand, tor→ub.vor, txor→ub.vxor, tshl→ub.vshl, tshr→ub.vshr -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - func.func @lower_tand() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tand ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } - func.func @lower_tor() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tor ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } - func.func @lower_txor() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.txor ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } - func.func @lower_tshl() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tshl ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } - func.func @lower_tshr() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tshr ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } -} - -// CHECK-LABEL: func.func @lower_tand() -// CHECK: pto.ub.vand -// CHECK-NOT: pto.tand -// CHECK-LABEL: func.func @lower_tor() -// CHECK: pto.ub.vor -// CHECK-NOT: pto.tor -// CHECK-LABEL: func.func @lower_txor() -// CHECK: pto.ub.vxor -// CHECK-NOT: pto.txor -// CHECK-LABEL: func.func @lower_tshl() -// CHECK: pto.ub.vshl -// CHECK-NOT: pto.tshl -// CHECK-LABEL: func.func @lower_tshr() -// CHECK: pto.ub.vshr -// CHECK-NOT: pto.tshr diff --git a/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto b/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto deleted file mode 100644 index 5b1646582b..0000000000 --- a/test/lit/vpto/ub/lower_tadd_to_ubvadd.pto +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// 4x64 f32: headRepeats>1 → scf.for loop with count mode per row. -// 1x64 f32 (single row): headRepeats=1 → direct count mode. - -// RUN: ( mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @lower_f32() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } - - func.func @lower_f32_single_row() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } -} - -// 1x64: direct count mode, no loop -// CHECK-LABEL: func.func @lower_f32_single_row() -// CHECK-NOT: scf.for -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK: pto.ub.set_mask %c-1_i64, %c0_i64 - -// 4x64: scf.for loop with count mode per row -// CHECK-LABEL: func.func @lower_f32() -// CHECK: scf.for -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm - -// CHECK-NOT: pto.tadd - diff --git a/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto b/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto deleted file mode 100644 index 7974570849..0000000000 --- a/test/lit/vpto/ub/lower_tdiv_to_ubvdiv.pto +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// Test TDIV → pto.ub.vdiv lowering. - -// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: func.func @lower_tdiv_f32 -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vdiv - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @lower_tdiv_f32() attributes {pto.aicore} { - %a = pto.alloc_tile : !pto.tile_buf - %b = pto.alloc_tile : !pto.tile_buf - %c = pto.alloc_tile : !pto.tile_buf - pto.tdiv ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) - return - } -} diff --git a/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto b/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto deleted file mode 100644 index cd7cb6dd0f..0000000000 --- a/test/lit/vpto/ub/lower_tmul_to_ubvmul.pto +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// Test TMUL → pto.ub.vmul lowering. - -// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: func.func @lower_tmul_f32 -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vmul - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @lower_tmul_f32() attributes {pto.aicore} { - %a = pto.alloc_tile : !pto.tile_buf - %b = pto.alloc_tile : !pto.tile_buf - %c = pto.alloc_tile : !pto.tile_buf - pto.tmul ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) - return - } -} diff --git a/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto b/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto deleted file mode 100644 index 56185f4bb3..0000000000 --- a/test/lit/vpto/ub/lower_tsub_to_ubvsub.pto +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// Test TSUB → pto.ub.vsub lowering. - -// RUN: (mkdir -p %T && ASCEND_HOME_PATH=${ASCEND_HOME_PATH:-/usr/local/Ascend/cann-9.0.0} ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: func.func @lower_tsub_f32 -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vsub - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @lower_tsub_f32() attributes {pto.aicore} { - %a = pto.alloc_tile : !pto.tile_buf - %b = pto.alloc_tile : !pto.tile_buf - %c = pto.alloc_tile : !pto.tile_buf - pto.tsub ins(%a, %b : !pto.tile_buf, !pto.tile_buf) outs(%c : !pto.tile_buf) - return - } -} diff --git a/test/lit/vpto/ub/lower_tadd_chunked.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto similarity index 73% rename from test/lit/vpto/ub/lower_tadd_chunked.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto index 2e833e35f4..4eca1a1019 100644 --- a/test/lit/vpto/ub/lower_tadd_chunked.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto @@ -6,27 +6,24 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LCountMode: totalRepeats > 255. -// 16x1024 f32 — totalRepeats=512>255 → count mode (no scf.for). - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LCountMode: nonVLAligned + totalRepeats > 255. 41x200 f32 -> count mode. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_chunked() func.func @lower_tadd_chunked() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK: pto.ub.set_mask %c-1_i64, %c0 + // CHECK-NOT: scf.for pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// Count mode only — no scf.for -// CHECK-LABEL: func.func @lower_tadd_chunked -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.set_mask -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK: pto.ub.set_mask %c-1_i64, %c0 -// CHECK-NOT: scf.for -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_chunked_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto similarity index 73% rename from test/lit/vpto/ub/lower_tadd_chunked_tail.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto index b4b37f93c2..504ec889cb 100644 --- a/test/lit/vpto/ub/lower_tadd_chunked_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto @@ -6,27 +6,24 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LCountMode: nonVLAligned + totalRepeats > 255. -// 41x200 f32 — nonVLAligned=true, totalRepeats=257>255 → count mode. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LCountMode: nonVLAligned + totalRepeats > 255. 41x200 f32 -> count mode. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_chunked_tail() func.func @lower_tadd_chunked_tail() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK: pto.ub.set_mask %c-1_i64, %c0 + // CHECK-NOT: scf.for pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// Count mode — no scf.for, no head+tail norm mode -// CHECK-LABEL: func.func @lower_tadd_chunked_tail -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.set_mask -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK: pto.ub.set_mask %c-1_i64, %c0 -// CHECK-NOT: scf.for -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_col_vl_align.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto similarity index 71% rename from test/lit/vpto/ub/lower_tadd_col_vl_align.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto index 60e1a458f1..caa35ef6af 100644 --- a/test/lit/vpto/ub/lower_tadd_col_vl_align.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto @@ -6,27 +6,23 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin2LNormModeColVLAlign: partial valid columns, row-by-row, VL-aligned. -// 2x128 f32, valid=2x32 — cols=128, vCols=32. -// epr=32: normColRepeat=128/32=4, vRows=2 < normColRepeat+1=5, vCols%epr=32%32=0 → ColVLAlign. -// headRepeats=vCols/epr=1, row loop with stride=8. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin2LNormModeColVLAlign: partial valid columns, VL-aligned. +// 2x128 f32, v_col=32 -> row loop with stride=8, no masking. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_col_vl_align() func.func @lower_tadd_col_vl_align() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: scf.for + // CHECK: pto.addptr + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.ub.set_mask %c pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// Row-by-row: scf.for 2 iterations, vadd(repeat=1, stride=8) per row, no masking. -// CHECK-LABEL: func.func @lower_tadd_col_vl_align -// CHECK: scf.for -// CHECK: pto.addptr -// CHECK: pto.ub.vadd -// CHECK-NOT: pto.ub.set_mask %c -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_count.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto similarity index 77% rename from test/lit/vpto/ub/lower_tadd_count.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto index 290fcaeea0..7df4b5ca44 100644 --- a/test/lit/vpto/ub/lower_tadd_count.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LCountMode: 7x48 f32, headRepeats>1 → per-row scf.for. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LCountMode: 7x48 f32, headRepeats>1 -> per-row scf.for. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_count() func.func @lower_tadd_count() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_count -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_count_large.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto similarity index 73% rename from test/lit/vpto/ub/lower_tadd_count_large.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto index 0c0d8cf084..1295dd0852 100644 --- a/test/lit/vpto/ub/lower_tadd_count_large.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto @@ -6,28 +6,24 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LCountMode: totalRepeats > 255. -// 16x1024 f32 — cols=1024, epr=32, nonVLAligned=false, totalRepeats=512>255 → count mode. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LCountMode: totalRepeats > 255. 16x1024 f32 -> count mode, no scf.for. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_count_large() func.func @lower_tadd_count_large() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK: pto.ub.set_mask %c-1_i64, %c0 + // CHECK-NOT: scf.for pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// Count mode: set_mask_count → vadd(repeat=0) → set_mask_norm → restore mask -// No scf.for chunks. -// CHECK-LABEL: func.func @lower_tadd_count_large -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.set_mask -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK: pto.ub.set_mask %c-1_i64, %c0 -// CHECK-NOT: scf.for -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_flat.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto similarity index 77% rename from test/lit/vpto/ub/lower_tadd_flat.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto index 07c9acea46..83e0ea6a72 100644 --- a/test/lit/vpto/ub/lower_tadd_flat.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LNormMode: 4x32 f32. headRepeats>1 → per-row scf.for. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LNormMode: 4x32 f32. headRepeats>1 -> per-row scf.for. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_flat() func.func @lower_tadd_flat() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_flat -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto new file mode 100644 index 0000000000..7ee15d7b0f --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto @@ -0,0 +1,31 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tadd -> ub.vadd lowering for a multi-row tile (4x64 f32). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_f32_multi_row() + func.func @lower_f32_multi_row() attributes {pto.aicore} { + // CHECK: %[[DST_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: scf.for + // CHECK: %[[DST:.*]] = pto.addptr %[[DST_BASE]], {{.*}} : -> + // CHECK: %[[SRC0:.*]] = pto.addptr %[[SRC0_BASE]], {{.*}} : -> + // CHECK: %[[SRC1:.*]] = pto.addptr %[[SRC1_BASE]], {{.*}} : -> + // CHECK: pto.ub.vadd %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd + return + } +} diff --git a/test/lit/vpto/ub/lower_tadd_row_rpt.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto similarity index 76% rename from test/lit/vpto/ub/lower_tadd_row_rpt.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto index 9feaa9d00e..f48ea9b87e 100644 --- a/test/lit/vpto/ub/lower_tadd_row_rpt.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test tadd lowering: 4x96 f32, valid=4x32. Hits count mode (totalV > REPEAT_MAX). - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin2LNormModeRowRpt: 4x96 f32, v_col=32. Count mode (totalV > REPEAT_MAX). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_row_rpt() func.func @lower_tadd_row_rpt() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_row_rpt -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto similarity index 75% rename from test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto index c9346e7c68..0458bda3fd 100644 --- a/test/lit/vpto/ub/lower_tadd_row_rpt_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto @@ -6,24 +6,22 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin2LNormModeRowRpt. 5x128 f32, v_col=40. -// headRepeats=3 > 1 → per-row scf.for count mode. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin2LNormModeRowRpt: 5x128 f32, v_col=40. headRepeats=3 -> per-row scf.for count mode. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_row_rpt_tail() func.func @lower_tadd_row_rpt_tail() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: scf.for + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_row_rpt_tail -// CHECK: scf.for -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto new file mode 100644 index 0000000000..a04dd86c33 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto @@ -0,0 +1,28 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tadd -> ub.vadd lowering for a single-row tile (1x64 f32). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_f32_single_row() + func.func @lower_f32_single_row() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK-NOT: scf.for + // CHECK: pto.ub.vadd %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd + return + } +} diff --git a/test/lit/vpto/ub/lower_tadd_small.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto similarity index 76% rename from test/lit/vpto/ub/lower_tadd_small.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto index d302eb4af3..cca724b87e 100644 --- a/test/lit/vpto/ub/lower_tadd_small.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LNormModeSmall: 2x32 f32, v_col=8. vRows>1 → per-row scf.for count mode. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LNormModeSmall: 2x32 f32, v_col=8. vRows>1 -> per-row scf.for count mode. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_small() func.func @lower_tadd_small() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_small -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/lower_tadd_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto similarity index 77% rename from test/lit/vpto/ub/lower_tadd_tail.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto index 6af3e862cb..94a2a03ba2 100644 --- a/test/lit/vpto/ub/lower_tadd_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test Bin1LCountMode: 7x48 f32, headRepeats>1 → per-row scf.for. - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// Bin1LCountMode: 7x48 f32, headRepeats>1 -> per-row scf.for. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_tail() func.func @lower_tadd_tail() attributes {pto.aicore} { %dst = pto.alloc_tile : !pto.tile_buf %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd return } } - -// CHECK-LABEL: func.func @lower_tadd_tail -// CHECK: pto.ub.set_mask_count -// CHECK: pto.ub.vadd -// CHECK: pto.ub.set_mask_norm -// CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto new file mode 100644 index 0000000000..f435a0b29e --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tand -> ub.vand lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tand() + func.func @lower_tand() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vand %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tand ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tand + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto new file mode 100644 index 0000000000..2e9b584ece --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tdiv -> ub.vdiv lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tdiv_f32() + func.func @lower_tdiv_f32() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vdiv %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tdiv ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tdiv + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto new file mode 100644 index 0000000000..c197ad43c5 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto @@ -0,0 +1,31 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tmax -> ub.vmax lowering for a multi-row tile. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_f32_multi_row() + func.func @lower_f32_multi_row() attributes {pto.aicore} { + // CHECK: %[[DST_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: scf.for + // CHECK: %[[DST:.*]] = pto.addptr %[[DST_BASE]], {{.*}} : -> + // CHECK: %[[SRC0:.*]] = pto.addptr %[[SRC0_BASE]], {{.*}} : -> + // CHECK: %[[SRC1:.*]] = pto.addptr %[[SRC1_BASE]], {{.*}} : -> + // CHECK: pto.ub.vmax %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tmax ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tmax + return + } +} diff --git a/test/lit/vpto/ub/lower_tmax_to_ubvmax.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto similarity index 56% rename from test/lit/vpto/ub/lower_tmax_to_ubvmax.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto index 6d18bb503d..26295a5feb 100644 --- a/test/lit/vpto/ub/lower_tmax_to_ubvmax.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto @@ -6,28 +6,23 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// tmax → ub.vmax lowering -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// tmax -> ub.vmax lowering for a single-row tile. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - func.func @lower_f32_multi_row() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf - pto.tmax ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - return - } + // CHECK-LABEL: func.func @lower_f32_single_row() func.func @lower_f32_single_row() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK-NOT: scf.for + // CHECK: pto.ub.vmax %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 pto.tmax ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tmax return } } - -// CHECK-LABEL: func.func @lower_f32_single_row() -// CHECK: pto.ub.vmax -// CHECK-LABEL: func.func @lower_f32_multi_row() -// CHECK: pto.ub.vmax -// CHECK-NOT: pto.tmax diff --git a/test/lit/vpto/ub/lower_tmin_to_ubvmin.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto similarity index 65% rename from test/lit/vpto/ub/lower_tmin_to_ubvmin.pto rename to test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto index 6f05478a14..a334ef886b 100644 --- a/test/lit/vpto/ub/lower_tmin_to_ubvmin.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto @@ -6,18 +6,26 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// tmin → ub.vmin lowering -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// tmin -> ub.vmin lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_f32() func.func @lower_f32() attributes {pto.aicore} { + // CHECK: %[[DST_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1_BASE:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: scf.for + // CHECK: %[[DST:.*]] = pto.addptr %[[DST_BASE]], {{.*}} : -> + // CHECK: %[[SRC0:.*]] = pto.addptr %[[SRC0_BASE]], {{.*}} : -> + // CHECK: %[[SRC1:.*]] = pto.addptr %[[SRC1_BASE]], {{.*}} : -> + // CHECK: pto.ub.vmin %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 pto.tmin ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tmin return } } - -// CHECK: pto.ub.vmin -// CHECK-NOT: pto.tmin diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto new file mode 100644 index 0000000000..ba60ef6fe3 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tmul -> ub.vmul lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tmul_f32() + func.func @lower_tmul_f32() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vmul %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tmul ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tmul + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto new file mode 100644 index 0000000000..196ce156c8 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tor -> ub.vor lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tor() + func.func @lower_tor() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vor %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tor ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tor + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto new file mode 100644 index 0000000000..02138eb4d0 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tshl -> ub.vshl lowering. +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tshl() + func.func @lower_tshl() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vshl %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tshl ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tshl + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto new file mode 100644 index 0000000000..11a05d0507 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tshr -> ub.vshr lowering. +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tshr() + func.func @lower_tshr() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vshr %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tshr ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tshr + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto new file mode 100644 index 0000000000..80757c171b --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// tsub -> ub.vsub lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tsub_f32() + func.func @lower_tsub_f32() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vsub %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tsub ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tsub + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto new file mode 100644 index 0000000000..86fa64775c --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto @@ -0,0 +1,28 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// txor -> ub.vxor lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_txor() + func.func @lower_txor() attributes {pto.aicore} { + // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %dst = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src0 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr + %src1 = pto.alloc_tile : !pto.tile_buf + %tmp = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vxor %[[DST]], %[[SRC0]], %[[SRC1]] + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.txor ins(%src0, %src1, %tmp : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.txor + return + } +} diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_expand.pto b/test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto similarity index 100% rename from test/lit/vpto/ub/mte_gm_ub_a3_expand.pto rename to test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto diff --git a/test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto similarity index 51% rename from test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto index dbe17b76cc..31af0b3433 100644 --- a/test/lit/vpto/ub/ub_bitwise_vpto_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto @@ -6,47 +6,71 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: llvm.func @ub_vand_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VAND.s16 -// CHECK-LABEL: llvm.func @ub_vor_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VOR.s16 -// CHECK-LABEL: llvm.func @ub_vxor_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VXOR.s16 -// CHECK-LABEL: llvm.func @ub_vshl_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VSHL.s16 -// CHECK-LABEL: llvm.func @ub_vshr_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VSHR.s16 +// pto.ub.vand/vor/vxor/vshl/vshr -> llvm.hivm.VAND/VOR/VXOR/VSHL/VSHR.s16. +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @ub_vand_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vand_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VAND.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vand %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vor_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vor_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VOR.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vxor_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vxor_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VXOR.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vxor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vshl_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vshl_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VSHL.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vshl %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vshr_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vshr_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VSHR.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vshr %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } diff --git a/test/lit/vpto/ub/ub_vadd_vpto_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto similarity index 55% rename from test/lit/vpto/ub/ub_vadd_vpto_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto index 1cd7fe7535..8cee04be3e 100644 --- a/test/lit/vpto/ub/ub_vadd_vpto_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto @@ -6,11 +6,14 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// pto.ub.vadd -> llvm.hivm.VADD.* for s16, f16, s32, f32. +// Verifies: intrinsic suffix per dtype, pointer operand wiring, SIMD flag (bit 56), +// and 8-bit field mask (255) in the packed config word. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s -// CHECK-LABEL: llvm.func @ub_vadd_s16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VADD.s16 module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @ub_vadd_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vadd_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c128 = arith.constant 128 : i64 %c0 = arith.constant 0 : i64 @@ -19,12 +22,17 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } -// CHECK-LABEL: llvm.func @ub_vadd_f16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VADD.f16 + // CHECK-LABEL: llvm.func @ub_vadd_f16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vadd_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c128 = arith.constant 128 : i64 %c0 = arith.constant 0 : i64 @@ -33,12 +41,16 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } -// CHECK-LABEL: llvm.func @ub_vadd_s32_mix_aiv -// CHECK: llvm.call @llvm.hivm.VADD.s32 + // CHECK-LABEL: llvm.func @ub_vadd_s32_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vadd_s32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c128 = arith.constant 128 : i64 %c0 = arith.constant 0 : i64 @@ -47,12 +59,16 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } -// CHECK-LABEL: llvm.func @ub_vadd_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.VADD.f32 + // CHECK-LABEL: llvm.func @ub_vadd_f32_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vadd_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c128 = arith.constant 128 : i64 %c0 = arith.constant 0 : i64 @@ -61,44 +77,11 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vadd %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } - -// Verify A3/HVVM byte packing: -// repeat[7:0], dstBlk[15:8], src0Blk[23:16], src1Blk[31:24], -// dstRep[39:32], src0Rep[47:40], src1Rep[55:48], simdFlag[63:56]=1. -// CHECK-LABEL: llvm.func @ub_vadd_packed_mix_aiv -// CHECK: llvm.mlir.constant(72057594037927936 : i64) -// CHECK: llvm.or -// CHECK: %[[DSTBLK:.*]] = llvm.mlir.constant(2 : i64) -// CHECK: %[[SH8:.*]] = llvm.mlir.constant(8 : i64) -// CHECK: llvm.shl %[[DSTBLK]], %[[SH8]] -// CHECK: %[[SRC0BLK:.*]] = llvm.mlir.constant(3 : i64) -// CHECK: %[[SH16:.*]] = llvm.mlir.constant(16 : i64) -// CHECK: llvm.shl %[[SRC0BLK]], %[[SH16]] -// CHECK: %[[SRC1BLK:.*]] = llvm.mlir.constant(6 : i64) -// CHECK: %[[SH24:.*]] = llvm.mlir.constant(24 : i64) -// CHECK: llvm.shl %[[SRC1BLK]], %[[SH24]] -// CHECK: %[[DSTREP:.*]] = llvm.mlir.constant(9 : i64) -// CHECK: %[[SH32:.*]] = llvm.mlir.constant(32 : i64) -// CHECK: llvm.shl %[[DSTREP]], %[[SH32]] -// CHECK: %[[SRC0REP:.*]] = llvm.mlir.constant(12 : i64) -// CHECK: %[[SH40:.*]] = llvm.mlir.constant(40 : i64) -// CHECK: llvm.shl %[[SRC0REP]], %[[SH40]] -// CHECK: %[[SRC1REP:.*]] = llvm.mlir.constant(15 : i64) -// CHECK: %[[SH48:.*]] = llvm.mlir.constant(48 : i64) -// CHECK: llvm.shl %[[SRC1REP]], %[[SH48]] -// CHECK: llvm.call @llvm.hivm.VADD.s16({{.*}}, {{.*}}, {{.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () - func.func @ub_vadd_packed(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { - %c1 = arith.constant 1 : i64 - %c2 = arith.constant 2 : i64 - %c3 = arith.constant 3 : i64 - %c6 = arith.constant 6 : i64 - %c9 = arith.constant 9 : i64 - %c12 = arith.constant 12 : i64 - %c15 = arith.constant 15 : i64 - pto.ub.vadd %dst, %src0, %src1, %c1, %c2, %c3, %c6, %c9, %c12, %c15 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - return - } } diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto new file mode 100644 index 0000000000..91133d0676 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto @@ -0,0 +1,49 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Verify A3/HVVM byte packing for VADD config word: +// repeat[7:0], dstBlk[15:8], src0Blk[23:16], src1Blk[31:24], +// dstRep[39:32], src0Rep[47:40], src1Rep[55:48], simdFlag[63:56]=1. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @ub_vadd_packed_mix_aiv( + func.func @ub_vadd_packed(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c6 = arith.constant 6 : i64 + %c9 = arith.constant 9 : i64 + %c12 = arith.constant 12 : i64 + %c15 = arith.constant 15 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) + // CHECK: llvm.or + // CHECK: %[[DSTBLK:.*]] = llvm.mlir.constant(2 : i64) + // CHECK: %[[SH8:.*]] = llvm.mlir.constant(8 : i64) + // CHECK: llvm.shl %[[DSTBLK]], %[[SH8]] + // CHECK: %[[SRC0BLK:.*]] = llvm.mlir.constant(3 : i64) + // CHECK: %[[SH16:.*]] = llvm.mlir.constant(16 : i64) + // CHECK: llvm.shl %[[SRC0BLK]], %[[SH16]] + // CHECK: %[[SRC1BLK:.*]] = llvm.mlir.constant(6 : i64) + // CHECK: %[[SH24:.*]] = llvm.mlir.constant(24 : i64) + // CHECK: llvm.shl %[[SRC1BLK]], %[[SH24]] + // CHECK: %[[DSTREP:.*]] = llvm.mlir.constant(9 : i64) + // CHECK: %[[SH32:.*]] = llvm.mlir.constant(32 : i64) + // CHECK: llvm.shl %[[DSTREP]], %[[SH32]] + // CHECK: %[[SRC0REP:.*]] = llvm.mlir.constant(12 : i64) + // CHECK: %[[SH40:.*]] = llvm.mlir.constant(40 : i64) + // CHECK: llvm.shl %[[SRC0REP]], %[[SH40]] + // CHECK: %[[SRC1REP:.*]] = llvm.mlir.constant(15 : i64) + // CHECK: %[[SH48:.*]] = llvm.mlir.constant(48 : i64) + // CHECK: llvm.shl %[[SRC1REP]], %[[SH48]] + // CHECK: llvm.call @llvm.hivm.VADD.s16({{.*}}, {{.*}}, {{.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vadd %dst, %src0, %src1, %c1, %c2, %c3, %c6, %c9, %c12, %c15 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto new file mode 100644 index 0000000000..f01614b279 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vdiv -> llvm.hivm.VDIV.f32. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @vdiv_llvm_mix_aiv( + func.func @vdiv_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + // CHECK: %[[PTR:.*]] = {{.*}} !llvm.ptr<6> + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + // SIMD flag = 1<<56; 8-bit field mask = 255 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VDIV.f32(%[[PTR]], %[[PTR]], %[[PTR]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vdiv %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto similarity index 53% rename from test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto index a8f1b97b6f..3d479ba05d 100644 --- a/test/lit/vpto/ub/ub_vmax_vmin_vpto_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto @@ -6,39 +6,58 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: llvm.func @ub_vmax_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.VMAX.f32 -// CHECK-LABEL: llvm.func @ub_vmax_f16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VMAX.f16 -// CHECK-LABEL: llvm.func @ub_vmin_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.VMIN.f32 -// CHECK-LABEL: llvm.func @ub_vmin_f16_mix_aiv -// CHECK: llvm.call @llvm.hivm.VMIN.f16 +// pto.ub.vmax/vmin -> llvm.hivm.VMAX/VMIN.* for f32, f16. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @ub_vmax_f32_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vmax_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VMAX.f32(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vmax_f16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vmax_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VMAX.f16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vmin_f32_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vmin_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VMIN.f32(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vmin %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } + + // CHECK-LABEL: llvm.func @ub_vmin_f16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> func.func @ub_vmin_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VMIN.f16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.vmin %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 return } diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto new file mode 100644 index 0000000000..e2d733bdd0 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vmul -> llvm.hivm.VMUL.f32. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @vmul_llvm_mix_aiv( + func.func @vmul_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + // CHECK: %[[PTR:.*]] = {{.*}} !llvm.ptr<6> + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + // SIMD flag = 1<<56; 8-bit field mask = 255 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VMUL.f32(%[[PTR]], %[[PTR]], %[[PTR]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vmul %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto new file mode 100644 index 0000000000..1448e1debf --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vsub -> llvm.hivm.VSUB.f32. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @vsub_llvm_mix_aiv( + func.func @vsub_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + // CHECK: %[[PTR:.*]] = {{.*}} !llvm.ptr<6> + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + // SIMD flag = 1<<56; 8-bit field mask = 255 + // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 + // CHECK: llvm.mlir.constant(255 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.VSUB.f32(%[[PTR]], %[[PTR]], %[[PTR]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vsub %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : + !pto.ptr, !pto.ptr, !pto.ptr, + i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/set_mask_count_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto similarity index 50% rename from test/lit/vpto/ub/set_mask_count_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto index ef1885c53e..3d8cbea536 100644 --- a/test/lit/vpto/ub/set_mask_count_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto @@ -6,40 +6,37 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test that pto.ub.set_mask_count and pto.ub.set_mask_norm lower to -// SBITSET1 / SBITSET0 on CTRL register bit 56 (matching CCE reference). - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: llvm.func @set_mask_count_llvm_mix_aiv -// CHECK: llvm.call @llvm.hivm.SBITSET1 -// CHECK: llvm.call @llvm.hivm.SET.CTRL - -// CHECK-LABEL: llvm.func @set_mask_norm_llvm_mix_aiv -// CHECK: llvm.call @llvm.hivm.SBITSET0 -// CHECK: llvm.call @llvm.hivm.SET.CTRL - -// CHECK-LABEL: llvm.func @count_mode_sequence_mix_aiv -// CHECK: llvm.call @llvm.hivm.SBITSET1 -// CHECK: llvm.call @llvm.hivm.SET.CTRL -// CHECK: llvm.call @llvm.hivm.MOVEMASK -// CHECK: llvm.call @llvm.hivm.MOVEMASK -// CHECK: llvm.call @llvm.hivm.SBITSET0 -// CHECK: llvm.call @llvm.hivm.SET.CTRL +// pto.ub.set_mask_count -> SBITSET1 + SET.CTL on bit 56 (count mode). +// pto.ub.set_mask_norm -> SBITSET0 + SET.CTL on bit 56 (normal mode). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=COUNT +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=NORM +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=SEQ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - func.func @set_mask_count_llvm() attributes {pto.aicore} { + // COUNT-LABEL: llvm.func @set_mask_count_llvm_mix_aiv( + // COUNT: llvm.call @llvm.hivm.SBITSET1 + // COUNT: llvm.call @llvm.hivm.SET.CTRL pto.ub.set_mask_count return } func.func @set_mask_norm_llvm() attributes {pto.aicore} { + // NORM-LABEL: llvm.func @set_mask_norm_llvm_mix_aiv( + // NORM: llvm.call @llvm.hivm.SBITSET0 + // NORM: llvm.call @llvm.hivm.SET.CTRL pto.ub.set_mask_norm return } func.func @count_mode_sequence() attributes {pto.aicore} { + // SEQ-LABEL: llvm.func @count_mode_sequence_mix_aiv( + // SEQ: llvm.call @llvm.hivm.SBITSET1 + // SEQ: llvm.call @llvm.hivm.SET.CTRL + // SEQ: llvm.call @llvm.hivm.MOVEMASK + // SEQ: llvm.call @llvm.hivm.MOVEMASK + // SEQ: llvm.call @llvm.hivm.SBITSET0 + // SEQ: llvm.call @llvm.hivm.SET.CTRL pto.ub.set_mask_count %c0 = arith.constant 0 : i64 %c42 = arith.constant 42 : i64 diff --git a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto new file mode 100644 index 0000000000..c63911f451 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.set_mask with full mask (-1) -> two MOVEMASK calls (index 0 then 1). +// Verifies: mask value reaches both calls, index ordering 0->1. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @set_mask_full_mix_aiv( + func.func @set_mask_full() attributes {pto.aicore} { + %cNeg1 = arith.constant -1 : i64 + // CHECK: %[[MASK:.*]] = llvm.mlir.constant(-1 : i64) : i64 + // CHECK: %[[IDX0:.*]] = llvm.mlir.constant(0 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.MOVEMASK(%[[IDX0]], %[[MASK]]) : (i64, i64) -> () + // CHECK: %[[IDX1:.*]] = llvm.mlir.constant(1 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.MOVEMASK(%[[IDX1]], %[[MASK]]) : (i64, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.set_mask %cNeg1, %cNeg1 : i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/set_mask_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto similarity index 50% rename from test/lit/vpto/ub/set_mask_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto index 8b327f0f64..c5422a8d73 100644 --- a/test/lit/vpto/ub/set_mask_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto @@ -6,32 +6,20 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Test that pto.ub.set_mask is lowered to two llvm.hivm.MOVEMASK calls -// per CCE expansion: movemask(0, mask0); movemask(1, mask1). - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// pto.ub.set_mask with partial mask (hi=0, lo=16) -> two MOVEMASK calls. +// Verifies: distinct mask values reach correct call, index ordering 0->1. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @set_mask_full() attributes {pto.aicore} { - %cNeg1 = arith.constant -1 : i64 - pto.ub.set_mask %cNeg1, %cNeg1 : i64, i64 - return - } - + // CHECK-LABEL: llvm.func @set_mask_tail_mix_aiv( func.func @set_mask_tail() attributes {pto.aicore} { %c16 = arith.constant 16 : i64 %c0 = arith.constant 0 : i64 + // CHECK: %[[LO:.*]] = llvm.mlir.constant(16 : i64) : i64 + // CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () + // CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, %[[LO]]) : (i64, i64) -> () + // CHECK-NOT: pto.ub. pto.ub.set_mask %c0, %c16 : i64, i64 return } } - -// CHECK-LABEL: llvm.func @set_mask_full_mix_aiv -// Two MOVEMASK calls per set_mask: index 0 then index 1 -// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () -// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () - -// CHECK-LABEL: llvm.func @set_mask_tail_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () -// CHECK: llvm.call @llvm.hivm.MOVEMASK({{%.*}}, {{%.*}}) : (i64, i64) -> () diff --git a/test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto similarity index 69% rename from test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto index 1e00bfcd9b..cb86704a0d 100644 --- a/test/lit/vpto/ub/copy_gm_ub_a3_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto @@ -6,23 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A3: copy_gm_to_ubuf without padding → llvm.hivm.MOV.OUT.TO.UB.v220 -// (single i64 config, 3-arg call) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A3: copy_gm_to_ubuf without padding -> llvm.hivm.MOV.OUT.TO.UB.v220. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @copy_gm_ub_a3_nopad_f32_mix_aiv( + // CHECK-SAME: %[[SRC:[^:]+]]: !llvm.ptr<1>, %[[DST:[^:]+]]: !llvm.ptr<6> func.func @copy_gm_ub_a3_nopad_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 %false = arith.constant false + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220(%[[DST]], %[[SRC]], {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () + // CHECK-NOT: ALIGN + // CHECK-NOT: .DV pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c0, %c0, %false, %c0, %c1, %c1 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @copy_gm_ub_a3_nopad_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () -// CHECK-NOT: ALIGN -// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto similarity index 71% rename from test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto index dede370c6b..dabdac2bde 100644 --- a/test/lit/vpto/ub/copy_gm_ub_a3_pad_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto @@ -6,23 +6,20 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A3: copy_gm_to_ubuf with padding → llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32 -// (two i64 configs, 4-arg call, no .DV suffix) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A3: copy_gm_to_ubuf with padding -> llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32 (4-arg call). +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @copy_gm_ub_a3_pad_f32_mix_aiv( func.func @copy_gm_ub_a3_pad_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 %c2 = arith.constant 2 : i64 %true = arith.constant true + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () + // CHECK-NOT: .DV pto.copy_gm_to_ubuf %src, %dst, %c0, %c1, %c1, %c2, %c2, %true, %c0, %c1, %c1 {has_pad} : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i1, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @copy_gm_ub_a3_pad_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () -// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto similarity index 68% rename from test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto index 04512a96ff..f4d8272217 100644 --- a/test/lit/vpto/ub/copy_ub_gm_a3_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto @@ -6,22 +6,20 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A3: copy_ubuf_to_gm → llvm.hivm.MOV.UB.TO.OUT.v220.1 -// (single i64 config, 3-arg call) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A3: copy_ubuf_to_gm -> llvm.hivm.MOV.UB.TO.OUT.v220.1 (3-arg call). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @copy_ub_gm_a3_f32_mix_aiv( + // CHECK-SAME: %[[SRC:[^:]+]]: !llvm.ptr<6>, %[[DST:[^:]+]]: !llvm.ptr<1> func.func @copy_ub_gm_a3_f32(%src: !pto.ptr, %dst: !pto.ptr) attributes {pto.aicore} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 + // CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.v220.1(%[[DST]], %[[SRC]], {{%.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: ALIGN + // CHECK-NOT: .DV pto.copy_ubuf_to_gm %src, %dst, %c0, %c1, %c1, %c0, %c1, %c1 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @copy_ub_gm_a3_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.UB.TO.OUT.v220.1({{.*}}) : (!llvm.ptr<1>, !llvm.ptr<6>, i64) -> () -// CHECK-NOT: ALIGN -// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto similarity index 72% rename from test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto index 119f00fb51..fa22014bfa 100644 --- a/test/lit/vpto/ub/mte_gm_ub_a3_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto @@ -6,22 +6,20 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A3: mte_gm_ub without padding → expanded → lowered to llvm.hivm.MOV.OUT.TO.UB.v220 - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A3: mte_gm_ub without padding -> llvm.hivm.MOV.OUT.TO.UB.v220. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @mte_gm_ub_a3_nopad_f32_mix_aiv( func.func @mte_gm_ub_a3_nopad_f32(%arg0: !pto.ptr) attributes {pto.aicore} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 %ub = pto.castptr %c0 : i64 -> !pto.ptr + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220({{.*}}, {{.*}}, {{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () + // CHECK-NOT: ALIGN.V2 pto.mte_gm_ub %arg0, %ub, %c0, %c1 nburst(%c1, %c1, %c1) : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 return } } - -// CHECK-LABEL: llvm.func @mte_gm_ub_a3_nopad_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.v220({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64) -> () -// CHECK-NOT: ALIGN.V2 diff --git a/test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto similarity index 66% rename from test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto rename to test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto index 0ac630eb11..1b615aa0fa 100644 --- a/test/lit/vpto/ub/mte_gm_ub_a3_pad_llvm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto @@ -6,27 +6,24 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// A3: mte_gm_ub with padding → expanded → lowered to -// SET.MOV.PAD.VAL + MOV.OUT.TO.UB.ALIGN.V2.f32 (no .DV) - -// RUN: ( mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// A3: mte_gm_ub with padding -> SET.MOV.PAD.VAL + MOV.OUT.TO.UB.ALIGN.V2.f32. +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @mte_gm_ub_a3_pad_f32_mix_aiv( func.func @mte_gm_ub_a3_pad_f32(%arg0: !pto.ptr) attributes {pto.aicore} { %c0 = arith.constant 0 : i64 %c1 = arith.constant 1 : i64 %c2 = arith.constant 2 : i64 - %pad_val = arith.constant 0.0 : f32 + %padVal = arith.constant 0.0 : f32 %ub = pto.castptr %c0 : i64 -> !pto.ptr + // CHECK: llvm.call @llvm.hivm.SET.MOV.PAD.VAL + // CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}, {{.*}}, {{.*}}, {{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () + // CHECK-NOT: .DV pto.mte_gm_ub %arg0, %ub, %c0, %c1 nburst(%c1, %c1, %c1) - pad(%pad_val, %c2, %c2) + pad(%padVal, %c2, %c2) : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, pad f32, i64, i64 return } } - -// CHECK-LABEL: llvm.func @mte_gm_ub_a3_pad_f32_mix_aiv -// CHECK: llvm.call @llvm.hivm.SET.MOV.PAD.VAL -// CHECK: llvm.call @llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32({{.*}}) : (!llvm.ptr<6>, !llvm.ptr<1>, i64, i64) -> () -// CHECK-NOT: .DV diff --git a/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto b/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto deleted file mode 100644 index 1b2f4e8a2f..0000000000 --- a/test/lit/vpto/ub/ub_vsub_vmul_vdiv_llvm.pto +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2026 Huawei Technologies Co., Ltd. -// This program is free software, you can redistribute it and/or modify it under the terms and conditions of -// CANN Open Software License Agreement Version 2.0 (the "License"). -// Please refer to the License for details. You may not use this file except in compliance with the License. -// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -// See LICENSE in the root of the software repository for the full text of the License. - -// Test pto.ub.vsub/vmul/vdiv → llvm.hivm.VSUB/VMUL/VDIV lowering. - -// RUN: (mkdir -p %T && ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s - -// CHECK-LABEL: llvm.func @vsub_llvm_mix_aiv -// CHECK: llvm.call @llvm.hivm.VSUB.f32 - -// CHECK-LABEL: llvm.func @vmul_llvm_mix_aiv -// CHECK: llvm.call @llvm.hivm.VMUL.f32 - -// CHECK-LABEL: llvm.func @vdiv_llvm_mix_aiv -// CHECK: llvm.call @llvm.hivm.VDIV.f32 - -module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - - func.func @vsub_llvm() attributes {pto.aicore} { - %c0 = arith.constant 0 : i64 - %c1 = arith.constant 1 : i64 - %c8 = arith.constant 8 : i64 - %ptr = pto.castptr %c0 : i64 -> !pto.ptr - pto.ub.vsub %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : - !pto.ptr, !pto.ptr, !pto.ptr, - i64, i64, i64, i64, i64, i64, i64 - return - } - - func.func @vmul_llvm() attributes {pto.aicore} { - %c0 = arith.constant 0 : i64 - %c1 = arith.constant 1 : i64 - %c8 = arith.constant 8 : i64 - %ptr = pto.castptr %c0 : i64 -> !pto.ptr - pto.ub.vmul %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : - !pto.ptr, !pto.ptr, !pto.ptr, - i64, i64, i64, i64, i64, i64, i64 - return - } - - func.func @vdiv_llvm() attributes {pto.aicore} { - %c0 = arith.constant 0 : i64 - %c1 = arith.constant 1 : i64 - %c8 = arith.constant 8 : i64 - %ptr = pto.castptr %c0 : i64 -> !pto.ptr - pto.ub.vdiv %ptr, %ptr, %ptr, %c1, %c1, %c1, %c1, %c8, %c8, %c0 : - !pto.ptr, !pto.ptr, !pto.ptr, - i64, i64, i64, i64, i64, i64, i64 - return - } -} From 26aecedd442f0e5e06d79d2d5d5142bbc930763f Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 2 Jul 2026 12:03:47 +0200 Subject: [PATCH 08/29] roundtrip and verifyier --- .../vpto/ub/invalid/gm_operand_invalid.pto | 22 ++++++ test/lit/vpto/ub/round_trip/binary_ops.pto | 76 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 test/lit/vpto/ub/invalid/gm_operand_invalid.pto create mode 100644 test/lit/vpto/ub/round_trip/binary_ops.pto diff --git a/test/lit/vpto/ub/invalid/gm_operand_invalid.pto b/test/lit/vpto/ub/invalid/gm_operand_invalid.pto new file mode 100644 index 0000000000..25c0535253 --- /dev/null +++ b/test/lit/vpto/ub/invalid/gm_operand_invalid.pto @@ -0,0 +1,22 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Verifier error: UB binary ops must use UB-backed pointer operands. +// All 7 new ops (vmax/vmin/vand/vor/vxor/vshl/vshr) share the same verify() +// which rejects non-UB memory roles. Tests with GM-backed pointers. +// RUN: not ptoas --pto-arch=a3 --pto-backend=vpto %s 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @bad_gm_operand(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: requires UB-backed operands + pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} diff --git a/test/lit/vpto/ub/round_trip/binary_ops.pto b/test/lit/vpto/ub/round_trip/binary_ops.pto new file mode 100644 index 0000000000..3638194402 --- /dev/null +++ b/test/lit/vpto/ub/round_trip/binary_ops.pto @@ -0,0 +1,76 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Round-trip (parse -> print) tests for all 7 binary UB elementwise ops. +// Verifies op mnemonic, operand order, and type annotation survive parsing. +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=vpto-split-cv-module 2>&1 || true ) | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @rt_vmax + func.func @rt_vmax(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vmax %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vmax %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vmin + func.func @rt_vmin(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vmin %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vmin %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vand + func.func @rt_vand(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vand %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vand %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vor + func.func @rt_vor(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vor %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vxor + func.func @rt_vxor(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vxor %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vxor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vshl + func.func @rt_vshl(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vshl %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vshl %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: func.func @rt_vshr + func.func @rt_vshr(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c1 = arith.constant 1 : i64 + %c0 = arith.constant 0 : i64 + // CHECK: pto.ub.vshr %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vshr %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} From 3ccb0de7bf2192da4314e947fdd41d2ae32059f6 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 2 Jul 2026 14:55:29 +0200 Subject: [PATCH 09/29] cover unaligned tadd --- lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 16 +++++--- ptodsl/tests/e2e/test_binary_elementwise.py | 4 ++ .../elementwise/tadd_chunked_tail.pto | 18 ++++++--- .../elementwise/tadd_count_nonaligned.pto | 37 +++++++++++++++++++ 4 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 0263aac50c..2d23e66843 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -28,6 +28,8 @@ #include "llvm/ADT/SmallVector.h" +#include + using namespace mlir; namespace mlir { @@ -575,7 +577,7 @@ struct LowerPTOToUBufOpsPass int64_t headRepeats = totalV / epr; int64_t tailElements = totalV % epr; - if (headRepeats > 1) { + if (headRepeats > 1 || tailElements > 0) { auto forOp = b.create(loc, idxc0(loc, b), idxc(headRepeats, loc, b), idxc1(loc, b)); b.setInsertionPointToStart(forOp.getBody()); @@ -858,10 +860,8 @@ struct LowerPTOToUBufOpsPass if (vCols == cols || vRows == 1) { int64_t totalV = vRows * vCols; int64_t totalRpts = (totalV + epr - 1) / epr; - bool nonVLAligned = - (vCols > static_cast(epr)) && ((vCols % epr) != 0); - if (nonVLAligned || totalRpts > kRepeatMax) + if (totalRpts > kRepeatMax) modeCount1L(loc, b, dst, s0, s1, ptrTy, info); else modeNorm1L(loc, b, dst, s0, s1, ptrTy, info); @@ -922,10 +922,12 @@ struct LowerPTOToUBufOpsPass template void modeCount1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; int64_t totalV = info.vRows * info.vCols; + int64_t totalRpts = (totalV + epr - 1) / epr; b.create(loc); b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); - emitUBBinOp(loc, b, dst, s0, s1, i64c0(loc, b), i64c8(loc, b)); + emitUBBinOp(loc, b, dst, s0, s1, i64c(totalRpts, loc, b), i64c8(loc, b)); b.create(loc); fullMask(loc, b); } @@ -961,7 +963,9 @@ struct LowerPTOToUBufOpsPass template void modeCount2L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; int64_t rowStride = info.cols; + int64_t colRpts = (info.vCols + epr - 1) / epr; b.create(loc); b.create(loc, i64c(info.vCols, loc, b), i64c0(loc, b)); @@ -975,7 +979,7 @@ struct LowerPTOToUBufOpsPass Value rd = addPtr(loc, b, dst, ptrTy, off); Value rs0 = addPtr(loc, b, s0, ptrTy, off); Value rs1 = addPtr(loc, b, s1, ptrTy, off); - emitUBBinOp(loc, b, rd, rs0, rs1, i64c0(loc, b), i64c8(loc, b)); + emitUBBinOp(loc, b, rd, rs0, rs1, i64c(colRpts, loc, b), i64c8(loc, b)); b.setInsertionPointAfter(forOp); b.create(loc); diff --git a/ptodsl/tests/e2e/test_binary_elementwise.py b/ptodsl/tests/e2e/test_binary_elementwise.py index dbfe3afd60..7a7a3f19c4 100644 --- a/ptodsl/tests/e2e/test_binary_elementwise.py +++ b/ptodsl/tests/e2e/test_binary_elementwise.py @@ -51,6 +51,10 @@ # Large tiles (exercises multi-repeat and UB bank layout) (16, 256, "modeNorm1L 16x256"), (32, 32, "modeSmall 32x32 square small"), + # Non-epr-aligned shapes (exercises modeCount1L with repeat>0) + (1, 200, "modeCount1L 1x200 nonVLAligned"), + (4, 200, "modeCount1L 4x200 nonVLAligned"), + (1, 96, "modeCount1L 1x96 nonVLAligned"), ] F16_EPR = 128 # elementsPerRepeat = 256 / sizeof(f16) diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto index 504ec889cb..6336626044 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto @@ -6,7 +6,8 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Bin1LCountMode: nonVLAligned + totalRepeats > 255. 41x200 f32 -> count mode. +// Non-epr-aligned 41x200 f32: routed through modeNorm1L with loop+tail. +// headRepeats=128 (8200/64), tailElements=8 (8200%64). // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { @@ -15,13 +16,20 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // 128 full repeats of 64 elements each + // CHECK: scf.for {{.*}} = %c0 to %c128 // CHECK: pto.ub.set_mask_count - // CHECK: pto.ub.set_mask - // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK: pto.ub.set_mask %c64_i64 + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}}, %c1_i64 + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // Tail: 8 elements at offset 8192 + // CHECK: pto.addptr {{.*}}, %c8192 + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask %c8_i64 + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}}, %c1_i64 // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 // CHECK: pto.ub.set_mask_norm - // CHECK: pto.ub.set_mask %c-1_i64, %c0 - // CHECK-NOT: scf.for pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd return diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto new file mode 100644 index 0000000000..f4df5fbb14 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto @@ -0,0 +1,37 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// Non-epr-aligned shape: 1x200 f32 routed through modeNorm1L with loop+tail. +// headRepeats=3 (200/64), tailElements=8 (200%64). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @tadd_count_nonaligned() + func.func @tadd_count_nonaligned() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + // 3 full repeats of 64 elements each, then 8-element tail + // CHECK: scf.for {{.*}} = %c0 to %c3 + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask %c64_i64 + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}}, %c1_i64 + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // Tail: 8 elements + // CHECK: pto.addptr {{.*}}, %c192 + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.set_mask %c8_i64 + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}}, %c1_i64 + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK-NOT: pto.tadd + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} From 5c0367bb9b3b527a6473b8256fd743647aa2dd0e Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Fri, 3 Jul 2026 09:19:35 +0200 Subject: [PATCH 10/29] shift ops --- include/PTO/IR/VPTOUbOps.td | 46 +++++++- lib/PTO/IR/VPTO.cpp | 18 +-- lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 104 ++++++++++++++--- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 106 +++++++++++++++++- ptodsl/tests/e2e/common.py | 84 ++++++++++++++ ptodsl/tests/e2e/test_binary_elementwise.py | 39 ++++++- test/lit/vpto/ub/round_trip/binary_ops.pto | 14 ++- .../vpto/ub/tile_to_ub/elementwise/tshl.pto | 27 +++-- .../vpto/ub/tile_to_ub/elementwise/tshr.pto | 27 +++-- .../ub/ub_to_llvm/elementwise/bitwise.pto | 26 ++--- 10 files changed, 405 insertions(+), 86 deletions(-) diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index c4f86a2fe0..c8845187e4 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -66,8 +66,50 @@ def PTO_UBVminOp : PTO_UBufBinaryOp<"ub.vmin">; def PTO_UBVandOp : PTO_UBufBinaryOp<"ub.vand">; def PTO_UBVorOp : PTO_UBufBinaryOp<"ub.vor">; def PTO_UBVxorOp : PTO_UBufBinaryOp<"ub.vxor">; -def PTO_UBVshlOp : PTO_UBufBinaryOp<"ub.vshl">; -def PTO_UBVshrOp : PTO_UBufBinaryOp<"ub.vshr">; + +//===----------------------------------------------------------------------===// +// PTO_UBufShiftOp — unary shift with scalar distance +//===----------------------------------------------------------------------===// + +class PTO_UBufShiftOp traits = []> + : PTO_Op])> { + let summary = "Raw ubuf shift operation mapping to llvm.hivm.VSHL/VSHR."; + let description = [{ + Lowers to `llvm.hivm.VSHL.u16` / `llvm.hivm.VSHR.u16` for the a2a3 + (dav-c220-vec) backend. Operates directly on ubuf pointers. + + Unlike binary ops, shift takes a single source pointer and a scalar + `shiftDist` (i64) — the hardware applies a uniform shift to all elements. + }]; + + let arguments = (ins + PTO_BufferType:$dst, + PTO_BufferType:$src, + I64:$shiftDist, + I64:$repeat, + I64:$dstBlockStride, + I64:$srcBlockStride, + I64:$dstRepeatStride, + I64:$srcRepeatStride + ); + + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + $dst `,` $src `,` $shiftDist `,` + $repeat `,` $dstBlockStride `,` $srcBlockStride `,` + $dstRepeatStride `,` $srcRepeatStride + attr-dict `:` type($dst) `,` type($src) `,` type($shiftDist) `,` + type($repeat) `,` type($dstBlockStride) `,` type($srcBlockStride) `,` + type($dstRepeatStride) `,` type($srcRepeatStride) + }]; +} + +def PTO_UBVshlOp : PTO_UBufShiftOp<"ub.vshl">; +def PTO_UBVshrOp : PTO_UBufShiftOp<"ub.vshr">; def PTO_UBSetMaskOp : PTO_Op<"ub.set_mask", [ DeclareOpInterfaceMethods diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index 044a0b776d..5827dd9e18 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8038,18 +8038,15 @@ LogicalResult UBVxorOp::verify() { void UBVshlOp::getEffects( SmallVectorImpl> &effects) { - effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); - effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); } LogicalResult UBVshlOp::verify() { - if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || - !isBufferLike(getSrc1().getType())) + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) return emitOpError("requires pointer-like operands"); if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) return emitOpError("requires UB-backed operands"); return success(); } @@ -8061,18 +8058,15 @@ LogicalResult UBVshlOp::verify() { void UBVshrOp::getEffects( SmallVectorImpl> &effects) { - effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); - effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); } LogicalResult UBVshrOp::verify() { - if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || - !isBufferLike(getSrc1().getType())) + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) return emitOpError("requires pointer-like operands"); if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) return emitOpError("requires UB-backed operands"); return success(); } diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 2d23e66843..1167b00500 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -432,42 +432,40 @@ struct LowerPTOToUBufOpsPass } } - // ---- tshl → pto.ub.vshl ---- + // ---- tshls → pto.ub.vshl (scalar shift) ---- { - SmallVector ops; - func.walk([&](pto::TShlOp op) { ops.push_back(op); }); + SmallVector ops; + func.walk([&](pto::TShlSOp op) { ops.push_back(op); }); for (auto op : ops) { - if (!canLower(op, tileShapes)) - continue; auto info = extractTileShapeInfo(op, tileShapes); if (!info) continue; - auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( - builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); if (!dstPtr) continue; - dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, - ptrType, *info); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + op.getScalar(), ptrType, *info); op.erase(); } } - // ---- tshr → pto.ub.vshr ---- + // ---- tshrs → pto.ub.vshr (scalar shift) ---- { - SmallVector ops; - func.walk([&](pto::TShrOp op) { ops.push_back(op); }); + SmallVector ops; + func.walk([&](pto::TShrSOp op) { ops.push_back(op); }); for (auto op : ops) { - if (!canLower(op, tileShapes)) - continue; auto info = extractTileShapeInfo(op, tileShapes); if (!info) continue; - auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( - builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); if (!dstPtr) continue; - dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, - ptrType, *info); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + op.getScalar(), ptrType, *info); op.erase(); } } @@ -569,6 +567,76 @@ struct LowerPTOToUBufOpsPass return {dstPtr, src0Ptr, src1Ptr, ptrType}; } + std::tuple + lowerShiftOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, + Value dstVal, Value srcVal, + const DenseMap> &tileShapes) { + Location loc = op->getLoc(); + builder.setInsertionPoint(op); + Type elemTy = getStoredElemType(dstVal.getType()); + auto ptrType = getUBPtrType(ctx, elemTy); + + auto emitAddr = [&](Value tile) -> Value { + if (isa(tile.getType())) + return tile; + auto addrOp = builder.create(loc, ptrType, tile); + return addrOp.getDst(); + }; + + Value dstPtr = emitAddr(dstVal); + Value srcPtr = emitAddr(srcVal); + return {dstPtr, srcPtr, ptrType}; + } + + template + void dispatchShift(Location loc, OpBuilder &b, Value dst, Value src, + Value scalar, pto::PtrType ptrTy, + const TileShapeInfo &info) { + int64_t epr = info.elementsPerRepeat; + int64_t totalV = info.vRows * info.vCols; + int64_t headRepeats = totalV / epr; + int64_t tailElements = totalV % epr; + + auto emitShift = [&](Value d, Value s) { + Value shiftDist = b.create( + loc, b.getI64Type(), scalar); + b.create(loc, d, s, shiftDist, + i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), + i64c8(loc, b), i64c8(loc, b)); + }; + + if (headRepeats > 1 || tailElements > 0) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(headRepeats, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, src, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emitShift(rd, r0); + b.create(loc); + b.setInsertionPointAfter(forOp); + if (tailElements > 0) { + Value offT = idxc(headRepeats * epr, loc, b); + Value td = addPtr(loc, b, dst, ptrTy, offT); + Value ts0 = addPtr(loc, b, src, ptrTy, offT); + b.create(loc); + b.create(loc, i64c(tailElements, loc, b), i64c0(loc, b)); + emitShift(td, ts0); + b.create(loc); + } + return; + } + + b.create(loc); + b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); + emitShift(dst, src); + b.create(loc); + fullMask(loc, b); + } + template void modeNorm1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 784859deff..f88be7ef9f 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4641,10 +4641,6 @@ class LowerUBufBinaryOpPattern final : public OpConversionPattern { calleeName = "llvm.hivm.VOR." + elemFrag; else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VXOR." + elemFrag; - else if constexpr (std::is_same_v) - calleeName = "llvm.hivm.VSHL." + elemFrag; - else if constexpr (std::is_same_v) - calleeName = "llvm.hivm.VSHR." + elemFrag; else return rewriter.notifyMatchFailure(op, "unsupported ubuf binary op"); @@ -4707,6 +4703,104 @@ class LowerUBufBinaryOpPattern final : public OpConversionPattern { LoweringState &state; }; +template +class LowerUBufShiftOpPattern final : public OpConversionPattern { +public: + explicit LowerUBufShiftOpPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), state(state) {} + + LogicalResult + matchAndRewrite(ShiftOp op, typename ShiftOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto ptrType = mlir::cast(op.getSrc().getType()); + Type elemType = ptrType.getElementType(); + std::string elemFrag = getElementTypeFragment(elemType); + if (elemFrag.empty()) + return rewriter.notifyMatchFailure( + op, "unsupported element type for ubuf shift op"); + + if (elemFrag == "s16") + elemFrag = "u16"; + else if (elemFrag == "s32") + elemFrag = "u32"; + + std::string calleeName; + if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSHL." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSHR." + elemFrag; + else + return rewriter.notifyMatchFailure(op, "unsupported ubuf shift op"); + + Value dst = adaptor.getDst(); + Value src = adaptor.getSrc(); + if (!dst || !src || + !isa(dst.getType()) || + !isa(src.getType())) + return rewriter.notifyMatchFailure( + op, "unexpected converted ubuf shift operand types"); + + Location loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + auto getI64 = [&](Value v) -> Value { + return castIntegerLikeTo(op, v, i64Ty); + }; + auto maskByte = [&](Value v) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(0xff))); + }; + auto shl = [&](Value v, uint64_t amount) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(amount))); + }; + // Unary config layout (same as VABS): + // repeat[63:56], dstBlkStride[15:0], srcBlkStride[31:16], + // dstRepStride[39:32], srcRepStride[51:40] + Value config = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getRepeat())), 56)); + config = rewriter.create( + loc, config, maskByte(getI64(adaptor.getDstBlockStride()))); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcBlockStride())), 16)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstRepeatStride())), 32)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcRepeatStride())), 40)); + + Value shiftDist = getI64(adaptor.getShiftDist()); + + if constexpr (std::is_same_v) { + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src.getType(), i64Ty, i64Ty}, + TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, src, shiftDist, config}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + } else { + Value roundZero = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src.getType(), i64Ty, i64Ty, i64Ty}, + TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, src, shiftDist, config, + roundZero}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + } + + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + class LowerUBSetMaskOpPattern final : public OpConversionPattern { public: @@ -10385,9 +10479,9 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); - patterns.add>( + patterns.add>( typeConverter, patterns.getContext(), state); - patterns.add>( + patterns.add>( typeConverter, patterns.getContext(), state); patterns.add( typeConverter, patterns.getContext(), state); diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index 90ed9abc5d..90acac7c8f 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -33,6 +33,11 @@ "bit_or": (pto.tile.bit_or, lambda x, y: x | y), } +SHIFT_OPS = { + "bit_shls": (pto.tile.bit_shls, lambda x, n: np.left_shift(x, n)), + "bit_shrs": (pto.tile.bit_shrs, lambda x, n: np.right_shift(x, n)), +} + def _npu_stream(torch): return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 @@ -78,6 +83,35 @@ def launch_and_check_int( return compile_s, launch_s +def launch_and_check_shift( + *, + kernel_handle, + ref_fn: Callable, + shape: tuple[int, int], + shift_val: int, + torch, + seed: int = 42, +): + """Compile, launch, and numerical-check one i16 scalar-shift kernel.""" + x = make_input_int(shape, torch, seed=seed) + z = torch.empty(shape, dtype=torch.int16, device="npu:0") + ref = ref_fn(x.cpu().numpy(), shift_val).astype(np.int16) + stream = _npu_stream(torch) + + t0 = time.perf_counter() + compiled = kernel_handle.compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](x.data_ptr(), z.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + actual = z.cpu().numpy() + np.testing.assert_array_equal(actual, ref) + return compile_s, launch_s + + def make_binary_kernel( op_name: str, rows: int, @@ -137,6 +171,56 @@ def kernel_body( )(kernel_body) +def make_shift_kernel( + op_name: str, + rows: int, + cols: int, + shift_val: int = 3, + target: str = "a3", + backend: str = "vpto", + kernel_kind: str = "vector", +): + """Return a ``@pto.jit`` KernelHandle for a scalar shift op (tshls/tshrs).""" + tile_op_fn = SHIFT_OPS[op_name][0] + pto_dtype = pto.int16 + fn_name = f"shift_{op_name}_int16_{rows}x{cols}_s{shift_val}" + + def kernel_body( + A_ptr: pto.ptr(pto_dtype, "gm"), + C_ptr: pto.ptr(pto_dtype, "gm"), + ) -> None: + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A_ptr, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C_ptr, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + + pto.tile.load(a_part, a_tile) + tile_op_fn(a_tile, shift_val, c_tile) + pto.tile.store(c_tile, c_part) + + kernel_body.__name__ = fn_name + return pto.jit( + name=fn_name, + kernel_kind=kernel_kind, + target=target, + backend=backend, + )(kernel_body) + + def make_input(shape, dtype, torch, seed=42): """Return an NPU tensor filled with seeded random small integers. diff --git a/ptodsl/tests/e2e/test_binary_elementwise.py b/ptodsl/tests/e2e/test_binary_elementwise.py index 7a7a3f19c4..b0248dcec0 100644 --- a/ptodsl/tests/e2e/test_binary_elementwise.py +++ b/ptodsl/tests/e2e/test_binary_elementwise.py @@ -23,7 +23,7 @@ import pytest -from .common import BINARY_OPS, INT_OPS, make_binary_kernel, launch_and_check, launch_and_check_int +from .common import BINARY_OPS, INT_OPS, SHIFT_OPS, make_binary_kernel, make_shift_kernel, launch_and_check, launch_and_check_int, launch_and_check_shift # --------------------------------------------------------------------------- @@ -184,3 +184,40 @@ def test_binary_int16(case, torch, target_arch, backend): ) print(f" PASS {op_name} int16 {rows}x{cols} ({desc}) " f"compile={compile_s:.3f}s launch={launch_s:.3f}s") + + +# --------------------------------------------------------------------------- +# i16 scalar shift tests (tshls/tshrs) +# --------------------------------------------------------------------------- + +SHIFT_VALS = [1, 3, 7] + +SHIFT_PARAMS = [ + pytest.param( + (op_name, ref_fn, rows, cols, sv, desc), + id=f"{op_name}-int16-{rows}x{cols}-s{sv}-{desc.replace(' ', '-')}", + ) + for op_name, (_, ref_fn) in SHIFT_OPS.items() + for rows, cols, desc in INT_SHAPES + for sv in SHIFT_VALS +] + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", SHIFT_PARAMS) +def test_shift_int16(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, shift_val, desc = case + + kernel = make_shift_kernel( + op_name, rows, cols, shift_val=shift_val, + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_shift( + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + shift_val=shift_val, + torch=torch, + ) + print(f" PASS {op_name} int16 {rows}x{cols} <<{shift_val} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") diff --git a/test/lit/vpto/ub/round_trip/binary_ops.pto b/test/lit/vpto/ub/round_trip/binary_ops.pto index 3638194402..b25b89fda9 100644 --- a/test/lit/vpto/ub/round_trip/binary_ops.pto +++ b/test/lit/vpto/ub/round_trip/binary_ops.pto @@ -57,20 +57,22 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + func.func @rt_vshl(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 - // CHECK: pto.ub.vshl %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.ub.vshl %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + %shift = arith.constant 3 : i64 + // CHECK: pto.ub.vshl %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + pto.ub.vshl %dst, %src, %shift, %c1, %c1, %c1, %c1, %c0 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } // CHECK-LABEL: func.func @rt_vshr - func.func @rt_vshr(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + func.func @rt_vshr(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 - // CHECK: pto.ub.vshr %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.ub.vshr %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + %shift = arith.constant 2 : i64 + // CHECK: pto.ub.vshr %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + pto.ub.vshr %dst, %src, %shift, %c1, %c1, %c1, %c1, %c0 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } } diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto index 02138eb4d0..66bed2958a 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// tshl -> ub.vshl lowering. -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// tshls -> ub.vshl lowering (scalar shift distance). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - // CHECK-LABEL: func.func @lower_tshl() - func.func @lower_tshl() attributes {pto.aicore} { - // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %dst = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %src0 = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %src1 = pto.alloc_tile : !pto.tile_buf - // CHECK: pto.ub.vshl %[[DST]], %[[SRC0]], %[[SRC1]] - // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.tshl ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - // CHECK-NOT: pto.tshl + // CHECK-LABEL: func.func @lower_tshls() + func.func @lower_tshls() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + %c3_i32 = arith.constant 3 : i32 + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vshl {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK-NOT: pto.tshls + pto.tshls ins(%src, %c3_i32 : !pto.tile_buf, i32) outs(%dst : !pto.tile_buf) return } } diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto index 11a05d0507..ff2a275d57 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto @@ -6,22 +6,21 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// tshr -> ub.vshr lowering. -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 || true ) | FileCheck %s +// tshrs -> ub.vshr lowering (scalar shift distance). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { - // CHECK-LABEL: func.func @lower_tshr() - func.func @lower_tshr() attributes {pto.aicore} { - // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %dst = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %src0 = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr - %src1 = pto.alloc_tile : !pto.tile_buf - // CHECK: pto.ub.vshr %[[DST]], %[[SRC0]], %[[SRC1]] - // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.tshr ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) - // CHECK-NOT: pto.tshr + // CHECK-LABEL: func.func @lower_tshrs() + func.func @lower_tshrs() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + %c2_i32 = arith.constant 2 : i32 + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vshr {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + // CHECK-NOT: pto.tshrs + pto.tshrs ins(%src, %c2_i32 : !pto.tile_buf, i32) outs(%dst : !pto.tile_buf) return } } diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto index 31af0b3433..7e16336128 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto @@ -6,7 +6,9 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// pto.ub.vand/vor/vxor/vshl/vshr -> llvm.hivm.VAND/VOR/VXOR/VSHL/VSHR.s16. +// pto.ub.vand/vor/vxor -> llvm.hivm.VAND/VOR/VXOR.s16. +// pto.ub.vshl -> llvm.hivm.VSHL.u16 (4-arg: dst, src, shiftDist, config). +// pto.ub.vshr -> llvm.hivm.VSHR.u16 (5-arg: dst, src, shiftDist, config, round=0). // RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { @@ -50,28 +52,26 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> - func.func @ub_vshl_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC:[^:]+]]: !llvm.ptr<6> + func.func @ub_vshl_s16(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 - // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 - // CHECK: llvm.mlir.constant(255 : i64) : i64 - // CHECK: llvm.call @llvm.hivm.VSHL.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + %shift = arith.constant 3 : i64 + // CHECK: llvm.call @llvm.hivm.VSHL.u16(%[[DST]], %[[SRC]], {{%.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<6>, i64, i64) -> () // CHECK-NOT: pto.ub. - pto.ub.vshl %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vshl %dst, %src, %shift, %c1, %c1, %c1, %c1, %c0 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } // CHECK-LABEL: llvm.func @ub_vshr_s16_mix_aiv( - // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> - func.func @ub_vshr_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC:[^:]+]]: !llvm.ptr<6> + func.func @ub_vshr_s16(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 %c0 = arith.constant 0 : i64 - // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 - // CHECK: llvm.mlir.constant(255 : i64) : i64 - // CHECK: llvm.call @llvm.hivm.VSHR.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + %shift = arith.constant 2 : i64 + // CHECK: llvm.call @llvm.hivm.VSHR.u16(%[[DST]], %[[SRC]], {{%.*}}, {{%.*}}, {{%.*}}) : (!llvm.ptr<6>, !llvm.ptr<6>, i64, i64, i64) -> () // CHECK-NOT: pto.ub. - pto.ub.vshr %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.ub.vshr %dst, %src, %shift, %c1, %c1, %c1, %c1, %c0 : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 return } } From 41ad43816101a34a5020dfa2debef788ed5e9927 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Fri, 3 Jul 2026 13:50:04 +0200 Subject: [PATCH 11/29] fix xor --- include/PTO/IR/VPTOUbOps.td | 43 ++++- lib/PTO/IR/VPTO.cpp | 15 +- lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 152 ++++++++++++++++-- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 84 +++++++++- ptodsl/tests/e2e/common.py | 7 +- test/lit/vpto/ub/round_trip/binary_ops.pto | 11 +- .../vpto/ub/tile_to_ub/elementwise/txor.pto | 23 ++- .../ub/ub_to_llvm/elementwise/bitwise.pto | 17 +- 8 files changed, 294 insertions(+), 58 deletions(-) diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index c8845187e4..ab4dbd994a 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -65,7 +65,48 @@ def PTO_UBVmaxOp : PTO_UBufBinaryOp<"ub.vmax">; def PTO_UBVminOp : PTO_UBufBinaryOp<"ub.vmin">; def PTO_UBVandOp : PTO_UBufBinaryOp<"ub.vand">; def PTO_UBVorOp : PTO_UBufBinaryOp<"ub.vor">; -def PTO_UBVxorOp : PTO_UBufBinaryOp<"ub.vxor">; + +//===----------------------------------------------------------------------===// +// PTO_UBufUnaryOp — unary elementwise (VNOT) +//===----------------------------------------------------------------------===// + +class PTO_UBufUnaryOp traits = []> + : PTO_Op])> { + let summary = "Raw ubuf unary operation mapping to llvm.hivm intrinsics."; + let description = [{ + Lowers to `llvm.hivm` unary intrinsics (e.g. VNOT) for the a2a3 + (dav-c220-vec) backend. Operates directly on ubuf pointers. + + Config word uses unary layout: repeat[63:56], dstBlkStride[15:0], + srcBlkStride[31:16], dstRepStride[39:32], srcRepStride[51:40]. + }]; + + let arguments = (ins + PTO_BufferType:$dst, + PTO_BufferType:$src, + I64:$repeat, + I64:$dstBlockStride, + I64:$srcBlockStride, + I64:$dstRepeatStride, + I64:$srcRepeatStride + ); + + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + $dst `,` $src `,` + $repeat `,` $dstBlockStride `,` $srcBlockStride `,` + $dstRepeatStride `,` $srcRepeatStride + attr-dict `:` type($dst) `,` type($src) `,` + type($repeat) `,` type($dstBlockStride) `,` type($srcBlockStride) `,` + type($dstRepeatStride) `,` type($srcRepeatStride) + }]; +} + +def PTO_UBVnotOp : PTO_UBufUnaryOp<"ub.vnot">; //===----------------------------------------------------------------------===// // PTO_UBufShiftOp — unary shift with scalar distance diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index 5827dd9e18..eb2a3a22d7 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8009,24 +8009,21 @@ LogicalResult UBVorOp::verify() { } //===----------------------------------------------------------------------===// -// UBVxorOp +// UBVnotOp //===----------------------------------------------------------------------===// -void UBVxorOp::getEffects( +void UBVnotOp::getEffects( SmallVectorImpl> &effects) { - effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); - effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); } -LogicalResult UBVxorOp::verify() { - if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc0().getType()) || - !isBufferLike(getSrc1().getType())) +LogicalResult UBVnotOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) return emitOpError("requires pointer-like operands"); if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || - classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) return emitOpError("requires UB-backed operands"); return success(); } diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 1167b00500..9d8d0da4ce 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -46,6 +46,8 @@ static constexpr int64_t kRepeatStrideMax = 255; static constexpr int64_t kSmallRptBinOp = 4; static constexpr int64_t kDefaultRepeatStride = 8; static constexpr unsigned kMaskLen = 64; +static constexpr uint64_t kA3VecLocalMemBytes = 1572864 / 8; +static constexpr uint64_t kLocalMemAlignmentBytes = 256; //===----------------------------------------------------------------------===// // Utilities @@ -134,10 +136,9 @@ struct TileShapeInfo { unsigned blockSizeElem; }; -static std::optional extractTileShapeInfo( - Operation *op, +static std::optional extractTileShapeInfoFromValue( + Value opDst, const DenseMap> &tileShapes) { - auto opDst = op->getOperand(2); Type dstTy = opDst.getType(); if (!isUBMemorySpace(dstTy)) return std::nullopt; @@ -193,6 +194,12 @@ static std::optional extractTileShapeInfo( return info; } +static std::optional extractTileShapeInfo( + Operation *op, + const DenseMap> &tileShapes) { + return extractTileShapeInfoFromValue(op->getOperand(2), tileShapes); +} + static bool canLower(Operation *op, const DenseMap> &tileShapes) { return extractTileShapeInfo(op, tileShapes).has_value(); @@ -227,15 +234,36 @@ struct LowerPTOToUBufOpsPass SmallVector allocOps; func.walk([&](pto::AllocTileOp op) { allocOps.push_back(op); }); uint64_t offset = 0; - constexpr uint64_t ubBankAlignment = 65536; for (auto op : allocOps) { auto tbTy = cast(op.getResult().getType()); auto shape = tbTy.getShape(); uint64_t numElems = 1; - for (auto d : shape) + for (auto d : shape) { + if (d == ShapedType::kDynamic || d < 0) { + op.emitError("A3 UB manual allocation requires static tile shapes"); + signalPassFailure(); + return; + } numElems *= d; + } uint64_t elemSize = getElementSize(tbTy.getElementType()); + if (elemSize == 0) { + op.emitError("A3 UB manual allocation does not support element type ") + << tbTy.getElementType(); + signalPassFailure(); + return; + } uint64_t totalBytes = numElems * elemSize; + uint64_t paddedBytes = + (totalBytes + kLocalMemAlignmentBytes - 1) / + kLocalMemAlignmentBytes * kLocalMemAlignmentBytes; + if (offset + paddedBytes > kA3VecLocalMemBytes) { + op.emitError("A3 UB manual allocation exceeds local memory capacity: ") + << (offset + paddedBytes) << " bytes requested, capacity is " + << kA3VecLocalMemBytes << " bytes"; + signalPassFailure(); + return; + } builder.setInsertionPoint(op); auto addrConst = builder.create( op.getLoc(), builder.getI64IntegerAttr(offset)); @@ -247,7 +275,6 @@ struct LowerPTOToUBufOpsPass tileShapes[pc.getResult()] = SmallVector(shape); op.getResult().replaceAllUsesWith(pc.getResult()); op.erase(); - uint64_t paddedBytes = (totalBytes + ubBankAlignment - 1) / ubBankAlignment * ubBankAlignment; offset += paddedBytes; } } @@ -412,22 +439,55 @@ struct LowerPTOToUBufOpsPass } } - // ---- txor → pto.ub.vxor ---- + // ---- txor → vor(tmp) + vand(dst) + vnot(dst) + vand(dst,tmp) ---- + // De Morgan: src0 ^ src1 = ~(src0 & src1) & (src0 | src1) { SmallVector ops; func.walk([&](pto::TXorOp op) { ops.push_back(op); }); for (auto op : ops) { - if (!canLower(op, tileShapes)) + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, tmpPtr, ptrType] = + lowerXorOpCommon(builder, ctx, op, op.getDst(), op.getSrc0(), + op.getSrc1(), op.getTmp(), tileShapes); + if (!dstPtr || !tmpPtr) continue; + auto pipeV = pto::PipeAttr::get(ctx, pto::PIPE::PIPE_V); + // tmp = src0 | src1 + dispatch(op.getLoc(), builder, tmpPtr, src0Ptr, src1Ptr, + ptrType, *info); + builder.create(op.getLoc(), pipeV); + // dst = src0 & src1 + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, + ptrType, *info); + builder.create(op.getLoc(), pipeV); + // dst = ~dst + dispatchUnary(op.getLoc(), builder, dstPtr, dstPtr, + ptrType, *info); + builder.create(op.getLoc(), pipeV); + // dst = dst & tmp + dispatch(op.getLoc(), builder, dstPtr, dstPtr, tmpPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- tnot → pto.ub.vnot ---- + { + SmallVector ops; + func.walk([&](pto::TNotOp op) { ops.push_back(op); }); + for (auto op : ops) { auto info = extractTileShapeInfo(op, tileShapes); if (!info) continue; - auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( - builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); if (!dstPtr) continue; - dispatch(op.getLoc(), builder, dstPtr, src0Ptr, src1Ptr, - ptrType, *info); + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); op.erase(); } } @@ -567,6 +627,29 @@ struct LowerPTOToUBufOpsPass return {dstPtr, src0Ptr, src1Ptr, ptrType}; } + std::tuple + lowerXorOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, + Value dstVal, Value src0Val, Value src1Val, Value tmpVal, + const DenseMap> &tileShapes) { + Location loc = op->getLoc(); + builder.setInsertionPoint(op); + Type elemTy = getStoredElemType(dstVal.getType()); + auto ptrType = getUBPtrType(ctx, elemTy); + + auto emitAddr = [&](Value tile) -> Value { + if (isa(tile.getType())) + return tile; + auto addrOp = builder.create(loc, ptrType, tile); + return addrOp.getDst(); + }; + + Value dstPtr = emitAddr(dstVal); + Value src0Ptr = emitAddr(src0Val); + Value src1Ptr = emitAddr(src1Val); + Value tmpPtr = emitAddr(tmpVal); + return {dstPtr, src0Ptr, src1Ptr, tmpPtr, ptrType}; + } + std::tuple lowerShiftOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, Value dstVal, Value srcVal, @@ -637,6 +720,51 @@ struct LowerPTOToUBufOpsPass fullMask(loc, b); } + template + void dispatchUnary(Location loc, OpBuilder &b, Value dst, Value src, + pto::PtrType ptrTy, const TileShapeInfo &info) { + auto emit = [&](Value rd, Value rs) { + b.create(loc, rd, rs, + i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), + i64c8(loc, b), i64c8(loc, b)); + }; + int64_t epr = info.elementsPerRepeat; + int64_t totalV = info.vRows * info.vCols; + int64_t headRepeats = totalV / epr; + int64_t tailElements = totalV % epr; + + if (headRepeats > 1 || tailElements > 0) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(headRepeats, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value rs = addPtr(loc, b, src, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emit(rd, rs); + b.create(loc); + b.setInsertionPointAfter(forOp); + if (tailElements > 0) { + Value offT = idxc(headRepeats * epr, loc, b); + Value td = addPtr(loc, b, dst, ptrTy, offT); + Value ts = addPtr(loc, b, src, ptrTy, offT); + b.create(loc); + b.create(loc, i64c(tailElements, loc, b), i64c0(loc, b)); + emit(td, ts); + b.create(loc); + } + return; + } + + b.create(loc); + b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); + emit(dst, src); + b.create(loc); + fullMask(loc, b); + } + template void modeNorm1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index f88be7ef9f..80a63c94f4 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4639,8 +4639,6 @@ class LowerUBufBinaryOpPattern final : public OpConversionPattern { calleeName = "llvm.hivm.VAND." + elemFrag; else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VOR." + elemFrag; - else if constexpr (std::is_same_v) - calleeName = "llvm.hivm.VXOR." + elemFrag; else return rewriter.notifyMatchFailure(op, "unsupported ubuf binary op"); @@ -4801,6 +4799,84 @@ class LowerUBufShiftOpPattern final : public OpConversionPattern { LoweringState &state; }; +template +class LowerUBufUnaryOpPattern final : public OpConversionPattern { +public: + explicit LowerUBufUnaryOpPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), state(state) {} + + LogicalResult + matchAndRewrite(UnaryOp op, typename UnaryOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto ptrType = mlir::cast(op.getSrc().getType()); + Type elemType = ptrType.getElementType(); + std::string elemFrag = getElementTypeFragment(elemType); + if (elemFrag.empty()) + return rewriter.notifyMatchFailure( + op, "unsupported element type for ubuf unary op"); + + if (elemFrag == "s16") + elemFrag = "u16"; + + std::string calleeName; + if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VNOT." + elemFrag; + else + return rewriter.notifyMatchFailure(op, "unsupported ubuf unary op"); + + Value dst = adaptor.getDst(); + Value src = adaptor.getSrc(); + if (!dst || !src || + !isa(dst.getType()) || + !isa(src.getType())) + return rewriter.notifyMatchFailure( + op, "unexpected converted ubuf unary operand types"); + + Location loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + auto getI64 = [&](Value v) -> Value { + return castIntegerLikeTo(op, v, i64Ty); + }; + auto maskByte = [&](Value v) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(0xff))); + }; + auto shl = [&](Value v, uint64_t amount) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(amount))); + }; + // Unary config layout (same as VABS/VSHR): repeat[63:56] + Value config = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getRepeat())), 56)); + config = rewriter.create( + loc, config, maskByte(getI64(adaptor.getDstBlockStride()))); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcBlockStride())), 16)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstRepeatStride())), 32)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcRepeatStride())), 40)); + + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src.getType(), i64Ty}, + TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, src, config}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + class LowerUBSetMaskOpPattern final : public OpConversionPattern { public: @@ -10477,7 +10553,7 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); - patterns.add>( + patterns.add>( typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); @@ -10615,7 +10691,7 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); - target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index 90acac7c8f..30007ee2df 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -31,6 +31,7 @@ INT_OPS = { "bit_and": (pto.tile.bit_and, lambda x, y: x & y), "bit_or": (pto.tile.bit_or, lambda x, y: x | y), + "bit_xor": (pto.tile.bit_xor, lambda x, y: x ^ y), } SHIFT_OPS = { @@ -159,7 +160,11 @@ def kernel_body( pto.tile.load(a_part, a_tile) pto.tile.load(b_part, b_tile) - tile_op_fn(a_tile, b_tile, c_tile) + if op_name == "bit_xor": + tmp_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + tile_op_fn(a_tile, b_tile, tmp_tile, c_tile) + else: + tile_op_fn(a_tile, b_tile, c_tile) pto.tile.store(c_tile, c_part) kernel_body.__name__ = fn_name diff --git a/test/lit/vpto/ub/round_trip/binary_ops.pto b/test/lit/vpto/ub/round_trip/binary_ops.pto index b25b89fda9..70b0b3f5ca 100644 --- a/test/lit/vpto/ub/round_trip/binary_ops.pto +++ b/test/lit/vpto/ub/round_trip/binary_ops.pto @@ -8,7 +8,7 @@ // Round-trip (parse -> print) tests for all 7 binary UB elementwise ops. // Verifies op mnemonic, operand order, and type annotation survive parsing. -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=vpto-split-cv-module 2>&1 || true ) | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=vpto-split-cv-module 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @rt_vmax @@ -47,15 +47,6 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { - %c1 = arith.constant 1 : i64 - %c0 = arith.constant 0 : i64 - // CHECK: pto.ub.vxor %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.ub.vxor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - return - } - // CHECK-LABEL: func.func @rt_vshl func.func @rt_vshl(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { %c1 = arith.constant 1 : i64 diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto index 86fa64775c..e38d05739c 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto @@ -6,23 +6,34 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// txor -> ub.vxor lowering. +// txor -> De Morgan decomposition: vor(tmp) + vand(dst) + vnot(dst) + vand(dst,tmp). +// The PIPE_V barriers mirror CANN TXOR_IMPL dependencies between these vector ops. // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_txor() func.func @lower_txor() attributes {pto.aicore} { - // CHECK: %[[DST:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %dst = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC0:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src0 = pto.alloc_tile : !pto.tile_buf - // CHECK: %[[SRC1:.*]] = pto.castptr {{.*}} : i64 -> !pto.ptr %src1 = pto.alloc_tile : !pto.tile_buf %tmp = pto.alloc_tile : !pto.tile_buf - // CHECK: pto.ub.vxor %[[DST]], %[[SRC0]], %[[SRC1]] + // 1. tmp = src0 | src1 + // CHECK: pto.ub.vor {{%[^ ,]+}}, {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.barrier + // 2. dst = src0 & src1 + // CHECK: pto.ub.vand {{%[^ ,]+}}, {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.barrier + // 3. dst = ~dst + // CHECK: pto.ub.vnot {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + // CHECK: pto.barrier + // 4. dst = dst & tmp + // CHECK: pto.ub.vand {{%[^ ,]+}}, {{%[^ ,]+}}, {{%[^ ,]+}} // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - pto.txor ins(%src0, %src1, %tmp : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.txor + pto.txor ins(%src0, %src1, %tmp : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) return } } diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto index 7e16336128..c93de19746 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto @@ -6,10 +6,10 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// pto.ub.vand/vor/vxor -> llvm.hivm.VAND/VOR/VXOR.s16. +// pto.ub.vand/vor -> llvm.hivm.VAND/VOR.s16. // pto.ub.vshl -> llvm.hivm.VSHL.u16 (4-arg: dst, src, shiftDist, config). // pto.ub.vshr -> llvm.hivm.VSHR.u16 (5-arg: dst, src, shiftDist, config, round=0). -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vand_s16_mix_aiv( @@ -38,19 +38,6 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> - func.func @ub_vxor_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { - %c1 = arith.constant 1 : i64 - %c0 = arith.constant 0 : i64 - // CHECK: llvm.mlir.constant(72057594037927936 : i64) : i64 - // CHECK: llvm.mlir.constant(255 : i64) : i64 - // CHECK: llvm.call @llvm.hivm.VXOR.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () - // CHECK-NOT: pto.ub. - pto.ub.vxor %dst, %src0, %src1, %c1, %c1, %c1, %c1, %c0, %c0, %c0 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - return - } - // CHECK-LABEL: llvm.func @ub_vshl_s16_mix_aiv( // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC:[^:]+]]: !llvm.ptr<6> func.func @ub_vshl_s16(%dst: !pto.ptr, %src: !pto.ptr) attributes {pto.aicore} { From b268b81c91eb10a3debbf40cda9e825e10db52cd Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Fri, 3 Jul 2026 15:22:49 +0200 Subject: [PATCH 12/29] A5 allocator --- docs/designs/a2a3-allocator.md | 242 +++++++++++++++++++++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 138 ++++++++++--- tools/ptoas/ptoas.cpp | 16 +- 3 files changed, 362 insertions(+), 34 deletions(-) create mode 100644 docs/designs/a2a3-allocator.md diff --git a/docs/designs/a2a3-allocator.md b/docs/designs/a2a3-allocator.md new file mode 100644 index 0000000000..3bfd230fa4 --- /dev/null +++ b/docs/designs/a2a3-allocator.md @@ -0,0 +1,242 @@ +# A2/A3 VPTO UB Allocator Design + +## Context + +The A3 VPTO path lowers tile-level operations directly to UB pointer intrinsics +such as `pto.ub.vadd`, `pto.ub.vand`, `pto.ub.vor`, and `pto.ub.vnot`. + +The current implementation in `LowerPTOToUBufOps` assigns UB addresses manually +while replacing `pto.alloc_tile` with `pto.castptr` constants. This was enough +for early binary elementwise work, but it diverges from the existing memory +planner used by the non-A3 path. + +A recent `TXOR` issue exposed the weakness of this approach: + +- `TXOR` needs a scratch `tmp` tile. +- Manual allocation used overly large spacing. +- The fourth tile could be placed at or beyond A3 UB capacity. +- The fix reduced spacing and added capacity checks, but this is still a local + allocator. + +Long term, A3 should reuse `PTOPlanMemory`. + +## Current A3 Path + +```text +A3 VPTO: + LowerPTOToUBufOps + alloc_tile -> constant UB pointer + tile op -> pto.ub.* op + return from lowerPTOToVPTOBackend +``` + +Characteristics: + +- Pointer-based. +- No memref lowering before UB intrinsic lowering. +- No `PTOPlanMemory`. +- No liveness reuse. +- Manual capacity/alignment policy in `LowerPTOToUBufOps`. + +## Current A5 / Non-A3 Path + +```text +A5 / non-A3: + PTOViewToMemref + PTOPlanMemory + PTOResolveReservedBuffers + PTOMaterializeTileHandles + ExpandTileOp + PTOInlineLibCall + FoldTileBufIntrinsics +``` + +Characteristics: + +- Tile buffers become memref-backed local buffers. +- `PTOPlanMemory` assigns local memory. +- Planned addresses are later materialized back into tile handles. +- EmitC consumes planned tile addresses through `TASSIGN(tile, addr)`. + +This is the model A3 should converge toward. + +## Option 1: Reuse Existing A5-Style Planning Path + +Pipeline target: + +```text +A3: + PTOViewToMemref + PTOPlanMemory + PTOResolveReservedBuffers + PTOMaterializeTileHandles + LowerPTOToUBufOps + VPTO pointer/LLVM lowering +``` + +### Meaning + +Convert A3 tile allocations into memref-backed local buffers before UB intrinsic +lowering. Then run the existing `PTOPlanMemory` pass to assign UB addresses. +After planning, re-materialize tile handles and let `LowerPTOToUBufOps` consume +planned addresses instead of assigning offsets itself. + +### Why This Works + +`PTOPlanMemory` already understands: + +- local VEC capacity +- 256-byte alignment +- liveness +- buffer reuse +- DPS init buffers +- scratch buffers via memory effects + +`TXorOp::getEffects()` already models `tmp` as a scratch write on A2/A3, so +`tmp` can participate in planning once it is represented as a local buffer. + +### Pros + +- Reuses the existing allocator directly. +- Matches A5 / EmitC architecture. +- Gets liveness reuse and capacity diagnostics. +- Avoids a second allocator policy in `LowerPTOToUBufOps`. + +### Cons + +- Requires A3 pipeline refactor. +- Requires validating that A3 UB lowering works after tile-to-memref-to-tile + materialization. +- May require adjusting `LowerPTOToUBufOps` to reject unplanned tiles or consume + planned `addr` values. + +### Recommended + +This is the preferred option. + +## Option 2: Extend Planner Logic To Tile Buffers Directly + +Pipeline target: + +```text +A3: + A3TileAddressPlanning + LowerPTOToUBufOps +``` + +### Meaning + +Keep A3 tile-native. Teach planner logic to understand `pto.alloc_tile` +directly, or extract reusable allocation/liveness code from `PTOPlanMemory` and +apply it to tile buffers before lowering. + +### Pros + +- Less disruption to current A3 VPTO path. +- Avoids memref round trip. +- Keeps tile-level IR intact until UB lowering. + +### Cons + +- More planner work. +- Higher risk of duplicating `PTOPlanMemory`. +- Easier to diverge from A5 allocation semantics. +- Requires new planner surface for tile buffers. + +### Not Preferred Initially + +Use only if Option 1 reveals hard incompatibilities with the +memref/materialized-tile seam. + +## Conservative Migration Plan + +### Step 1: Keep Current Fix As Safety Net + +Keep the temporary manual allocator in `LowerPTOToUBufOps` with: + +- 256-byte alignment +- A3 UB capacity checks +- clear diagnostics + +This remains as a fallback during migration. + +### Step 2: Add A3 Pre-Planning Pipeline + +Enable an A3 path equivalent to: + +```text +PTOViewToMemref +PTOPlanMemory +PTOResolveReservedBuffers +PTOMaterializeTileHandles +``` + +before A3 UB intrinsic lowering. + +### Step 3: Split `LowerPTOToUBufOps` + +Separate responsibilities: + +```text +LowerPTOToUBufAddressFallback + only temporary/manual allocation + +LowerPTOToUBufOps + consume planned tile addresses + lower tile ops to pto.ub.* / MTE ops +``` + +The long-term lowering pass should not invent UB addresses. + +### Step 4: Remove Manual Allocator + +Once lit and hardware e2e pass with planned addresses: + +- remove manual sequential allocation +- require planned addresses for A3 UB lowering +- keep explicit diagnostics for missing planning + +## Validation Plan + +Required tests: + +- UB lit suite +- binary elementwise hardware e2e +- `TXOR` hardware e2e with scratch tile +- overflow test proving capacity diagnostics +- planning test showing `tmp` is planned and not placed out of bounds + +Expected command examples: + +```bash +ninja -C build ptoas +/opt/llvm-project/build/bin/llvm-lit build/test/lit --filter 'vpto/ub' +PYTHONPATH=/workspace/ptodsl python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v +``` + +## Decision + +Proceed with Option 1. + +A3 should reuse the existing `PTOPlanMemory` path by converting tile buffers to +memref-backed local buffers before UB intrinsic lowering, then materializing +planned tile handles for `LowerPTOToUBufOps`. + +## Initial Implementation Status + +The first Option 1 increment is implemented for A3 VPTO: + +- A3 VPTO enters the local tile planning path. +- `PTOViewToMemref`, `PTOPlanMemory`, `PTOResolveReservedBuffers`, and + `PTOMaterializeTileHandles` run before A3 UB intrinsic lowering. +- `LowerPTOToUBufOps` consumes `alloc_tile addr = ...` when all tile allocations + have planned addresses. +- The manual allocator remains only as a fallback for standalone or direct pass + tests that do not run the shared planning pipeline. +- A3 transfer lowering accepts planned-path GM memref views and lowers them to + MTE ops before VPTO LLVM emission. + +Validated coverage: + +- UB lit suite: `48 passed`. +- Binary elementwise hardware e2e: `171 passed`. diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 9d8d0da4ce..1917005a99 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -233,6 +233,16 @@ struct LowerPTOToUBufOpsPass { SmallVector allocOps; func.walk([&](pto::AllocTileOp op) { allocOps.push_back(op); }); + bool hasPlannedAddr = llvm::any_of( + allocOps, [](pto::AllocTileOp op) { return static_cast(op.getAddr()); }); + bool allPlanned = llvm::all_of( + allocOps, [](pto::AllocTileOp op) { return static_cast(op.getAddr()); }); + if (hasPlannedAddr && !allPlanned) { + func.emitError("A3 UB lowering requires either all alloc_tile ops to " + "carry planned addresses or none of them to do so"); + signalPassFailure(); + return; + } uint64_t offset = 0; for (auto op : allocOps) { auto tbTy = cast(op.getResult().getType()); @@ -257,7 +267,7 @@ struct LowerPTOToUBufOpsPass uint64_t paddedBytes = (totalBytes + kLocalMemAlignmentBytes - 1) / kLocalMemAlignmentBytes * kLocalMemAlignmentBytes; - if (offset + paddedBytes > kA3VecLocalMemBytes) { + if (!hasPlannedAddr && offset + paddedBytes > kA3VecLocalMemBytes) { op.emitError("A3 UB manual allocation exceeds local memory capacity: ") << (offset + paddedBytes) << " bytes requested, capacity is " << kA3VecLocalMemBytes << " bytes"; @@ -265,17 +275,22 @@ struct LowerPTOToUBufOpsPass return; } builder.setInsertionPoint(op); - auto addrConst = builder.create( - op.getLoc(), builder.getI64IntegerAttr(offset)); + Value addr = op.getAddr(); + if (!addr) { + auto addrConst = builder.create( + op.getLoc(), builder.getI64IntegerAttr(offset)); + addr = addrConst.getResult(); + } auto ptrTy = pto::PtrType::get( ctx, tbTy.getElementType(), pto::AddressSpaceAttr::get(ctx, pto::AddressSpace::VEC)); auto pc = builder.create( - op.getLoc(), ptrTy, addrConst.getResult()); + op.getLoc(), ptrTy, addr); tileShapes[pc.getResult()] = SmallVector(shape); op.getResult().replaceAllUsesWith(pc.getResult()); op.erase(); - offset += paddedBytes; + if (!hasPlannedAddr) + offset += paddedBytes; } } @@ -551,7 +566,8 @@ struct LowerPTOToUBufOpsPass // ---- cleanup dead PTO ops ---- SmallVector toErase; func.walk([&](Operation *op) { - if (isa(op)) + if (isa(op)) toErase.push_back(op); }); for (auto *op : llvm::reverse(toErase)) { @@ -834,20 +850,94 @@ struct LowerPTOToUBufOpsPass static FailureOr extractDmaViewInfo(pto::TLoadOp op) { auto pvOp = op.getSrc().getDefiningOp(); - if (!pvOp) + if (pvOp) { + auto mtvOp = pvOp.getSource().getDefiningOp(); + if (!mtvOp) + return failure(); + DmaViewInfo info; + info.gmPtr = mtvOp.getPtr(); + info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); + info.strides.assign(mtvOp.getStrides().begin(), + mtvOp.getStrides().end()); + info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); + return info; + } + return extractDmaMemRefViewInfo(op.getLoc(), op.getSrc(), op.getContext()); + } + + static FailureOr extractDmaViewInfo(pto::TStoreOp op) { + auto pvOp = op.getDst().getDefiningOp(); + if (pvOp) { + auto mtvOp = pvOp.getSource().getDefiningOp(); + if (!mtvOp) + return failure(); + DmaViewInfo info; + info.gmPtr = mtvOp.getPtr(); + info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); + info.strides.assign(mtvOp.getStrides().begin(), mtvOp.getStrides().end()); + info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); + return info; + } + return extractDmaMemRefViewInfo(op.getLoc(), op.getDst(), op.getContext()); + } + + static FailureOr extractDmaMemRefViewInfo(Location loc, Value view, + MLIRContext *ctx) { + auto memTy = dyn_cast(view.getType()); + if (!memTy) + return failure(); + auto msAttr = dyn_cast_or_null(memTy.getMemorySpace()); + if (!msAttr || msAttr.getAddressSpace() != pto::AddressSpace::GM) return failure(); - auto mtvOp = pvOp.getSource().getDefiningOp(); - if (!mtvOp) + ArrayRef shape = memTy.getShape(); + if (shape.size() < 2) return failure(); + + OpBuilder b(ctx); + b.setInsertionPointAfterValue(view); DmaViewInfo info; - info.gmPtr = mtvOp.getPtr(); - info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); - info.strides.assign(mtvOp.getStrides().begin(), - mtvOp.getStrides().end()); - info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); + auto ptrTy = pto::PtrType::get(ctx, memTy.getElementType(), msAttr); + Value root = traceRootMemRef(view); + info.gmPtr = b.create(loc, ptrTy, root).getResult(); + + SmallVector rowMajorStrides(shape.size(), 1); + for (int i = static_cast(shape.size()) - 2; i >= 0; --i) { + if (shape[i + 1] == ShapedType::kDynamic) + return failure(); + rowMajorStrides[i] = rowMajorStrides[i + 1] * shape[i + 1]; + } + + for (auto [idx, dim] : llvm::enumerate(shape)) { + Value size = dim == ShapedType::kDynamic + ? b.create(loc, view, idx).getResult() + : b.create(loc, dim).getResult(); + info.sizes.push_back(size); + info.strides.push_back( + b.create(loc, rowMajorStrides[idx]).getResult()); + info.offsets.push_back(b.create(loc, 0).getResult()); + } return info; } + static Value traceRootMemRef(Value value) { + while (Operation *def = value.getDefiningOp()) { + if (auto subview = dyn_cast(def)) { + value = subview.getSource(); + continue; + } + if (auto reinterpret = dyn_cast(def)) { + value = reinterpret.getSource(); + continue; + } + if (auto cast = dyn_cast(def)) { + value = cast.getSource(); + continue; + } + break; + } + return value; + } + Value computeGMByteOffset(Location loc, OpBuilder &b, const DmaViewInfo &viewInfo, unsigned elemSize) { Value totalOff = idxc0(loc, b); @@ -1016,20 +1106,12 @@ struct LowerPTOToUBufOpsPass auto it = tileShapes.find(op.getSrc()); if (it == tileShapes.end()) return failure(); - auto pvOp = op.getDst().getDefiningOp(); - if (!pvOp) return failure(); - auto mtvOp = pvOp.getSource().getDefiningOp(); - if (!mtvOp) return failure(); - - DmaViewInfo viewInfo; - viewInfo.gmPtr = mtvOp.getPtr(); - viewInfo.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); - viewInfo.strides.assign(mtvOp.getStrides().begin(), mtvOp.getStrides().end()); - viewInfo.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); - - Value byteOff = computeGMByteOffset(loc, b, viewInfo, elemSize); - Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo.gmPtr, byteOff); - return emitMteUbGm(loc, b, op.getSrc(), gmPtr, viewInfo, elemTy, + auto viewInfo = extractDmaViewInfo(op); + if (failed(viewInfo)) return failure(); + + Value byteOff = computeGMByteOffset(loc, b, *viewInfo, elemSize); + Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo->gmPtr, byteOff); + return emitMteUbGm(loc, b, op.getSrc(), gmPtr, *viewInfo, elemTy, llvm::ArrayRef(it->second)); } diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index f67815c817..b295133c9e 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -1873,10 +1873,14 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass(pto::createLoweringSyncToPipePass()); if (!disableInferLayout) pm.addNestedPass(pto::createInferPTOLayoutPass()); - // A5-only: normalize movs, lower to memref, plan memory. - // A3 uses the LowerPTOToUBufOps path instead (pointer-based, no memref). - if (ptoTargetArch != "a3") { - pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); + // Local tile planning path. A5/non-A3 already use this path. A3 VPTO also + // enters it so UB tile addresses come from PTOPlanMemory instead of the + // fallback allocator in LowerPTOToUBufOps. + const bool enableLocalTilePlanning = + ptoTargetArch != "a3" || effectiveBackend == PTOBackend::VPTO; + if (enableLocalTilePlanning) { + if (ptoTargetArch != "a3") + pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); pm.addNestedPass( pto::createPTOValidateIntToPtrUsesPass()); @@ -1890,12 +1894,12 @@ int mlir::pto::compilePTOASModule( // so it takes no option here. pto::FusionPlanOptions fusionPlanOpts; fusionPlanOpts.enableShapeInference = enableShapeInference; - if (enableA5EmitCFusionPath) { + if (ptoTargetArch != "a3" && enableA5EmitCFusionPath) { pm.addNestedPass( pto::createFusionPlanPass(fusionPlanOpts)); pm.addNestedPass(pto::createOpSchedulingPass()); pm.addNestedPass(pto::createPTOMarkLastUsePass()); - } else if (enableA5VPTOFusionPath) { + } else if (ptoTargetArch != "a3" && enableA5VPTOFusionPath) { pm.addNestedPass( pto::createFusionPlanPass(fusionPlanOpts)); pm.addNestedPass(pto::createOpSchedulingPass()); From 65909eb54b34a4a85396ae99189595cb9f7fbee7 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Fri, 3 Jul 2026 16:44:01 +0200 Subject: [PATCH 13/29] fixes for A5 allocator --- docs/designs/a2a3-allocator.md | 29 +++++++++++++++++------- include/PTO/Transforms/Passes.td | 5 ++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 11 +++++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/docs/designs/a2a3-allocator.md b/docs/designs/a2a3-allocator.md index 3bfd230fa4..174a05dbeb 100644 --- a/docs/designs/a2a3-allocator.md +++ b/docs/designs/a2a3-allocator.md @@ -222,21 +222,34 @@ A3 should reuse the existing `PTOPlanMemory` path by converting tile buffers to memref-backed local buffers before UB intrinsic lowering, then materializing planned tile handles for `LowerPTOToUBufOps`. -## Initial Implementation Status +## Implementation Status -The first Option 1 increment is implemented for A3 VPTO: +Option 1 is implemented and validated for A3 VPTO: - A3 VPTO enters the local tile planning path. - `PTOViewToMemref`, `PTOPlanMemory`, `PTOResolveReservedBuffers`, and `PTOMaterializeTileHandles` run before A3 UB intrinsic lowering. -- `LowerPTOToUBufOps` consumes `alloc_tile addr = ...` when all tile allocations - have planned addresses. -- The manual allocator remains only as a fallback for standalone or direct pass - tests that do not run the shared planning pipeline. +- `LowerPTOToUBufOps` requires planned addresses by default + (`allowManualAllocationFallback` defaults to `false`). +- The manual allocator remains available only via + `--allow-manual-allocation-fallback` for standalone or direct pass tests. - A3 transfer lowering accepts planned-path GM memref views and lowers them to MTE ops before VPTO LLVM emission. +- Dead `memref.subview` / `memref.reinterpret_cast` / `memref.cast` ops are + cleaned up after transfer lowering. +- Lit test `vpto/ub/planned_addresses/txor_planned_addr.pto` verifies that all + four TXOR tiles (including `tmp`) receive compact planned addresses. -Validated coverage: +### Migration Step Progress -- UB lit suite: `48 passed`. +| Step | Status | +|---|---| +| Step 1: Keep current fix as safety net | Done — 256-byte alignment, capacity checks | +| Step 2: Add A3 pre-planning pipeline | Done — `PTOViewToMemref` + `PTOPlanMemory` + materialization | +| Step 3: Split `LowerPTOToUBufOps` | Partial — fallback is opt-in via `allowManualAllocationFallback`; full split deferred | +| Step 4: Remove manual allocator | Pending — fallback still present behind option | + +### Validated Coverage + +- UB lit suite: `49 passed` (48 existing + 1 planned-address test). - Binary elementwise hardware e2e: `171 passed`. diff --git a/include/PTO/Transforms/Passes.td b/include/PTO/Transforms/Passes.td index e2c32af088..a8524b23ed 100644 --- a/include/PTO/Transforms/Passes.td +++ b/include/PTO/Transforms/Passes.td @@ -548,6 +548,11 @@ def LowerPTOToUBufOps : Pass<"pto-lower-to-ubuf-ops", "mlir::func::FuncOp"> { TileLang path unchanged. }]; let constructor = "mlir::pto::createLowerPTOToUBufOpsPass()"; + let options = [ + Option<"allowManualAllocationFallback", "allow-manual-allocation-fallback", "bool", + /*default=*/"false", + "Allow LowerPTOToUBufOps to assign temporary UB addresses when alloc_tile ops do not carry planned addresses"> + ]; let dependentDialects = [ "mlir::pto::PTODialect", "mlir::func::FuncDialect", diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 1917005a99..90faa998a0 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -243,6 +243,17 @@ struct LowerPTOToUBufOpsPass signalPassFailure(); return; } + if (!allocOps.empty() && !hasPlannedAddr && + !allowManualAllocationFallback) { + func.emitError("A3 VPTO UB lowering requires planned alloc_tile " + "addresses; run PTOViewToMemref, PTOPlanMemory, " + "PTOResolveReservedBuffers, and " + "PTOMaterializeTileHandles before " + "LowerPTOToUBufOps, or pass " + "--allow-manual-allocation-fallback for isolated tests"); + signalPassFailure(); + return; + } uint64_t offset = 0; for (auto op : allocOps) { auto tbTy = cast(op.getResult().getType()); From 8ef0813fa68ccfb1c07ca879583b8c7a53a035d0 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Sat, 4 Jul 2026 14:29:01 +0200 Subject: [PATCH 14/29] unary ops --- docs/designs/a2a3-allocator.md | 13 +- include/PTO/IR/VPTOUbOps.td | 9 + include/PTO/Transforms/Passes.td | 5 - lib/PTO/IR/VPTO.cpp | 85 ++++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 287 ++++++++++++++---- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 146 +++++++++ ptodsl/tests/e2e/common.py | 207 +++++++++++++ ptodsl/tests/e2e/test_scalar_elementwise.py | 99 ++++++ ptodsl/tests/e2e/test_unary_elementwise.py | 98 ++++++ .../planned_addresses/txor_planned_addr.pto | 31 ++ .../vpto/ub/tile_to_ub/elementwise/tabs.pto | 23 ++ .../vpto/ub/tile_to_ub/elementwise/tadds.pto | 24 ++ .../vpto/ub/tile_to_ub/elementwise/tmuls.pto | 24 ++ .../vpto/ub/tile_to_ub/elementwise/tneg.pto | 23 ++ .../vpto/ub/tile_to_ub/elementwise/trelu.pto | 23 ++ 15 files changed, 1020 insertions(+), 77 deletions(-) create mode 100644 ptodsl/tests/e2e/test_scalar_elementwise.py create mode 100644 ptodsl/tests/e2e/test_unary_elementwise.py create mode 100644 test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto diff --git a/docs/designs/a2a3-allocator.md b/docs/designs/a2a3-allocator.md index 174a05dbeb..3bf5c63868 100644 --- a/docs/designs/a2a3-allocator.md +++ b/docs/designs/a2a3-allocator.md @@ -229,10 +229,8 @@ Option 1 is implemented and validated for A3 VPTO: - A3 VPTO enters the local tile planning path. - `PTOViewToMemref`, `PTOPlanMemory`, `PTOResolveReservedBuffers`, and `PTOMaterializeTileHandles` run before A3 UB intrinsic lowering. -- `LowerPTOToUBufOps` requires planned addresses by default - (`allowManualAllocationFallback` defaults to `false`). -- The manual allocator remains available only via - `--allow-manual-allocation-fallback` for standalone or direct pass tests. +- `LowerPTOToUBufOps` requires planned addresses unconditionally; the manual + sequential allocator has been removed entirely. - A3 transfer lowering accepts planned-path GM memref views and lowers them to MTE ops before VPTO LLVM emission. - Dead `memref.subview` / `memref.reinterpret_cast` / `memref.cast` ops are @@ -244,12 +242,11 @@ Option 1 is implemented and validated for A3 VPTO: | Step | Status | |---|---| -| Step 1: Keep current fix as safety net | Done — 256-byte alignment, capacity checks | +| Step 1: Keep current fix as safety net | Superseded — manual allocator removed entirely | | Step 2: Add A3 pre-planning pipeline | Done — `PTOViewToMemref` + `PTOPlanMemory` + materialization | -| Step 3: Split `LowerPTOToUBufOps` | Partial — fallback is opt-in via `allowManualAllocationFallback`; full split deferred | -| Step 4: Remove manual allocator | Pending — fallback still present behind option | +| Step 3: Split `LowerPTOToUBufOps` | N/A — manual fallback removed, no split needed | +| Step 4: Remove manual allocator | Done — `LowerPTOToUBufOps` requires planned addresses unconditionally | ### Validated Coverage - UB lit suite: `49 passed` (48 existing + 1 planned-address test). -- Binary elementwise hardware e2e: `171 passed`. diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index ab4dbd994a..4131880da3 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -107,6 +107,11 @@ class PTO_UBufUnaryOp traits = []> } def PTO_UBVnotOp : PTO_UBufUnaryOp<"ub.vnot">; +def PTO_UBVabsOp : PTO_UBufUnaryOp<"ub.vabs">; +def PTO_UBVreluOp : PTO_UBufUnaryOp<"ub.vrelu">; +def PTO_UBVexpOp : PTO_UBufUnaryOp<"ub.vexp">; +def PTO_UBVsqrtOp : PTO_UBufUnaryOp<"ub.vsqrt">; +def PTO_UBVrsqrtOp : PTO_UBufUnaryOp<"ub.vrsqrt">; //===----------------------------------------------------------------------===// // PTO_UBufShiftOp — unary shift with scalar distance @@ -151,6 +156,10 @@ class PTO_UBufShiftOp traits = []> def PTO_UBVshlOp : PTO_UBufShiftOp<"ub.vshl">; def PTO_UBVshrOp : PTO_UBufShiftOp<"ub.vshr">; +def PTO_UBVmulSOp : PTO_UBufShiftOp<"ub.vmuls">; +def PTO_UBVaddSOp : PTO_UBufShiftOp<"ub.vadds">; +def PTO_UBVmaxSOp : PTO_UBufShiftOp<"ub.vmaxs">; +def PTO_UBVminSOp : PTO_UBufShiftOp<"ub.vmins">; def PTO_UBSetMaskOp : PTO_Op<"ub.set_mask", [ DeclareOpInterfaceMethods diff --git a/include/PTO/Transforms/Passes.td b/include/PTO/Transforms/Passes.td index a8524b23ed..e2c32af088 100644 --- a/include/PTO/Transforms/Passes.td +++ b/include/PTO/Transforms/Passes.td @@ -548,11 +548,6 @@ def LowerPTOToUBufOps : Pass<"pto-lower-to-ubuf-ops", "mlir::func::FuncOp"> { TileLang path unchanged. }]; let constructor = "mlir::pto::createLowerPTOToUBufOpsPass()"; - let options = [ - Option<"allowManualAllocationFallback", "allow-manual-allocation-fallback", "bool", - /*default=*/"false", - "Allow LowerPTOToUBufOps to assign temporary UB addresses when alloc_tile ops do not carry planned addresses"> - ]; let dependentDialects = [ "mlir::pto::PTODialect", "mlir::func::FuncDialect", diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index eb2a3a22d7..6beeb1e5c9 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8028,6 +8028,71 @@ LogicalResult UBVnotOp::verify() { return success(); } +//===----------------------------------------------------------------------===// +// UBVabsOp +//===----------------------------------------------------------------------===// + +void UBVabsOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVabsOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +//===----------------------------------------------------------------------===// +// UBVreluOp +//===----------------------------------------------------------------------===// + +void UBVreluOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVreluOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} + +#define PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(OpName) \ + void OpName::getEffects( \ + SmallVectorImpl> \ + &effects) { \ + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); \ + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); \ + } \ + LogicalResult OpName::verify() { \ + if (!isBufferLike(getDst().getType()) || \ + !isBufferLike(getSrc().getType())) \ + return emitOpError("requires pointer-like operands"); \ + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || \ + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) \ + return emitOpError("requires UB-backed operands"); \ + return success(); \ + } + +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVexpOp) +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVsqrtOp) +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVrsqrtOp) + +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVaddSOp) +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVmaxSOp) +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVminSOp) + //===----------------------------------------------------------------------===// // UBVshlOp //===----------------------------------------------------------------------===// @@ -8067,3 +8132,23 @@ LogicalResult UBVshrOp::verify() { return emitOpError("requires UB-backed operands"); return success(); } + +//===----------------------------------------------------------------------===// +// UBVmulSOp +//===----------------------------------------------------------------------===// + +void UBVmulSOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), &getSrcMutable()); + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVmulSOp::verify() { + if (!isBufferLike(getDst().getType()) || !isBufferLike(getSrc().getType())) + return emitOpError("requires pointer-like operands"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || + classifyMemoryRole(getSrc().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed operands"); + return success(); +} diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 90faa998a0..6b9c827bc8 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -46,8 +46,6 @@ static constexpr int64_t kRepeatStrideMax = 255; static constexpr int64_t kSmallRptBinOp = 4; static constexpr int64_t kDefaultRepeatStride = 8; static constexpr unsigned kMaskLen = 64; -static constexpr uint64_t kA3VecLocalMemBytes = 1572864 / 8; -static constexpr uint64_t kLocalMemAlignmentBytes = 256; //===----------------------------------------------------------------------===// // Utilities @@ -227,81 +225,32 @@ struct LowerPTOToUBufOpsPass MLIRContext *ctx = &getContext(); OpBuilder builder(ctx); - // A3: sequential memory planning for alloc_tile buffers. Must run first - // so lowering sees PtrType from CastPtrOp instead of tile_buf. + // A3: consume planned addresses from PTOPlanMemory / PTOMaterializeTileHandles. + // Each alloc_tile must carry a planned addr operand. DenseMap> tileShapes; { SmallVector allocOps; func.walk([&](pto::AllocTileOp op) { allocOps.push_back(op); }); - bool hasPlannedAddr = llvm::any_of( - allocOps, [](pto::AllocTileOp op) { return static_cast(op.getAddr()); }); - bool allPlanned = llvm::all_of( - allocOps, [](pto::AllocTileOp op) { return static_cast(op.getAddr()); }); - if (hasPlannedAddr && !allPlanned) { - func.emitError("A3 UB lowering requires either all alloc_tile ops to " - "carry planned addresses or none of them to do so"); - signalPassFailure(); - return; - } - if (!allocOps.empty() && !hasPlannedAddr && - !allowManualAllocationFallback) { - func.emitError("A3 VPTO UB lowering requires planned alloc_tile " - "addresses; run PTOViewToMemref, PTOPlanMemory, " - "PTOResolveReservedBuffers, and " - "PTOMaterializeTileHandles before " - "LowerPTOToUBufOps, or pass " - "--allow-manual-allocation-fallback for isolated tests"); - signalPassFailure(); - return; - } - uint64_t offset = 0; for (auto op : allocOps) { auto tbTy = cast(op.getResult().getType()); auto shape = tbTy.getShape(); - uint64_t numElems = 1; - for (auto d : shape) { - if (d == ShapedType::kDynamic || d < 0) { - op.emitError("A3 UB manual allocation requires static tile shapes"); - signalPassFailure(); - return; - } - numElems *= d; - } - uint64_t elemSize = getElementSize(tbTy.getElementType()); - if (elemSize == 0) { - op.emitError("A3 UB manual allocation does not support element type ") - << tbTy.getElementType(); - signalPassFailure(); - return; - } - uint64_t totalBytes = numElems * elemSize; - uint64_t paddedBytes = - (totalBytes + kLocalMemAlignmentBytes - 1) / - kLocalMemAlignmentBytes * kLocalMemAlignmentBytes; - if (!hasPlannedAddr && offset + paddedBytes > kA3VecLocalMemBytes) { - op.emitError("A3 UB manual allocation exceeds local memory capacity: ") - << (offset + paddedBytes) << " bytes requested, capacity is " - << kA3VecLocalMemBytes << " bytes"; + Value addr = op.getAddr(); + if (!addr) { + op.emitError("A3 VPTO UB lowering requires planned alloc_tile " + "addresses; run PTOViewToMemref, PTOPlanMemory, " + "PTOResolveReservedBuffers, and " + "PTOMaterializeTileHandles before LowerPTOToUBufOps"); signalPassFailure(); return; } builder.setInsertionPoint(op); - Value addr = op.getAddr(); - if (!addr) { - auto addrConst = builder.create( - op.getLoc(), builder.getI64IntegerAttr(offset)); - addr = addrConst.getResult(); - } auto ptrTy = pto::PtrType::get( ctx, tbTy.getElementType(), pto::AddressSpaceAttr::get(ctx, pto::AddressSpace::VEC)); - auto pc = builder.create( - op.getLoc(), ptrTy, addr); + auto pc = builder.create(op.getLoc(), ptrTy, addr); tileShapes[pc.getResult()] = SmallVector(shape); op.getResult().replaceAllUsesWith(pc.getResult()); op.erase(); - if (!hasPlannedAddr) - offset += paddedBytes; } } @@ -504,7 +453,7 @@ struct LowerPTOToUBufOpsPass SmallVector ops; func.walk([&](pto::TNotOp op) { ops.push_back(op); }); for (auto op : ops) { - auto info = extractTileShapeInfo(op, tileShapes); + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); if (!info) continue; auto [dstPtr, srcPtr, ptrType] = @@ -518,6 +467,202 @@ struct LowerPTOToUBufOpsPass } } + // ---- tabs → pto.ub.vabs ---- + { + SmallVector ops; + func.walk([&](pto::TAbsOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- trelu → pto.ub.vrelu ---- + { + SmallVector ops; + func.walk([&](pto::TReluOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- tneg → pto.ub.vmuls(dst, src, -1) ---- + { + SmallVector ops; + func.walk([&](pto::TNegOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + Value minusOne = builder.create( + op.getLoc(), builder.getI64IntegerAttr(-1)); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + minusOne, ptrType, *info); + op.erase(); + } + } + + // ---- texp → pto.ub.vexp ---- + { + SmallVector ops; + func.walk([&](pto::TExpOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- tsqrt → pto.ub.vsqrt ---- + { + SmallVector ops; + func.walk([&](pto::TSqrtOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- trsqrt → pto.ub.vrsqrt ---- + { + SmallVector ops; + func.walk([&](pto::TRsqrtOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + + // ---- tadds → pto.ub.vadds ---- + { + SmallVector ops; + func.walk([&](pto::TAddSOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + Value scalarI64 = convertScalarToI64(builder, op.getLoc(), op.getScalar()); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + scalarI64, ptrType, *info); + op.erase(); + } + } + + // ---- tmuls → pto.ub.vmuls ---- + { + SmallVector ops; + func.walk([&](pto::TMulSOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc0(), + tileShapes); + if (!dstPtr) + continue; + Value scalarI64 = convertScalarToI64(builder, op.getLoc(), op.getScalar()); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + scalarI64, ptrType, *info); + op.erase(); + } + } + + // ---- tmaxs → pto.ub.vmaxs ---- + { + SmallVector ops; + func.walk([&](pto::TMaxSOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + Value scalarI64 = convertScalarToI64(builder, op.getLoc(), op.getScalar()); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + scalarI64, ptrType, *info); + op.erase(); + } + } + + // ---- tmins → pto.ub.vmins ---- + { + SmallVector ops; + func.walk([&](pto::TMinSOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + Value scalarI64 = convertScalarToI64(builder, op.getLoc(), op.getScalar()); + dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, + scalarI64, ptrType, *info); + op.erase(); + } + } + // ---- tshls → pto.ub.vshl (scalar shift) ---- { SmallVector ops; @@ -677,6 +822,18 @@ struct LowerPTOToUBufOpsPass return {dstPtr, src0Ptr, src1Ptr, tmpPtr, ptrType}; } + Value convertScalarToI64(OpBuilder &builder, Location loc, Value scalar) { + if (scalar.getType().isF32() || scalar.getType().isF16()) { + unsigned width = scalar.getType().isF32() ? 32 : 16; + auto intTy = builder.getIntegerType(width); + Value asInt = builder.create(loc, intTy, scalar); + return builder.create(loc, builder.getI64Type(), asInt); + } + if (scalar.getType().isInteger(64)) + return scalar; + return builder.create(loc, builder.getI64Type(), scalar); + } + std::tuple lowerShiftOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, Value dstVal, Value srcVal, @@ -708,9 +865,11 @@ struct LowerPTOToUBufOpsPass int64_t tailElements = totalV % epr; auto emitShift = [&](Value d, Value s) { - Value shiftDist = b.create( - loc, b.getI64Type(), scalar); - b.create(loc, d, s, shiftDist, + Value scalarI64 = scalar; + if (scalarI64.getType() != b.getI64Type()) + scalarI64 = b.create( + loc, b.getI64Type(), scalar); + b.create(loc, d, s, scalarI64, i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), i64c8(loc, b), i64c8(loc, b)); }; diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 80a63c94f4..1b9660d25d 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4799,6 +4799,112 @@ class LowerUBufShiftOpPattern final : public OpConversionPattern { LoweringState &state; }; +// LowerUBufScalarBinaryPattern — scalar-tile binary ops (VADDS/VMULS/VMAXS/VMINS). +// Unlike VSHL/VSHR, these have signed intrinsics (s16/s32, not u16/u32) and +// pass the scalar as a float for f32/f16 element types. +template +class LowerUBufScalarBinaryPattern final : public OpConversionPattern { +public: + explicit LowerUBufScalarBinaryPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), state(state) {} + + LogicalResult + matchAndRewrite(ScalarOp op, typename ScalarOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto ptrType = mlir::cast(op.getSrc().getType()); + Type elemType = ptrType.getElementType(); + std::string elemFrag = getElementTypeFragment(elemType); + if (elemFrag.empty()) + return rewriter.notifyMatchFailure( + op, "unsupported element type for ubuf scalar mul op"); + + // All four scalar-tile ops keep signed intrinsic names (s16/s32). + std::string calleeName; + if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMULS." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VADDS." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMAXS." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VMINS." + elemFrag; + else + return rewriter.notifyMatchFailure(op, "unsupported ubuf scalar binary op"); + + Value dst = adaptor.getDst(); + Value src = adaptor.getSrc(); + if (!dst || !src || + !isa(dst.getType()) || + !isa(src.getType())) + return rewriter.notifyMatchFailure( + op, "unexpected converted ubuf scalar binary operand types"); + + Location loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + auto getI64 = [&](Value v) -> Value { + return castIntegerLikeTo(op, v, i64Ty); + }; + auto maskByte = [&](Value v) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(0xff))); + }; + auto shl = [&](Value v, uint64_t amount) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(amount))); + }; + // Unary config layout (same as VABS/VSHR): repeat[63:56] + Value config = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getRepeat())), 56)); + config = rewriter.create( + loc, config, maskByte(getI64(adaptor.getDstBlockStride()))); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcBlockStride())), 16)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstRepeatStride())), 32)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcRepeatStride())), 40)); + + Value scalarI64 = getI64(adaptor.getShiftDist()); + + // For float element types, the scalar was bitcast to i64 for the UB IR. + // Recover the float value via trunc + bitcast. + if (elemType.isF32() || elemType.isF16()) { + unsigned width = elemType.isF32() ? 32 : 16; + Type intTy = rewriter.getIntegerType(width); + Type floatTy = elemType.isF32() + ? rewriter.getF32Type() + : rewriter.getF16Type(); + Value trunced = rewriter.create(loc, intTy, scalarI64); + Value scalarFloat = rewriter.create(loc, floatTy, trunced); + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src.getType(), floatTy, i64Ty}, + TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, src, scalarFloat, config}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + } else { + // Integer: VMULS/VADDS/etc .s16/s32 takes i64 scalar directly. + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), src.getType(), i64Ty, i64Ty}, + TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, src, scalarI64, config}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + } + + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + template class LowerUBufUnaryOpPattern final : public OpConversionPattern { public: @@ -4822,6 +4928,19 @@ class LowerUBufUnaryOpPattern final : public OpConversionPattern { std::string calleeName; if constexpr (std::is_same_v) calleeName = "llvm.hivm.VNOT." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VABS." + elemFrag; + else if constexpr (std::is_same_v) { + if (elemFrag == "u16" || elemFrag == "u32") + return rewriter.notifyMatchFailure( + op, "VRELU not available for unsigned integer types"); + calleeName = "llvm.hivm.VRELU." + elemFrag; + } else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VEXP." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VSQRT." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VRSQRT." + elemFrag; else return rewriter.notifyMatchFailure(op, "unsupported ubuf unary op"); @@ -10555,10 +10674,28 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); patterns.add( typeConverter, patterns.getContext(), state); patterns.add( @@ -10692,8 +10829,17 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index 30007ee2df..b6d40f13e3 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -39,6 +39,24 @@ "bit_shrs": (pto.tile.bit_shrs, lambda x, n: np.right_shift(x, n)), } +UNARY_OPS = { + "abs": (pto.tile.abs, lambda x: np.abs(x)), + "relu": (pto.tile.relu, lambda x: np.maximum(x, 0)), + "neg": (pto.tile.neg, lambda x: np.negative(x)), + "exp": (pto.tile.exp, lambda x: np.exp(x)), + "sqrt": (pto.tile.sqrt, lambda x: np.sqrt(np.abs(x))), + "rsqrt":(pto.tile.rsqrt,lambda x: 1.0 / np.sqrt(np.abs(x))), +} + +POSITIVE_INPUT_OPS = {"sqrt", "rsqrt"} + +SCALAR_OPS = { + "adds": (pto.tile.adds, lambda x, s: x + s), + "muls": (pto.tile.muls, lambda x, s: x * s), + "maxs": (pto.tile.maxs, lambda x, s: np.maximum(x, s)), + "mins": (pto.tile.mins, lambda x, s: np.minimum(x, s)), +} + def _npu_stream(torch): return torch.npu.current_stream()._as_parameter_ # noqa: SLF001 @@ -266,6 +284,195 @@ def launch_and_check( torch.npu.synchronize() launch_s = time.perf_counter() - t0 + actual = z.cpu().numpy() + # VRSQRT uses a hardware fast approximation; relax tolerance. + eff_rtol = 1e-2 if op_name == "rsqrt" else rtol + eff_atol = 1e-2 if op_name == "rsqrt" else atol + np.testing.assert_allclose(actual, ref, rtol=eff_rtol, atol=eff_atol) + return compile_s, launch_s + + +def make_unary_kernel( + op_name: str, + rows: int, + cols: int, + dtype_str: str = "float32", + target: str = "a3", + backend: str = "vpto", + kernel_kind: str = "vector", +): + """Return a ``@pto.jit`` KernelHandle for an elementwise unary op.""" + tile_op_fn = UNARY_OPS[op_name][0] + pto_dtype = getattr(pto, dtype_str) + fn_name = f"un_{op_name}_{dtype_str}_{rows}x{cols}" + + def kernel_body( + A_ptr: pto.ptr(pto_dtype, "gm"), + C_ptr: pto.ptr(pto_dtype, "gm"), + ) -> None: + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A_ptr, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C_ptr, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + + pto.tile.load(a_part, a_tile) + tile_op_fn(a_tile, c_tile) + pto.tile.store(c_tile, c_part) + + kernel_body.__name__ = fn_name + return pto.jit( + name=fn_name, + kernel_kind=kernel_kind, + target=target, + backend=backend, + )(kernel_body) + + +def make_input_signed(shape, dtype, torch, seed=42): + """Return an NPU tensor filled with signed random small integers. + + Includes negative values so abs/relu are meaningful. + """ + rng = np.random.RandomState(seed) + x = rng.randint(-10, 10, size=shape).astype(np.float32) + return torch.from_numpy(x).to(device="npu:0", dtype=dtype) + + +def launch_and_check_unary( + *, + op_name: str, + kernel_handle, + ref_fn: Callable, + shape: tuple[int, int], + dtype_str: str, + torch, + rtol: float = 1e-6, + atol: float = 1e-6, + seed: int = 42, +): + """Compile, launch, and numerical-check one unary kernel specialization.""" + torch_dt = _torch_dtype(torch, dtype_str) + + if op_name in POSITIVE_INPUT_OPS: + x = make_input(shape, torch_dt, torch, seed=seed) + ref = ref_fn(x.cpu().numpy()) + else: + x = make_input_signed(shape, torch_dt, torch, seed=seed) + ref = ref_fn(x.cpu().numpy()) + z = torch.empty(shape, dtype=torch_dt, device="npu:0") + stream = _npu_stream(torch) + + t0 = time.perf_counter() + compiled = kernel_handle.compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](x.data_ptr(), z.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + + actual = z.cpu().numpy() + eff_rtol = 1e-2 if op_name == "rsqrt" else rtol + eff_atol = 1e-2 if op_name == "rsqrt" else atol + np.testing.assert_allclose(actual, ref, rtol=eff_rtol, atol=eff_atol) + return compile_s, launch_s + + +def make_scalar_kernel( + op_name: str, + rows: int, + cols: int, + scalar_val: float, + dtype_str: str = "float32", + target: str = "a3", + backend: str = "vpto", + kernel_kind: str = "vector", +): + """Return a ``@pto.jit`` KernelHandle for a scalar-tile binary op.""" + tile_op_fn = SCALAR_OPS[op_name][0] + pto_dtype = getattr(pto, dtype_str) + fn_name = f"scl_{op_name}_{dtype_str}_{rows}x{cols}_s{str(scalar_val).replace('.', 'p')}" + + def kernel_body( + A_ptr: pto.ptr(pto_dtype, "gm"), + C_ptr: pto.ptr(pto_dtype, "gm"), + ) -> None: + c0 = pto.const(0) + c1 = pto.const(1) + c_rows = pto.const(rows) + c_cols = pto.const(cols) + c_elems = pto.const(rows * cols) + + shape = [c1, c1, c1, c_rows, c_cols] + strides = [c_elems, c_elems, c_elems, c_cols, c1] + off = [c0, c0, c0, c0, c0] + + a_view = pto.make_tensor_view(A_ptr, shape=shape, strides=strides) + c_view = pto.make_tensor_view(C_ptr, shape=shape, strides=strides) + + a_part = pto.partition_view(a_view, offsets=off, sizes=shape) + c_part = pto.partition_view(c_view, offsets=off, sizes=shape) + + a_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + c_tile = pto.alloc_tile(shape=[rows, cols], dtype=pto_dtype) + + pto.tile.load(a_part, a_tile) + tile_op_fn(a_tile, scalar_val, c_tile) + pto.tile.store(c_tile, c_part) + + kernel_body.__name__ = fn_name + return pto.jit( + name=fn_name, + kernel_kind=kernel_kind, + target=target, + backend=backend, + )(kernel_body) + + +def launch_and_check_scalar( + *, + op_name: str, + kernel_handle, + ref_fn: Callable, + shape: tuple[int, int], + scalar_val: float, + dtype_str: str, + torch, + rtol: float = 1e-6, + atol: float = 1e-6, + seed: int = 42, +): + """Compile, launch, and numerical-check one scalar-tile kernel.""" + torch_dt = _torch_dtype(torch, dtype_str) + + x = make_input(shape, torch_dt, torch, seed=seed) + z = torch.empty(shape, dtype=torch_dt, device="npu:0") + ref = ref_fn(x.cpu().numpy(), scalar_val) + stream = _npu_stream(torch) + + t0 = time.perf_counter() + compiled = kernel_handle.compile() + compile_s = time.perf_counter() - t0 + + t0 = time.perf_counter() + compiled[1, stream](x.data_ptr(), z.data_ptr()) + torch.npu.synchronize() + launch_s = time.perf_counter() - t0 + actual = z.cpu().numpy() np.testing.assert_allclose(actual, ref, rtol=rtol, atol=atol) return compile_s, launch_s diff --git a/ptodsl/tests/e2e/test_scalar_elementwise.py b/ptodsl/tests/e2e/test_scalar_elementwise.py new file mode 100644 index 0000000000..dc0d0325da --- /dev/null +++ b/ptodsl/tests/e2e/test_scalar_elementwise.py @@ -0,0 +1,99 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root repository for the full text of the License. + +""" +e2e tests for A3 VPTO scalar-tile binary ops (tadds / tmuls / tmaxs / tmins). + +Run: + pytest ptodsl/tests/e2e/test_scalar_elementwise.py -v +""" + +from __future__ import annotations + +import pytest + +from .common import SCALAR_OPS, make_scalar_kernel, launch_and_check_scalar + + +F32_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall"), + (4, 64, "modeSmall-multi-row"), + (1, 128, "modeNorm1L"), + (16, 64, "modeNorm1L-16x64"), + (64, 64, "modeNorm1L-64x64"), +] + +F16_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall-f16"), + (4, 64, "modeSmall-multi-f16"), + (1, 128, "modeNorm1L-f16"), + (16, 128, "modeNorm1L-16x128-f16"), + (64, 128, "modeNorm1L-64x128-f16"), +] + +SCALAR_VALS = [1.0, 3.0, 0.5] + + +def _params(shapes, dtype_str): + return [ + pytest.param( + (op_name, ref_fn, rows, cols, sv, desc), + id=f"{op_name}-{dtype_str}-{rows}x{cols}-s{sv}-{desc}", + ) + for op_name, (_, ref_fn) in SCALAR_OPS.items() + for rows, cols, desc in shapes + for sv in SCALAR_VALS + ] + + +F32_PARAMS = _params(F32_SHAPES, "float32") +F16_PARAMS = _params(F16_SHAPES, "float16") + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F32_PARAMS) +def test_scalar_f32(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, scalar_val, desc = case + + kernel = make_scalar_kernel( + op_name, rows, cols, scalar_val, dtype_str="float32", + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_scalar( + op_name=op_name, + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + scalar_val=scalar_val, + dtype_str="float32", + torch=torch, + ) + print(f" PASS {op_name} f32 {rows}x{cols} s{scalar_val} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F16_PARAMS) +def test_scalar_f16(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, scalar_val, desc = case + + kernel = make_scalar_kernel( + op_name, rows, cols, scalar_val, dtype_str="float16", + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_scalar( + op_name=op_name, + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + scalar_val=scalar_val, + dtype_str="float16", + torch=torch, + ) + print(f" PASS {op_name} f16 {rows}x{cols} s{scalar_val} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") diff --git a/ptodsl/tests/e2e/test_unary_elementwise.py b/ptodsl/tests/e2e/test_unary_elementwise.py new file mode 100644 index 0000000000..142a89350a --- /dev/null +++ b/ptodsl/tests/e2e/test_unary_elementwise.py @@ -0,0 +1,98 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root repository for the full text of the License. + +""" +e2e tests for A3 VPTO unary elementwise ops (tabs / trelu). + +Run: + pytest ptodsl/tests/e2e/test_unary_elementwise.py -v +""" + +from __future__ import annotations + +import pytest + +from .common import UNARY_OPS, make_unary_kernel, launch_and_check_unary + + +# --------------------------------------------------------------------------- +# Shape matrix +# --------------------------------------------------------------------------- + +F32_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall"), + (4, 64, "modeSmall-multi-row"), + (1, 128, "modeNorm1L"), + (16, 64, "modeNorm1L-16x64"), + (64, 64, "modeNorm1L-64x64"), +] + +F16_SHAPES: list[tuple[int, int, str]] = [ + (1, 64, "modeSmall-f16"), + (4, 64, "modeSmall-multi-f16"), + (1, 128, "modeNorm1L-f16"), + (16, 128, "modeNorm1L-16x128-f16"), + (64, 128, "modeNorm1L-64x128-f16"), +] + + +def _params(shapes, dtype_str): + return [ + pytest.param( + (op_name, ref_fn, rows, cols, desc), + id=f"{op_name}-{dtype_str}-{rows}x{cols}-{desc}", + ) + for op_name, (_, ref_fn) in UNARY_OPS.items() + for rows, cols, desc in shapes + ] + + +F32_PARAMS = _params(F32_SHAPES, "float32") +F16_PARAMS = _params(F16_SHAPES, "float16") + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F32_PARAMS) +def test_unary_f32(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, desc = case + + kernel = make_unary_kernel( + op_name, rows, cols, dtype_str="float32", + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_unary( + op_name=op_name, + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + dtype_str="float32", + torch=torch, + ) + print(f" PASS {op_name} f32 {rows}x{cols} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") + + +@pytest.mark.require_npu +@pytest.mark.parametrize("case", F16_PARAMS) +def test_unary_f16(case, torch, target_arch, backend): + op_name, ref_fn, rows, cols, desc = case + + kernel = make_unary_kernel( + op_name, rows, cols, dtype_str="float16", + target=target_arch, backend=backend, + ) + compile_s, launch_s = launch_and_check_unary( + op_name=op_name, + kernel_handle=kernel, + ref_fn=ref_fn, + shape=(rows, cols), + dtype_str="float16", + torch=torch, + ) + print(f" PASS {op_name} f16 {rows}x{cols} ({desc}) " + f"compile={compile_s:.3f}s launch={launch_s:.3f}s") diff --git a/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto b/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto new file mode 100644 index 0000000000..bdadcef267 --- /dev/null +++ b/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto @@ -0,0 +1,31 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// Verifies that A3 VPTO planned addresses are assigned to all alloc_tile ops +// (including TXOR's tmp scratch tile) by PTOPlanMemory before LowerPTOToUBufOps. +// The addresses should be compact (256-byte aligned, not 64 KiB spaced). + +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-materialize-tile-handles 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @txor_planned_addr() + func.func @txor_planned_addr() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + %tmp = pto.alloc_tile : !pto.tile_buf + + // All four tiles must carry planned addresses from PTOPlanMemory. + // CHECK: pto.alloc_tile addr = + // CHECK: pto.alloc_tile addr = + // CHECK: pto.alloc_tile addr = + // CHECK: pto.alloc_tile addr = + pto.txor ins(%src0, %src1, %tmp : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto new file mode 100644 index 0000000000..e02ad47e72 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// tabs -> pto.ub.vabs lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tabs() + func.func @lower_tabs() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vabs {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.tabs + pto.tabs ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto new file mode 100644 index 0000000000..0b863fcc31 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto @@ -0,0 +1,24 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// tadds -> pto.ub.vadds lowering (scalar-tile add). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadds() + func.func @lower_tadds() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vadds {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.tadds + %scalar = arith.constant 3.0 : f32 + pto.tadds ins(%src, %scalar : !pto.tile_buf, f32) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto new file mode 100644 index 0000000000..e053d72b8a --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto @@ -0,0 +1,24 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// tmuls -> pto.ub.vmuls lowering (scalar-tile multiply). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tmuls() + func.func @lower_tmuls() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vmuls {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.tmuls + %scalar = arith.constant 2.0 : f32 + pto.tmuls ins(%src, %scalar : !pto.tile_buf, f32) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto new file mode 100644 index 0000000000..228294d976 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// tneg -> pto.ub.vmuls(dst, src, -1) decomposition (no native VNEG on C220). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tneg() + func.func @lower_tneg() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vmuls {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.tneg + pto.tneg ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto new file mode 100644 index 0000000000..8f722c029b --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// trelu -> pto.ub.vrelu lowering. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_trelu() + func.func @lower_trelu() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vrelu {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.trelu + pto.trelu ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} From 61c34fb8e339a1fb1f4168638f64aa34c9d2ed6a Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Sat, 4 Jul 2026 22:54:31 +0200 Subject: [PATCH 15/29] addrelu --- docs/designs/a2a3-vpto-elementwise-impl.md | 174 ++++++++++++++++++ include/PTO/IR/PTOOps.td | 38 ++++ include/PTO/IR/VPTOUbOps.td | 1 + lib/PTO/IR/PTO.cpp | 14 ++ lib/PTO/IR/VPTO.cpp | 22 +++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 20 ++ lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 5 + ptodsl/ptodsl/_ops.py | 11 +- ptodsl/ptodsl/_tile_namespace.py | 1 + ptodsl/tests/e2e/common.py | 10 +- ptodsl/tests/e2e/test_binary_elementwise.py | 2 + .../ub/tile_to_ub/elementwise/taddrelu.pto | 25 +++ .../ub/ub_to_llvm/elementwise/vaddrelu.pto | 57 ++++++ 13 files changed, 377 insertions(+), 3 deletions(-) create mode 100644 docs/designs/a2a3-vpto-elementwise-impl.md create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto diff --git a/docs/designs/a2a3-vpto-elementwise-impl.md b/docs/designs/a2a3-vpto-elementwise-impl.md new file mode 100644 index 0000000000..10f3825c19 --- /dev/null +++ b/docs/designs/a2a3-vpto-elementwise-impl.md @@ -0,0 +1,174 @@ +# A2/A3 VPTO Elementwise Lowering — Implementation Notes + +## Op Coverage + +### Binary Tile-Tile Ops (direct intrinsics) + +| PTO Op | UB Op | Intrinsic | dtypes | Status | +|---|---|---|---|---| +| `tadd` | `ub.vadd` | `VADD.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tsub` | `ub.vsub` | `VSUB.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tmul` | `ub.vmul` | `VMUL.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tdiv` | `ub.vdiv` | `VDIV.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tmax` | `ub.vmax` | `VMAX.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tmin` | `ub.vmin` | `VMIN.f32/f16/s16/s32` | f32, f16, i16 | Done | +| `tand` | `ub.vand` | `VAND.s16/u16` | i16 | Done | +| `tor` | `ub.vor` | `VOR.s16/u16` | i16 | Done | +| `txor` | decompose | `VOR+VAND+VNOT+VAND` | i16 | Done (De Morgan) | + +### Fused Tile-Tile Ops + +| PTO Op | UB Op | Intrinsic | dtypes | Status | +|---|---|---|---|---| +| `taddrelu` | `ub.vaddrelu` | `VADDRELU.f32/f16/s16` | f32, f16, i16 | Done | + +### Unary Ops (direct intrinsics) + +| PTO Op | UB Op | Intrinsic | dtypes | Status | +|---|---|---|---|---| +| `tabs` | `ub.vabs` | `VABS.f32/f16/s16` | f32, f16 | Done | +| `trelu` | `ub.vrelu` | `VRELU.f32/f16/s32` | f32, f16 | Done | +| `texp` | `ub.vexp` | `VEXP.f32/f16` | f32, f16 | Done | +| `tsqrt` | `ub.vsqrt` | `VSQRT.f32/f16` | f32, f16 | Done | +| `trsqrt`| `ub.vrsqrt`| `VRSQRT.f32/f16` | f32, f16 | Done (fast-approx) | +| `tnot` | `ub.vnot` | `VNOT.s16/u16` | i16 | Done | + +### Unary Ops (decomposed) + +| PTO Op | Decomposition | Intrinsic(s) | dtypes | Status | +|---|---|---|---|---| +| `tneg` | `dst = src * (-1)` | `VMULS` | f32, f16 | Done | + +### Scalar-Tile Binary Ops + +| PTO Op | UB Op | Intrinsic | dtypes | Status | +|---|---|---|---|---| +| `tadds` | `ub.vadds` | `VADDS.f32/f16/s16/s32` | f32, f16 | Done | +| `tmuls` | `ub.vmuls` | `VMULS.f32/f16/s16/s32` | f32, f16 | Done | +| `tmaxs` | `ub.vmaxs` | `VMAXS.f32/f16/s16/s32` | f32, f16 | Done | +| `tmins` | `ub.vmins` | `VMINS.f32/f16/s16/s32` | f32, f16 | Done | + +### Scalar Shift Ops + +| PTO Op | UB Op | Intrinsic | dtypes | Status | +|---|---|---|---|---| +| `tshls` | `ub.vshl` | `VSHL.u16` | i16 | Done | +| `tshrs` | `ub.vshr` | `VSHR.u16` | i16 | Done | + +## Config Word Layouts + +### Binary Tile-Tile Config (VADD/VSUB/VMUL/VDIV/VMAX/VMIN/VAND/VOR/VADDRELU) + +``` + 7:0 repeat +15:8 dst block stride +23:16 src0 block stride +31:24 src1 block stride +39:32 dst repeat stride +47:40 src0 repeat stride +55:48 src1 repeat stride +63:56 simd flag (=1) +``` + +### Unary Config (VABS/VRELU/VNOT/VEXP/VSQRT/VRSQRT) + +``` +15:0 dst block stride +31:16 src block stride +39:32 dst repeat stride +51:40 src repeat stride +63:56 repeat +``` + +### Scalar-Tile Config (VADDS/VMULS/VMAXS/VMINS/VSHL/VSHR) + +Same as unary config layout (repeat at `[63:56]`). + +## Scalar Bitcast Convention + +Scalar-tile ops (`VADDS`/`VMULS`/`VMAXS`/`VMINS`) accept a scalar operand whose +LLVM-level type depends on the element type: + +- **Float** (f32/f16): intrinsic takes `float`/`half` scalar +- **Integer** (s16/s32): intrinsic takes `i64` scalar (widened from int16/int32) + +Since all UB ops store the scalar as `i64` in the PTO IR, float scalars require +bitcast-based conversion: + +**Tile-to-UB lowering** (float scalar → i64): +``` +f32 3.5 → bitcast → i32 → extsi → i64 +f16 3.5 → bitcast → i16 → extsi → i64 +``` + +**LLVM emitter** (i64 → float scalar): +``` +i64 → trunc → i32 → bitcast → f32 +i64 → trunc → i16 → bitcast → f16 +``` + +This preserves the exact bit pattern, unlike `SIToFPOp` which would convert +the integer value (3 → 3.0, losing fractional parts). + +For integer types (s16/s32), the i64 is passed directly to the intrinsic. + +## Count Mode Limitation (C220) + +C220 count mode (`SBITSET1(ctrl,56)` + `MOVEMASK(count)`) does **not** support +`repeat > 1`. Multi-element count mode causes CCE errors. + +As a result: +- `repeat=1`: direct count mode (no loop) +- `repeat>1, rows=1`: split into per-chunk `scf.for` with repeat=1 (`modeCount1L`) +- `repeat>1, rows>1`: per-row `scf.for` with repeat=1 (`modeNorm1L`) + +Non-VL-aligned shapes (e.g., 1×96, 1×200) are routed through `modeNorm1L` +(loop + tail), not `modeCount1L`. + +## VRSQRT Fast Approximation + +`VRSQRT` uses a hardware fast inverse square root approximation. The maximum +relative error is approximately 0.3%. E2e tests use `rtol=1e-2, atol=1e-2` for +rsqrt. + +## TXOR Decomposition (No Native VXOR) + +C220 has no native `VXOR` intrinsic. `TXOR` decomposes via De Morgan's law: + +``` +src0 ^ src1 = ~(src0 & src1) & (src0 | src1) +``` + +Lowered to: +``` +VOR(tmp, src0, src1) // tmp = src0 | src1 +barrier PIPE_V +VAND(dst, src0, src1) // dst = src0 & src1 +barrier PIPE_V +VNOT(dst, dst) // dst = ~dst +barrier PIPE_V +VAND(dst, dst, tmp) // dst = dst & tmp +``` + +`PIPE_V` barriers between each step mirror CANN's `TXOR_IMPL` semantics. + +## UB Memory Planning + +A3 VPTO reuses the existing `PTOPlanMemory` pass: +``` +PTOViewToMemref → PTOPlanMemory → PTOResolveReservedBuffers → PTOMaterializeTileHandles → LowerPTOToUBufOps +``` + +`LowerPTOToUBufOps` requires planned `alloc_tile addr = ...` from +`PTOMaterializeTileHandles`. The old manual sequential allocator has been +removed entirely. + +See `docs/designs/a2a3-allocator.md` for details. + +## Test Counts + +- **56 UB lit tests** (tile-to-UB IR checks + UB-to-LLVM checks + round-trip + planned-address) +- **192 binary e2e** (f32/f16/i16 binary + bitwise + shift across dispatch-shape matrix, including `taddrelu`) +- **60 unary e2e** (abs/relu/neg/exp/sqrt/rsqrt across 5 shapes × 2 dtypes) +- **120 scalar binary e2e** (adds/muls/maxs/mins across 5 shapes × 3 scalars × 2 dtypes) +- **Total confirmed elementwise hardware e2e tests: 426** diff --git a/include/PTO/IR/PTOOps.td b/include/PTO/IR/PTOOps.td index d99e9f3f4c..153b416ed0 100644 --- a/include/PTO/IR/PTOOps.td +++ b/include/PTO/IR/PTOOps.td @@ -3187,6 +3187,44 @@ def TAddOp : PTO_TOp<"tadd", [ }]; } +def TAddReluOp : PTO_TOp<"taddrelu", [ + PTO_DpsInitOpInterface, + OpPipeInterface, + DeclareOpInterfaceMethods +]> { + let summary = "Fused elementwise add + ReLU of two tiles"; + let description = [{ + For each element (i, j): dst[i,j] = max(0, src0[i,j] + src1[i,j]). + Maps to the fused VADDRELU intrinsic on C220. + }]; + + let arguments = (ins + PTODpsType:$src0, + PTODpsType:$src1, + PTODpsType:$dst + ); + + let results = (outs); + + let assemblyFormat = [{ + `ins` `(` $src0 `,` $src1 `:` qualified(type($src0)) `,` qualified(type($src1)) `)` + `outs` `(` $dst `:` qualified(type($dst) ) `)` + attr-dict + }]; + + let hasVerifier = 1; + + let extraClassDeclaration = [{ + ::mlir::pto::PIPE getPipe() { + return ::mlir::pto::PIPE::PIPE_V; + } + + ::mlir::MutableOperandRange getDpsInitsMutable() { + return getDstMutable(); + } + }]; +} + def TAddCOp : PTO_TOp<"taddc", [ PTO_DpsInitOpInterface, OpPipeInterface, diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index 4131880da3..5013b2ac89 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -65,6 +65,7 @@ def PTO_UBVmaxOp : PTO_UBufBinaryOp<"ub.vmax">; def PTO_UBVminOp : PTO_UBufBinaryOp<"ub.vmin">; def PTO_UBVandOp : PTO_UBufBinaryOp<"ub.vand">; def PTO_UBVorOp : PTO_UBufBinaryOp<"ub.vor">; +def PTO_UBVaddReluOp : PTO_UBufBinaryOp<"ub.vaddrelu">; //===----------------------------------------------------------------------===// // PTO_UBufUnaryOp — unary elementwise (VNOT) diff --git a/lib/PTO/IR/PTO.cpp b/lib/PTO/IR/PTO.cpp index 8943040348..7831d945e4 100644 --- a/lib/PTO/IR/PTO.cpp +++ b/lib/PTO/IR/PTO.cpp @@ -4993,6 +4993,19 @@ LogicalResult pto::TAddOp::verify() { "expects A5 tadd element type to be i32/i16/i8/f16/bf16/f32"); } +LogicalResult pto::TAddReluOp::verify() { + if (shouldBypassDecodedMemrefVerifier(getOperation())) + return success(); + FailureOr elemOr = verifyMatchingRowMajorBinaryTileOpCommon( + getOperation(), getSrc0().getType(), getSrc1().getType(), getDst().getType()); + if (failed(elemOr)) + return failure(); + Type elemTy = *elemOr; + if (elemTy.isInteger(16) || elemTy.isF16() || elemTy.isF32()) + return success(); + return emitOpError("expects element type to be i16/f16/f32"); +} + LogicalResult pto::TAddCOp::verify() { if (shouldBypassDecodedMemrefVerifier(getOperation())) return success(); @@ -13153,6 +13166,7 @@ void GetValidShapeOp::getEffects( // Elementwise + reductions: mostly PIPE_V tilebuf ops PTO_DEFINE_BINARY_EFFECTS(TAddOp, getSrc0Mutable(), getSrc1Mutable(), getDstMutable()) +PTO_DEFINE_BINARY_EFFECTS(TAddReluOp, getSrc0Mutable(), getSrc1Mutable(), getDstMutable()) PTO_DEFINE_TERNARY_EFFECTS(TAddCOp, getSrc0Mutable(), getSrc1Mutable(), getSrc2Mutable(), getDstMutable()) PTO_DEFINE_UNARY_EFFECTS(TAddSOp, getSrcMutable(), getDstMutable()) PTO_DEFINE_BINARY_EFFECTS(TAddSCOp, getSrc0Mutable(), getSrc1Mutable(), getDstMutable()) diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index 6beeb1e5c9..a7da343fba 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8008,6 +8008,28 @@ LogicalResult UBVorOp::verify() { return success(); } +#define PTO_DEFINE_UB_BINARY_VERIFY_AND_EFFECTS(OpName) \ + void OpName::getEffects( \ + SmallVectorImpl> \ + &effects) { \ + effects.emplace_back(MemoryEffects::Read::get(), &getSrc0Mutable()); \ + effects.emplace_back(MemoryEffects::Read::get(), &getSrc1Mutable()); \ + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); \ + } \ + LogicalResult OpName::verify() { \ + if (!isBufferLike(getDst().getType()) || \ + !isBufferLike(getSrc0().getType()) || \ + !isBufferLike(getSrc1().getType())) \ + return emitOpError("requires pointer-like operands"); \ + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB || \ + classifyMemoryRole(getSrc0().getType()) != MemoryRole::UB || \ + classifyMemoryRole(getSrc1().getType()) != MemoryRole::UB) \ + return emitOpError("requires UB-backed operands"); \ + return success(); \ + } + +PTO_DEFINE_UB_BINARY_VERIFY_AND_EFFECTS(UBVaddReluOp) + //===----------------------------------------------------------------------===// // UBVnotOp //===----------------------------------------------------------------------===// diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 6b9c827bc8..17c4362e3b 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -274,6 +274,26 @@ struct LowerPTOToUBufOpsPass } } + // ---- taddrelu -> pto.ub.vaddrelu ---- + { + SmallVector ops; + func.walk([&](pto::TAddReluOp op) { ops.push_back(op); }); + for (auto op : ops) { + if (!canLower(op, tileShapes)) + continue; + auto info = extractTileShapeInfo(op, tileShapes); + if (!info) + continue; + auto [dstPtr, src0Ptr, src1Ptr, ptrType] = lowerBinaryOpCommon( + builder, ctx, op, op.getDst(), op.getSrc0(), op.getSrc1(), tileShapes); + if (!dstPtr) + continue; + dispatch(op.getLoc(), builder, dstPtr, src0Ptr, + src1Ptr, ptrType, *info); + op.erase(); + } + } + // ---- tsub → pto.ub.vsub ---- { SmallVector ops; diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 1b9660d25d..df2291f898 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4639,6 +4639,8 @@ class LowerUBufBinaryOpPattern final : public OpConversionPattern { calleeName = "llvm.hivm.VAND." + elemFrag; else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VOR." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VADDRELU." + elemFrag; else return rewriter.notifyMatchFailure(op, "unsupported ubuf binary op"); @@ -10672,6 +10674,8 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); patterns.add>( @@ -10828,6 +10832,7 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/ptodsl/_ops.py b/ptodsl/ptodsl/_ops.py index 53dd3e2255..9432799147 100644 --- a/ptodsl/ptodsl/_ops.py +++ b/ptodsl/ptodsl/_ops.py @@ -2586,6 +2586,15 @@ def tadd(src0, src1, dst): ) +def taddrelu(src0, src1, dst): + """``pto.taddrelu ins(src0, src1) outs(dst)``.""" + _pto.taddrelu( + unwrap_surface_value(src0), + unwrap_surface_value(src1), + unwrap_surface_value(dst), + ) + + def tsub(src0, src1, dst): """``pto.tsub ins(src0, src1) outs(dst)``.""" _pto.tsub( @@ -5468,7 +5477,7 @@ def import_reserved_buffer(name, *, peer_func): "tload", "tstore", "tmov", "tinsert", "tmatmul", "tmatmul_acc", "tmatmul_mx", "tmatmul_mx_acc", "tmatmul_mx_bias", "tgemv_mx", "tgemv_mx_acc", "tgemv_mx_bias", - "tadd", "tsub", "tmul", "tdiv", "tmax", "tmin", + "tadd", "taddrelu", "tsub", "tmul", "tdiv", "tmax", "tmin", "tadds", "tsubs", "tmuls", "tdivs", "tmaxs", "tmins", "texp", "tlog", "tsqrt", "trsqrt", "trecip", "tabs", "tneg", "trelu", "tlrelu", diff --git a/ptodsl/ptodsl/_tile_namespace.py b/ptodsl/ptodsl/_tile_namespace.py index bc07ce97fb..ca27d42cfb 100644 --- a/ptodsl/ptodsl/_tile_namespace.py +++ b/ptodsl/ptodsl/_tile_namespace.py @@ -92,6 +92,7 @@ def store(tile, dst, *, offsets=None, sizes=None): return _ops.tstore(tile, part) add = staticmethod(_ops.tadd) + addrelu = staticmethod(_ops.taddrelu) sub = staticmethod(_ops.tsub) mul = staticmethod(_ops.tmul) div = staticmethod(_ops.tdiv) diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index b6d40f13e3..e7461a2f01 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -21,6 +21,7 @@ BINARY_OPS = { "add": (pto.tile.add, lambda x, y: x + y), + "addrelu": (pto.tile.addrelu, lambda x, y: np.maximum(x + y, 0)), "sub": (pto.tile.sub, lambda x, y: x - y), "mul": (pto.tile.mul, lambda x, y: x * y), "div": (pto.tile.div, lambda x, y: x / (y + 1e-8)), @@ -257,6 +258,7 @@ def make_input(shape, dtype, torch, seed=42): def launch_and_check( *, + op_name: str | None = None, kernel_handle, ref_fn: Callable, shape: tuple[int, int], @@ -269,8 +271,12 @@ def launch_and_check( """Compile, launch, and numerical-check one kernel specialization.""" torch_dt = _torch_dtype(torch, dtype_str) - x = make_input(shape, torch_dt, torch, seed=seed) - y = make_input(shape, torch_dt, torch, seed=seed + 1) + if op_name == "addrelu": + x = make_input_signed(shape, torch_dt, torch, seed=seed) + y = make_input_signed(shape, torch_dt, torch, seed=seed + 1) + else: + x = make_input(shape, torch_dt, torch, seed=seed) + y = make_input(shape, torch_dt, torch, seed=seed + 1) z = torch.empty(shape, dtype=torch_dt, device="npu:0") ref = ref_fn(x.cpu().numpy(), y.cpu().numpy()) stream = _npu_stream(torch) diff --git a/ptodsl/tests/e2e/test_binary_elementwise.py b/ptodsl/tests/e2e/test_binary_elementwise.py index b0248dcec0..f812570564 100644 --- a/ptodsl/tests/e2e/test_binary_elementwise.py +++ b/ptodsl/tests/e2e/test_binary_elementwise.py @@ -99,6 +99,7 @@ def test_binary_f32(case, torch, target_arch, backend): target=target_arch, backend=backend, ) compile_s, launch_s = launch_and_check( + op_name=op_name, kernel_handle=kernel, ref_fn=ref_fn, shape=(rows, cols), @@ -133,6 +134,7 @@ def test_binary_f16(case, torch, target_arch, backend): target=target_arch, backend=backend, ) compile_s, launch_s = launch_and_check( + op_name=op_name, kernel_handle=kernel, ref_fn=ref_fn, shape=(rows, cols), diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto new file mode 100644 index 0000000000..36e1051529 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto @@ -0,0 +1,25 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_taddrelu() + func.func @lower_taddrelu() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.set_mask_count + // CHECK: pto.ub.vaddrelu {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + // CHECK: pto.ub.set_mask_norm + pto.taddrelu ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.taddrelu + return + } +} diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto new file mode 100644 index 0000000000..34a923d908 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto @@ -0,0 +1,57 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vaddrelu -> llvm.hivm.VADDRELU.* for the C220-supported dtypes. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @ub_vaddrelu_s16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> + func.func @ub_vaddrelu_s16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + // CHECK: llvm.call @llvm.hivm.VADDRELU.s16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + pto.ub.vaddrelu %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: llvm.func @ub_vaddrelu_f16_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> + func.func @ub_vaddrelu_f16(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + // CHECK: llvm.call @llvm.hivm.VADDRELU.f16(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + pto.ub.vaddrelu %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } + + // CHECK-LABEL: llvm.func @ub_vaddrelu_f32_mix_aiv( + // CHECK-SAME: %[[DST:[^:]+]]: !llvm.ptr<6>, %[[SRC0:[^:]+]]: !llvm.ptr<6>, %[[SRC1:[^:]+]]: !llvm.ptr<6> + func.func @ub_vaddrelu_f32(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { + %c128 = arith.constant 128 : i64 + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c2 = arith.constant 2 : i64 + %c3 = arith.constant 3 : i64 + %c4 = arith.constant 4 : i64 + %c5 = arith.constant 5 : i64 + // CHECK: llvm.call @llvm.hivm.VADDRELU.f32(%[[DST]], %[[SRC0]], %[[SRC1]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + pto.ub.vaddrelu %dst, %src0, %src1, %c128, %c0, %c1, %c2, %c3, %c4, %c5 : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + return + } +} From fec8a73ceb2de2e1b26e16be2018f857cf00f233 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Mon, 6 Jul 2026 11:27:54 +0200 Subject: [PATCH 16/29] fix --- docs/designs/a2a3-vpto-elementwise-impl.md | 6 ++++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/designs/a2a3-vpto-elementwise-impl.md b/docs/designs/a2a3-vpto-elementwise-impl.md index 10f3825c19..e811a9f895 100644 --- a/docs/designs/a2a3-vpto-elementwise-impl.md +++ b/docs/designs/a2a3-vpto-elementwise-impl.md @@ -38,6 +38,7 @@ | PTO Op | Decomposition | Intrinsic(s) | dtypes | Status | |---|---|---|---|---| | `tneg` | `dst = src * (-1)` | `VMULS` | f32, f16 | Done | +| `trecip` | blocked | no native `VRECIP`; needs verified UB duplicate/fill of constant-one tile plus `VDIV`, or a scalar-over-tile divide intrinsic | f32, f16 | Blocked | ### Scalar-Tile Binary Ops @@ -112,6 +113,11 @@ the integer value (3 → 3.0, losing fractional parts). For integer types (s16/s32), the i64 is passed directly to the intrinsic. +`tneg` must also use this bitcast-preserving path. Passing raw integer `i64 -1` +to `VMULS.f32/f16` truncates to all-one float bit patterns, which become NaN. +The lowering therefore materializes typed `-1.0` (`f32`/`f16`) and bitcasts it to +the UB scalar `i64` representation. + ## Count Mode Limitation (C220) C220 count mode (`SBITSET1(ctrl,56)` + `MOVEMASK(count)`) does **not** support diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 17c4362e3b..1497bfcc05 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -538,8 +538,17 @@ struct LowerPTOToUBufOpsPass tileShapes); if (!dstPtr) continue; - Value minusOne = builder.create( - op.getLoc(), builder.getI64IntegerAttr(-1)); + Type elemTy = ptrType.getElementType(); + Value minusOneScalar; + if (elemTy.isF32() || elemTy.isF16()) { + minusOneScalar = builder.create( + op.getLoc(), builder.getFloatAttr(elemTy, -1.0)); + } else { + minusOneScalar = builder.create( + op.getLoc(), builder.getIntegerAttr(elemTy, -1)); + } + Value minusOne = + convertScalarToI64(builder, op.getLoc(), minusOneScalar); dispatchShift(op.getLoc(), builder, dstPtr, srcPtr, minusOne, ptrType, *info); op.erase(); From 2531922f60f435d1c9717e3a0f02a8e8caa3b5fc Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Mon, 6 Jul 2026 13:45:15 +0200 Subject: [PATCH 17/29] cleanup --- docs/designs/a2a3-vpto-elementwise-impl.md | 6 ++- ptodsl/tests/e2e/README.md | 51 +++++++++++++++++----- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/docs/designs/a2a3-vpto-elementwise-impl.md b/docs/designs/a2a3-vpto-elementwise-impl.md index e811a9f895..5340c38590 100644 --- a/docs/designs/a2a3-vpto-elementwise-impl.md +++ b/docs/designs/a2a3-vpto-elementwise-impl.md @@ -177,4 +177,8 @@ See `docs/designs/a2a3-allocator.md` for details. - **192 binary e2e** (f32/f16/i16 binary + bitwise + shift across dispatch-shape matrix, including `taddrelu`) - **60 unary e2e** (abs/relu/neg/exp/sqrt/rsqrt across 5 shapes × 2 dtypes) - **120 scalar binary e2e** (adds/muls/maxs/mins across 5 shapes × 3 scalars × 2 dtypes) -- **Total confirmed elementwise hardware e2e tests: 426** +- **Total confirmed elementwise hardware e2e tests: 372** + +The PTODSL hardware e2e suite runs the A3 target by default. A2 and A3 share +the VPTO lowering pipeline, so this validates the A2/A3 lowering path unless +future lowering behavior diverges between the targets. diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md index 9c2238b828..2eb01fae8f 100644 --- a/ptodsl/tests/e2e/README.md +++ b/ptodsl/tests/e2e/README.md @@ -1,11 +1,15 @@ # e2e tests + End-to-end numerical-correctness tests for PTODSL vector ops. ## Quick start ```bash # From repo root inside the hardware docker image: -cd /workspace && PYTHONPATH=/workspace/ptodsl python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v +cd /workspace && PYTHONPATH=/workspace/ptodsl python3 -m pytest ptodsl/tests/e2e -v + +# Run one suite +python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v # Run a single test python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "add-float32-1x64" @@ -18,24 +22,52 @@ python3 -m pytest ptodsl/tests/e2e/test_binary_elementwise.py -v -k "div" ``` ## Hardware and backend selection + ### A3 vpto backend -This is the default, or can be selected with `--backend vpto --vpto-target a3`. + +This is the default, or can be selected with `--backend vpto --target a3`. +The A2 and A3 VPTO lowering pipeline is shared, so A3 e2e coverage validates +the A2/A3 lowering path unless future lowering behavior diverges. ### A3 emitc backend -This can be selected with `--backend emitc --vpto-target a3`. + +This can be selected with `--backend emitc --target a3`. ### A5 vpto backend -This can be selected with `--backend vpto --vpto-target a5`. + +This can be selected with `--backend vpto --target a5`. ## Test matrix -### Binary elementwise (tadd/tsub/tmul/tdiv/tmax/tmin/tand/tor) +### Binary elementwise | Category | Ops | Dtypes | Shapes | Total | |----------|-----|--------|--------|-------| -| f32 | add, sub, mul, div, max, min | float32 | 12 | 72 | -| f16 | add, sub, mul, div, max, min | float16 | 6 | 36 | -| i16 | bit_and, bit_or | int16 | 5 | 10 | +| f32 | add, addrelu, sub, mul, div, max, min | float32 | 15 | 105 | +| f16 | add, addrelu, sub, mul, div, max, min | float16 | 6 | 42 | +| i16 bitwise | bit_and, bit_or, bit_xor | int16 | 5 | 15 | +| i16 shifts | bit_shls, bit_shrs | int16 | 5 shapes x 3 shifts | 30 | + +### Unary elementwise + +| Ops | Dtypes | Shapes | Total | +|-----|--------|--------|-------| +| abs, relu, neg, exp, sqrt, rsqrt | float32, float16 | 5 per dtype | 60 | + +### Scalar-tile elementwise + +| Ops | Dtypes | Shapes / Scalars | Total | +|-----|--------|------------------|-------| +| adds, muls, maxs, mins | float32, float16 | 5 shapes x 3 scalars per dtype | 120 | + +### Confirmed hardware e2e count + +| Suite | Total | +|-------|-------| +| Binary, bitwise, and shifts | 192 | +| Unary | 60 | +| Scalar-tile | 120 | +| Total | 372 | ### Shape coverage (exercises lowering code paths) @@ -56,9 +88,8 @@ This can be selected with `--backend vpto --vpto-target a5`. | (16, 256) | modeNorm1L 16x256 | | (32, 32) | modeSmall 32x32 square small | | (1, 200) | modeNorm1L 1x200 tail | -| (32, 100) | modeCount1L nonVLAligned odd rows | | (4, 200) | modeCount1L 4x200 | -| (32, 32) | modeSmall 32x32 square small | +| (1, 96) | modeCount1L 1x96 tail | **f16** (`elementsPerRepeat=128`): From 67d947e0c3192ccc740177ebf1fc29f59fd17365 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Mon, 6 Jul 2026 15:23:52 +0200 Subject: [PATCH 18/29] trecip --- docs/designs/a2a3-vpto-elementwise-impl.md | 10 +-- include/PTO/IR/VPTOUbOps.td | 29 ++++++++ lib/PTO/IR/VPTO.cpp | 14 ++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 72 +++++++++++++++++++ lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 71 +++++++++++++++++- ptodsl/tests/e2e/README.md | 6 +- ptodsl/tests/e2e/common.py | 3 +- .../vpto/ub/tile_to_ub/elementwise/trecip.pto | 25 +++++++ .../vpto/ub/ub_to_llvm/elementwise/vdup.pto | 27 +++++++ 9 files changed, 247 insertions(+), 10 deletions(-) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto diff --git a/docs/designs/a2a3-vpto-elementwise-impl.md b/docs/designs/a2a3-vpto-elementwise-impl.md index 5340c38590..6437dcef1e 100644 --- a/docs/designs/a2a3-vpto-elementwise-impl.md +++ b/docs/designs/a2a3-vpto-elementwise-impl.md @@ -38,7 +38,7 @@ | PTO Op | Decomposition | Intrinsic(s) | dtypes | Status | |---|---|---|---|---| | `tneg` | `dst = src * (-1)` | `VMULS` | f32, f16 | Done | -| `trecip` | blocked | no native `VRECIP`; needs verified UB duplicate/fill of constant-one tile plus `VDIV`, or a scalar-over-tile divide intrinsic | f32, f16 | Blocked | +| `trecip` | `dst = 1; dst = dst / src` | `MOVEV` + `VDIV` | f32, f16 | Done | ### Scalar-Tile Binary Ops @@ -81,7 +81,7 @@ 63:56 repeat ``` -### Scalar-Tile Config (VADDS/VMULS/VMAXS/VMINS/VSHL/VSHR) +### Scalar-Tile Config (VADDS/VMULS/VMAXS/VMINS/VSHL/VSHR/MOVEV) Same as unary config layout (repeat at `[63:56]`). @@ -173,11 +173,11 @@ See `docs/designs/a2a3-allocator.md` for details. ## Test Counts -- **56 UB lit tests** (tile-to-UB IR checks + UB-to-LLVM checks + round-trip + planned-address) +- **58 UB lit tests** (tile-to-UB IR checks + UB-to-LLVM checks + round-trip + planned-address) - **192 binary e2e** (f32/f16/i16 binary + bitwise + shift across dispatch-shape matrix, including `taddrelu`) -- **60 unary e2e** (abs/relu/neg/exp/sqrt/rsqrt across 5 shapes × 2 dtypes) +- **70 unary e2e** (abs/relu/neg/exp/sqrt/rsqrt/recip across 5 shapes × 2 dtypes) - **120 scalar binary e2e** (adds/muls/maxs/mins across 5 shapes × 3 scalars × 2 dtypes) -- **Total confirmed elementwise hardware e2e tests: 372** +- **Total confirmed elementwise hardware e2e tests: 382** The PTODSL hardware e2e suite runs the A3 target by default. A2 and A3 share the VPTO lowering pipeline, so this validates the A2/A3 lowering path unless diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index 5013b2ac89..285a85c6b9 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -162,6 +162,35 @@ def PTO_UBVaddSOp : PTO_UBufShiftOp<"ub.vadds">; def PTO_UBVmaxSOp : PTO_UBufShiftOp<"ub.vmaxs">; def PTO_UBVminSOp : PTO_UBufShiftOp<"ub.vmins">; +def PTO_UBVdupOp : PTO_Op<"ub.vdup", [ + DeclareOpInterfaceMethods +]> { + let summary = "Raw ubuf scalar duplicate mapping to llvm.hivm.MOVEV.*"; + + let arguments = (ins + PTO_BufferType:$dst, + I64:$scalar, + I64:$repeat, + I64:$dstBlockStride, + I64:$srcBlockStride, + I64:$dstRepeatStride, + I64:$srcRepeatStride + ); + + let results = (outs); + + let hasVerifier = 1; + + let assemblyFormat = [{ + $dst `,` $scalar `,` + $repeat `,` $dstBlockStride `,` $srcBlockStride `,` + $dstRepeatStride `,` $srcRepeatStride + attr-dict `:` type($dst) `,` type($scalar) `,` + type($repeat) `,` type($dstBlockStride) `,` type($srcBlockStride) `,` + type($dstRepeatStride) `,` type($srcRepeatStride) + }]; +} + def PTO_UBSetMaskOp : PTO_Op<"ub.set_mask", [ DeclareOpInterfaceMethods ]> { diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index a7da343fba..269143684a 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8115,6 +8115,20 @@ PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVaddSOp) PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVmaxSOp) PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVminSOp) +void UBVdupOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Write::get(), &getDstMutable()); +} + +LogicalResult UBVdupOp::verify() { + if (!isBufferLike(getDst().getType())) + return emitOpError("requires pointer-like dst operand"); + if (classifyMemoryRole(getDst().getType()) != MemoryRole::UB) + return emitOpError("requires UB-backed dst operand"); + return success(); +} + //===----------------------------------------------------------------------===// // UBVshlOp //===----------------------------------------------------------------------===// diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 1497bfcc05..76d6eaf8bc 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -555,6 +555,32 @@ struct LowerPTOToUBufOpsPass } } + // ---- trecip → vector_dup(dst, 1) + vdiv(dst, dst, src) ---- + { + SmallVector ops; + func.walk([&](pto::TRecipOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + Type elemTy = ptrType.getElementType(); + Value oneScalar = builder.create( + op.getLoc(), builder.getFloatAttr(elemTy, 1.0)); + Value one = convertScalarToI64(builder, op.getLoc(), oneScalar); + dispatchDup(op.getLoc(), builder, dstPtr, one, ptrType, *info); + builder.create(op.getLoc(), + pto::PipeAttr::get(ctx, pto::PIPE::PIPE_V)); + dispatch(op.getLoc(), builder, dstPtr, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + // ---- texp → pto.ub.vexp ---- { SmallVector ops; @@ -980,6 +1006,52 @@ struct LowerPTOToUBufOpsPass fullMask(loc, b); } + void dispatchDup(Location loc, OpBuilder &b, Value dst, Value scalar, + pto::PtrType ptrTy, const TileShapeInfo &info) { + auto emit = [&](Value rd) { + Value scalarI64 = scalar; + if (scalarI64.getType() != b.getI64Type()) + scalarI64 = b.create(loc, b.getI64Type(), scalar); + b.create(loc, rd, scalarI64, + i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), + i64c8(loc, b), i64c0(loc, b)); + }; + + int64_t epr = info.elementsPerRepeat; + int64_t totalV = info.vRows * info.vCols; + int64_t headRepeats = totalV / epr; + int64_t tailElements = totalV % epr; + + if (headRepeats > 1 || tailElements > 0) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(headRepeats, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emit(rd); + b.create(loc); + b.setInsertionPointAfter(forOp); + if (tailElements > 0) { + Value offT = idxc(headRepeats * epr, loc, b); + Value td = addPtr(loc, b, dst, ptrTy, offT); + b.create(loc); + b.create(loc, i64c(tailElements, loc, b), i64c0(loc, b)); + emit(td); + b.create(loc); + } + return; + } + + b.create(loc); + b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); + emit(dst); + b.create(loc); + fullMask(loc, b); + } + template void modeNorm1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index df2291f898..91d234f816 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4821,7 +4821,7 @@ class LowerUBufScalarBinaryPattern final : public OpConversionPattern return rewriter.notifyMatchFailure( op, "unsupported element type for ubuf scalar mul op"); - // All four scalar-tile ops keep signed intrinsic names (s16/s32). + // Scalar-tile ops keep signed intrinsic names (s16/s32). std::string calleeName; if constexpr (std::is_same_v) calleeName = "llvm.hivm.VMULS." + elemFrag; @@ -4907,6 +4907,72 @@ class LowerUBufScalarBinaryPattern final : public OpConversionPattern LoweringState &state; }; +class LowerUBufVdupPattern final : public OpConversionPattern { +public: + explicit LowerUBufVdupPattern(TypeConverter &typeConverter, + MLIRContext *context, LoweringState &state) + : OpConversionPattern(typeConverter, context), state(state) {} + + LogicalResult + matchAndRewrite(pto::UBVdupOp op, pto::UBVdupOp::Adaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + auto ptrType = mlir::cast(op.getDst().getType()); + Type elemType = ptrType.getElementType(); + std::string suffix; + if (elemType.isF32() || elemType.isInteger(32)) + suffix = "u32"; + else if (elemType.isF16() || elemType.isInteger(16)) + suffix = "u16"; + else + return rewriter.notifyMatchFailure(op, "unsupported element type for ubuf vdup"); + + Value dst = adaptor.getDst(); + if (!dst || !isa(dst.getType())) + return rewriter.notifyMatchFailure(op, "unexpected converted ubuf vdup dst type"); + + Location loc = op.getLoc(); + auto i64Ty = rewriter.getI64Type(); + auto getI64 = [&](Value v) -> Value { return castIntegerLikeTo(op, v, i64Ty); }; + auto maskByte = [&](Value v) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(0xff))); + }; + auto shl = [&](Value v, uint64_t amount) -> Value { + return rewriter.create( + loc, v, rewriter.create( + loc, rewriter.getI64IntegerAttr(amount))); + }; + + Value config = rewriter.create( + loc, rewriter.getI64IntegerAttr(0)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getRepeat())), 56)); + config = rewriter.create( + loc, config, maskByte(getI64(adaptor.getDstBlockStride()))); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcBlockStride())), 16)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getDstRepeatStride())), 32)); + config = rewriter.create( + loc, config, shl(maskByte(getI64(adaptor.getSrcRepeatStride())), 40)); + + Value scalar = getI64(adaptor.getScalar()); + std::string calleeName = "llvm.hivm.MOVEV." + suffix; + auto funcType = rewriter.getFunctionType( + TypeRange{dst.getType(), i64Ty, i64Ty}, TypeRange{}); + rewriter.create(loc, calleeName, TypeRange{}, + ValueRange{dst, scalar, config}); + state.plannedDecls.push_back(PlannedDecl{calleeName, funcType}); + + rewriter.eraseOp(op); + return success(); + } + +private: + LoweringState &state; +}; + template class LowerUBufUnaryOpPattern final : public OpConversionPattern { public: @@ -10700,6 +10766,8 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add( + typeConverter, patterns.getContext(), state); patterns.add( typeConverter, patterns.getContext(), state); patterns.add( @@ -10845,6 +10913,7 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md index 2eb01fae8f..207708c98f 100644 --- a/ptodsl/tests/e2e/README.md +++ b/ptodsl/tests/e2e/README.md @@ -52,7 +52,7 @@ This can be selected with `--backend vpto --target a5`. | Ops | Dtypes | Shapes | Total | |-----|--------|--------|-------| -| abs, relu, neg, exp, sqrt, rsqrt | float32, float16 | 5 per dtype | 60 | +| abs, relu, neg, exp, sqrt, rsqrt, recip | float32, float16 | 5 per dtype | 70 | ### Scalar-tile elementwise @@ -65,9 +65,9 @@ This can be selected with `--backend vpto --target a5`. | Suite | Total | |-------|-------| | Binary, bitwise, and shifts | 192 | -| Unary | 60 | +| Unary | 70 | | Scalar-tile | 120 | -| Total | 372 | +| Total | 382 | ### Shape coverage (exercises lowering code paths) diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index e7461a2f01..7db50cfdce 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -47,9 +47,10 @@ "exp": (pto.tile.exp, lambda x: np.exp(x)), "sqrt": (pto.tile.sqrt, lambda x: np.sqrt(np.abs(x))), "rsqrt":(pto.tile.rsqrt,lambda x: 1.0 / np.sqrt(np.abs(x))), + "recip":(pto.tile.recip,lambda x: 1.0 / x), } -POSITIVE_INPUT_OPS = {"sqrt", "rsqrt"} +POSITIVE_INPUT_OPS = {"sqrt", "rsqrt", "recip"} SCALAR_OPS = { "adds": (pto.tile.adds, lambda x, s: x + s), diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto new file mode 100644 index 0000000000..59d6abec97 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto @@ -0,0 +1,25 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// trecip -> vector_dup(dst, 1) + vdiv(dst, dst, src), matching PTO-ISA TRECIP as TDIVS(dst, 1, src). +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_trecip() + func.func @lower_trecip() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: arith.constant 1.000000e+00 : f32 + // CHECK: pto.ub.vdup {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK: pto.barrier + // CHECK: pto.ub.vdiv {{%[^ ,]+}}, {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-NOT: pto.trecip + pto.trecip ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto new file mode 100644 index 0000000000..317fb0d507 --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vdup -> llvm.hivm.MOVEV.u32. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @vdup_llvm_mix_aiv( + func.func @vdup_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + %one = arith.constant 1065353216 : i64 + // CHECK: %[[PTR:.*]] = {{.*}} !llvm.ptr<6> + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + // CHECK: llvm.call @llvm.hivm.MOVEV.u32(%[[PTR]], %{{.*}}, %{{.*}}) : (!llvm.ptr<6>, i64, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vdup %ptr, %one, %c1, %c1, %c1, %c8, %c0 : + !pto.ptr, i64, i64, i64, i64, i64, i64 + return + } +} From 382bb92396e55cce3c678a9993a7a24c7cf9885c Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Tue, 7 Jul 2026 09:26:16 +0200 Subject: [PATCH 19/29] tlog --- docs/designs/a2a3-vpto-elementwise-impl.md | 9 ++++--- include/PTO/IR/VPTOUbOps.td | 1 + lib/PTO/IR/VPTO.cpp | 1 + lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 19 ++++++++++++++ lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 5 ++++ ptodsl/tests/e2e/README.md | 6 ++--- ptodsl/tests/e2e/common.py | 3 ++- .../vpto/ub/tile_to_ub/elementwise/tlog.pto | 23 ++++++++++++++++ .../vpto/ub/ub_to_llvm/elementwise/vln.pto | 26 +++++++++++++++++++ 9 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto create mode 100644 test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto diff --git a/docs/designs/a2a3-vpto-elementwise-impl.md b/docs/designs/a2a3-vpto-elementwise-impl.md index 6437dcef1e..d708c65376 100644 --- a/docs/designs/a2a3-vpto-elementwise-impl.md +++ b/docs/designs/a2a3-vpto-elementwise-impl.md @@ -29,6 +29,7 @@ | `tabs` | `ub.vabs` | `VABS.f32/f16/s16` | f32, f16 | Done | | `trelu` | `ub.vrelu` | `VRELU.f32/f16/s32` | f32, f16 | Done | | `texp` | `ub.vexp` | `VEXP.f32/f16` | f32, f16 | Done | +| `tlog` | `ub.vln` | `VLN.f32/f16` | f32, f16 | Done | | `tsqrt` | `ub.vsqrt` | `VSQRT.f32/f16` | f32, f16 | Done | | `trsqrt`| `ub.vrsqrt`| `VRSQRT.f32/f16` | f32, f16 | Done (fast-approx) | | `tnot` | `ub.vnot` | `VNOT.s16/u16` | i16 | Done | @@ -71,7 +72,7 @@ 63:56 simd flag (=1) ``` -### Unary Config (VABS/VRELU/VNOT/VEXP/VSQRT/VRSQRT) +### Unary Config (VABS/VRELU/VNOT/VEXP/VLN/VSQRT/VRSQRT) ``` 15:0 dst block stride @@ -173,11 +174,11 @@ See `docs/designs/a2a3-allocator.md` for details. ## Test Counts -- **58 UB lit tests** (tile-to-UB IR checks + UB-to-LLVM checks + round-trip + planned-address) +- **60 UB lit tests** (tile-to-UB IR checks + UB-to-LLVM checks + round-trip + planned-address) - **192 binary e2e** (f32/f16/i16 binary + bitwise + shift across dispatch-shape matrix, including `taddrelu`) -- **70 unary e2e** (abs/relu/neg/exp/sqrt/rsqrt/recip across 5 shapes × 2 dtypes) +- **80 unary e2e** (abs/relu/neg/exp/log/sqrt/rsqrt/recip across 5 shapes × 2 dtypes) - **120 scalar binary e2e** (adds/muls/maxs/mins across 5 shapes × 3 scalars × 2 dtypes) -- **Total confirmed elementwise hardware e2e tests: 382** +- **Total confirmed elementwise hardware e2e tests: 392** The PTODSL hardware e2e suite runs the A3 target by default. A2 and A3 share the VPTO lowering pipeline, so this validates the A2/A3 lowering path unless diff --git a/include/PTO/IR/VPTOUbOps.td b/include/PTO/IR/VPTOUbOps.td index 285a85c6b9..6de0c51273 100644 --- a/include/PTO/IR/VPTOUbOps.td +++ b/include/PTO/IR/VPTOUbOps.td @@ -111,6 +111,7 @@ def PTO_UBVnotOp : PTO_UBufUnaryOp<"ub.vnot">; def PTO_UBVabsOp : PTO_UBufUnaryOp<"ub.vabs">; def PTO_UBVreluOp : PTO_UBufUnaryOp<"ub.vrelu">; def PTO_UBVexpOp : PTO_UBufUnaryOp<"ub.vexp">; +def PTO_UBVlnOp : PTO_UBufUnaryOp<"ub.vln">; def PTO_UBVsqrtOp : PTO_UBufUnaryOp<"ub.vsqrt">; def PTO_UBVrsqrtOp : PTO_UBufUnaryOp<"ub.vrsqrt">; diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index 269143684a..d1842753ff 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8108,6 +8108,7 @@ LogicalResult UBVreluOp::verify() { } PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVexpOp) +PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVlnOp) PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVsqrtOp) PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVrsqrtOp) diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 76d6eaf8bc..773409081b 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -600,6 +600,25 @@ struct LowerPTOToUBufOpsPass } } + // ---- tlog → pto.ub.vln ---- + { + SmallVector ops; + func.walk([&](pto::TLogOp op) { ops.push_back(op); }); + for (auto op : ops) { + auto info = extractTileShapeInfoFromValue(op.getDst(), tileShapes); + if (!info) + continue; + auto [dstPtr, srcPtr, ptrType] = + lowerShiftOpCommon(builder, ctx, op, op.getDst(), op.getSrc(), + tileShapes); + if (!dstPtr) + continue; + dispatchUnary(op.getLoc(), builder, dstPtr, srcPtr, + ptrType, *info); + op.erase(); + } + } + // ---- tsqrt → pto.ub.vsqrt ---- { SmallVector ops; diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 91d234f816..5382fec452 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -5005,6 +5005,8 @@ class LowerUBufUnaryOpPattern final : public OpConversionPattern { calleeName = "llvm.hivm.VRELU." + elemFrag; } else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VEXP." + elemFrag; + else if constexpr (std::is_same_v) + calleeName = "llvm.hivm.VLN." + elemFrag; else if constexpr (std::is_same_v) calleeName = "llvm.hivm.VSQRT." + elemFrag; else if constexpr (std::is_same_v) @@ -10750,6 +10752,8 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); + patterns.add>( + typeConverter, patterns.getContext(), state); patterns.add>( typeConverter, patterns.getContext(), state); patterns.add>( @@ -10905,6 +10909,7 @@ static void configureVPTOOpLoweringTarget(ConversionTarget &target, target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); target.addIllegalOp(); diff --git a/ptodsl/tests/e2e/README.md b/ptodsl/tests/e2e/README.md index 207708c98f..faf6025411 100644 --- a/ptodsl/tests/e2e/README.md +++ b/ptodsl/tests/e2e/README.md @@ -52,7 +52,7 @@ This can be selected with `--backend vpto --target a5`. | Ops | Dtypes | Shapes | Total | |-----|--------|--------|-------| -| abs, relu, neg, exp, sqrt, rsqrt, recip | float32, float16 | 5 per dtype | 70 | +| abs, relu, neg, exp, log, sqrt, rsqrt, recip | float32, float16 | 5 per dtype | 80 | ### Scalar-tile elementwise @@ -65,9 +65,9 @@ This can be selected with `--backend vpto --target a5`. | Suite | Total | |-------|-------| | Binary, bitwise, and shifts | 192 | -| Unary | 70 | +| Unary | 80 | | Scalar-tile | 120 | -| Total | 382 | +| Total | 392 | ### Shape coverage (exercises lowering code paths) diff --git a/ptodsl/tests/e2e/common.py b/ptodsl/tests/e2e/common.py index 7db50cfdce..7db6c9bf10 100644 --- a/ptodsl/tests/e2e/common.py +++ b/ptodsl/tests/e2e/common.py @@ -45,12 +45,13 @@ "relu": (pto.tile.relu, lambda x: np.maximum(x, 0)), "neg": (pto.tile.neg, lambda x: np.negative(x)), "exp": (pto.tile.exp, lambda x: np.exp(x)), + "log": (pto.tile.log, lambda x: np.log(x)), "sqrt": (pto.tile.sqrt, lambda x: np.sqrt(np.abs(x))), "rsqrt":(pto.tile.rsqrt,lambda x: 1.0 / np.sqrt(np.abs(x))), "recip":(pto.tile.recip,lambda x: 1.0 / x), } -POSITIVE_INPUT_OPS = {"sqrt", "rsqrt", "recip"} +POSITIVE_INPUT_OPS = {"log", "sqrt", "rsqrt", "recip"} SCALAR_OPS = { "adds": (pto.tile.adds, lambda x, s: x + s), diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto new file mode 100644 index 0000000000..b6aca160dc --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root repository for the full text of the License. + +// tlog -> pto.ub.vln lowering, matching A2/A3 TLOG_IMPL through vln. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tlog() + func.func @lower_tlog() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vln {{%[^ ,]+}}, {{%[^ ,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + // CHECK-NOT: pto.tlog + pto.tlog ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto new file mode 100644 index 0000000000..7cc249dcae --- /dev/null +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto @@ -0,0 +1,26 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// pto.ub.vln -> llvm.hivm.VLN.f32. +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: llvm.func @vln_llvm_mix_aiv( + func.func @vln_llvm() attributes {pto.aicore} { + %c0 = arith.constant 0 : i64 + %c1 = arith.constant 1 : i64 + %c8 = arith.constant 8 : i64 + // CHECK: %[[PTR:.*]] = {{.*}} !llvm.ptr<6> + %ptr = pto.castptr %c0 : i64 -> !pto.ptr + // CHECK: llvm.call @llvm.hivm.VLN.f32(%[[PTR]], %[[PTR]], %[[CFG:.*]]) : (!llvm.ptr<6>, !llvm.ptr<6>, i64) -> () + // CHECK-NOT: pto.ub. + pto.ub.vln %ptr, %ptr, %c1, %c1, %c1, %c8, %c8 : + !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 + return + } +} From 7ba6761bd1c221ab3ebb0585e8d0039108457ca6 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Tue, 7 Jul 2026 13:18:36 +0200 Subject: [PATCH 20/29] address review --- lib/PTO/IR/VPTO.cpp | 16 +-- lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 103 ++++++++++-------- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 7 +- .../ub/tile_to_ub/elementwise/tadd_a2.pto | 23 ++++ tools/ptoas/driver.cpp | 6 +- tools/ptoas/ptoas.cpp | 39 ++++--- 6 files changed, 119 insertions(+), 75 deletions(-) create mode 100644 test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto diff --git a/lib/PTO/IR/VPTO.cpp b/lib/PTO/IR/VPTO.cpp index b3dcc02599..0403b7e27e 100644 --- a/lib/PTO/IR/VPTO.cpp +++ b/lib/PTO/IR/VPTO.cpp @@ -8097,7 +8097,7 @@ LogicalResult UBVreluOp::verify() { return success(); } -#define PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(OpName) \ +#define PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(OpName) \ void OpName::getEffects( \ SmallVectorImpl> \ &effects) { \ @@ -8114,14 +8114,14 @@ LogicalResult UBVreluOp::verify() { return success(); \ } -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVexpOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVlnOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVsqrtOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVrsqrtOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVexpOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVlnOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVsqrtOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVrsqrtOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVaddSOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVmaxSOp) -PTO_DEFINE_UB_UNARY_VERITY_AND_EFFECTS(UBVminSOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVaddSOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVmaxSOp) +PTO_DEFINE_UB_UNARY_VERIFY_AND_EFFECTS(UBVminSOp) void UBVdupOp::getEffects( SmallVectorImpl> diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 773409081b..6faaa5a6bf 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -219,13 +219,14 @@ struct LowerPTOToUBufOpsPass if (!mod) return; auto archAttr = mod->getAttrOfType("pto.target_arch"); - if (!archAttr || archAttr.getValue() != "a3") + if (!archAttr || + (archAttr.getValue() != "a2" && archAttr.getValue() != "a3")) return; MLIRContext *ctx = &getContext(); OpBuilder builder(ctx); - // A3: consume planned addresses from PTOPlanMemory / PTOMaterializeTileHandles. + // A2/A3: consume planned addresses from PTOPlanMemory / PTOMaterializeTileHandles. // Each alloc_tile must carry a planned addr operand. DenseMap> tileShapes; { @@ -949,18 +950,20 @@ struct LowerPTOToUBufOpsPass }; if (headRepeats > 1 || tailElements > 0) { - auto forOp = b.create(loc, idxc0(loc, b), + if (headRepeats > 0) { + auto forOp = b.create(loc, idxc0(loc, b), idxc(headRepeats, loc, b), idxc1(loc, b)); - b.setInsertionPointToStart(forOp.getBody()); - Value iv = forOp.getInductionVar(); - Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); - Value rd = addPtr(loc, b, dst, ptrTy, off); - Value r0 = addPtr(loc, b, src, ptrTy, off); - b.create(loc); - b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); - emitShift(rd, r0); - b.create(loc); - b.setInsertionPointAfter(forOp); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, src, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emitShift(rd, r0); + b.create(loc); + b.setInsertionPointAfter(forOp); + } if (tailElements > 0) { Value offT = idxc(headRepeats * epr, loc, b); Value td = addPtr(loc, b, dst, ptrTy, offT); @@ -994,18 +997,20 @@ struct LowerPTOToUBufOpsPass int64_t tailElements = totalV % epr; if (headRepeats > 1 || tailElements > 0) { - auto forOp = b.create(loc, idxc0(loc, b), + if (headRepeats > 0) { + auto forOp = b.create(loc, idxc0(loc, b), idxc(headRepeats, loc, b), idxc1(loc, b)); - b.setInsertionPointToStart(forOp.getBody()); - Value iv = forOp.getInductionVar(); - Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); - Value rd = addPtr(loc, b, dst, ptrTy, off); - Value rs = addPtr(loc, b, src, ptrTy, off); - b.create(loc); - b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); - emit(rd, rs); - b.create(loc); - b.setInsertionPointAfter(forOp); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value rs = addPtr(loc, b, src, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emit(rd, rs); + b.create(loc); + b.setInsertionPointAfter(forOp); + } if (tailElements > 0) { Value offT = idxc(headRepeats * epr, loc, b); Value td = addPtr(loc, b, dst, ptrTy, offT); @@ -1042,17 +1047,19 @@ struct LowerPTOToUBufOpsPass int64_t tailElements = totalV % epr; if (headRepeats > 1 || tailElements > 0) { - auto forOp = b.create(loc, idxc0(loc, b), - idxc(headRepeats, loc, b), idxc1(loc, b)); - b.setInsertionPointToStart(forOp.getBody()); - Value iv = forOp.getInductionVar(); - Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); - Value rd = addPtr(loc, b, dst, ptrTy, off); - b.create(loc); - b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); - emit(rd); - b.create(loc); - b.setInsertionPointAfter(forOp); + if (headRepeats > 0) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(headRepeats, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emit(rd); + b.create(loc); + b.setInsertionPointAfter(forOp); + } if (tailElements > 0) { Value offT = idxc(headRepeats * epr, loc, b); Value td = addPtr(loc, b, dst, ptrTy, offT); @@ -1080,19 +1087,21 @@ struct LowerPTOToUBufOpsPass int64_t tailElements = totalV % epr; if (headRepeats > 1 || tailElements > 0) { - auto forOp = b.create(loc, idxc0(loc, b), + if (headRepeats > 0) { + auto forOp = b.create(loc, idxc0(loc, b), idxc(headRepeats, loc, b), idxc1(loc, b)); - b.setInsertionPointToStart(forOp.getBody()); - Value iv = forOp.getInductionVar(); - Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); - Value rd = addPtr(loc, b, dst, ptrTy, off); - Value r0 = addPtr(loc, b, s0, ptrTy, off); - Value r1 = addPtr(loc, b, s1, ptrTy, off); - b.create(loc); - b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); - emitUBBinOp(loc, b, rd, r0, r1, i64c1(loc, b), i64c8(loc, b)); - b.create(loc); - b.setInsertionPointAfter(forOp); + b.setInsertionPointToStart(forOp.getBody()); + Value iv = forOp.getInductionVar(); + Value off = b.create(loc, iv, idxc(epr, loc, b)).getResult(); + Value rd = addPtr(loc, b, dst, ptrTy, off); + Value r0 = addPtr(loc, b, s0, ptrTy, off); + Value r1 = addPtr(loc, b, s1, ptrTy, off); + b.create(loc); + b.create(loc, i64c(epr, loc, b), i64c0(loc, b)); + emitUBBinOp(loc, b, rd, r0, r1, i64c1(loc, b), i64c8(loc, b)); + b.create(loc); + b.setInsertionPointAfter(forOp); + } if (tailElements > 0) { Value offT = idxc(headRepeats * epr, loc, b); Value td = addPtr(loc, b, dst, ptrTy, offT); diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index d8b86d508b..0c38c8a55a 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -4602,8 +4602,9 @@ class LowerCopyOpPattern final : public OpConversionPattern { if (!llvmSourceType || !llvmDestType) return rewriter.notifyMatchFailure(op, "expected LLVM pointer copy operands"); - bool useA3NonPadded = (march == "dav-c220-vec") && isGmUb && !hasPadding; - bool useA3UbGm = (march == "dav-c220-vec") && !isGmUb; + bool isC220 = march == "dav-c220-vec" || march == "dav-c220-cube"; + bool useA3NonPadded = isC220 && isGmUb && !hasPadding; + bool useA3UbGm = isC220 && !isGmUb; bool useSingleConfig = useA3NonPadded || useA3UbGm; FailureOr config0 = failure(); @@ -11064,7 +11065,7 @@ static LogicalResult lowerVPTOTypes(ModuleOp module, llvm::raw_ostream &diagOS) LoweringState state; target.addLegalOp(); - target.addLegalOp();([&](func::FuncOp op) { + target.addDynamicallyLegalOp([&](func::FuncOp op) { return typeConverter.isSignatureLegal(op.getFunctionType()) && typeConverter.isLegal(&op.getBody()); }); diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto new file mode 100644 index 0000000000..80871ff656 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto @@ -0,0 +1,23 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ptoas --pto-arch=a2 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a2", pto.kernel_kind = #pto.kernel_kind} { + // CHECK-LABEL: func.func @lower_tadd_a2() + func.func @lower_tadd_a2() attributes {pto.aicore} { + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + // CHECK-NOT: pto.tadd + return + } +} diff --git a/tools/ptoas/driver.cpp b/tools/ptoas/driver.cpp index 658ba24aef..5380e03b68 100644 --- a/tools/ptoas/driver.cpp +++ b/tools/ptoas/driver.cpp @@ -105,7 +105,7 @@ static std::string normalizePTOASArch(llvm::StringRef archValue) { } static bool isSupportedPTOASArch(llvm::StringRef archValue) { - return archValue == "a3" || archValue == "a5"; + return archValue == "a2" || archValue == "a3" || archValue == "a5"; } static std::optional @@ -138,7 +138,7 @@ static bool resolveTextInputArch(llvm::StringRef buffer, bool cliArchSpecified, if (cliArchSpecified) { if (!isSupportedPTOASArch(arch)) { llvm::errs() << "Error: invalid --pto-arch='" << mlir::pto::ptoTargetArch - << "'. Expected 'a3' or 'a5'.\n"; + << "'. Expected 'a2', 'a3', or 'a5'.\n"; return false; } return true; @@ -217,7 +217,7 @@ loadInputModule(std::unique_ptr inputBuffer, arch = normalizePTOASArch(mlir::pto::ptoTargetArch); if (cliArchSpecified && !isSupportedPTOASArch(arch)) { llvm::errs() << "Error: invalid --pto-arch='" << mlir::pto::ptoTargetArch - << "'. Expected 'a3' or 'a5'.\n"; + << "'. Expected 'a2', 'a3', or 'a5'.\n"; return {}; } module = decodePTOBCModule(buffer, context); diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index 68485fe658..fd266670be 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -94,6 +94,18 @@ constexpr size_t kMarkerRewriteTernaryArgCount = 3; using StringRefVector = llvm::SmallVector; +static std::string normalizeArch(llvm::StringRef arch) { + std::string normalized = arch.str(); + for (char &c : normalized) + c = static_cast(std::tolower(static_cast(c))); + return normalized; +} + +static bool isA2A3Arch(llvm::StringRef arch) { + std::string normalized = normalizeArch(arch); + return normalized == "a2" || normalized == "a3"; +} + } // namespace int main(int argc, char **argv); @@ -468,8 +480,8 @@ llvm::cl::opt mlir::pto::emitMlirIR( llvm::cl::opt mlir::pto::ptoTargetArch( "pto-arch", - llvm::cl::desc("Target Ascend architecture for codegen: a3 or a5 (default: a3)"), - llvm::cl::value_desc("a3|a5"), + llvm::cl::desc("Target Ascend architecture for codegen: a2, a3, or a5 (default: a3)"), + llvm::cl::value_desc("a2|a3|a5"), llvm::cl::init("a3")); static llvm::cl::opt ptoBuildLevel( @@ -2546,13 +2558,13 @@ static void lowerPTOToVPTOBackend(PassManager &pm, ModuleOp module, int argc, auto &kernelModulePM = pm.nest(); auto moduleArchAttr = module->getAttrOfType("pto.target_arch"); - const bool isA3 = moduleArchAttr && moduleArchAttr.getValue() == "a3"; + const bool isA2A3 = moduleArchAttr && isA2A3Arch(moduleArchAttr.getValue()); const bool enableA5VPTOPostLoweringFusionLifecycle = enableOpFusion && moduleArchAttr && moduleArchAttr.getValue() == "a5"; kernelModulePM.addNestedPass( pto::createLowerPTOToUBufOpsPass()); - if (isA3) + if (isA2A3) return; pto::ExpandTileOpOptions expandOpts = resolveExpandTileOpOptions(argc, argv); @@ -2585,10 +2597,8 @@ buildVPTOEmissionOptions(const pto::CANNVersion &cannVersion) { options.dumpVPTOIR = false; options.targetTriple = "hiipu64-hisilicon-cce"; options.cannVersion = cannVersion; - std::string arch = ptoTargetArch; - for (char &c : arch) - c = static_cast(std::tolower(static_cast(c))); - options.march = (arch == "a3") ? "dav-c220-vec" : "dav-c310-vec"; + std::string arch = normalizeArch(ptoTargetArch); + options.march = isA2A3Arch(arch) ? "dav-c220-vec" : "dav-c310-vec"; return options; } @@ -2908,13 +2918,14 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass(pto::createLoweringSyncToPipePass()); if (!disableInferLayout) pm.addNestedPass(pto::createInferPTOLayoutPass()); - // Local tile planning path. A5/non-A3 already use this path. A3 VPTO also + // Local tile planning path. A5 already uses this path. A2/A3 VPTO also // enters it so UB tile addresses come from PTOPlanMemory instead of the // fallback allocator in LowerPTOToUBufOps. + const bool isA2A3 = isA2A3Arch(ptoTargetArch); const bool enableLocalTilePlanning = - ptoTargetArch != "a3" || effectiveBackend == PTOBackend::VPTO; + !isA2A3 || effectiveBackend == PTOBackend::VPTO; if (enableLocalTilePlanning) { - if (ptoTargetArch != "a3") + if (!isA2A3) pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); pm.addNestedPass( pto::createPTOValidateIntToPtrUsesPass()); @@ -2929,12 +2940,12 @@ int mlir::pto::compilePTOASModule( // so it takes no option here. pto::FusionPlanOptions fusionPlanOpts; fusionPlanOpts.enableShapeInference = enableShapeInference; - if (ptoTargetArch != "a3" && enableA5EmitCFusionPath) { + if (!isA2A3 && enableA5EmitCFusionPath) { pm.addNestedPass( pto::createFusionPlanPass(fusionPlanOpts)); pm.addNestedPass(pto::createOpSchedulingPass()); pm.addNestedPass(pto::createPTOMarkLastUsePass()); - } else if (ptoTargetArch != "a3" && enableA5VPTOFusionPath) { + } else if (!isA2A3 && enableA5VPTOFusionPath) { pm.addNestedPass( pto::createFusionPlanPass(fusionPlanOpts)); pm.addNestedPass(pto::createOpSchedulingPass()); @@ -3048,7 +3059,7 @@ int mlir::pto::compilePTOASModule( PassManager emitcPM(module->getContext()); emitcPM.enableVerifier(); - if (arch == "a3") { + if (isA2A3Arch(arch)) { emitcPM.addPass(pto::createEmitPTOManualPass(pto::PTOArch::A3)); } else { emitcPM.addPass(pto::createEmitPTOManualPass(pto::PTOArch::A5)); From 44bc1c6ec9a4ae80527320f2b8a5bbb964af8205 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 8 Jul 2026 10:48:47 +0200 Subject: [PATCH 21/29] fix a2a3 review and CI issues --- docker/Dockerfile | 2 +- docker/Dockerfile.dev | 2 +- .../a2a3-vpto-elementwise-pr-summary.md | 35 +++++++++++++++++++ lib/PTO/IR/PTO.cpp | 22 +++++++----- lib/PTO/Transforms/VPTOLLVMEmitter.cpp | 22 ++++-------- .../docs/user_guide/08-compute-operations.md | 6 +++- ptodsl/examples/bop_launch_a3.py | 13 ------- ptodsl/ptodsl/_ops.py | 23 ++++++++++++ ptodsl/tests/__init__.py | 7 ++++ ptodsl/tests/e2e/__init__.py | 7 ++++ ptodsl/tests/e2e/test_scalar_elementwise.py | 4 +-- ptodsl/tests/e2e/test_unary_elementwise.py | 4 +-- ptodsl/tests/test_jit_diagnostics.py | 16 +++++++++ test/lit/pto/taddrelu_a5_invalid.pto | 21 +++++++++++ tools/ptoas/ptoas.cpp | 19 ++++++---- 15 files changed, 152 insertions(+), 51 deletions(-) create mode 100644 docs/designs/a2a3-vpto-elementwise-pr-summary.md create mode 100644 test/lit/pto/taddrelu_a5_invalid.pto diff --git a/docker/Dockerfile b/docker/Dockerfile index 75162952bc..241bc69f95 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -169,7 +169,7 @@ RUN bisheng $BISHENG_OPTS ./tmatmulk.cpp -o ./matmul_kernel.so # add torch_npu to faciliate on-device testing during `docker run` (not used at build stage) # for available versions see https://pypi.org/project/torch-npu/#history RUN pip install --no-cache-dir torch==2.9.0 --index-url https://download.pytorch.org/whl/cpu \ - && pip install --no-cache-dir torch-npu==2.9.0 \ + && pip install --no-cache-dir torch-npu==2.9.0.post2 \ && pip install --no-cache-dir numpy pyyaml WORKDIR /sources/test/ diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 65a80fbbc0..193815e853 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -68,7 +68,7 @@ RUN git clone "${PTO_ISA_REPO}" "${PTO_LIB_PATH}" \ # 5. Torch + torch-npu (for on-device kernel launch) # ========================================================================= RUN pip install --no-cache-dir torch==2.9.0 --index-url https://download.pytorch.org/whl/cpu \ - && pip install --no-cache-dir torch-npu==2.9.0 + && pip install --no-cache-dir torch-npu==2.9.0.post2 # ========================================================================= # 6. Environment diff --git a/docs/designs/a2a3-vpto-elementwise-pr-summary.md b/docs/designs/a2a3-vpto-elementwise-pr-summary.md new file mode 100644 index 0000000000..5f85254e76 --- /dev/null +++ b/docs/designs/a2a3-vpto-elementwise-pr-summary.md @@ -0,0 +1,35 @@ +# A2/A3 VPTO Elementwise PR Summary + +## Summary + +This branch adds the A2/A3 VPTO UB lowering path for tile elementwise operations and validates it end-to-end on A3 hardware. The implementation routes A2/A3 through the planned-memory UB pipeline instead of the old/manual allocation path, lowers supported PTO tile ops to VPTO UB ops, and emits CANN900 LLVM intrinsics. + +## What Changed + +- Added the A2/A3 VPTO UB lowering pipeline: + `PTOViewToMemref -> PTOPlanMemory -> PTOResolveReservedBuffers -> PTOMaterializeTileHandles -> LowerPTOToUBufOps`. +- Implemented A2/A3 UB lowering for binary elementwise ops: + `tadd`, `tsub`, `tmul`, `tdiv`, `tmax`, `tmin`, `tand`, `tor`, `txor`, `tshls`, and `tshrs`. +- Implemented unary elementwise ops: + `tabs`, `trelu`, `tneg`, `texp`, `tlog`, `tsqrt`, `trsqrt`, and `trecip`. +- Implemented scalar-tile elementwise ops: + `tadds`, `tmuls`, `tmaxs`, and `tmins`. +- Added fused elementwise support for `taddrelu`, including PTO IR, UB IR, lowering, LLVM intrinsic emission, PTODSL wrappers, and tests. +- Added UB/LLVM support for new VPTO UB ops and intrinsics, including `vaddrelu`, `vdup`, and `vln`. +- Integrated planned UB address allocation so UB lowering consumes planner-assigned `alloc_tile addr` values and models scratch usage for ops such as `txor`. +- Extended dispatch coverage for small, normal, count, row-repeat, tail, chunked, and multi-row shapes. +- Extended the PTODSL elementwise surface through helpers and `pto.tile.*` APIs. +- Added lit and hardware e2e coverage for binary, unary, scalar, bitwise, shift, fused, log, and reciprocal cases. + +## Validation + +Verified after merging current `main` with the LLVM 21 docker image: + +- Build: passed +- VPTO UB lit: `61/61` +- Runtime toolchain pytest: `4/4` +- A3 unary hardware e2e: `80/80` +- A3 binary hardware e2e: `192/192` +- A3 scalar hardware e2e: `120/120` + +Total A2/A3 shared VPTO elementwise hardware coverage validated on A3: `392` tests. diff --git a/lib/PTO/IR/PTO.cpp b/lib/PTO/IR/PTO.cpp index 3cf69e7a5e..eb583c56c2 100644 --- a/lib/PTO/IR/PTO.cpp +++ b/lib/PTO/IR/PTO.cpp @@ -5316,14 +5316,20 @@ LogicalResult pto::TAddOp::verify() { LogicalResult pto::TAddReluOp::verify() { if (shouldBypassDecodedMemrefVerifier(getOperation())) return success(); - FailureOr elemOr = verifyMatchingRowMajorBinaryTileOpCommon( - getOperation(), getSrc0().getType(), getSrc1().getType(), getDst().getType()); - if (failed(elemOr)) - return failure(); - Type elemTy = *elemOr; - if (elemTy.isInteger(16) || elemTy.isF16() || elemTy.isF32()) - return success(); - return emitOpError("expects element type to be i16/f16/f32"); + auto verifyA2A3 = [&]() -> LogicalResult { + FailureOr elemOr = verifyMatchingRowMajorBinaryTileOpCommon( + getOperation(), getSrc0().getType(), getSrc1().getType(), getDst().getType()); + if (failed(elemOr)) + return failure(); + Type elemTy = *elemOr; + if (elemTy.isInteger(16) || elemTy.isF16() || elemTy.isF32()) + return success(); + return emitOpError("expects element type to be i16/f16/f32"); + }; + auto verifyA5 = [&]() -> LogicalResult { + return emitOpError("taddrelu is only supported on A2/A3 targets"); + }; + return dispatchVerifierByArch(getOperation(), verifyA2A3, verifyA5); } LogicalResult pto::TAddCOp::verify() { diff --git a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp index 0c38c8a55a..36d8a78b57 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitter.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitter.cpp @@ -5147,10 +5147,8 @@ class LowerUBSetMaskCountOpPattern final : public OpConversionPattern { public: explicit LowerUBSetMaskCountOpPattern(TypeConverter &typeConverter, - MLIRContext *context, - LoweringState &state) - : OpConversionPattern(typeConverter, context), - state(state) {} + MLIRContext *context) + : OpConversionPattern(typeConverter, context) {} LogicalResult matchAndRewrite(pto::UBSetMaskCountOp op, @@ -5168,19 +5166,14 @@ class LowerUBSetMaskCountOpPattern final rewriter.eraseOp(op); return success(); } - -private: - LoweringState &state; }; class LowerUBSetMaskNormOpPattern final : public OpConversionPattern { public: explicit LowerUBSetMaskNormOpPattern(TypeConverter &typeConverter, - MLIRContext *context, - LoweringState &state) - : OpConversionPattern(typeConverter, context), - state(state) {} + MLIRContext *context) + : OpConversionPattern(typeConverter, context) {} LogicalResult matchAndRewrite(pto::UBSetMaskNormOp op, @@ -5198,9 +5191,6 @@ class LowerUBSetMaskNormOpPattern final rewriter.eraseOp(op); return success(); } - -private: - LoweringState &state; }; class LowerCopyUbufToUbufOpPattern final @@ -10851,9 +10841,9 @@ static void populateVPTOOpLoweringPatterns(VPTOTypeConverter &typeConverter, patterns.add( typeConverter, patterns.getContext(), state); patterns.add( - typeConverter, patterns.getContext(), state); + typeConverter, patterns.getContext()); patterns.add( - typeConverter, patterns.getContext(), state); + typeConverter, patterns.getContext()); } } diff --git a/ptodsl/docs/user_guide/08-compute-operations.md b/ptodsl/docs/user_guide/08-compute-operations.md index ac4e32a3a9..967d211bb9 100644 --- a/ptodsl/docs/user_guide/08-compute-operations.md +++ b/ptodsl/docs/user_guide/08-compute-operations.md @@ -15,8 +15,12 @@ Element-wise operations between two tiles of the same shape. #### `pto.tile.mul(src0: Tile, src1: Tile, dst: Tile) -> None` #### `pto.tile.max(src0: Tile, src1: Tile, dst: Tile) -> None` #### `pto.tile.min(src0: Tile, src1: Tile, dst: Tile) -> None` +#### `pto.tile.addrelu(src0: Tile, src1: Tile, dst: Tile) -> None` **Description**: Element-wise `dst[i,j] = src0[i,j] src1[i,j]`. +For `addrelu`, `dst[i,j] = max(0, src0[i,j] + src1[i,j])`. +`addrelu` maps to the fused C220 `VADDRELU` path and is supported only for +A2/A3 VPTO kernels with `f32`, `f16`, or `i16` tile elements. **Parameters**: @@ -1232,7 +1236,7 @@ pto.tile.gemv_mx_bias(lhs_l0a_mx, lhs_scale, rhs_l0b_mx, rhs_scale, bias_tile, a | Category | Operations | |----------|------------| -| Binary tile-tile | `tile.add`, `tile.sub`, `tile.mul`, `tile.div`, `tile.max`, `tile.min` | +| Binary tile-tile | `tile.add`, `tile.sub`, `tile.mul`, `tile.div`, `tile.max`, `tile.min`, `tile.addrelu` | | Tile-scalar | `tile.adds`, `tile.subs`, `tile.muls`, `tile.divs`, `tile.maxs`, `tile.mins` | | Unary math | `tile.exp`, `tile.log`, `tile.sqrt`, `tile.rsqrt`, `tile.recip`, `tile.abs`, `tile.neg` | | Activation | `tile.relu`, `tile.lrelu` | diff --git a/ptodsl/examples/bop_launch_a3.py b/ptodsl/examples/bop_launch_a3.py index 94dcbff821..c658516826 100644 --- a/ptodsl/examples/bop_launch_a3.py +++ b/ptodsl/examples/bop_launch_a3.py @@ -15,22 +15,9 @@ import argparse import time -from pathlib import Path -import sys import numpy as np -if __package__ in {None, ""}: - here = Path(__file__).resolve() - for candidate in here.parents: - if (candidate / "ptodsl" / "__init__.py").exists(): - sys.path.insert(0, str(candidate)) - break - else: - raise RuntimeError( - "Unable to locate the PTODSL Python package root from bop_launch.py" - ) - from ptodsl import pto _DEVICE = "npu:0" diff --git a/ptodsl/ptodsl/_ops.py b/ptodsl/ptodsl/_ops.py index 9432799147..652e7cc9df 100644 --- a/ptodsl/ptodsl/_ops.py +++ b/ptodsl/ptodsl/_ops.py @@ -158,6 +158,28 @@ def _require_explicit_mode(surface: str): raise explicit_mode_required_with_context_error(surface, current_module_spec) +def _current_target_arch(): + try: + from ._tracing.active import current_session + session = current_session() + except Exception: + return None + if session is None: + return None + current_module_spec = getattr(session, "current_function_module_spec", session.module_spec) + return getattr(current_module_spec, "target_arch", None) + + +def _require_target_arch(surface: str, allowed: set[str]): + target = _current_target_arch() + if target is None: + return + normalized = str(target).lower() + if normalized not in allowed: + expected = ", ".join(f"target='{name}'" for name in sorted(allowed)) + raise ValueError(f"{surface} is only supported for {expected}; got target={target!r}") + + def _explicit_mode_only(surface: str): def decorator(fn): @wraps(fn) @@ -2588,6 +2610,7 @@ def tadd(src0, src1, dst): def taddrelu(src0, src1, dst): """``pto.taddrelu ins(src0, src1) outs(dst)``.""" + _require_target_arch("pto.tile.addrelu", {"a2", "a3"}) _pto.taddrelu( unwrap_surface_value(src0), unwrap_surface_value(src1), diff --git a/ptodsl/tests/__init__.py b/ptodsl/tests/__init__.py index e69de29bb2..8433607418 100644 --- a/ptodsl/tests/__init__.py +++ b/ptodsl/tests/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. diff --git a/ptodsl/tests/e2e/__init__.py b/ptodsl/tests/e2e/__init__.py index e69de29bb2..8433607418 100644 --- a/ptodsl/tests/e2e/__init__.py +++ b/ptodsl/tests/e2e/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. diff --git a/ptodsl/tests/e2e/test_scalar_elementwise.py b/ptodsl/tests/e2e/test_scalar_elementwise.py index dc0d0325da..6075f5233e 100644 --- a/ptodsl/tests/e2e/test_scalar_elementwise.py +++ b/ptodsl/tests/e2e/test_scalar_elementwise.py @@ -2,9 +2,9 @@ # This program is free software, you can redistribute it and/or modify it under the terms and conditions of # CANN Open Software License Agreement Version 2.0 (the "License"). # Please refer to the License for details. You may not use this file except in compliance with the License. -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -# See LICENSE in the root repository for the full text of the License. +# See LICENSE in the root of the software repository for the full text of the License. """ e2e tests for A3 VPTO scalar-tile binary ops (tadds / tmuls / tmaxs / tmins). diff --git a/ptodsl/tests/e2e/test_unary_elementwise.py b/ptodsl/tests/e2e/test_unary_elementwise.py index 142a89350a..590b43ef47 100644 --- a/ptodsl/tests/e2e/test_unary_elementwise.py +++ b/ptodsl/tests/e2e/test_unary_elementwise.py @@ -2,9 +2,9 @@ # This program is free software, you can redistribute it and/or modify it under the terms and conditions of # CANN Open Software License Agreement Version 2.0 (the "License"). # Please refer to the License for details. You may not use this file except in compliance with the License. -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. -# See LICENSE in the root repository for the full text of the License. +# See LICENSE in the root of the software repository for the full text of the License. """ e2e tests for A3 VPTO unary elementwise ops (tabs / trelu). diff --git a/ptodsl/tests/test_jit_diagnostics.py b/ptodsl/tests/test_jit_diagnostics.py index a14d997815..171d719c6a 100644 --- a/ptodsl/tests/test_jit_diagnostics.py +++ b/ptodsl/tests/test_jit_diagnostics.py @@ -525,6 +525,14 @@ def unknown_branch_result_probe(): _ = br.other +@pto.jit(target="a5") +def taddrelu_a5_probe(): + lhs = pto.alloc_tile(shape=[1, 64], dtype=pto.f32) + rhs = pto.alloc_tile(shape=[1, 64], dtype=pto.f32) + dst = pto.alloc_tile(shape=[1, 64], dtype=pto.f32) + pto.tile.addrelu(lhs, rhs, dst) + + def main() -> None: expect_raises( native_python_if_runtime_const_probe.compile, @@ -1069,6 +1077,14 @@ def inline_count_mismatch(ptr: pto.ptr(pto.f32, "gm"), rows: pto.i32): AttributeError, "br.other was not assigned by this conditional", ) + expect_raises( + taddrelu_a5_probe.compile, + ValueError, + "pto.tile.addrelu", + "target='a2'", + "target='a3'", + "target='a5'", + ) expect_raises( lambda: inspect_host_tensor_metadata(MissingDTypeTensor()), TypeError, diff --git a/test/lit/pto/taddrelu_a5_invalid.pto b/test/lit/pto/taddrelu_a5_invalid.pto new file mode 100644 index 0000000000..d8e0081378 --- /dev/null +++ b/test/lit/pto/taddrelu_a5_invalid.pto @@ -0,0 +1,21 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: not ptoas --pto-arch=a5 %s 2>&1 | FileCheck %s + +module { + func.func @taddrelu_a5_invalid() { + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf + %dst = pto.alloc_tile : !pto.tile_buf + pto.taddrelu ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + return + } +} + +// CHECK: taddrelu is only supported on A2/A3 targets diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index fd266670be..84b89010dc 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -2918,18 +2918,21 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass(pto::createLoweringSyncToPipePass()); if (!disableInferLayout) pm.addNestedPass(pto::createInferPTOLayoutPass()); + // PTOViewToMemref is generic view lowering required by both backends; keep it + // outside the local-memory planning gate so default A2/A3 EmitC still lowers + // pto.make_tensor_view before backend legalization. + const bool isA2A3 = isA2A3Arch(ptoTargetArch); + if (!isA2A3) + pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); + pm.addNestedPass( + pto::createPTOValidateIntToPtrUsesPass()); + // Local tile planning path. A5 already uses this path. A2/A3 VPTO also // enters it so UB tile addresses come from PTOPlanMemory instead of the // fallback allocator in LowerPTOToUBufOps. - const bool isA2A3 = isA2A3Arch(ptoTargetArch); const bool enableLocalTilePlanning = !isA2A3 || effectiveBackend == PTOBackend::VPTO; if (enableLocalTilePlanning) { - if (!isA2A3) - pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); - pm.addNestedPass( - pto::createPTOValidateIntToPtrUsesPass()); - // Keep frontend fusion on tile-native PTO IR and annotate last_use directly // on scheduled block-local spans before the shared mainline lowers tiles. // The shape-inference switch drives FusionPlan only: that is where the @@ -2951,9 +2954,11 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass(pto::createOpSchedulingPass()); pm.addNestedPass(pto::createPTOFusionRegionGenPass()); } + } - pm.addPass(pto::createPTOViewToMemrefPass()); + pm.addPass(pto::createPTOViewToMemrefPass()); + if (enableLocalTilePlanning) { if (effectiveLevel != PTOBuildLevel::Level3) { PlanMemoryOptions planMemoryOption; planMemoryOption.memMode = MemPlanMode::LOCAL_MEM_PLAN; From 616d7fb3ef5e60b5b1fedf12f7bd92d4195c3887 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 8 Jul 2026 13:01:23 +0200 Subject: [PATCH 22/29] fix ptoas target arch resolution --- tools/ptoas/ptoas.cpp | 89 +++++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index 84b89010dc..393017b982 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -106,6 +106,47 @@ static bool isA2A3Arch(llvm::StringRef arch) { return normalized == "a2" || normalized == "a3"; } +static bool isSupportedPTOASTargetArch(llvm::StringRef arch) { + std::string normalized = normalizeArch(arch); + return normalized == "a2" || normalized == "a3" || normalized == "a5"; +} + +static std::optional getModuleTargetArchAttr(ModuleOp module) { + auto attr = module->getAttrOfType("pto.target_arch"); + if (!attr) + return std::nullopt; + std::string arch = normalizeArch(attr.getValue()); + if (!isSupportedPTOASTargetArch(arch)) + return std::nullopt; + return arch; +} + +static std::string resolveEffectiveTargetArch(ModuleOp module, + llvm::StringRef fallbackArch) { + if (std::optional arch = getModuleTargetArchAttr(module)) + return *arch; + + std::optional childArch; + for (ModuleOp child : module.getOps()) { + std::optional arch = getModuleTargetArchAttr(child); + if (!arch) + continue; + if (!childArch) { + childArch = std::move(arch); + continue; + } + if (*childArch != *arch) + return normalizeArch(fallbackArch); + } + if (childArch) + return *childArch; + + std::string fallback = normalizeArch(fallbackArch); + if (!isSupportedPTOASTargetArch(fallback)) + return "a3"; + return fallback; +} + } // namespace int main(int argc, char **argv); @@ -2592,12 +2633,13 @@ static void lowerPTOToVPTOBackend(PassManager &pm, ModuleOp module, int argc, } static pto::VPTOEmissionOptions -buildVPTOEmissionOptions(const pto::CANNVersion &cannVersion) { +buildVPTOEmissionOptions(const pto::CANNVersion &cannVersion, + llvm::StringRef targetArch) { pto::VPTOEmissionOptions options; options.dumpVPTOIR = false; options.targetTriple = "hiipu64-hisilicon-cce"; options.cannVersion = cannVersion; - std::string arch = normalizeArch(ptoTargetArch); + std::string arch = normalizeArch(targetArch); options.march = isA2A3Arch(arch) ? "dav-c220-vec" : "dav-c310-vec"; return options; } @@ -2616,7 +2658,9 @@ static int emitVPTOBackendResult(ModuleOp module, PTOASCompileResult &result, if (emitVPTOLLVMDialect) { result.kind = PTOASCompileResultKind::Text; - pto::VPTOEmissionOptions options = buildVPTOEmissionOptions(cannVersion); + pto::VPTOEmissionOptions options = + buildVPTOEmissionOptions( + cannVersion, resolveEffectiveTargetArch(module, ptoTargetArch)); if (failed(pto::lowerVPTOModuleToLLVMIRText( module, options, result.textOutput, llvm::errs()))) { llvm::errs() << "Error: Failed to lower VPTO to LLVM IR.\n"; @@ -2625,7 +2669,9 @@ static int emitVPTOBackendResult(ModuleOp module, PTOASCompileResult &result, return 0; } - pto::VPTOEmissionOptions options = buildVPTOEmissionOptions(cannVersion); + pto::VPTOEmissionOptions options = + buildVPTOEmissionOptions( + cannVersion, resolveEffectiveTargetArch(module, ptoTargetArch)); std::string stubSource; if (emitHostStub) { if (failed(pto::emitVPTOHostStubSource(module, stubSource, llvm::errs()))) { @@ -2673,7 +2719,7 @@ int mlir::pto::compilePTOASModule( PTOBackend effectiveBackend, PTOASCompileResult &result, bool emitVPTOHostStub) { result.reset(); - llvm::StringRef arch = context.getArch(); + std::string arch = resolveEffectiveTargetArch(*module, context.getArch()); int argc = context.getArgc(); char **argv = context.getArgv(); @@ -2864,37 +2910,6 @@ int mlir::pto::compilePTOASModule( context.getCANNVersionOrDefault()); } - // When the module has nested child builtin.module ops (BACKEND_PARTITIONED - // or NESTED PTODSL layout), flatten them into the outer module so that - // FuncOp-level passes (InsertSync, InjectBarrierAllSync, etc.) can reach - // the functions. addNestedPass does not descend into child - // builtin.module ops. - { - SmallVector childModules; - for (ModuleOp child : module->getOps()) - childModules.push_back(child); - for (ModuleOp child : childModules) { - // Copy child module attributes to outer (skip pto.backend which is - // already set on the outer module by the backend job). - for (NamedAttribute attr : child->getAttrs()) { - StringRef attrName = attr.getName().getValue(); - if (attrName == "pto.backend" || attrName == "sym_name") - continue; - Operation *outerOp = module->getOperation(); - if (!outerOp->hasAttr(attrName)) - outerOp->setAttr(attr.getName(), attr.getValue()); - } - // Move all ops from child into outer. - Block *childBody = child.getBody(); - Block *outerBody = module->getBody(); - while (!childBody->empty()) { - Operation &op = childBody->front(); - op.moveBefore(outerBody, outerBody->end()); - } - child.erase(); - } - } - // Main PassManager PassManager pm(module->getContext()); @@ -2921,7 +2936,7 @@ int mlir::pto::compilePTOASModule( // PTOViewToMemref is generic view lowering required by both backends; keep it // outside the local-memory planning gate so default A2/A3 EmitC still lowers // pto.make_tensor_view before backend legalization. - const bool isA2A3 = isA2A3Arch(ptoTargetArch); + const bool isA2A3 = isA2A3Arch(arch); if (!isA2A3) pm.addNestedPass(pto::createPTOA5NormalizeTMovPass()); pm.addNestedPass( From 93332f880e90c6ff11f4a0ea22cd0a718bfab9c6 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 9 Jul 2026 14:34:54 +0200 Subject: [PATCH 23/29] restore emitc memory planning passes --- tools/ptoas/ptoas.cpp | 67 +++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 38 deletions(-) diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index 393017b982..e61ecfb606 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -2942,49 +2942,40 @@ int mlir::pto::compilePTOASModule( pm.addNestedPass( pto::createPTOValidateIntToPtrUsesPass()); - // Local tile planning path. A5 already uses this path. A2/A3 VPTO also - // enters it so UB tile addresses come from PTOPlanMemory instead of the - // fallback allocator in LowerPTOToUBufOps. - const bool enableLocalTilePlanning = - !isA2A3 || effectiveBackend == PTOBackend::VPTO; - if (enableLocalTilePlanning) { - // Keep frontend fusion on tile-native PTO IR and annotate last_use directly - // on scheduled block-local spans before the shared mainline lowers tiles. - // The shape-inference switch drives FusionPlan only: that is where the - // iteration-domain decisions (static vs ShapeConstraintSolver) are made. - // FusionRegionGen consumes only the shared pre-fusion dataflow graph (cached - // by the analysis manager and built once by FusionPlan) plus the resulting - // pto.fusion.group_id/order metadata; it never consults the domain classes, - // so it takes no option here. - pto::FusionPlanOptions fusionPlanOpts; - fusionPlanOpts.enableShapeInference = enableShapeInference; - if (!isA2A3 && enableA5EmitCFusionPath) { - pm.addNestedPass( - pto::createFusionPlanPass(fusionPlanOpts)); - pm.addNestedPass(pto::createOpSchedulingPass()); - pm.addNestedPass(pto::createPTOMarkLastUsePass()); - } else if (!isA2A3 && enableA5VPTOFusionPath) { - pm.addNestedPass( - pto::createFusionPlanPass(fusionPlanOpts)); - pm.addNestedPass(pto::createOpSchedulingPass()); - pm.addNestedPass(pto::createPTOFusionRegionGenPass()); - } + // Keep frontend fusion on tile-native PTO IR and annotate last_use directly + // on scheduled block-local spans before the shared mainline lowers tiles. + // The shape-inference switch drives FusionPlan only: that is where the + // iteration-domain decisions (static vs ShapeConstraintSolver) are made. + // FusionRegionGen consumes only the shared pre-fusion dataflow graph (cached + // by the analysis manager and built once by FusionPlan) plus the resulting + // pto.fusion.group_id/order metadata; it never consults the domain classes, + // so it takes no option here. + pto::FusionPlanOptions fusionPlanOpts; + fusionPlanOpts.enableShapeInference = enableShapeInference; + if (!isA2A3 && enableA5EmitCFusionPath) { + pm.addNestedPass( + pto::createFusionPlanPass(fusionPlanOpts)); + pm.addNestedPass(pto::createOpSchedulingPass()); + pm.addNestedPass(pto::createPTOMarkLastUsePass()); + } else if (!isA2A3 && enableA5VPTOFusionPath) { + pm.addNestedPass( + pto::createFusionPlanPass(fusionPlanOpts)); + pm.addNestedPass(pto::createOpSchedulingPass()); + pm.addNestedPass(pto::createPTOFusionRegionGenPass()); } pm.addPass(pto::createPTOViewToMemrefPass()); - if (enableLocalTilePlanning) { - if (effectiveLevel != PTOBuildLevel::Level3) { - PlanMemoryOptions planMemoryOption; - planMemoryOption.memMode = MemPlanMode::LOCAL_MEM_PLAN; - planMemoryOption.enableGlobalReuse = false; - planMemoryOption.enablePrintMemoryAllocatedSize = false; - planMemoryOption.orderBySize = planMemoryOrderBySize; - pm.addPass(pto::createPlanMemoryPass(planMemoryOption)); - } - pm.addPass(pto::createPTOResolveReservedBuffersPass()); - pm.addNestedPass(pto::createPTORemoveIdentityTMovPass()); + if (effectiveLevel != PTOBuildLevel::Level3) { + PlanMemoryOptions planMemoryOption; + planMemoryOption.memMode = MemPlanMode::LOCAL_MEM_PLAN; + planMemoryOption.enableGlobalReuse = false; + planMemoryOption.enablePrintMemoryAllocatedSize = false; + planMemoryOption.orderBySize = planMemoryOrderBySize; + pm.addPass(pto::createPlanMemoryPass(planMemoryOption)); } + pm.addPass(pto::createPTOResolveReservedBuffersPass()); + pm.addNestedPass(pto::createPTORemoveIdentityTMovPass()); // Conditionally add one automatic synchronization mode. Barrier-all is a // conservative standalone pass; InsertSync and GraphSyncSolver are set/wait From c80521f13b662968e6195a958cfcb83a86679495 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Fri, 10 Jul 2026 11:45:37 +0200 Subject: [PATCH 24/29] trigger CI From 2ca10958ae5f9adab666891d231e16a89a986701 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Tue, 14 Jul 2026 12:54:14 +0200 Subject: [PATCH 25/29] fix(vpto): use storage bit-width helper for low-precision CBuf loads deriveLoadCbufToCbControl / deriveLoadCbufToCaControl called the raw Type::getIntOrFloatBitWidth() accessor, which asserts on non-int/float element types (FP4 packed, hifloat8, f8, ...). In assert builds this crashed ptoas mid-pass (~60 VPTO/UB low-precision lit tests) with 'only integers and floats have a bitwidth'. Use pto::getPTOStorageElemBitWidth() instead, matching the sibling deriveLoadCbufToCaMxControl / deriveLoadCbufToCbMxControl functions and the rest of the codebase. The existing (elemBitWidth == 0 || % 8) guard already matches the helper's 0-on-unknown contract. --- lib/PTO/Transforms/VPTOExpandWrapperOps.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp b/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp index 4cde3de2a6..d83c8462f9 100644 --- a/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp +++ b/lib/PTO/Transforms/VPTOExpandWrapperOps.cpp @@ -783,7 +783,7 @@ static FailureOr deriveLoadCbufToCbControl(Location loc, Value k, Value n, Type elementType, Value mStart, Value kStart, bool transpose, PatternRewriter &rewriter) { - unsigned elemBitWidth = elementType.getIntOrFloatBitWidth(); + unsigned elemBitWidth = pto::getPTOStorageElemBitWidth(elementType); if (elemBitWidth == 0 || (elemBitWidth % 8) != 0) return failure(); uint64_t elemBytes = elemBitWidth / 8; @@ -836,7 +836,7 @@ static FailureOr deriveLoadCbufToCaControl(Location loc, Value m, Value k, Type elementType, Value mStart, Value kStart, bool transpose, PatternRewriter &rewriter) { - unsigned elemBitWidth = elementType.getIntOrFloatBitWidth(); + unsigned elemBitWidth = pto::getPTOStorageElemBitWidth(elementType); if (elemBitWidth == 0 || (elemBitWidth % 8) != 0) return failure(); uint64_t elemBytes = elemBitWidth / 8; From 41900146957426cb17446aa31f9503346d59d492 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Wed, 15 Jul 2026 17:19:49 +0200 Subject: [PATCH 26/29] fix(vpto): address A2/A3 review findings --- docs/designs/a2a3-vpto-pr908-review-audit.md | 281 ++++++++++++++++++ lib/PTO/Transforms/LowerPTOToUBufOps.cpp | 202 +++++++++---- .../Transforms/VPTOLLVMEmitterDispatcher.cpp | 9 +- ...rmsnorm_alloc_buffer_simt_manual_launch.py | 1 + ptodsl/ptodsl/_runtime/native_build.py | 8 +- ptodsl/ptodsl/_runtime/toolchain.py | 2 +- ptodsl/tests/test_jit_compile.py | 59 ++-- ptodsl/tests/test_runtime_toolchain.py | 13 +- .../vpto/ub/tile_to_ub/elementwise/tabs.pto | 11 +- .../tile_to_ub/elementwise/tadd_chunked.pto | 2 +- .../elementwise/tadd_col_vl_align.pto | 10 +- .../elementwise/tadd_count_large.pto | 11 +- .../tile_to_ub/elementwise/tadd_row_rpt.pto | 12 +- .../elementwise/tadd_row_rpt_tail.pto | 12 +- .../vpto/ub/tile_to_ub/elementwise/tadds.pto | 11 +- .../transfer/tload_nonunit_stride.pto | 30 ++ .../transfer/tload_subview_offset.pto | 60 ++++ tools/ptoas/ptoas.cpp | 13 +- 18 files changed, 641 insertions(+), 106 deletions(-) create mode 100644 docs/designs/a2a3-vpto-pr908-review-audit.md create mode 100644 test/lit/vpto/ub/tile_to_ub/transfer/tload_nonunit_stride.pto create mode 100644 test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto diff --git a/docs/designs/a2a3-vpto-pr908-review-audit.md b/docs/designs/a2a3-vpto-pr908-review-audit.md new file mode 100644 index 0000000000..2d79ef9c5b --- /dev/null +++ b/docs/designs/a2a3-vpto-pr908-review-audit.md @@ -0,0 +1,281 @@ +# PR #908 Review Comment Audit + +Date: 2026-07-15 + +This document audits the review comments added to PR #908 against head commit +`2ca10958ae5f9adab666891d231e16a89a986701`. The findings were rechecked after +merging upstream `main` at `f0bdc1ee2` into the feature branch in merge commit +`a81518402`. + +The two review rounds contain nine inline comments. Two comments repeat an +earlier finding, leaving seven unique findings. All seven identify real issues; +the PTODSL launcher finding has lower demonstrated impact than its wording +suggests. Testing after the merge also found one additional P1 integration +regression that blocked the complete A2/A3 pipeline. The current PR working +tree resolves all eight findings. + +## Validation Results + +Tests used `ptoas:dev-cann900-llvm-21-fork`, built from +`docker/Dockerfile.dev`, with LLVM 21, PTO Python bindings, CANN 9.0.0, and an +Ascend 910B2 device. + +| Test | Result | Notes | +| --- | --- | --- | +| Full Docker build | PASS | `ptoas`, `ptobc`, and PTO Python bindings built and linked | +| Complete lit suite | PASS | 918 of 918 tests passed after the review fixes | +| Focused A2/A3 UB lit suite | PASS | 37 of 37 tests passed | +| PTODSL runtime toolchain tests | PASS | 5 of 5 tests passed; `test_jit_compile.py` also passed against the source package | +| A3 VPTO hardware E2E | PASS | 392 of 392 numerical cases passed on Ascend 910B2 | + +The pre-fix 392 E2E failures had the same root cause: +`InsertTemplateAttributes` queried the PTODSL registry for A3 operations, +beginning with `pto.tload`, but the merged template registry contained only A5 +entries. Gating template discovery away from the A2/A3 direct UB pipeline +restored compilation and enabled the complete passing hardware run. + +## Summary + +| Priority | Finding | Verdict | +| --- | --- | --- | +| P1 | A2/A3 incorrectly enters A5-only PTODSL template discovery | Resolved | +| P1 | GM view offsets and strides are discarded | Resolved; non-unit innermost strides are rejected | +| P1 | Large repeat counts are silently truncated | Resolved | +| P2 | A5 cube emission inherits the vector target CPU | Resolved | +| P2 | CANN900 lowering is globally disabled | Resolved | +| P2 | Tile valid-shape metadata is discarded | Resolved; duplicate comments | +| P2 | Full-mask restoration leaves upper lanes disabled | Resolved | +| P3 | PTODSL launcher compilation does not receive `target_arch` | Resolved; duplicate comments, impact overstated | + +## Implemented Resolutions + +- Skip PTODSL template discovery for the A2/A3 direct UB lowering pipeline. +- Extract composed memref offsets and physical strides for DMA, expand the + metadata before emission, and reject unsupported dynamic or non-unit + innermost strides. +- Preserve tile physical and valid shapes, reject dynamic valid shapes, and use + physical row strides for partial-width unary, scalar, duplicate, shift, and + binary lowering. +- Split large count-mode work into repeat-one operations and restore both full + mask words on every partial/count path. +- Leave A5 `march` unset for per-kernel-kind vector/cube selection and retain + CANN900 dispatch for non-C220 targets. +- Forward `target_arch` through native launcher compilation and validate the + exact architecture in the production call chain. + +## Findings + +### P1: A2/A3 incorrectly enters A5-only PTODSL template discovery + +This regression was exposed after merging `main`; it was not one of the inline +review comments against `2ca10958`. + +When VPTO input contains tile operations, `compilePTOASModule` resolves PTODSL +expansion options and unconditionally schedules `InsertTemplateAttributes` +(`tools/ptoas/ptoas.cpp:2989-2993` and `3040-3048`). The later VPTO backend +pipeline explicitly lowers A2/A3 directly through `LowerPTOToUBufOps` and +returns before `ExpandTileOp` (`tools/ptoas/ptoas.cpp:2681-2695`). Template +selection is therefore unnecessary on A2/A3. + +The merged lazy registry contains only `(a5, op)` entries +(`ptodsl/ptodsl/tilelib/templates/__init__.py:14-123`). It cannot answer an A2 +or A3 metadata request. This caused 34 lit failures and all 392 E2E failures; +the latter consistently stopped at `NoMatchingTemplate` for `pto.tload` before +any kernel was emitted or launched. + +Recommended correction: + +- Do not schedule `InsertTemplateAttributes` for A2/A3 direct UB lowering. +- Avoid starting the PTODSL template daemon for A2/A3 when `ExpandTileOp` will + not run. +- Add A2 and A3 default-backend tests that use the PTODSL default and prove the + pipeline reaches `LowerPTOToUBufOps` without template lookup. +- Rerun all 392 hardware cases before treating prior E2E results as current. + +### P1: GM view offsets and strides are discarded + +Comment: [discussion_r3585509398](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585509398) + +`extractDmaMemRefViewInfo` traces a subview or reinterpret cast back to its root +memref, reconstructs row-major strides from the result shape, and fills every +offset with zero (`lib/PTO/Transforms/LowerPTOToUBufOps.cpp:1183-1217`). The +normal pipeline has already converted `pto.partition_view` to `memref.subview`, +so the direct `PartitionViewOp` handling does not protect normal inputs. + +A nonzero partition therefore reads or writes the wrong GM address. For +example, partitioning a contiguous `17x32xf32` view at `[1, 0]` should add 128 +bytes, but current lowering computes zero. Padded and non-contiguous outer +strides are also replaced with an incorrect contiguous stride. + +Recommended correction: + +- Extract strided metadata from the actual memref view. +- Preserve its composed linear offset, sizes, and physical strides. +- Reject or separately lower unsupported non-unit innermost strides. +- Add `tload` and `tstore` tests with nonzero offsets and padded row strides. + +### P1: Large repeat counts are silently truncated + +Comment: [discussion_r3585509393](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585509393) + +`modeCount1L` passes `totalRpts` directly to a UB operation +(`lib/PTO/Transforms/LowerPTOToUBufOps.cpp:1500-1508`). For a `16x1024xf32` +tile, this is 256 repeats. The LLVM emitter masks the value with `0xff` +(`lib/PTO/Transforms/VPTOLLVMEmitter.cpp:4814`), encoding it as zero. The C220 +count-mode design also requires repeat-one operations rather than a multi-repeat +count-mode instruction. + +`modeCount2L` has the same latent issue because it emits `colRpts` while count +mode is active. Preserving valid-shape metadata will make that path reachable +for normal allocation-produced tiles. + +Post-merge reproduction with the existing `tadd_count_large.pto` and the +legacy TileLang frontend produced `set_mask 16384` followed by +`pto.ub.vadd ... repeat=256`, then restored the mask as `(-1, 0)`. This directly +confirms both the out-of-range repeat and the mask-restoration issue. The +default-frontend lit test currently fails earlier at the template-discovery +blocker. + +Recommended correction: + +- Split large work into representable repeat-one chunks or loops. +- Apply the same rule to row-wise count mode. +- Verify constant repeat operands instead of silently truncating them. +- Change the existing `tadd_count_large.pto` expectation to require splitting. +- Add boundary tests for 255 and 256 repeats. + +### P2: A5 cube emission inherits the vector target CPU + +Comment: [discussion_r3585078492](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585078492) + +`buildVPTOEmissionOptions` sets a nonempty A5 `march` to `dav-c310-vec` +(`tools/ptoas/ptoas.cpp:2726`). Device option construction treats nonempty +`march` as an explicit override, so a cube module also receives the vector CPU +instead of selecting `dav-c310-cube`. Object emission then passes that CPU to +Bisheng. + +Post-merge reproduction with the A5 cube `mad_semantic_vpto_llvm.pto` emitted +both `target-cpu="dav-c310-vec"` and vector target features on the cube +functions, confirming the wrong-target path independently of object emission. + +Recommended correction: + +- Seed `march` only for A2/A3, leaving A5 empty so existing per-kernel-kind + defaults select vector or cube. +- Add A5 cube and mixed vector/cube target-attribute tests. +- Add a command-level object-emission test for `dav-c310-cube`. + +### P2: CANN900 lowering is globally disabled + +Comment: [discussion_r3585078496](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585078496) + +`usesCANN900Lowering` unconditionally returns false +(`lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp:14-25`). This routes every +VPTO target through the Beta1 emitter, including A5 on CANN 9 releases that +previously selected the CANN900 emitter. The two emitters use materially +different intrinsic spellings and contracts. + +The complete lit run confirms this behavior with three A5/CANN 9 failures: +`a5_extra_arith_vpto_llvm.pto`, `issue220_vrelu_i32_vpto_llvm.pto`, and +`vreg_low_precision_memory_vpto_llvm.pto`. All expected CANN900 spellings but +received Beta1 spellings. For example, `issue220` expected +`llvm.hivm.vrelu.x.v64i32` and received `llvm.hivm.vrelu.v64s32.x`. + +Recommended correction: + +- Keep the Beta1 compatibility path for A2/A3 C220 targets. +- Preserve version-based CANN900 selection for A5. +- Test A5 beta, A5 release, and A2/A3 release dispatch explicitly. + +### P2: Tile valid-shape metadata is discarded + +Comments: + +- [discussion_r3585078499](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585078499) +- [discussion_r3585509385](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585509385) + +The allocation rewrite records only `TileBufType::getShape()` before replacing +the tile with a pointer (`lib/PTO/Transforms/LowerPTOToUBufOps.cpp:229-253`). +Pointer-based shape extraction therefore has no valid shape and substitutes the +physical rows and columns. For the standard allocation path, valid-shape-aware +binary dispatch becomes unreachable and operations process padded, potentially +uninitialized UB elements. + +Preserving the metadata alone is insufficient for unary, scalar, duplicate, +and decomposed operations: those helpers flatten `vRows * vCols` and do not +apply the physical row stride when `vCols != cols`. + +Post-merge reproduction with the existing physical `4x96`, valid `4x32` test +produced a six-iteration loop with 64-element pointer steps and masks. The +correct valid-region lowering should process four 32-element rows with a +96-element physical row stride. This confirms that the existing test's loose +checks previously accepted the wrong dispatch path. + +Recommended correction: + +- Store physical shape, valid shape, and any dynamic valid dimensions in the + pointer metadata. +- Use row-strided lowering for unary, scalar, duplicate, and decomposition + paths whenever the valid width differs from the physical width. +- Either implement dynamic valid-shape lowering or reject it explicitly. +- Strengthen existing valid-shape tests to check mask counts, loop bounds, and + pointer offsets rather than only operation presence. + +### P2: Full-mask restoration leaves upper lanes disabled + +Comment: [discussion_r3585509400](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585509400) + +`fullMask` emits `mask0=-1, mask1=0` +(`lib/PTO/Transforms/LowerPTOToUBufOps.cpp:1130-1132`). The UB mask contract +states that full-write mode is `mask0=-1, mask1=-1` +(`include/PTO/IR/VPTOUbOps.td:205`). The current restoration leaves lanes +64-127 disabled for f16/i16 operations. Some dispatch branches also return +after leaving count or partial mask state without calling `fullMask`. + +The large-count reproduction emitted `pto.ub.set_mask %c-1, %c0` after +returning to normal mode, directly confirming that the generated IR restores +only the lower mask word. The full f16 behavioral consequence remains untested +because the merged A3 frontend blocks all E2E cases before lowering. + +Recommended correction: + +- Restore both mask words to `-1`. +- Audit every dispatch exit for consistent count-mode and mask restoration. +- Add a chained partial-mask-to-full-f16 regression test covering upper lanes. + +### P3: PTODSL launcher compilation does not receive target_arch + +Comments: + +- [discussion_r3585078502](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585078502) +- [discussion_r3585509406](https://github.com/hw-native-sys/PTOAS/pull/908#discussion_r3585509406) + +The kernel object receives `module_spec.target_arch`, but `_compile_launch_cpp` +calls `_kernel_compile_flags(kernel_kind)` without it +(`ptodsl/ptodsl/_runtime/native_build.py:125-162`). The new helper consequently +uses its A5 default and compiles an A2/A3 launch translation unit with a C310 +architecture option. + +The mismatch is real, but the actual kernel payload is still emitted by PTOAS +for C220. `launch.cpp` contains host launch plumbing rather than a second kernel +implementation. Historical A3 end-to-end results exercised this path, but the +post-merge suite now fails before launcher compilation because of the template +blocker. This remains an incomplete/toolchain-sensitive integration rather than +a demonstrated wrong-kernel execution bug. + +Recommended correction: + +- Thread `target_arch` through `_compile_launch_cpp` and + `_kernel_compile_flags`. +- Include the effective launch architecture in cache configuration. +- Test the generated Bisheng command, not only the helper function. + +## Implementation Order + +1. Gate PTODSL template discovery away from A2/A3 and restore lit/E2E reachability. +2. Correct DMA view metadata and add address/stride regressions. +3. Preserve valid-shape metadata and make all operation families row-aware. +4. Split invalid count-mode repeat values and add verifier coverage. +5. Restore mask state consistently. +6. Repair A5 target selection and architecture-aware CANN dispatcher behavior. +7. Thread PTODSL launcher architecture through the production call path. diff --git a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp index 6faaa5a6bf..3f856802f6 100644 --- a/lib/PTO/Transforms/LowerPTOToUBufOps.cpp +++ b/lib/PTO/Transforms/LowerPTOToUBufOps.cpp @@ -21,6 +21,7 @@ #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/Dialect/SCF/IR/SCF.h" +#include "mlir/Dialect/Utils/StaticValueUtils.h" #include "mlir/IR/BuiltinAttributes.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/Matchers.h" @@ -134,9 +135,15 @@ struct TileShapeInfo { unsigned blockSizeElem; }; +struct TileShapeMetadata { + SmallVector shape; + SmallVector validShape; +}; + +using TileShapeMap = DenseMap; + static std::optional extractTileShapeInfoFromValue( - Value opDst, - const DenseMap> &tileShapes) { + Value opDst, const TileShapeMap &tileShapes) { Type dstTy = opDst.getType(); if (!isUBMemorySpace(dstTy)) return std::nullopt; @@ -158,7 +165,8 @@ static std::optional extractTileShapeInfoFromValue( if (it == tileShapes.end()) return std::nullopt; elemTy = cast(dstTy).getElementType(); - shape = llvm::ArrayRef(it->second); + shape = llvm::ArrayRef(it->second.shape); + validShape = llvm::ArrayRef(it->second.validShape); } else { return std::nullopt; } @@ -193,13 +201,11 @@ static std::optional extractTileShapeInfoFromValue( } static std::optional extractTileShapeInfo( - Operation *op, - const DenseMap> &tileShapes) { + Operation *op, const TileShapeMap &tileShapes) { return extractTileShapeInfoFromValue(op->getOperand(2), tileShapes); } -static bool canLower(Operation *op, - const DenseMap> &tileShapes) { +static bool canLower(Operation *op, const TileShapeMap &tileShapes) { return extractTileShapeInfo(op, tileShapes).has_value(); } @@ -228,10 +234,19 @@ struct LowerPTOToUBufOpsPass // A2/A3: consume planned addresses from PTOPlanMemory / PTOMaterializeTileHandles. // Each alloc_tile must carry a planned addr operand. - DenseMap> tileShapes; + TileShapeMap tileShapes; { SmallVector allocOps; func.walk([&](pto::AllocTileOp op) { allocOps.push_back(op); }); + for (auto op : allocOps) { + auto tbTy = cast(op.getResult().getType()); + if (llvm::any_of(tbTy.getValidShape(), ShapedType::isDynamic)) { + op.emitError("A2/A3 UB lowering requires static valid_row and " + "valid_col"); + signalPassFailure(); + return; + } + } for (auto op : allocOps) { auto tbTy = cast(op.getResult().getType()); auto shape = tbTy.getShape(); @@ -249,7 +264,9 @@ struct LowerPTOToUBufOpsPass ctx, tbTy.getElementType(), pto::AddressSpaceAttr::get(ctx, pto::AddressSpace::VEC)); auto pc = builder.create(op.getLoc(), ptrTy, addr); - tileShapes[pc.getResult()] = SmallVector(shape); + tileShapes[pc.getResult()] = { + SmallVector(shape), + SmallVector(tbTy.getValidShape())}; op.getResult().replaceAllUsesWith(pc.getResult()); op.erase(); } @@ -855,7 +872,7 @@ struct LowerPTOToUBufOpsPass std::tuple lowerBinaryOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, Value dstVal, Value src0Val, Value src1Val, - const DenseMap> &tileShapes) { + const TileShapeMap &tileShapes) { Location loc = op->getLoc(); builder.setInsertionPoint(op); Type elemTy = getStoredElemType(dstVal.getType()); @@ -877,7 +894,7 @@ struct LowerPTOToUBufOpsPass std::tuple lowerXorOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, Value dstVal, Value src0Val, Value src1Val, Value tmpVal, - const DenseMap> &tileShapes) { + const TileShapeMap &tileShapes) { Location loc = op->getLoc(); builder.setInsertionPoint(op); Type elemTy = getStoredElemType(dstVal.getType()); @@ -911,8 +928,7 @@ struct LowerPTOToUBufOpsPass std::tuple lowerShiftOpCommon(OpBuilder &builder, MLIRContext *ctx, Operation *op, - Value dstVal, Value srcVal, - const DenseMap> &tileShapes) { + Value dstVal, Value srcVal, const TileShapeMap &tileShapes) { Location loc = op->getLoc(); builder.setInsertionPoint(op); Type elemTy = getStoredElemType(dstVal.getType()); @@ -934,6 +950,21 @@ struct LowerPTOToUBufOpsPass void dispatchShift(Location loc, OpBuilder &b, Value dst, Value src, Value scalar, pto::PtrType ptrTy, const TileShapeInfo &info) { + if (info.vRows > 1 && info.vCols != info.cols) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value off = b.create( + loc, forOp.getInductionVar(), idxc(info.cols, loc, b)); + TileShapeInfo rowInfo = info; + rowInfo.rows = 1; + rowInfo.vRows = 1; + dispatchShift(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, src, ptrTy, off), scalar, ptrTy, + rowInfo); + b.setInsertionPointAfter(forOp); + return; + } int64_t epr = info.elementsPerRepeat; int64_t totalV = info.vRows * info.vCols; int64_t headRepeats = totalV / epr; @@ -973,6 +1004,7 @@ struct LowerPTOToUBufOpsPass emitShift(td, ts0); b.create(loc); } + fullMask(loc, b); return; } @@ -986,6 +1018,20 @@ struct LowerPTOToUBufOpsPass template void dispatchUnary(Location loc, OpBuilder &b, Value dst, Value src, pto::PtrType ptrTy, const TileShapeInfo &info) { + if (info.vRows > 1 && info.vCols != info.cols) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value off = b.create( + loc, forOp.getInductionVar(), idxc(info.cols, loc, b)); + TileShapeInfo rowInfo = info; + rowInfo.rows = 1; + rowInfo.vRows = 1; + dispatchUnary(loc, b, addPtr(loc, b, dst, ptrTy, off), + addPtr(loc, b, src, ptrTy, off), ptrTy, rowInfo); + b.setInsertionPointAfter(forOp); + return; + } auto emit = [&](Value rd, Value rs) { b.create(loc, rd, rs, i64c1(loc, b), i64c1(loc, b), i64c1(loc, b), @@ -1020,6 +1066,7 @@ struct LowerPTOToUBufOpsPass emit(td, ts); b.create(loc); } + fullMask(loc, b); return; } @@ -1032,6 +1079,20 @@ struct LowerPTOToUBufOpsPass void dispatchDup(Location loc, OpBuilder &b, Value dst, Value scalar, pto::PtrType ptrTy, const TileShapeInfo &info) { + if (info.vRows > 1 && info.vCols != info.cols) { + auto forOp = b.create(loc, idxc0(loc, b), + idxc(info.vRows, loc, b), idxc1(loc, b)); + b.setInsertionPointToStart(forOp.getBody()); + Value off = b.create( + loc, forOp.getInductionVar(), idxc(info.cols, loc, b)); + TileShapeInfo rowInfo = info; + rowInfo.rows = 1; + rowInfo.vRows = 1; + dispatchDup(loc, b, addPtr(loc, b, dst, ptrTy, off), scalar, ptrTy, + rowInfo); + b.setInsertionPointAfter(forOp); + return; + } auto emit = [&](Value rd) { Value scalarI64 = scalar; if (scalarI64.getType() != b.getI64Type()) @@ -1068,6 +1129,7 @@ struct LowerPTOToUBufOpsPass emit(td); b.create(loc); } + fullMask(loc, b); return; } @@ -1112,6 +1174,7 @@ struct LowerPTOToUBufOpsPass emitUBBinOp(loc, b, td, ts0, ts1, i64c1(loc, b), i64c8(loc, b)); b.create(loc); } + fullMask(loc, b); return; } @@ -1128,7 +1191,7 @@ struct LowerPTOToUBufOpsPass } void fullMask(Location loc, OpBuilder &b) { - b.create(loc, i64cM1(loc, b), i64c0(loc, b)); + b.create(loc, i64cM1(loc, b), i64cM1(loc, b)); } Value addPtr(Location loc, OpBuilder &b, Value base, pto::PtrType ptrTy, @@ -1142,11 +1205,41 @@ struct LowerPTOToUBufOpsPass struct DmaViewInfo { Value gmPtr; + Value linearOffset; SmallVector sizes; SmallVector strides; SmallVector offsets; }; + static bool hasUnitInnermostStride(Value view) { + while (Operation *def = view.getDefiningOp()) { + if (auto subview = dyn_cast(def)) { + auto strides = subview.getStaticStrides(); + if (strides.empty() || strides.back() != 1) + return false; + view = subview.getSource(); + continue; + } + if (auto reinterpret = dyn_cast(def)) { + auto strides = reinterpret.getConstifiedMixedStrides(); + if (strides.empty()) + return false; + auto stride = getConstantIntValue(strides.back()); + return stride && *stride == 1; + } + if (auto cast = dyn_cast(def)) { + view = cast.getSource(); + continue; + } + break; + } + auto memTy = dyn_cast(view.getType()); + if (!memTy) + return false; + auto strides = memTy.getStridesAndOffset().first; + return !strides.empty() && strides.back() == 1; + } + static FailureOr extractDmaViewInfo(pto::TLoadOp op) { auto pvOp = op.getSrc().getDefiningOp(); if (pvOp) { @@ -1158,6 +1251,11 @@ struct LowerPTOToUBufOpsPass info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); info.strides.assign(mtvOp.getStrides().begin(), mtvOp.getStrides().end()); + if (info.strides.empty() || + !matchPattern(info.strides.back(), m_One())) { + op.emitError("A2/A3 DMA lowering requires a unit innermost stride"); + return failure(); + } info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); return info; } @@ -1174,6 +1272,11 @@ struct LowerPTOToUBufOpsPass info.gmPtr = mtvOp.getPtr(); info.sizes.assign(pvOp.getSizes().begin(), pvOp.getSizes().end()); info.strides.assign(mtvOp.getStrides().begin(), mtvOp.getStrides().end()); + if (info.strides.empty() || + !matchPattern(info.strides.back(), m_One())) { + op.emitError("A2/A3 DMA lowering requires a unit innermost stride"); + return failure(); + } info.offsets.assign(pvOp.getOffsets().begin(), pvOp.getOffsets().end()); return info; } @@ -1191,30 +1294,21 @@ struct LowerPTOToUBufOpsPass ArrayRef shape = memTy.getShape(); if (shape.size() < 2) return failure(); + if (!hasUnitInnermostStride(view)) { + emitError(loc) << "A2/A3 DMA lowering requires a unit innermost stride"; + return failure(); + } OpBuilder b(ctx); b.setInsertionPointAfterValue(view); DmaViewInfo info; auto ptrTy = pto::PtrType::get(ctx, memTy.getElementType(), msAttr); - Value root = traceRootMemRef(view); - info.gmPtr = b.create(loc, ptrTy, root).getResult(); - - SmallVector rowMajorStrides(shape.size(), 1); - for (int i = static_cast(shape.size()) - 2; i >= 0; --i) { - if (shape[i + 1] == ShapedType::kDynamic) - return failure(); - rowMajorStrides[i] = rowMajorStrides[i + 1] * shape[i + 1]; - } - - for (auto [idx, dim] : llvm::enumerate(shape)) { - Value size = dim == ShapedType::kDynamic - ? b.create(loc, view, idx).getResult() - : b.create(loc, dim).getResult(); - info.sizes.push_back(size); - info.strides.push_back( - b.create(loc, rowMajorStrides[idx]).getResult()); - info.offsets.push_back(b.create(loc, 0).getResult()); - } + auto metadata = b.create(loc, view); + info.gmPtr = b.create(loc, ptrTy, traceRootMemRef(view)); + info.linearOffset = metadata.getOffset(); + info.sizes.assign(metadata.getSizes().begin(), metadata.getSizes().end()); + info.strides.assign(metadata.getStrides().begin(), + metadata.getStrides().end()); return info; } @@ -1239,6 +1333,12 @@ struct LowerPTOToUBufOpsPass Value computeGMByteOffset(Location loc, OpBuilder &b, const DmaViewInfo &viewInfo, unsigned elemSize) { + if (viewInfo.linearOffset) { + Value offset = b.create( + loc, b.getI64Type(), viewInfo.linearOffset); + return b.create(loc, offset, + i64c(elemSize, loc, b)); + } Value totalOff = idxc0(loc, b); for (size_t i = 0; i < viewInfo.offsets.size() && i < viewInfo.strides.size(); ++i) { @@ -1372,7 +1472,7 @@ struct LowerPTOToUBufOpsPass } LogicalResult lowerTLoad(pto::TLoadOp op, OpBuilder &b, - const DenseMap> &tileShapes) { + const TileShapeMap &tileShapes) { Location loc = op.getLoc(); auto viewInfo = extractDmaViewInfo(op); if (failed(viewInfo)) return failure(); @@ -1389,11 +1489,11 @@ struct LowerPTOToUBufOpsPass Value byteOff = computeGMByteOffset(loc, b, *viewInfo, elemSize); Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo->gmPtr, byteOff); return emitMteGmUb(loc, b, gmPtr, op.getDst(), *viewInfo, elemTy, - llvm::ArrayRef(it->second)); + llvm::ArrayRef(it->second.shape)); } LogicalResult lowerTStore(pto::TStoreOp op, OpBuilder &b, - const DenseMap> &tileShapes) { + const TileShapeMap &tileShapes) { Location loc = op.getLoc(); Type srcType = op.getSrc().getType(); if (!isUBMemorySpace(srcType)) return failure(); @@ -1411,7 +1511,7 @@ struct LowerPTOToUBufOpsPass Value byteOff = computeGMByteOffset(loc, b, *viewInfo, elemSize); Value gmPtr = offsetGMPtrByBytes(loc, b, viewInfo->gmPtr, byteOff); return emitMteUbGm(loc, b, op.getSrc(), gmPtr, *viewInfo, elemTy, - llvm::ArrayRef(it->second)); + llvm::ArrayRef(it->second.shape)); } //===--------------------------------------------------------------------===// @@ -1482,6 +1582,7 @@ struct LowerPTOToUBufOpsPass emitUBBinOp(loc, b, rd, r0, r1, i64c1(loc, b), i64c(rs, loc, b)); b.create(loc); b.setInsertionPointAfter(forOp); + fullMask(loc, b); return; } @@ -1499,14 +1600,7 @@ struct LowerPTOToUBufOpsPass template void modeCount1L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { - int64_t epr = info.elementsPerRepeat; - int64_t totalV = info.vRows * info.vCols; - int64_t totalRpts = (totalV + epr - 1) / epr; - b.create(loc); - b.create(loc, i64c(totalV, loc, b), i64c0(loc, b)); - emitUBBinOp(loc, b, dst, s0, s1, i64c(totalRpts, loc, b), i64c8(loc, b)); - b.create(loc); - fullMask(loc, b); + modeNorm1L(loc, b, dst, s0, s1, ptrTy, info); } //===--------------------------------------------------------------------===// @@ -1520,6 +1614,11 @@ struct LowerPTOToUBufOpsPass int64_t headRepeats = info.vCols / epr; int64_t rowStride = info.cols; + if (headRepeats > kRepeatMax) { + modeCount2L(loc, b, dst, s0, s1, ptrTy, info); + return; + } + auto forOp = b.create(loc, idxc0(loc, b), idxc(info.vRows, loc, b), idxc1(loc, b)); b.setInsertionPointToStart(forOp.getBody()); @@ -1540,12 +1639,7 @@ struct LowerPTOToUBufOpsPass template void modeCount2L(Location loc, OpBuilder &b, Value dst, Value s0, Value s1, pto::PtrType ptrTy, const TileShapeInfo &info) { - int64_t epr = info.elementsPerRepeat; int64_t rowStride = info.cols; - int64_t colRpts = (info.vCols + epr - 1) / epr; - b.create(loc); - b.create(loc, i64c(info.vCols, loc, b), - i64c0(loc, b)); auto forOp = b.create(loc, idxc0(loc, b), idxc(info.vRows, loc, b), idxc1(loc, b)); @@ -1556,11 +1650,11 @@ struct LowerPTOToUBufOpsPass Value rd = addPtr(loc, b, dst, ptrTy, off); Value rs0 = addPtr(loc, b, s0, ptrTy, off); Value rs1 = addPtr(loc, b, s1, ptrTy, off); - emitUBBinOp(loc, b, rd, rs0, rs1, i64c(colRpts, loc, b), i64c8(loc, b)); + TileShapeInfo rowInfo = info; + rowInfo.rows = 1; + rowInfo.vRows = 1; + modeNorm1L(loc, b, rd, rs0, rs1, ptrTy, rowInfo); b.setInsertionPointAfter(forOp); - - b.create(loc); - fullMask(loc, b); } //===--------------------------------------------------------------------===// diff --git a/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp b/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp index 9c85d2bb8d..5f5a99c455 100644 --- a/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp +++ b/lib/PTO/Transforms/VPTOLLVMEmitterDispatcher.cpp @@ -11,15 +11,18 @@ namespace mlir::pto { -static bool usesCANN900Lowering(const CANNVersion &cannVersion) { - return false; // Force Beta1 path until CANN900 emitter is stable for A3 +static bool usesCANN900Lowering(const VPTOEmissionOptions &options) { + const bool isC220 = options.march == "dav-c220-vec" || + options.march == "dav-c220-cube"; + return !isC220 && + options.cannVersion >= CANNVersion::release(9, 0, 0); } LogicalResult lowerVPTOModuleToLLVMModules( ModuleOp module, const VPTOEmissionOptions &options, EmittedLLVMModule &cubeModule, EmittedLLVMModule &vectorModule, llvm::raw_ostream &diagOS) { - if (usesCANN900Lowering(options.cannVersion)) + if (usesCANN900Lowering(options)) return lowerVPTOModuleToLLVMModulesCANN900(module, options, cubeModule, vectorModule, diagOS); return lowerVPTOModuleToLLVMModulesBeta1(module, options, cubeModule, diff --git a/ptodsl/examples/rms_norm/rmsnorm_alloc_buffer_simt_manual_launch.py b/ptodsl/examples/rms_norm/rmsnorm_alloc_buffer_simt_manual_launch.py index 291962bd5c..16e6e7f436 100644 --- a/ptodsl/examples/rms_norm/rmsnorm_alloc_buffer_simt_manual_launch.py +++ b/ptodsl/examples/rms_norm/rmsnorm_alloc_buffer_simt_manual_launch.py @@ -153,6 +153,7 @@ def build_manual_library(compiled, *, dyn_shared_bytes: int = _DYN_SHARED_BYTES) launch_cpp, launch_object, kernel_kind=module_spec.kernel_kind, + target_arch=module_spec.target_arch, export_macro=f"{ir_function_name}_EXPORTS", ) _link_shared_library( diff --git a/ptodsl/ptodsl/_runtime/native_build.py b/ptodsl/ptodsl/_runtime/native_build.py index 410a3997ae..310b44067e 100644 --- a/ptodsl/ptodsl/_runtime/native_build.py +++ b/ptodsl/ptodsl/_runtime/native_build.py @@ -122,8 +122,8 @@ def _host_compile_flags() -> list[str]: ] -def _kernel_compile_flags(kernel_kind: str) -> list[str]: - arch = aicore_arch_for_kernel_kind(kernel_kind) +def _kernel_compile_flags(kernel_kind: str, target_arch: str) -> list[str]: + arch = aicore_arch_for_kernel_kind(kernel_kind, target_arch) return common_include_flags() + [ "-std=gnu++17", "-O2", @@ -153,13 +153,14 @@ def _compile_launch_cpp( launch_object: Path, *, kernel_kind: str, + target_arch: str, export_macro: str, ) -> None: bisheng = resolve_bisheng() _run( [ bisheng, - *_kernel_compile_flags(kernel_kind), + *_kernel_compile_flags(kernel_kind, target_arch), f"-D{export_macro}", "-c", str(launch_cpp), @@ -255,6 +256,7 @@ def build_native_library( artifacts.launch_cpp, launch_object, kernel_kind=module_spec.kernel_kind, + target_arch=module_spec.target_arch, export_macro=export_macro, ) _link_shared_library( diff --git a/ptodsl/ptodsl/_runtime/toolchain.py b/ptodsl/ptodsl/_runtime/toolchain.py index da200e2183..b41ef53a54 100644 --- a/ptodsl/ptodsl/_runtime/toolchain.py +++ b/ptodsl/ptodsl/_runtime/toolchain.py @@ -170,7 +170,7 @@ def runtime_library_flags(*, sim_mode: bool = False) -> list[str]: return flags -def aicore_arch_for_kernel_kind(kernel_kind: str, target_arch: str = "a5") -> str: +def aicore_arch_for_kernel_kind(kernel_kind: str, target_arch: str) -> str: target = target_arch.lower() if kernel_kind == "vector": if target in {"a2", "a3"}: diff --git a/ptodsl/tests/test_jit_compile.py b/ptodsl/tests/test_jit_compile.py index 75adb03bce..7ddb816581 100644 --- a/ptodsl/tests/test_jit_compile.py +++ b/ptodsl/tests/test_jit_compile.py @@ -7,6 +7,7 @@ # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. # See LICENSE in the root of the software repository for the full text of the License. +from dataclasses import replace from pathlib import Path import os import re @@ -3931,16 +3932,22 @@ def inline_source_backed_probe(ptr: pto.ptr(pto.f32, "gm"), rows: pto.i32): multi_abi_graph.dependencies == (("entry_calls_kernel_module_multiple_abi_probe", ("process_tile_module",)),), "higher-level dependency metadata should still preserve the authored caller->callee edge", ) + host_vec_copy_compiled = host_vec_copy.compile() native_build_variants = ( - ("pure-container", host_vec_copy.compile()), - ("explicit-level3-container", host_vec_copy_explicit_addr.compile()), - ("same-backend-multi-child-container", kernel_module_compiled), - ("mixed-backend-container", emitc_entry_calls_vpto_kernel_module_probe.compile()), - ("source-auto", source_native_build_compiled), - ("source-explicit", source_explicit_native_build_compiled), - ("source-no-insert-sync", source_no_insert_sync_native_build_compiled), + ( + "a3-pure-container", + host_vec_copy_compiled, + replace(host_vec_copy_compiled._module_spec, target_arch="a3"), + ), + ("explicit-level3-container", host_vec_copy_explicit_addr.compile(), None), + ("same-backend-multi-child-container", kernel_module_compiled, None), + ("mixed-backend-container", emitc_entry_calls_vpto_kernel_module_probe.compile(), None), + ("source-auto", source_native_build_compiled, None), + ("source-explicit", source_explicit_native_build_compiled, None), + ("source-no-insert-sync", source_no_insert_sync_native_build_compiled, None), ) native_build_observations = [] + launch_target_arches = [] with TemporaryDirectory() as tmpdir: build_root = Path(tmpdir) @@ -3970,9 +3977,17 @@ def fake_run_ptoas(mlir_path, kernel_object, *, target_arch, insert_sync=None, b ) kernel_object.write_text("fake fatobj\n", encoding="utf-8") - def fake_compile_launch_cpp(launch_cpp, launch_object, *, kernel_kind, export_macro): + def fake_compile_launch_cpp( + launch_cpp, + launch_object, + *, + kernel_kind, + target_arch, + export_macro, + ): expect(launch_cpp.is_file(), "native build should materialize launch.cpp before compiling it") expect(kernel_kind in {"vector", "cube"}, "native build should forward the authored kernel kind") + launch_target_arches.append(target_arch) expect(export_macro.endswith("_EXPORTS"), "native build should preserve launch export macro naming") launch_object.write_text("fake launch object\n", encoding="utf-8") @@ -3989,10 +4004,11 @@ def fake_link_shared_library(launch_object, kernel_object, shared_library, *, ke ), mock.patch.object( native_build_runtime, "_link_shared_library", side_effect=fake_link_shared_library ), mock.patch.object(native_build_runtime, "runtime_library_flags", return_value=("-laclrt",)): - for label, compiled in native_build_variants: + for label, compiled, module_spec_override in native_build_variants: + module_spec = module_spec_override or compiled._module_spec lib_path, launch_symbol = native_build_runtime.build_native_library( py_name=compiled._py_name, - module_spec=compiled._module_spec, + module_spec=module_spec, kernel_signature=compiled._kernel_signature, mlir_text=compiled.mlir_text(), specialization_key=compiled.specialization_key, @@ -4007,22 +4023,29 @@ def fake_link_shared_library(launch_object, kernel_object, shared_library, *, ke len(native_build_observations) == len(native_build_variants), "native build should drive ptoas once per compiled container variant under test", ) - for (label, compiled), observation in zip(native_build_variants, native_build_observations): + for (label, compiled, module_spec_override), observation, launch_target_arch in zip( + native_build_variants, native_build_observations, launch_target_arches + ): + module_spec = module_spec_override or compiled._module_spec expect( - observation["target_arch"] == compiled._module_spec.target_arch, + observation["target_arch"] == module_spec.target_arch, f"{label} native build should still pass the target arch to ptoas", ) + expect( + launch_target_arch == module_spec.target_arch, + f"{label} native build should pass the target arch to launch compilation", + ) expected_insert_sync = ( - compiled._module_spec.insert_sync - if compiled._module_spec.insert_sync is not None - else compiled._module_spec.mode != "explicit" + module_spec.insert_sync + if module_spec.insert_sync is not None + else module_spec.mode != "explicit" ) expect( observation["insert_sync"] == expected_insert_sync, f"{label} native build should forward the effective insert_sync policy to ptoas", ) - expected_backend = compiled._module_spec.backend if compiled._module_spec.jit_source is not None else None - expected_pto_level = "level3" if compiled._module_spec.mode == "explicit" else None + expected_backend = module_spec.backend if module_spec.jit_source is not None else None + expected_pto_level = "level3" if module_spec.mode == "explicit" else None expect( observation["backend"] == expected_backend, f"{label} native build should only forward ptoas backend overrides for source-backed kernels", @@ -4035,7 +4058,7 @@ def fake_link_shared_library(launch_object, kernel_object, shared_library, *, ke observation["mlir_text"] == compiled.mlir_text(), f"{label} native build should hand the backend-partitioned container MLIR to ptoas unchanged", ) - if compiled._module_spec.jit_source is None: + if module_spec.jit_source is None: expect( observation["mlir_text"].count("module") >= 2, f"{label} native build should route the unified outer+child container through ptoas", diff --git a/ptodsl/tests/test_runtime_toolchain.py b/ptodsl/tests/test_runtime_toolchain.py index 49de575e03..bea4a0fcc3 100644 --- a/ptodsl/tests/test_runtime_toolchain.py +++ b/ptodsl/tests/test_runtime_toolchain.py @@ -13,7 +13,7 @@ from pathlib import Path from unittest import mock -from ptodsl._runtime import toolchain +from ptodsl._runtime import native_build, toolchain class RuntimeToolchainTest(unittest.TestCase): @@ -36,6 +36,17 @@ def test_a5_uses_c310_aicore_arch(self): toolchain.aicore_arch_for_kernel_kind("cube", "a5"), "dav-c310-cube" ) + def test_native_launch_flags_use_target_arch(self): + with mock.patch.object(native_build, "common_include_flags", return_value=[]): + self.assertIn( + "--cce-aicore-arch=dav-c220-vec", + native_build._kernel_compile_flags("vector", "a3"), + ) + self.assertIn( + "--cce-aicore-arch=dav-c310-cube", + native_build._kernel_compile_flags("cube", "a5"), + ) + class ResolvePtoasBinaryTests(unittest.TestCase): def test_env_override_wins_over_repo_default(self): diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto index e02ad47e72..37904eb733 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto @@ -12,12 +12,17 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tabs() func.func @lower_tabs() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src = pto.alloc_tile : !pto.tile_buf + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[ROWS:.*]] = arith.constant 2 : index + // CHECK: scf.for {{.*}} to %[[ROWS]] + // CHECK: %[[STRIDE:.*]] = arith.constant 96 : index + // CHECK: arith.muli {{.*}}, %[[STRIDE]] + // CHECK: pto.ub.set_mask {{.*32.*}}, // CHECK: pto.ub.vabs {{%[^ ,]+}}, {{%[^ ,]+}} // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64 // CHECK-NOT: pto.tabs - pto.tabs ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) + pto.tabs ins(%src : !pto.tile_buf) outs(%dst : !pto.tile_buf) return } } diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto index 4eca1a1019..4f6324f22e 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto @@ -20,7 +20,7 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 // CHECK: pto.ub.set_mask_norm - // CHECK: pto.ub.set_mask %c-1_i64, %c0 + // CHECK: pto.ub.set_mask %c-1_i64, %c-1_i64 // CHECK-NOT: scf.for pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto index caa35ef6af..4006a560ab 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto @@ -7,21 +7,21 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin2LNormModeColVLAlign: partial valid columns, VL-aligned. -// 2x128 f32, v_col=32 -> row loop with stride=8, no masking. +// 2x128 f32, v_col=64 -> row loop with no masking. // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_col_vl_align() func.func @lower_tadd_col_vl_align() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src0 = pto.alloc_tile : !pto.tile_buf - %src1 = pto.alloc_tile : !pto.tile_buf + %dst = pto.alloc_tile : !pto.tile_buf + %src0 = pto.alloc_tile : !pto.tile_buf + %src1 = pto.alloc_tile : !pto.tile_buf // CHECK: scf.for // CHECK: pto.addptr // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 // CHECK-NOT: pto.ub.set_mask %c - pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) + pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd return } diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto index 1295dd0852..3b2bf08a85 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto @@ -6,7 +6,7 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Bin1LCountMode: totalRepeats > 255. 16x1024 f32 -> count mode, no scf.for. +// More than 255 repeats must be split into repeat-one chunks on C220. // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { @@ -15,13 +15,16 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[C256:.*]] = arith.constant 256 : index + // CHECK: scf.for {{.*}} to %[[C256]] // CHECK: pto.ub.set_mask_count - // CHECK: pto.ub.set_mask + // CHECK: %[[C64:.*]] = arith.constant 64 : i64 + // CHECK: pto.ub.set_mask %[[C64]], // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 // CHECK: pto.ub.set_mask_norm - // CHECK: pto.ub.set_mask %c-1_i64, %c0 - // CHECK-NOT: scf.for + // CHECK: pto.ub.set_mask %c-1_i64, %c-1_i64 + // CHECK-NOT: pto.ub.vadd {{.*}}%c256_i64 pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd return diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto index f48ea9b87e..13c9be6cea 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto @@ -6,7 +6,7 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Bin2LNormModeRowRpt: 4x96 f32, v_col=32. Count mode (totalV > REPEAT_MAX). +// Bin2LNormModeRowRpt: 4x96 f32 with four valid 32-element rows. // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { @@ -15,10 +15,16 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf - // CHECK: pto.ub.set_mask_count + // CHECK: %[[MASK:.*]] = arith.constant 4294967295 : i64 + // CHECK: pto.ub.set_mask %[[MASK]], + // CHECK: %[[RPT:.*]] = arith.constant 4 : i64 + // CHECK: %[[STRIDE:.*]] = arith.constant 12 : i64 // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: %[[RPT]], + // CHECK-SAME: %[[STRIDE]], %[[STRIDE]], // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - // CHECK: pto.ub.set_mask_norm + // CHECK: pto.ub.set_mask %c-1_i64, %c-1_i64 + // CHECK-NOT: pto.ub.set_mask_count pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd return diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto index 0458bda3fd..a9c385c00b 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto @@ -6,7 +6,7 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// Bin2LNormModeRowRpt: 5x128 f32, v_col=40. headRepeats=3 -> per-row scf.for count mode. +// Bin2LNormModeRowRpt: five valid 40-element rows in a physical 5x128 tile. // RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { @@ -15,11 +15,15 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind %src0 = pto.alloc_tile : !pto.tile_buf %src1 = pto.alloc_tile : !pto.tile_buf - // CHECK: scf.for - // CHECK: pto.ub.set_mask_count + // CHECK: %[[MASK:.*]] = arith.constant 1099511627775 : i64 + // CHECK: pto.ub.set_mask %[[MASK]], + // CHECK: %[[RPT:.*]] = arith.constant 5 : i64 + // CHECK: %[[STRIDE:.*]] = arith.constant 16 : i64 // CHECK: pto.ub.vadd {{%[^,]+}}, {{%[^,]+}}, {{%[^,]+}} + // CHECK-SAME: %[[RPT]], + // CHECK-SAME: %[[STRIDE]], %[[STRIDE]], // CHECK-SAME: : !pto.ptr, !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64, i64 - // CHECK: pto.ub.set_mask_norm + // CHECK: pto.ub.set_mask %c-1_i64, %c-1_i64 pto.tadd ins(%src0, %src1 : !pto.tile_buf, !pto.tile_buf) outs(%dst : !pto.tile_buf) // CHECK-NOT: pto.tadd return diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto index 0b863fcc31..786067edd9 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto @@ -12,13 +12,18 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadds() func.func @lower_tadds() attributes {pto.aicore} { - %dst = pto.alloc_tile : !pto.tile_buf - %src = pto.alloc_tile : !pto.tile_buf + %dst = pto.alloc_tile : !pto.tile_buf + %src = pto.alloc_tile : !pto.tile_buf + // CHECK: %[[ROWS:.*]] = arith.constant 2 : index + // CHECK: scf.for {{.*}} to %[[ROWS]] + // CHECK: %[[STRIDE:.*]] = arith.constant 96 : index + // CHECK: arith.muli {{.*}}, %[[STRIDE]] + // CHECK: pto.ub.set_mask {{.*32.*}}, // CHECK: pto.ub.vadds {{%[^ ,]+}}, {{%[^ ,]+}} // CHECK-SAME: : !pto.ptr, !pto.ptr, i64, i64, i64, i64, i64, i64 // CHECK-NOT: pto.tadds %scalar = arith.constant 3.0 : f32 - pto.tadds ins(%src, %scalar : !pto.tile_buf, f32) outs(%dst : !pto.tile_buf) + pto.tadds ins(%src, %scalar : !pto.tile_buf, f32) outs(%dst : !pto.tile_buf) return } } diff --git a/test/lit/vpto/ub/tile_to_ub/transfer/tload_nonunit_stride.pto b/test/lit/vpto/ub/tile_to_ub/transfer/tload_nonunit_stride.pto new file mode 100644 index 0000000000..46ff480e07 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/transfer/tload_nonunit_stride.pto @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: not ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t 2>&1 | FileCheck %s + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + func.func @tload_nonunit_stride(%src: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c16 = arith.constant 16 : index + %c32 = arith.constant 32 : index + %c64 = arith.constant 64 : index + %view = pto.make_tensor_view %src, shape = [%c16, %c32], strides = [%c64, %c2] + : !pto.tensor_view + %part = pto.partition_view %view, offsets = [%c0, %c0], sizes = [%c16, %c32] + : !pto.tensor_view -> !pto.partition_tensor_view<16x32xf32> + %tile = pto.alloc_tile + : !pto.tile_buf + // CHECK: error: A2/A3 DMA lowering requires a unit innermost stride + pto.tload ins(%part : !pto.partition_tensor_view<16x32xf32>) + outs(%tile : !pto.tile_buf) + return + } +} diff --git a/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto b/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto new file mode 100644 index 0000000000..5dcc6e3e50 --- /dev/null +++ b/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto @@ -0,0 +1,60 @@ +// Copyright (c) 2026 Huawei Technologies Co., Ltd. +// This program is free software, you can redistribute it and/or modify it under the terms and conditions of +// CANN Open Software License Agreement Version 2.0 (the "License"). +// Please refer to the License for details. You may not use this file except in compliance with the License. +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// See LICENSE in the root of the software repository for the full text of the License. + +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=LOAD +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=STORE + +module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { + // LOAD-LABEL: func.func @tload_subview_offset + func.func @tload_subview_offset(%src: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c17 = arith.constant 17 : index + %c32 = arith.constant 32 : index + %c40 = arith.constant 40 : index + %view = pto.make_tensor_view %src, shape = [%c17, %c32], strides = [%c40, %c1] + : !pto.tensor_view + %part = pto.partition_view %view, offsets = [%c1, %c0], sizes = [%c16, %c32] + : !pto.tensor_view -> !pto.partition_tensor_view<16x32xf32> + %tile = pto.alloc_tile + : !pto.tile_buf + pto.tload ins(%part : !pto.partition_tensor_view<16x32xf32>) + outs(%tile : !pto.tile_buf) + // LOAD: %[[ROW_STRIDE:.*]] = arith.constant 160 : i64 + // LOAD: %[[OFFSET:.*]] = arith.constant 160 : index + // LOAD: pto.addptr {{.*}}, %[[OFFSET]] + // LOAD: pto.mte_gm_ub {{.*}}nburst({{.*}}, %[[ROW_STRIDE]], + // LOAD-NOT: pto.tload + return + } + + // STORE-LABEL: func.func @tstore_subview_offset + func.func @tstore_subview_offset(%dst: !pto.ptr) attributes {pto.aicore} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c17 = arith.constant 17 : index + %c32 = arith.constant 32 : index + %c40 = arith.constant 40 : index + %view = pto.make_tensor_view %dst, shape = [%c17, %c32], strides = [%c40, %c1] + : !pto.tensor_view + %part = pto.partition_view %view, offsets = [%c1, %c0], sizes = [%c16, %c32] + : !pto.tensor_view -> !pto.partition_tensor_view<16x32xf32> + %tile = pto.alloc_tile + : !pto.tile_buf + pto.tstore ins(%tile : !pto.tile_buf) + outs(%part : !pto.partition_tensor_view<16x32xf32>) + // STORE: %[[STORE_ROW_STRIDE:.*]] = arith.constant 160 : i64 + // STORE: %[[STORE_OFFSET:.*]] = arith.constant 160 : index + // STORE: pto.addptr {{.*}}, %[[STORE_OFFSET]] + // STORE: pto.mte_ub_gm {{.*}}nburst({{.*}}, {{.*}}, %[[STORE_ROW_STRIDE]]) + // STORE-NOT: pto.tstore + return + } +} diff --git a/tools/ptoas/ptoas.cpp b/tools/ptoas/ptoas.cpp index 7f5dee5c85..1306cc7030 100644 --- a/tools/ptoas/ptoas.cpp +++ b/tools/ptoas/ptoas.cpp @@ -31,6 +31,7 @@ #include #include #include "mlir/Dialect/MemRef/IR/MemRef.h" +#include "mlir/Dialect/MemRef/Transforms/Passes.h" #include "mlir/Dialect/Arith/IR/Arith.h" #include "mlir/Dialect/Arith/Transforms/BufferizableOpInterfaceImpl.h" #include "mlir/Dialect/Tensor/IR/Tensor.h" @@ -2689,8 +2690,12 @@ lowerPTOToVPTOBackend(PassManager &pm, ModuleOp module, kernelModulePM.addNestedPass( pto::createLowerPTOToUBufOpsPass()); - if (isA2A3) + if (isA2A3) { + kernelModulePM.addNestedPass( + memref::createExpandStridedMetadataPass()); + kernelModulePM.addPass(mlir::createCanonicalizerPass()); return; + } kernelModulePM.addPass(pto::createExpandTileOpPass(expandOpts)); @@ -2723,7 +2728,8 @@ buildVPTOEmissionOptions(const pto::CANNVersion &cannVersion, options.targetTriple = "hiipu64-hisilicon-cce"; options.cannVersion = cannVersion; std::string arch = normalizeArch(targetArch); - options.march = isA2A3Arch(arch) ? "dav-c220-vec" : "dav-c310-vec"; + if (isA2A3Arch(arch)) + options.march = "dav-c220-vec"; return options; } @@ -3040,7 +3046,8 @@ int mlir::pto::compilePTOASModule( // PTODSL legality discovery happens on tile-native PTO IR before fusion. // Fusion may later filter the ordered `candidates` array; ExpandTileOp // consumes the first candidate that remains. - if (expandOptions && expandOptions->tileLibBackend == "ptodsl") { + if (!isA2A3 && expandOptions && + expandOptions->tileLibBackend == "ptodsl") { auto insertOptions = buildInsertTemplateAttributesOptions(*expandOptions); pm.addPass( From 4d106d66c8cb2d4249092f77846e69e9f663f977 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 16 Jul 2026 11:15:07 +0200 Subject: [PATCH 27/29] test(vpto): avoid CANN dependency in IR lit tests --- test/lit/vpto/ub/a5/copy_gm_ub.pto | 2 +- test/lit/vpto/ub/a5/copy_ub_gm.pto | 2 +- test/lit/vpto/ub/a5/lower_tadd_noop.pto | 2 +- test/lit/vpto/ub/a5/mte_gm_ub.pto | 2 +- test/lit/vpto/ub/a5/set_mask_noop.pto | 2 +- test/lit/vpto/ub/a5/ub_vadd_noop.pto | 2 +- test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto | 2 +- test/lit/vpto/ub/round_trip/binary_ops.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto | 2 +- .../vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto | 2 +- .../vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto | 2 +- .../lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto | 2 +- .../ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto | 2 +- .../vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto | 2 +- test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto | 2 +- .../vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto | 4 ++-- test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto | 6 +++--- test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto | 2 +- test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto | 2 +- 60 files changed, 63 insertions(+), 63 deletions(-) diff --git a/test/lit/vpto/ub/a5/copy_gm_ub.pto b/test/lit/vpto/ub/a5/copy_gm_ub.pto index f5e2ad0851..cc02f181b2 100644 --- a/test/lit/vpto/ub/a5/copy_gm_ub.pto +++ b/test/lit/vpto/ub/a5/copy_gm_ub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A5 regression: copy_gm_to_ubuf uses .DV intrinsics. -// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @copy_gm_ub_a5_f32_mix_aiv( diff --git a/test/lit/vpto/ub/a5/copy_ub_gm.pto b/test/lit/vpto/ub/a5/copy_ub_gm.pto index b98f3e17fd..52750a340f 100644 --- a/test/lit/vpto/ub/a5/copy_ub_gm.pto +++ b/test/lit/vpto/ub/a5/copy_ub_gm.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A5 regression: copy_ubuf_to_gm uses .DV intrinsics. -// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @copy_ub_gm_a5_f32_mix_aiv( diff --git a/test/lit/vpto/ub/a5/lower_tadd_noop.pto b/test/lit/vpto/ub/a5/lower_tadd_noop.pto index b23f44ffa7..3a0f3f5766 100644 --- a/test/lit/vpto/ub/a5/lower_tadd_noop.pto +++ b/test/lit/vpto/ub/a5/lower_tadd_noop.pto @@ -9,7 +9,7 @@ // A5: pto.tadd is NOT lowered by LowerPTOToUBufOps. Instead it goes through // ExpandTileOp -> vecscope/vadd TileLang path. // RUN: ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto --enable-tile-op-expand %s -o - 2>/dev/null | FileCheck %s --check-prefix=VPTO -// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s --check-prefix=LLVM +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s --check-prefix=LLVM module attributes {pto.kernel_kind = #pto.kernel_kind} { func.func @lower_tadd_a5() attributes {pto.aicore} { diff --git a/test/lit/vpto/ub/a5/mte_gm_ub.pto b/test/lit/vpto/ub/a5/mte_gm_ub.pto index 549d32aa10..22b9415fa0 100644 --- a/test/lit/vpto/ub/a5/mte_gm_ub.pto +++ b/test/lit/vpto/ub/a5/mte_gm_ub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A5 regression: mte_gm_ub uses .DV intrinsics. -// RUN: ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @mte_gm_ub_a5_f32_mix_aiv( diff --git a/test/lit/vpto/ub/a5/set_mask_noop.pto b/test/lit/vpto/ub/a5/set_mask_noop.pto index 574d2a98b7..4a749b1afb 100644 --- a/test/lit/vpto/ub/a5/set_mask_noop.pto +++ b/test/lit/vpto/ub/a5/set_mask_noop.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A5: pto.ub.set_mask is NOT lowered to MOVEMASK on a5 targets. -// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { func.func @set_mask_a5_noop() attributes {pto.aicore} { diff --git a/test/lit/vpto/ub/a5/ub_vadd_noop.pto b/test/lit/vpto/ub/a5/ub_vadd_noop.pto index eaeb910d5f..fab3eb7b7a 100644 --- a/test/lit/vpto/ub/a5/ub_vadd_noop.pto +++ b/test/lit/vpto/ub/a5/ub_vadd_noop.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A5: pto.ub.vadd is NOT lowered to llvm.hivm.VADD on a5 targets. -// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// RUN: ( ptoas --pto-arch=a5 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a5", pto.kernel_kind = #pto.kernel_kind} { func.func @ub_vadd_noop(%dst: !pto.ptr, %src0: !pto.ptr, %src1: !pto.ptr) attributes {pto.aicore} { diff --git a/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto b/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto index bdadcef267..d0acdb26cc 100644 --- a/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto +++ b/test/lit/vpto/ub/planned_addresses/txor_planned_addr.pto @@ -10,7 +10,7 @@ // (including TXOR's tmp scratch tile) by PTOPlanMemory before LowerPTOToUBufOps. // The addresses should be compact (256-byte aligned, not 64 KiB spaced). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-materialize-tile-handles 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-materialize-tile-handles 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @txor_planned_addr() diff --git a/test/lit/vpto/ub/round_trip/binary_ops.pto b/test/lit/vpto/ub/round_trip/binary_ops.pto index 70b0b3f5ca..33dfbccb33 100644 --- a/test/lit/vpto/ub/round_trip/binary_ops.pto +++ b/test/lit/vpto/ub/round_trip/binary_ops.pto @@ -8,7 +8,7 @@ // Round-trip (parse -> print) tests for all 7 binary UB elementwise ops. // Verifies op mnemonic, operand order, and type annotation survive parsing. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=vpto-split-cv-module 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=vpto-split-cv-module 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @rt_vmax diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto index 37904eb733..03254be491 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tabs.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // tabs -> pto.ub.vabs lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tabs() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto index 80871ff656..fc084e6e37 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_a2.pto @@ -6,7 +6,7 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ptoas --pto-arch=a2 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a2 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a2", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_a2() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto index 4f6324f22e..cdf8f5e73b 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin1LCountMode: nonVLAligned + totalRepeats > 255. 41x200 f32 -> count mode. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_chunked() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto index 6336626044..fd2504a209 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_chunked_tail.pto @@ -8,7 +8,7 @@ // Non-epr-aligned 41x200 f32: routed through modeNorm1L with loop+tail. // headRepeats=128 (8200/64), tailElements=8 (8200%64). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_chunked_tail() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto index 4006a560ab..fe748b1f2b 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_col_vl_align.pto @@ -8,7 +8,7 @@ // Bin2LNormModeColVLAlign: partial valid columns, VL-aligned. // 2x128 f32, v_col=64 -> row loop with no masking. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_col_vl_align() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto index 7df4b5ca44..1ddc71577c 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin1LCountMode: 7x48 f32, headRepeats>1 -> per-row scf.for. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_count() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto index 3b2bf08a85..30a5936e11 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_large.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // More than 255 repeats must be split into repeat-one chunks on C220. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_count_large() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto index f4df5fbb14..c31ccf547c 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_count_nonaligned.pto @@ -8,7 +8,7 @@ // Non-epr-aligned shape: 1x200 f32 routed through modeNorm1L with loop+tail. // headRepeats=3 (200/64), tailElements=8 (200%64). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @tadd_count_nonaligned() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto index 83e0ea6a72..df9c9b2864 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_flat.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin1LNormMode: 4x32 f32. headRepeats>1 -> per-row scf.for. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_flat() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto index 7ee15d7b0f..71a4726b81 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_multi_row.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tadd -> ub.vadd lowering for a multi-row tile (4x64 f32). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_f32_multi_row() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto index 13c9be6cea..5b561f584e 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin2LNormModeRowRpt: 4x96 f32 with four valid 32-element rows. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_row_rpt() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto index a9c385c00b..2398b65bea 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_row_rpt_tail.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin2LNormModeRowRpt: five valid 40-element rows in a physical 5x128 tile. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_row_rpt_tail() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto index a04dd86c33..07321dbde0 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_single_row.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tadd -> ub.vadd lowering for a single-row tile (1x64 f32). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_f32_single_row() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto index cca724b87e..d627676ac3 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_small.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin1LNormModeSmall: 2x32 f32, v_col=8. vRows>1 -> per-row scf.for count mode. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_small() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto index 94a2a03ba2..103ccc431a 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadd_tail.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // Bin1LCountMode: 7x48 f32, headRepeats>1 -> per-row scf.for. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadd_tail() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto index 36e1051529..543584a4c7 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/taddrelu.pto @@ -6,7 +6,7 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_taddrelu() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto index 786067edd9..eee41c03ba 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tadds.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // tadds -> pto.ub.vadds lowering (scalar-tile add). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tadds() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto index f435a0b29e..4651071faf 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tand.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tand -> ub.vand lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tand() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto index 2e9b584ece..82f3725e6d 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tdiv.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tdiv -> ub.vdiv lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tdiv_f32() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto index b6aca160dc..ecaeecdfbf 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tlog.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // tlog -> pto.ub.vln lowering, matching A2/A3 TLOG_IMPL through vln. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tlog() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto index c197ad43c5..a9f585b7e3 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_multi_row.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tmax -> ub.vmax lowering for a multi-row tile. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_f32_multi_row() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto index 26295a5feb..3fecb9c8d9 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmax_single_row.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tmax -> ub.vmax lowering for a single-row tile. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_f32_single_row() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto index a334ef886b..002f9ee739 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmin.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tmin -> ub.vmin lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_f32() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto index ba60ef6fe3..aa7ff20639 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmul.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tmul -> ub.vmul lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tmul_f32() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto index e053d72b8a..764d68f473 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tmuls.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // tmuls -> pto.ub.vmuls lowering (scalar-tile multiply). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tmuls() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto index 228294d976..a50f6b2d81 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tneg.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // tneg -> pto.ub.vmuls(dst, src, -1) decomposition (no native VNEG on C220). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tneg() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto index 196ce156c8..c32ed6e8fc 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tor.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tor -> ub.vor lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tor() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto index 59d6abec97..6159e9b1e7 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/trecip.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // trecip -> vector_dup(dst, 1) + vdiv(dst, dst, src), matching PTO-ISA TRECIP as TDIVS(dst, 1, src). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_trecip() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto index 8f722c029b..5930736bae 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/trelu.pto @@ -7,7 +7,7 @@ // See LICENSE in the root repository for the full text of the License. // trelu -> pto.ub.vrelu lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o /dev/null --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_trelu() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto index 66bed2958a..ef9e963a3e 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshl.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tshls -> ub.vshl lowering (scalar shift distance). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tshls() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto index ff2a275d57..5e1fb2e521 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tshr.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tshrs -> ub.vshr lowering (scalar shift distance). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tshrs() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto index 80757c171b..8cf178fd97 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/tsub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // tsub -> ub.vsub lowering. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_tsub_f32() diff --git a/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto index e38d05739c..303a5063d6 100644 --- a/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto +++ b/test/lit/vpto/ub/tile_to_ub/elementwise/txor.pto @@ -8,7 +8,7 @@ // txor -> De Morgan decomposition: vor(tmp) + vand(dst) + vnot(dst) + vand(dst,tmp). // The PIPE_V barriers mirror CANN TXOR_IMPL dependencies between these vector ops. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=pto-lower-to-ubuf-ops 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: func.func @lower_txor() diff --git a/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto b/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto index 5dcc6e3e50..b15cc0ce1c 100644 --- a/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto +++ b/test/lit/vpto/ub/tile_to_ub/transfer/tload_subview_offset.pto @@ -6,8 +6,8 @@ // INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. // See LICENSE in the root of the software repository for the full text of the License. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=LOAD -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=STORE +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=LOAD +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=expand-strided-metadata 2>&1 | FileCheck %s --check-prefix=STORE module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // LOAD-LABEL: func.func @tload_subview_offset diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto index c93de19746..6e36d9ff19 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/bitwise.pto @@ -9,7 +9,7 @@ // pto.ub.vand/vor -> llvm.hivm.VAND/VOR.s16. // pto.ub.vshl -> llvm.hivm.VSHL.u16 (4-arg: dst, src, shiftDist, config). // pto.ub.vshr -> llvm.hivm.VSHR.u16 (5-arg: dst, src, shiftDist, config, round=0). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vand_s16_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto index 8cee04be3e..99f0a2066f 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_dtypes.pto @@ -9,7 +9,7 @@ // pto.ub.vadd -> llvm.hivm.VADD.* for s16, f16, s32, f32. // Verifies: intrinsic suffix per dtype, pointer operand wiring, SIMD flag (bit 56), // and 8-bit field mask (255) in the packed config word. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vadd_s16_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto index 91133d0676..31f356d91a 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vadd_packed.pto @@ -9,7 +9,7 @@ // Verify A3/HVVM byte packing for VADD config word: // repeat[7:0], dstBlk[15:8], src0Blk[23:16], src1Blk[31:24], // dstRep[39:32], src0Rep[47:40], src1Rep[55:48], simdFlag[63:56]=1. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vadd_packed_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto index 34a923d908..a25cfa296a 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vaddrelu.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vaddrelu -> llvm.hivm.VADDRELU.* for the C220-supported dtypes. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vaddrelu_s16_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto index f01614b279..86b176ab7f 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdiv.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vdiv -> llvm.hivm.VDIV.f32. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @vdiv_llvm_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto index 317fb0d507..3ddaeca26a 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vdup.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vdup -> llvm.hivm.MOVEV.u32. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @vdup_llvm_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto index 7cc249dcae..6ccd8ea533 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vln.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vln -> llvm.hivm.VLN.f32. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @vln_llvm_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto index 3d479ba05d..b77160e07e 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmax_vmin.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vmax/vmin -> llvm.hivm.VMAX/VMIN.* for f32, f16. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @ub_vmax_f32_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto index e2d733bdd0..a59af5d18c 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vmul.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vmul -> llvm.hivm.VMUL.f32. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @vmul_llvm_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto b/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto index 1448e1debf..30aab2eaa6 100644 --- a/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto +++ b/test/lit/vpto/ub/ub_to_llvm/elementwise/vsub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // pto.ub.vsub -> llvm.hivm.VSUB.f32. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @vsub_llvm_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto index 3d8cbea536..2fed547634 100644 --- a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_count.pto @@ -8,9 +8,9 @@ // pto.ub.set_mask_count -> SBITSET1 + SET.CTL on bit 56 (count mode). // pto.ub.set_mask_norm -> SBITSET0 + SET.CTL on bit 56 (normal mode). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=COUNT -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=NORM -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=SEQ +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=COUNT +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=NORM +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s --check-prefix=SEQ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { func.func @set_mask_count_llvm() attributes {pto.aicore} { diff --git a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto index c63911f451..a7b6fdc4e9 100644 --- a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_full.pto @@ -8,7 +8,7 @@ // pto.ub.set_mask with full mask (-1) -> two MOVEMASK calls (index 0 then 1). // Verifies: mask value reaches both calls, index ordering 0->1. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @set_mask_full_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto index c5422a8d73..5cf3225152 100644 --- a/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto +++ b/test/lit/vpto/ub/ub_to_llvm/mask/set_mask_tail.pto @@ -8,7 +8,7 @@ // pto.ub.set_mask with partial mask (hi=0, lo=16) -> two MOVEMASK calls. // Verifies: distinct mask values reach correct call, index ordering 0->1. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @set_mask_tail_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto index cb86704a0d..6207774022 100644 --- a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A3: copy_gm_to_ubuf without padding -> llvm.hivm.MOV.OUT.TO.UB.v220. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @copy_gm_ub_a3_nopad_f32_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto index dabdac2bde..2cf731680b 100644 --- a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_gm_ub_pad.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A3: copy_gm_to_ubuf with padding -> llvm.hivm.MOV.OUT.TO.UB.ALIGN.V2.f32 (4-arg call). -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @copy_gm_ub_a3_pad_f32_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto index f4d8272217..30e1050073 100644 --- a/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/copy_ub_gm.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A3: copy_ubuf_to_gm -> llvm.hivm.MOV.UB.TO.OUT.v220.1 (3-arg call). -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @copy_ub_gm_a3_f32_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto index fa22014bfa..52ff653304 100644 --- a/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A3: mte_gm_ub without padding -> llvm.hivm.MOV.OUT.TO.UB.v220. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @mte_gm_ub_a3_nopad_f32_mix_aiv( diff --git a/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto index 1b615aa0fa..d884262701 100644 --- a/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto +++ b/test/lit/vpto/ub/ub_to_llvm/transfer/mte_gm_ub_pad.pto @@ -7,7 +7,7 @@ // See LICENSE in the root of the software repository for the full text of the License. // A3: mte_gm_ub with padding -> SET.MOV.PAD.VAL + MOV.OUT.TO.UB.ALIGN.V2.f32. -// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s +// RUN: ( ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto-llvm-ir %s -o %t --mlir-print-ir-after=convert-func-to-llvm 2>&1 || true ) | FileCheck %s module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { // CHECK-LABEL: llvm.func @mte_gm_ub_a3_pad_f32_mix_aiv( From a29fe7a34b101837362f4a758549752abbf1e810 Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 16 Jul 2026 13:08:49 +0200 Subject: [PATCH 28/29] ci: limit wheel build parallelism --- .github/workflows/build_wheel.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wheel.yml b/.github/workflows/build_wheel.yml index f006bd2881..e2973bb4ae 100644 --- a/.github/workflows/build_wheel.yml +++ b/.github/workflows/build_wheel.yml @@ -165,11 +165,10 @@ jobs: key: llvm-${{ steps.llvm-source.outputs.sha }}-manylinux_2_34-${{ matrix.arch }}-${{ matrix.python }}-${{ env.LLVM_CACHE_FLAVOR }} - name: Build PTOAS + env: + CMAKE_BUILD_PARALLEL_LEVEL: "2" run: | export PATH="${PY_PATH}/bin:$PATH" - if [ "${{ matrix.arch }}" = "aarch64" ]; then - export CMAKE_BUILD_PARALLEL_LEVEL=2 - fi PTOAS_RELEASE_VERSION_OVERRIDE="${PTOAS_VERSION}" \ pip install . --no-build-isolation From e3d4462c2d2f4aec783e85303a22e7c1c6aaddbb Mon Sep 17 00:00:00 2001 From: Giacomo Castiglioni Date: Thu, 16 Jul 2026 14:27:24 +0200 Subject: [PATCH 29/29] test(vpto): make wrapper expansion checks order-independent --- .../tile_to_ub/transfer/mte_gm_ub_expand.pto | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto b/test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto index a6941801db..a2ca92bbd3 100644 --- a/test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto +++ b/test/lit/vpto/ub/tile_to_ub/transfer/mte_gm_ub_expand.pto @@ -9,7 +9,8 @@ // A3: mte_gm_ub → copy_gm_to_ubuf expansion (before LLVM lowering) // Verifies that on A2A3, no SET.LOOP HW config ops are emitted — all loops use scf.for. -// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto --mlir-print-ir-after=vpto-expand-wrapper-ops %s -o /dev/null 2>&1 | FileCheck %s +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto --mlir-print-ir-after=vpto-expand-wrapper-ops %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=BASIC +// RUN: ptoas --pto-arch=a3 --pto-backend=vpto --emit-vpto --mlir-print-ir-after=vpto-expand-wrapper-ops %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=LOOPS module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind} { func.func @mte_gm_ub_a3_expand(%arg0: !pto.ptr) attributes {pto.aicore} { @@ -35,13 +36,13 @@ module attributes {pto.target_arch = "a3", pto.kernel_kind = #pto.kernel_kind