void Vgen::emit(tbcc i) { assertx(i.cc == vixl::ne || i.cc == vixl::eq); if (i.targets[1] != i.targets[0]) { if (next == i.targets[1]) { // the taken branch is the fall-through block, invert the branch. i = tbcc{i.cc == vixl::ne ? vixl::eq : vixl::ne, i.bit, i.s, {i.targets[1], i.targets[0]}}; } bccs.push_back({a->frontier(), i.targets[1]}); // offset range +/- 32KB if (i.cc == vixl::ne) { a->tbnz(X(i.s), i.bit, 0); } else { a->tbz(X(i.s), i.bit, 0); } } emit(jmp{i.targets[0]}); }