void do_sub(t_nb *res, t_nb *n1, t_nb *n2, t_base *s_base) { int ps1; int ps2; int pos; pos = n1->len + 2; ps1 = n1->len; ps2 = n2->len; while (--ps1 >= 0 && --ps2 >= 0) { --pos; res->nb[pos + 1] += get_base_idx(*(n1->nb + ps1), s_base->base) - get_base_idx(*(n2->nb + ps2), s_base->base); handle_ret(res, pos, s_base); res->nb[pos] += res->nb[pos + 1] / s_base->base_len; res->nb[pos + 1] %= s_base->base_len; } while (ps1 >= 0 && --pos >= 0) { res->nb[pos + 1] += get_base_idx(*(n1->nb + ps1), s_base->base); handle_ret(res, pos, s_base); res->nb[pos] += res->nb[pos + 1] / s_base->base_len; res->nb[pos + 1] %= s_base->base_len; --ps1; } }
bool test_ret() { op->op = CALL; assert(cpu->ip - cpu->mem == 0); // starts at 0 handle_call(cpu, op, 20); // jump to 20 assert(*(uint64_t *)(cpu->rp - 8) == 1); // rp is next after origin op->op = RET; handle_ret(cpu, op); assert(cpu->ip - cpu->mem == 1); // returned to rp return true; }