在 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位整数) );
参数说明
-
pg(predicate mask)
类型为svbool_t的掩码向量,决定运算的有效范围:- 掩码位为
1的位置:执行op1[i] & op2[i](按位与),并保留结果; - 掩码位为
0的位置:结果直接清零(0),不参与运算。
- 掩码位为
-
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位保留)
关键注意事项
-
清零模式(
z的含义)
指令名称中的 “z” 表示当掩码位为0时,结果会被强制清零(zeroed)。这与不带 “z” 的指令(如svand_u8)不同:后者在掩码为0时会保留第一个操作数(op1)的原始值,而svand_u8_z会直接输出0。 -
向量长度适配
SVE 向量长度由硬件决定(如 128 位、256 位等),svand_u8_z会自动适配当前长度,对向量中的所有元素并行执行按位与操作,无需手动处理不同硬件的差异。 -
性能优势
相比标量循环逐个执行按位与,svand_u8_z利用 SIMD 并行性,一次操作处理多个字节(如 16 个字节),大幅提升数据处理效率,尤其适合图像像素处理、数据加密、位运算密集型场景。
总结
svand_u8_z 是 SVE 中用于带掩码的向量按位与运算的指令,核心功能是对两个无符号 8 位向量执行按位与,并通过掩码控制有效结果(无效位置清零)。它在数据位域提取、掩码操作等场景中应用广泛,是利用 SVE 向量并行性提升位运算性能的重要工具。