gpt4 book ai didi

assembly - 是否有用于 16 字节宽 VTBL 的 Armv8-A 内在函数?

转载 作者:行者123 更新时间:2023-12-05 06:22:56 27 4
gpt4 key购买 nike

根据我经常使用的来源Searchable Neon Arm Intrinsic Guide ,对于具有 8 字节目标寄存器的查找表,只有这些(四类)内在函数(为简洁起见,省略了 uint8x8 和 poly8x8_t 变体)。

int8x8_t vtbl1_s8 (int8x8_t a, int8x8_t b)
int8x8_t vtbl2_s8 (int8x8x2_t a, int8x8_t b)
int8x8_t vtbl3_s8 (int8x8x3_t a, int8x8_t b)
int8x8_t vtbl4_s8 (int8x8x4_t a, int8x8_t b)

令我惊讶的是我的源代码

uint8x16_t oddeven(uint8x16_t a) {
auto l = vget_low_u8(a);
auto h = vget_high_u8(a);
auto lh = vuzp_u8(l,h);
return vcombine_u8(lh.val[0], lh.val[1]);
}

为 16 字节向量的奇数/偶数交织生成了这个几乎单一的指令代码:

adrp    x8, .LCPI0_0
ldr q1, [x8, :lo12:.LCPI0_0]
tbl v0.16b, { v0.16b }, v1.16b
ret

就是这样,tbl v0.16.b, { } 变体显然在一条指令中对原始数据执行完整的 16->16 排列。这是(未)记录的,还是可以用内在函数生成的?

See full code and listing in Godbolt.org

最佳答案

您可以通过搜索 tbl(指令助记符)在内部函数指南中找到它,然后“在页面内搜索”16 直到找到一些 uint8x16_t 版本以找到它们的内在命名方案。uint8x16_t vqtbl1q_u8 (uint8x16_t, uint8x16_t idx)

(感谢@RossRidge 首先指出了正确的名称;这个答案的重点是建议一种基于已知指令助记符查找内在函数的方法。它更适用于英特尔的 x86 内在查找器,其中元素size 是助记符的一部分,因此搜索 asm 助记符通常会缩小内在结果列表的范围,足以进行视觉扫描。)

关于assembly - 是否有用于 16 字节宽 VTBL 的 Armv8-A 内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58849311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com