struct trb_node *w = pa[k - 1]->trb_link[1];

if (w->trb_color == TRB_RED)
  {
    w->trb_color = TRB_BLACK;
    pa[k - 1]->trb_color = TRB_RED;

    pa[k - 1]->trb_link[1] = w->trb_link[0];
    w->trb_link[0] = pa[k - 1];
    pa[k - 2]->trb_link[da[k - 2]] = w;

    pa[k] = pa[k - 1];
    da[k] = 0;
    pa[k - 1] = w;
    k++;

    w = pa[k - 1]->trb_link[1];
  }

if ((w->trb_tag[0] == TRB_THREAD
     || w->trb_link[0]->trb_color == TRB_BLACK)
    && (w->trb_tag[1] == TRB_THREAD
        || w->trb_link[1]->trb_color == TRB_BLACK))
  {
    w->trb_color = TRB_RED;
  }
else
  {
    if (w->trb_tag[1] == TRB_THREAD
        || w->trb_link[1]->trb_color == TRB_BLACK)
      {
        struct trb_node *y = w->trb_link[0];
        y->trb_color = TRB_BLACK;
        w->trb_color = TRB_RED;
        w->trb_link[0] = y->trb_link[1];
        y->trb_link[1] = w;
        w = pa[k - 1]->trb_link[1] = y;

        if (w->trb_tag[1] == TRB_THREAD)
          {
            w->trb_tag[1] = TRB_CHILD;
            w->trb_link[1]->trb_tag[0] = TRB_THREAD;
            w->trb_link[1]->trb_link[0] = w;
          }
      }

    w->trb_color = pa[k - 1]->trb_color;
    pa[k - 1]->trb_color = TRB_BLACK;
    w->trb_link[1]->trb_color = TRB_BLACK;

    pa[k - 1]->trb_link[1] = w->trb_link[0];
    w->trb_link[0] = pa[k - 1];
    pa[k - 2]->trb_link[da[k - 2]] = w;

    if (w->trb_tag[0] == TRB_THREAD)
      {
        w->trb_tag[0] = TRB_CHILD;
        pa[k - 1]->trb_tag[1] = TRB_THREAD;
        pa[k - 1]->trb_link[1] = w;
      }
    break;
  }
