All pastes #927075 Raw Edit

Unnamed

public c v1 · immutable
·published 2008-03-04 00:46 UTC
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; })