p #define USER_SWITCH_INSTINIT BLOCKADDRESS = (CELL)(*_PREG);
{
  yamop *new = Yap_udi_search((*_PREG)->u.lp.p);
  if (!new) {
    (*_PREG) = (*_PREG)->u.lp.l;
    JMPNext();
  } else {
    (*_PREG) = new;
    JMPNext();
  }
}

#define USER_SWITCH_END BLOCK = (CELL)USER_SWITCH_END;

#define SWITCH_ON_TYPE_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = CACHED_A1();                                                            \
  Int nonvar = 1;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    nonvar = 0;                                                                \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.llll.l4);                                   \
      (*_PREG) = (*_PREG)->u.llll.l4;                                          \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    if (IsPairTerm(d0)) {                                                      \
      (*_SREG) = RepPair(d0);                                                  \
      copy_jmp_address((*_PREG)->u.llll.l1);                                   \
      (*_PREG) = (*_PREG)->u.llll.l1;                                          \
      JMPNext();                                                               \
    } else if (!IsApplTerm(d0)) {                                              \
      copy_jmp_address((*_PREG)->u.llll.l2);                                   \
      (*_PREG) = (*_PREG)->u.llll.l2;                                          \
      I_R = d0;                                                                \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_address((*_PREG)->u.llll.l3);                                   \
      (*_PREG) = (*_PREG)->u.llll.l3;                                          \
      (*_SREG) = RepAppl(d0);                                                  \
      JMPNext();                                                               \
    }                                                                          \
  }

#define SWITCH_ON_TYPE_END BLOCK = (CELL)SWITCH_ON_TYPE_END;

#if UNIQUE_TAG_FOR_PAIRS
#define SWITCH_LIST_NL_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  ALWAYS_LOOKAHEAD((*_PREG)->u.ollll.pop);                                     \
  d0 = CACHED_A1();                                                            \
  Int nonvar = 0;                                                              \
  Int pair = 1;                                                                \
  if (!IsPairTerm(d0)) {                                                       \
    pair = 0;                                                                  \
    do {                                                                       \
      if (!IsVarTerm(d0)) {                                                    \
        if (d0 == TermNil) {                                                   \
          (*_PREG) = (*_PREG)->u.ollll.l2;                                     \
          JMPNext();                                                           \
        } else {                                                               \
          if (IsApplTerm(d0)) {                                                \
            copy_jmp_address((*_PREG)->u.ollll.l3);                            \
            (*_PREG) = (*_PREG)->u.ollll.l3;                                   \
            (*_SREG) = RepAppl(d0);                                            \
            JMPNext();                                                         \
          } else {                                                             \
            copy_jmp_address((*_PREG)->u.ollll.l3);                            \
            (*_PREG) = (*_PREG)->u.ollll.l3;                                   \
            I_R = d0;                                                          \
            JMPNext();                                                         \
          }                                                                    \
        }                                                                      \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(pt0);                                                           \
      if (Unsigned(pt0) == (d0))                                               \
        break;                                                                 \
      if (IsPairTerm(d0)) {                                                    \
        pair = 1;                                                              \
        break;                                                                 \
      }                                                                        \
    } while (TRUE);                                                            \
    if (!nonvar && !pair) {                                                    \
      copy_jmp_address((*_PREG)->u.ollll.l4);                                  \
      (*_PREG) = (*_PREG)->u.ollll.l4;                                         \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (!nonvar && pair) {                                                       \
    copy_jmp_address((*_PREG)->u.ollll.l1);                                    \
    (*_PREG) = (*_PREG)->u.ollll.l1;                                           \
    (*_SREG) = RepPair(d0);                                                    \
    ALWAYS_GONext();                                                           \
  }
#else
#define SWITCH_LIST_NL_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  ALWAYS_LOOKAHEAD((*_PREG)->u.ollll.pop);                                     \
  d0 = CACHED_A1();                                                            \
  Int nonvar = 0;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.ollll.l4);                                  \
      (*_PREG) = (*_PREG)->u.ollll.l4;                                         \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    if (__builtin_expect(IsPairTerm(d0), 1)) {                                 \
      copy_jmp_address((*_PREG)->u.ollll.l1);                                  \
      (*_PREG) = (*_PREG)->u.ollll.l1;                                         \
      (*_SREG) = RepPair(d0);                                                  \
      ALWAYS_GONext();                                                         \
    }                                                                          \
    if (d0 == TermNil) {                                                       \
      (*_PREG) = (*_PREG)->u.ollll.l2;                                         \
      JMPNext();                                                               \
    } else {                                                                   \
      if (IsApplTerm(d0)) {                                                    \
        copy_jmp_address((*_PREG)->u.ollll.l3);                                \
        (*_PREG) = (*_PREG)->u.ollll.l3;                                       \
        (*_SREG) = RepAppl(d0);                                                \
        JMPNext();                                                             \
      } else {                                                                 \
        copy_jmp_address((*_PREG)->u.ollll.l3);                                \
        (*_PREG) = (*_PREG)->u.ollll.l3;                                       \
        I_R = d0;                                                              \
        JMPNext();                                                             \
      }                                                                        \
    }                                                                          \
  }
#endif

#define SWITCH_LIST_NL_END BLOCK = (CELL)SWITCH_LIST_NL_END;

#define SWITCH_ON_ARG_TYPE_INSTINIT                                            \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = XREG((*_PREG)->u.xllll.x);                                              \
  Int nonvar = 1;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    nonvar = 0;                                                                \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.xllll.l4);                                  \
      (*_PREG) = (*_PREG)->u.xllll.l4;                                         \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    if (IsPairTerm(d0)) {                                                      \
      copy_jmp_address((*_PREG)->u.xllll.l1);                                  \
      (*_PREG) = (*_PREG)->u.xllll.l1;                                         \
      (*_SREG) = RepPair(d0);                                                  \
      JMPNext();                                                               \
    } else if (!IsApplTerm(d0)) {                                              \
      copy_jmp_address((*_PREG)->u.xllll.l2);                                  \
      (*_PREG) = (*_PREG)->u.xllll.l2;                                         \
      I_R = d0;                                                                \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_address((*_PREG)->u.xllll.l3);                                  \
      (*_PREG) = (*_PREG)->u.xllll.l3;                                         \
      (*_SREG) = RepAppl(d0);                                                  \
      JMPNext();                                                               \
    }                                                                          \
  }

