code: private void onFullMiss(Node node) {
      // Upon accessing an HIR non-resident block X. This is a miss. We remove the HIR resident block
      // at the bottom of stack Q (it then becomes a non-resident block) and evict it from the cache.
      // Then, we load the requested block X into the freed buffer and place it at the top of stack
      // S. There are two cases for the original location of block X: a) If X is in the stack S, we
      // change its status to LIR and move the LIR block at the bottom of stack S to the top of
      // stack Q with its status changed to HIR. A stack pruning is then conducted. This case is
      // illustrated in the transition from state(a) to state(d) in Fig.2. b) If X is not in stack S,
      // we leave its status unchanged and place it at the top of stack Q. This case is illustrated in
      // the transition from state (a) to state (e) in Fig. 2.
  
      node.status = Status.HIR_RESIDENT;
      if (residentSize >= maximumSize) {
        evict();
      }
  
      boolean isInStack = node.isInStack(StackType.S);
      node.moveToTop(StackType.S);
  
      if (isInStack) {
        node.status = Status.LIR;
        sizeHot++;
  
        Node bottom = headS.prevS;
        checkState(bottom.status == Status.LIR);
  
        bottom.status = Status.HIR_RESIDENT;
        bottom.removeFrom(StackType.S);
        bottom.moveToTop(StackType.Q);
        sizeHot--;
  
        pruneStack();
      } else {
        node.moveToTop(StackType.Q);
      }
    }
docs: Records a miss when the hot and cold set are full.