logo资料库

neon 内部函数指令集.pdf

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
初始化寄存器 vcreate_type: 将一个 64bit 的数据装入 vector 中,并返回元素类型为 type 的 vector。r=a vdup_n_type/vmov_n_type: 用类型为 type 的数值,初始化一个元素类型为 type 的新 vector 的所有元素。ri=a vdupq_n_type/vmovq_n_type: vdup_lane_type: 用元素类型为 type 的 vector 的某个元素,初始化一个元素类型为 type 的新 vector 的所有元素。ri=a[b] vdupq_lane_type: vmovl_type: 将 vector 的元素 bit 位扩大到原来的两倍,元素值不变。 vmovn_type: 用旧 vector 创建一个新 vector,新 vector 的元素 bit 位是旧 vector 的一半。新 vector 元素只保留旧 vector 元素的低半部分。 vqmovn_type: 用旧 vector 创建一个新 vector,新 vector 的元素 bit 位是旧 vector 的一半。如 果旧 vector 元素的值超过新 vector 元素的最大值,则新 vector 元素就取最大值。否则新 vector 元素就等于旧 vector 元素的值。 vqmovun_type: 作用与 vqmovn_type 类似,但它输入的是有符号 vector,输出的是无符号 vector。 从内存加载数据进 neon 寄存器 vld1_type: 按顺序将内存的数据装入 neon 寄存器,并返回元素类型为 type 格式的 vector vld1q_type: vld1_lane_type:用旧 vector 创建一个同类型的新 vector,同时将新 vector 中指定元素的值改 为内存中的值。 vld1q_lane_type: vld1_dup_type:用 type 类型的内存中第一个值,初始化一个元素类型为 type 的新 vector 的 所有元素。 vld1q_dup_type: vld2_type: 按交叉顺序将内存的数据装入 2 个 neon 寄存器(内存第 1 个数据放入第 1 个 neon 寄存器的第 1 个通道,内存第 2 个数据放入第 2 个 neon 寄存器的第 1 个通道,内存第 3 个数 据放入第 1 个 neon 寄存器的第 2 个通道,内存第 4 个数据放入第 2 个 neon 寄存器的第 2 个通 道。。。)。并返回有两个 vector 的结构体
vld2q_type: vld2_lane_type: vld2q_lane_type: vld2_dup_type: 用 type 类型的内存中第一个值,初始化第一个新 vector 的所有元素,用内存 中第二个值,初始化第二个新 vector 的所有元素。 vld3_type: 交叉存放,本质上与 vld2_type 类似,只是这里装载 3 个 neon 寄存器 vld3q_type: vld3_lane_type: vld3q_lane_type: vld3_dup_type: 本质上与 vld2_dup_type 类似 vld4_type: 交叉存放,本质上与 vld2_type 类似,只是这里装载 4 个 neon 寄存器 vld4q_type: vld4_lane_type: vld4q_lane_type: vld4q_dup_type: 本质上与 vld2_dup_type 类似 从 neon 寄存器加载数据进内存 vst1_type: 将元素类型为 type 格式的 vector 的所有元素装入内存 vst1q_type: vst1_lane_type: 将元素类型为 type 格式的 vector 中指定的某个元素装入内存 vst1q_lane_type: vst2_type: 交叉存放,vld2_type 的逆过程 vst2q_type: vst2_lane_type: vst2q_lane_type: vst3_type: 交叉存放,vld3_type 的逆过程 vst3q_type: vst3_lane_type: vst3q_lane_type: vst4_type: 交叉存放,vld4_type 的逆过程 vst4q_type:
vst4_lane_type: vst4q_lane_type: 直接获取 neon 寄存器某个通道的值 vget_low_type: 获取 128bit vector 的低半部分元素,输出的是元素类型相同的 64bit vector。 vget_high_type: 获取 128bit vector 的高半部分元素,输出的是元素类型相同的 64bit vector。 vget_lane_type: 获取元素类型为 type 的 vector 中指定的某个元素值。 vgetq_lane_type: 直接设置 neon 寄存器某个通道的值 vset_lane_type: 设置元素类型为 type 的 vector 中指定的某个元素的值,并返回新 vector。 vsetq_lane_type: 寄存器数据重排 vext_type: 取第 2 个输入 vector 的低 n 个元素放入新 vector 的高位,新 vector 剩下的元素取 自第 1 个输入 vector 最高的几个元素(可实现 vector 内元素位置的移动) vextq_type: 如:src1 = {1,2,3,4,5,6,7,8} src2 = {9,10,11,12,13,14,15,16} dst = vext_type(src1,src2,3)时,则 dst = {4,5,6,7,8, 9,10,11} vtbl1_type: 第二个 vector 是索引,根据索引去第一个 vector(相当于数组)中搜索相应的 元素,并输出新的 vector,超过范围的索引返回的是 0. 如:src1 = {1,2,3,4,5,6,7,8}
src2 = {0,0,1,1,2,2,7,8} dst = vtbl1_u8(src1,src2)时,则 dst = {1,1,2,2,3,3,8,0} vtbl2_type: 数组长度扩大到 2 个 vector 如:src.val[0] = {1,2,3,4,5,6,7,8} src.val[1] = {9,10,11,12,13,14,15,16} src2 = {0,0,1,1,2,2,8,10} dst = vtbl2_u8(src,src2)时,则 dst = {1,1,2,2,3,3,9,11} vtbl3_type: vtbl4_type: vtbx1_type: 根 vtbl1_type 功能一样,不过搜索到的元素是用来替换第一个 vector 中的元 素,并输出替换后的新 vector,当索引超出范围时,则不替换第一个 vector 中相应的元素。 vtbx2_type: vtbx3_type: vtbx4_type: vrev16_type: 将 vector 中的元素位置反转 vrev16q_type: 如:src1 = {1,2,3,4,5,6,7,8} dst = vrev16_u8(src1)时,则 dst = {2,1,4,3,6,5,8,7} vrev32_type: vrev32q_type: 如:src1 = {1,2,3,4,5,6,7,8} dst = vrev32_u8(src1)时,则 dst = {4,3,2,1,8,7,6,5} vrev64_type: vrev64q_type: 如:src1 = {1,2,3,4,5,6,7,8} dst = vrev32_u8(src1)时,则 dst = {8,7,6,5,4,3,2,1} vtrn_type: 将两个输入 vector 的元素通过转置生成一个有两个 vector 的矩阵 vtrnq_type:
如:src.val[0] = {1,2,3,4,5,6,7,8} src.val[1] = {9,10,11,12,13,14,15,16} dst = vtrn_u8(src.val[0], src.val[1])时, 则 dst.val[0] = {1,9, 3,11,5,13,7,15} dst.val[1] = {2,10,4,12,6,14,8,16} vzip_type: 将两个输入 vector 的元素通过交叉生成一个有两个 vector 的矩阵 vzipq_type: 如:src.val[0] = {1,2,3,4,5,6,7,8} src.val[1] = {9,10,11,12,13,14,15,16} dst = vzip_u8(src.val[0], src.val[1])时, 则 dst.val[0] = {1,9, 2,10,3,11,4,12} dst.val[1] = {5,13,6,14,7,15,8,16} vuzp_type: 将两个输入 vector 的元素通过反交叉生成一个有两个 vector 的矩阵(通过这 个可实现 n-way 交织) vuzpq_type: 如:src.val[0] = {1,2,3,4,5,6,7,8} src.val[1] = {9,10,11,12,13,14,15,16} dst = vuzp_u8(src.val[0], src.val[1])时, 则 dst.val[0] = {1,3,5,7,9, 11,13,15} dst.val[1] = {2,4,6,8,10,12,14,16} vcombine_type: 将两个元素类型相同的输入 vector 拼接成一个同类型但大小是输入 vector 两倍的新 vector。新 vector 中低部分元素存放的是第一个输入 vector 元素。 vbsl_type:按位选择,参数为(mask, src1, src2)。mask 的某个 bit 为 1,则选择 src1 中对 应的 bit,为 0,则选择 src2 中对应的 bit。 vbslq_type: 加法 vadd_type: ri = ai + bi vaddq_type:
vaddl_type: 变长加法运算,为了防止溢出 vaddw_type: 第一个 vector 元素宽度大于第二个 vector 元素 vaddhn_type: 结果 vector 元素的类型大小是输入 vector 元素的一半 vqadd_type: ri = sat(ai + bi) 饱和指令,相加结果超出元素的最大值时,元素就取最大值。 vqaddq_type: vhadd_type: 相加结果再除 2。ri = (ai + bi) >> 1; vhaddq_type: vrhadd_type: 相加结果再除 2(四舍五入)。ri = (ai + bi + 1) >> 1 vrhaddq_type: vpadd_type: r0 = a0 + a1, ..., r3 = a6 + a7, r4 = b0 + b1, ..., r7 = b6 + b7 vpaddl_type: r0 = a0 + a1, ..., r3 = a6 + a7; vpaddlq_type: vpadal_type: r0 = a0 + (b0 + b1), ..., r3 = a3 + (b6 + b7); 减法 vsub_type: ri = ai - bi vsubq_type: vsubl_type: vsubw_type: vsubhn_type: vqsub_type: 饱和指令 ri = sat(ai - bi) vqsubq_type: vhsub_type: 相减结果再除 2。ri = (ai - bi) >> 1 vhsubq_type: vrsubhn_type: 相减结果再除 2(四舍五入)。ri = (ai - bi + 1) >> 1 乘法
vmul_type: ri = ai * bi vmulq_type: vmul_n_type: ri = ai * b vmulq_n_type: vmul_lane_type: ri = ai * b[c] vmulq_lane_type: vmull_type: 变长乘法运算,为了防止溢出 vmull_n_type: vmull_lane_type: vqdmull_type: 变长乘法运算,参与运算的值是有符号数(所以可能溢出),当结果溢出时,取 饱和值 vqdmull_n_type: vqdmull_lane_type: vqdmulh_type: vqdmulhq_type: vqdmulh_n_type: vqdmulhq_n_type: vqdmulh_lane_type: vqdmulhq_lane_type: vqrdmulh_type: vqrdmulhq_type: vqrdmulh_n_type: vqrdmulhq_n_type: vqrdmulh_lane_type: vqrdmulhq_lane_type: 乘加组合运算 vmla_type: ri = ai + bi * ci vmlaq_type: vmla_n_type: ri = ai + bi * c
vmlaq_n_type: vmla_lane_type: ri = ai + bi * c[d] vmlaq_lane_type: vmlal_type: 长指令 ri = ai + bi * ci vmlal_n_type: vmlal_lane_type: vfma_f32:ri = ai + bi * ci 在加法之前,bi、ci 相乘的结果不会被四舍五入 vqdmlal_type: ri = sat(ai + bi * ci) bi/ci 的元素大小是 ai 的一半 vqdmlal_n_type: ri = sat(ai + bi * c) vqdmlal_lane_type: ri = sat(ai + bi * c[d]) 乘减组合运算 vmls_type: ri = ai - bi * ci vmlsq_type: vmls_n_type: ri = ai - bi * c vmlsq_n_type: vmls_lane_type: ri = ai - bi * c[d] vmlsq_lane_type: vmlsl_type: 长指令 ri = ai - bi * ci vmlsl_n_type: vmlsl_lane_type: vfms_f32:ri = ai - bi * ci 在减法之前,bi、ci 相乘的结果不会被四舍五入 vqdmlsl_type: ri = sat(ai - bi * ci) bi/ci 的元素大小是 ai 的一半 vqdmlsl_n_type: ri = sat(ai - bi * c) vqdmlsl_lane_type: ri = sat(ai - bi * c[d]) 取整 vrndn_f32: to nearest, ties to even vrndqn_f32:
分享到:
收藏