// cc -Wall -o counter128x4_inc counter128x4_inc.c
#include <stdio.h>
#include <stdint.h>
#include <memory.h>
/* increment counter (64-bit int) by 1 */
static uint8_t *ctr128_inc(uint8_t counter[16]) {
uint32_t n=16;
uint8_t c;
do {
--n;
c = counter[n];
++c;
counter[n] = c;
if (c) return counter;
} while (n);
return counter;
}
void argx4(int i, uint64_t arg4[2], uint64_t arg3[2], uint64_t arg2[2], uint64_t arg1[2]) {
printf("%4d\n", i);
printf("%4s: 0x%016llx 0x%016llx\n", "arg1", arg1[1], arg1[0]);
printf("%4s: 0x%016llx 0x%016llx\n", "arg2", arg2[1], arg2[0]);
printf("%4s: 0x%016llx 0x%016llx\n", "arg3", arg3[1], arg3[0]);
printf("%4s: 0x%016llx 0x%016llx\n", "arg4", arg4[1], arg4[0]);
printf("\n");
}
int main() {
uint64_t src[2] = {0x0706050403020100L, 0x0f0e0d0c0b0a0908L};
uint64_t dst[2];
memcpy(dst, src, sizeof(dst));
uint8_t *p = (uint8_t*)&dst;
for(int i=0; i<(256/4); i++) {
uint64_t arg1[2];
uint64_t arg2[2];
uint64_t arg3[2];
uint64_t arg4[2];
arg1[0] = *((uint64_t *)p);
arg1[1] = *((uint64_t *)(p + 8));
ctr128_inc(p);
arg2[0] = *((uint64_t *)p);
arg2[1] = *((uint64_t *)(p + 8));
ctr128_inc(p);
arg3[0] = *((uint64_t *)p);
arg3[1] = *((uint64_t *)(p + 8));
ctr128_inc(p);
arg4[0] = *((uint64_t *)p);
arg4[1] = *((uint64_t *)(p + 8));
ctr128_inc(p);
argx4(i, arg4, arg3, arg2, arg1);
}
return 0;
}