int Bignum_Process(char *p) __attribute__((naked));
int Bignum_Process(char *p)
{
  (void)p;
  __asm__ volatile(
  ".syntax unified\n"
  ".thumb\n"
  "push {r4, r5, r6, lr}\n"
  "adds r4, r0, #0\n"
  "cmp r4, #0\n"
  "bne hasp_%=\n"
  "ldr r0, .Lp0\n"
  "ldr r0, [r0, #0]\n"
  "ldr r1, .Lp1\n"
  "bl Bignum_AllocDigits\n"
  "b ret_%=\n"
  ".balign 4, 0x00\n"
  ".Lp0: .word 0x02000938\n"
  ".Lp1: .word 0x0801C4C9\n"
  "hasp_%=:\n"
  "ldr r0, [r4, #84]\n"
  "cmp r0, #0\n"
  "bne hasq_%=\n"
  "ldr r0, .Lp0b\n"
  "ldr r0, [r0, #0]\n"
  "str r0, [r4, #84]\n"
  "hasq_%=:\n"
  "ldr r1, [r4, #84]\n"
  "ldr r0, [r1, #56]\n"
  "cmp r0, #0\n"
  "bne hasw_%=\n"
  "adds r0, r1, #0\n"
  "bl Bignum_Free\n"
  "hasw_%=:\n"
  "movs r0, #12\n"
  "ldrsh r1, [r4, r0]\n"
  "movs r0, #8\n"
  "ands r0, r1\n"
  "cmp r0, #0\n"
  "beq ret0_%=\n"
  "ldr r6, [r4, #16]\n"
  "cmp r6, #0\n"
  "beq ret0_%=\n"
  "ldr r0, [r4, #0]\n"
  "subs r5, r0, r6\n"
  "str r6, [r4, #0]\n"
  "movs r0, #3\n"
  "ands r0, r1\n"
  "cmp r0, #0\n"
  "bne zero8_%=\n"
  "ldr r0, [r4, #20]\n"
  "b store8_%=\n"
  ".balign 4, 0x00\n"
  ".Lp0b: .word 0x02000938\n"
  "orrs_%=:\n"
  "movs r0, #64\n"
  "ldrh r1, [r4, #12]\n"
  "orrs r0, r1\n"
  "strh r0, [r4, #12]\n"
  "movs r0, #1\n"
  "negs r0, r0\n"
  "b ret_%=\n"
  "zero8_%=:\n"
  "movs r0, #0\n"
  "store8_%=:\n"
  "str r0, [r4, #8]\n"
  "cmp r5, #0\n"
  "ble ret0_%=\n"
  "loop_%=:\n"
  "ldr r0, [r4, #28]\n"
  "ldr r3, [r4, #36]\n"
  "adds r1, r6, #0\n"
  "adds r2, r5, #0\n"
  "bl Math_SqrtFixed\n"
  "adds r1, r0, #0\n"
  "cmp r1, #0\n"
  "ble orrs_%=\n"
  "adds r6, r6, r1\n"
  "subs r5, r5, r1\n"
  "cmp r5, #0\n"
  "bgt loop_%=\n"
  "ret0_%=:\n"
  "movs r0, #0\n"
  "ret_%=:\n"
  "pop {r4, r5, r6, pc}\n"
  ::: "r0","r1","r2","r3","r4","r5","r6","memory");
}
