Yubei
A meno che, quella robaccia no abbia le vector ext che ho usato...
Ma sei sicuro di averle usate?
Visto che mi interessava, ho dato un'occhiata, e mi pare che (almeno con il gcc 3.3.x) quello che hai scritto tu non funzioni (il codice asm generato non usa istruzioni particolari).
Per ottenere qualcosa, ho riscritto il tutto cosi' (ho semplificato togliendo tutto quello che non mi interessava e ho cambiato qualcosa qui e la'):
Codice:
...
typedef int mtype __attribute__ ( (mode(DI)) );
...
void crypta(FILE *src_file, FILE *dst_file)
{
uint8_t mkey[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
long dim_buffer = filelength(src_file);
uint8_t *buffer = xmalloc64(dim_buffer);
read_byte(buffer, dim_buffer, src_file);
mtype b = (*(mtype *)mkey);
for (int count = 0; count < dim_buffer; count += sizeof(mtype)) {
mtype *a = ((mtype *)&buffer[count]);
(*a) = __builtin_ia32_pxor (*a, b);
}
write_byte(buffer, dim_buffer, dst_file);
free(buffer);
}
Questa volta l'asm mostra l'utilizzo delle istruzioni pxor, movq e dei registri mm0 e mm1:
Codice:
.L12:
leal (%edx,%edi), %eax
movq (%eax), %mm0
addl $8, %edx
pxor %mm1, %mm0
cmpl %esi, %edx
movq %mm0, (%eax)
jl .L12
.L14:
Ho dovuto aggiungere l'opzione -mmmx per compilare.
A dire il vero, ho riscritto il tutto per usare un normale xor tra unsigned long, e non mi pare che la versione che usa le MMX sia significativamente piu' veloce...