#define SWITCH_ON_ARG_TYPE_END BLOCK = (CELL)SWITCH_ON_ARG_TYPE_END;

#define SWITCH_ON_SUB_ARG_TYPE_INSTINIT                                        \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = (*_SREG)[(*_PREG)->u.sllll.s];                                          \
  Int nonvar = 1;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    nonvar = 0;                                                                \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.sllll.l4);                                  \
      (*_PREG) = (*_PREG)->u.sllll.l4;                                         \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    if (IsPairTerm(d0)) {                                                      \
      copy_jmp_address((*_PREG)->u.sllll.l1);                                  \
      (*_PREG) = (*_PREG)->u.sllll.l1;                                         \
      (*_SREG) = RepPair(d0);                                                  \
      JMPNext();                                                               \
    } else if (!IsApplTerm(d0)) {                                              \
      copy_jmp_address((*_PREG)->u.sllll.l2);                                  \
      (*_PREG) = (*_PREG)->u.sllll.l2;                                         \
      I_R = d0;                                                                \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_address((*_PREG)->u.sllll.l3);                                  \
      (*_PREG) = (*_PREG)->u.sllll.l3;                                         \
      (*_SREG) = RepAppl(d0);                                                  \
      JMPNext();                                                               \
    }                                                                          \
  }

#define SWITCH_ON_SUB_ARG_TYPE_END BLOCK = (CELL)SWITCH_ON_SUB_ARG_TYPE_END;

#define JUMP_IF_VAR_INSTINIT                                                   \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = CACHED_A1();                                                            \
  Int nonvar = 1;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    nonvar = 0;                                                                \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.l.l);                                       \
      (*_PREG) = (*_PREG)->u.l.l;                                              \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    (*_PREG) = NEXTOP((*_PREG), l);                                            \
    JMPNext();                                                                 \
  }

#define JUMP_IF_VAR_END BLOCK = (CELL)JUMP_IF_VAR_END;

