Exemplo n.º 1
0
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]});
}