All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodesFactory Maven / Gradle / Ivy

// CheckStyle: start generated
package org.jruby.truffle.stdlib.bigdecimal;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.dsl.GeneratedBy;
import com.oracle.truffle.api.dsl.NodeFactory;
import com.oracle.truffle.api.dsl.UnsupportedSpecializationException;
import com.oracle.truffle.api.dsl.internal.SpecializationNode;
import com.oracle.truffle.api.dsl.internal.SpecializedNode;
import com.oracle.truffle.api.dsl.internal.SuppressFBWarnings;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.NodeCost;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.profiles.ConditionProfile;
import java.util.Arrays;
import java.util.List;
import org.jruby.truffle.builtins.CoreMethodNode;
import org.jruby.truffle.core.cast.IntegerCastNode;
import org.jruby.truffle.core.numeric.FixnumOrBignumNode;
import org.jruby.truffle.language.NotProvided;
import org.jruby.truffle.language.RubyGuards;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyTypes;
import org.jruby.truffle.language.RubyTypesGen;
import org.jruby.truffle.language.SnippetNode;
import org.jruby.truffle.language.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.AbsNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.AddNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.AddOpNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.AllocateNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.CompareNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.DivModNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.DivNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.DivOpNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.ExponentNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.FiniteNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.InfiniteNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.InitializeNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.ModuloNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.MultNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.MultOpNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.NanNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.NegNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.PowerNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.PrecsNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.RemainderNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.RoundNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.SignNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.SqrtNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.SubNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.SubOpNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.ToFNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.ToINode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.UnscaledNode;
import org.jruby.truffle.stdlib.bigdecimal.BigDecimalNodes.ZeroNode;

@GeneratedBy(BigDecimalNodes.class)
public final class BigDecimalNodesFactory {

    public static List> getFactories() {
        return Arrays.asList(InitializeNodeFactory.getInstance(), AddOpNodeFactory.getInstance(), AddNodeFactory.getInstance(), SubOpNodeFactory.getInstance(), SubNodeFactory.getInstance(), NegNodeFactory.getInstance(), MultOpNodeFactory.getInstance(), MultNodeFactory.getInstance(), DivOpNodeFactory.getInstance(), DivNodeFactory.getInstance(), DivModNodeFactory.getInstance(), RemainderNodeFactory.getInstance(), ModuloNodeFactory.getInstance(), PowerNodeFactory.getInstance(), SqrtNodeFactory.getInstance(), CompareNodeFactory.getInstance(), ZeroNodeFactory.getInstance(), SignNodeFactory.getInstance(), NanNodeFactory.getInstance(), ExponentNodeFactory.getInstance(), AbsNodeFactory.getInstance(), RoundNodeFactory.getInstance(), FiniteNodeFactory.getInstance(), InfiniteNodeFactory.getInstance(), PrecsNodeFactory.getInstance(), ToFNodeFactory.getInstance(), UnscaledNodeFactory.getInstance(), ToINodeFactory.getInstance(), AllocateNodeFactory.getInstance());
    }