#define JUMP_IF_NONVAR_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = XREG((*_PREG)->u.xll.x);                                                \
  Int nonvar = 0;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      (*_PREG) = NEXTOP((*_PREG), xll);                                        \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    copy_jmp_address((*_PREG)->u.xll.l1);                                      \
    (*_PREG) = (*_PREG)->u.xll.l1;                                             \
    JMPNext();                                                                 \
  }

#define JUMP_IF_NONVAR_END BLOCK = (CELL)JUMP_IF_NONVAR_END;

#define IF_NOT_THEN_INSTINIT                                                   \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  register CELL *pt0;                                                          \
  d0 = CACHED_A1();                                                            \
  Int nonvar = 1;                                                              \
  if (IsVarTerm(d0)) {                                                         \
    nonvar = 0;                                                                \
    (pt0) = (CELL *)(d0);                                                      \
    (d0) = *(CELL *)(d0);                                                      \
    while (Unsigned(pt0) != (d0)) {                                            \
      if (!IsVarTerm(d0)) {                                                    \
        nonvar = 1;                                                            \
        break;                                                                 \
      }                                                                        \
      (pt0) = (CELL *)(d0);                                                    \
      (d0) = *(CELL *)(d0);                                                    \
    }                                                                          \
    if (!nonvar) {                                                             \
      copy_jmp_address((*_PREG)->u.clll.l3);                                   \
      (*_PREG) = (*_PREG)->u.clll.l3;                                          \
      JMPNext();                                                               \
    }                                                                          \
  }                                                                            \
  if (nonvar) {                                                                \
    if (d0 == (*_PREG)->u.clll.c) {                                            \
      copy_jmp_address((*_PREG)->u.clll.l2);                                   \
      (*_PREG) = (*_PREG)->u.clll.l2;                                          \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_address((*_PREG)->u.clll.l1);                                   \
      (*_PREG) = (*_PREG)->u.clll.l1;                                          \
      JMPNext();                                                               \
    }                                                                          \
  }

#define IF_NOT_THEN_END BLOCK = (CELL)IF_NOT_THEN_END;

#define HRASH_SHIFT 6

#define SWITCH_ON_FUNC_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0, d1;                                                        \
  register CELL *pt0;                                                          \
  d1 = *(*_SREG)++;                                                            \
  {                                                                            \
    CELL Mask = ((*_PREG)->u.sssl.s - 1) << 1,                                 \
         hash = d1 >> (HRASH_SHIFT - 1) & Mask;                                \
    CELL *base;                                                                \
    base = (CELL *)(*_PREG)->u.sssl.l;                                         \
    pt0 = base + hash;                                                         \
    d0 = pt0[0];                                                               \
    if (d0 == d1 || d0 == 0) {                                                 \
      copy_jmp_addressa(pt0 + 1);                                              \
      (*_PREG) = (yamop *)(pt0[1]);                                            \
      JMPNext();                                                               \
    } else {                                                                   \
      register CELL d = ((d1 | 1) << 1) & Mask;                                \
      while (1) {                                                              \
        hash = (hash + d) & Mask;                                              \
        pt0 = base + hash;                                                     \
        d0 = pt0[0];                                                           \
        if (d0 == d1 || d0 == 0) {                                             \
          copy_jmp_addressa(pt0 + 1);                                          \
          (*_PREG) = (yamop *)pt0[1];                                          \
          break;                                                               \
        }                                                                      \
      }                                                                        \
    }                                                                          \
  }

#define SWITCH_ON_FUNC_END BLOCK = (CELL)SWITCH_ON_FUNC_END;

#define SWITCH_ON_CONS_INSTINIT                                                \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0, d1;                                                        \
  register CELL *pt0;                                                          \
  d1 = I_R;                                                                    \
  {                                                                            \
    CELL Mask = ((*_PREG)->u.sssl.s - 1) << 1,                                 \
         hash = d1 >> (HRASH_SHIFT - 1) & Mask;                                \
    CELL *base;                                                                \
    base = (CELL *)(*_PREG)->u.sssl.l;                                         \
    pt0 = base + hash;                                                         \
    d0 = pt0[0];                                                               \
    if (d0 == d1 || d0 == 0) {                                                 \
      copy_jmp_addressa(pt0 + 1);                                              \
      (*_PREG) = (yamop *)(pt0[1]);                                            \
      JMPNext();                                                               \
    } else {                                                                   \
      register CELL d = ((d1 | 1) << 1) & Mask;                                \
      while (1) {                                                              \
        hash = (hash + d) & Mask;                                              \
        pt0 = base + hash;                                                     \
        d0 = pt0[0];                                                           \
        if (d0 == d1 || d0 == 0) {                                             \
          copy_jmp_addressa(pt0 + 1);                                          \
          (*_PREG) = (yamop *)pt0[1];                                          \
          break;                                                               \
        }                                                                      \
      }                                                                        \
    }                                                                          \
  }

