Version 2.17.0-140.0.dev

Merge commit '1d9fff9128f90cdea6b6499d96b919c8ca63f302' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
index 0c07171..33ffa22 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
@@ -5,12 +5,13 @@
 * "fixes infeasible", if it has been deemed infeasible to write a fix for this code
 
 Stats:
-* 793 "needs evaluation"
+* 809 "needs evaluation"
 * 19 "needs fix"
 * 253 "has fix(es)"
+* 2 "fixes infeasible"
 
-AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR: needs evaluation
-AnalysisOptionsErrorCode.PARSE_ERROR: needs evaluation
+AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR: fixes infeasible
+AnalysisOptionsErrorCode.PARSE_ERROR: fixes infeasible
 AnalysisOptionsHintCode.PREVIEW_DART_2_SETTING_DEPRECATED: needs evaluation
 AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED: needs evaluation
 AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED: needs evaluation
@@ -60,6 +61,7 @@
 CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER: needs evaluation; new in 2.15
 CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER: needs evaluation; new in 2.15
 CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: needs evaluation; new in 2.15
+CompileTimeErrorCode.CONCRETE_CLASS_HAS_ENUM_SUPERINTERFACE: needs evaluation; new in 2.17
 CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER: has fix(es)
 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD: needs evaluation
 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER: needs evaluation; new in 2.15
@@ -70,8 +72,10 @@
 CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD: needs evaluation
 CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE: needs evaluation
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS: needs evaluation
+CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_ENUM: needs evaluation; new in 2.17
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_EXTENSION: needs evaluation
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS: needs evaluation
+CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_ENUM: needs evaluation; new in 2.17
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION: needs evaluation
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN: needs evaluation
 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MIXIN: needs evaluation
@@ -124,6 +128,10 @@
 CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT: needs evaluation
 CompileTimeErrorCode.DUPLICATE_PART: needs evaluation
 CompileTimeErrorCode.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING: needs evaluation
+CompileTimeErrorCode.ENUM_CONSTANT_WITH_NON_CONST_CONSTRUCTOR: needs evaluation; new in 2.17
+CompileTimeErrorCode.ENUM_INSTANTIATED_TO_BOUNDS_IS_NOT_WELL_BOUNDED: needs evaluation; new in 2.17
+CompileTimeErrorCode.ENUM_MIXIN_WITH_INSTANCE_VARIABLE: needs evaluation; new in 2.17
+CompileTimeErrorCode.ENUM_WITH_ABSTRACT_MEMBER: needs evaluation; new in 2.17
 CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET: needs evaluation
 CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP: needs evaluation
 CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS: needs evaluation
@@ -173,6 +181,10 @@
 CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY: needs evaluation
 CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE: has fix(es)
 CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE: has fix(es)
+CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_DECLARATION: needs evaluation; new in 2.17
+CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE: needs evaluation; new in 2.17
+CompileTimeErrorCode.ILLEGAL_LANGUAGE_VERSION_OVERRIDE: needs evaluation; new in 2.17
+CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX: needs evaluation; new in 2.17
 CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE: has fix(es)
 CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS: needs evaluation
 CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS: needs evaluation
@@ -181,8 +193,7 @@
 CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS: needs evaluation
 CompileTimeErrorCode.IMPLEMENTS_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER: needs evaluation
 CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER: needs evaluation
-CompileTimeErrorCode.IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_MISSING_REQUIRED_ARGUMENT: has fix(es)
-CompileTimeErrorCode.IMPLICIT_UNNAMED_SUPER_CONSTRUCTOR_INVOCATION_NOT_ENOUGH_POSITIONAL_ARGUMENTS: has fix(es)
+CompileTimeErrorCode.IMPLICIT_SUPER_INITIALIZER_MISSING_ARGUMENTS: has fix(es)
 CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY: needs evaluation
 CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY: needs evaluation
 CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES: needs evaluation
@@ -221,6 +232,7 @@
 CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR: needs evaluation
 CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER: needs evaluation
 CompileTimeErrorCode.INVALID_OVERRIDE: has fix(es)
+CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR: needs evaluation; new in 2.17
 CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS: needs evaluation
 CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION: needs fix; new in 2.17
 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST: needs evaluation
@@ -286,6 +298,7 @@
 CompileTimeErrorCode.NON_BOOL_EXPRESSION: needs evaluation
 CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION: needs evaluation
 CompileTimeErrorCode.NON_BOOL_OPERAND: needs evaluation
+CompileTimeErrorCode.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR: needs evaluation; new in 2.17
 CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT: needs evaluation
 CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR: needs evaluation
 CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION: needs evaluation
@@ -370,6 +383,7 @@
 CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED: needs fix; new in 2.17
 CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED: needs evaluation; new in 2.17
 CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL: needs fix; https://github.com/dart-lang/sdk/issues/48359
+CompileTimeErrorCode.SUPER_IN_ENUM_CONSTRUCTOR: needs evaluation; new in 2.17
 CompileTimeErrorCode.SUPER_IN_EXTENSION: needs evaluation
 CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT: needs evaluation
 CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR: needs evaluation
@@ -401,6 +415,8 @@
 CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER: needs evaluation
 CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT: has fix(es)
 CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT: needs evaluation
+CompileTimeErrorCode.UNDEFINED_ENUM_CONSTRUCTOR_NAMED: needs evaluation; new in 2.17
+CompileTimeErrorCode.UNDEFINED_ENUM_CONSTRUCTOR_UNNAMED: needs evaluation; new in 2.17
 CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER: has fix(es)
 CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD: has fix(es)
 CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR: needs evaluation
@@ -428,6 +444,7 @@
 CompileTimeErrorCode.URI_WITH_INTERPOLATION: needs evaluation
 CompileTimeErrorCode.USE_OF_NATIVE_EXTENSION: needs evaluation; compile-time error as of ~2.15
 CompileTimeErrorCode.USE_OF_VOID_RESULT: needs evaluation
+CompileTimeErrorCode.VALUES_DECLARATION_IN_ENUM: needs evaluation; new in 2.17
 CompileTimeErrorCode.VARIABLE_TYPE_MISMATCH: needs evaluation
 CompileTimeErrorCode.WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE: needs evaluation
 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR: needs evaluation
@@ -436,6 +453,7 @@
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: has fix(es)
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION: needs fix; new in 2.15
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: has fix(es)
+CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ENUM: needs evaluation; new in 2.17
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: has fix(es)
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION: needs fix; new in ~2.15
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: has fix(es)
@@ -881,6 +899,7 @@
 ParserErrorCode.DUPLICATE_PREFIX: needs evaluation
 ParserErrorCode.DUPLICATED_MODIFIER: needs evaluation
 ParserErrorCode.EMPTY_ENUM_BODY: needs evaluation
+ParserErrorCode.ENUM_CONSTANT_WITH_TYPE_ARGUMENTS_WITHOUT_ARGUMENTS: needs evaluation; new in 2.17
 ParserErrorCode.ENUM_IN_CLASS: needs evaluation
 ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND: needs evaluation
 ParserErrorCode.EXPECTED_BODY: needs evaluation
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 0696e46..11a88a6 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -218,7 +218,8 @@
   CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_DECLARATION,
   CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE,
   CompileTimeErrorCode.ILLEGAL_LANGUAGE_VERSION_OVERRIDE,
-  CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX,
+  CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION,
+  CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE,
   CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
   CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 16e5f20..dfa4a1e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -225,16 +225,13 @@
   void _resolveTypes(AssignmentExpressionImpl node,
       {required Map<DartType, NonPromotionReason> Function()? whyNotPromoted}) {
     DartType assignedType;
-    DartType? implicitCallContext;
 
     var rightHandSide = node.rightHandSide;
     var operator = node.operator.type;
     if (operator == TokenType.EQ) {
       assignedType = rightHandSide.typeOrThrow;
-      implicitCallContext = node.writeType;
     } else if (operator == TokenType.QUESTION_QUESTION_EQ) {
       assignedType = rightHandSide.typeOrThrow;
-      implicitCallContext = node.writeType;
     } else if (operator == TokenType.AMPERSAND_AMPERSAND_EQ ||
         operator == TokenType.BAR_BAR_EQ) {
       assignedType = _typeProvider.boolType;
@@ -255,11 +252,6 @@
       }
     }
 
-    var callInsertion = _resolver.insertImplicitCallReference(rightHandSide,
-        context: implicitCallContext);
-    if (callInsertion != null) {
-      assignedType = callInsertion.staticType;
-    }
     DartType nodeType;
     if (operator == TokenType.QUESTION_QUESTION_EQ) {
       var leftType = node.readType!;
diff --git a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
index 5c56ff1..dcde026 100644
--- a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
@@ -119,7 +119,6 @@
 
     node.typeArguments?.accept(_resolver);
     _resolveElements(node.elements, context);
-    _insertImplicitCallReferences(node);
     _resolveListLiteral2(node);
   }
 
@@ -179,7 +178,6 @@
 
     node.typeArguments?.accept(_resolver);
     _resolveElements(node.elements, context);
-    _insertImplicitCallReferences(node);
     _resolveSetOrMapLiteral2(node);
   }
 
@@ -623,34 +621,6 @@
     );
   }
 
-  void _insertImplicitCallReference(CollectionElement? node) {
-    if (node is Expression) {
-      _resolver.insertImplicitCallReference(node);
-    } else if (node is MapLiteralEntry) {
-      _insertImplicitCallReference(node.key);
-      _insertImplicitCallReference(node.value);
-    } else if (node is IfElement) {
-      _insertImplicitCallReference(node.thenElement);
-      _insertImplicitCallReference(node.elseElement);
-    } else if (node is ForElement) {
-      _insertImplicitCallReference(node.body);
-    }
-    // Nothing to do for [SpreadElement] as analyzer does not desugar this
-    // element.
-  }
-
-  void _insertImplicitCallReferences(TypedLiteral node) {
-    if (node is ListLiteral) {
-      for (var element in node.elements) {
-        _insertImplicitCallReference(element);
-      }
-    } else if (node is SetOrMapLiteral) {
-      for (var element in node.elements) {
-        _insertImplicitCallReference(element);
-      }
-    }
-  }
-
   void _resolveElements(
       List<CollectionElement> elements, CollectionLiteralContext? context) {
     for (var element in elements) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 6ae7fe4..17d7f04 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -64,11 +64,6 @@
       _resolver.flowAnalysis.flow?.lateInitializer_end();
     }
 
-    var callInsertion = _resolver.insertImplicitCallReference(initializer);
-    if (callInsertion != null) {
-      initializer = callInsertion.expression;
-    }
-
     // Initializers of top-level variables and fields are already included
     // into elements during linking.
     if (element is ConstLocalVariableElementImpl) {
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 1b03e56..ff21e56 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -5759,6 +5759,33 @@
     hasPublishedDocs: true,
   );
 
+  /**
+   * Parameters:
+   * 0: the name of member that cannot be declared
+   */
+  static const CompileTimeErrorCode ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION =
+      CompileTimeErrorCode(
+    'ILLEGAL_CONCRETE_ENUM_MEMBER',
+    "A concrete instance member named '{0}' can't be declared in a class that "
+        "implements 'Enum'.",
+    correctionMessage: "Try using a different name.",
+    uniqueName: 'ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION',
+  );
+
+  /**
+   * Parameters:
+   * 0: the name of member that cannot be inherited
+   * 1: the name of the class that declares the member
+   */
+  static const CompileTimeErrorCode ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE =
+      CompileTimeErrorCode(
+    'ILLEGAL_CONCRETE_ENUM_MEMBER',
+    "A concrete instance member named '{0}' can't be inherited from '{1}' in a "
+        "class that implements 'Enum'.",
+    correctionMessage: "Try using a different name.",
+    uniqueName: 'ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE',
+  );
+
   static const CompileTimeErrorCode ILLEGAL_ENUM_VALUES_DECLARATION =
       CompileTimeErrorCode(
     'ILLEGAL_ENUM_VALUES',
@@ -5789,14 +5816,6 @@
         "Try removing the language version override and migrating the code.",
   );
 
-  static const CompileTimeErrorCode ILLEGAL_NON_ABSTRACT_ENUM_INDEX =
-      CompileTimeErrorCode(
-    'ILLEGAL_NON_ABSTRACT_ENUM_INDEX',
-    "A non-abstract instance member named 'index' can't be declared in a class "
-        "that implements 'Enum'.",
-    correctionMessage: "Try using a different name.",
-  );
-
   /**
    * No parameters.
    */
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index d8c9d62..b55e65d 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -201,7 +201,7 @@
             _checkIllegalEnumValuesDeclaration(field.name);
           }
           if (!member.isStatic) {
-            _checkIllegalNonAbstractEnumIndex(field.name);
+            _checkIllegalConcreteEnumMemberDeclaration(field.name);
           }
         }
       } else if (member is MethodDeclaration) {
@@ -212,15 +212,16 @@
 
         _checkDeclaredMember(member.name, libraryUri, member.declaredElement,
             methodParameterNodes: member.parameters?.parameters);
+        if (!(member.isStatic || member.isAbstract || member.isSetter)) {
+          _checkIllegalConcreteEnumMemberDeclaration(member.name);
+        }
         if (!member.isStatic && !classElement.isEnum) {
           _checkIllegalEnumValuesDeclaration(member.name);
         }
-        if (!(member.isStatic || member.isAbstract || member.isSetter)) {
-          _checkIllegalNonAbstractEnumIndex(member.name);
-        }
       }
     }
 
+    _checkIllegalConcreteEnumMemberInheritance();
     _checkIllegalEnumValuesInheritance();
 
     GetterSetterTypesVerifier(
@@ -639,6 +640,44 @@
     return false;
   }
 
+  void _checkIllegalConcreteEnumMemberDeclaration(SimpleIdentifier name) {
+    if (implementsDartCoreEnum &&
+        const {'index', 'hashCode', '=='}.contains(name.name)) {
+      reporter.reportErrorForNode(
+        CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION,
+        name,
+        [name.name],
+      );
+    }
+  }
+
+  void _checkIllegalConcreteEnumMemberInheritance() {
+    // We ignore mixins because they don't inherit and members.
+    // But to support `super.foo()` invocations we put members from superclass
+    // constraints into the `superImplemented` bucket, the same we look below.
+    if (classElement.isMixin) {
+      return;
+    }
+
+    if (implementsDartCoreEnum) {
+      var concreteMap = inheritance.getInheritedConcreteMap2(classElement);
+      for (var memberName in const ['hashCode', '==']) {
+        var member = concreteMap[Name(libraryUri, memberName)];
+        if (member != null) {
+          var enclosingClass = member.enclosingElement;
+          if (enclosingClass is ClassElement &&
+              !enclosingClass.isDartCoreObject) {
+            reporter.reportErrorForNode(
+              CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE,
+              classNameNode,
+              [memberName, enclosingClass.name],
+            );
+          }
+        }
+      }
+    }
+  }
+
   void _checkIllegalEnumValuesDeclaration(SimpleIdentifier name) {
     if (implementsDartCoreEnum && name.name == 'values') {
       reporter.reportErrorForNode(
@@ -669,15 +708,6 @@
     }
   }
 
-  void _checkIllegalNonAbstractEnumIndex(SimpleIdentifier name) {
-    if (implementsDartCoreEnum && name.name == 'index') {
-      reporter.reportErrorForNode(
-        CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX,
-        name,
-      );
-    }
-  }
-
   /// Return the error code that should be used when the given class [element]
   /// references itself directly.
   ErrorCode _getRecursiveErrorCode(ClassElement element) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 4e32f72..97dc545 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
@@ -78,18 +79,6 @@
 /// promoted.
 typedef WhyNotPromotedGetter = Map<DartType, NonPromotionReason> Function();
 
-/// Data structure describing the result of inserting an implicit call reference
-/// into the AST.
-class ImplicitCallInsertionResult {
-  /// The expression that was inserted.
-  final ImplicitCallReferenceImpl expression;
-
-  /// The type of the implicit call tear-off.
-  final FunctionType staticType;
-
-  ImplicitCallInsertionResult(this.expression, this.staticType);
-}
-
 /// Maintains and manages contextual type information used for
 /// inferring types.
 class InferenceContext {
@@ -541,13 +530,6 @@
   /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
   void checkForArgumentTypesNotAssignableInList(ArgumentList argumentList,
       List<WhyNotPromotedGetter> whyNotPromotedList) {
-    for (var argument in argumentList.arguments) {
-      if (argument is NamedExpression) {
-        insertImplicitCallReference(argument.expression);
-      } else {
-        insertImplicitCallReference(argument);
-      }
-    }
     var arguments = argumentList.arguments;
     for (int i = 0; i < arguments.length; i++) {
       checkForArgumentTypeNotAssignableForArgument(arguments[i],
@@ -809,66 +791,6 @@
     return genericFunctionInstantiation;
   }
 
-  /// If `expression` should be treated as `expression.call`, inserts an
-  /// [ImplicitCallReference] node which wraps [expression].
-  ///
-  /// If an [ImplicitCallReference] is inserted, returns an
-  /// [ImplicitCallInsertionResult] describing what was changed; otherwise,
-  /// returns `null`.
-  ImplicitCallInsertionResult? insertImplicitCallReference(
-      Expression expression,
-      {DartType? context}) {
-    expression as ExpressionImpl;
-    var parent = expression.parent;
-    if (parent is CascadeExpression && parent.target == expression) {
-      // Do not perform an "implicit tear-off conversion" here. It should only
-      // be performed on [parent]. See
-      // https://github.com/dart-lang/language/issues/1873.
-      return null;
-    }
-    context ??= InferenceContext.getContext(expression);
-    var callMethod =
-        getImplicitCallMethod(expression.typeOrThrow, context, expression);
-    if (callMethod == null || context == null) {
-      return null;
-    }
-
-    // `expression` is to be treated as `expression.call`.
-    context = typeSystem.flatten(context);
-    var callMethodType = callMethod.type;
-    List<DartType> typeArgumentTypes;
-    if (isConstructorTearoffsEnabled &&
-        callMethodType.typeFormals.isNotEmpty &&
-        context is FunctionType) {
-      typeArgumentTypes = typeSystem.inferFunctionTypeInstantiation(
-        context,
-        callMethodType,
-        errorReporter: errorReporter,
-        errorNode: expression,
-        // If the constructor-tearoffs feature is enabled, then so is
-        // generic-metadata.
-        genericMetadataIsEnabled: true,
-      )!;
-      if (typeArgumentTypes.isNotEmpty) {
-        callMethodType = callMethodType.instantiate(typeArgumentTypes);
-      }
-    } else {
-      typeArgumentTypes = [];
-    }
-
-    var callReference = astFactory.implicitCallReference(
-      expression: expression,
-      staticElement: callMethod,
-      typeArguments: null,
-      typeArgumentTypes: typeArgumentTypes,
-    );
-    NodeReplacer.replace(expression, callReference, parent: parent);
-
-    callReference.staticType = callMethodType;
-
-    return ImplicitCallInsertionResult(callReference, callMethodType);
-  }
-
   /// If we reached a null-shorting termination, and the [node] has null
   /// shorting, make the type of the [node] nullable.
   void nullShortingTermination(ExpressionImpl node,
@@ -1176,7 +1098,7 @@
     node.visitChildren(this);
     typeAnalyzer.visitAsExpression(node as AsExpressionImpl);
     flowAnalysis.asExpression(node);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -1210,7 +1132,7 @@
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
     _assignmentExpressionResolver.resolve(node as AssignmentExpressionImpl);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -1223,7 +1145,7 @@
     checkUnreachableNode(node);
     analyzeExpression(node.expression, futureUnion);
     typeAnalyzer.visitAwaitExpression(node as AwaitExpressionImpl);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -1234,7 +1156,7 @@
           node, InferenceContext.getContext(node));
     }
     _binaryExpressionResolver.resolve(node as BinaryExpressionImpl);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -1291,6 +1213,7 @@
     typeAnalyzer.visitCascadeExpression(node);
 
     nullShortingTermination(node);
+    _insertImplicitCallReference(node);
   }
 
   @override
@@ -1386,6 +1309,7 @@
     elseExpression = node.elseExpression;
 
     typeAnalyzer.visitConditionalExpression(node as ConditionalExpressionImpl);
+    _insertImplicitCallReference(node);
   }
 
   @override
@@ -1447,13 +1371,6 @@
     elementResolver.visitConstructorFieldInitializer(
         node as ConstructorFieldInitializerImpl);
     if (fieldElement != null) {
-      if (fieldType != null && expression.staticType != null) {
-        var callReference = insertImplicitCallReference(expression)?.expression;
-        if (callReference != null) {
-          checkForInvalidAssignment(node.fieldName, callReference,
-              whyNotPromoted: whyNotPromoted);
-        }
-      }
       var enclosingConstructor = enclosingFunction as ConstructorElement;
       checkForFieldInitializerNotAssignable(node, fieldElement,
           isConstConstructor: enclosingConstructor.isConst,
@@ -1470,6 +1387,7 @@
   @override
   void visitConstructorReference(covariant ConstructorReferenceImpl node) {
     _constructorReferenceResolver.resolve(node);
+    _insertImplicitCallReference(node);
   }
 
   @override
@@ -1674,7 +1592,6 @@
         node.expression,
         inferenceContext.bodyContext!.contextType,
       );
-      insertImplicitCallReference(node.expression);
 
       flowAnalysis.flow?.handleExit();
 
@@ -1845,9 +1762,10 @@
     _functionExpressionInvocationResolver.resolve(
         node as FunctionExpressionInvocationImpl, whyNotPromotedList);
     nullShortingTermination(node);
-    insertGenericFunctionInstantiation(node);
+    var replacement = insertGenericFunctionInstantiation(node);
     checkForArgumentTypesNotAssignableInList(
         node.argumentList, whyNotPromotedList);
+    _insertImplicitCallReference(replacement);
   }
 
   @override
@@ -1989,15 +1907,17 @@
       type = DynamicTypeImpl.instance;
     }
     inferenceHelper.recordStaticType(node, type);
-    insertGenericFunctionInstantiation(node);
+    var replacement = insertGenericFunctionInstantiation(node);
 
     nullShortingTermination(node);
+    _insertImplicitCallReference(replacement);
   }
 
   @override
   void visitInstanceCreationExpression(
       covariant InstanceCreationExpressionImpl node) {
     _instanceCreationExpressionResolver.resolve(node);
+    _insertImplicitCallReference(node);
   }
 
   @override
@@ -2132,9 +2052,10 @@
     } else {
       nullShortingTermination(node);
     }
-    insertGenericFunctionInstantiation(node);
+    var replacement = insertGenericFunctionInstantiation(node);
     checkForArgumentTypesNotAssignableInList(
         node.argumentList, whyNotPromotedList);
+    _insertImplicitCallReference(replacement);
   }
 
   @override
@@ -2229,19 +2150,19 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     _postfixExpressionResolver.resolve(node as PostfixExpressionImpl);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
   void visitPrefixedIdentifier(covariant PrefixedIdentifierImpl node) {
     _prefixedIdentifierResolver.resolve(node);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
     _prefixExpressionResolver.resolve(node as PrefixExpressionImpl);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -2283,9 +2204,10 @@
 
     inferenceHelper.recordStaticType(propertyName, type);
     inferenceHelper.recordStaticType(node, type);
-    insertGenericFunctionInstantiation(node);
+    var replacement = insertGenericFunctionInstantiation(node);
 
     nullShortingTermination(node);
+    _insertImplicitCallReference(replacement);
   }
 
   @override
@@ -2328,10 +2250,6 @@
 
     inferenceContext.bodyContext?.addReturnExpression(expression);
     flowAnalysis.flow?.handleExit();
-
-    if (expression != null) {
-      insertImplicitCallReference(expression);
-    }
   }
 
   @override
@@ -2353,7 +2271,7 @@
   @override
   void visitSimpleIdentifier(covariant SimpleIdentifierImpl node) {
     _simpleIdentifierResolver.resolve(node);
-    insertGenericFunctionInstantiation(node);
+    _insertImplicitCallReference(insertGenericFunctionInstantiation(node));
   }
 
   @override
@@ -2494,6 +2412,7 @@
     checkUnreachableNode(node);
     node.visitChildren(this);
     typeAnalyzer.visitThisExpression(node as ThisExpressionImpl);
+    _insertImplicitCallReference(node);
   }
 
   @override
@@ -2658,6 +2577,62 @@
     return typeProvider.futureOrType(type);
   }
 
+  /// If `expression` should be treated as `expression.call`, inserts an
+  /// [ImplicitCallReference] node which wraps [expression].
+  void _insertImplicitCallReference(ExpressionImpl expression) {
+    var parent = expression.parent;
+    if (_shouldSkipImplicitCallReferenceDueToForm(expression, parent)) {
+      return;
+    }
+    var staticType = expression.staticType;
+    if (staticType == null) {
+      return;
+    }
+    DartType? context;
+    if (parent is AssignmentExpression) {
+      context = parent.writeType;
+    } else {
+      context = InferenceContext.getContext(expression);
+    }
+    var callMethod = getImplicitCallMethod(staticType, context, expression);
+    if (callMethod == null || context == null) {
+      return;
+    }
+
+    // `expression` is to be treated as `expression.call`.
+    context = typeSystem.flatten(context);
+    var callMethodType = callMethod.type;
+    List<DartType> typeArgumentTypes;
+    if (isConstructorTearoffsEnabled &&
+        callMethodType.typeFormals.isNotEmpty &&
+        context is FunctionType) {
+      typeArgumentTypes = typeSystem.inferFunctionTypeInstantiation(
+        context,
+        callMethodType,
+        errorReporter: errorReporter,
+        errorNode: expression,
+        // If the constructor-tearoffs feature is enabled, then so is
+        // generic-metadata.
+        genericMetadataIsEnabled: true,
+      )!;
+      if (typeArgumentTypes.isNotEmpty) {
+        callMethodType = callMethodType.instantiate(typeArgumentTypes);
+      }
+    } else {
+      typeArgumentTypes = [];
+    }
+
+    var callReference = astFactory.implicitCallReference(
+      expression: expression,
+      staticElement: callMethod,
+      typeArguments: null,
+      typeArgumentTypes: typeArgumentTypes,
+    );
+    NodeReplacer.replace(expression, callReference, parent: parent);
+
+    callReference.staticType = callMethodType;
+  }
+
   /// Continues resolution of a [FunctionExpressionInvocation] that was created
   /// from a rewritten [MethodInvocation]. The target function is already
   /// resolved.
@@ -2702,6 +2677,34 @@
     }
   }
 
+  bool _shouldSkipImplicitCallReferenceDueToForm(
+      Expression expression, AstNode? parent) {
+    while (parent is ParenthesizedExpression) {
+      expression = parent;
+      parent = expression.parent;
+    }
+    if (parent is CascadeExpression && parent.target == expression) {
+      // Do not perform an "implicit tear-off conversion" here. It should only
+      // be performed on [parent]. See
+      // https://github.com/dart-lang/language/issues/1873.
+      return true;
+    }
+    if (parent is ConditionalExpression &&
+        (parent.thenExpression == expression ||
+            parent.elseExpression == expression)) {
+      // Do not perform an "implicit tear-off conversion" on the branches of a
+      // conditional expression.
+      return true;
+    }
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.QUESTION_QUESTION) {
+      // Do not perform an "implicit tear-off conversion" on the branches of a
+      // `??` operator.
+      return true;
+    }
+    return false;
+  }
+
   /// Given an [argumentList] and the [parameters] related to the element that
   /// will be invoked using those arguments, compute the list of parameters that
   /// correspond to the list of arguments.
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 78f3e39..9884045 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -5041,9 +5041,21 @@
   ILLEGAL_LANGUAGE_VERSION_OVERRIDE:
     problemMessage: The language version must be {0}.
     correctionMessage: Try removing the language version override and migrating the code.
