Какое начальное значение я должен передать инструкциям Aarch64 crc32? - PullRequest
1 голос
/ 15 марта 2020

Инструкции AArch64 crc32 {b, h, w, x} принимают в качестве входных данных значение CR C -32 и значение данных (8, 16, 32 или 64 бита соответственно) и выводят новый CR C -32 значение, которое, предположительно, должно быть передано в качестве ввода в следующую инструкцию crc32.

Чтобы получить то же значение в конце, которое программа crc32 выдает для данного набора байтов, что должно быть начальное входное значение? Есть ли что-то еще, что я должен сделать?

Алгоритм хорошо описан в другом месте, но я не могу найти примеры использования инструкций где-либо.

1 Ответ

2 голосов
/ 15 марта 2020

Несмотря на чудеса проб и ошибок, кажется, что начальное значение для аккумулятора crc32 составляет 0xffffffff (или -1), и чтобы получить стандартное значение crc32, вы инвертируете возвращаемое значение, поэтому ~crc32.

например (массив dwords должен быть выровнен по 8 байтов).

uint32_t crc32 = 0xffffffff;
for (int i = 0; i < number_of_dwords; i++) {
  asm volatile ( "crc32x %w[crc], %w[crcin], %x[data]" : [crc] "=r" (crc32) : [crcin] "r" (crc32), [data] "r" (dwords[i]) );
}
return ~crc32;
...