Как выполнить полиномиальное умножение с помощью ARM64? - PullRequest
0 голосов
/ 05 января 2019

Microsoft недавно выпустила свои инструменты сборки ARM64 как часть Visual Studio 15.9. Я заканчиваю порт для ARM64. У меня проблемы с полиномиальным умножением.

Проблема, с которой я сталкиваюсь, заключается в том, что Microsoft не предоставляет ожидаемые типы данных, такие как poly64_t, или данные типа vreinterpretq_u64_p128. Также см. arm64_neon.h на GitHub.

Не удается скомпилировать:

#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.

...