ARM CPU的 intrinsics指令集 - svand_u8_z

在 ARM SVE(Scalable Vector Extension) intrinsics 指令集中,svand_u8_z 是带掩码的向量按位与(AND)操作指令,用于对两个无符号 8 位整数(uint8_t)向量执行按位与运算,并通过掩码(predicate)控制结果的有效性。其名称中的 “z” 表示 “zeroing”(清零模式),即掩码为0的位置结果会被清零。

基本语法

svuint8_t svand_u8_z(
    svbool_t pg,               // 掩码:控制哪些元素参与运算并保留结果
    svuint8_t op1,             // 第一个操作数向量(无符号8位整数)
    svuint8_t op2              // 第二个操作数向量(无符号8位整数)
);

参数说明

  1. pg(predicate mask)
    类型为 svbool_t 的掩码向量,决定运算的有效范围:
    • 掩码位为1的位置:执行 op1[i] & op2[i](按位与),并保留结果;
    • 掩码位为0的位置:结果直接清零(0),不参与运算。
  2. op1 和 op2
    类型为 svuint8_t 的向量,存储待执行按位与运算的无符号 8 位整数元素。两个向量的长度需与当前硬件的 SVE 向量宽度一致(由硬件决定)。

核心功能

svand_u8_z 的核心是对两个向量的对应元素执行按位与运算,并根据掩码筛选有效结果,掩码无效位置直接输出0。按位与运算的逻辑为:当两个操作数的对应 bit 都为1时,结果 bit 为1,否则为0(例如 0b1010 & 0b1100 = 0b1000)。

 

  • 示例:
    若 op1 = [0x0F, 0xF0, 0xAA, 0x55]op2 = [0xF0, 0x0F, 0x55, 0xAA]
    掩码 pg = [1, 1, 0, 1](仅第 0、1、3 位有效),
    则运算结果为 [0x00, 0x00, 0x00, 0x00](逐元素计算 op1 & op2 后,掩码为0的位置清零)。

使用场景与示例

按位与操作常用于数据掩码提取、位域筛选、清零特定 bit等场景。例如,从字节数据中提取低 4 位(忽略高 4 位):
#include <arm_sve.h>
#include <stdint.h>

// 提取字节数组中每个元素的低4位(高4位清零)
void extract_low_nibble(uint8_t* dst, const uint8_t* src, size_t len) {
    // 掩码值:0x0F(二进制00001111),用于提取低4位
    svuint8_t mask = svdup_u8(0x0F); // 将0x0F广播到整个向量
    
    size_t i = 0;
    svcount_t vl = svcntb(); // 获取8位元素的向量长度(如16)
    svbool_t pg = svwhilelt_b8(i, len); // 生成初始掩码(标记有效元素)
    
    while (svptest_any(svptrue_b8(), pg)) {
        // 加载源数据向量
        svuint8_t src_vec = svld1_u8(pg, src + i);
        
        // 按位与运算:src_vec & mask,提取低4位,掩码外元素清零
        svuint8_t dst_vec = svand_u8_z(pg, src_vec, mask);
        
        // 存储结果到目标数组
        svst1_u8(pg, dst + i, dst_vec);
        
        // 更新循环变量和掩码
        i += vl;
        pg = svwhilelt_b8(i, len);
    }
}

// 调用示例:
// uint8_t src[] = {0xAB, 0xCD, 0xEF, 0x12}; // 二进制:10101011, 11001101, 11101111, 00010010
// uint8_t dst[4];
// extract_low_nibble(dst, src, 4); // 结果:[0x0B, 0x0D, 0x0F, 0x02](低4位保留)

关键注意事项

  1. 清零模式(z的含义)
    指令名称中的 “z” 表示当掩码位为0时,结果会被强制清零(zeroed)。这与不带 “z” 的指令(如svand_u8)不同:后者在掩码为0时会保留第一个操作数(op1)的原始值,而svand_u8_z 会直接输出0
  2. 向量长度适配
    SVE 向量长度由硬件决定(如 128 位、256 位等),svand_u8_z 会自动适配当前长度,对向量中的所有元素并行执行按位与操作,无需手动处理不同硬件的差异。
  3. 性能优势
    相比标量循环逐个执行按位与,svand_u8_z 利用 SIMD 并行性,一次操作处理多个字节(如 16 个字节),大幅提升数据处理效率,尤其适合图像像素处理、数据加密、位运算密集型场景。

总结

svand_u8_z 是 SVE 中用于带掩码的向量按位与运算的指令,核心功能是对两个无符号 8 位向量执行按位与,并通过掩码控制有效结果(无效位置清零)。它在数据位域提取、掩码操作等场景中应用广泛,是利用 SVE 向量并行性提升位运算性能的重要工具。
posted @ 2025-08-13 14:38  lvmxh  阅读(23)  评论(0)    收藏  举报