ARM64上的vtbl2内在函数丢失

时间:2015-05-21 13:48:14

标签: c++ ios xcode simd neon

我有一些使用vtbl2_u8 ARM Neon内部函数的代码。当我使用armv7armv7s体系结构进行编译时,此代码会正确编译(并执行)。但是,当我尝试编译定位arm64时,我收到错误:

simd.h: error: call to unavailable function 'vtbl2_u8'

我的Xcode版本是6.1,iPhone SDK 8.1。查看arm64_neon_internal.hvtbl2_u8的定义为__attribute__(unavailable)vtbl2q_u8有一个定义,但它需要不同的参数类型。是否可以直接替换vtbl2的{​​{1}}内在函数?

1 个答案:

答案 0 :(得分:2)

如ARM NEON内在函数引用(http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf)中所述,def create @post = Post.find(params[:post_id] @comment = Comment.find(params[:comment_id]) @reply = @comment.replies.new(reply_params) if @reply.save # some logic redirect_to wherever_path else # other logic render :new end end 预计将由ARMv8-A中为AArch64状态提供ARM C语言扩展实现的编译器提供。请注意,同一文档会建议vtbl2q_u8是Xcode扩展,而不是ACLE编译器预期支持的内部函数。

您的问题的答案是,应该不需要替换vtbl2_u8,因为它应该被提供。但是,这对您的实际问题没有帮助,这就是如何使用不提供该指令的编译器来使用该指令。

查看Xcode中可用的内容,以及要记录的vtbl2_u8映射到的内容,我认为您应该能够通过以下方式模拟预期的行为:

vtbl2_u8

虽然我没有Xcode工具链可供测试,但您必须确认这符合您的预期。

如果这出现在性能关键代码中,您可能会发现uint8x8_t vtbl2_u8 (uint8x8x2_t a, uint8x8_t b) { /* Build the 128-bit vector mask from the two 64-bit halves. */ uint8x16_t new_mask = vcombine_u8 (a.val[0], a.val[1]); /* Use an Xcode specific intrinsic. */ return vtbl1q_u8 (new_mask, b); } 是一个不可接受的额外指令。从根本上说,vcombine_u8存在于两个连续的寄存器中,它们在AArch64和AArch32之间给出了不同的布局(其中Q0为D0:D1)。uint8x8x2_t内在函数需要16位掩码。

重写vtbl2_u8数据的生产者以生成uint8x8x2_t是唯一的其他解决方法,可能是最有效的方法。请注意,即使在提供uint8x16_t内在的编译器(写入时的主干GCC和Clang)中,也会插入执行vtbl2_u8的指令,因此您可能仍会在幕后看到额外的移动指令。