-  ILLEGAL_NON_ABSTRACT_ENUM_INDEX:
-    problemMessage: A non-abstract instance member named 'index' can't be declared in a class that implements 'Enum'.
+  ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION:
+    sharedName: ILLEGAL_CONCRETE_ENUM_MEMBER
+    problemMessage: A concrete instance member named '{0}' can't be declared in a class that implements 'Enum'.
     correctionMessage: Try using a different name.
+    comment: |-
+      Parameters:
+      0: the name of member that cannot be declared
+  ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE:
+    sharedName: ILLEGAL_CONCRETE_ENUM_MEMBER
+    problemMessage: A concrete instance member named '{0}' can't be inherited from '{1}' in a class that implements 'Enum'.
+    correctionMessage: Try using a different name.
+    comment: |-
+      Parameters:
+      0: the name of member that cannot be inherited
+      1: the name of the class that declares the member
   ILLEGAL_SYNC_GENERATOR_RETURN_TYPE:
     problemMessage: "Functions marked 'sync*' must have a return type that is a supertype of 'Iterable<T>' for some type 'T'."
     correctionMessage: "Try fixing the return type of the function, or removing the modifier 'sync*' from the function body."
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
index 50d0ec5..77954c0 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -47,6 +47,38 @@
     );
   }
 
