private void Loop(ILEmitter il, LocalBuilder enumerator, Label loopStart, LocalBuilder hash)
        {
            il.DefineLabel(out var loopEnd);

            using (il.LocalsScope()) {
                il.MarkLabel(loopStart)
                .Brtrue_S(CallMethod(_moveNextMethod, LoadCaller(enumerator)), out var next)
                .Br(loopEnd)
                .MarkLabel(next);
            }

            using (il.LocalsScope()) {
                var enumerators = new Dictionary <ushort, LocalBuilder>(1)
                {
                    [Arg.Input] = enumerator
                };
                var itemVariable = new EnumerableItemVariable(_enumeratorType, _elementType, _getCurrentMethod, enumerators);

                _resolver
                .GetHasherEmitter(itemVariable)
                .EmitHashing(il, hash)
                .Br(loopStart)
                .MarkLabel(loopEnd);
            }
        }
        private void Loop(ILEmitter il, LocalBuilder xEnumerator, LocalBuilder yEnumerator, Label exitLoop)
        {
            il.DefineLabel(out var loopStart);

            using (il.LocalsScope()) {
                il.MarkLabel(loopStart);
                var(xDone, yDone) = EmitMoveNext(xEnumerator, yEnumerator, il);

                _emitCheckIfLoopsAreDone(il, xDone, yDone, exitLoop);
            }

            using (il.LocalsScope()) {
                var enumerators = new Dictionary <ushort, LocalBuilder>(2)
                {
                    [Arg.X] = xEnumerator,
                    [Arg.Y] = yEnumerator
                };

                var itemVariable   = new EnumerableItemVariable(_enumeratorType, _elementType, _getCurrentMethod, enumerators);
                var itemComparison = _resolver.GetComparisonEmitter(itemVariable);

                il.Emit(itemComparison.Emit(loopStart))
                .Emit(itemComparison.EmitCheckForResult(loopStart));
            }
        }