История изменений
Исправление shdown, (текущая версия) :
Не хотел терять 30% производительности, а потерял 2x. Просто возьми код из gmp. Только нынче нормальные функции из заголовочных файлов убрали, нужно прям из исходников ассемблер выгрызать.
P.S. У тебя какой-то странный ассемблер, там всё местами поменяно и сигилов нет.
; void naive_func(uint64_t *dst, uint64_t *src, size_t offset);
.global naive_func
.type naive_func, @function
naive_func:
movq %rdx, %rcx
1:
.align 32
movq (%rsi,%rcx,8), %rax
sbbq %rax, (%rdi,%rcx,8)
incq %rcx
jnz 1b
sbbq $0, (%rdi)
retq
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#define N 64
void naive_func(uint64_t *dst, const uint64_t *src, size_t offset);
uint64_t __gmpn_sub_n(uint64_t *rp, const uint64_t *s1p, const uint64_t *s2p, int64_t n);
int main()
{
static uint64_t a[N + 2];
static uint64_t b[N + 2];
for (int i = 0; i < 10 * 1000 * 1000; ++i) {
#if NAIVE_FUNC
naive_func(a + N + 1, b + N + 1, -N);
#else
__gmpn_sub_n(a + 1, a + 1, b + 1, N);
#endif
}
}
У меня 0.18s против 0.36s.
Исходная версия shdown, :
Не хотел терять 30% производительности, а потерял 2x. Просто возьми код из gmp. Только нынче нормальные функции из заголовочных файлов убрали, нужно прям из исходников ассемблер выгрызать.
; void naive_func(uint64_t *dst, uint64_t *src, size_t offset);
.global naive_func
.type naive_func, @function
naive_func:
movq %rdx, %rcx
1:
.align 32
movq (%rsi,%rcx,8), %rax
sbbq %rax, (%rdi,%rcx,8)
incq %rcx
jnz 1b
sbbq $0, (%rdi)
retq
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#define N 64
void naive_func(uint64_t *dst, const uint64_t *src, size_t offset);
uint64_t __gmpn_sub_n(uint64_t *rp, const uint64_t *s1p, const uint64_t *s2p, int64_t n);
int main()
{
static uint64_t a[N + 2];
static uint64_t b[N + 2];
for (int i = 0; i < 10 * 1000 * 1000; ++i) {
#if NAIVE_FUNC
naive_func(a + N + 1, b + N + 1, -N);
#else
__gmpn_sub_n(a + 1, a + 1, b + 1, N);
#endif
}
}
У меня 0.18s против 0.36s.