+  test_conditional_else() async {
+    await assertNoErrorsInCode('''
+abstract class A {}
+abstract class C extends A {
+  void call();
+}
+void Function() f(A a, bool b, C c, dynamic d) => b ? d : (b ? a : c);
+''');
+    // `c` is in the "else" position of a conditional expression, so implicit
+    // call tearoff logic should not apply to it.
+    var expr = findNode.conditionalExpression('b ? a : c');
+    expect(expr.thenExpression, TypeMatcher<SimpleIdentifier>());
+    // Therefore the type of `b ? a : c` should be `A`.
+    assertType(expr, 'A');
+  }
+
+  test_conditional_then() async {
+    await assertNoErrorsInCode('''
+abstract class A {}
+abstract class C extends A {
+  void call();
+}
+void Function() f(A a, bool b, C c, dynamic d) => b ? d : (b ? c : a);
+''');
+    // `c` is in the "then" position of a conditional expression, so implicit
+    // call tearoff logic should not apply to it.
+    var expr = findNode.conditionalExpression('b ? c : a');
+    expect(expr.thenExpression, TypeMatcher<SimpleIdentifier>());
+    // Therefore the type of `b ? c : a` should be `A`.
+    assertType(expr, 'A');
+  }
+
   test_explicitTypeArguments() async {
     await assertNoErrorsInCode('''
 class C {
@@ -66,7 +98,26 @@
     );
   }
 
-  test_ifNull() async {
+  test_ifNull_lhs() async {
+    await assertErrorsInCode('''
+abstract class A {}
+abstract class C extends A {
+  void call();
+}
+
+void Function() f(A a, bool b, C c, dynamic d) => b ? d : c ?? a;
+''', [
+      error(StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION, 130, 1),
+    ]);
+    // `c` is on the LHS of an if-null expression, so implicit call tearoff
+    // logic should not apply to it.
+    var expr = findNode.binary('c ?? a');
+    expect(expr.leftOperand, TypeMatcher<SimpleIdentifier>());
+    // Therefore the type of `c ?? a` should be `A`.
+    assertType(expr, 'A');
+  }
+
+  test_ifNull_rhs() async {
     await assertNoErrorsInCode('''
 abstract class C {
   void call(int t) => t;
@@ -163,6 +214,16 @@
     );
   }
 
+  test_parenthesized_cascade_target() async {
+    await assertNoErrorsInCode('''
+abstract class C {
+  void call();
+  void m();
+}
+void Function() f(C c) => (c)..m();
+''');
+  }
+
   test_prefixedIdentifier() async {
     await assertNoErrorsInCode('''
 abstract class C {
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index 6cb3570..3456bd6 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -28,10 +28,71 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('as void Function<T>(T);'),
-        null,
-        'void Function(int)');
+    assertResolvedNodeText(
+        findNode.functionReference('as void Function<T>(T);'), r'''
+FunctionReference
+  function: AsExpression
+    expression: ParenthesizedExpression
+      leftParenthesis: (
+      expression: AsExpression
+        expression: SimpleIdentifier
+          token: f
+          staticElement: f@43
+          staticType: void Function<T>(T)
+        asOperator: as
+        type: NamedType
+          name: SimpleIdentifier
+            token: dynamic
+            staticElement: dynamic@-1
+            staticType: null
+          type: dynamic
+        staticType: dynamic
+      rightParenthesis: )
+      staticType: dynamic
+    asOperator: as
+    type: GenericFunctionType
+      returnType: NamedType
+        name: SimpleIdentifier
+          token: void
+          staticElement: <null>
+          staticType: null
+        type: void
+      functionKeyword: Function
+      typeParameters: TypeParameterList
+        leftBracket: <
+        typeParameters
+          TypeParameter
+            name: SimpleIdentifier
+              token: T
+              staticElement: T@89
+              staticType: null
+            declaredElement: T@89
+        rightBracket: >
+      parameters: FormalParameterList
+        leftParenthesis: (
+        parameter: SimpleFormalParameter
+          type: NamedType
+            name: SimpleIdentifier
+              token: T
+              staticElement: T@89
+              staticType: null
+            type: T
+          declaredElement: @-1
+          declaredElementType: T
+        rightParenthesis: )
+      declaredElement: GenericFunctionTypeElement
+        parameters
+          <empty>
+            kind: required positional
+            type: T
+        returnType: void
+        type: void Function<T>(T)
+      type: void Function<T>(T)
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_assignmentExpression() async {
@@ -42,8 +103,28 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('g = f;'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('g = f;'), r'''
+FunctionReference
+  function: AssignmentExpression
+    leftHandSide: SimpleIdentifier
+      token: g
+      staticElement: <null>
+      staticType: null
+    operator: =
+    rightHandSide: SimpleIdentifier
+      token: f
+      staticElement: f@71
+      staticType: void Function<T>(T)
+    readElement: <null>
+    readType: null
+    writeElement: self::@setter::g
+    writeType: void Function<T>(T)
+    staticElement: <null>
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_assignmentExpression_compound() async {
@@ -59,8 +140,27 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('f += 1'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f += 1'), r'''
+FunctionReference
+  function: AssignmentExpression
+    leftHandSide: SimpleIdentifier
+      token: f
+      staticElement: f@144
+      staticType: null
+    operator: +=
+    rightHandSide: IntegerLiteral
+      literal: 1
+      staticType: int
+    readElement: f@144
+    readType: void Function<T>(T)
+    writeElement: f@144
+    writeType: void Function<T>(T)
+    staticElement: self::@extension::extension-0::@method::+
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_awaitExpression() async {
@@ -70,8 +170,19 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('await f'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('await f'), r'''
+FunctionReference
+  function: AwaitExpression
+    awaitKeyword: await
+    expression: SimpleIdentifier
+      token: f
+      staticElement: f@59
+      staticType: Future<void Function<T>(T)>
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_binaryExpression() async {
@@ -87,8 +198,24 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('c + 1'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('c + 1'), r'''
+FunctionReference
+  function: BinaryExpression
+    leftOperand: SimpleIdentifier
+      token: c
+      staticElement: c@108
+      staticType: C
+    operator: +
+    rightOperand: IntegerLiteral
+      literal: 1
+      staticType: int
+    staticElement: self::@class::C::@method::+
+    staticInvokeType: void Function<T>(T) Function(int)
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_cascadeExpression() async {
@@ -98,8 +225,16 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('f..toString()'), null,
-        'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f..toString()'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: f
+    staticElement: f@43
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_constructorReference() async {
@@ -128,8 +263,45 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('<T>(T a) {};'), null, 'Null Function(int)');
+    assertResolvedNodeText(findNode.functionReference('<T>(T a) {};'), r'''
+FunctionReference
+  function: FunctionExpression
+    typeParameters: TypeParameterList
+      leftBracket: <
+      typeParameters
+        TypeParameter
+          name: SimpleIdentifier
+            token: T
+            staticElement: T@37
+            staticType: null
+          declaredElement: T@37
+      rightBracket: >
+    parameters: FormalParameterList
+      leftParenthesis: (
+      parameter: SimpleFormalParameter
+        type: NamedType
+          name: SimpleIdentifier
+            token: T
+            staticElement: T@37
+            staticType: null
+          type: T
+        identifier: SimpleIdentifier
+          token: a
+          staticElement: a@42
+          staticType: null
+        declaredElement: a@42
+        declaredElementType: T
+      rightParenthesis: )
+    body: BlockFunctionBody
+      block: Block
+        leftBracket: {
+        rightBracket: }
+    declaredElement: @36
+    staticType: Null Function<T>(T)
+  staticType: Null Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_functionExpressionInvocation() async {
@@ -139,8 +311,27 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('(f)()'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('(f)()'), r'''
+FunctionReference
+  function: FunctionExpressionInvocation
+    function: ParenthesizedExpression
+      leftParenthesis: (
+      expression: SimpleIdentifier
+        token: f
+        staticElement: f@54
+        staticType: void Function<T>(T) Function()
+      rightParenthesis: )
+      staticType: void Function<T>(T) Function()
+    argumentList: ArgumentList
+      leftParenthesis: (
+      rightParenthesis: )
+    staticElement: <null>
+    staticInvokeType: void Function<T>(T) Function()
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_functionReference() async {
@@ -152,8 +343,16 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('f;'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: f
+    staticElement: f@61
+    staticType: void Function<U>(U)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_implicitCallReference() async {
@@ -178,8 +377,26 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('f[0];'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f[0];'), r'''
+FunctionReference
+  function: IndexExpression
+    target: SimpleIdentifier
+      token: f
+      staticElement: f@49
+      staticType: List<void Function<T>(T)>
+    leftBracket: [
+    index: IntegerLiteral
+      literal: 0
+      staticType: int
+    rightBracket: ]
+    staticElement: MethodMember
+      base: dart:core::@class::List::@method::[]
+      substitution: {E: void Function<T>(T)}
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_methodInvocation() async {
@@ -194,8 +411,27 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('c.m();'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('c.m();'), r'''
+FunctionReference
+  function: MethodInvocation
+    target: SimpleIdentifier
+      token: c
+      staticElement: c@100
+      staticType: C
+    operator: .
+    methodName: SimpleIdentifier
+      token: m
+      staticElement: self::@class::C::@method::m
+      staticType: void Function<T>(T) Function()
+    argumentList: ArgumentList
+      leftParenthesis: (
+      rightParenthesis: )
+    staticInvokeType: void Function<T>(T) Function()
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_postfixExpression_compound() async {
@@ -211,8 +447,24 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('f++'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f++'), r'''
+FunctionReference
+  function: PostfixExpression
+    operand: SimpleIdentifier
+      token: f
+      staticElement: f@144
+      staticType: null
+    operator: ++
+    readElement: f@144
+    readType: void Function<T>(T)
+    writeElement: f@144
+    writeType: void Function<T>(T)
+    staticElement: self::@extension::extension-0::@method::+
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_prefixedIdentifier() async {
@@ -226,8 +478,24 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('c.f;'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('c.f;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: c
+      staticElement: c@68
+      staticType: C
+    period: .
+    identifier: SimpleIdentifier
+      token: f
+      staticElement: self::@class::C::@getter::f
+      staticType: void Function<T>(T)
+    staticElement: self::@class::C::@getter::f
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_prefixExpression_compound() async {
@@ -243,8 +511,24 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('++f'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('++f'), r'''
+FunctionReference
+  function: PrefixExpression
+    operator: ++
+    operand: SimpleIdentifier
+      token: f
+      staticElement: f@144
+      staticType: null
+    readElement: f@144
+    readType: void Function<T>(T)
+    writeElement: f@144
+    writeType: void Function<T>(T)
+    staticElement: self::@extension::extension-0::@method::+
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_propertyAccess() async {
@@ -258,8 +542,27 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('(c).f;'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('(c).f;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: ParenthesizedExpression
+      leftParenthesis: (
+      expression: SimpleIdentifier
+        token: c
+        staticElement: c@68
+        staticType: C
+      rightParenthesis: )
+      staticType: C
+    operator: .
+    propertyName: SimpleIdentifier
+      token: f
+      staticElement: self::@class::C::@getter::f
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_simpleIdentifier() async {
@@ -269,8 +572,16 @@
 }
 ''');
 
-    assertFunctionReference(
-        findNode.functionReference('f;'), null, 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('f;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: f
+    staticElement: f@43
+    staticType: void Function<T>(T)
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 }
 
@@ -285,8 +596,41 @@
 var x = (A.foo)<int>;
 ''');
 
-    assertFunctionReference(findNode.functionReference('(A.foo)<int>;'),
-        findElement.constructor('foo'), 'A<int> Function()');
+    assertResolvedNodeText(findNode.functionReference('(A.foo)<int>;'), r'''
+FunctionReference
+  function: ParenthesizedExpression
+    leftParenthesis: (
+    expression: ConstructorReference
+      constructorName: ConstructorName
+        type: NamedType
+          name: SimpleIdentifier
+            token: A
+            staticElement: self::@class::A
+            staticType: null
+          type: null
+        period: .
+        name: SimpleIdentifier
+          token: foo
+          staticElement: self::@class::A::@constructor::foo
+          staticType: null
+        staticElement: self::@class::A::@constructor::foo
+      staticType: A<T> Function<T>()
+    rightParenthesis: )
+    staticType: A<T> Function<T>()
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: A<int> Function()
+  typeArgumentTypes
+    int
+''');
   }
 
   test_constructorFunction_unnamed() async {
@@ -298,8 +642,41 @@
 var x = (A.new)<int>;
 ''');
 
-    assertFunctionReference(findNode.functionReference('(A.new)<int>;'),
-        findElement.unnamedConstructor('A'), 'A<int> Function()');
+    assertResolvedNodeText(findNode.functionReference('(A.new)<int>;'), r'''
+FunctionReference
+  function: ParenthesizedExpression
+    leftParenthesis: (
+    expression: ConstructorReference
+      constructorName: ConstructorName
+        type: NamedType
+          name: SimpleIdentifier
+            token: A
+            staticElement: self::@class::A
+            staticType: null
+          type: null
+        period: .
+        name: SimpleIdentifier
+          token: new
+          staticElement: self::@class::A::@constructor::•
+          staticType: null
+        staticElement: self::@class::A::@constructor::•
+      staticType: A<T> Function<T>()
+    rightParenthesis: )
+    staticType: A<T> Function<T>()
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: A<int> Function()
+  typeArgumentTypes
+    int
+''');
   }
 
   test_constructorReference() async {
@@ -315,8 +692,35 @@
           messageContains: ["'A.foo'"]),
     ]);
 
-    assertFunctionReference(findNode.functionReference('A.foo<int>;'),
-        findElement.constructor('foo'), 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('A.foo<int>;'), r'''
+FunctionReference
+  function: ConstructorReference
+    constructorName: ConstructorName
+      type: NamedType
+        name: SimpleIdentifier
+          token: A
+          staticElement: self::@class::A
+          staticType: null
+        type: null
+      period: .
+      name: SimpleIdentifier
+        token: foo
+        staticElement: self::@class::A::@constructor::foo
+        staticType: null
+      staticElement: self::@class::A::@constructor::foo
+    staticType: A<T> Function<T>()
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_constructorReference_prefixed() async {
@@ -328,14 +732,44 @@
           5,
           messageContains: ["'a.Future.delayed'"]),
     ]);
-    assertFunctionReference(
-        findNode.functionReference('a.Future.delayed<int>;'),
-        findElement
-            .import('dart:async')
-            .importedLibrary!
-            .getType('Future')!
-            .getNamedConstructor('delayed'),
-        'dynamic');
+    assertResolvedNodeText(
+        findNode.functionReference('a.Future.delayed<int>;'), r'''
+FunctionReference
+  function: ConstructorReference
+    constructorName: ConstructorName
+      type: NamedType
+        name: PrefixedIdentifier
+          prefix: SimpleIdentifier
+            token: a
+            staticElement: self::@prefix::a
+            staticType: null
+          period: .
+          identifier: SimpleIdentifier
+            token: Future
+            staticElement: dart:async::@class::Future
+            staticType: null
+          staticElement: dart:async::@class::Future
+          staticType: null
+        type: null
+      period: .
+      name: SimpleIdentifier
+        token: delayed
+        staticElement: dart:async::@class::Future::@constructor::delayed
+        staticType: null
+      staticElement: dart:async::@class::Future::@constructor::delayed
+    staticType: Future<T> Function<T>(Duration, [FutureOr<T> Function()?])
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_dynamicTyped() async {
@@ -350,8 +784,24 @@
           CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION, 31, 1),
     ]);
 
-    assertFunctionReference(findNode.functionReference('i<int>;'),
-        findElement.topGet('i'), 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('i<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: i
+    staticElement: self::@getter::i
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_dynamicTyped_targetOfMethodCall() async {
@@ -366,8 +816,24 @@
           CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION, 31, 1),
     ]);
 
-    assertFunctionReference(findNode.functionReference('i<int>.foo();'),
-        findElement.topGet('i'), 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('i<int>.foo();'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: i
+    staticElement: self::@getter::i
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_explicitReceiver_dynamicTyped() async {
@@ -382,10 +848,38 @@
           29, 23),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('f().instanceMethod<int>;'),
-        null,
-        'dynamic');
+    assertResolvedNodeText(
+        findNode.functionReference('f().instanceMethod<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: MethodInvocation
+      methodName: SimpleIdentifier
+        token: f
+        staticElement: self::@function::f
+        staticType: dynamic Function()
+      argumentList: ArgumentList
+        leftParenthesis: (
+        rightParenthesis: )
+      staticInvokeType: dynamic Function()
+      staticType: dynamic
+    operator: .
+    propertyName: SimpleIdentifier
+      token: instanceMethod
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_explicitReceiver_unknown() async {
@@ -397,8 +891,32 @@
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 10, 1),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: <null>
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_explicitReceiver_unknown_multipleProperties() async {
@@ -414,8 +932,39 @@
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 10, 1),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: a
+        staticElement: <null>
+        staticType: dynamic
+      period: .
+      identifier: SimpleIdentifier
+        token: b
+        staticElement: <null>
+        staticType: dynamic
+      staticElement: <null>
+      staticType: dynamic
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_extension() async {
@@ -431,11 +980,24 @@
     ]);
 
     var reference = findNode.functionReference('E<int>;');
-    assertFunctionReference(
-      reference,
-      findElement.extension_('E'),
-      'dynamic',
-    );
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: E
+    staticElement: self::@extension::E
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_extension_prefixed() async {
@@ -455,11 +1017,32 @@
 
     assertImportPrefix(findNode.simple('a.E'), findElement.prefix('a'));
     var reference = findNode.functionReference('E<int>;');
-    assertFunctionReference(
-      reference,
-      findElement.importFind('package:test/a.dart').extension_('E'),
-      'dynamic',
-    );
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@prefix::a
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: E
+      staticElement: package:test/a.dart::@extension::E
+      staticType: dynamic
+    staticElement: package:test/a.dart::@extension::E
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_extensionGetter_extensionOverride() async {
@@ -478,8 +1061,42 @@
           CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION, 67, 8),
     ]);
 
-    assertFunctionReference(findNode.functionReference('foo<int>;'),
-        findElement.getter('foo'), 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: ExtensionOverride
+      extensionName: SimpleIdentifier
+        token: E
+        staticElement: self::@extension::E
+        staticType: null
+      argumentList: ArgumentList
+        leftParenthesis: (
+        arguments
+          SimpleIdentifier
+            token: a
+            staticElement: a@60
+            staticType: A
+        rightParenthesis: )
+      extendedType: A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@extension::E::@getter::foo
+      staticType: int
+    staticType: int
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_extensionMethod() async {
@@ -496,8 +1113,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@extension::E::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_explicitReceiver_this() async {
@@ -514,8 +1149,32 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: ThisExpression
+      thisKeyword: this
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@extension::E::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_extensionOverride() async {
@@ -534,8 +1193,44 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: ExtensionOverride
+      extensionName: SimpleIdentifier
+        token: E
+        staticElement: self::@extension::E
+        staticType: null
+      argumentList: ArgumentList
+        leftParenthesis: (
+        arguments
+          SimpleIdentifier
+            token: a
+            staticElement: a@78
+            staticType: A
+        rightParenthesis: )
+      extendedType: A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@extension::E::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_extensionOverride_cascade() async {
@@ -556,8 +1251,29 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    operator: ..
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@extension::E::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_extensionOverride_static() async {
@@ -577,8 +1293,44 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: ExtensionOverride
+      extensionName: SimpleIdentifier
+        token: E
+        staticElement: self::@extension::E
+        staticType: null
+      argumentList: ArgumentList
+        leftParenthesis: (
+        arguments
+          SimpleIdentifier
+            token: a
+            staticElement: a@69
+            staticType: A
+        rightParenthesis: )
+      extendedType: A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@extension::E::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_extensionOverride_unknown() async {
@@ -594,8 +1346,42 @@
       error(CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER, 51, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: ExtensionOverride
+      extensionName: SimpleIdentifier
+        token: E
+        staticElement: self::@extension::E
+        staticType: null
+      argumentList: ArgumentList
+        leftParenthesis: (
+        arguments
+          SimpleIdentifier
+            token: a
+            staticElement: a@39
+            staticType: A
+        rightParenthesis: )
+      extendedType: A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_extensionMethod_fromClassDeclaration() async {
@@ -612,8 +1398,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@extension::E::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_extensionMethod_unknown() async {
@@ -629,8 +1433,24 @@
           messageContains: ["for the type 'double'"]),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_function_call() async {
@@ -642,8 +1462,34 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo.call<int>;'), null,
-        'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo.call<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function<T>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: null
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_function_call_tooFewTypeArgs() async {
@@ -658,8 +1504,35 @@
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION, 52, 5),
     ]);
 
-    assertFunctionReference(findNode.functionReference('foo.call<int>;'), null,
-        'void Function(dynamic, dynamic)');
+    assertResolvedNodeText(findNode.functionReference('foo.call<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function<T, U>(T, U)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: null
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(dynamic, dynamic)
+  typeArgumentTypes
+    dynamic
+    dynamic
+''');
   }
 
   test_function_call_tooManyTypeArgs() async {
@@ -674,8 +1547,32 @@
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION, 46, 5),
     ]);
 
-    assertFunctionReference(findNode.functionReference('foo.call<int>;'), null,
-        'void Function(String)');
+    assertResolvedNodeText(findNode.functionReference('foo.call<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function(String)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: null
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(String)
+''');
   }
 
   test_function_call_typeArgNotMatchingBound() async {
@@ -687,8 +1584,34 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo.call<String>;'),
-        null, 'void Function(String)');
+    assertResolvedNodeText(findNode.functionReference('foo.call<String>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function<T extends num>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: null
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: String
+          staticElement: dart:core::@class::String
+          staticType: null
+        type: String
+    rightBracket: >
+  staticType: void Function(String)
+  typeArgumentTypes
+    String
+''');
   }
 
   test_function_extensionOnFunction() async {
@@ -706,8 +1629,34 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo.m<int>;'),
-        findElement.method('m'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo.m<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function<T>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: m
+      staticElement: self::@extension::extension-0::@method::m
+      staticType: null
+    staticElement: self::@extension::extension-0::@method::m
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_function_extensionOnFunction_static() async {
@@ -729,8 +1678,34 @@
           1),
     ]);
 
-    assertFunctionReference(findNode.functionReference('foo.m<int>;'),
-        findElement.method('m'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo.m<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@function::foo
+      staticType: void Function<T>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: m
+      staticElement: self::@extension::extension-0::@method::m
+      staticType: null
+    staticElement: self::@extension::extension-0::@method::m
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_implicitCallTearoff() async {
@@ -836,8 +1811,34 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo<int>;'),
-        findElement.getter('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: a@51
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@getter::foo
+      staticType: null
+    staticElement: self::@class::A::@getter::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceGetter_functionTyped() async {
@@ -852,8 +1853,26 @@
 
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo<int>;'),
-        findElement.getter('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@getter::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceGetter_functionTyped_inherited() async {
@@ -869,8 +1888,26 @@
 
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo<int>;'),
-        findElement.getter('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@getter::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod() async {
@@ -885,8 +1922,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_call() async {
@@ -904,7 +1959,34 @@
     // TODO(srawlins): PropertyElementResolver does not return an element for
     // `.call`. If we want `findElement.method('foo')` here, we must change the
     // policy over there.
-    assertFunctionReference(reference, null, 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::C::@method::foo
+      staticType: void Function<T>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_call() async {
@@ -922,7 +2004,41 @@
     // TODO(srawlins): PropertyElementResolver does not return an element for
     // `.call`. If we want `findElement.method('foo')` here, we must change the
     // policy over there.
-    assertFunctionReference(reference, null, 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: c
+        staticElement: c@46
+        staticType: C
+      period: .
+      identifier: SimpleIdentifier
+        token: foo
+        staticElement: self::@class::C::@method::foo
+        staticType: void Function<T>(T)
+      staticElement: self::@class::C::@method::foo
+      staticType: void Function<T>(T)
+    operator: .
+    propertyName: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_field() async {
@@ -941,8 +2057,34 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@class::B::@getter::a
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_getter_wrongNumberOfTypeArguments() async {
@@ -958,7 +2100,35 @@
 ''');
 
     var reference = findNode.functionReference('foo<double>');
-    assertFunctionReference(reference, null, 'dynamic');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: ParenthesizedExpression
+      leftParenthesis: (
+      expression: SimpleIdentifier
+        token: a
+        staticElement: a@42
+        staticType: A
+      rightParenthesis: )
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@getter::foo
+      staticType: int
+    staticType: int
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: double
+          staticElement: dart:core::@class::double
+          staticType: null
+        type: double
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_instanceMethod_explicitReceiver_otherExpression() async {
@@ -972,8 +2142,47 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('(a ?? b).foo<int>;'),
-        findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(
+        findNode.functionReference('(a ?? b).foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: ParenthesizedExpression
+      leftParenthesis: (
+      expression: BinaryExpression
+        leftOperand: SimpleIdentifier
+          token: a
+          staticElement: a@45
+          staticType: A?
+        operator: ??
+        rightOperand: SimpleIdentifier
+          token: b
+          staticElement: b@50
+          staticType: A
+        staticElement: <null>
+        staticInvokeType: null
+        staticType: A
+      rightParenthesis: )
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_receiverIsNotIdentifier_call() async {
@@ -989,7 +2198,40 @@
     // TODO(srawlins): PropertyElementResolver does not return an element for
     // `.call`. If we want `findElement.method('foo')` here, we must change the
     // policy over there.
-    assertFunctionReference(reference, null, 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PropertyAccess
+      target: ListLiteral
+        leftBracket: [
+        rightBracket: ]
+        staticType: List<dynamic>
+      operator: .
+      propertyName: SimpleIdentifier
+        token: foo
+        staticElement: self::@extension::extension-0::@method::foo
+        staticType: void Function<T>(T)
+      staticType: void Function<T>(T)
+    operator: .
+    propertyName: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_super() async {
@@ -1005,8 +2247,32 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: SuperExpression
+      superKeyword: super
+      staticType: B
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_super_noMethod() async {
@@ -1022,8 +2288,30 @@
       error(CompileTimeErrorCode.UNDEFINED_SUPER_GETTER, 30, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: SuperExpression
+      superKeyword: super
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_instanceMethod_explicitReceiver_super_noSuper() async {
@@ -1037,8 +2325,30 @@
       error(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, 10, 5),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: SuperExpression
+      superKeyword: super
+      staticType: dynamic
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_instanceMethod_explicitReceiver_targetOfFunctionCall() async {
@@ -1056,8 +2366,34 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: a@81
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_this() async {
@@ -1072,8 +2408,32 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: ThisExpression
+      thisKeyword: this
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_topLevelVariable() async {
@@ -1090,8 +2450,34 @@
 
     assertIdentifierTopGetRef(findNode.simple('a.'), 'a');
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@getter::a
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_topLevelVariable_prefix() async {
@@ -1112,10 +2498,41 @@
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference,
-        findElement.importFind('package:test/a.dart').method('foo'),
-        'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: prefix
+        staticElement: self::@prefix::prefix
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: a
+        staticElement: package:test/a.dart::@getter::a
+        staticType: A
+      staticElement: package:test/a.dart::@getter::a
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_topLevelVariable_prefix_unknown() async {
@@ -1135,8 +2552,39 @@
 
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: prefix
+        staticElement: self::@prefix::prefix
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: a
+        staticElement: package:test/a.dart::@getter::a
+        staticType: A
+      staticElement: package:test/a.dart::@getter::a
+      staticType: A
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_instanceMethod_explicitReceiver_typeParameter() async {
@@ -1148,8 +2596,32 @@
       error(CompileTimeErrorCode.UNDEFINED_GETTER, 15, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: T
+      staticElement: T@4
+      staticType: Type
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_instanceMethod_explicitReceiver_variable() async {
@@ -1164,8 +2636,34 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: a@41
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_explicitReceiver_variable_cascade() async {
@@ -1180,8 +2678,29 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    operator: ..
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_inherited() async {
@@ -1198,8 +2717,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_targetOfFunctionCall() async {
@@ -1217,8 +2754,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_instanceMethod_unknown() async {
@@ -1233,8 +2788,24 @@
           messageContains: ["for the type 'A'"]),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_localFunction() async {
@@ -1247,8 +2818,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.localFunction('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@20
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_localVariable() async {
@@ -1259,8 +2848,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.parameter('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@31
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_localVariable_call() async {
@@ -1277,7 +2884,34 @@
     // TODO(srawlins): PropertyElementResolver does not return an element for
     // `.call`. If we want `findElement.method('foo')` here, we must change the
     // policy over there.
-    assertFunctionReference(reference, null, 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: fn
+      staticElement: fn@40
+      staticType: void Function<T>(T)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_localVariable_call_tooManyTypeArgs() async {
@@ -1297,7 +2931,32 @@
     // TODO(srawlins): PropertyElementResolver does not return an element for
     // `.call`. If we want `findElement.method('fn')` here, we must change the
     // policy over there.
-    assertFunctionReference(reference, null, 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: fn
+      staticElement: fn@55
+      staticType: void Function(int)
+    period: .
+    identifier: SimpleIdentifier
+      token: call
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: void Function(int)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+''');
   }
 
   test_localVariable_typeVariable_boundToFunction() async {
@@ -1311,7 +2970,24 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(reference, findElement.parameter('foo'), 'dynamic');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@31
+    staticType: T
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_localVariable_typeVariable_functionTyped() async {
@@ -1322,8 +2998,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.parameter('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@42
+    staticType: T
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_localVariable_typeVariable_nonFunction() async {
@@ -1337,7 +3031,24 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(reference, findElement.parameter('foo'), 'dynamic');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@14
+    staticType: T
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_neverTyped() async {
@@ -1352,8 +3063,24 @@
           CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION, 38, 1),
     ]);
 
-    assertFunctionReference(findNode.functionReference('i<int>;'),
-        findElement.topGet('i'), 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('i<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: i
+    staticElement: self::@getter::i
+    staticType: Never
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_nonGenericFunction() async {
@@ -1371,8 +3098,24 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function()');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function()
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function()
+''');
   }
 
   test_otherExpression() async {
@@ -1416,8 +3159,32 @@
           19, 5),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('a.foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('a.foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: a@12
+      staticType: dynamic
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: null
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_staticMethod() async {
@@ -1432,8 +3199,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_staticMethod_explicitReceiver() async {
@@ -1448,8 +3233,34 @@
 ''');
 
     assertClassRef(findNode.simple('A.'), findElement.class_('A'));
-    assertFunctionReference(findNode.functionReference('foo<int>;'),
-        findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: A
+      staticElement: self::@class::A
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_staticMethod_explicitReceiver_importPrefix() async {
@@ -1470,10 +3281,41 @@
     assertClassRef(findNode.simple('A.'),
         findElement.importFind('package:test/a.dart').class_('A'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference,
-        findElement.importFind('package:test/a.dart').method('foo'),
-        'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: a
+        staticElement: self::@prefix::a
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: A
+        staticElement: package:test/a.dart::@class::A
+        staticType: null
+      staticElement: package:test/a.dart::@class::A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_staticMethod_explicitReceiver_prefix_typeAlias() async {
@@ -1494,10 +3336,41 @@
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference,
-        findElement.importFind('package:test/a.dart').method('foo'),
-        'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: prefix
+        staticElement: self::@prefix::prefix
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: TA
+        staticElement: package:test/a.dart::@typeAlias::TA
+        staticType: Type
+      staticElement: package:test/a.dart::@typeAlias::TA
+      staticType: Type
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_staticMethod_explicitReceiver_typeAlias() async {
@@ -1514,8 +3387,34 @@
 
     assertTypeAliasRef(findNode.simple('TA.'), findElement.typeAlias('TA'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: TA
+      staticElement: self::@typeAlias::TA
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: self::@class::A::@method::foo
+      staticType: null
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_staticMethod_explicitReciver_prefix() async {
@@ -1535,10 +3434,41 @@
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference,
-        findElement.importFind('package:test/a.dart').method('foo'),
-        'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: prefix
+        staticElement: self::@prefix::prefix
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: A
+        staticElement: package:test/a.dart::@class::A
+        staticType: null
+      staticElement: package:test/a.dart::@class::A
+      staticType: null
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@class::A::@method::foo
+      staticType: void Function<T>(T)
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_tooFewTypeArguments() async {
@@ -1556,8 +3486,27 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(reference, findElement.method('foo'),
-        'void Function(dynamic, dynamic)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T, U>(T, U)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(dynamic, dynamic)
+  typeArgumentTypes
+    dynamic
+    dynamic
+''');
   }
 
   test_tooManyTypeArguments() async {
@@ -1575,8 +3524,32 @@
     ]);
 
     var reference = findNode.functionReference('foo<int, int>;');
-    assertFunctionReference(
-        reference, findElement.method('foo'), 'void Function(dynamic)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@class::A::@method::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(dynamic)
+  typeArgumentTypes
+    dynamic
+''');
   }
 
   test_topLevelFunction() async {
@@ -1589,8 +3562,26 @@
 ''');
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.topFunction('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@function::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_topLevelFunction_importPrefix() async {
@@ -1607,11 +3598,34 @@
 
     assertImportPrefix(findNode.simple('a.f'), findElement.prefix('a'));
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-      reference,
-      findElement.importFind('package:test/a.dart').topFunction('foo'),
-      'void Function(int)',
-    );
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@prefix::a
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@function::foo
+      staticType: void Function<T>(T)
+    staticElement: package:test/a.dart::@function::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_topLevelFunction_importPrefix_asTargetOfFunctionCall() async {
@@ -1631,11 +3645,34 @@
 
     assertImportPrefix(findNode.simple('a.f'), findElement.prefix('a'));
     var reference = findNode.functionReference('foo<int>');
-    assertFunctionReference(
-      reference,
-      findElement.importFind('package:test/a.dart').topFunction('foo'),
-      'void Function(int)',
-    );
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@prefix::a
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@function::foo
+      staticType: void Function<T>(T)
+    staticElement: package:test/a.dart::@function::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_topLevelFunction_prefix_unknownPrefix() async {
@@ -1647,8 +3684,32 @@
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 10, 6),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: prefix
+      staticElement: <null>
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_topLevelFunction_targetOfCall() async {
@@ -1660,8 +3721,26 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo<int>.call;'),
-        findElement.topFunction('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>.call;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@function::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
     assertSimpleIdentifier(findNode.simple('call;'),
         element: null, type: 'void Function(int)');
   }
@@ -1678,8 +3757,26 @@
 }
 ''');
 
-    assertFunctionReference(findNode.functionReference('foo<int>'),
-        findElement.topFunction('foo'), 'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: self::@function::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_topLevelVariable_prefix() async {
@@ -1696,10 +3793,34 @@
 
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'),
-        findElement.importFind('package:test/a.dart').topGet('foo'),
-        'void Function(int)');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: prefix
+      staticElement: self::@prefix::prefix
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: package:test/a.dart::@getter::foo
+      staticType: void Function<T>(T)
+    staticElement: package:test/a.dart::@getter::foo
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 
   test_topLevelVariable_prefix_unknownIdentifier() async {
@@ -1718,8 +3839,39 @@
 
     assertImportPrefix(
         findNode.simple('prefix.'), findElement.prefix('prefix'));
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PropertyAccess
+    target: PrefixedIdentifier
+      prefix: SimpleIdentifier
+        token: prefix
+        staticElement: self::@prefix::prefix
+        staticType: null
+      period: .
+      identifier: SimpleIdentifier
+        token: a
+        staticElement: <null>
+        staticType: dynamic
+      staticElement: <null>
+      staticType: dynamic
+    operator: .
+    propertyName: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_typeAlias_function_unknownProperty() async {
@@ -1731,8 +3883,32 @@
       error(CompileTimeErrorCode.UNDEFINED_GETTER, 42, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: Cb
+      staticElement: self::@typeAlias::Cb
+      staticType: Type
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_typeAlias_typeVariable_unknownProperty() async {
@@ -1744,8 +3920,32 @@
       error(CompileTimeErrorCode.UNDEFINED_GETTER, 29, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: T
+      staticElement: self::@typeAlias::T
+      staticType: Type
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_unknownIdentifier() async {
@@ -1757,8 +3957,24 @@
       error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 15, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_unknownIdentifier_explicitReceiver() async {
@@ -1774,8 +3990,32 @@
       error(CompileTimeErrorCode.UNDEFINED_GETTER, 41, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: a@30
+      staticType: A
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: dynamic
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 
   test_unknownIdentifier_importPrefix() async {
@@ -1790,8 +4030,32 @@
       error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 40, 3),
     ]);
 
-    assertFunctionReference(
-        findNode.functionReference('foo<int>;'), null, 'dynamic');
+    assertResolvedNodeText(findNode.functionReference('foo<int>;'), r'''
+FunctionReference
+  function: PrefixedIdentifier
+    prefix: SimpleIdentifier
+      token: a
+      staticElement: self::@prefix::a
+      staticType: null
+    period: .
+    identifier: SimpleIdentifier
+      token: foo
+      staticElement: <null>
+      staticType: null
+    staticElement: <null>
+    staticType: dynamic
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: dynamic
+''');
   }
 }
 
@@ -1811,7 +4075,25 @@
     ]);
 
     var reference = findNode.functionReference('foo<int>;');
-    assertFunctionReference(
-        reference, findElement.parameter('foo'), 'void Function(int)');
+    assertResolvedNodeText(reference, r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: foo
+    staticElement: foo@31
+    staticType: void Function<T>(T)
+  typeArguments: TypeArgumentList
+    leftBracket: <
+    arguments
+      NamedType
+        name: SimpleIdentifier
+          token: int
+          staticElement: dart:core::@class::int
+          staticType: null
+        type: int
+    rightBracket: >
+  staticType: void Function(int)
+  typeArgumentTypes
+    int
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 614adf29..77f3669 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -391,14 +391,6 @@
     assertType(node, type);
   }
 
-  void assertFunctionReference(
-      FunctionReference node, Element? expectedElement, String expectedType) {
-    if (expectedElement != null) {
-      assertElement(node, expectedElement);
-    }
-    assertType(node, expectedType);
-  }
-
   void assertHasTestErrors() {
     expect(result.errors, isNotEmpty);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_declaration_test.dart
new file mode 100644
index 0000000..c829d5a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_declaration_test.dart
@@ -0,0 +1,218 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationClassTest);
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationEnumTest);
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationMixinTest);
+  });
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationClassTest
+    extends PubPackageResolutionTest {
+  test_hashCode_field() async {
+    await assertErrorsInCode(r'''
+abstract class A implements Enum {
+  int hashCode = 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 41, 8),
+    ]);
+  }
+
+  test_hashCode_getter() async {
+    await assertErrorsInCode(r'''
+abstract class A implements Enum {
+  int get hashCode => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 45, 8),
+    ]);
+  }
+
+  test_hashCode_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+abstract class A implements Enum {
+  int get hashCode;
+}
+''');
+  }
+
+  test_hashCode_setter() async {
+    await assertNoErrorsInCode(r'''
+abstract class A implements Enum {
+  set hashCode(int _) {}
+}
+''');
+  }
+
+  test_index_field() async {
+    await assertErrorsInCode(r'''
+abstract class A implements Enum {
+  int index = 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 41, 5),
+    ]);
+  }
+
+  test_index_getter() async {
+    await assertErrorsInCode(r'''
+abstract class A implements Enum {
+  int get index => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 45, 5),
+    ]);
+  }
+
+  test_index_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+abstract class A implements Enum {
+  int get index;
+}
+''');
+  }
+
+  test_index_setter() async {
+    await assertNoErrorsInCode(r'''
+abstract class A implements Enum {
+  set index(int _) {}
+}
+''');
+  }
+
+  test_operatorEqEq() async {
+    await assertErrorsInCode(r'''
+abstract class A implements Enum {
+  bool operator ==(Object other) => false;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 51, 2),
+    ]);
+  }
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationEnumTest
+    extends PubPackageResolutionTest {
+  test_index_field() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v;
+  final int index = 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 26, 5),
+    ]);
+  }
+
+  test_index_getter() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v;
+  int get index => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 24, 5),
+    ]);
+  }
+
+  test_index_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+enum E {
+  v;
+  int get index;
+}
+''');
+  }
+
+  test_index_setter() async {
+    await assertNoErrorsInCode(r'''
+enum E {
+  v;
+  set index(int _) {}
+}
+''');
+  }
+
+  test_operatorEqEq() async {
+    await assertErrorsInCode(r'''
+enum E {
+  v;
+  bool operator ==(Object other) => false;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 30, 2),
+    ]);
+  }
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationMixinTest
+    extends PubPackageResolutionTest {
+  test_index_field() async {
+    await assertErrorsInCode(r'''
+mixin M on Enum {
+  int index = 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 24, 5),
+    ]);
+  }
+
+  test_index_getter() async {
+    await assertErrorsInCode(r'''
+mixin M on Enum {
+  int get index => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 28, 5),
+    ]);
+  }
+
+  test_index_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+mixin M on Enum {
+  int get index;
+}
+''');
+  }
+
+  test_index_setter() async {
+    await assertNoErrorsInCode(r'''
+mixin M on Enum {
+  set index(int _) {}
+}
+''');
+  }
+
+  test_operatorEqEq() async {
+    await assertErrorsInCode(r'''
+mixin M on Enum {
+  bool operator ==(Object other) => false;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION, 34, 2),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_inheritance_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_inheritance_test.dart
new file mode 100644
index 0000000..ecfecef
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/illegal_concrete_enum_member_inheritance_test.dart
@@ -0,0 +1,239 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationClassTest);
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationEnumTest);
+    defineReflectiveTests(IllegalConcreteEnumMemberDeclarationMixinTest);
+  });
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationClassTest
+    extends PubPackageResolutionTest {
+  test_hashCode_field_fromExtends() async {
+    await assertErrorsInCode(r'''
+class A {
+  int hashCode = 0;
+}
+
+abstract class B extends A implements Enum {}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 48, 1),
+    ]);
+  }
+
+  test_hashCode_field_fromImplements() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int hashCode = 0;
+}
+
+abstract class B implements A, Enum {}
+''');
+  }
+
+  test_hashCode_field_fromWith() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  int hashCode = 0;
+}
+
+abstract class B with M implements Enum {}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 48, 1),
+    ]);
+  }
+
+  test_hashCode_getter() async {
+    await assertErrorsInCode(r'''
+class A {
+  int get hashCode => 0;
+}
+
+abstract class B extends A implements Enum {}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 53, 1),
+    ]);
+  }
+
+  test_hashCode_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+mixin M {
+  int get hashCode;
+}
+
+abstract class B with M implements Enum {}
+''');
+  }
+
+  test_hashCode_setter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  set hashCode(int _) {}
+}
+
+abstract class B extends A implements Enum {}
+''');
+  }
+
+  test_operatorEqEq_fromExtends() async {
+    await assertErrorsInCode(r'''
+class A {
+  bool operator ==(Object other) => false;
+}
+
+abstract class B extends A implements Enum {}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 71, 1),
+    ]);
+  }
+
+  test_operatorEqEq_fromImplements() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bool operator ==(Object other) => false;
+}
+
+abstract class B implements A, Enum {}
+''');
+  }
+
+  test_operatorEqEq_fromWith() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  bool operator ==(Object other) => false;
+}
+
+abstract class B with M implements Enum {}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 71, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationEnumTest
+    extends PubPackageResolutionTest {
+  test_hashCode_getter_fromImplements() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get hashCode => 0;
+}
+
+enum E implements A {
+  v;
+}
+''');
+  }
+
+  test_hashCode_getter_fromWith() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  int get hashCode => 0;
+}
+
+enum E with M {
+  v;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 43, 1),
+    ]);
+  }
+
+  test_hashCode_setter_fromWith() async {
+    await assertNoErrorsInCode(r'''
+mixin M {
+  set hashCode(int _) {}
+}
+
+enum E with M {
+  v;
+}
+''');
+  }
+
+  test_operatorEqEq_fromImplements() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bool operator ==(Object other) => false;
+}
+
+enum E implements A {
+  v;
+}
+''');
+  }
+
+  test_operatorEqEq_fromWith() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  bool operator ==(Object other) => false;
+}
+
+enum E with M {
+  v;
+}
+''', [
+      error(
+          CompileTimeErrorCode.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE, 61, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class IllegalConcreteEnumMemberDeclarationMixinTest
+    extends PubPackageResolutionTest {
+  test_hashCode_getter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get hashCode => 0;
+}
+
+mixin M on A implements Enum {}
+''');
+  }
+
+  test_hashCode_getter_abstract() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  int get hashCode;
+}
+
+mixin M on A implements Enum {}
+''');
+  }
+
+  test_hashCode_setter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  set hashCode(int _) {}
+}
+
+mixin M on A implements Enum {}
+''');
+  }
+
+  test_operatorEqEq() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bool operator ==(Object other) => false;
+}
+
+mixin M on A implements Enum {}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_non_abstract_enum_index_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_non_abstract_enum_index_test.dart
deleted file mode 100644
index a2b7413..0000000
--- a/pkg/analyzer/test/src/diagnostics/illegal_non_abstract_enum_index_test.dart
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(IllegalNonAbstractEnumIndexTest);
-  });
-}
-
-@reflectiveTest
-class IllegalNonAbstractEnumIndexTest extends PubPackageResolutionTest {
-  test_class_field() async {
-    await assertErrorsInCode(r'''
-abstract class A implements Enum {
-  int index = 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 41, 5),
-    ]);
-  }
-
-  test_class_getter() async {
-    await assertErrorsInCode(r'''
-abstract class A implements Enum {
-  int get index => 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 45, 5),
-    ]);
-  }
-
-  test_class_getter_abstract() async {
-    await assertNoErrorsInCode(r'''
-abstract class A implements Enum {
-  int get index;
-}
-''');
-  }
-
-  test_class_setter() async {
-    await assertNoErrorsInCode(r'''
-abstract class A implements Enum {
-  set index(int _) {}
-}
-''');
-  }
-
-  test_enum_field() async {
-    await assertErrorsInCode(r'''
-enum E {
-  v;
-  final int index = 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 26, 5),
-    ]);
-  }
-
-  test_enum_getter() async {
-    await assertErrorsInCode(r'''
-enum E {
-  v;
-  int get index => 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 24, 5),
-    ]);
-  }
-
-  test_enum_getter_abstract() async {
-    await assertNoErrorsInCode(r'''
-enum E {
-  v;
-  int get index;
-}
-''');
-  }
-
-  test_enum_setter() async {
-    await assertNoErrorsInCode(r'''
-enum E {
-  v;
-  set index(int _) {}
-}
-''');
-  }
-
-  test_mixin_field() async {
-    await assertErrorsInCode(r'''
-mixin M on Enum {
-  int index = 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 24, 5),
-    ]);
-  }
-
-  test_mixin_getter() async {
-    await assertErrorsInCode(r'''
-mixin M on Enum {
-  int get index => 0;
-}
-''', [
-      error(CompileTimeErrorCode.ILLEGAL_NON_ABSTRACT_ENUM_INDEX, 28, 5),
-    ]);
-  }
-
-  test_mixin_getter_abstract() async {
-    await assertNoErrorsInCode(r'''
-mixin M on Enum {
-  int get index;
-}
-''');
-  }
-
-  test_mixin_setter() async {
-    await assertNoErrorsInCode(r'''
-mixin M on Enum {
-  set index(int _) {}
-}
-''');
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 6144c42..babc082 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -383,11 +383,16 @@
 }
 ''');
 
-    assertFunctionReference(
-      findNode.functionReference('f;'),
-      findElement.parameter('f'),
-      'int Function()',
-    );
+    assertResolvedNodeText(findNode.functionReference('f;'), r'''
+FunctionReference
+  function: SimpleIdentifier
+    token: f
+    staticElement: f@49
+    staticType: int Function<T extends int>()
+  staticType: int Function()
+  typeArgumentTypes
+    int
+''');
   }
 
   test_functionTearoff_inferredTypeArgs() async {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 0b6a9b6..0584d0e 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -260,14 +260,16 @@
 import 'illegal_async_generator_return_type_test.dart'
     as illegal_async_generator_return_type;
 import 'illegal_async_return_type_test.dart' as illegal_async_return_type;
+import 'illegal_concrete_enum_member_declaration_test.dart'
+    as illegal_concrete_enum_member_declaration;
+import 'illegal_concrete_enum_member_inheritance_test.dart'
+    as illegal_concrete_enum_member_inheritance;
 import 'illegal_enum_values_declaration_test.dart'
     as illegal_enum_values_declaration;
 import 'illegal_enum_values_inheritance_test.dart'
     as illegal_enum_values_inheritance;
 import 'illegal_language_version_override_test.dart'
     as illegal_language_version_override;
-import 'illegal_non_abstract_enum_index_test.dart'
-    as illegal_non_abstract_enum_index;
 import 'illegal_sync_generator_return_type_test.dart'
     as illegal_sync_generator_return_type;
 import 'implements_deferred_class_test.dart' as implements_deferred_class;
@@ -964,10 +966,11 @@
     if_element_condition_from_deferred_library.main();
     illegal_async_generator_return_type.main();
     illegal_async_return_type.main();
+    illegal_concrete_enum_member_declaration.main();
+    illegal_concrete_enum_member_inheritance.main();
     illegal_enum_values_declaration.main();
     illegal_enum_values_inheritance.main();
     illegal_language_version_override.main();
-    illegal_non_abstract_enum_index.main();
     illegal_sync_generator_return_type.main();
     implements_deferred_class.main();
     implements_disallowed_class.main();
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index f36e4dc..8978bb1 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1459,7 +1459,8 @@
     _writelnWithIndent('parameters');
     _withIndent(() {
       for (var parameter in parameters) {
-        _writelnWithIndent(parameter.name);
+        var name = parameter.name;
+        _writelnWithIndent(name.isNotEmpty ? name : '<empty>');
         _withIndent(() {
           _writeParameterKind(parameter);
           _writeType('type', parameter.type);
diff --git a/pkg/compiler/lib/src/backend_strategy.dart b/pkg/compiler/lib/src/backend_strategy.dart
deleted file mode 100644
index a3ce46d..0000000
--- a/pkg/compiler/lib/src/backend_strategy.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.backend_strategy;
-
-import 'common.dart';
-import 'common/codegen.dart';
-import 'common/tasks.dart';
-import 'deferred_load/output_unit.dart' show OutputUnitData;
-import 'enqueue.dart';
-import 'elements/entities.dart';
-import 'inferrer/types.dart';
-import 'io/source_information.dart';
-import 'js_backend/backend.dart';
-import 'js_backend/enqueuer.dart';
-import 'js_backend/inferred_data.dart';
-import 'js_emitter/code_emitter_task.dart';
-import 'js_model/locals.dart';
-import 'kernel/kernel_world.dart';
-import 'serialization/serialization.dart';
-import 'ssa/ssa.dart';
-import 'universe/codegen_world_builder.dart';
-import 'world.dart';
-
-/// Strategy pattern that defines the element model used in type inference
-/// and code generation.
-abstract class BackendStrategy {
-  List<CompilerTask> get tasks;
-
-  FunctionCompiler get functionCompiler;
-
-  CodeEmitterTask get emitterTask;
-
-  /// Create the [JClosedWorld] from [closedWorld].
-  JClosedWorld createJClosedWorld(
-      KClosedWorld closedWorld, OutputUnitData outputUnitData);
-
-  /// Registers [closedWorld] as the current closed world used by this backend
-  /// strategy.
-  ///
-  /// This is used to support serialization after type inference.
-  void registerJClosedWorld(JClosedWorld closedWorld);
-
-  /// Called when the compiler starts running the codegen.
-  ///
-  /// Returns the [CodegenInputs] objects with the needed data.
-  CodegenInputs onCodegenStart(
-      GlobalTypeInferenceResults globalTypeInferenceResults);
-
-  /// Creates an [Enqueuer] for code generation specific to this backend.
-  CodegenEnqueuer createCodegenEnqueuer(
-      CompilerTask task,
-      JClosedWorld closedWorld,
-      GlobalTypeInferenceResults globalInferenceResults,
-      CodegenInputs codegen,
-      CodegenResults codegenResults);
-
-  /// Called when code generation has been completed.
-  void onCodegenEnd(CodegenInputs codegen);
-
-  /// Creates the [SsaBuilder] used for the element model.
-  SsaBuilder createSsaBuilder(
-      CompilerTask task, SourceInformationStrategy sourceInformationStrategy);
-
-  /// Creates a [SourceSpan] from [spannable] in context of [currentElement].
-  SourceSpan spanFromSpannable(Spannable spannable, Entity currentElement);
-
-  /// Creates the [TypesInferrer] used by this strategy.
-  TypesInferrer createTypesInferrer(JClosedWorld closedWorld,
-      GlobalLocalsMap globalLocalsMap, InferredDataBuilder inferredDataBuilder);
-
-  /// Calls [f] for every member that needs to be serialized for modular code
-  /// generation and returns an [EntityWriter] for encoding these members in
-  /// the serialized data.
-  ///
-  /// The needed members include members computed on demand during non-modular
-  /// code generation, such as constructor bodies and and generator bodies.
-  EntityWriter forEachCodegenMember(void Function(MemberEntity member) f);
-
-  /// Prepare [source] to deserialize modular code generation data.
-  void prepareCodegenReader(DataSource source);
-
-  /// Generates the output and returns the total size of the generated code.
-  int assembleProgram(JClosedWorld closedWorld, InferredData inferredData,
-      CodegenInputs codegenInputs, CodegenWorld codegenWorld);
-}
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 8ff980a3..998e90f 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -10,7 +10,6 @@
 import 'package:kernel/ast.dart' as ir;
 
 import '../compiler.dart' as api;
-import 'backend_strategy.dart';
 import 'common.dart';
 import 'common/codegen.dart';
 import 'common/elements.dart' show ElementEnvironment;
@@ -71,7 +70,7 @@
   final api.CompilerDiagnostics handler;
 
   KernelFrontendStrategy frontendStrategy;
-  BackendStrategy backendStrategy;
+  JsBackendStrategy backendStrategy;
   CompilerDiagnosticReporter _reporter;
   Map<Entity, WorldImpact> _impactCache;
   GenericTask userHandlerTask;
@@ -197,7 +196,7 @@
   /// Creates the backend strategy.
   ///
   /// Override this to mock the backend strategy for testing.
-  BackendStrategy createBackendStrategy() {
+  JsBackendStrategy createBackendStrategy() {
     return JsBackendStrategy(this);
   }
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 9832432..06b64b7 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -12,7 +12,6 @@
 import 'package:dart2js_info/binary_serialization.dart' as dump_info;
 
 import '../compiler.dart';
-import 'backend_strategy.dart';
 import 'common.dart';
 import 'common/elements.dart' show JElementEnvironment;
 import 'common/names.dart';
@@ -25,6 +24,7 @@
 import 'inferrer/types.dart'
     show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
 import 'js/js.dart' as jsAst;
+import 'js_model/js_strategy.dart';
 import 'js_backend/field_analysis.dart';
 import 'universe/codegen_world_builder.dart';
 import 'universe/world_impact.dart' show WorldImpact, WorldImpactVisitorImpl;
@@ -369,7 +369,7 @@
     return _outputToInfo.putIfAbsent(outputUnit, () {
       // Dump-info currently only works with the full emitter. If another
       // emitter is used it will fail here.
-      BackendStrategy backendStrategy = compiler.backendStrategy;
+      JsBackendStrategy backendStrategy = compiler.backendStrategy;
       assert(outputUnit.name != null || outputUnit.isMainOutput);
       var filename = outputUnit.isMainOutput
           ? compiler.options.outputUri.pathSegments.last
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index e9df381..31e2752 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -12,7 +12,7 @@
 import '../diagnostics/diagnostic_listener.dart';
 import '../diagnostics/messages.dart';
 import '../diagnostics/source_span.dart';
-import '../kernel/element_map_impl.dart';
+import '../kernel/element_map.dart';
 import '../environment.dart';
 import '../ir/static_type.dart';
 import '../js_backend/annotations.dart';
@@ -97,7 +97,7 @@
     CompilerOptions options,
     DiagnosticReporter reporter,
     Environment environment,
-    KernelToElementMapImpl elementMap) {
+    KernelToElementMap elementMap) {
   var classHierarchy = elementMap.classHierarchy;
   var typeEnvironment = elementMap.typeEnvironment;
   var constantEvaluator = elementMap.constantEvaluator;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index e07ef90..f470a14 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -66,11 +66,7 @@
 // Copies the own properties from [from] to [to] (specialized version of
 // `mixinPropertiesHard` when it is known the properties are disjoint).
 function mixinPropertiesEasy(from, to) {
-  if (#legacyJavaScript) {
-    copyProperties(from, to);
-  } else {
-    Object.assign(to, from);
-  }
+  Object.assign(to, from);
 }
 
 // Only use direct proto access to construct the prototype chain (instead of
@@ -801,8 +797,6 @@
       'call0selector': js.quoteName(call0Name),
       'call1selector': js.quoteName(call1Name),
       'call2selector': js.quoteName(call2Name),
-
-      'legacyJavaScript': _options.features.legacyJavaScript.isEnabled,
     });
     // We assume emitMainFragment will be the last piece of code we emit.
     finalizeCode(mainResourceName, mainCode, holderCode, finalizeHolders: true);
@@ -912,9 +906,7 @@
       for (StaticMethod method in library.statics) {
         Map<js.Name, js.Expression> propertyMap = emitStaticMethod(method);
         propertyMap.forEach((js.Name key, js.Expression value) {
-          var property = _options.features.legacyJavaScript.isEnabled
-              ? js.Property(js.quoteName(key), value)
-              : js.MethodDefinition(js.quoteName(key), value);
+          var property = js.MethodDefinition(js.quoteName(key), value);
           Entity holderKey;
           if (method is StaticStubMethod) {
             // [StaticStubMethod]s should only be created for interceptors.
@@ -1105,25 +1097,15 @@
       // to `inherit(P.Object, null)` in the generated code. See if we can
       // remove that.
 
-      if (_options.features.legacyJavaScript.isEnabled) {
-        // IE11 might require us to set 'constructor' but we aren't 100% sure.
-        properties
-            .add(js.Property(js.string("constructor"), classReference(cls)));
-      }
       properties.add(js.Property(_namer.operatorIs(cls.element), js.number(1)));
     }
 
     allMethods.forEach((Method method) {
       emitInstanceMethod(method)
           .forEach((js.Expression name, js.Expression code) {
-        js.Property property;
-        if (_options.features.legacyJavaScript.isEnabled) {
-          property = js.Property(name, code);
-        } else {
-          property = code is js.Fun
-              ? js.MethodDefinition(name, code)
-              : js.Property(name, code);
-        }
+        js.Property property = code is js.Fun
+            ? js.MethodDefinition(name, code)
+            : js.Property(name, code);
         registerEntityAst(method.element, property);
         properties.add(property);
       });
@@ -1688,8 +1670,7 @@
               : locals.find('_lazy', 'hunkHelpers.lazy')
           : locals.find('_lazyOld', 'hunkHelpers.lazyOld');
       js.Expression staticFieldCode = field.code;
-      if (!_options.features.legacyJavaScript.isEnabled &&
-          staticFieldCode is js.Fun) {
+      if (staticFieldCode is js.Fun) {
         js.Fun fun = staticFieldCode;
         staticFieldCode = js.ArrowFunction(fun.params, fun.body,
                 asyncModifier: fun.asyncModifier)
@@ -1905,14 +1886,8 @@
       globals.add(js.Property(js.string(LEAF_TAGS), js.LiteralNull()));
     }
 
-    globals.add(js.Property(
-        js.string(ARRAY_RTI_PROPERTY),
-        _options.features.legacyJavaScript.isEnabled
-            ? js.js(
-                r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
-                r'    ? Symbol("$ti")'
-                r'    : "$ti"')
-            : js.js(r'Symbol("$ti")')));
+    globals.add(
+        js.Property(js.string(ARRAY_RTI_PROPERTY), js.js(r'Symbol("$ti")')));
 
     if (_closedWorld.backendUsage.requiresStartupMetrics) {
       // Copy the metrics object that was stored on the main unit IIFE.
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 48f715e..aac7e7e 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -37,7 +37,7 @@
 import '../js_backend/annotations.dart';
 import '../js_backend/native_data.dart';
 import '../kernel/dart2js_target.dart' show allowedNativeTest;
-import '../kernel/element_map_impl.dart';
+import '../kernel/element_map.dart';
 import '../kernel/env.dart';
 import '../kernel/kelements.dart';
 import '../native/behavior.dart';
@@ -130,7 +130,7 @@
   JsKernelToElementMap(
       this.reporter,
       this._environment,
-      KernelToElementMapImpl _elementMap,
+      KernelToElementMap _elementMap,
       Map<MemberEntity, MemberUsage> liveMemberUsage,
       AnnotationsData annotations)
       : this.options = _elementMap.options {
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 51028eb..e262869 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -6,7 +6,6 @@
 
 import 'package:kernel/ast.dart' as ir;
 
-import '../backend_strategy.dart';
 import '../common.dart';
 import '../common/codegen.dart';
 import '../common/elements.dart' show CommonElements, ElementEnvironment;
@@ -62,7 +61,9 @@
 import 'js_world_builder.dart';
 import 'locals.dart';
 
-class JsBackendStrategy implements BackendStrategy {
+/// JS Strategy pattern that defines the element model used in type inference
+/// and code generation.
+class JsBackendStrategy {
   final Compiler _compiler;
   JsKernelToElementMap _elementMap;
 
@@ -103,17 +104,14 @@
         sourceInformationStrategy);
   }
 
-  @override
   List<CompilerTask> get tasks {
     List<CompilerTask> result = functionCompiler.tasks;
     result.add(emitterTask);
     return result;
   }
 
-  @override
   FunctionCompiler get functionCompiler => _functionCompiler;
 
-  @override
   CodeEmitterTask get emitterTask => _emitterTask;
 
   Namer get namerForTesting => _namer;
@@ -159,7 +157,7 @@
     return _rtiChecksBuilder;
   }
 
-  @override
+  /// Create the [JClosedWorld] from [closedWorld].
   JClosedWorld createJClosedWorld(
       KClosedWorld closedWorld, OutputUnitData outputUnitData) {
     KernelFrontendStrategy strategy = _compiler.frontendStrategy;
@@ -180,12 +178,17 @@
     return jClosedWorld;
   }
 
-  @override
+  /// Registers [closedWorld] as the current closed world used by this backend
+  /// strategy.
+  ///
+  /// This is used to support serialization after type inference.
   void registerJClosedWorld(covariant JsClosedWorld closedWorld) {
     _elementMap = closedWorld.elementMap;
   }
 
-  @override
+  /// Called when the compiler starts running the codegen.
+  ///
+  /// Returns the [CodegenInputs] objects with the needed data.
   CodegenInputs onCodegenStart(
       GlobalTypeInferenceResults globalTypeInferenceResults) {
     JClosedWorld closedWorld = globalTypeInferenceResults.closedWorld;
@@ -217,7 +220,7 @@
     return codegen;
   }
 
-  @override
+  /// Creates an [Enqueuer] for code generation specific to this backend.
   CodegenEnqueuer createCodegenEnqueuer(
       CompilerTask task,
       JClosedWorld closedWorld,
@@ -342,13 +345,13 @@
     return worldImpact;
   }
 
-  @override
+  /// Called when code generation has been completed.
   void onCodegenEnd(CodegenInputs codegen) {
     sourceInformationStrategy.onComplete();
     codegen.tracer.close();
   }
 
-  @override
+  /// Generates the output and returns the total size of the generated code.
   int assembleProgram(JClosedWorld closedWorld, InferredData inferredData,
       CodegenInputs codegenInputs, CodegenWorld codegenWorld) {
     int programSize = emitterTask.assembleProgram(
@@ -357,7 +360,7 @@
     return programSize;
   }
 
-  @override
+  /// Creates the [SsaBuilder] used for the element model.
   SsaBuilder createSsaBuilder(
       CompilerTask task, SourceInformationStrategy sourceInformationStrategy) {
     return KernelSsaBuilder(
@@ -370,12 +373,12 @@
         sourceInformationStrategy);
   }
 
-  @override
+  /// Creates a [SourceSpan] from [spannable] in context of [currentElement].
   SourceSpan spanFromSpannable(Spannable spannable, Entity currentElement) {
     return _elementMap.getSourceSpan(spannable, currentElement);
   }
 
-  @override
+  /// Creates the [TypesInferrer] used by this strategy.
   TypesInferrer createTypesInferrer(
       JClosedWorld closedWorld,
       GlobalLocalsMap globalLocalsMap,
@@ -384,7 +387,7 @@
         _compiler, closedWorld, globalLocalsMap, inferredDataBuilder);
   }
 
-  @override
+  /// Prepare [source] to deserialize modular code generation data.
   void prepareCodegenReader(DataSource source) {
     source.registerEntityReader(ClosedEntityReader(_elementMap));
     source.registerEntityLookup(ClosedEntityLookup(_elementMap));
@@ -392,7 +395,12 @@
         ComponentLookup(_elementMap.programEnv.mainComponent));
   }
 
-  @override
+  /// Calls [f] for every member that needs to be serialized for modular code
+  /// generation and returns an [EntityWriter] for encoding these members in
+  /// the serialized data.
+  ///
+  /// The needed members include members computed on demand during non-modular
+  /// code generation, such as constructor bodies and and generator bodies.
   EntityWriter forEachCodegenMember(void Function(MemberEntity member) f) {
     int earlyMemberIndexLimit = _elementMap.prepareForCodegenSerialization();
     ClosedEntityWriter entityWriter = ClosedEntityWriter(earlyMemberIndexLimit);
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index ac578ee..3f30198 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -3,174 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
-import 'package:kernel/core_types.dart' as ir;
-import 'package:kernel/class_hierarchy.dart' as ir;
-import 'package:kernel/type_environment.dart' as ir;
 
-import '../common/elements.dart' show KCommonElements, KElementEnvironment;
-import '../constants/values.dart';
-import '../elements/entities.dart';
-import '../elements/names.dart';
-import '../elements/types.dart';
-import '../js/js.dart' as js;
-import '../js_backend/namer.dart';
-import '../js_backend/native_data.dart';
-import '../native/behavior.dart';
-import '../universe/call_structure.dart';
-import '../universe/selector.dart';
-
-/// Interface that translates between Kernel IR nodes and entities used for
-/// computing the [WorldImpact] for members.
-abstract class KernelToElementMap {
-  KElementEnvironment get elementEnvironment;
-  NativeBasicData get nativeBasicData;
-
-  /// Access to the commonly used elements and types.
-  KCommonElements get commonElements;
-
-  /// Access to the [DartTypes] object.
-  DartTypes get types;
-
-  /// Returns the core types for the underlying kernel model.
-  ir.CoreTypes get coreTypes;
-
-  /// Returns the type environment for the underlying kernel model.
-  ir.TypeEnvironment get typeEnvironment;
-
-  /// Returns the class hierarchy for the underlying kernel model.
-  ir.ClassHierarchy get classHierarchy;
-
-  /// Returns the [DartType] corresponding to [type].
-  DartType getDartType(ir.DartType type);
-
-  /// Returns the [InterfaceType] corresponding to [type].
-  InterfaceType getInterfaceType(ir.InterfaceType type);
-
-  /// Returns the [TypeVariableType] corresponding to [type].
-  TypeVariableType getTypeVariableType(ir.TypeParameterType type);
-
-  /// Returns the [FunctionType] of the [node].
-  FunctionType getFunctionType(ir.FunctionNode node);
-
-  /// Return the [InterfaceType] corresponding to the [cls] with the given
-  /// [typeArguments] and [nullability].
-  InterfaceType createInterfaceType(
-      ir.Class cls, List<ir.DartType> typeArguments);
-
-  /// Returns the [CallStructure] corresponding to the [arguments].
-  CallStructure getCallStructure(ir.Arguments arguments);
-
-  /// Returns the [Selector] corresponding to the invocation of [name] with
-  /// [arguments].
-  Selector getInvocationSelector(ir.Name name, int positionalArguments,
-      List<String> namedArguments, int typeArguments);
-
-  /// Returns the [MemberEntity] corresponding to the member [node].
-  MemberEntity getMember(ir.Member node);
-
-  /// Returns the [FunctionEntity] corresponding to the procedure [node].
-  FunctionEntity getMethod(ir.Procedure node);
-
-  /// Returns the [ConstructorEntity] corresponding to the generative or factory
-  /// constructor [node].
-  ConstructorEntity getConstructor(ir.Member node);
-
-  /// Returns the [FieldEntity] corresponding to the field [node].
-  FieldEntity getField(ir.Field node);
-
-  /// Returns the [ClassEntity] corresponding to the class [node].
-  ClassEntity getClass(ir.Class node);
-
-  /// Returns the `noSuchMethod` [FunctionEntity] call from a
-  /// `super.noSuchMethod` invocation within [cls].
-  FunctionEntity getSuperNoSuchMethod(ClassEntity cls);
-
-  /// Returns the [Name] corresponding to [name].
-  Name getName(ir.Name name);
-
-  /// Computes the [NativeBehavior] for a call to the [JS] function.
-  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
-
-  /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
-  /// function.
-  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node);
-
-  /// Computes the [NativeBehavior] for a call to the
-  /// [JS_EMBEDDED_GLOBAL] function.
-  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
-      ir.StaticInvocation node);
-
-  /// Returns the [js.Name] for the `JsGetName` [constant] value.
-  js.Name getNameForJsGetName(ConstantValue constant, Namer namer);
-
-  /// Computes the [ConstantValue] for the constant [expression].
-  ConstantValue getConstantValue(
-      ir.StaticTypeContext staticTypeContext, ir.Expression expression,
-      {bool requireConstant = true, bool implicitNull = false});
-
-  /// Return the [ImportEntity] corresponding to [node].
-  ImportEntity getImport(ir.LibraryDependency node);
-
-  /// Returns the defining node for [cls].
-  ir.Class getClassNode(covariant ClassEntity cls);
-
-  /// Adds libraries in [component] to the set of libraries.
-  ///
-  /// The main method of the first component is used as the main method for the
-  /// compilation.
-  void addComponent(ir.Component component);
-
-  /// Returns the [ConstructorEntity] corresponding to a super initializer in
-  /// [constructor].
-  ///
-  /// The IR resolves super initializers to a [target] up in the type hierarchy.
-  /// Most of the time, the result of this function will be the entity
-  /// corresponding to that target. In the presence of unnamed mixins, this
-  /// function returns an entity for an intermediate synthetic constructor that
-  /// kernel doesn't explicitly represent.
-  ///
-  /// For example:
-  ///     class M {}
-  ///     class C extends Object with M {}
-  ///
-  /// Kernel will say that C()'s super initializer resolves to Object(), but
-  /// this function will return an entity representing the unnamed mixin
-  /// application "Object+M"'s constructor.
-  ConstructorEntity getSuperConstructor(
-      ir.Constructor constructor, ir.Member target);
-
-  /// Computes the native behavior for reading the native [field].
-  NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
-      Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
-      {bool isJsInterop});
-
-  /// Computes the native behavior for writing to the native [field].
-  NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
-
-  /// Computes the native behavior for calling the function or constructor
-  /// [member].
-  NativeBehavior getNativeBehaviorForMethod(ir.Member member,
-      Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
-      {bool isJsInterop});
-
-  /// Compute the kind of foreign helper function called by [node], if any.
-  ForeignKind getForeignKind(ir.StaticInvocation node);
-
-  /// Computes the [InterfaceType] referenced by a call to the
-  /// [JS_INTERCEPTOR_CONSTANT] function, if any.
-  InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node);
-
-  /// Returns the [Local] corresponding to the local function [node].
-  Local getLocalFunction(ir.LocalFunction node);
-
-  /// Returns the [ir.Library] corresponding to [library].
-  ir.Library getLibraryNode(LibraryEntity library);
-
-  /// Returns the defining node for [member].
-  ir.Member getMemberNode(covariant MemberEntity member);
-
-  ir.StaticTypeContext getStaticTypeContext(MemberEntity member);
-}
+// TODO(joshualitt): Merge the contents of element_map_impl.dart into this file.
+export 'element_map_impl.dart';
 
 /// Kinds of foreign functions.
 enum ForeignKind {
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index c4d6943..403ff04 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -41,11 +41,9 @@
 import '../kernel/kernel_strategy.dart';
 import '../kernel/dart2js_target.dart';
 import '../native/behavior.dart';
-import '../native/resolver.dart';
 import '../options.dart';
 import '../ordered_typeset.dart';
 import '../universe/call_structure.dart';
-import '../universe/class_hierarchy.dart';
 import '../universe/selector.dart';
 
 import 'element_map.dart';
@@ -53,9 +51,9 @@
 import 'kelements.dart';
 import 'kernel_impact.dart';
 
-/// Implementation of [KernelToElementMap] that only supports world
+/// Implementation of [IrToElementMap] that only supports world
 /// impact computation.
-class KernelToElementMapImpl implements KernelToElementMap, IrToElementMap {
+class KernelToElementMap implements IrToElementMap {
   final CompilerOptions options;
   @override
   final DiagnosticReporter reporter;
@@ -107,7 +105,7 @@
 
   Map<KMember, Map<ir.Expression, TypeMap>> typeMapsForTesting;
 
-  KernelToElementMapImpl(
+  KernelToElementMap(
       this.reporter, this._environment, this._frontendStrategy, this.options) {
     _elementEnvironment = KernelElementEnvironment(this);
     _typeConverter = DartTypeConverter(this);
@@ -116,12 +114,12 @@
     _constantValuefier = ConstantValuefier(this);
   }
 
-  @override
+  /// Access to the [DartTypes] object.
   DartTypes get types => _types;
 
-  @override
   KernelElementEnvironment get elementEnvironment => _elementEnvironment;
 
+  /// Access to the commonly used elements and types.
   @override
   KCommonElements get commonElements => _commonElements;
 
@@ -244,6 +242,8 @@
     return classEnv.lookupConstructor(this, name);
   }
 
+  /// Return the [InterfaceType] corresponding to the [cls] with the given
+  /// [typeArguments] and [nullability].
   @override
   InterfaceType createInterfaceType(
       ir.Class cls, List<ir.DartType> typeArguments) {
@@ -252,6 +252,7 @@
 
   LibraryEntity getLibrary(ir.Library node) => getLibraryInternal(node);
 
+  /// Returns the [ClassEntity] corresponding to the class [node].
   @override
   ClassEntity getClass(ir.Class node) => getClassInternal(node);
 
@@ -263,6 +264,11 @@
     return data.supertype;
   }
 
+  /// Returns the superclass of [cls] if any.
+  ClassEntity getSuperClass(ClassEntity cls) {
+    return getSuperType(cls)?.element;
+  }
+
   void _ensureCallType(ClassEntity cls, KClassData data) {
     assert(checkFamily(cls));
     if (data is KClassDataImpl && !data.isCallTypeComputed) {
@@ -429,6 +435,7 @@
     }
   }
 
+  /// Returns the [MemberEntity] corresponding to the member [node].
   @override
   MemberEntity getMember(ir.Member node) {
     if (node is ir.Field) {
@@ -445,11 +452,28 @@
     throw UnsupportedError("Unexpected member: $node");
   }
 
+  /// Returns the [ConstructorEntity] corresponding to the generative or factory
+  /// constructor [node].
   @override
   ConstructorEntity getConstructor(ir.Member node) =>
       getConstructorInternal(node);
 
-  @override
+  /// Returns the [ConstructorEntity] corresponding to a super initializer in
+  /// [constructor].
+  ///
+  /// The IR resolves super initializers to a [target] up in the type hierarchy.
+  /// Most of the time, the result of this function will be the entity
+  /// corresponding to that target. In the presence of unnamed mixins, this
+  /// function returns an entity for an intermediate synthetic constructor that
+  /// kernel doesn't explicitly represent.
+  ///
+  /// For example:
+  ///     class M {}
+  ///     class C extends Object with M {}
+  ///
+  /// Kernel will say that C()'s super initializer resolves to Object(), but
+  /// this function will return an entity representing the unnamed mixin
+  /// application "Object+M"'s constructor.
   ConstructorEntity getSuperConstructor(
       ir.Constructor sourceNode, ir.Member targetNode) {
     ConstructorEntity source = getConstructor(sourceNode);
@@ -471,16 +495,19 @@
     throw failedAt(source, "Super constructor for $source not found.");
   }
 
+  /// Returns the [FunctionEntity] corresponding to the procedure [node].
   @override
   FunctionEntity getMethod(ir.Procedure node) => getMethodInternal(node);
 
+  /// Returns the [FieldEntity] corresponding to the field [node].
   @override
   FieldEntity getField(ir.Field node) => getFieldInternal(node);
 
+  /// Returns the [DartType] corresponding to [type].
   @override
   DartType getDartType(ir.DartType type) => _typeConverter.convert(type);
 
-  @override
+  /// Returns the [TypeVariableType] corresponding to [type].
   TypeVariableType getTypeVariableType(ir.TypeParameterType type) =>
       getDartType(type).withoutNullability;
 
@@ -492,10 +519,11 @@
     return list;
   }
 
-  @override
+  /// Returns the [InterfaceType] corresponding to [type].
   InterfaceType getInterfaceType(ir.InterfaceType type) =>
       _typeConverter.convert(type).withoutNullability;
 
+  /// Returns the [FunctionType] of the [node].
   @override
   FunctionType getFunctionType(ir.FunctionNode node) {
     DartType returnType;
@@ -658,6 +686,12 @@
     return data.getVariances();
   }
 
+  /// Returns the class mixed into [cls] if any.
+  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+  // return transitively mixed in classes like in:
+  //     class A {}
+  //     class B = Object with A;
+  //     class C = Object with B;
   ClassEntity getAppliedMixin(IndexedClass cls) {
     assert(checkFamily(cls));
     KClassData data = classes.getData(cls);
@@ -752,6 +786,12 @@
     return data.orderedTypeSet;
   }
 
+  /// Returns all supertypes of [cls].
+  Iterable<InterfaceType> getSuperTypes(ClassEntity cls) {
+    return getOrderedTypeSet(cls).supertypes;
+  }
+
+  /// Returns the hierarchy depth of [cls].
   @override
   int getHierarchyDepth(IndexedClass cls) {
     assert(checkFamily(cls));
@@ -768,19 +808,19 @@
     return data.interfaces;
   }
 
-  @override
+  /// Returns the defining node for [member].
   ir.Member getMemberNode(covariant IndexedMember member) {
     assert(checkFamily(member));
     return members.getData(member).node;
   }
 
-  @override
+  /// Returns the defining node for [cls].
   ir.Class getClassNode(covariant IndexedClass cls) {
     assert(checkFamily(cls));
     return classes.getData(cls).node;
   }
 
-  @override
+  /// Return the [ImportEntity] corresponding to [node].
   ImportEntity getImport(ir.LibraryDependency node) {
     if (node == null) return null;
     ir.Library library = node.parent;
@@ -788,18 +828,18 @@
     return data.imports[node];
   }
 
+  /// Returns the core types for the underlying kernel model.
   @override
   ir.CoreTypes get coreTypes => _coreTypes ??= ir.CoreTypes(env.mainComponent);
 
-  @override
+  /// Returns the type environment for the underlying kernel model.
   ir.TypeEnvironment get typeEnvironment =>
       _typeEnvironment ??= ir.TypeEnvironment(coreTypes, classHierarchy);
 
-  @override
+  /// Returns the class hierarchy for the underlying kernel model.
   ir.ClassHierarchy get classHierarchy =>
       _classHierarchy ??= ir.ClassHierarchy(env.mainComponent, coreTypes);
 
-  @override
   ir.StaticTypeContext getStaticTypeContext(MemberEntity member) {
     // TODO(johnniwinther): Cache the static type context.
     return ir.StaticTypeContext(getMemberNode(member), typeEnvironment);
@@ -817,11 +857,12 @@
                 : ir.EvaluationMode.strong);
   }
 
-  @override
+  /// Returns the [Name] corresponding to [name].
   Name getName(ir.Name name) {
     return Name(name.text, name.isPrivate ? getLibrary(name.library) : null);
   }
 
+  /// Returns the [CallStructure] corresponding to the [arguments].
   @override
   CallStructure getCallStructure(ir.Arguments arguments) {
     int argumentCount = arguments.positional.length + arguments.named.length;
@@ -855,7 +896,8 @@
         includeTypeParameters ? typeParameters : 0);
   }
 
-  @override
+  /// Returns the [Selector] corresponding to the invocation of [name] with
+  /// [arguments].
   Selector getInvocationSelector(ir.Name irName, int positionalArguments,
       List<String> namedArguments, int typeArguments) {
     Name name = getName(irName);
@@ -962,8 +1004,8 @@
     return node.arguments.positional[index].accept(Stringifier());
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// Computes the [NativeBehavior] for a call to the [JS] function.
+  /// TODO(johnniwinther): Cache this for later use.
   NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 2 ||
         node.arguments.named.isNotEmpty) {
@@ -994,8 +1036,9 @@
         commonElements);
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// TODO(johnniwinther): Cache this for later use.
+  /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
+  /// function.
   NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(
@@ -1021,8 +1064,9 @@
         commonElements);
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// Computes the [NativeBehavior] for a call to the
+  /// [JS_EMBEDDED_GLOBAL] function.
+  /// TODO(johnniwinther): Cache this for later use.
   NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
@@ -1055,7 +1099,7 @@
         commonElements);
   }
 
-  @override
+  /// Returns the [js.Name] for the `JsGetName` [constant] value.
   js.Name getNameForJsGetName(ConstantValue constant, Namer namer) {
     int index = extractEnumIndexFromConstantValue(
         constant, commonElements.jsGetNameEnum);
@@ -1078,7 +1122,7 @@
     return null;
   }
 
-  @override
+  /// Computes the [ConstantValue] for the constant [expression].
   ConstantValue getConstantValue(
       ir.StaticTypeContext staticTypeContext, ir.Expression node,
       {bool requireConstant = true,
@@ -1123,7 +1167,8 @@
     return metadata;
   }
 
-  @override
+  /// Returns the `noSuchMethod` [FunctionEntity] call from a
+  /// `super.noSuchMethod` invocation within [cls].
   FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
     while (cls != null) {
       cls = elementEnvironment.getSuperClass(cls);
@@ -1377,16 +1422,18 @@
   }
 
   /// NativeBasicData is need for computation of the default super class.
-  @override
   NativeBasicData get nativeBasicData => _frontendStrategy.nativeBasicData;
 
-  @override
+  /// Adds libraries in [component] to the set of libraries.
+  ///
+  /// The main method of the first component is used as the main method for the
+  /// compilation.
   void addComponent(ir.Component component) {
     env.addComponent(component);
   }
 
   BehaviorBuilder get nativeBehaviorBuilder =>
-      _nativeBehaviorBuilder ??= KernelBehaviorBuilder(elementEnvironment,
+      _nativeBehaviorBuilder ??= BehaviorBuilder(elementEnvironment,
           commonElements, nativeBasicData, reporter, options);
 
   ResolutionImpact computeWorldImpact(KMember member,
@@ -1449,12 +1496,12 @@
     return members.getData(method).node;
   }
 
-  @override
+  /// Returns the [ir.Library] corresponding to [library].
   ir.Library getLibraryNode(LibraryEntity library) {
     return libraries.getData(library).library;
   }
 
-  @override
+  /// Returns the [Local] corresponding to the local function [node].
   Local getLocalFunction(ir.LocalFunction node) {
     KLocalFunction localFunction = localFunctionMap[node];
     if (localFunction == null) {
@@ -1503,7 +1550,9 @@
     return localFunction;
   }
 
-  bool _implementsFunction(IndexedClass cls) {
+  /// Returns `true` if [cls] implements `Function` either explicitly or through
+  /// a `call` method.
+  bool implementsFunction(IndexedClass cls) {
     assert(checkFamily(cls));
     KClassData data = classes.getData(cls);
     OrderedTypeSet orderedTypeSet = data.orderedTypeSet;
@@ -1516,7 +1565,7 @@
     return data.callType?.withoutNullability is FunctionType;
   }
 
-  @override
+  /// Compute the kind of foreign helper function called by [node], if any.
   ForeignKind getForeignKind(ir.StaticInvocation node) {
     if (commonElements.isForeignHelper(getMember(node.target))) {
       switch (node.target.name.text) {
@@ -1533,7 +1582,8 @@
     return ForeignKind.NONE;
   }
 
-  @override
+  /// Computes the [InterfaceType] referenced by a call to the
+  /// [JS_INTERCEPTOR_CONSTANT] function, if any.
   InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length != 1 ||
         node.arguments.named.isNotEmpty) {
@@ -1553,8 +1603,8 @@
     return null;
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// Computes the native behavior for reading the native [field].
+  /// TODO(johnniwinther): Cache this for later use.
   NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
       Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
       {bool isJsInterop}) {
@@ -1564,15 +1614,16 @@
         isJsInterop: isJsInterop);
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// Computes the native behavior for writing to the native [field].
+  /// TODO(johnniwinther): Cache this for later use.
   NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
     DartType type = getDartType(field.type);
     return nativeBehaviorBuilder.buildFieldStoreBehavior(type);
   }
 
-  // TODO(johnniwinther): Cache this for later use.
-  @override
+  /// Computes the native behavior for calling the function or constructor
+  /// [member].
+  /// TODO(johnniwinther): Cache this for later use.
   NativeBehavior getNativeBehaviorForMethod(ir.Member member,
       Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
       {bool isJsInterop}) {
@@ -1660,7 +1711,7 @@
 
 class KernelElementEnvironment extends ElementEnvironment
     implements KElementEnvironment {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
 
   KernelElementEnvironment(this.elementMap);
 
@@ -1894,34 +1945,17 @@
   }
 }
 
-/// [BehaviorBuilder] for kernel based elements.
-class KernelBehaviorBuilder extends BehaviorBuilder {
-  @override
-  final ElementEnvironment elementEnvironment;
-  @override
-  final CommonElements commonElements;
-  @override
-  final DiagnosticReporter reporter;
-  @override
-  final NativeBasicData nativeBasicData;
-  @override
-  final CompilerOptions options;
-
-  KernelBehaviorBuilder(this.elementEnvironment, this.commonElements,
-      this.nativeBasicData, this.reporter, this.options);
-}
-
-class KernelNativeMemberResolver implements NativeMemberResolver {
+class KernelNativeMemberResolver {
   static final RegExp _identifier = RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
 
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
   final NativeBasicData _nativeBasicData;
   final NativeDataBuilder _nativeDataBuilder;
 
   KernelNativeMemberResolver(
       this._elementMap, this._nativeBasicData, this._nativeDataBuilder);
 
-  @override
+  /// Computes whether [node] is native or JsInterop.
   void resolveNativeMember(ir.Member node, IrAnnotationData annotationData) {
     assert(annotationData != null);
     bool isJsInterop = _isJsInteropMember(node);
@@ -2100,42 +2134,6 @@
   }
 }
 
-class KernelClassQueries extends ClassQueries {
-  final KernelToElementMapImpl elementMap;
-
-  KernelClassQueries(this.elementMap);
-
-  @override
-  ClassEntity getDeclaration(ClassEntity cls) {
-    return cls;
-  }
-
-  @override
-  Iterable<InterfaceType> getSupertypes(ClassEntity cls) {
-    return elementMap.getOrderedTypeSet(cls).supertypes;
-  }
-
-  @override
-  ClassEntity getSuperClass(ClassEntity cls) {
-    return elementMap.getSuperType(cls)?.element;
-  }
-
-  @override
-  bool implementsFunction(ClassEntity cls) {
-    return elementMap._implementsFunction(cls);
-  }
-
-  @override
-  int getHierarchyDepth(ClassEntity cls) {
-    return elementMap.getHierarchyDepth(cls);
-  }
-
-  @override
-  ClassEntity getAppliedMixin(ClassEntity cls) {
-    return elementMap.getAppliedMixin(cls);
-  }
-}
-
 DiagnosticMessage _createDiagnosticMessage(
     DiagnosticReporter reporter, ir.LocatedMessage message) {
   SourceSpan sourceSpan = SourceSpan(
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 6943a31..2fe73fc 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -24,7 +24,6 @@
 import '../ssa/type_builder.dart';
 import '../universe/member_usage.dart';
 import 'element_map.dart';
-import 'element_map_impl.dart';
 
 /// Environment for fast lookup of component libraries.
 class KProgramEnv {
@@ -198,14 +197,14 @@
 
   KLibraryData(this.library);
 
-  Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) {
+  Iterable<ConstantValue> getMetadata(KernelToElementMap elementMap) {
     return _metadata ??= elementMap.getMetadata(
         ir.StaticTypeContext.forAnnotations(
             library, elementMap.typeEnvironment),
         library.annotations);
   }
 
-  Iterable<ImportEntity> getImports(KernelToElementMapImpl elementMap) {
+  Iterable<ImportEntity> getImports(KernelToElementMap elementMap) {
     if (imports == null) {
       List<ir.LibraryDependency> dependencies = library.dependencies;
       if (dependencies.isEmpty) {
@@ -247,7 +246,7 @@
   bool get isMixinApplicationWithMembers;
 
   /// Ensures that all members have been computed for [cls].
-  void ensureMembers(KernelToElementMapImpl elementMap);
+  void ensureMembers(KernelToElementMap elementMap);
 
   /// Return the [MemberEntity] for the member [name] in the class. If [setter]
   /// is `true`, the setter or assignable field corresponding to [name] is
@@ -328,11 +327,11 @@
   }
 
   @override
-  void ensureMembers(KernelToElementMapImpl elementMap) {
+  void ensureMembers(KernelToElementMap elementMap) {
     _ensureMaps(elementMap);
   }
 
-  void _ensureMaps(KernelToElementMapImpl elementMap) {
+  void _ensureMaps(KernelToElementMap elementMap) {
     if (_memberMap != null) return;
 
     _memberMap = <String, ir.Member>{};
@@ -592,8 +591,7 @@
   bool isCallTypeComputed = false;
 
   @override
-  Iterable<ConstantValue> getMetadata(
-      covariant KernelToElementMapImpl elementMap) {
+  Iterable<ConstantValue> getMetadata(covariant KernelToElementMap elementMap) {
     return _metadata ??= elementMap.getMetadata(
         ir.StaticTypeContext.forAnnotations(
             node.enclosingLibrary, elementMap.typeEnvironment),
@@ -637,8 +635,7 @@
   KMemberDataImpl(this.node);
 
   @override
-  Iterable<ConstantValue> getMetadata(
-      covariant KernelToElementMapImpl elementMap) {
+  Iterable<ConstantValue> getMetadata(covariant KernelToElementMap elementMap) {
     return _metadata ??= elementMap.getMetadata(
         ir.StaticTypeContext(node, elementMap.typeEnvironment),
         node.annotations);
@@ -670,7 +667,7 @@
 
   @override
   List<TypeVariableType> getFunctionTypeVariables(
-      covariant KernelToElementMapImpl elementMap) {
+      covariant KernelToElementMap elementMap) {
     if (_typeVariables == null) {
       if (functionNode.typeParameters.isEmpty) {
         _typeVariables = const <TypeVariableType>[];
@@ -705,7 +702,7 @@
   KFunctionDataImpl(ir.Member node, this.functionNode) : super(node);
 
   @override
-  FunctionType getFunctionType(covariant KernelToElementMapImpl elementMap) {
+  FunctionType getFunctionType(covariant KernelToElementMap elementMap) {
     return _type ??= elementMap.getFunctionType(functionNode);
   }
 
@@ -788,7 +785,7 @@
   ir.Field get node => super.node;
 
   @override
-  DartType getFieldType(covariant KernelToElementMapImpl elementMap) {
+  DartType getFieldType(covariant KernelToElementMap elementMap) {
     return _type ??= elementMap.getDartType(node.type);
   }
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 336ead7..64f3b3c 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -44,7 +44,6 @@
 import '../universe/world_impact.dart';
 import '../util/enumset.dart';
 import 'element_map.dart';
-import 'element_map_impl.dart';
 import 'loader.dart';
 import 'native_basic_data.dart';
 
@@ -56,7 +55,7 @@
   NativeBasicData _nativeBasicData;
   final CompilerOptions _options;
   final CompilerTask _compilerTask;
-  KernelToElementMapImpl _elementMap;
+  KernelToElementMap _elementMap;
   RuntimeTypesNeedBuilder _runtimeTypesNeedBuilder;
 
   KernelAnnotationProcessor _annotationProcessor;
@@ -85,7 +84,7 @@
   KernelFrontendStrategy(this._compilerTask, this._options,
       DiagnosticReporter reporter, env.Environment environment) {
     assert(_compilerTask != null);
-    _elementMap = KernelToElementMapImpl(reporter, environment, this, _options);
+    _elementMap = KernelToElementMap(reporter, environment, this, _options);
     _modularStrategy = KernelModularStrategy(_compilerTask, _elementMap);
     _backendUsageBuilder = BackendUsageBuilderImpl(this);
     noSuchMethodRegistry =
@@ -141,7 +140,7 @@
         elementEnvironment,
         commonElements,
         _elementMap.types,
-        BaseNativeClassFinder(elementEnvironment, nativeBasicData));
+        NativeClassFinder(elementEnvironment, nativeBasicData));
     _nativeDataBuilder = NativeDataBuilderImpl(nativeBasicData);
     _customElementsResolutionAnalysis = CustomElementsResolutionAnalysis(
         elementEnvironment,
@@ -149,9 +148,8 @@
         nativeBasicData,
         _backendUsageBuilder);
     _fieldAnalysis = KFieldAnalysis(this);
-    ClassQueries classQueries = KernelClassQueries(elementMap);
     ClassHierarchyBuilder classHierarchyBuilder =
-        ClassHierarchyBuilder(commonElements, classQueries);
+        ClassHierarchyBuilder(commonElements, elementMap);
     AnnotationsDataBuilder annotationsDataBuilder = AnnotationsDataBuilder();
     // TODO(johnniwinther): This is a hack. The annotation data is built while
     // using it. With CFE constants the annotations data can be built fully
@@ -203,8 +201,7 @@
             noSuchMethodRegistry,
             annotationsDataBuilder,
             const StrongModeWorldStrategy(),
-            classHierarchyBuilder,
-            classQueries),
+            classHierarchyBuilder),
         KernelWorkItemBuilder(
             _compilerTask,
             elementMap,
@@ -301,9 +298,9 @@
 
 class KernelWorkItemBuilder implements WorkItemBuilder {
   final CompilerTask _compilerTask;
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
   final JavaScriptImpactTransformer _impactTransformer;
-  final NativeMemberResolver _nativeMemberResolver;
+  final KernelNativeMemberResolver _nativeMemberResolver;
   final AnnotationsDataBuilder _annotationsDataBuilder;
   final Map<MemberEntity, ClosureScopeModel> _closureModels;
   final Map<Entity, WorldImpact> _impactCache;
@@ -345,9 +342,9 @@
 
 class KernelWorkItem implements WorkItem {
   final CompilerTask _compilerTask;
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
   final JavaScriptImpactTransformer _impactTransformer;
-  final NativeMemberResolver _nativeMemberResolver;
+  final KernelNativeMemberResolver _nativeMemberResolver;
   final AnnotationsDataBuilder _annotationsDataBuilder;
   @override
   final MemberEntity element;
@@ -425,7 +422,7 @@
 
 class KernelModularStrategy extends ModularStrategy {
   final CompilerTask _compilerTask;
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
 
   KernelModularStrategy(this._compilerTask, this._elementMap);
 
@@ -457,7 +454,7 @@
 
 class DeserializedModularStrategy extends ModularStrategy {
   final CompilerTask _compilerTask;
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
   final Map<ir.Member, ImpactBuilderData> _cache = {};
 
   DeserializedModularStrategy(
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
index 7928607..484ab9a 100644
--- a/pkg/compiler/lib/src/kernel/kernel_world.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -20,11 +20,11 @@
 import '../universe/selector.dart';
 import '../world.dart';
 
-import 'element_map_impl.dart';
+import 'element_map.dart';
 
 /// The immutable result of the [ResolutionWorldBuilder].
 class KClosedWorld implements BuiltWorld {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
   final KElementEnvironment elementEnvironment;
   final DartTypes dartTypes;
   final KCommonElements commonElements;
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index ed4a83d..df000a3 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -12,10 +12,10 @@
 import '../js_backend/native_data.dart';
 import '../native/resolver.dart';
 
-import 'element_map_impl.dart';
+import 'element_map.dart';
 
 class KernelAnnotationProcessor {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
   final NativeBasicDataBuilder _nativeBasicDataBuilder;
   final IrAnnotationData annotationData;
 
diff --git a/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart b/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
index 2da943b..6b44875 100644
--- a/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
+++ b/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
@@ -8,12 +8,12 @@
 import '../common/names.dart';
 import '../elements/entities.dart';
 
-import 'element_map_impl.dart';
+import 'element_map.dart';
 import 'kelements.dart';
 
 /// Interface for determining the form of a `noSuchMethod` implementation.
 class NoSuchMethodResolver {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
 
   NoSuchMethodResolver(this.elementMap);
 
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index eabde14..bfd1de6 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -731,16 +731,19 @@
   }
 }
 
-abstract class BehaviorBuilder {
-  CommonElements get commonElements;
-  DiagnosticReporter get reporter;
-  NativeBasicData get nativeBasicData;
-  ElementEnvironment get elementEnvironment;
-  CompilerOptions get options;
+class BehaviorBuilder {
+  final ElementEnvironment elementEnvironment;
+  final CommonElements commonElements;
+  final DiagnosticReporter reporter;
+  final NativeBasicData nativeBasicData;
+  final CompilerOptions options;
   DartTypes get dartTypes => commonElements.dartTypes;
 
   NativeBehavior _behavior;
 
+  BehaviorBuilder(this.elementEnvironment, this.commonElements,
+      this.nativeBasicData, this.reporter, this.options);
+
   void _overrideWithAnnotations(Iterable<String> createsAnnotations,
       Iterable<String> returnsAnnotations, TypeLookup lookupType) {
     if (createsAnnotations.isEmpty && returnsAnnotations.isEmpty) return;
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index 99f0ab8..b579393 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -2,37 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:kernel/ast.dart' as ir;
-
 import '../common.dart';
 import '../common/elements.dart' show KElementEnvironment;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
-import '../ir/annotations.dart';
 import '../js_backend/native_data.dart';
 
-/// Interface for computing native members.
-abstract class NativeMemberResolver {
-  /// Computes whether [node] is native or JsInterop.
-  void resolveNativeMember(ir.Member node, IrAnnotationData annotationData);
-}
-
 /// Determines all native classes in a set of libraries.
-abstract class NativeClassFinder {
-  /// Returns the set of all native classes declared in [libraries].
-  Iterable<ClassEntity> computeNativeClasses(Iterable<Uri> libraries);
-}
-
-class BaseNativeClassFinder implements NativeClassFinder {
+class NativeClassFinder {
   final KElementEnvironment _elementEnvironment;
   final NativeBasicData _nativeBasicData;
 
   final Map<String, ClassEntity> _tagOwner = {};
 
-  BaseNativeClassFinder(this._elementEnvironment, this._nativeBasicData);
+  NativeClassFinder(this._elementEnvironment, this._nativeBasicData);
 
-  @override
+  /// Returns the set of all native classes declared in [libraries].
   Iterable<ClassEntity> computeNativeClasses(Iterable<Uri> libraries) {
     Set<ClassEntity> nativeClasses = {};
     libraries.forEach((uri) => _processNativeClassesInLibrary(
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 0e6e7d5..15889be 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -8,7 +8,6 @@
 import 'package:kernel/binary/ast_to_binary.dart' as ir;
 import 'package:front_end/src/fasta/util/bytes_sink.dart';
 import '../../compiler.dart' as api;
-import '../backend_strategy.dart';
 import '../commandline_options.dart' show Flags;
 import '../common/codegen.dart';
 import '../common/tasks.dart';
@@ -22,6 +21,7 @@
 import '../js_backend/inferred_data.dart';
 import '../js_model/js_world.dart';
 import '../js_model/element_map_impl.dart';
+import '../js_model/js_strategy.dart';
 import '../js_model/locals.dart';
 import '../options.dart';
 import '../util/sink_adapter.dart';
@@ -287,7 +287,7 @@
     });
   }
 
-  void serializeCodegen(BackendStrategy backendStrategy,
+  void serializeCodegen(JsBackendStrategy backendStrategy,
       CodegenResults codegenResults, DataSourceIndices indices) {
     GlobalTypeInferenceResults globalTypeInferenceResults =
         codegenResults.globalTypeInferenceResults;
@@ -321,7 +321,7 @@
   }
 
   Future<CodegenResults> deserializeCodegen(
-      BackendStrategy backendStrategy,
+      JsBackendStrategy backendStrategy,
       GlobalTypeInferenceResults globalTypeInferenceResults,
       CodegenInputs codegenInputs,
       DataSourceIndices indices) async {
@@ -346,7 +346,7 @@
   }
 
   void _deserializeCodegenInput(
-      BackendStrategy backendStrategy,
+      JsBackendStrategy backendStrategy,
       JClosedWorld closedWorld,
       Uri uri,
       api.Input<List<int>> dataInput,
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index ac66787..26c0537 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -368,8 +368,6 @@
         return options.enableVariance;
       case 'LEGACY':
         return options.useLegacySubtyping;
-      case 'LEGACY_JAVASCRIPT':
-        return options.features.legacyJavaScript.isEnabled;
       case 'PRINT_LEGACY_STARS':
         return options.printLegacyStars;
       default:
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 4986815..40243ad 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -4,7 +4,6 @@
 
 library ssa;
 
-import '../backend_strategy.dart';
 import '../common.dart';
 import '../common/codegen.dart' show CodegenResult, CodegenRegistry;
 import '../common/elements.dart' show CommonElements, JElementEnvironment;
@@ -22,6 +21,7 @@
 import '../js_emitter/startup_emitter/emitter.dart' show ModularEmitterImpl;
 import '../js_model/elements.dart';
 import '../js_model/type_recipe.dart' show TypeExpressionRecipe;
+import '../js_model/js_strategy.dart';
 import '../options.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/use.dart' show StaticUse;
@@ -44,7 +44,7 @@
   SsaFunctionCompiler(
       this._options,
       this._reporter,
-      BackendStrategy backendStrategy,
+      JsBackendStrategy backendStrategy,
       Measurer measurer,
       this.sourceInformationStrategy)
       : generator =
@@ -319,7 +319,7 @@
 }
 
 class SsaBuilderTask extends CompilerTask {
-  final BackendStrategy _backendStrategy;
+  final JsBackendStrategy _backendStrategy;
   final SourceInformationStrategy _sourceInformationFactory;
   SsaBuilder _builder;
 
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
index 295204e..24cc4ce 100644
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -6,6 +6,7 @@
 import '../common/elements.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart' show InterfaceType;
+import '../kernel/element_map.dart' show KernelToElementMap;
 import '../serialization/serialization.dart';
 import 'class_set.dart';
 
@@ -574,9 +575,9 @@
   final Map<ClassEntity, Set<ClassEntity>> mixinUses = {};
 
   final CommonElements _commonElements;
-  final ClassQueries _classQueries;
+  final KernelToElementMap _elementMap;
 
-  ClassHierarchyBuilder(this._commonElements, this._classQueries);
+  ClassHierarchyBuilder(this._commonElements, this._elementMap);
 
   ClassHierarchy close() {
     assert(
@@ -589,18 +590,18 @@
   }
 
   void registerClass(ClassEntity cls) {
-    _ensureClassSet(_classQueries.getDeclaration(cls));
+    _ensureClassSet(cls);
   }
 
   ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
     return _classHierarchyNodes.putIfAbsent(cls, () {
       ClassHierarchyNode parentNode;
-      ClassEntity superclass = _classQueries.getSuperClass(cls);
+      ClassEntity superclass = _elementMap.getSuperClass(cls);
       if (superclass != null) {
         parentNode = _ensureClassHierarchyNode(superclass);
       }
       return ClassHierarchyNode(
-          parentNode, cls, _classQueries.getHierarchyDepth(cls));
+          parentNode, cls, _elementMap.getHierarchyDepth(cls));
     });
   }
 
@@ -609,14 +610,14 @@
       ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
       ClassSet classSet = ClassSet(node);
 
-      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
+      for (InterfaceType type in _elementMap.getSuperTypes(cls)) {
         // TODO(johnniwinther): Optimization: Avoid adding [cls] to
         // superclasses.
         ClassSet subtypeSet = _ensureClassSet(type.element);
         subtypeSet.addSubtype(node);
       }
 
-      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
+      ClassEntity appliedMixin = _elementMap.getAppliedMixin(cls);
       while (appliedMixin != null) {
         // TODO(johnniwinther): Use the data stored in [ClassSet].
         registerMixinUse(cls, appliedMixin);
@@ -630,7 +631,7 @@
         //    class C = Object with B;
         //
         // we need to register that C not only mixes in B but also A.
-        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+        appliedMixin = _elementMap.getAppliedMixin(appliedMixin);
       }
       return classSet;
     });
@@ -641,7 +642,7 @@
     // subtype set.
     ClassEntity cls = node.cls;
     if (cls != _commonElements.functionClass &&
-        _classQueries.implementsFunction(cls)) {
+        _elementMap.implementsFunction(cls)) {
       ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
       subtypeSet.addSubtype(node);
     }
@@ -912,32 +913,6 @@
   }
 }
 
-abstract class ClassQueries {
-  /// Returns the declaration of [cls].
-  ClassEntity getDeclaration(covariant ClassEntity cls);
-
-  /// Returns the class mixed into [cls] if any.
-  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
-  // return transitively mixed in classes like in:
-  //     class A {}
-  //     class B = Object with A;
-  //     class C = Object with B;
-  ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
-  /// Returns the hierarchy depth of [cls].
-  int getHierarchyDepth(covariant ClassEntity cls);
-
-  /// Returns `true` if [cls] implements `Function` either explicitly or through
-  /// a `call` method.
-  bool implementsFunction(covariant ClassEntity cls);
-
-  /// Returns the superclass of [cls] if any.
-  ClassEntity getSuperClass(covariant ClassEntity cls);
-
-  /// Returns all supertypes of [cls].
-  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
-}
-
 /// Enum values defining subset of classes included in queries.
 enum ClassQuery {
   /// Only the class itself is included.
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 2d04eae..3f31e7b 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -17,7 +17,7 @@
 import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types_resolution.dart';
-import '../kernel/element_map_impl.dart';
+import '../kernel/element_map.dart';
 import '../kernel/kernel_world.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../options.dart';
@@ -25,7 +25,7 @@
 import '../util/util.dart';
 import '../world.dart' show World;
 import 'call_structure.dart';
-import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'class_hierarchy.dart' show ClassHierarchyBuilder;
 import 'class_set.dart';
 import 'member_usage.dart';
 import 'selector.dart' show Selector;
@@ -263,7 +263,6 @@
 
   final SelectorConstraintsStrategy _selectorConstraintsStrategy;
   final ClassHierarchyBuilder _classHierarchyBuilder;
-  final ClassQueries _classQueries;
 
   bool _closed = false;
   KClosedWorld _closedWorldCache;
@@ -277,7 +276,7 @@
 
   bool get isClosed => _closed;
 
-  final KernelToElementMapImpl _elementMap;
+  final KernelToElementMap _elementMap;
 
   ResolutionWorldBuilder(
       this._options,
@@ -295,8 +294,7 @@
       this._noSuchMethodRegistry,
       this._annotationsDataBuilder,
       this._selectorConstraintsStrategy,
-      this._classHierarchyBuilder,
-      this._classQueries);
+      this._classHierarchyBuilder);
 
   /// Returns the classes registered as directly or indirectly instantiated.
   Iterable<ClassEntity> get processedClasses => _processedClasses.keys
@@ -857,14 +855,14 @@
 
       // Walk through the superclasses, and record the types
       // implemented by that type on the superclasses.
-      ClassEntity superclass = _classQueries.getSuperClass(cls);
+      ClassEntity superclass = _elementMap.getSuperClass(cls);
       while (superclass != null) {
         Set<ClassEntity> typesImplementedBySubclassesOfCls =
             typesImplementedBySubclasses.putIfAbsent(superclass, () => {});
-        for (InterfaceType current in _classQueries.getSupertypes(cls)) {
+        for (InterfaceType current in _elementMap.getSuperTypes(cls)) {
           typesImplementedBySubclassesOfCls.add(current.element);
         }
-        superclass = _classQueries.getSuperClass(superclass);
+        superclass = _elementMap.getSuperClass(superclass);
       }
     }
 
diff --git a/pkg/compiler/test/end_to_end/exit_code_test.dart b/pkg/compiler/test/end_to_end/exit_code_test.dart
index ee7a324..be0974f 100644
--- a/pkg/compiler/test/end_to_end/exit_code_test.dart
+++ b/pkg/compiler/test/end_to_end/exit_code_test.dart
@@ -12,7 +12,6 @@
 import 'package:expect/expect.dart';
 
 import 'package:compiler/compiler.dart' as api;
-import 'package:compiler/src/backend_strategy.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common/codegen.dart';
 import 'package:compiler/src/common/work.dart';
@@ -55,7 +54,7 @@
   }
 
   @override
-  BackendStrategy createBackendStrategy() {
+  JsBackendStrategy createBackendStrategy() {
     return new TestBackendStrategy(this);
   }
 
diff --git a/pkg/compiler/test/equivalence/id_equivalence_helper.dart b/pkg/compiler/test/equivalence/id_equivalence_helper.dart
index d09b6c0..037cf61 100644
--- a/pkg/compiler/test/equivalence/id_equivalence_helper.dart
+++ b/pkg/compiler/test/equivalence/id_equivalence_helper.dart
@@ -14,7 +14,7 @@
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' as ir;
@@ -254,7 +254,7 @@
 
   ir.Library getIrLibrary(LibraryEntity library) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     LibraryEntity kLibrary =
         elementMap.elementEnvironment.lookupLibrary(library.canonicalUri);
     return elementMap.getLibraryNode(kLibrary);
diff --git a/pkg/compiler/test/equivalence/id_testing_test.dart b/pkg/compiler/test/equivalence/id_testing_test.dart
index 5789c7c..1f9bfe35 100644
--- a/pkg/compiler/test/equivalence/id_testing_test.dart
+++ b/pkg/compiler/test/equivalence/id_testing_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
 import 'package:kernel/ast.dart' as ir;
@@ -31,7 +31,7 @@
       Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     ir.Member node = elementMap.getMemberNode(member);
     new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
         .run(node);
@@ -42,7 +42,7 @@
       Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     ir.Class node = elementMap.getClassNode(cls);
     new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
         .computeForClass(node);
@@ -53,7 +53,7 @@
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     ir.Library node = elementMap.getLibraryNode(library);
     new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
         .computeForLibrary(node);
@@ -77,7 +77,7 @@
 
 /// IR visitor for computing inference data for a member.
 class IdTestingDataExtractor extends IrDataExtractor<String> {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
 
   IdTestingDataExtractor(DiagnosticReporter reporter,
       Map<Id, ActualData<String>> actualMap, this.elementMap)
diff --git a/pkg/compiler/test/model/cfe_annotations_test.dart b/pkg/compiler/test/model/cfe_annotations_test.dart
index e6e164a..4377903 100644
--- a/pkg/compiler/test/model/cfe_annotations_test.dart
+++ b/pkg/compiler/test/model/cfe_annotations_test.dart
@@ -12,7 +12,6 @@
 import 'package:compiler/src/js_backend/native_data.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/kernel/element_map.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
 import 'package:expect/expect.dart';
 import 'package:front_end/src/api_prototype/lowering_predicates.dart';
 import 'package:kernel/ast.dart' as ir;
@@ -198,7 +197,7 @@
       Expect.isTrue(result.isSuccess);
       Compiler compiler = result.compiler;
       KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-      KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+      KernelToElementMap elementMap = frontendStrategy.elementMap;
       ir.Component component = elementMap.env.mainComponent;
       IrAnnotationData annotationData =
           frontendStrategy.irAnnotationDataForTesting;
diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
index ae213d2..a3d52f9 100644
--- a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
+++ b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
@@ -20,7 +20,7 @@
 import 'package:compiler/src/ir/constants.dart';
 import 'package:compiler/src/ir/visitors.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;
 import 'package:front_end/src/api_unstable/dart2js.dart' as ir;
 import 'package:kernel/ast.dart' as ir;
@@ -574,7 +574,7 @@
         options: [Flags.enableAsserts]);
     Compiler compiler = result.compiler;
     KernelFrontendStrategy frontEndStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontEndStrategy.elementMap;
+    KernelToElementMap elementMap = frontEndStrategy.elementMap;
     DartTypes dartTypes = elementMap.types;
     ir.TypeEnvironment typeEnvironment = elementMap.typeEnvironment;
     KElementEnvironment elementEnvironment =
diff --git a/pkg/compiler/test/model/cfe_constant_test.dart b/pkg/compiler/test/model/cfe_constant_test.dart
index d9dfbf0..d4ab111 100644
--- a/pkg/compiler/test/model/cfe_constant_test.dart
+++ b/pkg/compiler/test/model/cfe_constant_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
@@ -31,7 +31,7 @@
 class ConstantDataComputer extends DataComputer<String> {
   ir.TypeEnvironment _typeEnvironment;
 
-  ir.TypeEnvironment getTypeEnvironment(KernelToElementMapImpl elementMap) {
+  ir.TypeEnvironment getTypeEnvironment(KernelToElementMap elementMap) {
     if (_typeEnvironment == null) {
       ir.Component component = elementMap.env.mainComponent;
       ir.CoreTypes coreTypes = new ir.CoreTypes(component);
@@ -49,7 +49,7 @@
       Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     ir.Member node = elementMap.getMemberNode(member);
     new ConstantDataExtractor(compiler.reporter, actualMap, elementMap, member)
         .run(node);
@@ -73,7 +73,7 @@
 
 /// IR visitor for computing inference data for a member.
 class ConstantDataExtractor extends IrDataExtractor<String> {
-  final KernelToElementMapImpl elementMap;
+  final KernelToElementMap elementMap;
   final MemberEntity member;
 
   ConstantDataExtractor(DiagnosticReporter reporter,
diff --git a/pkg/compiler/test/static_type/static_type_test.dart b/pkg/compiler/test/static_type/static_type_test.dart
index 0123144..0498952 100644
--- a/pkg/compiler/test/static_type/static_type_test.dart
+++ b/pkg/compiler/test/static_type/static_type_test.dart
@@ -12,7 +12,7 @@
 import 'package:compiler/src/ir/cached_static_type.dart';
 import 'package:compiler/src/ir/static_type_base.dart';
 import 'package:compiler/src/ir/static_type_cache.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
@@ -34,7 +34,7 @@
   ir.TypeEnvironment _typeEnvironment;
 
   ir.StaticTypeContext getStaticTypeContext(
-      KernelToElementMapImpl elementMap, ir.Member node) {
+      KernelToElementMap elementMap, ir.Member node) {
     if (_typeEnvironment == null) {
       ir.Component component = elementMap.env.mainComponent;
       ir.CoreTypes coreTypes = new ir.CoreTypes(component);
@@ -52,7 +52,7 @@
       Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     StaticTypeCache staticTypeCache = elementMap.getCachedStaticTypes(member);
     ir.Member node = elementMap.getMemberNode(member);
     new StaticTypeIrComputer(
diff --git a/pkg/compiler/test/static_type/type_promotion_test.dart b/pkg/compiler/test/static_type/type_promotion_test.dart
index 9584f53..c6ab8a8 100644
--- a/pkg/compiler/test/static_type/type_promotion_test.dart
+++ b/pkg/compiler/test/static_type/type_promotion_test.dart
@@ -10,7 +10,7 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/ir/static_type.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
@@ -31,7 +31,7 @@
 class TypePromotionDataComputer extends DataComputer<String> {
   ir.TypeEnvironment _typeEnvironment;
 
-  ir.TypeEnvironment getTypeEnvironment(KernelToElementMapImpl elementMap) {
+  ir.TypeEnvironment getTypeEnvironment(KernelToElementMap elementMap) {
     if (_typeEnvironment == null) {
       ir.Component component = elementMap.env.mainComponent;
       ir.CoreTypes coreTypes = new ir.CoreTypes(component);
@@ -49,7 +49,7 @@
       Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
-    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    KernelToElementMap elementMap = frontendStrategy.elementMap;
     Map<ir.Expression, TypeMap> typeMaps =
         elementMap.getTypeMapsForTesting(member);
     ir.Member node = elementMap.getMemberNode(member);
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 48c7c49..c0523f6 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -1661,10 +1661,10 @@
   }
 
   test_option_sdk_default() {
-    var cli = MigrationCli(binaryName: 'nnbd_migration');
+    var cli = _createCli();
     var cliRunner = cli.decodeCommandLineArgs(_parseArgs([]))!;
-    expect(Directory(path.join(cliRunner.options.sdkPath, 'bin')).existsSync(),
-        isTrue);
+    expect(cliRunner.options.sdkPath,
+        cli._test.resourceProvider.convertPath(sdkRootPathPosix));
   }
 
   test_option_sdk_hidden() {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 97ce2ab..4c40284 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -349,8 +349,8 @@
       "movn r2, #0x0\n"
       "movz r1, #0x1\n"
       "movz r0, #0x0\n"
-      "adds ip0, r2, r1\n"
-      "adcs ip0, r2, r0\n"
+      "adds tmp, r2, r1\n"
+      "adcs tmp, r2, r0\n"
       "adc r0, r0, r0\n"
       "ret\n");
 }
@@ -370,8 +370,8 @@
   EXPECT_DISASSEMBLY(
       "movz r1, #0x1\n"
       "movz r0, #0x0\n"
-      "subs ip0, r0, r1\n"
-      "sbcs ip0, r0, r0\n"
+      "subs tmp, r0, r1\n"
+      "sbcs tmp, r0, r0\n"
       "sbc r0, r0, r0\n"
       "ret\n");
 }
@@ -395,8 +395,8 @@
       "movz r1, #0x1\n"
       "movn r2, #0x0\n"
       "mov r3, 0x7fffffffffffffff\n"
-      "adds ip0, r2, r1\n"
-      "adcs ip0, r3, r0\n"
+      "adds tmp, r2, r1\n"
+      "adcs tmp, r3, r0\n"
       "csinc r0, r0, r0, vs\n"
       "ret\n");
 }
@@ -418,8 +418,8 @@
       "movn r2, #0x0\n"
       "movz r1, #0x1\n"
       "movz r0, #0x0\n"
-      "addws ip0, r2, r1\n"
-      "adcws ip0, r2, r0\n"
+      "addws tmp, r2, r1\n"
+      "adcws tmp, r2, r0\n"
       "adcw r0, r0, r0\n"
       "ret\n");
 }
@@ -439,8 +439,8 @@
   EXPECT_DISASSEMBLY(
       "movz r1, #0x1\n"
       "movz r0, #0x0\n"
-      "subws ip0, r0, r1\n"
-      "sbcws ip0, r0, r0\n"
+      "subws tmp, r0, r1\n"
+      "sbcws tmp, r0, r0\n"
       "sbcw r0, r0, r0\n"
       "ret\n");
 }
@@ -464,8 +464,8 @@
       "movz r1, #0x1\n"
       "mov r2, 0xffffffff\n"
       "mov r3, 0x7fffffff\n"
-      "addws ip0, r2, r1\n"
-      "adcws ip0, r3, r0\n"
+      "addws tmp, r2, r1\n"
+      "adcws tmp, r3, r0\n"
       "csinc r0, r0, r0, vs\n"
       "ret\n");
 }
@@ -489,14 +489,14 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
-      "str r1, [r15, #-8]!\n"
-      "ldr r0, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "str r1, [sp, #-8]!\n"
+      "ldr r0, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -515,14 +515,14 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
-      "add r2, r15, #0x1\n"
+      "add r2, sp, #0x1\n"
       "str r1, [r2, #-1]\n"
       "ldr r0, [r2, #-1]\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -548,15 +548,15 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x100\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
-      "str r1, [r15, #-256]!\n"
-      "ldr r0, [r15], #248 !\n"
-      "add r15, r15, #0x8\n"
-      "mov csp, r15\n"
+      "str r1, [sp, #-256]!\n"
+      "ldr r0, [sp], #248 !\n"
+      "add sp, sp, #0x8\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -577,16 +577,16 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
-      "sub r15, r15, #0x1000\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "str r1, [r15, #4096]\n"
-      "add r15, r15, #0x1000\n"
-      "ldr r0, [r15]\n"
-      "mov csp, r15\n"
+      "sub sp, sp, #0x1000\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "str r1, [sp, #4096]\n"
+      "add sp, sp, #0x1000\n"
+      "ldr r0, [sp]\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -611,18 +611,18 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
       "movz r2, #0xfff8\n"
       "movk r2, #0xffff lsl 16\n"
-      "str r1, [r15, r2 sxtw]\n"
-      "sub r15, r15, #0x8\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "ldr r0, [r15]\n"
-      "add r15, r15, #0x8\n"
-      "mov csp, r15\n"
+      "str r1, [sp, r2 sxtw]\n"
+      "sub sp, sp, #0x8\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "ldr r0, [sp]\n"
+      "add sp, sp, #0x8\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -645,17 +645,17 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x2b\n"
       "movz r1, #0x2a\n"
       "movz r2, #0xa\n"
-      "sub r15, r15, #0x50\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "str r1, [r15, r2 uxtx scaled]\n"
-      "ldr r0, [r15, r2 uxtx scaled]\n"
-      "add r15, r15, #0x50\n"
-      "mov csp, r15\n"
+      "sub sp, sp, #0x50\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "str r1, [sp, r2 uxtx scaled]\n"
+      "ldr r0, [sp, r2 uxtx scaled]\n"
+      "add sp, sp, #0x50\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -677,14 +677,14 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
       "mov r1, 0xffffffff\n"
-      "strw r1, [r15, #-4]!\n"
-      "ldrsw r0, [r15]\n"
-      "ldrsw r1, [r15], #4 !\n"
-      "mov csp, r15\n"
+      "strw r1, [sp, #-4]!\n"
+      "ldrsw r0, [sp]\n"
+      "ldrsw r1, [sp], #4 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -707,15 +707,15 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
       "movz r2, #0x2b\n"
       "movz r3, #0x2a\n"
-      "stp r2, r3, [r15, #-16]!\n"
-      "ldp r0, r1, [r15], #16 !\n"
+      "stp r2, r3, [sp, #-16]!\n"
+      "ldp r0, r1, [sp], #16 !\n"
       "sub r0, r0, r1\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -737,17 +737,17 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r2, #0x2b\n"
       "movz r3, #0x2a\n"
-      "sub r15, r15, #0x20\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "stp r2, r3, [r15, #16]\n"
-      "ldp r0, r1, [r15, #16]\n"
-      "add r15, r15, #0x20\n"
+      "sub sp, sp, #0x20\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "stp r2, r3, [sp, #16]\n"
+      "ldp r0, r1, [sp, #16]\n"
+      "add sp, sp, #0x20\n"
       "sub r0, r0, r1\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -767,14 +767,14 @@
   typedef int (*PushRegisterPair)() DART_UNUSED;
   EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PushRegisterPair, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r2, #0xc\n"
       "movz r3, #0x15\n"
-      "stp r2, r3, [r15, #-16]!\n"
-      "ldr r0, [r15], #8 !\n"
-      "ldr r1, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "stp r2, r3, [sp, #-16]!\n"
+      "ldr r0, [sp], #8 !\n"
+      "ldr r1, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -795,14 +795,14 @@
   EXPECT_EQ(12,
             EXECUTE_TEST_CODE_INT64(PushRegisterPairReversed, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r3, #0xc\n"
       "movz r2, #0x15\n"
-      "stp r3, r2, [r15, #-16]!\n"
-      "ldr r0, [r15], #8 !\n"
-      "ldr r1, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "stp r3, r2, [sp, #-16]!\n"
+      "ldr r0, [sp], #8 !\n"
+      "ldr r1, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -822,14 +822,14 @@
   typedef int (*PopRegisterPair)() DART_UNUSED;
   EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PopRegisterPair, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r2, #0xc\n"
       "movz r3, #0x15\n"
-      "str r3, [r15, #-8]!\n"
-      "str r2, [r15, #-8]!\n"
-      "ldp r0, r1, [r15], #16 !\n"
-      "mov csp, r15\n"
+      "str r3, [sp, #-8]!\n"
+      "str r2, [sp, #-8]!\n"
+      "ldp r0, r1, [sp], #16 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -850,14 +850,14 @@
   EXPECT_EQ(12,
             EXECUTE_TEST_CODE_INT64(PopRegisterPairReversed, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r3, #0xc\n"
       "movz r2, #0x15\n"
-      "str r3, [r15, #-8]!\n"
-      "str r2, [r15, #-8]!\n"
-      "ldp r1, r0, [r15], #16 !\n"
-      "mov csp, r15\n"
+      "str r3, [sp, #-8]!\n"
+      "str r2, [sp, #-8]!\n"
+      "ldp r1, r0, [sp], #16 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -882,17 +882,17 @@
   typedef intptr_t (*Semaphore)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x28\n"
       "movz r1, #0x2a\n"
-      "str r0, [r15, #-8]!\n"
-      "ldxr r0, r15\n"
-      "stxr ip0, r1, r15\n"
-      "cmp ip0, #0x0\n"
+      "str r0, [sp, #-8]!\n"
+      "ldxr r0, sp\n"
+      "stxr tmp, r1, sp\n"
+      "cmp tmp, #0x0\n"
       "bne -12\n"
-      "ldr r0, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "ldr r0, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -915,17 +915,17 @@
   typedef intptr_t (*FailedSemaphore)() DART_UNUSED;
   EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x28\n"
       "movz r1, #0x2a\n"
-      "str r0, [r15, #-8]!\n"
-      "ldxr r0, r15\n"
+      "str r0, [sp, #-8]!\n"
+      "ldxr r0, sp\n"
       "clrex\n"
-      "stxr ip0, r1, r15\n"
-      "ldr r0, [r15], #8 !\n"
-      "add r0, r0, ip0\n"
-      "mov csp, r15\n"
+      "stxr tmp, r1, sp\n"
+      "ldr r0, [sp], #8 !\n"
+      "add r0, r0, tmp\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -959,19 +959,19 @@
   EXPECT_EQ(42 + (DART_INT64_C(40) << 32),
             EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x28\n"
       "add r0, r0, r0 lsl #32\n"
-      "str r0, [r15, #-8]!\n"
+      "str r0, [sp, #-8]!\n"
       "movz r0, #0x28\n"
       "movz r1, #0x2a\n"
-      "ldxrw r0, r15\n"
-      "stxrw ip0, r1, r15\n"
-      "cmp ip0, #0x0\n"
+      "ldxrw r0, sp\n"
+      "stxrw tmp, r1, sp\n"
+      "cmp tmp, #0x0\n"
       "bne -12\n"
-      "ldr r0, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "ldr r0, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -1001,19 +1001,19 @@
   EXPECT_EQ(41 + (DART_INT64_C(40) << 32),
             EXECUTE_TEST_CODE_INT64(FailedSemaphore32, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "movz r0, #0x28\n"
       "add r0, r0, r0 lsl #32\n"
-      "str r0, [r15, #-8]!\n"
+      "str r0, [sp, #-8]!\n"
       "movz r0, #0x28\n"
       "movz r1, #0x2a\n"
-      "ldxrw r0, r15\n"
+      "ldxrw r0, sp\n"
       "clrex\n"
-      "stxrw ip0, r1, r15\n"
-      "ldr r0, [r15], #8 !\n"
-      "add r0, r0, ip0\n"
-      "mov csp, r15\n"
+      "stxrw tmp, r1, sp\n"
+      "ldr r0, [sp], #8 !\n"
+      "add r0, r0, tmp\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -1072,66 +1072,66 @@
   EXPECT_EQ(0x42,
             EXECUTE_TEST_CODE_INT64(LoadAcquireStoreRelease, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "stp fp, lr, [r15, #-16]!\n"
-      "mov fp, r15\n"
-      "movz ip0, #0x7788\n"
-      "movk ip0, #0x5566 lsl 16\n"
-      "movk ip0, #0x3344 lsl 32\n"
-      "movk ip0, #0x1122 lsl 48\n"
-      "str ip0, [r15, #-8]!\n"
-      "ldar r1, r15\n"
-      "movz ip1, #0x7788\n"
-      "movk ip1, #0x5566 lsl 16\n"
-      "movk ip1, #0x3344 lsl 32\n"
-      "movk ip1, #0x1122 lsl 48\n"
-      "cmp r1, ip1\n"
+      "stp fp, lr, [sp, #-16]!\n"
+      "mov fp, sp\n"
+      "movz tmp, #0x7788\n"
+      "movk tmp, #0x5566 lsl 16\n"
+      "movk tmp, #0x3344 lsl 32\n"
+      "movk tmp, #0x1122 lsl 48\n"
+      "str tmp, [sp, #-8]!\n"
+      "ldar r1, sp\n"
+      "movz tmp2, #0x7788\n"
+      "movk tmp2, #0x5566 lsl 16\n"
+      "movk tmp2, #0x3344 lsl 32\n"
+      "movk tmp2, #0x1122 lsl 48\n"
+      "cmp r1, tmp2\n"
       "bne +164\n"
-      "add r15, r15, #0x8\n"
-      "movz ip0, #0x7788\n"
-      "movk ip0, #0x5566 lsl 16\n"
-      "movk ip0, #0x3344 lsl 32\n"
-      "movk ip0, #0x1122 lsl 48\n"
-      "str ip0, [r15, #-8]!\n"
-      "ldarw r1, r15\n"
-      "movz ip1, #0x7788\n"
-      "movk ip1, #0x5566 lsl 16\n"
-      "cmp r1, ip1\n"
+      "add sp, sp, #0x8\n"
+      "movz tmp, #0x7788\n"
+      "movk tmp, #0x5566 lsl 16\n"
+      "movk tmp, #0x3344 lsl 32\n"
+      "movk tmp, #0x1122 lsl 48\n"
+      "str tmp, [sp, #-8]!\n"
+      "ldarw r1, sp\n"
+      "movz tmp2, #0x7788\n"
+      "movk tmp2, #0x5566 lsl 16\n"
+      "cmp r1, tmp2\n"
       "bne +120\n"
-      "add r15, r15, #0x8\n"
-      "movz ip0, #0x0\n"
-      "str ip0, [r15, #-8]!\n"
+      "add sp, sp, #0x8\n"
+      "movz tmp, #0x0\n"
+      "str tmp, [sp, #-8]!\n"
       "movz r1, #0x7788\n"
       "movk r1, #0x5566 lsl 16\n"
       "movk r1, #0x3344 lsl 32\n"
       "movk r1, #0x1122 lsl 48\n"
-      "stlr r1, r15\n"
-      "ldr r1, [r15], #8 !\n"
-      "movz ip1, #0x7788\n"
-      "movk ip1, #0x5566 lsl 16\n"
-      "movk ip1, #0x3344 lsl 32\n"
-      "movk ip1, #0x1122 lsl 48\n"
-      "cmp r1, ip1\n"
+      "stlr r1, sp\n"
+      "ldr r1, [sp], #8 !\n"
+      "movz tmp2, #0x7788\n"
+      "movk tmp2, #0x5566 lsl 16\n"
+      "movk tmp2, #0x3344 lsl 32\n"
+      "movk tmp2, #0x1122 lsl 48\n"
+      "cmp r1, tmp2\n"
       "bne +60\n"
-      "movz ip0, #0x0\n"
-      "str ip0, [r15, #-8]!\n"
+      "movz tmp, #0x0\n"
+      "str tmp, [sp, #-8]!\n"
       "movz r1, #0x7788\n"
       "movk r1, #0x5566 lsl 16\n"
       "movk r1, #0x3344 lsl 32\n"
       "movk r1, #0x1122 lsl 48\n"
-      "stlrw r1, r15\n"
-      "ldr r1, [r15], #8 !\n"
-      "movz ip1, #0x7788\n"
-      "movk ip1, #0x5566 lsl 16\n"
-      "cmp r1, ip1\n"
+      "stlrw r1, sp\n"
+      "ldr r1, [sp], #8 !\n"
+      "movz tmp2, #0x7788\n"
+      "movk tmp2, #0x5566 lsl 16\n"
+      "cmp r1, tmp2\n"
       "bne +12\n"
       "movz r0, #0x42\n"
       "b +8\n"
       "movz r0, #0x84\n"
-      "mov r15, fp\n"
-      "ldp fp, lr, [r15], #16 !\n"
-      "mov csp, r15\n"
+      "mov sp, fp\n"
+      "ldp fp, lr, [sp], #16 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -1762,12 +1762,12 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov ip0, csp\n"
-      "sub ip1, csp, #0x1f\n"
-      "and csp, ip1, 0xfffffffffffffff0\n"
+      "mov tmp, csp\n"
+      "sub tmp2, csp, #0x1f\n"
+      "and csp, tmp2, 0xfffffffffffffff0\n"
       "mov r0, csp\n"
-      "sub r0, ip0, r0\n"
-      "mov csp, ip0\n"
+      "sub r0, tmp, r0\n"
+      "mov csp, tmp\n"
       "ret\n");
 }
 
@@ -2439,18 +2439,18 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v2, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v2, tmp\n"
       "fcmpd v1, v2\n"
       "beq +12\n"
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "ret\n");
 }
 
@@ -2546,18 +2546,18 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x2000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v2, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x2000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v2, tmp\n"
       "fcmpd v1, v2\n"
       "beq +12\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "ret\n");
 }
 
@@ -2598,18 +2598,18 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x6000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v2, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x6000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v2, tmp\n"
       "fcmpd v1, v2\n"
       "blt +12\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "ret\n");
 }
 
@@ -2632,19 +2632,19 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x6000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x2000 lsl 32\n"
-      "movk ip0, #0x406d lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x6000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x2000 lsl 32\n"
+      "movk tmp, #0x406d lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcmpd v1, #0.0\n"
       "bgt +16\n"
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "ret\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "ret\n");
 }
 
@@ -4276,11 +4276,11 @@
                   EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()),
                   0.0001f);
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0xa19c\n"
-      "movk ip0, #0xdc87 lsl 16\n"
-      "movk ip0, #0x6c87 lsl 32\n"
-      "movk ip0, #0x419d lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0xa19c\n"
+      "movk tmp, #0xdc87 lsl 16\n"
+      "movk tmp, #0x6c87 lsl 32\n"
+      "movk tmp, #0x419d lsl 48\n"
+      "fmovdr v0, tmp\n"
       "ret\n");
 }
 
@@ -4372,14 +4372,14 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "fstrd v1, [r15, #-8]!\n"
-      "fldrd v0, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "fstrd v1, [sp, #-8]!\n"
+      "fldrd v0, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -4402,16 +4402,16 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v2, v1\n"
-      "fstrs v2, [r15, #-8]!\n"
-      "fldrs v3, [r15], #8 !\n"
+      "fstrs v2, [sp, #-8]!\n"
+      "fldrs v3, [sp], #8 !\n"
       "fcvtds v0, v3\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -4441,22 +4441,22 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x10\n"
       "fmovd v1, 21.000000\n"
       "fmovd v2, 21.000000\n"
       "movz r1, #0x2a\n"
-      "str r1, [r15, #-8]!\n"
-      "fstrd v1, [r15, #-8]!\n"
-      "fstrd v2, [r15, #-8]!\n"
-      "fldrq v3, [r15], #16 !\n"
-      "ldr r0, [r15], #8 !\n"
-      "fstrq v3, [r15, #-16]!\n"
-      "fldrd v0, [r15], #8 !\n"
-      "fldrd v1, [r15], #8 !\n"
+      "str r1, [sp, #-8]!\n"
+      "fstrd v1, [sp, #-8]!\n"
+      "fstrd v2, [sp, #-8]!\n"
+      "fldrq v3, [sp], #16 !\n"
+      "ldr r0, [sp], #8 !\n"
+      "fstrq v3, [sp, #-16]!\n"
+      "fldrd v0, [sp], #8 !\n"
+      "fldrd v1, [sp], #8 !\n"
       "faddd v0, v0, v1\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -4470,9 +4470,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtzs r0, v0\n"
       "ret\n");
 }
@@ -4488,9 +4488,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0xc045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0xc045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtzsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4517,11 +4517,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8c40\n"
-      "movk ip0, #0x78b5 lsl 16\n"
-      "movk ip0, #0xaf1d lsl 32\n"
-      "movk ip0, #0xc415 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8c40\n"
+      "movk tmp, #0x78b5 lsl 16\n"
+      "movk tmp, #0xaf1d lsl 32\n"
+      "movk tmp, #0xc415 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtzs r0, v0\n"
       "ret\n");
 }
@@ -4536,10 +4536,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0x4202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0x4202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtzsw r0, v0\n"
       "ret\n");
 }
@@ -4555,10 +4555,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0xc202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0xc202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtzsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4574,9 +4574,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtps r0, v0\n"
       "ret\n");
 }
@@ -4592,9 +4592,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0xc045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0xc045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtpsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4610,11 +4610,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8c40\n"
-      "movk ip0, #0x78b5 lsl 16\n"
-      "movk ip0, #0xaf1d lsl 32\n"
-      "movk ip0, #0x4415 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8c40\n"
+      "movk tmp, #0x78b5 lsl 16\n"
+      "movk tmp, #0xaf1d lsl 32\n"
+      "movk tmp, #0x4415 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtps r0, v0\n"
       "ret\n");
 }
@@ -4629,11 +4629,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8c40\n"
-      "movk ip0, #0x78b5 lsl 16\n"
-      "movk ip0, #0xaf1d lsl 32\n"
-      "movk ip0, #0xc415 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8c40\n"
+      "movk tmp, #0x78b5 lsl 16\n"
+      "movk tmp, #0xaf1d lsl 32\n"
+      "movk tmp, #0xc415 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtps r0, v0\n"
       "ret\n");
 }
@@ -4648,10 +4648,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0x4202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0x4202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtpsw r0, v0\n"
       "ret\n");
 }
@@ -4667,10 +4667,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0xc202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0xc202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtpsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4686,9 +4686,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtms r0, v0\n"
       "ret\n");
 }
@@ -4704,9 +4704,9 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0xc045 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0xc045 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtmsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4722,11 +4722,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8c40\n"
-      "movk ip0, #0x78b5 lsl 16\n"
-      "movk ip0, #0xaf1d lsl 32\n"
-      "movk ip0, #0x4415 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8c40\n"
+      "movk tmp, #0x78b5 lsl 16\n"
+      "movk tmp, #0xaf1d lsl 32\n"
+      "movk tmp, #0x4415 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtms r0, v0\n"
       "ret\n");
 }
@@ -4741,11 +4741,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8c40\n"
-      "movk ip0, #0x78b5 lsl 16\n"
-      "movk ip0, #0xaf1d lsl 32\n"
-      "movk ip0, #0xc415 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8c40\n"
+      "movk tmp, #0x78b5 lsl 16\n"
+      "movk tmp, #0xaf1d lsl 32\n"
+      "movk tmp, #0xc415 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtms r0, v0\n"
       "ret\n");
 }
@@ -4760,10 +4760,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0x4202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0x4202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtmsw r0, v0\n"
       "ret\n");
 }
@@ -4779,10 +4779,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x2000 lsl 16\n"
-      "movk ip0, #0xa05f lsl 32\n"
-      "movk ip0, #0xc202 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x2000 lsl 16\n"
+      "movk tmp, #0xa05f lsl 32\n"
+      "movk tmp, #0xc202 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtmsw r0, v0\n"
       "sxtw r0, r0\n"
       "ret\n");
@@ -4831,8 +4831,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fabsd v0, v1\n"
       "ret\n");
 }
@@ -4847,8 +4847,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fabsd v0, v1\n"
       "ret\n");
 }
@@ -4863,8 +4863,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fnegd v0, v1\n"
       "ret\n");
 }
@@ -4879,8 +4879,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fnegd v0, v1\n"
       "ret\n");
 }
@@ -4895,8 +4895,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4050 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4050 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fsqrtd v0, v1\n"
       "ret\n");
 }
@@ -4912,8 +4912,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4055 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4055 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fmovd v2, 0.500000\n"
       "fmuld v0, v1, v2\n"
       "ret\n");
@@ -4930,8 +4930,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4055 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4055 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fmovd v2, 2.000000\n"
       "fdivd v0, v1, v2\n"
       "ret\n");
@@ -4948,9 +4948,9 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0xc000 lsl 32\n"
-      "movk ip0, #0x4044 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0xc000 lsl 32\n"
+      "movk tmp, #0x4044 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fmovd v2, 0.500000\n"
       "faddd v0, v1, v2\n"
       "ret\n");
@@ -4967,9 +4967,9 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fmovd v2, 0.500000\n"
       "fsubd v0, v1, v2\n"
       "ret\n");
@@ -4992,19 +4992,19 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "sub r15, r15, #0x8\n"
-      "add r2, r15, #0x1\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "sub sp, sp, #0x8\n"
+      "add r2, sp, #0x1\n"
       "fstrd v1, [r2, #-1]\n"
       "fldrd v0, [r2, #-1]\n"
-      "add r15, r15, #0x8\n"
-      "mov csp, r15\n"
+      "add sp, sp, #0x8\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5030,18 +5030,18 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "sub csp, csp, #0x100\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "fstrd v1, [r15, #-256]!\n"
-      "fldrd v0, [r15], #248 !\n"
-      "add r15, r15, #0x8\n"
-      "mov csp, r15\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "fstrd v1, [sp, #-256]!\n"
+      "fldrd v0, [sp], #248 !\n"
+      "add sp, sp, #0x8\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5062,19 +5062,19 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "sub r15, r15, #0x1000\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "fstrd v1, [r15, #4096]\n"
-      "add r15, r15, #0x1000\n"
-      "fldrd v0, [r15]\n"
-      "mov csp, r15\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "sub sp, sp, #0x1000\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "fstrd v1, [sp, #4096]\n"
+      "add sp, sp, #0x1000\n"
+      "fldrd v0, [sp]\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5099,21 +5099,21 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "movz r2, #0xfff8\n"
       "movk r2, #0xffff lsl 16\n"
-      "fstrd v1, [r15, r2 sxtw]\n"
-      "sub r15, r15, #0x8\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "fldrd v0, [r15]\n"
-      "add r15, r15, #0x8\n"
-      "mov csp, r15\n"
+      "fstrd v1, [sp, r2 sxtw]\n"
+      "sub sp, sp, #0x8\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "fldrd v0, [sp]\n"
+      "add sp, sp, #0x8\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5136,20 +5136,20 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "movz r2, #0xa\n"
-      "sub r15, r15, #0x50\n"
-      "and csp, r15, 0xfffffffffffffff0\n"
-      "fstrd v1, [r15, r2 uxtx scaled]\n"
-      "fldrd v0, [r15, r2 uxtx scaled]\n"
-      "add r15, r15, #0x50\n"
-      "mov csp, r15\n"
+      "sub sp, sp, #0x50\n"
+      "and csp, sp, 0xfffffffffffffff0\n"
+      "fstrd v1, [sp, r2 uxtx scaled]\n"
+      "fldrd v0, [sp, r2 uxtx scaled]\n"
+      "add sp, sp, #0x50\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5369,10 +5369,10 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "movz ip0, #0xc055 lsl 48\n"
-      "fmovdr v2, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0xc055 lsl 48\n"
+      "fmovdr v2, tmp\n"
       "fcvtsd v1, v1\n"
       "fcvtsd v2, v2\n"
       "veor v3, v3, v3\n"
@@ -5408,10 +5408,10 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
-      "movz ip0, #0xc055 lsl 48\n"
-      "fmovdr v2, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0xc055 lsl 48\n"
+      "fmovdr v2, tmp\n"
       "vinsd v3[0], v1[0]\n"
       "vinsd v3[1], v2[0]\n"
       "vnegd v4, v3\n"
@@ -5459,8 +5459,8 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5527,13 +5527,13 @@
   EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
-      "movz ip0, #0x0\n"
-      "fmovdr v5, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v5, tmp\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "fcvtsd v2, v2\n"
@@ -5596,8 +5596,8 @@
   EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5663,8 +5663,8 @@
   EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "fmovd v1, 1.000000\n"
       "fmovd v2, 2.000000\n"
       "fmovd v3, 3.000000\n"
@@ -5746,8 +5746,8 @@
   EXPECT_DISASSEMBLY(
       "fmovd v0, 2.000000\n"
       "fmovd v1, 3.000000\n"
-      "movz ip0, #0x0\n"
-      "fmovdr v5, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v5, tmp\n"
       "vinsd v4[0], v0[0]\n"
       "vinsd v4[1], v1[0]\n"
       "vsubd v5, v5, v4\n"
@@ -5845,16 +5845,16 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "fmovd v0, 21.000000\n"
       "vdupd v1, v0[0]\n"
       "sub csp, csp, #0x10\n"
-      "fstrq v1, [r15, #-16]!\n"
-      "fldrd v2, [r15], #8 !\n"
-      "fldrd v3, [r15], #8 !\n"
+      "fstrq v1, [sp, #-16]!\n"
+      "fldrd v2, [sp], #8 !\n"
+      "fldrd v3, [sp], #8 !\n"
       "faddd v0, v2, v3\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5893,17 +5893,17 @@
   EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "fmovd v0, 21.000000\n"
       "fcvtsd v0, v0\n"
       "vdups v1, v0[0]\n"
       "sub csp, csp, #0x10\n"
-      "fstrq v1, [r15, #-16]!\n"
-      "fldrs v3, [r15], #4 !\n"
-      "fldrs v2, [r15], #4 !\n"
-      "fldrs v1, [r15], #4 !\n"
-      "fldrs v0, [r15], #4 !\n"
+      "fstrq v1, [sp, #-16]!\n"
+      "fldrs v3, [sp], #4 !\n"
+      "fldrs v2, [sp], #4 !\n"
+      "fldrs v1, [sp], #4 !\n"
+      "fldrs v0, [sp], #4 !\n"
       "fcvtds v0, v0\n"
       "fcvtds v1, v1\n"
       "fcvtds v2, v2\n"
@@ -5911,7 +5911,7 @@
       "faddd v0, v1, v1\n"
       "faddd v0, v0, v2\n"
       "faddd v0, v0, v3\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5940,17 +5940,17 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       ""
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v5, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v5, tmp\n"
       "vinsd v1[1], v5[0]\n"
       "sub csp, csp, #0x10\n"
-      "fstrq v1, [r15, #-16]!\n"
-      "fldrd v2, [r15], #8 !\n"
-      "fldrd v3, [r15], #8 !\n"
+      "fstrq v1, [sp, #-16]!\n"
+      "fldrd v2, [sp], #8 !\n"
+      "fldrd v3, [sp], #8 !\n"
       "fmovdd v0, v3\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -5996,23 +5996,23 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
       "fmovd v0, 21.000000\n"
       "fcvtsd v0, v0\n"
       "vinss v1[3], v0[0]\n"
       "vinss v1[1], v0[0]\n"
-      "movz ip0, #0x0\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v0, tmp\n"
       "fcvtsd v0, v0\n"
       "vinss v1[2], v0[0]\n"
       "vinss v1[0], v0[0]\n"
       "sub csp, csp, #0x10\n"
-      "fstrq v1, [r15, #-16]!\n"
-      "fldrs v3, [r15], #4 !\n"
-      "fldrs v2, [r15], #4 !\n"
-      "fldrs v1, [r15], #4 !\n"
-      "fldrs v0, [r15], #4 !\n"
+      "fstrq v1, [sp, #-16]!\n"
+      "fldrs v3, [sp], #4 !\n"
+      "fldrs v2, [sp], #4 !\n"
+      "fldrs v1, [sp], #4 !\n"
+      "fldrs v0, [sp], #4 !\n"
       "fcvtds v0, v0\n"
       "fcvtds v1, v1\n"
       "fcvtds v2, v2\n"
@@ -6020,7 +6020,7 @@
       "faddd v0, v0, v1\n"
       "faddd v0, v0, v2\n"
       "faddd v0, v0, v3\n"
-      "mov csp, r15\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -6350,10 +6350,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "vdups v2, v0[0]\n"
@@ -6393,10 +6393,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vdupd v2, v0[0]\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
@@ -6437,10 +6437,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "vdups v2, v0[0]\n"
@@ -6480,10 +6480,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0xc045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0xc045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vdupd v2, v0[0]\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
@@ -6524,11 +6524,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "vdups v2, v0[0]\n"
@@ -6568,11 +6568,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4045 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4045 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4045 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4045 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vdupd v2, v0[0]\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
@@ -6664,9 +6664,9 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       "fmovd v0, 21.000000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4034 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4034 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vdupd v2, v0[0]\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
@@ -6758,9 +6758,9 @@
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
       "fmovd v0, 21.000000\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4035 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4035 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vdupd v2, v0[0]\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
@@ -6798,11 +6798,11 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4050 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4048 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4050 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4048 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v0, v0\n"
       "fcvtsd v1, v1\n"
       "veor v3, v3, v3\n"
@@ -6837,11 +6837,11 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x4050 lsl 48\n"
-      "fmovdr v0, ip0\n"
-      "movz ip0, #0x8000 lsl 32\n"
-      "movk ip0, #0x4048 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x4050 lsl 48\n"
+      "fmovdr v0, tmp\n"
+      "movz tmp, #0x8000 lsl 32\n"
+      "movk tmp, #0x4048 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "vinsd v3[0], v0[0]\n"
       "vinsd v3[1], v1[0]\n"
       "vsqrtd v4, v3\n"
@@ -6906,9 +6906,9 @@
   float res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x6000 lsl 32\n"
-      "movk ip0, #0x4062 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x6000 lsl 32\n"
+      "movk tmp, #0x4062 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v1, v1\n"
       "vinss v2[0], v1[0]\n"
       "vinss v2[1], v1[0]\n"
@@ -6976,11 +6976,11 @@
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(42.0, res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x8618\n"
-      "movk ip0, #0x1861 lsl 16\n"
-      "movk ip0, #0x6186 lsl 32\n"
-      "movk ip0, #0x3fb8 lsl 48\n"
-      "fmovdr v0, ip0\n"
+      "movz tmp, #0x8618\n"
+      "movk tmp, #0x1861 lsl 16\n"
+      "movk tmp, #0x6186 lsl 32\n"
+      "movk tmp, #0x3fb8 lsl 48\n"
+      "fmovdr v0, tmp\n"
       "fcvtsd v0, v0\n"
       "vdups v1, v0[0]\n"
       "vrecpes v2, v1\n"
@@ -7072,9 +7072,9 @@
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0x6000 lsl 32\n"
-      "movk ip0, #0x4062 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0x6000 lsl 32\n"
+      "movk tmp, #0x4062 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v1, v1\n"
       "vrsqrtes v0, v1\n"
       "fcvtds v0, v0\n"
@@ -7125,9 +7125,9 @@
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "movz ip0, #0xf1c0 lsl 32\n"
-      "movk ip0, #0x4101 lsl 48\n"
-      "fmovdr v1, ip0\n"
+      "movz tmp, #0xf1c0 lsl 32\n"
+      "movk tmp, #0x4101 lsl 48\n"
+      "fmovdr v1, tmp\n"
       "fcvtsd v1, v1\n"
       "vrsqrtes v0, v1\n"
       "vmuls v31, v0, v0\n"
@@ -7318,18 +7318,18 @@
   EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire,
                                                  test->entry(), 123));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "str r1, [r15, #-8]!\n"
+      "str r1, [sp, #-8]!\n"
       "movz r1, #0x0\n"
-      "str r1, [r15, #-8]!\n"
+      "str r1, [sp, #-8]!\n"
       "mov r1, r0\n"
       "movz r0, #0x0\n"
-      "stlr r1, r15\n"
-      "ldar r0, r15\n"
-      "ldr r1, [r15], #8 !\n"
-      "ldr r1, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "stlr r1, sp\n"
+      "ldar r0, sp\n"
+      "ldr r1, [sp], #8 !\n"
+      "ldr r1, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 
@@ -7355,22 +7355,22 @@
   EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire1024,
                                                  test->entry(), 123));
   EXPECT_DISASSEMBLY(
-      "mov r15, csp\n"
+      "mov sp, csp\n"
       "sub csp, csp, #0x1000\n"
-      "str r1, [r15, #-8]!\n"
+      "str r1, [sp, #-8]!\n"
       "movz r1, #0x0\n"
-      "str r1, [r15, #-8]!\n"
+      "str r1, [sp, #-8]!\n"
       "mov r1, r0\n"
       "movz r0, #0x0\n"
-      "sub r15, r15, #0x2000\n"
-      "add ip0, r15, #0x400\n"
-      "stlr r1, ip0\n"
-      "add ip1, r15, #0x400\n"
-      "ldar r0, ip1\n"
-      "add r15, r15, #0x2000\n"
-      "ldr r1, [r15], #8 !\n"
-      "ldr r1, [r15], #8 !\n"
-      "mov csp, r15\n"
+      "sub sp, sp, #0x2000\n"
+      "add tmp, sp, #0x400\n"
+      "stlr r1, tmp\n"
+      "add tmp2, sp, #0x400\n"
+      "ldar r0, tmp2\n"
+      "add sp, sp, #0x2000\n"
+      "ldr r1, [sp], #8 !\n"
+      "ldr r1, [sp], #8 !\n"
+      "mov csp, sp\n"
       "ret\n");
 }
 #endif
diff --git a/runtime/vm/compiler/assembler/assembler_x64_test.cc b/runtime/vm/compiler/assembler/assembler_x64_test.cc
index 761a858..c0acbff 100644
--- a/runtime/vm/compiler/assembler/assembler_x64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64_test.cc
@@ -510,8 +510,8 @@
   EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rax,1\n"
-      "movl r11,0xffffff11\n"
-      "push r11\n"
+      "movl tmp,0xffffff11\n"
+      "push tmp\n"
       "cmpb [rsp],0x11\n"
       "jz +7\n"
       "movl rax,0\n"
@@ -542,8 +542,8 @@
   EXPECT_DISASSEMBLY(
       "movl rax,1\n"
       "movl rcx,0\n"
-      "movl r11,0xffffff11\n"
-      "push r11\n"
+      "movl tmp,0xffffff11\n"
+      "push tmp\n"
       "testb [rsp],0x10\n"
       "cmovzq rax,rcx\n"
       "testb [rsp],0x20\n"
@@ -951,8 +951,8 @@
   __ addq(RAX, R8);
 
   __ movq(R10, Immediate(2));
-  __ movq(R11, Immediate(4));
-  __ imulq(R10, R11);
+  __ movq(TMP, Immediate(4));
+  __ imulq(R10, TMP);
   __ addq(RAX, R10);
 
   __ movq(R15, Immediate(2));
@@ -977,8 +977,8 @@
       "pop r9\n"
       "addq rax,r8\n"
       "movl r10,2\n"
-      "movl r11,4\n"
-      "imulq r10,r11\n"
+      "movl tmp,4\n"
+      "imulq r10,tmp\n"
       "addq rax,r10\n"
       "movl pp,2\n"
       "imulq pp,pp,4\n"
@@ -1012,8 +1012,8 @@
       "movq rax,0x1234567887654321\n"
       "movq rcx,0x0db4da5f7ef412b1\n"
       "imulq rax,rcx\n"
-      "movq r11,0x1234567887654321\n"
-      "imulq rcx,r11\n"
+      "movq tmp,0x1234567887654321\n"
+      "imulq rcx,tmp\n"
       "cmpq rax,rcx\n"
       "jz +7\n"
       "int3\n"
@@ -1327,8 +1327,8 @@
   typedef intptr_t (*MoveExtend)();
   EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl r11,0xffffffff\n"
-      "push r11\n"
+      "movl tmp,0xffffffff\n"
+      "push tmp\n"
       "push 0x7fffffff\n"
       "movsxdq rdx,[rsp+0x8]\n"
       "movsxdq rax,[rsp]\n"
@@ -1770,10 +1770,10 @@
       "addq r10,[rsp+0x10]\n"
       "movq rax,[rsp+0x8]\n"
       "adcq rax,[rsp+0x18]\n"
-      "pop r11\n"
-      "pop r11\n"
-      "pop r11\n"
-      "pop r11\n"
+      "pop tmp\n"
+      "pop tmp\n"
+      "pop tmp\n"
+      "pop tmp\n"
       "ret\n");
 }
 
@@ -1866,10 +1866,10 @@
       "subq r10,[rsp+0x10]\n"
       "movq rax,[rsp+0x8]\n"
       "sbbq rax,[rsp+0x18]\n"
-      "pop r11\n"
-      "pop r11\n"
-      "pop r11\n"
-      "pop r11\n"
+      "pop tmp\n"
+      "pop tmp\n"
+      "pop tmp\n"
+      "pop tmp\n"
       "ret\n");
 }
 
@@ -2391,8 +2391,8 @@
       "movl rcx,2\n"
       "shlq rdx,cl\n"
       "shldq rdx,r8,2\n"
-      "movq r11,0xf000000000000003\n"
-      "cmpq rdx,r11\n"
+      "movq tmp,0xf000000000000003\n"
+      "cmpq rdx,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rdx,0xff00000000000000\n"
@@ -2400,8 +2400,8 @@
       "movl rcx,2\n"
       "shlq rdx,cl\n"
       "shldq rdx,r8,cl\n"
-      "movq r11,0xf000000000000003\n"
-      "cmpq rdx,r11\n"
+      "movq tmp,0xf000000000000003\n"
+      "cmpq rdx,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rdx,0xff00000000000000\n"
@@ -2409,8 +2409,8 @@
       "movl rcx,2\n"
       "shrq rdx,cl\n"
       "shrdq rdx,r8,cl\n"
-      "movq r11,0xcff0000000000000\n"
-      "cmpq rdx,r11\n"
+      "movq tmp,0xcff0000000000000\n"
+      "cmpq rdx,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0\n"
@@ -2697,31 +2697,31 @@
       "movl rax,1\n"
       "shlq rax,63\n"
       "sarq rax,3\n"
-      "movq r11,0xf000000000000000\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0xf000000000000000\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,63\n"
       "sarq rax,cl\n"
-      "movq r11,0xf000000000000000\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0xf000000000000000\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "push pp\n"
       "movq pp,0xf000000000000001\n"
       "andq pp,-1\n"
-      "movq r11,0x8000000000000001\n"
-      "andq pp,r11\n"
+      "movq tmp,0x8000000000000001\n"
+      "andq pp,tmp\n"
       "orq pp,2\n"
-      "movq r11,0xf800000000000000\n"
-      "orq pp,r11\n"
+      "movq tmp,0xf800000000000000\n"
+      "orq pp,tmp\n"
       "xorq pp,1\n"
-      "movq r11,0x0800000000000000\n"
-      "xorq pp,r11\n"
-      "movq r11,0xf000000000000002\n"
-      "cmpq pp,r11\n"
+      "movq tmp,0x0800000000000000\n"
+      "xorq pp,tmp\n"
+      "movq tmp,0xf000000000000002\n"
+      "cmpq pp,tmp\n"
       "jz +7\n"
       "int3\n"
       "andl pp,2\n"
@@ -3080,7 +3080,7 @@
   typedef int (*CallSimpleLeafCode)();
   EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())());
   EXPECT_DISASSEMBLY_ENDS_WITH(
-      "call r11\n"
+      "call tmp\n"
       "addq rsp,8\n"
       "ret\n");
 }
@@ -3100,7 +3100,7 @@
 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) {
   typedef int (*JumpSimpleLeafCode)();
   EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())());
-  EXPECT_DISASSEMBLY_ENDS_WITH("jmp r11\n");
+  EXPECT_DISASSEMBLY_ENDS_WITH("jmp tmp\n");
 }
 
 ASSEMBLER_TEST_GENERATE(JumpIndirect, assembler) {
@@ -3185,7 +3185,7 @@
       "movss r8,xmm7\n"
       "movss r9,xmm8\n"
       "movss r10,xmm9\n"
-      "movss r11,xmm10\n"
+      "movss tmp,xmm10\n"
       "movss r12,xmm11\n"
       "movss r13,xmm12\n"
       "movss thr,xmm13\n"
@@ -3209,7 +3209,7 @@
       "movss thr,xmm15\n"
       "movss r13,xmm14\n"
       "movss r12,xmm13\n"
-      "movss r11,xmm12\n"
+      "movss tmp,xmm12\n"
       "movss r10,xmm11\n"
       "movss r9,xmm10\n"
       "movss r8,xmm9\n"
@@ -3384,8 +3384,8 @@
   EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm10,[rax]\n"
-      "movq r11,[thr+0x...]\n"
-      "xorpd xmm10,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "xorpd xmm10,[tmp]\n"
       "movaps xmm0,xmm10\n"
       "pop thr\n"
       "pop pp\n"
@@ -3413,8 +3413,8 @@
   EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm10,[rax]\n"
-      "movq r11,[thr+0x...]\n"
-      "movups xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "movups xmm0,[tmp]\n"
       "andpd xmm0,xmm10\n"
       "pop thr\n"
       "pop pp\n"
@@ -4066,8 +4066,8 @@
       "movl rax,0x4144cccd\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
-      "xorps xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "xorps xmm0,[tmp]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "pop thr\n"
       "pop pp\n"
@@ -4103,8 +4103,8 @@
       "movl rax,-0x3e8b3333\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
-      "andps xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "andps xmm0,[tmp]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "pop thr\n"
       "pop pp\n"
@@ -4138,8 +4138,8 @@
       "movl rax,0x4144cccd\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
-      "andps xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "andps xmm0,[tmp]\n"
       "shufps xmm0,xmm0 [ff]\n"
       "pop thr\n"
       "pop pp\n"
@@ -4288,8 +4288,8 @@
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm9,[rax]\n"
-      "movq r11,[thr+0x...]\n"
-      "movups xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "movups xmm0,[tmp]\n"
       "xorps xmm0,xmm9\n"
       "push rax\n"
       "movss [rsp],xmm0\n"
@@ -4756,10 +4756,10 @@
   double res = reinterpret_cast<Int32ToDoubleConversion>(test->entry())();
   EXPECT_FLOAT_EQ(-2.0, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "movq r11,0x1111111100000006\n"
-      "cvtsi2sd xmm0,r11\n"
-      "movq r11,0x2222222200000008\n"
-      "cvtsi2sd xmm8,r11\n"
+      "movq tmp,0x1111111100000006\n"
+      "cvtsi2sd xmm0,tmp\n"
+      "movq tmp,0x2222222200000008\n"
+      "cvtsi2sd xmm8,tmp\n"
       "subsd xmm0,xmm8\n"
       "ret\n");
 }
@@ -4823,8 +4823,8 @@
       "movsd xmm9,[rsp]\n"
       "pop rax\n"
       "cvttsd2siq rax,xmm9\n"
-      "movq r11,0x8000000000000000\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0x8000000000000000\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rax,0x4258727cda000000\n"
@@ -4904,8 +4904,8 @@
       "movsd xmm9,[rsp]\n"
       "pop rax\n"
       "cvttsd2sil rax,xmm9\n"
-      "movl r11,0x80000000\n"
-      "cmpq rax,r11\n"
+      "movl tmp,0x80000000\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rax,0xc045000000000000\n"
@@ -4914,8 +4914,8 @@
       "pop rax\n"
       "movq r10,-1\n"
       "cvttsd2sil r10,xmm9\n"
-      "movl r11,0xffffffd6\n"
-      "cmpq r10,r11\n"
+      "movl tmp,0xffffffd6\n"
+      "cmpq r10,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rax,0x4045000000000000\n"
@@ -4991,8 +4991,8 @@
       "cmpq rcx,0x1e\n"
       "jnz +63\n"
       "push rax\n"
-      "movq r11,[pp+0xf]\n"
-      "movq [rsp],r11\n"
+      "movq tmp,[pp+0xf]\n"
+      "movq [rsp],tmp\n"
       "pop rcx\n"
       "cmpq rcx,[pp+0xf]\n"
       "jnz +43\n"
@@ -5035,8 +5035,8 @@
       "cmpl rcx,0x1e\n"
       "jnz +62\n"
       "push rax\n"
-      "movq r11,[pp+0xf]\n"
-      "movq [rsp],r11\n"
+      "movq tmp,[pp+0xf]\n"
+      "movq [rsp],tmp\n"
       "pop rcx\n"
       "cmpl rcx,[pp+0xf]\n"
       "jnz +42\n"
@@ -5464,8 +5464,8 @@
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
       "movq pp,[r12+0x27]\n"
-      "movq r11,[thr+0x...]\n"
-      "andpd xmm0,[r11]\n"
+      "movq tmp,[thr+0x...]\n"
+      "andpd xmm0,[tmp]\n"
       "pop thr\n"
       "pop pp\n"
       "pop r12\n"
@@ -5832,8 +5832,8 @@
   EXPECT_EQ(1, reinterpret_cast<BitTest>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rax,4\n"
-      "movl r11,2\n"
-      "btq rax,r11\n"
+      "movl tmp,2\n"
+      "btq rax,tmp\n"
       "jc +7\n"
       "int3\n"
       "movl rax,1\n"
@@ -5855,8 +5855,8 @@
   typedef int (*BitTestImmediate)();
   EXPECT_EQ(1, reinterpret_cast<BitTestImmediate>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl r11,0x20\n"
-      "bt r11,5\n"
+      "movl tmp,0x20\n"
+      "bt tmp,5\n"
       "jc +7\n"
       "int3\n"
       "movl rax,1\n"
@@ -6007,44 +6007,44 @@
   EXPECT_DISASSEMBLY(
       "movl rax,0x2a\n"
       "imulq rax,rax,0x3b9aca00\n"
-      "movq r11,0x00000009c7652400\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0x00000009c7652400\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x2a\n"
       "imull rax,rax,0x3b9aca00\n"
-      "movl r11,0xc7652400\n"
-      "cmpq rax,r11\n"
+      "movl tmp,0xc7652400\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x3b9aca00\n"
-      "movq r11,0x000000098bca5a00\n"
-      "addq rax,r11\n"
-      "movq r11,0x00000009c7652400\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0x000000098bca5a00\n"
+      "addq rax,tmp\n"
+      "movq tmp,0x00000009c7652400\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x3b9aca00\n"
       "addl rax,0x3b9aca00\n"
       "addl rax,0x3b9aca00\n"
       "addl rax,0x3b9aca00\n"
-      "movl r11,0xee6b2800\n"
-      "cmpq rax,r11\n"
+      "movl tmp,0xee6b2800\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x3b9aca00\n"
       "subl rax,0x4d2fa200\n"
       "addl rax,0x3b9aca00\n"
       "subl rax,0x3b9aca00\n"
-      "movl r11,0xee6b2800\n"
-      "cmpq rax,r11\n"
+      "movl tmp,0xee6b2800\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x3b9aca00\n"
-      "movq r11,0x0000000a02ffee00\n"
-      "subq rax,r11\n"
-      "movq r11,0xfffffff6389adc00\n"
-      "cmpq rax,r11\n"
+      "movq tmp,0x0000000a02ffee00\n"
+      "subq rax,tmp\n"
+      "movq tmp,0xfffffff6389adc00\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movq rax,-0x3b9aca00\n"
@@ -6058,8 +6058,8 @@
       "subl rax,0x4d2fa200\n"
       "subl rax,0x3b9aca00\n"
       "addl rax,0x3b9aca00\n"
-      "movl r11,0xee6b2800\n"
-      "cmpq rax,r11\n"
+      "movl tmp,0xee6b2800\n"
+      "cmpq rax,tmp\n"
       "jz +7\n"
       "int3\n"
       "movl rax,0x2a\n"
diff --git a/runtime/vm/compiler/ffi/native_location.cc b/runtime/vm/compiler/ffi/native_location.cc
index f757a31..7b362fd 100644
--- a/runtime/vm/compiler/ffi/native_location.cc
+++ b/runtime/vm/compiler/ffi/native_location.cc
@@ -277,14 +277,14 @@
 
 void NativeRegistersLocation::PrintTo(BaseTextBuffer* f) const {
   if (num_regs() == 1) {
-    f->Printf("%s", RegisterNames::RegisterName(regs_->At(0)));
+    f->Printf("%s", RegisterNames::RegisterAbiName(regs_->At(0)));
   } else {
     f->AddString("(");
     for (intptr_t i = 0; i < num_regs(); i++) {
       if (i != 0) {
         f->Printf(", ");
       }
-      f->Printf("%s", RegisterNames::RegisterName(regs_->At(i)));
+      f->Printf("%s", RegisterNames::RegisterAbiName(regs_->At(i)));
     }
     f->AddString(")");
   }
diff --git a/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv32_linux.expect
index f5fde9e..5dcb075 100644
--- a/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv32_linux.expect
@@ -7,8 +7,8 @@
 fa6 double
 fa7 double
 (a0, a1) int64[double]
-(a2, tmp) int64[double]
-(tmp2, pp) int64[double]
+(a2, a3) int64[double]
+(a4, a5) int64[double]
 (a6, a7) int64[double]
 S+0 double
 S+8 double
diff --git a/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv64_linux.expect
index 810b278..a46f1fb 100644
--- a/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/doublex20/riscv64_linux.expect
@@ -9,9 +9,9 @@
 a0 int64[double]
 a1 int64[double]
 a2 int64[double]
-tmp int64[double]
-tmp2 int64[double]
-pp int64[double]
+a3 int64[double]
+a4 int64[double]
+a5 int64[double]
 a6 int64[double]
 a7 int64[double]
 S+0 double
diff --git a/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv32_linux.expect
index 663376f..edb61cc 100644
--- a/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv32_linux.expect
@@ -7,8 +7,8 @@
 fa6 float
 fa7 float
 (a0, a1) int64[float]
-(a2, tmp) int64[float]
-(tmp2, pp) int64[float]
+(a2, a3) int64[float]
+(a4, a5) int64[float]
 (a6, a7) int64[float]
 S+0 float
 S+4 float
diff --git a/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv64_linux.expect
index 4531dae..b8030e0 100644
--- a/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/floatx20/riscv64_linux.expect
@@ -9,9 +9,9 @@
 a0 int64[float]
 a1 int64[float]
 a2 int64[float]
-tmp int64[float]
-tmp2 int64[float]
-pp int64[float]
+a3 int64[float]
+a4 int64[float]
+a5 int64[float]
 a6 int64[float]
 a7 int64[float]
 S+0 float
diff --git a/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv32_linux.expect
index 84bc85d..71c8bd7 100644
--- a/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv32_linux.expect
@@ -1,9 +1,9 @@
 a0 int32[int8]
 a1 int32[int8]
 a2 int32[int8]
-tmp int32[int8]
-tmp2 int32[int8]
-pp int32[int8]
+a3 int32[int8]
+a4 int32[int8]
+a5 int32[int8]
 a6 int32[int8]
 a7 int32[int8]
 S+0 int8
diff --git a/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv64_linux.expect
index 84bc85d..71c8bd7 100644
--- a/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/int8x10/riscv64_linux.expect
@@ -1,9 +1,9 @@
 a0 int32[int8]
 a1 int32[int8]
 a2 int32[int8]
-tmp int32[int8]
-tmp2 int32[int8]
-pp int32[int8]
+a3 int32[int8]
+a4 int32[int8]
+a5 int32[int8]
 a6 int32[int8]
 a7 int32[int8]
 S+0 int8
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv32_linux.expect
index fda1302..2f0c36f 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv32_linux.expect
@@ -1,8 +1,8 @@
 P(a0 uint32) Struct(size: 12)
 P(a1 uint32) Struct(size: 12)
 P(a2 uint32) Struct(size: 12)
-P(tmp uint32) Struct(size: 12)
-P(tmp2 uint32) Struct(size: 12)
-P(pp uint32) Struct(size: 12)
+P(a3 uint32) Struct(size: 12)
+P(a4 uint32) Struct(size: 12)
+P(a5 uint32) Struct(size: 12)
 =>
 (a0, a1) int64
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv64_linux.expect
index ad37cf7..c9dc492 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct12bytesFloatx6/riscv64_linux.expect
@@ -1,6 +1,6 @@
 M(a0 int64, a1 int64) Struct(size: 12)
-M(a2 int64, tmp int64) Struct(size: 12)
-M(tmp2 int64, pp int64) Struct(size: 12)
+M(a2 int64, a3 int64) Struct(size: 12)
+M(a4 int64, a5 int64) Struct(size: 12)
 M(a6 int64, a7 int64) Struct(size: 12)
 M(S+0 int64, S+8 int64) Struct(size: 12)
 M(S+16 int64, S+24 int64) Struct(size: 12)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv32_linux.expect
index 664653c..4824868 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv32_linux.expect
@@ -1,9 +1,9 @@
 P(a1 uint32) Struct(size: 16)
 fa0 float
 P(a2 uint32) Struct(size: 16)
-P(tmp uint32) Struct(size: 16)
-P(tmp2 uint32) Struct(size: 16)
-P(pp uint32) Struct(size: 16)
+P(a3 uint32) Struct(size: 16)
+P(a4 uint32) Struct(size: 16)
+P(a5 uint32) Struct(size: 16)
 P(a6 uint32) Struct(size: 16)
 P(a7 uint32) Struct(size: 16)
 P(S+0 uint32) Struct(size: 16)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv64_linux.expect
index 6f7ef5b..620273c 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct16bytesHomogenousx10/riscv64_linux.expect
@@ -1,7 +1,7 @@
 M(a0 int64, a1 int64) Struct(size: 16)
 fa0 float
-M(a2 int64, tmp int64) Struct(size: 16)
-M(tmp2 int64, pp int64) Struct(size: 16)
+M(a2 int64, a3 int64) Struct(size: 16)
+M(a4 int64, a5 int64) Struct(size: 16)
 M(a6 int64, a7 int64) Struct(size: 16)
 M(S+0 int64, S+8 int64) Struct(size: 16)
 M(S+16 int64, S+24 int64) Struct(size: 16)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv32_linux.expect
index d326d70..39e23b8c 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv32_linux.expect
@@ -1,9 +1,9 @@
 M(a0 uint32) Struct(size: 3)
 M(a1 uint32) Struct(size: 3)
 M(a2 uint32) Struct(size: 3)
-M(tmp uint32) Struct(size: 3)
-M(tmp2 uint32) Struct(size: 3)
-M(pp uint32) Struct(size: 3)
+M(a3 uint32) Struct(size: 3)
+M(a4 uint32) Struct(size: 3)
+M(a5 uint32) Struct(size: 3)
 M(a6 uint32) Struct(size: 3)
 M(a7 uint32) Struct(size: 3)
 M(S+0 uint32) Struct(size: 3)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv64_linux.expect
index 3f71e45..b67660c 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct3bytesx10/riscv64_linux.expect
@@ -1,9 +1,9 @@
 M(a0 int64) Struct(size: 3)
 M(a1 int64) Struct(size: 3)
 M(a2 int64) Struct(size: 3)
-M(tmp int64) Struct(size: 3)
-M(tmp2 int64) Struct(size: 3)
-M(pp int64) Struct(size: 3)
+M(a3 int64) Struct(size: 3)
+M(a4 int64) Struct(size: 3)
+M(a5 int64) Struct(size: 3)
 M(a6 int64) Struct(size: 3)
 M(a7 int64) Struct(size: 3)
 M(S+0 int64) Struct(size: 3)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv32_linux.expect
index 8c5778d..14ea892 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv32_linux.expect
@@ -1,6 +1,6 @@
 M(a0 uint32, a1 uint32) Struct(size: 8)
-M(a2 uint32, tmp uint32) Struct(size: 8)
-M(tmp2 uint32, pp uint32) Struct(size: 8)
+M(a2 uint32, a3 uint32) Struct(size: 8)
+M(a4 uint32, a5 uint32) Struct(size: 8)
 M(a6 uint32, a7 uint32) Struct(size: 8)
 M(S+0 uint32, S+4 uint32) Struct(size: 8)
 M(S+8 uint32, S+12 uint32) Struct(size: 8)
diff --git a/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv64_linux.expect
index 7bd998e..b0e7ecb 100644
--- a/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/struct8bytesPackedx10/riscv64_linux.expect
@@ -1,9 +1,9 @@
 M(a0 int64) Struct(size: 8)
 M(a1 int64) Struct(size: 8)
 M(a2 int64) Struct(size: 8)
-M(tmp int64) Struct(size: 8)
-M(tmp2 int64) Struct(size: 8)
-M(pp int64) Struct(size: 8)
+M(a3 int64) Struct(size: 8)
+M(a4 int64) Struct(size: 8)
+M(a5 int64) Struct(size: 8)
 M(a6 int64) Struct(size: 8)
 M(a7 int64) Struct(size: 8)
 M(S+0 int64) Struct(size: 8)
diff --git a/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv32_linux.expect
index da14e5c..d84073a 100644
--- a/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv32_linux.expect
@@ -1,9 +1,9 @@
 M(a0 int32[int8], fa0 double) Struct(size: 9)
 M(a1 int32[int8], fa1 double) Struct(size: 9)
 M(a2 int32[int8], fa2 double) Struct(size: 9)
-M(tmp int32[int8], fa3 double) Struct(size: 9)
-M(tmp2 int32[int8], fa4 double) Struct(size: 9)
-M(pp int32[int8], fa5 double) Struct(size: 9)
+M(a3 int32[int8], fa3 double) Struct(size: 9)
+M(a4 int32[int8], fa4 double) Struct(size: 9)
+M(a5 int32[int8], fa5 double) Struct(size: 9)
 M(a6 int32[int8], fa6 double) Struct(size: 9)
 M(a7 int32[int8], fa7 double) Struct(size: 9)
 P(S+0 uint32) Struct(size: 9)
diff --git a/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv64_linux.expect
index d4389d5..eee3c90 100644
--- a/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/structPacked/riscv64_linux.expect
@@ -1,9 +1,9 @@
 M(a0 int32[int8], fa0 double) Struct(size: 9)
 M(a1 int32[int8], fa1 double) Struct(size: 9)
 M(a2 int32[int8], fa2 double) Struct(size: 9)
-M(tmp int32[int8], fa3 double) Struct(size: 9)
-M(tmp2 int32[int8], fa4 double) Struct(size: 9)
-M(pp int32[int8], fa5 double) Struct(size: 9)
+M(a3 int32[int8], fa3 double) Struct(size: 9)
+M(a4 int32[int8], fa4 double) Struct(size: 9)
+M(a5 int32[int8], fa5 double) Struct(size: 9)
 M(a6 int32[int8], fa6 double) Struct(size: 9)
 M(a7 int32[int8], fa7 double) Struct(size: 9)
 M(S+0 int64, S+8 int64) Struct(size: 9)
diff --git a/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv32_linux.expect
index 7a6a9ef..f60a8fe 100644
--- a/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv32_linux.expect
@@ -1,8 +1,8 @@
 P(a1 uint32) Union(size: 16)
 P(a2 uint32) Union(size: 16)
-P(tmp uint32) Union(size: 16)
-P(tmp2 uint32) Union(size: 16)
-P(pp uint32) Union(size: 16)
+P(a3 uint32) Union(size: 16)
+P(a4 uint32) Union(size: 16)
+P(a5 uint32) Union(size: 16)
 P(a6 uint32) Union(size: 16)
 P(a7 uint32) Union(size: 16)
 P(S+0 uint32) Union(size: 16)
diff --git a/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv64_linux.expect
index 35d836b..94bc67b 100644
--- a/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/union16bytesHomogenousx10/riscv64_linux.expect
@@ -1,6 +1,6 @@
 M(a0 int64, a1 int64) Union(size: 16)
-M(a2 int64, tmp int64) Union(size: 16)
-M(tmp2 int64, pp int64) Union(size: 16)
+M(a2 int64, a3 int64) Union(size: 16)
+M(a4 int64, a5 int64) Union(size: 16)
 M(a6 int64, a7 int64) Union(size: 16)
 M(S+0 int64, S+8 int64) Union(size: 16)
 M(S+16 int64, S+24 int64) Union(size: 16)
diff --git a/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv32_linux.expect b/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv32_linux.expect
index 95a498c..9ac54e5 100644
--- a/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv32_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv32_linux.expect
@@ -1,6 +1,6 @@
 M(a0 uint32, a1 uint32) Union(size: 5)
-M(a2 uint32, tmp uint32) Union(size: 5)
-M(tmp2 uint32, pp uint32) Union(size: 5)
+M(a2 uint32, a3 uint32) Union(size: 5)
+M(a4 uint32, a5 uint32) Union(size: 5)
 M(a6 uint32, a7 uint32) Union(size: 5)
 M(S+0 uint32, S+4 uint32) Union(size: 5)
 M(S+8 uint32, S+12 uint32) Union(size: 5)
diff --git a/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv64_linux.expect b/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv64_linux.expect
index 9165726..6116be3 100644
--- a/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv64_linux.expect
+++ b/runtime/vm/compiler/ffi/unit_tests/union5bytesPackedx10/riscv64_linux.expect
@@ -1,9 +1,9 @@
 M(a0 int64) Union(size: 5)
 M(a1 int64) Union(size: 5)
 M(a2 int64) Union(size: 5)
-M(tmp int64) Union(size: 5)
-M(tmp2 int64) Union(size: 5)
-M(pp int64) Union(size: 5)
+M(a3 int64) Union(size: 5)
+M(a4 int64) Union(size: 5)
+M(a5 int64) Union(size: 5)
 M(a6 int64) Union(size: 5)
 M(a7 int64) Union(size: 5)
 M(S+0 int64) Union(size: 5)
diff --git a/runtime/vm/constants.h b/runtime/vm/constants.h
index 26514bf..b56c7e1 100644
--- a/runtime/vm/constants.h
+++ b/runtime/vm/constants.h
@@ -41,6 +41,10 @@
     ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
     return cpu_reg_names[reg];
   }
+  static const char* RegisterAbiName(Register reg) {
+    ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
+    return cpu_reg_abi_names[reg];
+  }
   static const char* FpuRegisterName(FpuRegister reg) {
     ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
     return fpu_reg_names[reg];
diff --git a/runtime/vm/constants_arm.cc b/runtime/vm/constants_arm.cc
index 03e790f..b0e289a 100644
--- a/runtime/vm/constants_arm.cc
+++ b/runtime/vm/constants_arm.cc
@@ -14,11 +14,21 @@
 
 const char* const cpu_reg_names[kNumberOfCpuRegisters] = {
 #if defined(DART_TARGET_OS_MACOS) || defined(DART_TARGET_OS_MACOS_IOS)
-    "r0", "r1", "r2",  "r3",  "r4", "pp", "r6", "fp",
-    "r8", "r9", "thr", "r11", "ip", "sp", "lr", "pc",
+    "r0", "r1", "r2",  "r3",  "r4",  "pp", "r6", "fp",
+    "r8", "r9", "thr", "r11", "tmp", "sp", "lr", "pc",
 #else
-    "r0", "r1", "r2",  "r3", "r4", "pp", "r6", "r7",
-    "r8", "r9", "thr", "fp", "ip", "sp", "lr", "pc",
+    "r0", "r1", "r2",  "r3", "r4",  "pp", "r6", "r7",
+    "r8", "r9", "thr", "fp", "tmp", "sp", "lr", "pc",
+#endif
+};
+
+const char* const cpu_reg_abi_names[kNumberOfCpuRegisters] = {
+#if defined(DART_TARGET_OS_MACOS) || defined(DART_TARGET_OS_MACOS_IOS)
+    "r0", "r1", "r2",  "r3",  "r4", "r5", "r6", "fp",
+    "r8", "r9", "r10", "r11", "ip", "sp", "lr", "pc",
+#else
+    "r0", "r1", "r2",  "r3", "r4", "r5", "r6", "r7",
+    "r8", "r9", "r10", "fp", "ip", "sp", "lr", "pc",
 #endif
 };
 
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index b7f2374..d560e44 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -294,6 +294,7 @@
 const FpuRegister kNoFpuRegister = kNoQRegister;
 
 extern const char* const cpu_reg_names[kNumberOfCpuRegisters];
+extern const char* const cpu_reg_abi_names[kNumberOfCpuRegisters];
 extern const char* const fpu_reg_names[kNumberOfFpuRegisters];
 extern const char* const fpu_s_reg_names[kNumberOfSRegisters];
 extern const char* const fpu_d_reg_names[kNumberOfDRegisters];
diff --git a/runtime/vm/constants_arm64.cc b/runtime/vm/constants_arm64.cc
index c10999b..111e74e 100644
--- a/runtime/vm/constants_arm64.cc
+++ b/runtime/vm/constants_arm64.cc
@@ -11,9 +11,16 @@
 namespace dart {
 
 const char* const cpu_reg_names[kNumberOfCpuRegisters] = {
+    "r0",  "r1",   "r2",  "r3",  "r4",   "r5",  "r6",  "r7",
+    "r8",  "r9",   "r10", "r11", "r12",  "r13", "r14", "sp",
+    "tmp", "tmp2", "r18", "r19", "r20",  "r21", "nr",  "r23",
+    "r24", "r25",  "thr", "pp",  "mask", "fp",  "lr",  "csp",
+};
+
+const char* const cpu_reg_abi_names[kNumberOfCpuRegisters] = {
     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
-    "r11", "r12", "r13", "r14", "r15", "ip0", "ip1", "r18", "r19", "r20", "r21",
-    "nr",  "r23", "r24", "r25", "r26", "pp",  "r28", "fp",  "lr",  "r31",
+    "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
+    "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "sp",
 };
 
 const char* const fpu_reg_names[kNumberOfFpuRegisters] = {
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index b2f4e6e..9b4df71 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -129,6 +129,7 @@
 const FpuRegister kNoFpuRegister = kNoVRegister;
 
 extern const char* const cpu_reg_names[kNumberOfCpuRegisters];
+extern const char* const cpu_reg_abi_names[kNumberOfCpuRegisters];
 extern const char* const fpu_reg_names[kNumberOfFpuRegisters];
 
 // Register aliases.
diff --git a/runtime/vm/constants_ia32.cc b/runtime/vm/constants_ia32.cc
index bbe4feb..057264d 100644
--- a/runtime/vm/constants_ia32.cc
+++ b/runtime/vm/constants_ia32.cc
@@ -13,6 +13,9 @@
 const char* const cpu_reg_names[kNumberOfCpuRegisters] = {
     "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
 
+const char* const cpu_reg_abi_names[kNumberOfCpuRegisters] = {
+    "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
+
 const char* const fpu_reg_names[kNumberOfXmmRegisters] = {
     "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"};
 
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index d06f97f..061771d 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -67,6 +67,7 @@
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
 extern const char* const cpu_reg_names[kNumberOfCpuRegisters];
+extern const char* const cpu_reg_abi_names[kNumberOfCpuRegisters];
 extern const char* const fpu_reg_names[kNumberOfXmmRegisters];
 
 // Register aliases.
diff --git a/runtime/vm/constants_riscv.cc b/runtime/vm/constants_riscv.cc
index 6f694e9..7c9b6ed 100644
--- a/runtime/vm/constants_riscv.cc
+++ b/runtime/vm/constants_riscv.cc
@@ -23,6 +23,12 @@
     "s6",   "s7", "s8",  "s9",   "null", "mask", "t3", "t4", "t5", "t6",
 };
 
+const char* const cpu_reg_abi_names[kNumberOfCpuRegisters] = {
+    "zero", "ra", "sp", "gp", "tp",  "t0",  "t1", "t2", "s0", "s1", "a0",
+    "a1",   "a2", "a3", "a4", "a5",  "a6",  "a7", "s2", "s3", "s4", "s5",
+    "s6",   "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6",
+};
+
 const char* const fpu_reg_names[kNumberOfFpuRegisters] = {
     "ft0", "ft1", "ft2",  "ft3",  "ft4", "ft5", "ft6",  "ft7",
     "fs0", "fs1", "fa0",  "fa1",  "fa2", "fa3", "fa4",  "fa5",
diff --git a/runtime/vm/constants_riscv.h b/runtime/vm/constants_riscv.h
index a03694c..645b69e 100644
--- a/runtime/vm/constants_riscv.h
+++ b/runtime/vm/constants_riscv.h
@@ -143,6 +143,7 @@
 typedef double fpu_register_t;
 
 extern const char* const cpu_reg_names[kNumberOfCpuRegisters];
+extern const char* const cpu_reg_abi_names[kNumberOfCpuRegisters];
 extern const char* const fpu_reg_names[kNumberOfFpuRegisters];
 
 // Register aliases.
diff --git a/runtime/vm/constants_x64.cc b/runtime/vm/constants_x64.cc
index b80a77a..7e03cb6 100644
--- a/runtime/vm/constants_x64.cc
+++ b/runtime/vm/constants_x64.cc
@@ -12,7 +12,11 @@
 
 const char* const cpu_reg_names[kNumberOfCpuRegisters] = {
     "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
-    "r8",  "r9",  "r10", "r11", "r12", "r13", "thr", "pp"};
+    "r8",  "r9",  "r10", "tmp", "r12", "r13", "thr", "pp"};
+
+const char* const cpu_reg_abi_names[kNumberOfCpuRegisters] = {
+    "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
+    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15"};
 
 const char* const fpu_reg_names[kNumberOfXmmRegisters] = {
     "xmm0", "xmm1", "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index aae0a4c..a880647 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -99,6 +99,7 @@
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
 extern const char* const cpu_reg_names[kNumberOfCpuRegisters];
+extern const char* const cpu_reg_abi_names[kNumberOfCpuRegisters];
 extern const char* const fpu_reg_names[kNumberOfXmmRegisters];
 
 enum RexBits {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 5fd54ae..ad7098c 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -276,19 +276,6 @@
   }
 
   static Object _computeIdentityHashCodeProperty() =>
-      JS_GET_FLAG('LEGACY_JAVASCRIPT')
-          ? _computeIdentityHashCodePropertyLegacy()
-          : _computeIdentityHashCodePropertyModern();
-
-  static Object _computeIdentityHashCodePropertyLegacy() {
-    if (JS<bool>('bool', 'typeof Symbol == "function"') ||
-        JS<bool>('bool', 'typeof Symbol() == "symbol"')) {
-      return _computeIdentityHashCodePropertyModern();
-    }
-    return r'$identityHashCode';
-  }
-
-  static Object _computeIdentityHashCodePropertyModern() =>
       JS('', 'Symbol("identityHashCode")');
 
   static int? parseInt(String source, int? radix) {
diff --git a/tests/language/enum/enhanced_enums_error_test.dart b/tests/language/enum/enhanced_enums_error_test.dart
index 169b538..8ea51fe 100644
--- a/tests/language/enum/enhanced_enums_error_test.dart
+++ b/tests/language/enum/enhanced_enums_error_test.dart
@@ -603,7 +603,7 @@
   e1;
   int get index => 42;
   //      ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
@@ -641,7 +641,7 @@
 
   Never get index => throw "Never!";
   //        ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
diff --git a/tests/language/enum/enhanced_enums_subtype_error_test.dart b/tests/language/enum/enhanced_enums_subtype_error_test.dart
index c34d6b6..83236b8 100644
--- a/tests/language/enum/enhanced_enums_subtype_error_test.dart
+++ b/tests/language/enum/enhanced_enums_subtype_error_test.dart
@@ -44,28 +44,28 @@
 abstract class AbstractImplementsWithIndex implements Enum {
   int get index => 42;
   //      ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
 abstract class AbstractExtendsWithIndex extends Enum {
   int get index => 42;
   //      ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
 mixin MixinWithIndex on Enum {
   int get index => 42;
   //      ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
 mixin MixinWithIndex2 implements Enum {
   int get index => 42;
   //      ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
@@ -86,29 +86,31 @@
 // Can't implement Enum and declare hashCode/==.
 abstract class ClassWithEquals implements Enum {
   bool operator ==(Object other) => true;
+  //            ^^
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   //      ^^^^^^^^
-  // [analyzer] unspecified
   // [cfe] unspecified
 }
 
 mixin MixinWithEquals implements Enum {
   bool operator ==(Object other) => true;
+  //            ^^
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   //      ^^^^^^^^
-  // [analyzer] unspecified
   // [cfe] unspecified
 }
 
 abstract class ClassWithHashCode implements Enum {
   int get hashCode => 0;
   //      ^^^^^^^^
-  // [analyzer] unspecified
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
 mixin MixinWithHashCode implements Enum {
   int get hashCode => 0;
   //      ^^^^^^^^
-  // [analyzer] unspecified
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_DECLARATION
   // [cfe] unspecified
 }
 
@@ -123,13 +125,13 @@
 // Can't implement `Enum` and inherit concrete hashCode/==.
 abstract class ClassSuperEquals extends SuperclassWithEquals implements Enum {
   //           ^^^^^^^^^^^^^^^^
-  // [analyzer] unspecified
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE
   // [cfe] unspecified
 }
 
 abstract class ClassSuperHash extends SuperclassWithHashCode implements Enum {
   //           ^^^^^^^^^^^^^^
-  // [analyzer] unspecified
+  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER_INHERITANCE
   // [cfe] unspecified
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index 4edaf3c..aae6b02 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 139
+PRERELEASE 140
 PRERELEASE_PATCH 0
\ No newline at end of file