// File: koraa[P]sbcrack/cube/crypto.cpp
// Function: gfield::invert(gfield const&)
bool invert(const gfield &x)
    {
        if(!x.len) return false;
        gfint u(x), v(P), A((gfint::digit)1), C((gfint::digit)0);
        while(!u.iszero())
        {
            int ushift = 0, ashift = 0;
            while(!u.hasbit(ushift))
            {
                ushift++;
                if(A.hasbit(ashift))
                {
                    if(ashift) { A.rshift(ashift); ashift = 0; }
                    A.add(P);
                }
                ashift++;
            }
            if(ushift) u.rshift(ushift);
            if(ashift) A.rshift(ashift);
            int vshift = 0, cshift = 0;
            while(!v.hasbit(vshift))
            {
                vshift++;
                if(C.hasbit(cshift))
                {
                    if(cshift) { C.rshift(cshift); cshift = 0; }
                    C.add(P);
                }
                cshift++;
            }
            if(vshift) v.rshift(vshift);
            if(cshift) C.rshift(cshift);
            if(u >= v)
            {
                u.sub(v);
                if(A < C) A.add(P);
                A.sub(C);
            }
            else
            {
                v.sub(v, u);
                if(C < A) C.add(P);
                C.sub(A);
            }
        }
        if(C >= P) gfint::sub(C, P);
        else { len = C.len; memcpy(digits, C.digits, len*sizeof(digit)); }
        ASSERT(*this < P);
        return true;
    }

// Assembly:
subq $0xb8, %rsp
movq %rdi, 0xa8(%rsp)
movq %rsi, 0xa0(%rsp)
movq 0xa8(%rsp), %rax
movq %rax, 0x8(%rsp)
movq 0xa0(%rsp), %rax
cmpl $0x0, (%rax)
jne 0x9e1e
movb $0x0, 0xb7(%rsp)
jmp 0xa138
movq 0xa0(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x80(%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x88(%rsp)
movq 0x10(%rax), %rcx
movq %rcx, 0x90(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x98(%rsp)
movq 0x92e8(%rip), %rax      # 0x13144
movq %rax, 0x60(%rsp)
movq 0x92e4(%rip), %rax      # 0x1314c
movq %rax, 0x68(%rsp)
movq 0x92e0(%rip), %rax      # 0x13154
movq %rax, 0x70(%rsp)
movq 0x92dc(%rip), %rax      # 0x1315c
movq %rax, 0x78(%rsp)
leaq 0x40(%rsp), %rdi
movl $0x1, %esi
callq 0xa150
leaq 0x20(%rsp), %rdi
xorl %esi, %esi
callq 0xa150
leaq 0x80(%rsp), %rdi
callq 0x9cc0
xorb $-0x1, %al
testb $0x1, %al
jne 0x9eb8
jmp 0xa0c2
movl $0x0, 0x1c(%rsp)
movl $0x0, 0x18(%rsp)
movl 0x1c(%rsp), %esi
leaq 0x80(%rsp), %rdi
callq 0xa1a0
xorb $-0x1, %al
testb $0x1, %al
jne 0x9ee1
jmp 0x9f3b
movl 0x1c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x1c(%rsp)
movl 0x18(%rsp), %esi
leaq 0x40(%rsp), %rdi
callq 0xa1a0
testb $0x1, %al
jne 0x9f00
jmp 0x9f2e
cmpl $0x0, 0x18(%rsp)
je 0x9f1d
movl 0x18(%rsp), %esi
leaq 0x40(%rsp), %rdi
callq 0xa220
movl $0x0, 0x18(%rsp)
leaq 0x40(%rsp), %rdi
leaq 0x921b(%rip), %rsi      # 0x13144
callq 0xa250
movl 0x18(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x18(%rsp)
jmp 0x9ec8
cmpl $0x0, 0x1c(%rsp)
je 0x9f53
movl 0x1c(%rsp), %esi
leaq 0x80(%rsp), %rdi
callq 0xa220
cmpl $0x0, 0x18(%rsp)
je 0x9f68
movl 0x18(%rsp), %esi
leaq 0x40(%rsp), %rdi
callq 0xa220
movl $0x0, 0x14(%rsp)
movl $0x0, 0x10(%rsp)
movl 0x14(%rsp), %esi
leaq 0x60(%rsp), %rdi
callq 0xa1a0
xorb $-0x1, %al
testb $0x1, %al
jne 0x9f8e
jmp 0x9fe8
movl 0x14(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x14(%rsp)
movl 0x10(%rsp), %esi
leaq 0x20(%rsp), %rdi
callq 0xa1a0
testb $0x1, %al
jne 0x9fad
jmp 0x9fdb
cmpl $0x0, 0x10(%rsp)
je 0x9fca
movl 0x10(%rsp), %esi
leaq 0x20(%rsp), %rdi
callq 0xa220
movl $0x0, 0x10(%rsp)
leaq 0x20(%rsp), %rdi
leaq 0x916e(%rip), %rsi      # 0x13144
callq 0xa250
movl 0x10(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x10(%rsp)
jmp 0x9f78
cmpl $0x0, 0x14(%rsp)
je 0x9ffd
movl 0x14(%rsp), %esi
leaq 0x60(%rsp), %rdi
callq 0xa220
cmpl $0x0, 0x10(%rsp)
je 0xa012
movl 0x10(%rsp), %esi
leaq 0x20(%rsp), %rdi
callq 0xa220
leaq 0x80(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0xa280
testb $0x1, %al
jne 0xa02a
jmp 0xa073
leaq 0x80(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0xa2b0
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rsi
callq 0xa2e0
testb $0x1, %al
jne 0xa051
jmp 0xa062
leaq 0x40(%rsp), %rdi
leaq 0x90e7(%rip), %rsi      # 0x13144
callq 0xa250
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rsi
callq 0xa2b0
jmp 0xa0bd
leaq 0x60(%rsp), %rsi
leaq 0x80(%rsp), %rdx
movq %rsi, %rdi
callq 0xa3b0
leaq 0x20(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xa2e0
testb $0x1, %al
jne 0xa09d
jmp 0xa0ae
leaq 0x20(%rsp), %rdi
leaq 0x909b(%rip), %rsi      # 0x13144
callq 0xa250
leaq 0x20(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xa2b0
jmp 0x9ea0
leaq 0x20(%rsp), %rdi
leaq 0x9076(%rip), %rsi      # 0x13144
callq 0xa280
testb $0x1, %al
jne 0xa0d9
jmp 0xa0f1
movq 0x8(%rsp), %rdi
leaq 0x20(%rsp), %rsi
leaq 0x905a(%rip), %rdx      # 0x13144
callq 0xa3b0
jmp 0xa117
movq 0x8(%rsp), %rax
movl 0x20(%rsp), %ecx
movl %ecx, (%rax)
movq %rax, %rdi
addq $0x4, %rdi
leaq 0x20(%rsp), %rsi
addq $0x4, %rsi
movslq (%rax), %rdx
shlq %rdx
callq 0x10c0
movq 0x8(%rsp), %rdi
leaq 0x9021(%rip), %rsi      # 0x13144
callq 0xa2e0
testb $0x1, %al
jne 0xa12e
jmp 0xa130
jmp 0xa130
movb $0x1, 0xb7(%rsp)
movb 0xb7(%rsp), %al
andb $0x1, %al
addq $0xb8, %rsp
retq
nopl (%rax)