    @GeneratedBy(InitializeNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class InitializeNodeFactory implements NodeFactory {

        private static InitializeNodeFactory initializeNodeFactoryInstance;

        private InitializeNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return InitializeNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public InitializeNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (initializeNodeFactoryInstance == null) {
                initializeNodeFactoryInstance = new InitializeNodeFactory();
            }
            return initializeNodeFactoryInstance;
        }

        public static InitializeNode create(RubyNode[] arguments) {
            return new InitializeNodeGen(arguments);
        }

        @GeneratedBy(InitializeNode.class)
        public static final class InitializeNodeGen extends InitializeNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private RubyNode arguments1_;
            @Child private RubyNode arguments2_;
            @CompilationFinal private Class arguments2Type_;
            @Child private BaseNode_ specialization_;

            private InitializeNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.arguments1_ = arguments != null && 1 < arguments.length ? arguments[1] : null;
                this.arguments2_ = arguments != null && 2 < arguments.length ? arguments[2] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(InitializeNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected InitializeNodeGen root;

                BaseNode_(InitializeNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (InitializeNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_, root.arguments1_, root.arguments2_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    Object arguments1Value_ = root.arguments1_.execute(frameValue);
                    Object arguments2Value_ = executeArguments2_(frameValue);
                    return execute_(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        if (arguments2Value instanceof NotProvided) {
                            return Initialize0Node_.create(root);
                        }
                        if (RubyTypesGen.isImplicitInteger(arguments2Value)) {
                            return Initialize1Node_.create(root, arguments2Value);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executeArguments2_(Frame frameValue) {
                    Class arguments2Type_ = root.arguments2Type_;
                    try {
                        if (arguments2Type_ == int.class) {
                            return root.arguments2_.executeInteger((VirtualFrame) frameValue);
                        } else if (arguments2Type_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.arguments2_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.arguments2Type_ = _type;
                            }
                        } else {
                            return root.arguments2_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.arguments2Type_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(InitializeNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(InitializeNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return uninitialized(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(InitializeNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(InitializeNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(InitializeNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value, arguments1Value, arguments2Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(InitializeNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "initialize(VirtualFrame, DynamicObject, Object, NotProvided)", value = InitializeNode.class)
            private static final class Initialize0Node_ extends BaseNode_ {

                Initialize0Node_(InitializeNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && arguments2Value instanceof NotProvided) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        NotProvided arguments2Value_ = (NotProvided) arguments2Value;
                        return root.initialize(frameValue, arguments0Value_, arguments1Value, arguments2Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(InitializeNodeGen root) {
                    return new Initialize0Node_(root);
                }

            }
            @GeneratedBy(methodName = "initialize(VirtualFrame, DynamicObject, Object, int)", value = InitializeNode.class)
            private static final class Initialize1Node_ extends BaseNode_ {

                private final Class arguments2ImplicitType;

                Initialize1Node_(InitializeNodeGen root, Object arguments2Value) {
                    super(root, 2);
                    this.arguments2ImplicitType = RubyTypesGen.getImplicitIntegerClass(arguments2Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments2ImplicitType == ((Initialize1Node_) other).arguments2ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = root.arguments1_.execute(frameValue);
                        Object arguments2Value = executeArguments2_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), arguments1Value, arguments2Value);
                    }
                    Object arguments1Value_ = root.arguments1_.execute(frameValue);
                    int arguments2Value_;
                    try {
                        if (arguments2ImplicitType == int.class) {
                            arguments2Value_ = root.arguments2_.executeInteger(frameValue);
                        } else {
                            Object arguments2Value__ = executeArguments2_(frameValue);
                            arguments2Value_ = RubyTypesGen.expectImplicitInteger(arguments2Value__, arguments2ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, arguments0Value_, arguments1Value_, ex.getResult());
                    }
                    return root.initialize(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitInteger(arguments2Value, arguments2ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        int arguments2Value_ = RubyTypesGen.asImplicitInteger(arguments2Value, arguments2ImplicitType);
                        return root.initialize(frameValue, arguments0Value_, arguments1Value, arguments2Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(InitializeNodeGen root, Object arguments2Value) {
                    return new Initialize1Node_(root, arguments2Value);
                }

            }
        }
    }
    @GeneratedBy(AddOpNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class AddOpNodeFactory implements NodeFactory {

        private static AddOpNodeFactory addOpNodeFactoryInstance;

        private AddOpNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return AddOpNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public AddOpNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (addOpNodeFactoryInstance == null) {
                addOpNodeFactoryInstance = new AddOpNodeFactory();
            }
            return addOpNodeFactoryInstance;
        }

        public static AddOpNode create(RubyNode a, RubyNode b) {
            return new AddOpNodeGen(a, b);
        }

        @GeneratedBy(AddOpNode.class)
        public static final class AddOpNodeGen extends AddOpNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private AddOpNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(AddOpNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected AddOpNodeGen root;

                BaseNode_(AddOpNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (AddOpNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return AddNode_.create(root);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return AddSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(AddOpNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(AddOpNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(AddOpNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(AddOpNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(AddOpNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(AddOpNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "add(VirtualFrame, DynamicObject, DynamicObject)", value = AddOpNode.class)
            private static final class AddNode_ extends BaseNode_ {

                AddNode_(AddOpNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.add(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(AddOpNodeGen root) {
                    return new AddNode_(root);
                }

            }
            @GeneratedBy(methodName = "addSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = AddOpNode.class)
            private static final class AddSpecialNode_ extends BaseNode_ {

                AddSpecialNode_(AddOpNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.addSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(AddOpNodeGen root) {
                    return new AddSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(AddNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class AddNodeFactory implements NodeFactory {

        private static AddNodeFactory addNodeFactoryInstance;

        private AddNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return AddNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class));
        }

        @Override
        public AddNode createNode(Object... arguments) {
            if (arguments.length == 3 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode) && (arguments[2] == null || arguments[2] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1], (RubyNode) arguments[2]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (addNodeFactoryInstance == null) {
                addNodeFactoryInstance = new AddNodeFactory();
            }
            return addNodeFactoryInstance;
        }

        public static AddNode create(RubyNode a, RubyNode b, RubyNode precision) {
            return new AddNodeGen(a, b, precision);
        }

        @GeneratedBy(AddNode.class)
        public static final class AddNodeGen extends AddNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private AddNodeGen(RubyNode a, RubyNode b, RubyNode precision) {
                this.a_ = a;
                this.b_ = castB(b);
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(AddNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected AddNodeGen root;

                BaseNode_(AddNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (AddNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue, precisionValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return AddNode_.create(root, precisionValue);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return AddSpecialNode_.create(root, precisionValue);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(AddNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(AddNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return uninitialized(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(AddNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(AddNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(AddNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue, precisionValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(AddNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "add(VirtualFrame, DynamicObject, DynamicObject, int)", value = AddNode.class)
            private static final class AddNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                AddNode_(AddNodeGen root, Object precisionValue) {
                    super(root, 1);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((AddNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.add(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.add(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(AddNodeGen root, Object precisionValue) {
                    return new AddNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "addSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = AddNode.class)
            private static final class AddSpecialNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                AddSpecialNode_(AddNodeGen root, Object precisionValue) {
                    super(root, 2);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((AddSpecialNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                        return root.addSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.addSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(AddNodeGen root, Object precisionValue) {
                    return new AddSpecialNode_(root, precisionValue);
                }

            }
        }
    }
    @GeneratedBy(SubOpNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class SubOpNodeFactory implements NodeFactory {

        private static SubOpNodeFactory subOpNodeFactoryInstance;

        private SubOpNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return SubOpNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public SubOpNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (subOpNodeFactoryInstance == null) {
                subOpNodeFactoryInstance = new SubOpNodeFactory();
            }
            return subOpNodeFactoryInstance;
        }

        public static SubOpNode create(RubyNode a, RubyNode b) {
            return new SubOpNodeGen(a, b);
        }

        @GeneratedBy(SubOpNode.class)
        public static final class SubOpNodeGen extends SubOpNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private SubOpNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(SubOpNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected SubOpNodeGen root;

                BaseNode_(SubOpNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (SubOpNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return SubNormalNode_.create(root);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return SubSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(SubOpNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(SubOpNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(SubOpNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(SubOpNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(SubOpNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(SubOpNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "subNormal(VirtualFrame, DynamicObject, DynamicObject)", value = SubOpNode.class)
            private static final class SubNormalNode_ extends BaseNode_ {

                SubNormalNode_(SubOpNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.subNormal(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(SubOpNodeGen root) {
                    return new SubNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "subSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = SubOpNode.class)
            private static final class SubSpecialNode_ extends BaseNode_ {

                SubSpecialNode_(SubOpNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.subSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(SubOpNodeGen root) {
                    return new SubSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(SubNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class SubNodeFactory implements NodeFactory {

        private static SubNodeFactory subNodeFactoryInstance;

        private SubNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return SubNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class));
        }

        @Override
        public SubNode createNode(Object... arguments) {
            if (arguments.length == 3 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode) && (arguments[2] == null || arguments[2] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1], (RubyNode) arguments[2]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (subNodeFactoryInstance == null) {
                subNodeFactoryInstance = new SubNodeFactory();
            }
            return subNodeFactoryInstance;
        }

        public static SubNode create(RubyNode a, RubyNode b, RubyNode precision) {
            return new SubNodeGen(a, b, precision);
        }

        @GeneratedBy(SubNode.class)
        public static final class SubNodeGen extends SubNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private SubNodeGen(RubyNode a, RubyNode b, RubyNode precision) {
                this.a_ = a;
                this.b_ = castB(b);
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(SubNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected SubNodeGen root;

                BaseNode_(SubNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (SubNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue, precisionValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return SubNormalNode_.create(root, precisionValue);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return SubSpecialNode_.create(root, precisionValue);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(SubNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(SubNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return uninitialized(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(SubNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(SubNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(SubNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue, precisionValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(SubNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "subNormal(VirtualFrame, DynamicObject, DynamicObject, int)", value = SubNode.class)
            private static final class SubNormalNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                SubNormalNode_(SubNodeGen root, Object precisionValue) {
                    super(root, 1);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SubNormalNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.subNormal(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.subNormal(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(SubNodeGen root, Object precisionValue) {
                    return new SubNormalNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "subSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = SubNode.class)
            private static final class SubSpecialNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                SubSpecialNode_(SubNodeGen root, Object precisionValue) {
                    super(root, 2);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SubSpecialNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                        return root.subSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.subSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(SubNodeGen root, Object precisionValue) {
                    return new SubSpecialNode_(root, precisionValue);
                }

            }
        }
    }
    @GeneratedBy(NegNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class NegNodeFactory implements NodeFactory {

        private static NegNodeFactory negNodeFactoryInstance;

        private NegNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return NegNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public NegNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (negNodeFactoryInstance == null) {
                negNodeFactoryInstance = new NegNodeFactory();
            }
            return negNodeFactoryInstance;
        }

        public static NegNode create(RubyNode[] arguments) {
            return new NegNodeGen(arguments);
        }

        @GeneratedBy(NegNode.class)
        public static final class NegNodeGen extends NegNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private NegNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(NegNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected NegNodeGen root;

                BaseNode_(NegNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (NegNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            return NegNormalNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return NegNormalZeroNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            ConditionProfile nanProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile negZeroProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile infProfile3 = (ConditionProfile.createBinaryProfile());
                            return NegSpecialNode_.create(root, nanProfile3, negZeroProfile3, infProfile3);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(NegNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(NegNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(NegNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(NegNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(NegNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NegNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "negNormal(VirtualFrame, DynamicObject)", value = NegNode.class)
            private static final class NegNormalNode_ extends BaseNode_ {

                NegNormalNode_(NegNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            return root.negNormal(frameValue, arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NegNodeGen root) {
                    return new NegNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "negNormalZero(VirtualFrame, DynamicObject)", value = NegNode.class)
            private static final class NegNormalZeroNode_ extends BaseNode_ {

                NegNormalZeroNode_(NegNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return root.negNormalZero(frameValue, arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NegNodeGen root) {
                    return new NegNormalZeroNode_(root);
                }

            }
            @GeneratedBy(methodName = "negSpecial(VirtualFrame, DynamicObject, ConditionProfile, ConditionProfile, ConditionProfile)", value = NegNode.class)
            private static final class NegSpecialNode_ extends BaseNode_ {

                private final ConditionProfile nanProfile;
                private final ConditionProfile negZeroProfile;
                private final ConditionProfile infProfile;

                NegSpecialNode_(NegNodeGen root, ConditionProfile nanProfile, ConditionProfile negZeroProfile, ConditionProfile infProfile) {
                    super(root, 3);
                    this.nanProfile = nanProfile;
                    this.negZeroProfile = negZeroProfile;
                    this.infProfile = infProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.negSpecial(frameValue, arguments0Value_, this.nanProfile, this.negZeroProfile, this.infProfile);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NegNodeGen root, ConditionProfile nanProfile, ConditionProfile negZeroProfile, ConditionProfile infProfile) {
                    return new NegSpecialNode_(root, nanProfile, negZeroProfile, infProfile);
                }

            }
        }
    }
    @GeneratedBy(MultOpNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class MultOpNodeFactory implements NodeFactory {

        private static MultOpNodeFactory multOpNodeFactoryInstance;

        private MultOpNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return MultOpNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public MultOpNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (multOpNodeFactoryInstance == null) {
                multOpNodeFactoryInstance = new MultOpNodeFactory();
            }
            return multOpNodeFactoryInstance;
        }

        public static MultOpNode create(RubyNode a, RubyNode b) {
            return new MultOpNodeGen(a, b);
        }

        @GeneratedBy(MultOpNode.class)
        public static final class MultOpNodeGen extends MultOpNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private MultOpNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(MultOpNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected MultOpNodeGen root;

                BaseNode_(MultOpNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (MultOpNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return MultNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return MultNormalSpecialNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return MultSpecialNormalNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return MultSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(MultOpNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(MultOpNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(MultOpNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(MultOpNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "mult(VirtualFrame, DynamicObject, DynamicObject)", value = MultOpNode.class)
            private static final class MultNode_ extends BaseNode_ {

                MultNode_(MultOpNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.mult(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new MultNode_(root);
                }

            }
            @GeneratedBy(methodName = "multNormalSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = MultOpNode.class)
            private static final class MultNormalSpecialNode_ extends BaseNode_ {

                MultNormalSpecialNode_(MultOpNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.multNormalSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new MultNormalSpecialNode_(root);
                }

            }
            @GeneratedBy(methodName = "multSpecialNormal(VirtualFrame, DynamicObject, DynamicObject)", value = MultOpNode.class)
            private static final class MultSpecialNormalNode_ extends BaseNode_ {

                MultSpecialNormalNode_(MultOpNodeGen root) {
                    super(root, 3);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.multSpecialNormal(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new MultSpecialNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "multSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = MultOpNode.class)
            private static final class MultSpecialNode_ extends BaseNode_ {

                MultSpecialNode_(MultOpNodeGen root) {
                    super(root, 4);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.multSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(MultOpNodeGen root) {
                    return new MultSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(MultNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class MultNodeFactory implements NodeFactory {

        private static MultNodeFactory multNodeFactoryInstance;

        private MultNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return MultNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class));
        }

        @Override
        public MultNode createNode(Object... arguments) {
            if (arguments.length == 3 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode) && (arguments[2] == null || arguments[2] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1], (RubyNode) arguments[2]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (multNodeFactoryInstance == null) {
                multNodeFactoryInstance = new MultNodeFactory();
            }
            return multNodeFactoryInstance;
        }

        public static MultNode create(RubyNode a, RubyNode b, RubyNode precision) {
            return new MultNodeGen(a, b, precision);
        }

        @GeneratedBy(MultNode.class)
        public static final class MultNodeGen extends MultNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private MultNodeGen(RubyNode a, RubyNode b, RubyNode precision) {
                this.a_ = a;
                this.b_ = castB(b);
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(MultNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected MultNodeGen root;

                BaseNode_(MultNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (MultNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue, precisionValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return MultNode_.create(root, precisionValue);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return MultNormalSpecialNode_.create(root, precisionValue);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return MultSpecialNormalNode_.create(root, precisionValue);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return MultSpecialNode_.create(root, precisionValue);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(MultNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(MultNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return uninitialized(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(MultNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(MultNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue, precisionValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "mult(VirtualFrame, DynamicObject, DynamicObject, int)", value = MultNode.class)
            private static final class MultNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                MultNode_(MultNodeGen root, Object precisionValue) {
                    super(root, 1);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((MultNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.mult(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.mult(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root, Object precisionValue) {
                    return new MultNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "multNormalSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = MultNode.class)
            private static final class MultNormalSpecialNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                MultNormalSpecialNode_(MultNodeGen root, Object precisionValue) {
                    super(root, 2);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((MultNormalSpecialNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                        return root.multNormalSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.multNormalSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root, Object precisionValue) {
                    return new MultNormalSpecialNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "multSpecialNormal(VirtualFrame, DynamicObject, DynamicObject, int)", value = MultNode.class)
            private static final class MultSpecialNormalNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                MultSpecialNormalNode_(MultNodeGen root, Object precisionValue) {
                    super(root, 3);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((MultSpecialNormalNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.multSpecialNormal(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.multSpecialNormal(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root, Object precisionValue) {
                    return new MultSpecialNormalNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "multSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = MultNode.class)
            private static final class MultSpecialNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                MultSpecialNode_(MultNodeGen root, Object precisionValue) {
                    super(root, 4);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((MultSpecialNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                        return root.multSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.multSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(MultNodeGen root, Object precisionValue) {
                    return new MultSpecialNode_(root, precisionValue);
                }

            }
        }
    }
    @GeneratedBy(DivOpNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class DivOpNodeFactory implements NodeFactory {

        private static DivOpNodeFactory divOpNodeFactoryInstance;

        private DivOpNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return DivOpNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public DivOpNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (divOpNodeFactoryInstance == null) {
                divOpNodeFactoryInstance = new DivOpNodeFactory();
            }
            return divOpNodeFactoryInstance;
        }

        public static DivOpNode create(RubyNode a, RubyNode b) {
            return new DivOpNodeGen(a, b);
        }

        @GeneratedBy(DivOpNode.class)
        public static final class DivOpNodeGen extends DivOpNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private DivOpNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(DivOpNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected DivOpNodeGen root;

                BaseNode_(DivOpNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (DivOpNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return DivNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return DivNormalSpecialNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return DivSpecialNormalNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return DivSpecialSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(DivOpNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(DivOpNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(DivOpNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(DivOpNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "div(VirtualFrame, DynamicObject, DynamicObject)", value = DivOpNode.class)
            private static final class DivNode_ extends BaseNode_ {

                DivNode_(DivOpNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.div(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new DivNode_(root);
                }

            }
            @GeneratedBy(methodName = "divNormalSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = DivOpNode.class)
            private static final class DivNormalSpecialNode_ extends BaseNode_ {

                DivNormalSpecialNode_(DivOpNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divNormalSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new DivNormalSpecialNode_(root);
                }

            }
            @GeneratedBy(methodName = "divSpecialNormal(VirtualFrame, DynamicObject, DynamicObject)", value = DivOpNode.class)
            private static final class DivSpecialNormalNode_ extends BaseNode_ {

                DivSpecialNormalNode_(DivOpNodeGen root) {
                    super(root, 3);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.divSpecialNormal(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new DivSpecialNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "divSpecialSpecial(VirtualFrame, DynamicObject, DynamicObject)", value = DivOpNode.class)
            private static final class DivSpecialSpecialNode_ extends BaseNode_ {

                DivSpecialSpecialNode_(DivOpNodeGen root) {
                    super(root, 4);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divSpecialSpecial(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivOpNodeGen root) {
                    return new DivSpecialSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(DivNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class DivNodeFactory implements NodeFactory {

        private static DivNodeFactory divNodeFactoryInstance;

        private DivNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return DivNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class));
        }

        @Override
        public DivNode createNode(Object... arguments) {
            if (arguments.length == 3 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode) && (arguments[2] == null || arguments[2] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1], (RubyNode) arguments[2]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (divNodeFactoryInstance == null) {
                divNodeFactoryInstance = new DivNodeFactory();
            }
            return divNodeFactoryInstance;
        }

        public static DivNode create(RubyNode a, RubyNode b, RubyNode precision) {
            return new DivNodeGen(a, b, precision);
        }

        @GeneratedBy(DivNode.class)
        public static final class DivNodeGen extends DivNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private DivNodeGen(RubyNode a, RubyNode b, RubyNode precision) {
                this.a_ = a;
                this.b_ = castB(b);
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(DivNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected DivNodeGen root;

                BaseNode_(DivNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (DivNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue, precisionValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if (precisionValue instanceof NotProvided) {
                            if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                                ConditionProfile bZeroProfile1 = (ConditionProfile.createBinaryProfile());
                                CallDispatchHeadNode floorNode1 = (CallDispatchHeadNode.createMethodCall());
                                return Div0Node_.create(root, bZeroProfile1, floorNode1);
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(precisionValue)) {
                            if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                                ConditionProfile zeroPrecisionProfile2 = (ConditionProfile.createBinaryProfile());
                                return Div1Node_.create(root, precisionValue, zeroPrecisionProfile2);
                            }
                        }
                        if (precisionValue instanceof NotProvided) {
                            if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                                ConditionProfile negativeZeroProfile3 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile nanProfile3 = (ConditionProfile.createBinaryProfile());
                                return DivNormalSpecial0Node_.create(root, negativeZeroProfile3, nanProfile3);
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(precisionValue)) {
                            if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                                return DivNormalSpecial1Node_.create(root, precisionValue);
                            }
                        }
                        if (precisionValue instanceof NotProvided) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                                ConditionProfile zeroDivisionProfile5 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile nanProfile5 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile infinityProfile5 = (ConditionProfile.createBinaryProfile());
                                return DivSpecialNormal0Node_.create(root, zeroDivisionProfile5, nanProfile5, infinityProfile5);
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(precisionValue)) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                                return DivSpecialNormal1Node_.create(root, precisionValue);
                            }
                        }
                        if (precisionValue instanceof NotProvided) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                                ConditionProfile negZeroProfile7 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile nanProfile7 = (ConditionProfile.createBinaryProfile());
                                return DivSpecialSpecial0Node_.create(root, negZeroProfile7, nanProfile7);
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(precisionValue)) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                                return DivSpecialSpecial1Node_.create(root, precisionValue);
                            }
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(DivNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(DivNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return uninitialized(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(DivNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(DivNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue, precisionValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "div(VirtualFrame, DynamicObject, DynamicObject, NotProvided, ConditionProfile, CallDispatchHeadNode)", value = DivNode.class)
            private static final class Div0Node_ extends BaseNode_ {

                private final ConditionProfile bZeroProfile;
                @Child private CallDispatchHeadNode floorNode;

                Div0Node_(DivNodeGen root, ConditionProfile bZeroProfile, CallDispatchHeadNode floorNode) {
                    super(root, 1);
                    this.bZeroProfile = bZeroProfile;
                    this.floorNode = floorNode;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && precisionValue instanceof NotProvided) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        NotProvided precisionValue_ = (NotProvided) precisionValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.div(frameValue, aValue_, bValue_, precisionValue_, this.bZeroProfile, this.floorNode);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, ConditionProfile bZeroProfile, CallDispatchHeadNode floorNode) {
                    return new Div0Node_(root, bZeroProfile, floorNode);
                }

            }
            @GeneratedBy(methodName = "div(VirtualFrame, DynamicObject, DynamicObject, int, ConditionProfile)", value = DivNode.class)
            private static final class Div1Node_ extends BaseNode_ {

                private final ConditionProfile zeroPrecisionProfile;
                private final Class precisionImplicitType;

                Div1Node_(DivNodeGen root, Object precisionValue, ConditionProfile zeroPrecisionProfile) {
                    super(root, 2);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                    this.zeroPrecisionProfile = zeroPrecisionProfile;
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((Div1Node_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.div(frameValue, aValue_, bValue_, precisionValue_, this.zeroPrecisionProfile);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.div(frameValue, aValue_, bValue_, precisionValue_, this.zeroPrecisionProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, Object precisionValue, ConditionProfile zeroPrecisionProfile) {
                    return new Div1Node_(root, precisionValue, zeroPrecisionProfile);
                }

            }
            @GeneratedBy(methodName = "divNormalSpecial(VirtualFrame, DynamicObject, DynamicObject, NotProvided, ConditionProfile, ConditionProfile)", value = DivNode.class)
            private static final class DivNormalSpecial0Node_ extends BaseNode_ {

                private final ConditionProfile negativeZeroProfile;
                private final ConditionProfile nanProfile;

                DivNormalSpecial0Node_(DivNodeGen root, ConditionProfile negativeZeroProfile, ConditionProfile nanProfile) {
                    super(root, 3);
                    this.negativeZeroProfile = negativeZeroProfile;
                    this.nanProfile = nanProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && precisionValue instanceof NotProvided) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        NotProvided precisionValue_ = (NotProvided) precisionValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divNormalSpecial(frameValue, aValue_, bValue_, precisionValue_, this.negativeZeroProfile, this.nanProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, ConditionProfile negativeZeroProfile, ConditionProfile nanProfile) {
                    return new DivNormalSpecial0Node_(root, negativeZeroProfile, nanProfile);
                }

            }
            @GeneratedBy(methodName = "divNormalSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = DivNode.class)
            private static final class DivNormalSpecial1Node_ extends BaseNode_ {

                private final Class precisionImplicitType;

                DivNormalSpecial1Node_(DivNodeGen root, Object precisionValue) {
                    super(root, 4);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((DivNormalSpecial1Node_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                        return root.divNormalSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divNormalSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, Object precisionValue) {
                    return new DivNormalSpecial1Node_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "divSpecialNormal(VirtualFrame, DynamicObject, DynamicObject, NotProvided, ConditionProfile, ConditionProfile, ConditionProfile)", value = DivNode.class)
            private static final class DivSpecialNormal0Node_ extends BaseNode_ {

                private final ConditionProfile zeroDivisionProfile;
                private final ConditionProfile nanProfile;
                private final ConditionProfile infinityProfile;

                DivSpecialNormal0Node_(DivNodeGen root, ConditionProfile zeroDivisionProfile, ConditionProfile nanProfile, ConditionProfile infinityProfile) {
                    super(root, 5);
                    this.zeroDivisionProfile = zeroDivisionProfile;
                    this.nanProfile = nanProfile;
                    this.infinityProfile = infinityProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && precisionValue instanceof NotProvided) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        NotProvided precisionValue_ = (NotProvided) precisionValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.divSpecialNormal(frameValue, aValue_, bValue_, precisionValue_, this.zeroDivisionProfile, this.nanProfile, this.infinityProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, ConditionProfile zeroDivisionProfile, ConditionProfile nanProfile, ConditionProfile infinityProfile) {
                    return new DivSpecialNormal0Node_(root, zeroDivisionProfile, nanProfile, infinityProfile);
                }

            }
            @GeneratedBy(methodName = "divSpecialNormal(VirtualFrame, DynamicObject, DynamicObject, int)", value = DivNode.class)
            private static final class DivSpecialNormal1Node_ extends BaseNode_ {

                private final Class precisionImplicitType;

                DivSpecialNormal1Node_(DivNodeGen root, Object precisionValue) {
                    super(root, 6);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((DivSpecialNormal1Node_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                        return root.divSpecialNormal(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_))) {
                            return root.divSpecialNormal(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, Object precisionValue) {
                    return new DivSpecialNormal1Node_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "divSpecialSpecial(VirtualFrame, DynamicObject, DynamicObject, NotProvided, ConditionProfile, ConditionProfile)", value = DivNode.class)
            private static final class DivSpecialSpecial0Node_ extends BaseNode_ {

                private final ConditionProfile negZeroProfile;
                private final ConditionProfile nanProfile;

                DivSpecialSpecial0Node_(DivNodeGen root, ConditionProfile negZeroProfile, ConditionProfile nanProfile) {
                    super(root, 7);
                    this.negZeroProfile = negZeroProfile;
                    this.nanProfile = nanProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && precisionValue instanceof NotProvided) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        NotProvided precisionValue_ = (NotProvided) precisionValue;
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divSpecialSpecial(frameValue, aValue_, bValue_, precisionValue_, this.negZeroProfile, this.nanProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, ConditionProfile negZeroProfile, ConditionProfile nanProfile) {
                    return new DivSpecialSpecial0Node_(root, negZeroProfile, nanProfile);
                }

            }
            @GeneratedBy(methodName = "divSpecialSpecial(VirtualFrame, DynamicObject, DynamicObject, int)", value = DivNode.class)
            private static final class DivSpecialSpecial1Node_ extends BaseNode_ {

                private final Class precisionImplicitType;

                DivSpecialSpecial1Node_(DivNodeGen root, Object precisionValue) {
                    super(root, 8);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((DivSpecialSpecial1Node_) other).precisionImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject aValue_;
                    try {
                        aValue_ = root.a_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object bValue = root.b_.execute(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), bValue, precisionValue);
                    }
                    DynamicObject bValue_;
                    try {
                        bValue_ = root.b_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, aValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, aValue_, bValue_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                        return root.divSpecialSpecial(frameValue, aValue_, bValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, aValue_, bValue_, precisionValue_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue, Object precisionValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(aValue_))) && (BigDecimalCoreMethodNode.isSpecialRubyBigDecimal(bValue_))) {
                            return root.divSpecialSpecial(frameValue, aValue_, bValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue, precisionValue);
                }

                static BaseNode_ create(DivNodeGen root, Object precisionValue) {
                    return new DivSpecialSpecial1Node_(root, precisionValue);
                }

            }
        }
    }
    @GeneratedBy(DivModNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class DivModNodeFactory implements NodeFactory {

        private static DivModNodeFactory divModNodeFactoryInstance;

        private DivModNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return DivModNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public DivModNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (divModNodeFactoryInstance == null) {
                divModNodeFactoryInstance = new DivModNodeFactory();
            }
            return divModNodeFactoryInstance;
        }

        public static DivModNode create(RubyNode a, RubyNode b) {
            return new DivModNodeGen(a, b);
        }

        @GeneratedBy(DivModNode.class)
        public static final class DivModNodeGen extends DivModNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private DivModNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(DivModNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected DivModNodeGen root;

                BaseNode_(DivModNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (DivModNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(aValue_))) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return DivmodNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(aValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return DivmodZeroDividendNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return DivmodZeroDivisorNode_.create(root);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            CallDispatchHeadNode signCall4 = (CallDispatchHeadNode.createMethodCall());
                            IntegerCastNode signIntegerCast4 = (root.createIntegerCastNode());
                            ConditionProfile nanProfile4 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile normalNegProfile4 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile negNormalProfile4 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile infinityProfile4 = (ConditionProfile.createBinaryProfile());
                            return DivmodSpecialNode_.create(root, signCall4, signIntegerCast4, nanProfile4, normalNegProfile4, negNormalProfile4, infinityProfile4);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(DivModNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(DivModNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(DivModNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(DivModNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "divmod(VirtualFrame, DynamicObject, DynamicObject)", value = DivModNode.class)
            private static final class DivmodNode_ extends BaseNode_ {

                DivmodNode_(DivModNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(aValue_))) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return root.divmod(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root) {
                    return new DivmodNode_(root);
                }

            }
            @GeneratedBy(methodName = "divmodZeroDividend(VirtualFrame, DynamicObject, DynamicObject)", value = DivModNode.class)
            private static final class DivmodZeroDividendNode_ extends BaseNode_ {

                DivmodZeroDividendNode_(DivModNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(aValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return root.divmodZeroDividend(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root) {
                    return new DivmodZeroDividendNode_(root);
                }

            }
            @GeneratedBy(methodName = "divmodZeroDivisor(DynamicObject, DynamicObject)", value = DivModNode.class)
            private static final class DivmodZeroDivisorNode_ extends BaseNode_ {

                DivmodZeroDivisorNode_(DivModNodeGen root) {
                    super(root, 3);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return root.divmodZeroDivisor(aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root) {
                    return new DivmodZeroDivisorNode_(root);
                }

            }
            @GeneratedBy(methodName = "divmodSpecial(VirtualFrame, DynamicObject, DynamicObject, CallDispatchHeadNode, IntegerCastNode, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile)", value = DivModNode.class)
            private static final class DivmodSpecialNode_ extends BaseNode_ {

                @Child private CallDispatchHeadNode signCall;
                @Child private IntegerCastNode signIntegerCast;
                private final ConditionProfile nanProfile;
                private final ConditionProfile normalNegProfile;
                private final ConditionProfile negNormalProfile;
                private final ConditionProfile infinityProfile;

                DivmodSpecialNode_(DivModNodeGen root, CallDispatchHeadNode signCall, IntegerCastNode signIntegerCast, ConditionProfile nanProfile, ConditionProfile normalNegProfile, ConditionProfile negNormalProfile, ConditionProfile infinityProfile) {
                    super(root, 4);
                    this.signCall = signCall;
                    this.signIntegerCast = signIntegerCast;
                    this.nanProfile = nanProfile;
                    this.normalNegProfile = normalNegProfile;
                    this.negNormalProfile = negNormalProfile;
                    this.infinityProfile = infinityProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.divmodSpecial(frameValue, aValue_, bValue_, this.signCall, this.signIntegerCast, this.nanProfile, this.normalNegProfile, this.negNormalProfile, this.infinityProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(DivModNodeGen root, CallDispatchHeadNode signCall, IntegerCastNode signIntegerCast, ConditionProfile nanProfile, ConditionProfile normalNegProfile, ConditionProfile negNormalProfile, ConditionProfile infinityProfile) {
                    return new DivmodSpecialNode_(root, signCall, signIntegerCast, nanProfile, normalNegProfile, negNormalProfile, infinityProfile);
                }

            }
        }
    }
    @GeneratedBy(RemainderNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class RemainderNodeFactory implements NodeFactory {

        private static RemainderNodeFactory remainderNodeFactoryInstance;

        private RemainderNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return RemainderNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public RemainderNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (remainderNodeFactoryInstance == null) {
                remainderNodeFactoryInstance = new RemainderNodeFactory();
            }
            return remainderNodeFactoryInstance;
        }

        public static RemainderNode create(RubyNode a, RubyNode b) {
            return new RemainderNodeGen(a, b);
        }

        @GeneratedBy(RemainderNode.class)
        public static final class RemainderNodeGen extends RemainderNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private RemainderNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(RemainderNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected RemainderNodeGen root;

                BaseNode_(RemainderNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (RemainderNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return RemainderNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return RemainderZeroNode_.create(root);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            ConditionProfile zeroProfile3 = (ConditionProfile.createBinaryProfile());
                            return RemainderSpecialNode_.create(root, zeroProfile3);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(RemainderNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(RemainderNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(RemainderNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(RemainderNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(RemainderNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(RemainderNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "remainder(VirtualFrame, DynamicObject, DynamicObject)", value = RemainderNode.class)
            private static final class RemainderNode_ extends BaseNode_ {

                RemainderNode_(RemainderNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return root.remainder(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(RemainderNodeGen root) {
                    return new RemainderNode_(root);
                }

            }
            @GeneratedBy(methodName = "remainderZero(VirtualFrame, DynamicObject, DynamicObject)", value = RemainderNode.class)
            private static final class RemainderZeroNode_ extends BaseNode_ {

                RemainderZeroNode_(RemainderNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return root.remainderZero(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(RemainderNodeGen root) {
                    return new RemainderZeroNode_(root);
                }

            }
            @GeneratedBy(methodName = "remainderSpecial(VirtualFrame, DynamicObject, DynamicObject, ConditionProfile)", value = RemainderNode.class)
            private static final class RemainderSpecialNode_ extends BaseNode_ {

                private final ConditionProfile zeroProfile;

                RemainderSpecialNode_(RemainderNodeGen root, ConditionProfile zeroProfile) {
                    super(root, 3);
                    this.zeroProfile = zeroProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.remainderSpecial(frameValue, aValue_, bValue_, this.zeroProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(RemainderNodeGen root, ConditionProfile zeroProfile) {
                    return new RemainderSpecialNode_(root, zeroProfile);
                }

            }
        }
    }
    @GeneratedBy(ModuloNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class ModuloNodeFactory implements NodeFactory {

        private static ModuloNodeFactory moduloNodeFactoryInstance;

        private ModuloNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return ModuloNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public ModuloNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (moduloNodeFactoryInstance == null) {
                moduloNodeFactoryInstance = new ModuloNodeFactory();
            }
            return moduloNodeFactoryInstance;
        }

        public static ModuloNode create(RubyNode a, RubyNode b) {
            return new ModuloNodeGen(a, b);
        }

        @GeneratedBy(ModuloNode.class)
        public static final class ModuloNodeGen extends ModuloNode implements SpecializedNode {

            @Child private RubyNode a_;
            @Child private RubyNode b_;
            @Child private BaseNode_ specialization_;

            private ModuloNodeGen(RubyNode a, RubyNode b) {
                this.a_ = a;
                this.b_ = castB(b);
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(ModuloNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected ModuloNodeGen root;

                BaseNode_(ModuloNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (ModuloNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.a_, root.b_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object aValue, Object bValue) {
                    return this.execute_((VirtualFrame) frameValue, aValue, bValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object aValue, Object bValue);

                public Object execute(VirtualFrame frameValue) {
                    Object aValue_ = root.a_.execute(frameValue);
                    Object bValue_ = root.b_.execute(frameValue);
                    return execute_(frameValue, aValue_, bValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return ModuloNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return ModuloZeroNode_.create(root);
                        }
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            ConditionProfile nanProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile normalNegProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile negNormalProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile posNegInfProfile3 = (ConditionProfile.createBinaryProfile());
                            ConditionProfile negPosInfProfile3 = (ConditionProfile.createBinaryProfile());
                            return ModuloSpecialNode_.create(root, nanProfile3, normalNegProfile3, negNormalProfile3, posNegInfProfile3, negPosInfProfile3);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(ModuloNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(ModuloNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return uninitialized(frameValue, aValue, bValue);
                }

                static BaseNode_ create(ModuloNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(ModuloNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(ModuloNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object aValue, Object bValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, aValue, bValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(ModuloNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "modulo(VirtualFrame, DynamicObject, DynamicObject)", value = ModuloNode.class)
            private static final class ModuloNode_ extends BaseNode_ {

                ModuloNode_(ModuloNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormalZero(bValue_)))) {
                            return root.modulo(frameValue, aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(ModuloNodeGen root) {
                    return new ModuloNode_(root);
                }

            }
            @GeneratedBy(methodName = "moduloZero(DynamicObject, DynamicObject)", value = ModuloNode.class)
            private static final class ModuloZeroNode_ extends BaseNode_ {

                ModuloZeroNode_(ModuloNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((BigDecimalCoreMethodNode.isNormal(aValue_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(bValue_)) && (BigDecimalCoreMethodNode.isNormalZero(bValue_))) {
                            return root.moduloZero(aValue_, bValue_);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(ModuloNodeGen root) {
                    return new ModuloZeroNode_(root);
                }

            }
            @GeneratedBy(methodName = "moduloSpecial(VirtualFrame, DynamicObject, DynamicObject, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile)", value = ModuloNode.class)
            private static final class ModuloSpecialNode_ extends BaseNode_ {

                private final ConditionProfile nanProfile;
                private final ConditionProfile normalNegProfile;
                private final ConditionProfile negNormalProfile;
                private final ConditionProfile posNegInfProfile;
                private final ConditionProfile negPosInfProfile;

                ModuloSpecialNode_(ModuloNodeGen root, ConditionProfile nanProfile, ConditionProfile normalNegProfile, ConditionProfile negNormalProfile, ConditionProfile posNegInfProfile, ConditionProfile negPosInfProfile) {
                    super(root, 3);
                    this.nanProfile = nanProfile;
                    this.normalNegProfile = normalNegProfile;
                    this.negNormalProfile = negNormalProfile;
                    this.posNegInfProfile = posNegInfProfile;
                    this.negPosInfProfile = negPosInfProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object aValue, Object bValue) {
                    if (aValue instanceof DynamicObject && bValue instanceof DynamicObject) {
                        DynamicObject aValue_ = (DynamicObject) aValue;
                        DynamicObject bValue_ = (DynamicObject) bValue;
                        if ((RubyGuards.isRubyBigDecimal(bValue_)) && (!(BigDecimalCoreMethodNode.isNormal(aValue_)) || !(BigDecimalCoreMethodNode.isNormal(bValue_)))) {
                            return root.moduloSpecial(frameValue, aValue_, bValue_, this.nanProfile, this.normalNegProfile, this.negNormalProfile, this.posNegInfProfile, this.negPosInfProfile);
                        }
                    }
                    return getNext().execute_(frameValue, aValue, bValue);
                }

                static BaseNode_ create(ModuloNodeGen root, ConditionProfile nanProfile, ConditionProfile normalNegProfile, ConditionProfile negNormalProfile, ConditionProfile posNegInfProfile, ConditionProfile negPosInfProfile) {
                    return new ModuloSpecialNode_(root, nanProfile, normalNegProfile, negNormalProfile, posNegInfProfile, negPosInfProfile);
                }

            }
        }
    }
    @GeneratedBy(PowerNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class PowerNodeFactory implements NodeFactory {

        private static PowerNodeFactory powerNodeFactoryInstance;

        private PowerNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return PowerNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class));
        }

        @Override
        public PowerNode createNode(Object... arguments) {
            if (arguments.length == 3 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode) && (arguments[2] == null || arguments[2] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1], (RubyNode) arguments[2]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (powerNodeFactoryInstance == null) {
                powerNodeFactoryInstance = new PowerNodeFactory();
            }
            return powerNodeFactoryInstance;
        }

        public static PowerNode create(RubyNode self, RubyNode exponent, RubyNode precision) {
            return new PowerNodeGen(self, exponent, precision);
        }

        @GeneratedBy(PowerNode.class)
        public static final class PowerNodeGen extends PowerNode implements SpecializedNode {

            @Child private RubyNode self_;
            @Child private RubyNode exponent_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class exponentType_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private PowerNodeGen(RubyNode self, RubyNode exponent, RubyNode precision) {
                this.self_ = self;
                this.exponent_ = exponent;
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object executePower(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                return specialization_.execute1(frameValue, selfValue, exponentValue, precisionValue);
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute0(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(PowerNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected PowerNodeGen root;

                BaseNode_(PowerNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (PowerNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.self_, root.exponent_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    return this.execute1((VirtualFrame) frameValue, selfValue, exponentValue, precisionValue);
                }

                public abstract Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue);

                public Object execute0(VirtualFrame frameValue) {
                    Object selfValue_ = root.self_.execute(frameValue);
                    Object exponentValue_ = executeExponent_(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute1(frameValue, selfValue_, exponentValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute0(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(exponentValue)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        if (precisionValue instanceof NotProvided) {
                            if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                                return Power0Node_.create(root, exponentValue);
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(precisionValue)) {
                            if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                                ConditionProfile positiveExponentProfile2 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile zeroProfile2 = (ConditionProfile.createBinaryProfile());
                                ConditionProfile zeroExponentProfile2 = (ConditionProfile.createBinaryProfile());
                                return Power1Node_.create(root, exponentValue, precisionValue, positiveExponentProfile2, zeroProfile2, zeroExponentProfile2);
                            }
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_)))) {
                            BranchProfile nanProfile3 = (BranchProfile.create());
                            BranchProfile posInfinityProfile3 = (BranchProfile.create());
                            BranchProfile negInfinityProfile3 = (BranchProfile.create());
                            BranchProfile negZeroProfile3 = (BranchProfile.create());
                            return Power2Node_.create(root, exponentValue, nanProfile3, posInfinityProfile3, negInfinityProfile3, negZeroProfile3);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executeExponent_(Frame frameValue) {
                    Class exponentType_ = root.exponentType_;
                    try {
                        if (exponentType_ == int.class) {
                            return root.exponent_.executeInteger((VirtualFrame) frameValue);
                        } else if (exponentType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.exponent_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.exponentType_ = _type;
                            }
                        } else {
                            return root.exponent_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.exponentType_ = Object.class;
                        return ex.getResult();
                    }
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(PowerNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(PowerNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    return uninitialized(frameValue, selfValue, exponentValue, precisionValue);
                }

                static BaseNode_ create(PowerNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(PowerNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(PowerNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, selfValue, exponentValue, precisionValue));
                }

                @Override
                public Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    return getNext().execute1(frameValue, selfValue, exponentValue, precisionValue);
                }

                static BaseNode_ create(PowerNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "power(VirtualFrame, DynamicObject, int, NotProvided)", value = PowerNode.class)
            private static final class Power0Node_ extends BaseNode_ {

                private final Class exponentImplicitType;

                Power0Node_(PowerNodeGen root, Object exponentValue) {
                    super(root, 1);
                    this.exponentImplicitType = RubyTypesGen.getImplicitIntegerClass(exponentValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.exponentImplicitType == ((Power0Node_) other).exponentImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object exponentValue = executeExponent_(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, ex.getResult(), exponentValue, precisionValue);
                    }
                    int exponentValue_;
                    try {
                        if (exponentImplicitType == int.class) {
                            exponentValue_ = root.exponent_.executeInteger(frameValue);
                        } else {
                            Object exponentValue__ = executeExponent_(frameValue);
                            exponentValue_ = RubyTypesGen.expectImplicitInteger(exponentValue__, exponentImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, selfValue_, ex.getResult(), precisionValue);
                    }
                    NotProvided precisionValue_;
                    try {
                        precisionValue_ = root.precision_.executeNotProvided(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute1(frameValue, selfValue_, exponentValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                        return root.power(frameValue, selfValue_, exponentValue_, precisionValue_);
                    }
                    return getNext().execute1(frameValue, selfValue_, exponentValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(exponentValue, exponentImplicitType) && precisionValue instanceof NotProvided) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int exponentValue_ = RubyTypesGen.asImplicitInteger(exponentValue, exponentImplicitType);
                        NotProvided precisionValue_ = (NotProvided) precisionValue;
                        if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                            return root.power(frameValue, selfValue_, exponentValue_, precisionValue_);
                        }
                    }
                    return getNext().execute1(frameValue, selfValue, exponentValue, precisionValue);
                }

                static BaseNode_ create(PowerNodeGen root, Object exponentValue) {
                    return new Power0Node_(root, exponentValue);
                }

            }
            @GeneratedBy(methodName = "power(VirtualFrame, DynamicObject, int, int, ConditionProfile, ConditionProfile, ConditionProfile)", value = PowerNode.class)
            private static final class Power1Node_ extends BaseNode_ {

                private final ConditionProfile positiveExponentProfile;
                private final ConditionProfile zeroProfile;
                private final ConditionProfile zeroExponentProfile;
                private final Class exponentImplicitType;
                private final Class precisionImplicitType;

                Power1Node_(PowerNodeGen root, Object exponentValue, Object precisionValue, ConditionProfile positiveExponentProfile, ConditionProfile zeroProfile, ConditionProfile zeroExponentProfile) {
                    super(root, 2);
                    this.exponentImplicitType = RubyTypesGen.getImplicitIntegerClass(exponentValue);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                    this.positiveExponentProfile = positiveExponentProfile;
                    this.zeroProfile = zeroProfile;
                    this.zeroExponentProfile = zeroExponentProfile;
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.exponentImplicitType == ((Power1Node_) other).exponentImplicitType && this.precisionImplicitType == ((Power1Node_) other).precisionImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object exponentValue = executeExponent_(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, ex.getResult(), exponentValue, precisionValue);
                    }
                    int exponentValue_;
                    try {
                        if (exponentImplicitType == int.class) {
                            exponentValue_ = root.exponent_.executeInteger(frameValue);
                        } else {
                            Object exponentValue__ = executeExponent_(frameValue);
                            exponentValue_ = RubyTypesGen.expectImplicitInteger(exponentValue__, exponentImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, selfValue_, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute1(frameValue, selfValue_, exponentValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                        return root.power(frameValue, selfValue_, exponentValue_, precisionValue_, this.positiveExponentProfile, this.zeroProfile, this.zeroExponentProfile);
                    }
                    return getNext().execute1(frameValue, selfValue_, exponentValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(exponentValue, exponentImplicitType) && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int exponentValue_ = RubyTypesGen.asImplicitInteger(exponentValue, exponentImplicitType);
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(selfValue_))) {
                            return root.power(frameValue, selfValue_, exponentValue_, precisionValue_, this.positiveExponentProfile, this.zeroProfile, this.zeroExponentProfile);
                        }
                    }
                    return getNext().execute1(frameValue, selfValue, exponentValue, precisionValue);
                }

                static BaseNode_ create(PowerNodeGen root, Object exponentValue, Object precisionValue, ConditionProfile positiveExponentProfile, ConditionProfile zeroProfile, ConditionProfile zeroExponentProfile) {
                    return new Power1Node_(root, exponentValue, precisionValue, positiveExponentProfile, zeroProfile, zeroExponentProfile);
                }

            }
            @GeneratedBy(methodName = "power(VirtualFrame, DynamicObject, int, Object, BranchProfile, BranchProfile, BranchProfile, BranchProfile)", value = PowerNode.class)
            private static final class Power2Node_ extends BaseNode_ {

                private final BranchProfile nanProfile;
                private final BranchProfile posInfinityProfile;
                private final BranchProfile negInfinityProfile;
                private final BranchProfile negZeroProfile;
                private final Class exponentImplicitType;

                Power2Node_(PowerNodeGen root, Object exponentValue, BranchProfile nanProfile, BranchProfile posInfinityProfile, BranchProfile negInfinityProfile, BranchProfile negZeroProfile) {
                    super(root, 3);
                    this.exponentImplicitType = RubyTypesGen.getImplicitIntegerClass(exponentValue);
                    this.nanProfile = nanProfile;
                    this.posInfinityProfile = posInfinityProfile;
                    this.negInfinityProfile = negInfinityProfile;
                    this.negZeroProfile = negZeroProfile;
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.exponentImplicitType == ((Power2Node_) other).exponentImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object exponentValue = executeExponent_(frameValue);
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, ex.getResult(), exponentValue, precisionValue);
                    }
                    int exponentValue_;
                    try {
                        if (exponentImplicitType == int.class) {
                            exponentValue_ = root.exponent_.executeInteger(frameValue);
                        } else {
                            Object exponentValue__ = executeExponent_(frameValue);
                            exponentValue_ = RubyTypesGen.expectImplicitInteger(exponentValue__, exponentImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute1(frameValue, selfValue_, ex.getResult(), precisionValue);
                    }
                    Object precisionValue_ = executePrecision_(frameValue);
                    if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_)))) {
                        return root.power(frameValue, selfValue_, exponentValue_, precisionValue_, this.nanProfile, this.posInfinityProfile, this.negInfinityProfile, this.negZeroProfile);
                    }
                    return getNext().execute1(frameValue, selfValue_, exponentValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, Object selfValue, Object exponentValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(exponentValue, exponentImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int exponentValue_ = RubyTypesGen.asImplicitInteger(exponentValue, exponentImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_)))) {
                            return root.power(frameValue, selfValue_, exponentValue_, precisionValue, this.nanProfile, this.posInfinityProfile, this.negInfinityProfile, this.negZeroProfile);
                        }
                    }
                    return getNext().execute1(frameValue, selfValue, exponentValue, precisionValue);
                }

                static BaseNode_ create(PowerNodeGen root, Object exponentValue, BranchProfile nanProfile, BranchProfile posInfinityProfile, BranchProfile negInfinityProfile, BranchProfile negZeroProfile) {
                    return new Power2Node_(root, exponentValue, nanProfile, posInfinityProfile, negInfinityProfile, negZeroProfile);
                }

            }
        }
    }
    @GeneratedBy(SqrtNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class SqrtNodeFactory implements NodeFactory {

        private static SqrtNodeFactory sqrtNodeFactoryInstance;

        private SqrtNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return SqrtNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode.class, RubyNode.class));
        }

        @Override
        public SqrtNode createNode(Object... arguments) {
            if (arguments.length == 2 && (arguments[0] == null || arguments[0] instanceof RubyNode) && (arguments[1] == null || arguments[1] instanceof RubyNode)) {
                return create((RubyNode) arguments[0], (RubyNode) arguments[1]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (sqrtNodeFactoryInstance == null) {
                sqrtNodeFactoryInstance = new SqrtNodeFactory();
            }
            return sqrtNodeFactoryInstance;
        }

        public static SqrtNode create(RubyNode self, RubyNode precision) {
            return new SqrtNodeGen(self, precision);
        }

        @GeneratedBy(SqrtNode.class)
        @SuppressFBWarnings("SA_LOCAL_SELF_COMPARISON")
        public static final class SqrtNodeGen extends SqrtNode implements SpecializedNode {

            @Child private RubyNode self_;
            @Child private RubyNode precision_;
            @CompilationFinal private Class precisionType_;
            @Child private BaseNode_ specialization_;

            private SqrtNodeGen(RubyNode self, RubyNode precision) {
                this.self_ = self;
                this.precision_ = precision;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object executeSqrt(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                return specialization_.execute1(frameValue, selfValue, precisionValue);
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute0(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(SqrtNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected SqrtNodeGen root;

                BaseNode_(SqrtNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (SqrtNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.self_, root.precision_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object selfValue, Object precisionValue) {
                    return this.execute_((VirtualFrame) frameValue, selfValue, precisionValue);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue);

                public Object execute1(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                    return execute_(frameValue, selfValue, precisionValue);
                }

                public Object execute0(VirtualFrame frameValue) {
                    Object selfValue_ = root.self_.execute(frameValue);
                    Object precisionValue_ = executePrecision_(frameValue);
                    return execute_(frameValue, selfValue_, precisionValue_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute0(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object selfValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue);
                        if ((precisionValue_ < 0)) {
                            return SqrtNegativePrecisionNode_.create(root, precisionValue);
                        }
                        if ((precisionValue_ == 0)) {
                            return SqrtZeroPrecisionNode_.create(root, precisionValue);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(selfValue_)) && (precisionValue_ > 0)) {
                            ConditionProfile positiveValueProfile3 = (ConditionProfile.createBinaryProfile());
                            return SqrtNode_.create(root, precisionValue, positiveValueProfile3);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_))) && (precisionValue_ > 0)) {
                            BranchProfile nanProfile4 = (BranchProfile.create());
                            BranchProfile posInfProfile4 = (BranchProfile.create());
                            BranchProfile negInfProfile4 = (BranchProfile.create());
                            BranchProfile negZeroProfile4 = (BranchProfile.create());
                            return SqrtSpecialNode_.create(root, precisionValue, nanProfile4, posInfProfile4, negInfProfile4, negZeroProfile4);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executePrecision_(Frame frameValue) {
                    Class precisionType_ = root.precisionType_;
                    try {
                        if (precisionType_ == int.class) {
                            return root.precision_.executeInteger((VirtualFrame) frameValue);
                        } else if (precisionType_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.precision_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.precisionType_ = _type;
                            }
                        } else {
                            return root.precision_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.precisionType_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(SqrtNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(SqrtNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    return uninitialized(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(SqrtNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(SqrtNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object selfValue, Object precisionValue) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, selfValue, precisionValue));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    return getNext().execute_(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "sqrtNegativePrecision(VirtualFrame, DynamicObject, int)", value = SqrtNode.class)
            private static final class SqrtNegativePrecisionNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                SqrtNegativePrecisionNode_(SqrtNodeGen root, Object precisionValue) {
                    super(root, 1);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SqrtNegativePrecisionNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, selfValue_, ex.getResult());
                    }
                    if ((precisionValue_ < 0)) {
                        return root.sqrtNegativePrecision(frameValue, selfValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, selfValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                    if ((precisionValue < 0)) {
                        return root.sqrtNegativePrecision(frameValue, selfValue, precisionValue);
                    }
                    return getNext().execute1(frameValue, selfValue, precisionValue);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((precisionValue_ < 0)) {
                            return root.sqrtNegativePrecision(frameValue, selfValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root, Object precisionValue) {
                    return new SqrtNegativePrecisionNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "sqrtZeroPrecision(VirtualFrame, DynamicObject, int)", value = SqrtNode.class)
            private static final class SqrtZeroPrecisionNode_ extends BaseNode_ {

                private final Class precisionImplicitType;

                SqrtZeroPrecisionNode_(SqrtNodeGen root, Object precisionValue) {
                    super(root, 2);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SqrtZeroPrecisionNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, selfValue_, ex.getResult());
                    }
                    if ((precisionValue_ == 0)) {
                        return root.sqrtZeroPrecision(frameValue, selfValue_, precisionValue_);
                    }
                    return getNext().execute_(frameValue, selfValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                    if ((precisionValue == 0)) {
                        return root.sqrtZeroPrecision(frameValue, selfValue, precisionValue);
                    }
                    return getNext().execute1(frameValue, selfValue, precisionValue);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((precisionValue_ == 0)) {
                            return root.sqrtZeroPrecision(frameValue, selfValue_, precisionValue_);
                        }
                    }
                    return getNext().execute_(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root, Object precisionValue) {
                    return new SqrtZeroPrecisionNode_(root, precisionValue);
                }

            }
            @GeneratedBy(methodName = "sqrt(VirtualFrame, DynamicObject, int, ConditionProfile)", value = SqrtNode.class)
            private static final class SqrtNode_ extends BaseNode_ {

                private final ConditionProfile positiveValueProfile;
                private final Class precisionImplicitType;

                SqrtNode_(SqrtNodeGen root, Object precisionValue, ConditionProfile positiveValueProfile) {
                    super(root, 3);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                    this.positiveValueProfile = positiveValueProfile;
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SqrtNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, selfValue_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(selfValue_)) && (precisionValue_ > 0)) {
                        return root.sqrt(frameValue, selfValue_, precisionValue_, this.positiveValueProfile);
                    }
                    return getNext().execute_(frameValue, selfValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                    if ((BigDecimalCoreMethodNode.isNormal(selfValue)) && (precisionValue > 0)) {
                        return root.sqrt(frameValue, selfValue, precisionValue, this.positiveValueProfile);
                    }
                    return getNext().execute1(frameValue, selfValue, precisionValue);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(selfValue_)) && (precisionValue_ > 0)) {
                            return root.sqrt(frameValue, selfValue_, precisionValue_, this.positiveValueProfile);
                        }
                    }
                    return getNext().execute_(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root, Object precisionValue, ConditionProfile positiveValueProfile) {
                    return new SqrtNode_(root, precisionValue, positiveValueProfile);
                }

            }
            @GeneratedBy(methodName = "sqrtSpecial(VirtualFrame, DynamicObject, int, BranchProfile, BranchProfile, BranchProfile, BranchProfile)", value = SqrtNode.class)
            private static final class SqrtSpecialNode_ extends BaseNode_ {

                private final BranchProfile nanProfile;
                private final BranchProfile posInfProfile;
                private final BranchProfile negInfProfile;
                private final BranchProfile negZeroProfile;
                private final Class precisionImplicitType;

                SqrtSpecialNode_(SqrtNodeGen root, Object precisionValue, BranchProfile nanProfile, BranchProfile posInfProfile, BranchProfile negInfProfile, BranchProfile negZeroProfile) {
                    super(root, 4);
                    this.precisionImplicitType = RubyTypesGen.getImplicitIntegerClass(precisionValue);
                    this.nanProfile = nanProfile;
                    this.posInfProfile = posInfProfile;
                    this.negInfProfile = negInfProfile;
                    this.negZeroProfile = negZeroProfile;
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.precisionImplicitType == ((SqrtSpecialNode_) other).precisionImplicitType;
                }

                @Override
                public Object execute0(VirtualFrame frameValue) {
                    DynamicObject selfValue_;
                    try {
                        selfValue_ = root.self_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object precisionValue = executePrecision_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), precisionValue);
                    }
                    int precisionValue_;
                    try {
                        if (precisionImplicitType == int.class) {
                            precisionValue_ = root.precision_.executeInteger(frameValue);
                        } else {
                            Object precisionValue__ = executePrecision_(frameValue);
                            precisionValue_ = RubyTypesGen.expectImplicitInteger(precisionValue__, precisionImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, selfValue_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_))) && (precisionValue_ > 0)) {
                        return root.sqrtSpecial(frameValue, selfValue_, precisionValue_, this.nanProfile, this.posInfProfile, this.negInfProfile, this.negZeroProfile);
                    }
                    return getNext().execute_(frameValue, selfValue_, precisionValue_);
                }

                @Override
                public Object execute1(VirtualFrame frameValue, DynamicObject selfValue, int precisionValue) {
                    if ((!(BigDecimalCoreMethodNode.isNormal(selfValue))) && (precisionValue > 0)) {
                        return root.sqrtSpecial(frameValue, selfValue, precisionValue, this.nanProfile, this.posInfProfile, this.negInfProfile, this.negZeroProfile);
                    }
                    return getNext().execute1(frameValue, selfValue, precisionValue);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object selfValue, Object precisionValue) {
                    if (selfValue instanceof DynamicObject && RubyTypesGen.isImplicitInteger(precisionValue, precisionImplicitType)) {
                        DynamicObject selfValue_ = (DynamicObject) selfValue;
                        int precisionValue_ = RubyTypesGen.asImplicitInteger(precisionValue, precisionImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(selfValue_))) && (precisionValue_ > 0)) {
                            return root.sqrtSpecial(frameValue, selfValue_, precisionValue_, this.nanProfile, this.posInfProfile, this.negInfProfile, this.negZeroProfile);
                        }
                    }
                    return getNext().execute_(frameValue, selfValue, precisionValue);
                }

                static BaseNode_ create(SqrtNodeGen root, Object precisionValue, BranchProfile nanProfile, BranchProfile posInfProfile, BranchProfile negInfProfile, BranchProfile negZeroProfile) {
                    return new SqrtSpecialNode_(root, precisionValue, nanProfile, posInfProfile, negInfProfile, negZeroProfile);
                }

            }
        }
    }
    @GeneratedBy(CompareNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class CompareNodeFactory implements NodeFactory {

        private static CompareNodeFactory compareNodeFactoryInstance;

        private CompareNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return CompareNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public CompareNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (compareNodeFactoryInstance == null) {
                compareNodeFactoryInstance = new CompareNodeFactory();
            }
            return compareNodeFactoryInstance;
        }

        public static CompareNode create(RubyNode[] arguments) {
            return new CompareNodeGen(arguments);
        }

        @GeneratedBy(CompareNode.class)
        public static final class CompareNodeGen extends CompareNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private RubyNode arguments1_;
            @CompilationFinal private Class arguments1Type_;
            @Child private BaseNode_ specialization_;

            private CompareNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.arguments1_ = arguments != null && 1 < arguments.length ? arguments[1] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public int executeInteger(VirtualFrame frameValue) throws UnexpectedResultException {
                return specialization_.executeInt(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            private static int expectInteger(Object value) throws UnexpectedResultException {
                if (value instanceof Integer) {
                    return (int) value;
                }
                throw new UnexpectedResultException(value);
            }

            @GeneratedBy(CompareNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected CompareNodeGen root;

                BaseNode_(CompareNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (CompareNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_, root.arguments1_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value, Object arguments1Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value, arguments1Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    Object arguments1Value_ = executeArguments1_(frameValue);
                    return execute_(frameValue, arguments0Value_, arguments1Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    return expectInteger(execute(frameValue));
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if (RubyTypesGen.isImplicitLong(arguments1Value)) {
                            if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                                return Compare0Node_.create(root, arguments1Value);
                            }
                        }
                        if (RubyTypesGen.isImplicitDouble(arguments1Value)) {
                            if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                                return Compare1Node_.create(root, arguments1Value);
                            }
                        }
                        if (arguments1Value instanceof DynamicObject) {
                            DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                            if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (RubyGuards.isRubyBignum(arguments1Value_))) {
                                return Compare2Node_.create(root);
                            }
                            if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(arguments1Value_))) {
                                return CompareNormalNode_.create(root);
                            }
                        }
                        if (RubyTypesGen.isImplicitLong(arguments1Value)) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                                return CompareSpecial0Node_.create(root, arguments1Value);
                            }
                        }
                        if (RubyTypesGen.isImplicitDouble(arguments1Value)) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                                return CompareSpecial1Node_.create(root, arguments1Value);
                            }
                        }
                        if (arguments1Value instanceof DynamicObject) {
                            DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                            if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (RubyGuards.isRubyBignum(arguments1Value_))) {
                                return CompareSpecialBignumNode_.create(root);
                            }
                            if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (BigDecimalCoreMethodNode.isNan(arguments0Value_))) {
                                return CompareSpecialNanNode_.create(root);
                            }
                            if ((RubyGuards.isRubyBigDecimal(arguments1Value_)) && (!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)) || !(BigDecimalCoreMethodNode.isNormal(arguments1Value_))) && (BigDecimalCoreMethodNode.isNormal(arguments0Value_) || !(BigDecimalCoreMethodNode.isNan(arguments0Value_)))) {
                                return CompareSpecial2Node_.create(root);
                            }
                            if ((root.isNil(arguments1Value_))) {
                                return CompareNilNode_.create(root);
                            }
                            if ((!(RubyGuards.isRubyBigDecimal(arguments1Value_))) && (!(root.isNil(arguments1Value_)))) {
                                SnippetNode snippetNode11 = (new SnippetNode());
                                return CompareCoercedNode_.create(root, snippetNode11);
                            }
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final long executeArguments1Long_(Frame frameValue, Class arguments1ImplicitType) throws UnexpectedResultException {
                    if (arguments1ImplicitType == long.class) {
                        return root.arguments1_.executeLong((VirtualFrame) frameValue);
                    } else if (arguments1ImplicitType == int.class) {
                        return RubyTypes.promoteToLong(root.arguments1_.executeInteger((VirtualFrame) frameValue));
                    } else {
                        Object arguments1Value_ = executeArguments1_(frameValue);
                        return RubyTypesGen.expectImplicitLong(arguments1Value_, arguments1ImplicitType);
                    }
                }

                protected final Object executeArguments1_(Frame frameValue) {
                    Class arguments1Type_ = root.arguments1Type_;
                    try {
                        if (arguments1Type_ == double.class) {
                            return root.arguments1_.executeDouble((VirtualFrame) frameValue);
                        } else if (arguments1Type_ == int.class) {
                            return root.arguments1_.executeInteger((VirtualFrame) frameValue);
                        } else if (arguments1Type_ == long.class) {
                            return root.arguments1_.executeLong((VirtualFrame) frameValue);
                        } else if (arguments1Type_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.arguments1_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Double) {
                                    _type = double.class;
                                } else if (_value instanceof Integer) {
                                    _type = int.class;
                                } else if (_value instanceof Long) {
                                    _type = long.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.arguments1Type_ = _type;
                            }
                        } else {
                            return root.arguments1_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.arguments1Type_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(CompareNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(CompareNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    return uninitialized(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(CompareNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(CompareNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value, Object arguments1Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value, arguments1Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "compare(DynamicObject, long)", value = CompareNode.class)
            private static final class Compare0Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;

                Compare0Node_(CompareNodeGen root, Object arguments1Value) {
                    super(root, 1);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitLongClass(arguments1Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((Compare0Node_) other).arguments1ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    try {
                        return executeInt(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return ex.getResult();
                    }
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return expectInteger(getNext().execute_(frameValue, ex.getResult(), arguments1Value));
                    }
                    long arguments1Value_;
                    try {
                        arguments1Value_ = executeArguments1Long_(frameValue, arguments1ImplicitType);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, arguments0Value_, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.compare(arguments0Value_, arguments1Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_, arguments1Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitLong(arguments1Value, arguments1ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        long arguments1Value_ = RubyTypesGen.asImplicitLong(arguments1Value, arguments1ImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.compare(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root, Object arguments1Value) {
                    return new Compare0Node_(root, arguments1Value);
                }

            }
            @GeneratedBy(methodName = "compare(DynamicObject, double)", value = CompareNode.class)
            private static final class Compare1Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;

                Compare1Node_(CompareNodeGen root, Object arguments1Value) {
                    super(root, 2);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitDoubleClass(arguments1Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((Compare1Node_) other).arguments1ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    try {
                        return executeInt(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return ex.getResult();
                    }
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return expectInteger(getNext().execute_(frameValue, ex.getResult(), arguments1Value));
                    }
                    double arguments1Value_;
                    try {
                        if (arguments1ImplicitType == double.class) {
                            arguments1Value_ = root.arguments1_.executeDouble(frameValue);
                        } else {
                            Object arguments1Value__ = executeArguments1_(frameValue);
                            arguments1Value_ = RubyTypesGen.expectImplicitDouble(arguments1Value__, arguments1ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, arguments0Value_, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.compare(arguments0Value_, arguments1Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_, arguments1Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitDouble(arguments1Value, arguments1ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        double arguments1Value_ = RubyTypesGen.asImplicitDouble(arguments1Value, arguments1ImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.compare(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root, Object arguments1Value) {
                    return new Compare1Node_(root, arguments1Value);
                }

            }
            @GeneratedBy(methodName = "compare(DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class Compare2Node_ extends BaseNode_ {

                Compare2Node_(CompareNodeGen root) {
                    super(root, 3);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return expectInteger(getNext().execute_(frameValue, ex.getResult(), arguments1Value));
                    }
                    DynamicObject arguments1Value_;
                    try {
                        arguments1Value_ = root.arguments1_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, arguments0Value_, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (RubyGuards.isRubyBignum(arguments1Value_))) {
                        return root.compare(arguments0Value_, arguments1Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_, arguments1Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (RubyGuards.isRubyBignum(arguments1Value_))) {
                            return root.compare(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new Compare2Node_(root);
                }

            }
            @GeneratedBy(methodName = "compareNormal(DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class CompareNormalNode_ extends BaseNode_ {

                CompareNormalNode_(CompareNodeGen root) {
                    super(root, 4);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return expectInteger(getNext().execute_(frameValue, ex.getResult(), arguments1Value));
                    }
                    DynamicObject arguments1Value_;
                    try {
                        arguments1Value_ = root.arguments1_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, arguments0Value_, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(arguments1Value_))) {
                        return root.compareNormal(arguments0Value_, arguments1Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_, arguments1Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalRubyBigDecimal(arguments1Value_))) {
                            return root.compareNormal(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new CompareNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "compareSpecial(VirtualFrame, DynamicObject, long)", value = CompareNode.class)
            private static final class CompareSpecial0Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;

                CompareSpecial0Node_(CompareNodeGen root, Object arguments1Value) {
                    super(root, 5);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitLongClass(arguments1Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((CompareSpecial0Node_) other).arguments1ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), arguments1Value);
                    }
                    long arguments1Value_;
                    try {
                        arguments1Value_ = executeArguments1Long_(frameValue, arguments1ImplicitType);
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, arguments0Value_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.compareSpecial(frameValue, arguments0Value_, arguments1Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value_, arguments1Value_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitLong(arguments1Value, arguments1ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        long arguments1Value_ = RubyTypesGen.asImplicitLong(arguments1Value, arguments1ImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.compareSpecial(frameValue, arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root, Object arguments1Value) {
                    return new CompareSpecial0Node_(root, arguments1Value);
                }

            }
            @GeneratedBy(methodName = "compareSpecial(VirtualFrame, DynamicObject, double)", value = CompareNode.class)
            private static final class CompareSpecial1Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;

                CompareSpecial1Node_(CompareNodeGen root, Object arguments1Value) {
                    super(root, 6);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitDoubleClass(arguments1Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((CompareSpecial1Node_) other).arguments1ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), arguments1Value);
                    }
                    double arguments1Value_;
                    try {
                        if (arguments1ImplicitType == double.class) {
                            arguments1Value_ = root.arguments1_.executeDouble(frameValue);
                        } else {
                            Object arguments1Value__ = executeArguments1_(frameValue);
                            arguments1Value_ = RubyTypesGen.expectImplicitDouble(arguments1Value__, arguments1ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, arguments0Value_, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.compareSpecial(frameValue, arguments0Value_, arguments1Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value_, arguments1Value_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitDouble(arguments1Value, arguments1ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        double arguments1Value_ = RubyTypesGen.asImplicitDouble(arguments1Value, arguments1ImplicitType);
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.compareSpecial(frameValue, arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root, Object arguments1Value) {
                    return new CompareSpecial1Node_(root, arguments1Value);
                }

            }
            @GeneratedBy(methodName = "compareSpecialBignum(VirtualFrame, DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class CompareSpecialBignumNode_ extends BaseNode_ {

                CompareSpecialBignumNode_(CompareNodeGen root) {
                    super(root, 7);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (RubyGuards.isRubyBignum(arguments1Value_))) {
                            return root.compareSpecialBignum(frameValue, arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new CompareSpecialBignumNode_(root);
                }

            }
            @GeneratedBy(methodName = "compareSpecialNan(DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class CompareSpecialNanNode_ extends BaseNode_ {

                CompareSpecialNanNode_(CompareNodeGen root) {
                    super(root, 8);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (BigDecimalCoreMethodNode.isNan(arguments0Value_))) {
                            return root.compareSpecialNan(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new CompareSpecialNanNode_(root);
                }

            }
            @GeneratedBy(methodName = "compareSpecial(DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class CompareSpecial2Node_ extends BaseNode_ {

                CompareSpecial2Node_(CompareNodeGen root) {
                    super(root, 9);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((RubyGuards.isRubyBigDecimal(arguments1Value_)) && (!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)) || !(BigDecimalCoreMethodNode.isNormal(arguments1Value_))) && (BigDecimalCoreMethodNode.isNormal(arguments0Value_) || !(BigDecimalCoreMethodNode.isNan(arguments0Value_)))) {
                            return root.compareSpecial(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new CompareSpecial2Node_(root);
                }

            }
            @GeneratedBy(methodName = "compareNil(DynamicObject, DynamicObject)", value = CompareNode.class)
            private static final class CompareNilNode_ extends BaseNode_ {

                CompareNilNode_(CompareNodeGen root) {
                    super(root, 10);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((root.isNil(arguments1Value_))) {
                            return root.compareNil(arguments0Value_, arguments1Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root) {
                    return new CompareNilNode_(root);
                }

            }
            @GeneratedBy(methodName = "compareCoerced(VirtualFrame, DynamicObject, DynamicObject, SnippetNode)", value = CompareNode.class)
            private static final class CompareCoercedNode_ extends BaseNode_ {

                @Child private SnippetNode snippetNode;

                CompareCoercedNode_(CompareNodeGen root, SnippetNode snippetNode) {
                    super(root, 11);
                    this.snippetNode = snippetNode;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        DynamicObject arguments1Value_ = (DynamicObject) arguments1Value;
                        if ((!(RubyGuards.isRubyBigDecimal(arguments1Value_))) && (!(root.isNil(arguments1Value_)))) {
                            return root.compareCoerced(frameValue, arguments0Value_, arguments1Value_, this.snippetNode);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value);
                }

                static BaseNode_ create(CompareNodeGen root, SnippetNode snippetNode) {
                    return new CompareCoercedNode_(root, snippetNode);
                }

            }
        }
    }
    @GeneratedBy(ZeroNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class ZeroNodeFactory implements NodeFactory {

        private static ZeroNodeFactory zeroNodeFactoryInstance;

        private ZeroNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return ZeroNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public ZeroNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (zeroNodeFactoryInstance == null) {
                zeroNodeFactoryInstance = new ZeroNodeFactory();
            }
            return zeroNodeFactoryInstance;
        }

        public static ZeroNode create(RubyNode[] arguments) {
            return new ZeroNodeGen(arguments);
        }

        @GeneratedBy(ZeroNode.class)
        public static final class ZeroNodeGen extends ZeroNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private ZeroNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public boolean executeBoolean(VirtualFrame frameValue) {
                return specialization_.executeBoolean(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(ZeroNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected ZeroNodeGen root;

                BaseNode_(ZeroNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (ZeroNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.executeBoolean_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return executeBoolean_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public boolean executeBoolean(VirtualFrame frameValue) {
                    return (boolean) execute(frameValue);
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return ZeroNormalNode_.create(root);
                        } else {
                            return ZeroSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(ZeroNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(ZeroNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return (boolean) uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(ZeroNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(ZeroNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(ZeroNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ZeroNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "zeroNormal(DynamicObject)", value = ZeroNode.class)
            private static final class ZeroNormalNode_ extends BaseNode_ {

                ZeroNormalNode_(ZeroNodeGen root) {
                    super(root, 1);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.zeroNormal(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.zeroNormal(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ZeroNodeGen root) {
                    return new ZeroNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "zeroSpecial(DynamicObject)", value = ZeroNode.class)
            private static final class ZeroSpecialNode_ extends BaseNode_ {

                ZeroSpecialNode_(ZeroNodeGen root) {
                    super(root, 2);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.zeroSpecial(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.zeroSpecial(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ZeroNodeGen root) {
                    return new ZeroSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(SignNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class SignNodeFactory implements NodeFactory {

        private static SignNodeFactory signNodeFactoryInstance;

        private SignNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return SignNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public SignNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (signNodeFactoryInstance == null) {
                signNodeFactoryInstance = new SignNodeFactory();
            }
            return signNodeFactoryInstance;
        }

        public static SignNode create(RubyNode[] arguments) {
            return new SignNodeGen(arguments);
        }

        @GeneratedBy(SignNode.class)
        public static final class SignNodeGen extends SignNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private SignNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public int executeInteger(VirtualFrame frameValue) {
                return specialization_.executeInt(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(SignNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected SignNodeGen root;

                BaseNode_(SignNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (SignNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.executeInt_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract int executeInt_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return executeInt_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public int executeInt(VirtualFrame frameValue) {
                    return (int) execute(frameValue);
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return SignNormalZeroNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            ConditionProfile positiveProfile2 = (ConditionProfile.createBinaryProfile());
                            return SignNormalNode_.create(root, positiveProfile2);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return SignSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(SignNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(SignNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public int executeInt_(VirtualFrame frameValue, Object arguments0Value) {
                    return (int) uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(SignNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(SignNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(SignNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public int executeInt(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return getNext().executeInt_(frameValue, arguments0Value_);
                }

                @Override
                public int executeInt_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().executeInt_(frameValue, arguments0Value);
                }

                static BaseNode_ create(SignNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "signNormalZero(VirtualFrame, DynamicObject)", value = SignNode.class)
            private static final class SignNormalZeroNode_ extends BaseNode_ {

                SignNormalZeroNode_(SignNodeGen root) {
                    super(root, 1);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeInt_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                        return root.signNormalZero(frameValue, arguments0Value_);
                    }
                    return getNext().executeInt_(frameValue, arguments0Value_);
                }

                @Override
                public int executeInt_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return root.signNormalZero(frameValue, arguments0Value_);
                        }
                    }
                    return getNext().executeInt_(frameValue, arguments0Value);
                }

                static BaseNode_ create(SignNodeGen root) {
                    return new SignNormalZeroNode_(root);
                }

            }
            @GeneratedBy(methodName = "signNormal(VirtualFrame, DynamicObject, ConditionProfile)", value = SignNode.class)
            private static final class SignNormalNode_ extends BaseNode_ {

                private final ConditionProfile positiveProfile;

                SignNormalNode_(SignNodeGen root, ConditionProfile positiveProfile) {
                    super(root, 2);
                    this.positiveProfile = positiveProfile;
                }

                @Override
                public int executeInt(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeInt_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                        return root.signNormal(frameValue, arguments0Value_, this.positiveProfile);
                    }
                    return getNext().executeInt_(frameValue, arguments0Value_);
                }

                @Override
                public int executeInt_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            return root.signNormal(frameValue, arguments0Value_, this.positiveProfile);
                        }
                    }
                    return getNext().executeInt_(frameValue, arguments0Value);
                }

                static BaseNode_ create(SignNodeGen root, ConditionProfile positiveProfile) {
                    return new SignNormalNode_(root, positiveProfile);
                }

            }
            @GeneratedBy(methodName = "signSpecial(VirtualFrame, DynamicObject)", value = SignNode.class)
            private static final class SignSpecialNode_ extends BaseNode_ {

                SignSpecialNode_(SignNodeGen root) {
                    super(root, 3);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeInt_(frameValue, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.signSpecial(frameValue, arguments0Value_);
                    }
                    return getNext().executeInt_(frameValue, arguments0Value_);
                }

                @Override
                public int executeInt_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.signSpecial(frameValue, arguments0Value_);
                        }
                    }
                    return getNext().executeInt_(frameValue, arguments0Value);
                }

                static BaseNode_ create(SignNodeGen root) {
                    return new SignSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(NanNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class NanNodeFactory implements NodeFactory {

        private static NanNodeFactory nanNodeFactoryInstance;

        private NanNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return NanNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public NanNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (nanNodeFactoryInstance == null) {
                nanNodeFactoryInstance = new NanNodeFactory();
            }
            return nanNodeFactoryInstance;
        }

        public static NanNode create(RubyNode[] arguments) {
            return new NanNodeGen(arguments);
        }

        @GeneratedBy(NanNode.class)
        public static final class NanNodeGen extends NanNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private NanNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public boolean executeBoolean(VirtualFrame frameValue) {
                return specialization_.executeBoolean(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(NanNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected NanNodeGen root;

                BaseNode_(NanNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (NanNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.executeBoolean_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return executeBoolean_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public boolean executeBoolean(VirtualFrame frameValue) {
                    return (boolean) execute(frameValue);
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return NanNormalNode_.create(root);
                        } else {
                            return NanSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(NanNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(NanNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return (boolean) uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(NanNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(NanNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(NanNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NanNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "nanNormal(DynamicObject)", value = NanNode.class)
            private static final class NanNormalNode_ extends BaseNode_ {

                NanNormalNode_(NanNodeGen root) {
                    super(root, 1);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.nanNormal(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.nanNormal(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NanNodeGen root) {
                    return new NanNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "nanSpecial(DynamicObject)", value = NanNode.class)
            private static final class NanSpecialNode_ extends BaseNode_ {

                NanSpecialNode_(NanNodeGen root) {
                    super(root, 2);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.nanSpecial(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.nanSpecial(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(NanNodeGen root) {
                    return new NanSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(ExponentNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class ExponentNodeFactory implements NodeFactory {

        private static ExponentNodeFactory exponentNodeFactoryInstance;

        private ExponentNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return ExponentNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public ExponentNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (exponentNodeFactoryInstance == null) {
                exponentNodeFactoryInstance = new ExponentNodeFactory();
            }
            return exponentNodeFactoryInstance;
        }

        public static ExponentNode create(RubyNode[] arguments) {
            return new ExponentNodeGen(arguments);
        }

        @GeneratedBy(ExponentNode.class)
        public static final class ExponentNodeGen extends ExponentNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private ExponentNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public int executeInteger(VirtualFrame frameValue) throws UnexpectedResultException {
                return specialization_.executeInt(frameValue);
            }

            @Override
            public long executeLong(VirtualFrame frameValue) throws UnexpectedResultException {
                return specialization_.executeLong(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            private static int expectInteger(Object value) throws UnexpectedResultException {
                if (value instanceof Integer) {
                    return (int) value;
                }
                throw new UnexpectedResultException(value);
            }

            private static long expectLong(Object value) throws UnexpectedResultException {
                if (value instanceof Long) {
                    return (long) value;
                }
                throw new UnexpectedResultException(value);
            }

            @GeneratedBy(ExponentNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected ExponentNodeGen root;

                BaseNode_(ExponentNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (ExponentNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    return expectInteger(execute(frameValue));
                }

                public long executeLong(VirtualFrame frameValue) throws UnexpectedResultException {
                    return expectLong(execute(frameValue));
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            return ExponentNode_.create(root);
                        }
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return ExponentZeroNode_.create(root);
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return ExponentSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(ExponentNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(ExponentNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(ExponentNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(ExponentNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(ExponentNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ExponentNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "exponent(DynamicObject)", value = ExponentNode.class)
            private static final class ExponentNode_ extends BaseNode_ {

                ExponentNode_(ExponentNodeGen root) {
                    super(root, 1);
                }

                @Override
                public long executeLong(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectLong(getNext().execute_(frameValue, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                        return root.exponent(arguments0Value_);
                    }
                    return expectLong(getNext().execute_(frameValue, arguments0Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (!(BigDecimalCoreMethodNode.isNormalZero(arguments0Value_)))) {
                            return root.exponent(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ExponentNodeGen root) {
                    return new ExponentNode_(root);
                }

            }
            @GeneratedBy(methodName = "exponentZero(DynamicObject)", value = ExponentNode.class)
            private static final class ExponentZeroNode_ extends BaseNode_ {

                ExponentZeroNode_(ExponentNodeGen root) {
                    super(root, 2);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, ex.getResult()));
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                        return root.exponentZero(arguments0Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_)) && (BigDecimalCoreMethodNode.isNormalZero(arguments0Value_))) {
                            return root.exponentZero(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ExponentNodeGen root) {
                    return new ExponentZeroNode_(root);
                }

            }
            @GeneratedBy(methodName = "exponentSpecial(DynamicObject)", value = ExponentNode.class)
            private static final class ExponentSpecialNode_ extends BaseNode_ {

                ExponentSpecialNode_(ExponentNodeGen root) {
                    super(root, 3);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, ex.getResult()));
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.exponentSpecial(arguments0Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.exponentSpecial(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ExponentNodeGen root) {
                    return new ExponentSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(AbsNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class AbsNodeFactory implements NodeFactory {

        private static AbsNodeFactory absNodeFactoryInstance;

        private AbsNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return AbsNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public AbsNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (absNodeFactoryInstance == null) {
                absNodeFactoryInstance = new AbsNodeFactory();
            }
            return absNodeFactoryInstance;
        }

        public static AbsNode create(RubyNode[] arguments) {
            return new AbsNodeGen(arguments);
        }

        @GeneratedBy(AbsNode.class)
        public static final class AbsNodeGen extends AbsNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private AbsNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(AbsNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected AbsNodeGen root;

                BaseNode_(AbsNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (AbsNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return AbsNode_.create(root);
                        } else {
                            BranchProfile negInfProfile2 = (BranchProfile.create());
                            BranchProfile negZeroProfile2 = (BranchProfile.create());
                            BranchProfile posInfProfile2 = (BranchProfile.create());
                            return AbsSpecialNode_.create(root, negInfProfile2, negZeroProfile2, posInfProfile2);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(AbsNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(AbsNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(AbsNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(AbsNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(AbsNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(AbsNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "abs(VirtualFrame, DynamicObject)", value = AbsNode.class)
            private static final class AbsNode_ extends BaseNode_ {

                AbsNode_(AbsNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.abs(frameValue, arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(AbsNodeGen root) {
                    return new AbsNode_(root);
                }

            }
            @GeneratedBy(methodName = "absSpecial(VirtualFrame, DynamicObject, BranchProfile, BranchProfile, BranchProfile)", value = AbsNode.class)
            private static final class AbsSpecialNode_ extends BaseNode_ {

                private final BranchProfile negInfProfile;
                private final BranchProfile negZeroProfile;
                private final BranchProfile posInfProfile;

                AbsSpecialNode_(AbsNodeGen root, BranchProfile negInfProfile, BranchProfile negZeroProfile, BranchProfile posInfProfile) {
                    super(root, 2);
                    this.negInfProfile = negInfProfile;
                    this.negZeroProfile = negZeroProfile;
                    this.posInfProfile = posInfProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.absSpecial(frameValue, arguments0Value_, this.negInfProfile, this.negZeroProfile, this.posInfProfile);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(AbsNodeGen root, BranchProfile negInfProfile, BranchProfile negZeroProfile, BranchProfile posInfProfile) {
                    return new AbsSpecialNode_(root, negInfProfile, negZeroProfile, posInfProfile);
                }

            }
        }
    }
    @GeneratedBy(RoundNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class RoundNodeFactory implements NodeFactory {

        private static RoundNodeFactory roundNodeFactoryInstance;

        private RoundNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return RoundNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class, RubyNode.class, RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public RoundNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (roundNodeFactoryInstance == null) {
                roundNodeFactoryInstance = new RoundNodeFactory();
            }
            return roundNodeFactoryInstance;
        }

        public static RoundNode create(RubyNode[] arguments) {
            return new RoundNodeGen(arguments);
        }

        @GeneratedBy(RoundNode.class)
        public static final class RoundNodeGen extends RoundNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private RubyNode arguments1_;
            @Child private RubyNode arguments2_;
            @CompilationFinal private Class arguments1Type_;
            @CompilationFinal private Class arguments2Type_;
            @Child private BaseNode_ specialization_;

            private RoundNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.arguments1_ = arguments != null && 1 < arguments.length ? arguments[1] : null;
                this.arguments2_ = arguments != null && 2 < arguments.length ? arguments[2] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(RoundNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected RoundNodeGen root;

                BaseNode_(RoundNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (RoundNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_, root.arguments1_, root.arguments2_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    Object arguments1Value_ = executeArguments1_(frameValue);
                    Object arguments2Value_ = executeArguments2_(frameValue);
                    return execute_(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if (arguments2Value instanceof NotProvided) {
                            if (arguments1Value instanceof NotProvided) {
                                if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                                    FixnumOrBignumNode fixnumOrBignumNode1 = (new FixnumOrBignumNode());
                                    return Round0Node_.create(root, fixnumOrBignumNode1);
                                }
                            }
                            if (RubyTypesGen.isImplicitInteger(arguments1Value)) {
                                if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                                    return Round1Node_.create(root, arguments1Value);
                                }
                            }
                        }
                        if (RubyTypesGen.isImplicitInteger(arguments1Value) && RubyTypesGen.isImplicitInteger(arguments2Value)) {
                            if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                                return Round2Node_.create(root, arguments1Value, arguments2Value);
                            }
                        }
                        if (arguments1Value instanceof NotProvided) {
                            if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                                FixnumOrBignumNode fixnumOrBignumNode4 = (new FixnumOrBignumNode());
                                BranchProfile negInfinityProfile4 = (BranchProfile.create());
                                BranchProfile posInfinityProfile4 = (BranchProfile.create());
                                BranchProfile negZeroProfile4 = (BranchProfile.create());
                                BranchProfile nanProfile4 = (BranchProfile.create());
                                return RoundSpecial0Node_.create(root, fixnumOrBignumNode4, negInfinityProfile4, posInfinityProfile4, negZeroProfile4, nanProfile4);
                            }
                        }
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (RubyGuards.wasProvided(arguments1Value))) {
                            return RoundSpecial1Node_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

                protected final Object executeArguments1_(Frame frameValue) {
                    Class arguments1Type_ = root.arguments1Type_;
                    try {
                        if (arguments1Type_ == int.class) {
                            return root.arguments1_.executeInteger((VirtualFrame) frameValue);
                        } else if (arguments1Type_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.arguments1_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.arguments1Type_ = _type;
                            }
                        } else {
                            return root.arguments1_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.arguments1Type_ = Object.class;
                        return ex.getResult();
                    }
                }

                protected final Object executeArguments2_(Frame frameValue) {
                    Class arguments2Type_ = root.arguments2Type_;
                    try {
                        if (arguments2Type_ == int.class) {
                            return root.arguments2_.executeInteger((VirtualFrame) frameValue);
                        } else if (arguments2Type_ == null) {
                            CompilerDirectives.transferToInterpreterAndInvalidate();
                            Class _type = Object.class;
                            try {
                                Object _value = root.arguments2_.execute((VirtualFrame) frameValue);
                                if (_value instanceof Integer) {
                                    _type = int.class;
                                } else {
                                    _type = Object.class;
                                }
                                return _value;
                            } finally {
                                root.arguments2Type_ = _type;
                            }
                        } else {
                            return root.arguments2_.execute((VirtualFrame) frameValue);
                        }
                    } catch (UnexpectedResultException ex) {
                        root.arguments2Type_ = Object.class;
                        return ex.getResult();
                    }
                }

            }
            @GeneratedBy(RoundNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(RoundNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return uninitialized(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(RoundNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(RoundNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value, arguments1Value, arguments2Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "round(VirtualFrame, DynamicObject, NotProvided, NotProvided, FixnumOrBignumNode)", value = RoundNode.class)
            private static final class Round0Node_ extends BaseNode_ {

                @Child private FixnumOrBignumNode fixnumOrBignumNode;

                Round0Node_(RoundNodeGen root, FixnumOrBignumNode fixnumOrBignumNode) {
                    super(root, 1);
                    this.fixnumOrBignumNode = fixnumOrBignumNode;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof NotProvided && arguments2Value instanceof NotProvided) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        NotProvided arguments1Value_ = (NotProvided) arguments1Value;
                        NotProvided arguments2Value_ = (NotProvided) arguments2Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.round(frameValue, arguments0Value_, arguments1Value_, arguments2Value_, this.fixnumOrBignumNode);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root, FixnumOrBignumNode fixnumOrBignumNode) {
                    return new Round0Node_(root, fixnumOrBignumNode);
                }

            }
            @GeneratedBy(methodName = "round(VirtualFrame, DynamicObject, int, NotProvided)", value = RoundNode.class)
            private static final class Round1Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;

                Round1Node_(RoundNodeGen root, Object arguments1Value) {
                    super(root, 2);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitIntegerClass(arguments1Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((Round1Node_) other).arguments1ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        Object arguments2Value = executeArguments2_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), arguments1Value, arguments2Value);
                    }
                    int arguments1Value_;
                    try {
                        if (arguments1ImplicitType == int.class) {
                            arguments1Value_ = root.arguments1_.executeInteger(frameValue);
                        } else {
                            Object arguments1Value__ = executeArguments1_(frameValue);
                            arguments1Value_ = RubyTypesGen.expectImplicitInteger(arguments1Value__, arguments1ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        Object arguments2Value = executeArguments2_(frameValue);
                        return getNext().execute_(frameValue, arguments0Value_, ex.getResult(), arguments2Value);
                    }
                    NotProvided arguments2Value_;
                    try {
                        arguments2Value_ = root.arguments2_.executeNotProvided(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, arguments0Value_, arguments1Value_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.round(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitInteger(arguments1Value, arguments1ImplicitType) && arguments2Value instanceof NotProvided) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        int arguments1Value_ = RubyTypesGen.asImplicitInteger(arguments1Value, arguments1ImplicitType);
                        NotProvided arguments2Value_ = (NotProvided) arguments2Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.round(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root, Object arguments1Value) {
                    return new Round1Node_(root, arguments1Value);
                }

            }
            @GeneratedBy(methodName = "round(VirtualFrame, DynamicObject, int, int)", value = RoundNode.class)
            private static final class Round2Node_ extends BaseNode_ {

                private final Class arguments1ImplicitType;
                private final Class arguments2ImplicitType;

                Round2Node_(RoundNodeGen root, Object arguments1Value, Object arguments2Value) {
                    super(root, 3);
                    this.arguments1ImplicitType = RubyTypesGen.getImplicitIntegerClass(arguments1Value);
                    this.arguments2ImplicitType = RubyTypesGen.getImplicitIntegerClass(arguments2Value);
                }

                @Override
                public boolean isSame(SpecializationNode other) {
                    return super.isSame(other) && this.arguments1ImplicitType == ((Round2Node_) other).arguments1ImplicitType && this.arguments2ImplicitType == ((Round2Node_) other).arguments2ImplicitType;
                }

                @Override
                public Object execute(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        Object arguments1Value = executeArguments1_(frameValue);
                        Object arguments2Value = executeArguments2_(frameValue);
                        return getNext().execute_(frameValue, ex.getResult(), arguments1Value, arguments2Value);
                    }
                    int arguments1Value_;
                    try {
                        if (arguments1ImplicitType == int.class) {
                            arguments1Value_ = root.arguments1_.executeInteger(frameValue);
                        } else {
                            Object arguments1Value__ = executeArguments1_(frameValue);
                            arguments1Value_ = RubyTypesGen.expectImplicitInteger(arguments1Value__, arguments1ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        Object arguments2Value = executeArguments2_(frameValue);
                        return getNext().execute_(frameValue, arguments0Value_, ex.getResult(), arguments2Value);
                    }
                    int arguments2Value_;
                    try {
                        if (arguments2ImplicitType == int.class) {
                            arguments2Value_ = root.arguments2_.executeInteger(frameValue);
                        } else {
                            Object arguments2Value__ = executeArguments2_(frameValue);
                            arguments2Value_ = RubyTypesGen.expectImplicitInteger(arguments2Value__, arguments2ImplicitType);
                        }
                    } catch (UnexpectedResultException ex) {
                        return getNext().execute_(frameValue, arguments0Value_, arguments1Value_, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.round(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                    }
                    return getNext().execute_(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && RubyTypesGen.isImplicitInteger(arguments1Value, arguments1ImplicitType) && RubyTypesGen.isImplicitInteger(arguments2Value, arguments2ImplicitType)) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        int arguments1Value_ = RubyTypesGen.asImplicitInteger(arguments1Value, arguments1ImplicitType);
                        int arguments2Value_ = RubyTypesGen.asImplicitInteger(arguments2Value, arguments2ImplicitType);
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.round(frameValue, arguments0Value_, arguments1Value_, arguments2Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root, Object arguments1Value, Object arguments2Value) {
                    return new Round2Node_(root, arguments1Value, arguments2Value);
                }

            }
            @GeneratedBy(methodName = "roundSpecial(DynamicObject, NotProvided, Object, FixnumOrBignumNode, BranchProfile, BranchProfile, BranchProfile, BranchProfile)", value = RoundNode.class)
            private static final class RoundSpecial0Node_ extends BaseNode_ {

                @Child private FixnumOrBignumNode fixnumOrBignumNode;
                private final BranchProfile negInfinityProfile;
                private final BranchProfile posInfinityProfile;
                private final BranchProfile negZeroProfile;
                private final BranchProfile nanProfile;

                RoundSpecial0Node_(RoundNodeGen root, FixnumOrBignumNode fixnumOrBignumNode, BranchProfile negInfinityProfile, BranchProfile posInfinityProfile, BranchProfile negZeroProfile, BranchProfile nanProfile) {
                    super(root, 4);
                    this.fixnumOrBignumNode = fixnumOrBignumNode;
                    this.negInfinityProfile = negInfinityProfile;
                    this.posInfinityProfile = posInfinityProfile;
                    this.negZeroProfile = negZeroProfile;
                    this.nanProfile = nanProfile;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject && arguments1Value instanceof NotProvided) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        NotProvided arguments1Value_ = (NotProvided) arguments1Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.roundSpecial(arguments0Value_, arguments1Value_, arguments2Value, this.fixnumOrBignumNode, this.negInfinityProfile, this.posInfinityProfile, this.negZeroProfile, this.nanProfile);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root, FixnumOrBignumNode fixnumOrBignumNode, BranchProfile negInfinityProfile, BranchProfile posInfinityProfile, BranchProfile negZeroProfile, BranchProfile nanProfile) {
                    return new RoundSpecial0Node_(root, fixnumOrBignumNode, negInfinityProfile, posInfinityProfile, negZeroProfile, nanProfile);
                }

            }
            @GeneratedBy(methodName = "roundSpecial(DynamicObject, Object, Object)", value = RoundNode.class)
            private static final class RoundSpecial1Node_ extends BaseNode_ {

                RoundSpecial1Node_(RoundNodeGen root) {
                    super(root, 5);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value, Object arguments1Value, Object arguments2Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_))) && (RubyGuards.wasProvided(arguments1Value))) {
                            return root.roundSpecial(arguments0Value_, arguments1Value, arguments2Value);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value, arguments1Value, arguments2Value);
                }

                static BaseNode_ create(RoundNodeGen root) {
                    return new RoundSpecial1Node_(root);
                }

            }
        }
    }
    @GeneratedBy(FiniteNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class FiniteNodeFactory implements NodeFactory {

        private static FiniteNodeFactory finiteNodeFactoryInstance;

        private FiniteNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return FiniteNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public FiniteNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (finiteNodeFactoryInstance == null) {
                finiteNodeFactoryInstance = new FiniteNodeFactory();
            }
            return finiteNodeFactoryInstance;
        }

        public static FiniteNode create(RubyNode[] arguments) {
            return new FiniteNodeGen(arguments);
        }

        @GeneratedBy(FiniteNode.class)
        public static final class FiniteNodeGen extends FiniteNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private FiniteNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public boolean executeBoolean(VirtualFrame frameValue) {
                return specialization_.executeBoolean(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(FiniteNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected FiniteNodeGen root;

                BaseNode_(FiniteNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (FiniteNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.executeBoolean_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return executeBoolean_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public boolean executeBoolean(VirtualFrame frameValue) {
                    return (boolean) execute(frameValue);
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return FiniteNormalNode_.create(root);
                        } else {
                            return FiniteSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(FiniteNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(FiniteNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return (boolean) uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(FiniteNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(FiniteNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(FiniteNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(FiniteNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "finiteNormal(DynamicObject)", value = FiniteNode.class)
            private static final class FiniteNormalNode_ extends BaseNode_ {

                FiniteNormalNode_(FiniteNodeGen root) {
                    super(root, 1);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.finiteNormal(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.finiteNormal(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(FiniteNodeGen root) {
                    return new FiniteNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "finiteSpecial(DynamicObject)", value = FiniteNode.class)
            private static final class FiniteSpecialNode_ extends BaseNode_ {

                FiniteSpecialNode_(FiniteNodeGen root) {
                    super(root, 2);
                }

                @Override
                public boolean executeBoolean(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeBoolean_(frameValue, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.finiteSpecial(arguments0Value_);
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value_);
                }

                @Override
                public boolean executeBoolean_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.finiteSpecial(arguments0Value_);
                        }
                    }
                    return getNext().executeBoolean_(frameValue, arguments0Value);
                }

                static BaseNode_ create(FiniteNodeGen root) {
                    return new FiniteSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(InfiniteNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class InfiniteNodeFactory implements NodeFactory {

        private static InfiniteNodeFactory infiniteNodeFactoryInstance;

        private InfiniteNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return InfiniteNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public InfiniteNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (infiniteNodeFactoryInstance == null) {
                infiniteNodeFactoryInstance = new InfiniteNodeFactory();
            }
            return infiniteNodeFactoryInstance;
        }

        public static InfiniteNode create(RubyNode[] arguments) {
            return new InfiniteNodeGen(arguments);
        }

        @GeneratedBy(InfiniteNode.class)
        public static final class InfiniteNodeGen extends InfiniteNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private InfiniteNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(InfiniteNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected InfiniteNodeGen root;

                BaseNode_(InfiniteNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (InfiniteNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return InfiniteNormalNode_.create(root);
                        } else {
                            return InfiniteSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(InfiniteNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(InfiniteNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(InfiniteNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(InfiniteNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(InfiniteNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(InfiniteNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "infiniteNormal(DynamicObject)", value = InfiniteNode.class)
            private static final class InfiniteNormalNode_ extends BaseNode_ {

                InfiniteNormalNode_(InfiniteNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.infiniteNormal(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(InfiniteNodeGen root) {
                    return new InfiniteNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "infiniteSpecial(DynamicObject)", value = InfiniteNode.class)
            private static final class InfiniteSpecialNode_ extends BaseNode_ {

                InfiniteSpecialNode_(InfiniteNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.infiniteSpecial(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(InfiniteNodeGen root) {
                    return new InfiniteSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(PrecsNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class PrecsNodeFactory implements NodeFactory {

        private static PrecsNodeFactory precsNodeFactoryInstance;

        private PrecsNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return PrecsNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public PrecsNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (precsNodeFactoryInstance == null) {
                precsNodeFactoryInstance = new PrecsNodeFactory();
            }
            return precsNodeFactoryInstance;
        }

        public static PrecsNode create(RubyNode[] arguments) {
            return new PrecsNodeGen(arguments);
        }

        @GeneratedBy(PrecsNode.class)
        public static final class PrecsNodeGen extends PrecsNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private PrecsNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(PrecsNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected PrecsNodeGen root;

                BaseNode_(PrecsNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (PrecsNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return PrecsNormalNode_.create(root);
                        } else {
                            return PrecsSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(PrecsNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(PrecsNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(PrecsNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(PrecsNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(PrecsNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(PrecsNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "precsNormal(DynamicObject)", value = PrecsNode.class)
            private static final class PrecsNormalNode_ extends BaseNode_ {

                PrecsNormalNode_(PrecsNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.precsNormal(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(PrecsNodeGen root) {
                    return new PrecsNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "precsSpecial(DynamicObject)", value = PrecsNode.class)
            private static final class PrecsSpecialNode_ extends BaseNode_ {

                PrecsSpecialNode_(PrecsNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.precsSpecial(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(PrecsNodeGen root) {
                    return new PrecsSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(ToFNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class ToFNodeFactory implements NodeFactory {

        private static ToFNodeFactory toFNodeFactoryInstance;

        private ToFNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return ToFNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public ToFNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (toFNodeFactoryInstance == null) {
                toFNodeFactoryInstance = new ToFNodeFactory();
            }
            return toFNodeFactoryInstance;
        }

        public static ToFNode create(RubyNode[] arguments) {
            return new ToFNodeGen(arguments);
        }

        @GeneratedBy(ToFNode.class)
        public static final class ToFNodeGen extends ToFNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private ToFNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public double executeDouble(VirtualFrame frameValue) {
                return specialization_.executeDouble(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(ToFNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected ToFNodeGen root;

                BaseNode_(ToFNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (ToFNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.executeDouble_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract double executeDouble_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return executeDouble_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public double executeDouble(VirtualFrame frameValue) {
                    return (double) execute(frameValue);
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return ToFNormalNode_.create(root);
                        } else {
                            BranchProfile negInfinityProfile2 = (BranchProfile.create());
                            BranchProfile posInfinityProfile2 = (BranchProfile.create());
                            BranchProfile negZeroProfile2 = (BranchProfile.create());
                            BranchProfile nanProfile2 = (BranchProfile.create());
                            return ToFSpecialNode_.create(root, negInfinityProfile2, posInfinityProfile2, negZeroProfile2, nanProfile2);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(ToFNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(ToFNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public double executeDouble_(VirtualFrame frameValue, Object arguments0Value) {
                    return (double) uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToFNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(ToFNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(ToFNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public double executeDouble(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return getNext().executeDouble_(frameValue, arguments0Value_);
                }

                @Override
                public double executeDouble_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().executeDouble_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToFNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "toFNormal(DynamicObject)", value = ToFNode.class)
            private static final class ToFNormalNode_ extends BaseNode_ {

                ToFNormalNode_(ToFNodeGen root) {
                    super(root, 1);
                }

                @Override
                public double executeDouble(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeDouble_(frameValue, ex.getResult());
                    }
                    if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                        return root.toFNormal(arguments0Value_);
                    }
                    return getNext().executeDouble_(frameValue, arguments0Value_);
                }

                @Override
                public double executeDouble_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.toFNormal(arguments0Value_);
                        }
                    }
                    return getNext().executeDouble_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToFNodeGen root) {
                    return new ToFNormalNode_(root);
                }

            }
            @GeneratedBy(methodName = "toFSpecial(DynamicObject, BranchProfile, BranchProfile, BranchProfile, BranchProfile)", value = ToFNode.class)
            private static final class ToFSpecialNode_ extends BaseNode_ {

                private final BranchProfile negInfinityProfile;
                private final BranchProfile posInfinityProfile;
                private final BranchProfile negZeroProfile;
                private final BranchProfile nanProfile;

                ToFSpecialNode_(ToFNodeGen root, BranchProfile negInfinityProfile, BranchProfile posInfinityProfile, BranchProfile negZeroProfile, BranchProfile nanProfile) {
                    super(root, 2);
                    this.negInfinityProfile = negInfinityProfile;
                    this.posInfinityProfile = posInfinityProfile;
                    this.negZeroProfile = negZeroProfile;
                    this.nanProfile = nanProfile;
                }

                @Override
                public double executeDouble(VirtualFrame frameValue) {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return getNext().executeDouble_(frameValue, ex.getResult());
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.toFSpecial(arguments0Value_, this.negInfinityProfile, this.posInfinityProfile, this.negZeroProfile, this.nanProfile);
                    }
                    return getNext().executeDouble_(frameValue, arguments0Value_);
                }

                @Override
                public double executeDouble_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.toFSpecial(arguments0Value_, this.negInfinityProfile, this.posInfinityProfile, this.negZeroProfile, this.nanProfile);
                        }
                    }
                    return getNext().executeDouble_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToFNodeGen root, BranchProfile negInfinityProfile, BranchProfile posInfinityProfile, BranchProfile negZeroProfile, BranchProfile nanProfile) {
                    return new ToFSpecialNode_(root, negInfinityProfile, posInfinityProfile, negZeroProfile, nanProfile);
                }

            }
        }
    }
    @GeneratedBy(UnscaledNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class UnscaledNodeFactory implements NodeFactory {

        private static UnscaledNodeFactory unscaledNodeFactoryInstance;

        private UnscaledNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return UnscaledNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public UnscaledNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (unscaledNodeFactoryInstance == null) {
                unscaledNodeFactoryInstance = new UnscaledNodeFactory();
            }
            return unscaledNodeFactoryInstance;
        }

        public static UnscaledNode create(RubyNode[] arguments) {
            return new UnscaledNodeGen(arguments);
        }

        @GeneratedBy(UnscaledNode.class)
        public static final class UnscaledNodeGen extends UnscaledNode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private UnscaledNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            @GeneratedBy(UnscaledNode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected UnscaledNodeGen root;

                BaseNode_(UnscaledNodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (UnscaledNodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return UnscaledNode_.create(root);
                        } else {
                            return UnscaledSpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(UnscaledNode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(UnscaledNodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(UnscaledNodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(UnscaledNode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(UnscaledNodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(UnscaledNodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "unscaled(DynamicObject)", value = UnscaledNode.class)
            private static final class UnscaledNode_ extends BaseNode_ {

                UnscaledNode_(UnscaledNodeGen root) {
                    super(root, 1);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.unscaled(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(UnscaledNodeGen root) {
                    return new UnscaledNode_(root);
                }

            }
            @GeneratedBy(methodName = "unscaledSpecial(DynamicObject)", value = UnscaledNode.class)
            private static final class UnscaledSpecialNode_ extends BaseNode_ {

                UnscaledSpecialNode_(UnscaledNodeGen root) {
                    super(root, 2);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.unscaledSpecial(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(UnscaledNodeGen root) {
                    return new UnscaledSpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(ToINode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class ToINodeFactory implements NodeFactory {

        private static ToINodeFactory toINodeFactoryInstance;

        private ToINodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return ToINode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public ToINode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (toINodeFactoryInstance == null) {
                toINodeFactoryInstance = new ToINodeFactory();
            }
            return toINodeFactoryInstance;
        }

        public static ToINode create(RubyNode[] arguments) {
            return new ToINodeGen(arguments);
        }

        @GeneratedBy(ToINode.class)
        public static final class ToINodeGen extends ToINode implements SpecializedNode {

            @Child private RubyNode arguments0_;
            @Child private BaseNode_ specialization_;

            private ToINodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
                this.specialization_ = UninitializedNode_.create(this);
            }

            @Override
            public NodeCost getCost() {
                return specialization_.getNodeCost();
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                return specialization_.execute(frameValue);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                specialization_.executeVoid(frameValue);
                return;
            }

            @Override
            public int executeInteger(VirtualFrame frameValue) throws UnexpectedResultException {
                return specialization_.executeInt(frameValue);
            }

            @Override
            public SpecializationNode getSpecializationNode() {
                return specialization_;
            }

            @Override
            public Node deepCopy() {
                return SpecializationNode.updateRoot(super.deepCopy());
            }

            private static int expectInteger(Object value) throws UnexpectedResultException {
                if (value instanceof Integer) {
                    return (int) value;
                }
                throw new UnexpectedResultException(value);
            }

            @GeneratedBy(ToINode.class)
            private abstract static class BaseNode_ extends SpecializationNode {

                @CompilationFinal protected ToINodeGen root;

                BaseNode_(ToINodeGen root, int index) {
                    super(index);
                    this.root = root;
                }

                @Override
                protected final void setRoot(Node root) {
                    this.root = (ToINodeGen) root;
                }

                @Override
                protected final Node[] getSuppliedChildren() {
                    return new Node[] {root.arguments0_};
                }

                @Override
                public final Object acceptAndExecute(Frame frameValue, Object arguments0Value) {
                    return this.execute_((VirtualFrame) frameValue, arguments0Value);
                }

                public abstract Object execute_(VirtualFrame frameValue, Object arguments0Value);

                public Object execute(VirtualFrame frameValue) {
                    Object arguments0Value_ = root.arguments0_.execute(frameValue);
                    return execute_(frameValue, arguments0Value_);
                }

                public void executeVoid(VirtualFrame frameValue) {
                    execute(frameValue);
                    return;
                }

                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    return expectInteger(execute(frameValue));
                }

                @Override
                protected final SpecializationNode createNext(Frame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            FixnumOrBignumNode fixnumOrBignumNode1 = (new FixnumOrBignumNode());
                            return ToINormalNode_.create(root, fixnumOrBignumNode1);
                        } else {
                            return ToISpecialNode_.create(root);
                        }
                    }
                    return null;
                }

                @Override
                protected final SpecializationNode createPolymorphic() {
                    return PolymorphicNode_.create(root);
                }

                protected final BaseNode_ getNext() {
                    return (BaseNode_) this.next;
                }

            }
            @GeneratedBy(ToINode.class)
            private static final class UninitializedNode_ extends BaseNode_ {

                UninitializedNode_(ToINodeGen root) {
                    super(root, 2147483647);
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return uninitialized(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToINodeGen root) {
                    return new UninitializedNode_(root);
                }

            }
            @GeneratedBy(ToINode.class)
            private static final class PolymorphicNode_ extends BaseNode_ {

                PolymorphicNode_(ToINodeGen root) {
                    super(root, 0);
                }

                @Override
                public SpecializationNode merge(SpecializationNode newNode, Frame frameValue, Object arguments0Value) {
                    return polymorphicMerge(newNode, super.merge(newNode, frameValue, arguments0Value));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToINodeGen root) {
                    return new PolymorphicNode_(root);
                }

            }
            @GeneratedBy(methodName = "toINormal(DynamicObject, FixnumOrBignumNode)", value = ToINode.class)
            private static final class ToINormalNode_ extends BaseNode_ {

                @Child private FixnumOrBignumNode fixnumOrBignumNode;

                ToINormalNode_(ToINodeGen root, FixnumOrBignumNode fixnumOrBignumNode) {
                    super(root, 1);
                    this.fixnumOrBignumNode = fixnumOrBignumNode;
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((BigDecimalCoreMethodNode.isNormal(arguments0Value_))) {
                            return root.toINormal(arguments0Value_, this.fixnumOrBignumNode);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToINodeGen root, FixnumOrBignumNode fixnumOrBignumNode) {
                    return new ToINormalNode_(root, fixnumOrBignumNode);
                }

            }
            @GeneratedBy(methodName = "toISpecial(DynamicObject)", value = ToINode.class)
            private static final class ToISpecialNode_ extends BaseNode_ {

                ToISpecialNode_(ToINodeGen root) {
                    super(root, 2);
                }

                @Override
                public int executeInt(VirtualFrame frameValue) throws UnexpectedResultException {
                    DynamicObject arguments0Value_;
                    try {
                        arguments0Value_ = root.arguments0_.executeDynamicObject(frameValue);
                    } catch (UnexpectedResultException ex) {
                        return expectInteger(getNext().execute_(frameValue, ex.getResult()));
                    }
                    if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                        return root.toISpecial(arguments0Value_);
                    }
                    return expectInteger(getNext().execute_(frameValue, arguments0Value_));
                }

                @Override
                public Object execute_(VirtualFrame frameValue, Object arguments0Value) {
                    if (arguments0Value instanceof DynamicObject) {
                        DynamicObject arguments0Value_ = (DynamicObject) arguments0Value;
                        if ((!(BigDecimalCoreMethodNode.isNormal(arguments0Value_)))) {
                            return root.toISpecial(arguments0Value_);
                        }
                    }
                    return getNext().execute_(frameValue, arguments0Value);
                }

                static BaseNode_ create(ToINodeGen root) {
                    return new ToISpecialNode_(root);
                }

            }
        }
    }
    @GeneratedBy(AllocateNode.class)
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static final class AllocateNodeFactory implements NodeFactory {

        private static AllocateNodeFactory allocateNodeFactoryInstance;

        private AllocateNodeFactory() {
        }

        @Override
        public Class getNodeClass() {
            return AllocateNode.class;
        }

        @Override
        public List getExecutionSignature() {
            return Arrays.asList(RubyNode.class);
        }

        @Override
        public List getNodeSignatures() {
            return Arrays.asList(Arrays.asList(RubyNode[].class));
        }

        @Override
        public AllocateNode createNode(Object... arguments) {
            if (arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof RubyNode[])) {
                return create((RubyNode[]) arguments[0]);
            } else {
                throw new IllegalArgumentException("Invalid create signature.");
            }
        }

        public static NodeFactory getInstance() {
            if (allocateNodeFactoryInstance == null) {
                allocateNodeFactoryInstance = new AllocateNodeFactory();
            }
            return allocateNodeFactoryInstance;
        }

        public static AllocateNode create(RubyNode[] arguments) {
            return new AllocateNodeGen(arguments);
        }

        @GeneratedBy(AllocateNode.class)
        public static final class AllocateNodeGen extends AllocateNode {

            @Child private RubyNode arguments0_;
            @CompilationFinal private boolean seenUnsupported0;

            private AllocateNodeGen(RubyNode[] arguments) {
                this.arguments0_ = arguments != null && 0 < arguments.length ? arguments[0] : null;
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MONOMORPHIC;
            }

            @Override
            public Object execute(VirtualFrame frameValue) {
                DynamicObject arguments0Value_;
                try {
                    arguments0Value_ = arguments0_.executeDynamicObject(frameValue);
                } catch (UnexpectedResultException ex) {
                    throw unsupported(ex.getResult());
                }
                return this.allocate(arguments0Value_);
            }

            @Override
            public void executeVoid(VirtualFrame frameValue) {
                execute(frameValue);
                return;
            }

            private UnsupportedSpecializationException unsupported(Object arguments0Value) {
                if (!seenUnsupported0) {
                    CompilerDirectives.transferToInterpreterAndInvalidate();
                    seenUnsupported0 = true;
                }
                return new UnsupportedSpecializationException(this, new Node[] {arguments0_}, arguments0Value);
            }

        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy