问询Clang内置函数__builtin_neon_vqtbl4q_v的参数差异及用法
关于Clang内置函数__builtin_neon_vqtbl4q_v的使用疑问
我无法从ChatGPT和Gemini获取Clang内置函数__builtin_neon_vqtbl4q_v的有效可用示例,现寻求有该函数使用经验的开发者解答。
LLM已收录Stack Overflow全量信息却仍无法给出答案,说明该内置函数缺乏实用文档。我已耗时2小时以上查找合理文档,但一无所获。此外,因64位嵌入式特殊场景的构建系统限制,不能引入<arm_neon.h>(会带来冗余内容),只能直接使用该内置函数。
我理解val[4]代表四个128b向量(总计512b),但仍不清楚__a和__c参数的作用——修改__a的值并未产生任何影响,我猜测__c是掩码,但无法确认。
测试代码如下:
#include <stdio.h> #include <stdlib.h> typedef char v16 __attribute((vector_size(16),aligned(1))); typedef char v64 __attribute((vector_size(64),aligned(1))); static void pv(v64 v) { int i; for(i=0;i<sizeof(v64);i++) {printf("%d,%s", v[i], (i+1)%8?"":" ");} putchar('\n');} static v64 gather(char*s,v64 x){ v16 r[4]; for(int i=0;i<4;i++) { r[i]=__builtin_neon_vqtbx4q_v((v16){0},*(v16*)(s+0),*(v16*)(s+16),*(v16*)(s+32),*(v16*)(s+48),((v16*)&x)[i],48); } return *(v64*)&r; } int main(int argc, char* argv[]) { int i=0; if(argc>1){i=atoi(argv[1]);} v64 t = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63}; v64 m = {0,1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31, 32,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,63}; pv(t); pv(m); pv(gather(&t,m)); return 0; }
测试输出:
0,1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39, 40,41,42,43,44,45,46,47, 48,49,50,51,52,53,54,55, 56,57,58,59,60,61,62,63, 0,1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31, 32,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,63, 0,1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31, 32,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,63,
内容的提问来源于stack exchange,提问作者AG1
相关产品推荐
相关产品推荐

