如何使用ARM64执行多项式乘法?

时间:2019-01-05 03:54:38

标签: c visual-studio intrinsics arm64

Microsoft最近作为Visual Studio 15.9的一部分发布了他们的ARM64构建工具。我正在准备移植到ARM64。我在多项式乘法方面遇到了麻烦。

我遇到的问题是,Microsoft不提供预期的数据类型,例如poly64_t,也不提供强制转换的数据,例如vreinterpretq_u64_p128。另请参见GitHub上的arm64_neon.h

无法编译:

#include <arm64_neon.h>
poly128_t VMULL_P64(const poly64_t a, const poly64_t b)
{
    return vmull_p64(a, b);
}

结果:

test.cxx(2): error C4430: missing type specifier - int assumed. Note: C++ does n
ot support default-int
test.cxx(2): error C2146: syntax error: missing ';' before identifier 'VMULL_P64
'
test.cxx(3): error C2143: syntax error: missing ';' before '{'
test.cxx(3): error C2447: '{': missing function header (old-style formal list?)

这也无法编译:

#include <arm64_neon.h>
uint64x2_t VMULL_P64(const uint64_t a, const uint64_t b)
{
    return vmull_p64(a, b);
}

并且:

test.cxx(4): error C2664: '__n128 neon_pmull_64(__n64,__n64)': cannot convert ar
gument 1 from 'const uint64_t' to '__n64'
test.cxx(4): note: No constructor could take the source type, or constructor ove
rload resolution was ambiguous

我把这个拼凑在一起,但这似乎是错误的。尤其是中间__n64(我无法用一个语句来编译它):

#include <arm64_neon.h>
uint64x2_t VMULL_P64(const uint64_t a, const uint64_t b)
{
    __n64 x = {a}, y = {b};
    return vmull_p64(x, y);
}

其他内容(如CRC32,CRC32C,AES,SHA-1和SHA-256)工作正常。

Microsoft对我们打算如何使用ARM64执行多项式乘法?

(标头<arm64_neon.h>来自哪里?ARM很清楚标头是<arm_acle.h>。)


ARM在ARM C Language Extensions 2.1 (ACLE)中提供了以下内容:

poly128_t vmull_p64 (poly64_t, poly64_t);
     

对双字低位执行加宽多项式乘法。   在ARMv8 AArch32和AArch64上可用。

poly128_t vmull_high_p64 (poly64x2_t, poly64x2_t);
     

对双字较高的部分执行加宽多项式乘法。   在ARMv8 AArch32和AArch64上可用。

1 个答案:

答案 0 :(得分:1)

Visual C ++ 2017.9(15.9)中的ARM支持仍然非常有限... 2017.9不再具有新功能,因此如果不升级到Visual C ++ 2019,将无法编译代码。

Visual C ++ 2019为poly64_t添加了类型定义。我正在与来自ARM和Visual Studio开发人员的人员紧密合作,以解决针对32位或64位ARM目标进行编译时的问题。编译器中仍然存在一些需要解决的错误,因此对于生产代码或从Linux和其他类似Unix的系统进行移植不是很好。