#define SWITCH_ON_CONS_END BLOCK = (CELL)SWITCH_ON_CONS_END;

#define GO_ON_FUNC_INSTINIT                                                    \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  {                                                                            \
    CELL *pt = (CELL *)((*_PREG)->u.sssl.l);                                   \
    d0 = *(*_SREG)++;                                                          \
    if (d0 == pt[0]) {                                                         \
      copy_jmp_addressa(pt + 1);                                               \
      (*_PREG) = (yamop *)pt[1];                                               \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_addressa(pt + 3);                                               \
      (*_PREG) = (yamop *)pt[3];                                               \
      JMPNext();                                                               \
    }                                                                          \
  }

#define GO_ON_FUNC_END BLOCK = (CELL)GO_ON_FUNC_END;

#define GO_ON_CONS_INSTINIT                                                    \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d0;                                                            \
  {                                                                            \
    CELL *pt = (CELL *)((*_PREG)->u.sssl.l);                                   \
    d0 = I_R;                                                                  \
    if (d0 == pt[0]) {                                                         \
      copy_jmp_addressa(pt + 1);                                               \
      (*_PREG) = (yamop *)pt[1];                                               \
      JMPNext();                                                               \
    } else {                                                                   \
      copy_jmp_addressa(pt + 3);                                               \
      (*_PREG) = (yamop *)pt[3];                                               \
      JMPNext();                                                               \
    }                                                                          \
  }

#define GO_ON_CONS_END BLOCK = (CELL)GO_ON_CONS_END;

#define IF_FUNC_INSTINIT                                                       \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d1;                                                            \
  register CELL *pt0;                                                          \
  pt0 = (CELL *)(*_PREG)->u.sssl.l;                                            \
  d1 = *(*_SREG)++;                                                            \
  while (pt0[0] != d1 && pt0[0] != (CELL)NULL) {                               \
    pt0 += 2;                                                                  \
  }                                                                            \
  copy_jmp_addressa(pt0 + 1);                                                  \
  (*_PREG) = (yamop *)(pt0[1]);                                                \
  JMPNext();

#define IF_FUNC_END BLOCK = (CELL)IF_FUNC_END;

#define IF_CONS_INSTINIT                                                       \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  register CELL d1;                                                            \
  register CELL *pt0;                                                          \
  pt0 = (CELL *)(*_PREG)->u.sssl.l;                                            \
  d1 = I_R;                                                                    \
  while (pt0[0] != d1 && pt0[0] != 0L) {                                       \
    pt0 += 2;                                                                  \
  }                                                                            \
  copy_jmp_addressa(pt0 + 1);                                                  \
  (*_PREG) = (yamop *)(pt0[1]);                                                \
  JMPNext();

#define IF_CONS_END BLOCK = (CELL)IF_CONS_END;

#define INDEX_DBREF_INSTINIT                                                   \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  (*_PREG) = NEXTOP((*_PREG), e);                                              \
  I_R = AbsAppl((*_SREG) - 1);                                                 \
  GONext();

#define INDEX_DBREF_END BLOCK = (CELL)INDEX_DBREF_END;

#define INDEX_BLOB_INSTINIT                                                    \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  (*_PREG) = NEXTOP((*_PREG), e);                                              \
  I_R = Yap_DoubleP_key((*_SREG));                                             \
  GONext();

#define INDEX_BLOB_END BLOCK = (CELL)INDEX_BLOB_END;

#define INDEX_LONG_INSTINIT                                                    \
  BLOCKADDRESS = (CELL)(*_PREG);                                               \
  (*_PREG) = NEXTOP((*_PREG), e);                                              \
  I_R = Yap_IntP_key((*_SREG));                                                \
  GONext();

#define INDEX_LONG_END BLOCK = (CELL)INDEX_LONG_INSTINIT;