Как можно изменить эту функцию добавления, чтобы использовать массивы uint32_t вместо массивов uint8_t? - PullRequest
0 голосов
/ 22 апреля 2020

Я обнаружил, что эта функция добавляет два массива, в которых два массива типа uint8_t * добавляются и сохраняются в другом uint8_t *. Однако мои массивы относятся к типу uint32_t *. Как можно изменить эту функцию, чтобы она работала для uint32_t *?. Мои массивы содержат N значений в моем случае 10000. Это функция:

typedef uint8_t u8x16 __attribute__((vector_size(16)));
void Addition(uint8_t *const lhs, uint8_t *const rhs, uint8_t *out, size_t N){
 uint_fast8_t carry = 0;
    for (size_t i = 0; i + 15 < N; i += 16) {
        u8x16 digits = *(u8x16 *)&lhs[i] + *(u8x16 *)&rhs[i] + (u8x16){carry};

        // Get carries and almost-carries
        u8x16 carries = digits >= 10; // true is -1
        u8x16 full = digits == 9;

        // Shift carries
        carry = carries[15] & 1;
        __uint128_t carries_i = ((__uint128_t)carries) << 8;
        carry |= __builtin_add_overflow((__uint128_t)full, carries_i, &carries_i);

        // Add to carry chains and wrap
        digits += (((u8x16)carries_i) ^ full) & 1;
        digits = (u8x16)_mm_min_epu8((__m128i)digits, (__m128i)(digits - 10));
        //digits -= (digits >= 10) & 10;

        *(u8x16 *)&out[i] = digits;
    }
}
...