rendered paste body/* a*b (mod p), where a,b < p < 2^62. Assumes %st(0) contains b/p and FPU is in round-to-zero mode.*/#define PRE2_MULMOD64(a,b,p) ({ \ uint32_t r1, r2; \ uint64_t tmp; \ register uint64_t ret; \ asm("fildll %4" "\n\t" \ "mov %4, %%ebx" "\n\t" \ "mov 4+%4, %%ecx" "\n\t" \ "imul %%edx, %%ebx" "\n\t" \ "fmul %%st(1), %%st(0)" "\n\t" \ "imul %%eax, %%ecx" "\n\t" \ "fistpll %1" "\n\t" \ "mull %4" "\n\t" \ "mov %%eax, %2" "\n\t" \ "add %%ecx, %%ebx" "\n\t" \ "add %%ebx, %%edx" "\n\t" \ "mov %1, %%eax" "\n\t" \ "mov %%edx, %3" "\n\t" \ "mov 4+%1, %%edx" "\n\t" \ "mov %7, %%ebx" "\n\t" \ "mov %6, %%ecx" "\n\t" \ "imul %%eax, %%ebx" "\n\t" \ "imul %%edx, %%ecx" "\n\t" \ "mull %6" "\n\t" \ "add %%ebx, %%ecx" "\n\t" \ "mov %3, %%ebx" "\n\t" \ "add %%ecx,%%edx" "\n\t" \ "mov %2, %%ecx" "\n\t" \ "sub %%eax, %%ecx" "\n\t" \ "sbb %%edx, %%ebx" "\n\t" \ "mov %%ecx, %%eax" "\n\t" \ "mov %%ebx, %%edx" "\n\t" \ "sub %6, %%ecx" "\n\t" \ "sbb %7, %%ebx" "\n\t" \ "jl 0f" "\n\t" \ "mov %%ecx, %%eax" "\n\t" \ "mov %%ebx, %%edx" "\n" \ "0:" \ : "=&A" (ret), "=m" (tmp), "=m" (r1), "=m" (r2) \ : "m" ((uint64_t)a), "0" ((uint64_t)b), \ "rm" (((TU64_t)p).l), "rm" (((TU64_t)p).h), "m" (mod64_rnd) \ : "%ebx", "%ecx", "cc" ); \ ret; })