La sfida è aperta: è possibile scrivere una soluzione più efficiente di questa per accensione?
void Accendi(int N, int acceso[], int pulsante[]) {
__asm__(
"mov %0, %%ecx;"
"loop1:"
"cmpl $0, %%ecx;"
"jle exit1;"
"lea (%1, %%rcx, 4), %%rax;"
"movl (%%rax), %%eax;"
"xor $0x01, %%eax;"
"mov %%rcx, %%rdx;"
"loop2:"
"add %%rcx, %%rdx;"
"cmpl %%edx, %0;"
"jl exit2;"
"lea (%2, %%rdx, 4), %%rbx;"
"movl (%%rbx), %%ebx;"
"xorl %%ebx, %%eax;"
"jmp loop2;"
"exit2:"
"lea (%2, %%rcx, 4), %%rbx;"
"movl %%eax, (%%rbx);"
"dec %%ecx;"
"jmp loop1;"
"exit1:"
:: "r"(N), "r"(acceso), "r"(pulsante)
: "rax", "rbx", "rcx", "rdx"
);
}
Per ora è la più veloce, qui sul correttore (che è notoriamente una lumaca perchè sta in una vm) ci mette 0.640s.