From: Soumya AR <soum...@nvidia.com>

This commit introduces a Python maintenance script that generates C++ code
for parsing and serializing AArch64 JSON tuning parameters based on the
schema defined in aarch64-json-schema.h.

The script generates two include files:
  - aarch64-json-tunings-parser-generated.inc
  - aarch64-json-tunings-printer-generated.inc

These generated files are committed as regular source files and included by
aarch64-json-tunings-parser.cc and aarch64-json-tunings-printer.cc respectively.

The script should be run manually whenever the JSON schema is modified.

Signed-off-by: Soumya AR <soum...@nvidia.com>

gcc/ChangeLog:

        * config/aarch64/aarch64-json-tunings-parser.cc: Include
        aarch64-json-tunings-parser-generated.inc.
        * config/aarch64/aarch64-json-tunings-printer.cc: Include
        aarch64-json-tunings-printer-generated.inc.
        * config/aarch64/aarch64-generate-json-tuning-routines.py: New
        maintenance script to generate JSON parser/printer routines.
        * config/aarch64/aarch64-json-tunings-parser-generated.inc: New
        file.
        * config/aarch64/aarch64-json-tunings-printer-generated.inc: New
        file.
        * config/aarch64/t-aarch64: Update dependencies to reference .inc
        files.
---
 .../aarch64-generate-json-tuning-routines.py  | 370 +++++++++++++
 .../aarch64-json-tunings-parser-generated.inc | 337 ++++++++++++
 .../aarch64/aarch64-json-tunings-parser.cc    | 360 +------------
 ...aarch64-json-tunings-printer-generated.inc | 421 +++++++++++++++
 .../aarch64/aarch64-json-tunings-printer.cc   | 509 +-----------------
 gcc/config/aarch64/t-aarch64                  |   2 +
 6 files changed, 1134 insertions(+), 865 deletions(-)
 create mode 100644 gcc/config/aarch64/aarch64-generate-json-tuning-routines.py
 create mode 100644 gcc/config/aarch64/aarch64-json-tunings-parser-generated.inc
 create mode 100644 
gcc/config/aarch64/aarch64-json-tunings-printer-generated.inc

diff --git a/gcc/config/aarch64/aarch64-generate-json-tuning-routines.py 
b/gcc/config/aarch64/aarch64-generate-json-tuning-routines.py
new file mode 100644
index 00000000000..393394fcd4e
--- /dev/null
+++ b/gcc/config/aarch64/aarch64-generate-json-tuning-routines.py
@@ -0,0 +1,370 @@
+#!/usr/bin/env python3
+
+# Script to autogenerate the parsing and serialization routines for the
+# aarch64 JSON tuning parameters.
+#
+# Copyright The GNU Toolchain Authors.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 3, or (at your option) any later
+# version.
+#
+# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+DESCRIPTION = """
+Maintenance script to regenerate aarch64-json-tunings-*-generated.inc files
+from the JSON schema in aarch64-json-schema.h.
+
+This script should be run manually whenever aarch64-json-schema.h is modified.
+
+Usage (from gcc/config/aarch64/ directory):
+  python3 aarch64-generate-json-tuning-routines.py
+
+Generates:
+  aarch64-json-tunings-parser-generated.inc
+  aarch64-json-tunings-printer-generated.inc
+"""
+
+import json
+import re
+import os
+from typing import Dict, Any, List, Tuple
+
+"""Extract the JSON schema string from the header file."""
+def extract_schema_from_header(file_path: str) -> str:
+    with open(file_path, "r") as f:
+        content = f.read()
+
+    # Find the schema_json variable content between R"json( and )json"
+    pattern = r'static const char \*schema_json = R"json\((.*?)\)json";'
+    match = re.search(pattern, content, re.DOTALL)
+
+    if not match:
+        raise ValueError("Could not find schema_json in header file")
+
+    return match.group(1).strip()
+
+"""Return the appropriate macro based on operation (PARSE/SERIALIZE) and field 
type."""
+def get_macro(operation: str, field_type: str) -> str:
+    type_map = {
+        "int": "INTEGER",
+        "uint": "INTEGER",
+        "boolean": "BOOLEAN",
+        "string": "STRING",
+        "enum": "ENUM",
+    }
+    if field_type not in type_map:
+        raise ValueError(f"Unknown field type: {field_type}")
+    return f"{operation}_{type_map[field_type]}_FIELD"
+
+def get_parse_macro(field_type: str) -> str:
+    return get_macro("PARSE", field_type)
+
+def get_serialize_macro(field_type: str) -> str:
+    return get_macro("SERIALIZE", field_type)
+
+"""Generate parsing or serialization code for a single field."""
+def generate_field_code(
+    operation: str,
+    key: str,
+    value: Any,
+    struct_name: str,
+    current_path: List[str],
+    function_map: Dict[str, str],
+    obj_name: str = "jo",
+    indent: str = "  ",
+) -> List[str]:
+    lines = []
+
+    if isinstance(value, str):
+        # Simple field type
+        macro = get_macro(operation.upper(), value)
+        if value == "enum":
+            enum_mapping = f"{key}_mappings"
+            lines.append(
+                f'{indent}{macro} ({obj_name}, "{key}", {struct_name}.{key}, 
{enum_mapping});'
+            )
+        else:
+            lines.append(f'{indent}{macro} ({obj_name}, "{key}", 
{struct_name}.{key});')
+
+    elif isinstance(value, dict):
+        # Nested object - find function name based on current context + key
+        child_path = current_path + [key]
+        child_path_key = "_".join(child_path)
+        func_name = function_map.get(child_path_key, 
f"{operation.lower()}_{key}")
+        macro_name = f"{operation.upper()}_OBJECT"
+        lines.append(
+            f'{indent}{macro_name} ({obj_name}, "{key}", {struct_name}.{key}, 
{func_name});'
+        )
+
+    elif isinstance(value, list) and len(value) > 0:
+        if isinstance(value[0], dict):
+            element_key = key.rstrip("s") if key.endswith("s") else 
f"{key}_element"
+            element_path = current_path + [element_key]
+            element_path_key = "_".join(element_path)
+            func_name = function_map.get(
+                element_path_key, f"{operation.lower()}_{element_key}"
+            )
+            macro_name = f"{operation.upper()}_ARRAY_FIELD"
+
+            if operation.lower() == "serialize":
+                # Serialization needs an extra parameter for array count
+                lines.append(
+                    f'{indent}{macro_name} ({obj_name}, "{key}", 
{struct_name}.{key}, 2, {func_name});'
+                )
+            else:
+                lines.append(
+                    f'{indent}{macro_name} ({obj_name}, "{key}", 
{struct_name}.{key}, {func_name});'
+                )
+
+    return lines
+
+"""Generate parsing code for a single field."""
+def generate_field_parsing(
+    key: str,
+    value: Any,
+    struct_name: str,
+    current_path: List[str],
+    function_map: Dict[str, str],
+    indent: str = "  ",
+) -> List[str]:
+    return generate_field_code(
+        "parse", key, value, struct_name, current_path, function_map, "jo", 
indent
+    )
+
+"""Generate serialization code for a single field."""
+def generate_field_serialization(
+    key: str,
+    value: Any,
+    struct_name: str,
+    obj_name: str,
+    current_path: List[str],
+    function_map: Dict[str, str],
+    indent: str = "  ",
+) -> List[str]:
+    return generate_field_code(
+        "serialize",
+        key,
+        value,
+        struct_name,
+        current_path,
+        function_map,
+        obj_name,
+        indent,
+    )
+
+"""Generate a complete parse or serialize function for a schema object."""
+def generate_function(
+    operation: str,
+    full_name: str,
+    local_name: str,
+    schema: Dict[str, Any],
+    current_path: List[str],
+    function_map: Dict[str, str],
+) -> List[str]:
+    lines = []
+    lines.append("template <typename T>")
+
+    if operation.lower() == "parse":
+        lines.append("static void")
+        lines.append(f"parse_{full_name} (const json::object *jo, T 
&{local_name})")
+        lines.append("{")
+
+        for key, value in schema.items():
+            field_lines = generate_field_parsing(
+                key, value, local_name, current_path, function_map
+            )
+            lines.extend(field_lines)
+
+    elif operation.lower() == "serialize":
+        lines.append("static std::unique_ptr<json::object>")
+        lines.append(f"serialize_{full_name} (const T &{local_name})")
+        lines.append("{")
+        lines.append(f"  auto {local_name}_obj = 
std::make_unique<json::object> ();")
+        lines.append("")
+
+        for key, value in schema.items():
+            field_lines = generate_field_serialization(
+                key, value, local_name, f"{local_name}_obj", current_path, 
function_map
+            )
+            lines.extend(field_lines)
+
+        lines.append("")
+        lines.append(f"  return {local_name}_obj;")
+
+    lines.append("}")
+    lines.append("")
+
+    return lines
+
+
+"""Collect all object schemas with their full paths. This is necessary for
+generating names for the routines with the correct hierarchal path to ensure
+that identical keys in different structures are not given the same name.
+For example:
+vec_costs.issue_info.sve maps to <parse/serialize>_vec_costs_issue_info_sve
+vec_costs.sve maps to <parse/serialize>_vec_costs_sve.
+"""
+def collect_all_objects_with_paths(
+    schema: Dict[str, Any], path: List[str] = []
+) -> Dict[str, Tuple[List[str], Dict[str, Any]]]:
+    objects = {}
+
+    for key, value in schema.items():
+        current_path = path + [key]
+
+        if isinstance(value, dict):
+            path_key = "_".join(current_path)
+            objects[path_key] = (current_path, value)
+            nested = collect_all_objects_with_paths(value, current_path)
+            objects.update(nested)
+
+        elif isinstance(value, list) and len(value) > 0 and 
isinstance(value[0], dict):
+            element_key = key.rstrip("s") if key.endswith("s") else 
f"{key}_element"
+            element_path = current_path[:-1] + [element_key]
+            element_path_key = "_".join(element_path)
+            objects[element_path_key] = (element_path, value[0])
+            nested = collect_all_objects_with_paths(value[0], element_path)
+            objects.update(nested)
+
+    return objects
+
+
+"""Calculate dependency depth of an object schema. 0 indicates no
+dependencies, ie. the object has only primitive types."""
+def get_dependency_depth(obj_schema: Dict[str, Any]) -> int:
+    max_depth = 0
+    for value in obj_schema.values():
+        if isinstance(value, dict):
+            max_depth = max(max_depth, 1 + get_dependency_depth(value))
+        elif isinstance(value, list) and len(value) > 0 and 
isinstance(value[0], dict):
+            max_depth = max(max_depth, 1 + get_dependency_depth(value[0]))
+    return max_depth
+
+
+def generate_all_functions(schema_file: str, operation: str) -> str:
+    schema_str = extract_schema_from_header(schema_file)
+    schema = json.loads(schema_str)
+    tune_params_schema = schema.get("tune_params", {})
+
+    all_objects_with_paths = collect_all_objects_with_paths(tune_params_schema)
+
+    function_map = {}
+    for path_key, (path, obj_schema) in all_objects_with_paths.items():
+        filtered_path = [p for p in path if p != "tune_params"]
+        if filtered_path:
+            full_name = "_".join(filtered_path)
+            function_map[path_key] = f"{operation}_{full_name}"
+        else:
+            function_map[path_key] = f"{operation}_{path_key}"
+
+    """ Structures can have nested structures that may not have been defined 
yet.
+    Therefore, we need to sort the objects by dependency depth and define 
+    functions for the inner structures first."""
+    sorted_objects = sorted(
+        all_objects_with_paths.items(), key=lambda x: 
get_dependency_depth(x[1][1])
+    )
+
+    generated_functions = []
+
+    # Generate functions
+    for path_key, (path, obj_schema) in sorted_objects:
+        filtered_path = [p for p in path if p != "tune_params"]
+        if filtered_path:
+            full_name = "_".join(filtered_path)
+            local_name = filtered_path[-1]
+            current_path = filtered_path
+        else:
+            full_name = path_key
+            local_name = path_key
+            current_path = []
+
+        function_lines = generate_function(
+            operation, full_name, local_name, obj_schema, current_path, 
function_map
+        )
+        generated_functions.extend(function_lines)
+
+    main_function = generate_function(
+        operation, "tunings", "tunings", tune_params_schema, [], function_map
+    )
+    generated_functions.extend(main_function)
+
+    return "\n".join(generated_functions)
+
+"""Write the generated code to a new include file."""
+def write_generated_include_file(
+    output_file_path: str, generated_code: str, operation: str
+) -> None:
+    header_comment = f"""/* This file is auto-generated by 
aarch64-generate-json-tuning-routines.py.  */
+/* Copyright The GNU Toolchain Authors.
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3, or (at your option) any later
+   version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file contains the auto-generated {operation} functions for JSON tuning 
parameters.  */
+
+"""
+
+    try:
+        with open(output_file_path, "w") as f:
+            f.write(header_comment)
+            f.write(generated_code)
+        print(f"Successfully generated {output_file_path}")
+    except Exception as e:
+        print(f"Error writing to {output_file_path}: {e}")
+
+def main():
+    try:
+        script_dir = os.path.dirname(os.path.abspath(__file__))
+
+        schema_file = os.path.join(script_dir, "aarch64-json-schema.h")
+        parser_inc_file = os.path.join(
+            script_dir, "aarch64-json-tunings-parser-generated.inc"
+        )
+        printer_inc_file = os.path.join(
+            script_dir, "aarch64-json-tunings-printer-generated.inc"
+        )
+
+        # Generate parser functions
+        parser_generated_code = generate_all_functions(schema_file, "parse")
+        write_generated_include_file(parser_inc_file, parser_generated_code, 
"parser")
+
+        # Generate serializer functions
+        serializer_generated_code = generate_all_functions(schema_file, 
"serialize")
+        write_generated_include_file(
+            printer_inc_file, serializer_generated_code, "serializer"
+        )
+
+        print("Code generation completed successfully!")
+        print(f"Generated files in: {script_dir}")
+
+    except Exception as e:
+        print(f"Error: {e}")
+        return 1
+
+    return 0
+
+if __name__ == "__main__":
+    exit(main())
diff --git a/gcc/config/aarch64/aarch64-json-tunings-parser-generated.inc 
b/gcc/config/aarch64/aarch64-json-tunings-parser-generated.inc
new file mode 100644
index 00000000000..da96e9b8ded
--- /dev/null
+++ b/gcc/config/aarch64/aarch64-json-tunings-parser-generated.inc
@@ -0,0 +1,337 @@
+/* This file is auto-generated by aarch64-generate-json-tuning-routines.py.  */
+/* Copyright The GNU Toolchain Authors.
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3, or (at your option) any later
+   version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file contains the auto-generated parser functions for JSON tuning 
parameters.  */
+
+template <typename T>
+static void
+parse_insn_extra_cost_alu (const json::object *jo, T &alu)
+{
+  PARSE_INTEGER_FIELD (jo, "arith", alu.arith);
+  PARSE_INTEGER_FIELD (jo, "logical", alu.logical);
+  PARSE_INTEGER_FIELD (jo, "shift", alu.shift);
+  PARSE_INTEGER_FIELD (jo, "shift_reg", alu.shift_reg);
+  PARSE_INTEGER_FIELD (jo, "arith_shift", alu.arith_shift);
+  PARSE_INTEGER_FIELD (jo, "arith_shift_reg", alu.arith_shift_reg);
+  PARSE_INTEGER_FIELD (jo, "log_shift", alu.log_shift);
+  PARSE_INTEGER_FIELD (jo, "log_shift_reg", alu.log_shift_reg);
+  PARSE_INTEGER_FIELD (jo, "extend", alu.extend);
+  PARSE_INTEGER_FIELD (jo, "extend_arith", alu.extend_arith);
+  PARSE_INTEGER_FIELD (jo, "bfi", alu.bfi);
+  PARSE_INTEGER_FIELD (jo, "bfx", alu.bfx);
+  PARSE_INTEGER_FIELD (jo, "clz", alu.clz);
+  PARSE_INTEGER_FIELD (jo, "rev", alu.rev);
+  PARSE_INTEGER_FIELD (jo, "non_exec", alu.non_exec);
+  PARSE_BOOLEAN_FIELD (jo, "non_exec_costs_exec", alu.non_exec_costs_exec);
+}
+
+template <typename T>
+static void
+parse_insn_extra_cost_mult_element (const json::object *jo, T &mult_element)
+{
+  PARSE_INTEGER_FIELD (jo, "simple", mult_element.simple);
+  PARSE_INTEGER_FIELD (jo, "flag_setting", mult_element.flag_setting);
+  PARSE_INTEGER_FIELD (jo, "extend", mult_element.extend);
+  PARSE_INTEGER_FIELD (jo, "add", mult_element.add);
+  PARSE_INTEGER_FIELD (jo, "extend_add", mult_element.extend_add);
+  PARSE_INTEGER_FIELD (jo, "idiv", mult_element.idiv);
+}
+
+template <typename T>
+static void
+parse_insn_extra_cost_ldst (const json::object *jo, T &ldst)
+{
+  PARSE_INTEGER_FIELD (jo, "load", ldst.load);
+  PARSE_INTEGER_FIELD (jo, "load_sign_extend", ldst.load_sign_extend);
+  PARSE_INTEGER_FIELD (jo, "ldrd", ldst.ldrd);
+  PARSE_INTEGER_FIELD (jo, "ldm_1st", ldst.ldm_1st);
+  PARSE_INTEGER_FIELD (jo, "ldm_regs_per_insn_1st", 
ldst.ldm_regs_per_insn_1st);
+  PARSE_INTEGER_FIELD (jo, "ldm_regs_per_insn_subsequent", 
ldst.ldm_regs_per_insn_subsequent);
+  PARSE_INTEGER_FIELD (jo, "loadf", ldst.loadf);
+  PARSE_INTEGER_FIELD (jo, "loadd", ldst.loadd);
+  PARSE_INTEGER_FIELD (jo, "load_unaligned", ldst.load_unaligned);
+  PARSE_INTEGER_FIELD (jo, "store", ldst.store);
+  PARSE_INTEGER_FIELD (jo, "strd", ldst.strd);
+  PARSE_INTEGER_FIELD (jo, "stm_1st", ldst.stm_1st);
+  PARSE_INTEGER_FIELD (jo, "stm_regs_per_insn_1st", 
ldst.stm_regs_per_insn_1st);
+  PARSE_INTEGER_FIELD (jo, "stm_regs_per_insn_subsequent", 
ldst.stm_regs_per_insn_subsequent);
+  PARSE_INTEGER_FIELD (jo, "storef", ldst.storef);
+  PARSE_INTEGER_FIELD (jo, "stored", ldst.stored);
+  PARSE_INTEGER_FIELD (jo, "store_unaligned", ldst.store_unaligned);
+  PARSE_INTEGER_FIELD (jo, "loadv", ldst.loadv);
+  PARSE_INTEGER_FIELD (jo, "storev", ldst.storev);
+}
+
+template <typename T>
+static void
+parse_insn_extra_cost_fp_element (const json::object *jo, T &fp_element)
+{
+  PARSE_INTEGER_FIELD (jo, "div", fp_element.div);
+  PARSE_INTEGER_FIELD (jo, "mult", fp_element.mult);
+  PARSE_INTEGER_FIELD (jo, "mult_addsub", fp_element.mult_addsub);
+  PARSE_INTEGER_FIELD (jo, "fma", fp_element.fma);
+  PARSE_INTEGER_FIELD (jo, "addsub", fp_element.addsub);
+  PARSE_INTEGER_FIELD (jo, "fpconst", fp_element.fpconst);
+  PARSE_INTEGER_FIELD (jo, "neg", fp_element.neg);
+  PARSE_INTEGER_FIELD (jo, "compare", fp_element.compare);
+  PARSE_INTEGER_FIELD (jo, "widen", fp_element.widen);
+  PARSE_INTEGER_FIELD (jo, "narrow", fp_element.narrow);
+  PARSE_INTEGER_FIELD (jo, "toint", fp_element.toint);
+  PARSE_INTEGER_FIELD (jo, "fromint", fp_element.fromint);
+  PARSE_INTEGER_FIELD (jo, "roundint", fp_element.roundint);
+}
+
+template <typename T>
+static void
+parse_insn_extra_cost_vect (const json::object *jo, T &vect)
+{
+  PARSE_INTEGER_FIELD (jo, "alu", vect.alu);
+  PARSE_INTEGER_FIELD (jo, "mult", vect.mult);
+  PARSE_INTEGER_FIELD (jo, "movi", vect.movi);
+  PARSE_INTEGER_FIELD (jo, "dup", vect.dup);
+  PARSE_INTEGER_FIELD (jo, "extract", vect.extract);
+}
+
+template <typename T>
+static void
+parse_addr_cost_addr_scale_costs (const json::object *jo, T &addr_scale_costs)
+{
+  PARSE_INTEGER_FIELD (jo, "hi", addr_scale_costs.hi);
+  PARSE_INTEGER_FIELD (jo, "si", addr_scale_costs.si);
+  PARSE_INTEGER_FIELD (jo, "di", addr_scale_costs.di);
+  PARSE_INTEGER_FIELD (jo, "ti", addr_scale_costs.ti);
+}
+
+template <typename T>
+static void
+parse_regmove_cost (const json::object *jo, T &regmove_cost)
+{
+  PARSE_INTEGER_FIELD (jo, "GP2GP", regmove_cost.GP2GP);
+  PARSE_INTEGER_FIELD (jo, "GP2FP", regmove_cost.GP2FP);
+  PARSE_INTEGER_FIELD (jo, "FP2GP", regmove_cost.FP2GP);
+  PARSE_INTEGER_FIELD (jo, "FP2FP", regmove_cost.FP2FP);
+}
+
+template <typename T>
+static void
+parse_vec_costs_advsimd (const json::object *jo, T &advsimd)
+{
+  PARSE_INTEGER_FIELD (jo, "int_stmt_cost", advsimd.int_stmt_cost);
+  PARSE_INTEGER_FIELD (jo, "fp_stmt_cost", advsimd.fp_stmt_cost);
+  PARSE_INTEGER_FIELD (jo, "ld2_st2_permute_cost", 
advsimd.ld2_st2_permute_cost);
+  PARSE_INTEGER_FIELD (jo, "ld3_st3_permute_cost", 
advsimd.ld3_st3_permute_cost);
+  PARSE_INTEGER_FIELD (jo, "ld4_st4_permute_cost", 
advsimd.ld4_st4_permute_cost);
+  PARSE_INTEGER_FIELD (jo, "permute_cost", advsimd.permute_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_i8_cost", advsimd.reduc_i8_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_i16_cost", advsimd.reduc_i16_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_i32_cost", advsimd.reduc_i32_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_i64_cost", advsimd.reduc_i64_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_f16_cost", advsimd.reduc_f16_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_f32_cost", advsimd.reduc_f32_cost);
+  PARSE_INTEGER_FIELD (jo, "reduc_f64_cost", advsimd.reduc_f64_cost);
+  PARSE_INTEGER_FIELD (jo, "store_elt_extra_cost", 
advsimd.store_elt_extra_cost);
+  PARSE_INTEGER_FIELD (jo, "vec_to_scalar_cost", advsimd.vec_to_scalar_cost);
+  PARSE_INTEGER_FIELD (jo, "scalar_to_vec_cost", advsimd.scalar_to_vec_cost);
+  PARSE_INTEGER_FIELD (jo, "align_load_cost", advsimd.align_load_cost);
+  PARSE_INTEGER_FIELD (jo, "unalign_load_cost", advsimd.unalign_load_cost);
+  PARSE_INTEGER_FIELD (jo, "unalign_store_cost", advsimd.unalign_store_cost);
+  PARSE_INTEGER_FIELD (jo, "store_cost", advsimd.store_cost);
+}
+
+template <typename T>
+static void
+parse_vec_costs_sve (const json::object *jo, T &sve)
+{
+  PARSE_INTEGER_FIELD (jo, "clast_cost", sve.clast_cost);
+  PARSE_INTEGER_FIELD (jo, "fadda_f16_cost", sve.fadda_f16_cost);
+  PARSE_INTEGER_FIELD (jo, "fadda_f32_cost", sve.fadda_f32_cost);
+  PARSE_INTEGER_FIELD (jo, "fadda_f64_cost", sve.fadda_f64_cost);
+  PARSE_INTEGER_FIELD (jo, "gather_load_x32_cost", sve.gather_load_x32_cost);
+  PARSE_INTEGER_FIELD (jo, "gather_load_x64_cost", sve.gather_load_x64_cost);
+  PARSE_INTEGER_FIELD (jo, "gather_load_x32_init_cost", 
sve.gather_load_x32_init_cost);
+  PARSE_INTEGER_FIELD (jo, "gather_load_x64_init_cost", 
sve.gather_load_x64_init_cost);
+  PARSE_INTEGER_FIELD (jo, "scatter_store_elt_cost", 
sve.scatter_store_elt_cost);
+}
+
+template <typename T>
+static void
+parse_vec_costs_issue_info_scalar (const json::object *jo, T &scalar)
+{
+  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle", 
scalar.loads_stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", scalar.stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle", 
scalar.general_ops_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops", 
scalar.fp_simd_load_general_ops);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops", 
scalar.fp_simd_store_general_ops);
+}
+
+template <typename T>
+static void
+parse_vec_costs_issue_info_advsimd (const json::object *jo, T &advsimd)
+{
+  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle", 
advsimd.loads_stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", advsimd.stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle", 
advsimd.general_ops_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops", 
advsimd.fp_simd_load_general_ops);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops", 
advsimd.fp_simd_store_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld2_st2_general_ops", advsimd.ld2_st2_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld3_st3_general_ops", advsimd.ld3_st3_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld4_st4_general_ops", advsimd.ld4_st4_general_ops);
+}
+
+template <typename T>
+static void
+parse_vec_costs_issue_info_sve (const json::object *jo, T &sve)
+{
+  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle", 
sve.loads_stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", sve.stores_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle", sve.general_ops_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops", 
sve.fp_simd_load_general_ops);
+  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops", 
sve.fp_simd_store_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld2_st2_general_ops", sve.ld2_st2_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld3_st3_general_ops", sve.ld3_st3_general_ops);
+  PARSE_INTEGER_FIELD (jo, "ld4_st4_general_ops", sve.ld4_st4_general_ops);
+  PARSE_INTEGER_FIELD (jo, "pred_ops_per_cycle", sve.pred_ops_per_cycle);
+  PARSE_INTEGER_FIELD (jo, "while_pred_ops", sve.while_pred_ops);
+  PARSE_INTEGER_FIELD (jo, "int_cmp_pred_ops", sve.int_cmp_pred_ops);
+  PARSE_INTEGER_FIELD (jo, "fp_cmp_pred_ops", sve.fp_cmp_pred_ops);
+  PARSE_INTEGER_FIELD (jo, "gather_scatter_pair_general_ops", 
sve.gather_scatter_pair_general_ops);
+  PARSE_INTEGER_FIELD (jo, "gather_scatter_pair_pred_ops", 
sve.gather_scatter_pair_pred_ops);
+}
+
+template <typename T>
+static void
+parse_branch_costs (const json::object *jo, T &branch_costs)
+{
+  PARSE_INTEGER_FIELD (jo, "predictable", branch_costs.predictable);
+  PARSE_INTEGER_FIELD (jo, "unpredictable", branch_costs.unpredictable);
+}
+
+template <typename T>
+static void
+parse_approx_modes (const json::object *jo, T &approx_modes)
+{
+  PARSE_INTEGER_FIELD (jo, "division", approx_modes.division);
+  PARSE_INTEGER_FIELD (jo, "sqrt", approx_modes.sqrt);
+  PARSE_INTEGER_FIELD (jo, "recip_sqrt", approx_modes.recip_sqrt);
+}
+
+template <typename T>
+static void
+parse_memmov_cost (const json::object *jo, T &memmov_cost)
+{
+  PARSE_INTEGER_FIELD (jo, "load_int", memmov_cost.load_int);
+  PARSE_INTEGER_FIELD (jo, "store_int", memmov_cost.store_int);
+  PARSE_INTEGER_FIELD (jo, "load_fp", memmov_cost.load_fp);
+  PARSE_INTEGER_FIELD (jo, "store_fp", memmov_cost.store_fp);
+  PARSE_INTEGER_FIELD (jo, "load_pred", memmov_cost.load_pred);
+  PARSE_INTEGER_FIELD (jo, "store_pred", memmov_cost.store_pred);
+}
+
+template <typename T>
+static void
+parse_prefetch (const json::object *jo, T &prefetch)
+{
+  PARSE_INTEGER_FIELD (jo, "num_slots", prefetch.num_slots);
+  PARSE_INTEGER_FIELD (jo, "l1_cache_size", prefetch.l1_cache_size);
+  PARSE_INTEGER_FIELD (jo, "l1_cache_line_size", prefetch.l1_cache_line_size);
+  PARSE_INTEGER_FIELD (jo, "l2_cache_size", prefetch.l2_cache_size);
+  PARSE_BOOLEAN_FIELD (jo, "prefetch_dynamic_strides", 
prefetch.prefetch_dynamic_strides);
+  PARSE_INTEGER_FIELD (jo, "minimum_stride", prefetch.minimum_stride);
+  PARSE_INTEGER_FIELD (jo, "default_opt_level", prefetch.default_opt_level);
+}
+
+template <typename T>
+static void
+parse_insn_extra_cost (const json::object *jo, T &insn_extra_cost)
+{
+  PARSE_OBJECT (jo, "alu", insn_extra_cost.alu, parse_insn_extra_cost_alu);
+  PARSE_ARRAY_FIELD (jo, "mult", insn_extra_cost.mult, 
parse_insn_extra_cost_mult_element);
+  PARSE_OBJECT (jo, "ldst", insn_extra_cost.ldst, parse_insn_extra_cost_ldst);
+  PARSE_ARRAY_FIELD (jo, "fp", insn_extra_cost.fp, 
parse_insn_extra_cost_fp_element);
+  PARSE_OBJECT (jo, "vect", insn_extra_cost.vect, parse_insn_extra_cost_vect);
+}
+
+template <typename T>
+static void
+parse_addr_cost (const json::object *jo, T &addr_cost)
+{
+  PARSE_OBJECT (jo, "addr_scale_costs", addr_cost.addr_scale_costs, 
parse_addr_cost_addr_scale_costs);
+  PARSE_INTEGER_FIELD (jo, "pre_modify", addr_cost.pre_modify);
+  PARSE_INTEGER_FIELD (jo, "post_modify", addr_cost.post_modify);
+  PARSE_INTEGER_FIELD (jo, "post_modify_ld3_st3", 
addr_cost.post_modify_ld3_st3);
+  PARSE_INTEGER_FIELD (jo, "post_modify_ld4_st4", 
addr_cost.post_modify_ld4_st4);
+  PARSE_INTEGER_FIELD (jo, "register_offset", addr_cost.register_offset);
+  PARSE_INTEGER_FIELD (jo, "register_sextend", addr_cost.register_sextend);
+  PARSE_INTEGER_FIELD (jo, "register_zextend", addr_cost.register_zextend);
+  PARSE_INTEGER_FIELD (jo, "imm_offset", addr_cost.imm_offset);
+}
+
+template <typename T>
+static void
+parse_vec_costs_issue_info (const json::object *jo, T &issue_info)
+{
+  PARSE_OBJECT (jo, "scalar", issue_info.scalar, 
parse_vec_costs_issue_info_scalar);
+  PARSE_OBJECT (jo, "advsimd", issue_info.advsimd, 
parse_vec_costs_issue_info_advsimd);
+  PARSE_OBJECT (jo, "sve", issue_info.sve, parse_vec_costs_issue_info_sve);
+}
+
+template <typename T>
+static void
+parse_vec_costs (const json::object *jo, T &vec_costs)
+{
+  PARSE_INTEGER_FIELD (jo, "scalar_int_stmt_cost", 
vec_costs.scalar_int_stmt_cost);
+  PARSE_INTEGER_FIELD (jo, "scalar_fp_stmt_cost", 
vec_costs.scalar_fp_stmt_cost);
+  PARSE_INTEGER_FIELD (jo, "scalar_load_cost", vec_costs.scalar_load_cost);
+  PARSE_INTEGER_FIELD (jo, "scalar_store_cost", vec_costs.scalar_store_cost);
+  PARSE_INTEGER_FIELD (jo, "cond_taken_branch_cost", 
vec_costs.cond_taken_branch_cost);
+  PARSE_INTEGER_FIELD (jo, "cond_not_taken_branch_cost", 
vec_costs.cond_not_taken_branch_cost);
+  PARSE_OBJECT (jo, "advsimd", vec_costs.advsimd, parse_vec_costs_advsimd);
+  PARSE_OBJECT (jo, "sve", vec_costs.sve, parse_vec_costs_sve);
+  PARSE_OBJECT (jo, "issue_info", vec_costs.issue_info, 
parse_vec_costs_issue_info);
+}
+
+template <typename T>
+static void
+parse_tunings (const json::object *jo, T &tunings)
+{
+  PARSE_OBJECT (jo, "insn_extra_cost", tunings.insn_extra_cost, 
parse_insn_extra_cost);
+  PARSE_OBJECT (jo, "addr_cost", tunings.addr_cost, parse_addr_cost);
+  PARSE_OBJECT (jo, "regmove_cost", tunings.regmove_cost, parse_regmove_cost);
+  PARSE_OBJECT (jo, "vec_costs", tunings.vec_costs, parse_vec_costs);
+  PARSE_OBJECT (jo, "branch_costs", tunings.branch_costs, parse_branch_costs);
+  PARSE_OBJECT (jo, "approx_modes", tunings.approx_modes, parse_approx_modes);
+  PARSE_INTEGER_FIELD (jo, "sve_width", tunings.sve_width);
+  PARSE_OBJECT (jo, "memmov_cost", tunings.memmov_cost, parse_memmov_cost);
+  PARSE_INTEGER_FIELD (jo, "issue_rate", tunings.issue_rate);
+  PARSE_INTEGER_FIELD (jo, "fusible_ops", tunings.fusible_ops);
+  PARSE_STRING_FIELD (jo, "function_align", tunings.function_align);
+  PARSE_STRING_FIELD (jo, "jump_align", tunings.jump_align);
+  PARSE_STRING_FIELD (jo, "loop_align", tunings.loop_align);
+  PARSE_INTEGER_FIELD (jo, "int_reassoc_width", tunings.int_reassoc_width);
+  PARSE_INTEGER_FIELD (jo, "fp_reassoc_width", tunings.fp_reassoc_width);
+  PARSE_INTEGER_FIELD (jo, "fma_reassoc_width", tunings.fma_reassoc_width);
+  PARSE_INTEGER_FIELD (jo, "vec_reassoc_width", tunings.vec_reassoc_width);
+  PARSE_INTEGER_FIELD (jo, "min_div_recip_mul_sf", 
tunings.min_div_recip_mul_sf);
+  PARSE_INTEGER_FIELD (jo, "min_div_recip_mul_df", 
tunings.min_div_recip_mul_df);
+  PARSE_INTEGER_FIELD (jo, "max_case_values", tunings.max_case_values);
+  PARSE_ENUM_FIELD (jo, "autoprefetcher_model", tunings.autoprefetcher_model, 
autoprefetcher_model_mappings);
+  PARSE_INTEGER_FIELD (jo, "extra_tuning_flags", tunings.extra_tuning_flags);
+  PARSE_OBJECT (jo, "prefetch", tunings.prefetch, parse_prefetch);
+  PARSE_ENUM_FIELD (jo, "ldp_policy_model", tunings.ldp_policy_model, 
ldp_policy_model_mappings);
+  PARSE_ENUM_FIELD (jo, "stp_policy_model", tunings.stp_policy_model, 
stp_policy_model_mappings);
+}
diff --git a/gcc/config/aarch64/aarch64-json-tunings-parser.cc 
b/gcc/config/aarch64/aarch64-json-tunings-parser.cc
index b1d4402a89f..9ee1122ce97 100644
--- a/gcc/config/aarch64/aarch64-json-tunings-parser.cc
+++ b/gcc/config/aarch64/aarch64-json-tunings-parser.cc
@@ -223,364 +223,8 @@ static const enum_mapping<aarch64_ldp_stp_policy> 
stp_policy_model_mappings[]
      {"AARCH64_LDP_STP_POLICY_ALWAYS", AARCH64_LDP_STP_POLICY_ALWAYS},
      {"AARCH64_LDP_STP_POLICY_NEVER", AARCH64_LDP_STP_POLICY_NEVER}};
 
-template <typename T>
-static void
-parse_insn_extra_cost_alu (const json::object *jo, T &alu)
-{
-  PARSE_INTEGER_FIELD (jo, "arith", alu.arith);
-  PARSE_INTEGER_FIELD (jo, "logical", alu.logical);
-  PARSE_INTEGER_FIELD (jo, "shift", alu.shift);
-  PARSE_INTEGER_FIELD (jo, "shift_reg", alu.shift_reg);
-  PARSE_INTEGER_FIELD (jo, "arith_shift", alu.arith_shift);
-  PARSE_INTEGER_FIELD (jo, "arith_shift_reg", alu.arith_shift_reg);
-  PARSE_INTEGER_FIELD (jo, "log_shift", alu.log_shift);
-  PARSE_INTEGER_FIELD (jo, "log_shift_reg", alu.log_shift_reg);
-  PARSE_INTEGER_FIELD (jo, "extend", alu.extend);
-  PARSE_INTEGER_FIELD (jo, "extend_arith", alu.extend_arith);
-  PARSE_INTEGER_FIELD (jo, "bfi", alu.bfi);
-  PARSE_INTEGER_FIELD (jo, "bfx", alu.bfx);
-  PARSE_INTEGER_FIELD (jo, "clz", alu.clz);
-  PARSE_INTEGER_FIELD (jo, "rev", alu.rev);
-  PARSE_INTEGER_FIELD (jo, "non_exec", alu.non_exec);
-  PARSE_BOOLEAN_FIELD (jo, "non_exec_costs_exec", alu.non_exec_costs_exec);
-}
-
-template <typename T>
-static void
-parse_insn_extra_cost_mult_element (const json::object *jo, T &mult_element)
-{
-  PARSE_INTEGER_FIELD (jo, "simple", mult_element.simple);
-  PARSE_INTEGER_FIELD (jo, "flag_setting", mult_element.flag_setting);
-  PARSE_INTEGER_FIELD (jo, "extend", mult_element.extend);
-  PARSE_INTEGER_FIELD (jo, "add", mult_element.add);
-  PARSE_INTEGER_FIELD (jo, "extend_add", mult_element.extend_add);
-  PARSE_INTEGER_FIELD (jo, "idiv", mult_element.idiv);
-}
-
-template <typename T>
-static void
-parse_insn_extra_cost_ldst (const json::object *jo, T &ldst)
-{
-  PARSE_INTEGER_FIELD (jo, "load", ldst.load);
-  PARSE_INTEGER_FIELD (jo, "load_sign_extend", ldst.load_sign_extend);
-  PARSE_INTEGER_FIELD (jo, "ldrd", ldst.ldrd);
-  PARSE_INTEGER_FIELD (jo, "ldm_1st", ldst.ldm_1st);
-  PARSE_INTEGER_FIELD (jo, "ldm_regs_per_insn_1st", 
ldst.ldm_regs_per_insn_1st);
-  PARSE_INTEGER_FIELD (jo, "ldm_regs_per_insn_subsequent",
-                      ldst.ldm_regs_per_insn_subsequent);
-  PARSE_INTEGER_FIELD (jo, "loadf", ldst.loadf);
-  PARSE_INTEGER_FIELD (jo, "loadd", ldst.loadd);
-  PARSE_INTEGER_FIELD (jo, "load_unaligned", ldst.load_unaligned);
-  PARSE_INTEGER_FIELD (jo, "store", ldst.store);
-  PARSE_INTEGER_FIELD (jo, "strd", ldst.strd);
-  PARSE_INTEGER_FIELD (jo, "stm_1st", ldst.stm_1st);
-  PARSE_INTEGER_FIELD (jo, "stm_regs_per_insn_1st", 
ldst.stm_regs_per_insn_1st);
-  PARSE_INTEGER_FIELD (jo, "stm_regs_per_insn_subsequent",
-                      ldst.stm_regs_per_insn_subsequent);
-  PARSE_INTEGER_FIELD (jo, "storef", ldst.storef);
-  PARSE_INTEGER_FIELD (jo, "stored", ldst.stored);
-  PARSE_INTEGER_FIELD (jo, "store_unaligned", ldst.store_unaligned);
-  PARSE_INTEGER_FIELD (jo, "loadv", ldst.loadv);
-  PARSE_INTEGER_FIELD (jo, "storev", ldst.storev);
-}
-
-template <typename T>
-static void
-parse_insn_extra_cost_fp_element (const json::object *jo, T &fp_element)
-{
-  PARSE_INTEGER_FIELD (jo, "div", fp_element.div);
-  PARSE_INTEGER_FIELD (jo, "mult", fp_element.mult);
-  PARSE_INTEGER_FIELD (jo, "mult_addsub", fp_element.mult_addsub);
-  PARSE_INTEGER_FIELD (jo, "fma", fp_element.fma);
-  PARSE_INTEGER_FIELD (jo, "addsub", fp_element.addsub);
-  PARSE_INTEGER_FIELD (jo, "fpconst", fp_element.fpconst);
-  PARSE_INTEGER_FIELD (jo, "neg", fp_element.neg);
-  PARSE_INTEGER_FIELD (jo, "compare", fp_element.compare);
-  PARSE_INTEGER_FIELD (jo, "widen", fp_element.widen);
-  PARSE_INTEGER_FIELD (jo, "narrow", fp_element.narrow);
-  PARSE_INTEGER_FIELD (jo, "toint", fp_element.toint);
-  PARSE_INTEGER_FIELD (jo, "fromint", fp_element.fromint);
-  PARSE_INTEGER_FIELD (jo, "roundint", fp_element.roundint);
-}
-
-template <typename T>
-static void
-parse_insn_extra_cost_vect (const json::object *jo, T &vect)
-{
-  PARSE_INTEGER_FIELD (jo, "alu", vect.alu);
-  PARSE_INTEGER_FIELD (jo, "mult", vect.mult);
-  PARSE_INTEGER_FIELD (jo, "movi", vect.movi);
-  PARSE_INTEGER_FIELD (jo, "dup", vect.dup);
-  PARSE_INTEGER_FIELD (jo, "extract", vect.extract);
-}
-
-template <typename T>
-static void
-parse_addr_cost_addr_scale_costs (const json::object *jo, T &addr_scale_costs)
-{
-  PARSE_INTEGER_FIELD (jo, "hi", addr_scale_costs.hi);
-  PARSE_INTEGER_FIELD (jo, "si", addr_scale_costs.si);
-  PARSE_INTEGER_FIELD (jo, "di", addr_scale_costs.di);
-  PARSE_INTEGER_FIELD (jo, "ti", addr_scale_costs.ti);
-}
-
-template <typename T>
-static void
-parse_regmove_cost (const json::object *jo, T &regmove_cost)
-{
-  PARSE_INTEGER_FIELD (jo, "GP2GP", regmove_cost.GP2GP);
-  PARSE_INTEGER_FIELD (jo, "GP2FP", regmove_cost.GP2FP);
-  PARSE_INTEGER_FIELD (jo, "FP2GP", regmove_cost.FP2GP);
-  PARSE_INTEGER_FIELD (jo, "FP2FP", regmove_cost.FP2FP);
-}
-
-template <typename T>
-static void
-parse_vec_costs_advsimd (const json::object *jo, T &advsimd)
-{
-  PARSE_INTEGER_FIELD (jo, "int_stmt_cost", advsimd.int_stmt_cost);
-  PARSE_INTEGER_FIELD (jo, "fp_stmt_cost", advsimd.fp_stmt_cost);
-  PARSE_INTEGER_FIELD (jo, "ld2_st2_permute_cost",
-                      advsimd.ld2_st2_permute_cost);
-  PARSE_INTEGER_FIELD (jo, "ld3_st3_permute_cost",
-                      advsimd.ld3_st3_permute_cost);
-  PARSE_INTEGER_FIELD (jo, "ld4_st4_permute_cost",
-                      advsimd.ld4_st4_permute_cost);
-  PARSE_INTEGER_FIELD (jo, "permute_cost", advsimd.permute_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_i8_cost", advsimd.reduc_i8_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_i16_cost", advsimd.reduc_i16_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_i32_cost", advsimd.reduc_i32_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_i64_cost", advsimd.reduc_i64_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_f16_cost", advsimd.reduc_f16_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_f32_cost", advsimd.reduc_f32_cost);
-  PARSE_INTEGER_FIELD (jo, "reduc_f64_cost", advsimd.reduc_f64_cost);
-  PARSE_INTEGER_FIELD (jo, "store_elt_extra_cost",
-                      advsimd.store_elt_extra_cost);
-  PARSE_INTEGER_FIELD (jo, "vec_to_scalar_cost", advsimd.vec_to_scalar_cost);
-  PARSE_INTEGER_FIELD (jo, "scalar_to_vec_cost", advsimd.scalar_to_vec_cost);
-  PARSE_INTEGER_FIELD (jo, "align_load_cost", advsimd.align_load_cost);
-  PARSE_INTEGER_FIELD (jo, "unalign_load_cost", advsimd.unalign_load_cost);
-  PARSE_INTEGER_FIELD (jo, "unalign_store_cost", advsimd.unalign_store_cost);
-  PARSE_INTEGER_FIELD (jo, "store_cost", advsimd.store_cost);
-}
-
-template <typename T>
-static void
-parse_vec_costs_sve (const json::object *jo, T &sve)
-{
-  PARSE_INTEGER_FIELD (jo, "clast_cost", sve.clast_cost);
-  PARSE_INTEGER_FIELD (jo, "fadda_f16_cost", sve.fadda_f16_cost);
-  PARSE_INTEGER_FIELD (jo, "fadda_f32_cost", sve.fadda_f32_cost);
-  PARSE_INTEGER_FIELD (jo, "fadda_f64_cost", sve.fadda_f64_cost);
-  PARSE_INTEGER_FIELD (jo, "gather_load_x32_cost", sve.gather_load_x32_cost);
-  PARSE_INTEGER_FIELD (jo, "gather_load_x64_cost", sve.gather_load_x64_cost);
-  PARSE_INTEGER_FIELD (jo, "gather_load_x32_init_cost",
-                      sve.gather_load_x32_init_cost);
-  PARSE_INTEGER_FIELD (jo, "gather_load_x64_init_cost",
-                      sve.gather_load_x64_init_cost);
-  PARSE_INTEGER_FIELD (jo, "scatter_store_elt_cost",
-                      sve.scatter_store_elt_cost);
-}
-
-template <typename T>
-static void
-parse_vec_costs_issue_info_scalar (const json::object *jo, T &scalar)
-{
-  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle",
-                      scalar.loads_stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", scalar.stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle",
-                      scalar.general_ops_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops",
-                      scalar.fp_simd_load_general_ops);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops",
-                      scalar.fp_simd_store_general_ops);
-}
-
-template <typename T>
-static void
-parse_vec_costs_issue_info_advsimd (const json::object *jo, T &advsimd)
-{
-  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle",
-                      advsimd.loads_stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", advsimd.stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle",
-                      advsimd.general_ops_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops",
-                      advsimd.fp_simd_load_general_ops);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops",
-                      advsimd.fp_simd_store_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld2_st2_general_ops", advsimd.ld2_st2_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld3_st3_general_ops", advsimd.ld3_st3_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld4_st4_general_ops", advsimd.ld4_st4_general_ops);
-}
-
-template <typename T>
-static void
-parse_vec_costs_issue_info_sve (const json::object *jo, T &sve)
-{
-  PARSE_INTEGER_FIELD (jo, "loads_stores_per_cycle",
-                      sve.loads_stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "stores_per_cycle", sve.stores_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "general_ops_per_cycle", sve.general_ops_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_load_general_ops",
-                      sve.fp_simd_load_general_ops);
-  PARSE_INTEGER_FIELD (jo, "fp_simd_store_general_ops",
-                      sve.fp_simd_store_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld2_st2_general_ops", sve.ld2_st2_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld3_st3_general_ops", sve.ld3_st3_general_ops);
-  PARSE_INTEGER_FIELD (jo, "ld4_st4_general_ops", sve.ld4_st4_general_ops);
-  PARSE_INTEGER_FIELD (jo, "pred_ops_per_cycle", sve.pred_ops_per_cycle);
-  PARSE_INTEGER_FIELD (jo, "while_pred_ops", sve.while_pred_ops);
-  PARSE_INTEGER_FIELD (jo, "int_cmp_pred_ops", sve.int_cmp_pred_ops);
-  PARSE_INTEGER_FIELD (jo, "fp_cmp_pred_ops", sve.fp_cmp_pred_ops);
-  PARSE_INTEGER_FIELD (jo, "gather_scatter_pair_general_ops",
-                      sve.gather_scatter_pair_general_ops);
-  PARSE_INTEGER_FIELD (jo, "gather_scatter_pair_pred_ops",
-                      sve.gather_scatter_pair_pred_ops);
-}
-
-template <typename T>
-static void
-parse_branch_costs (const json::object *jo, T &branch_costs)
-{
-  PARSE_INTEGER_FIELD (jo, "predictable", branch_costs.predictable);
-  PARSE_INTEGER_FIELD (jo, "unpredictable", branch_costs.unpredictable);
-}
-
-template <typename T>
-static void
-parse_approx_modes (const json::object *jo, T &approx_modes)
-{
-  PARSE_INTEGER_FIELD (jo, "division", approx_modes.division);
-  PARSE_INTEGER_FIELD (jo, "sqrt", approx_modes.sqrt);
-  PARSE_INTEGER_FIELD (jo, "recip_sqrt", approx_modes.recip_sqrt);
-}
-
-template <typename T>
-static void
-parse_memmov_cost (const json::object *jo, T &memmov_cost)
-{
-  PARSE_INTEGER_FIELD (jo, "load_int", memmov_cost.load_int);
-  PARSE_INTEGER_FIELD (jo, "store_int", memmov_cost.store_int);
-  PARSE_INTEGER_FIELD (jo, "load_fp", memmov_cost.load_fp);
-  PARSE_INTEGER_FIELD (jo, "store_fp", memmov_cost.store_fp);
-  PARSE_INTEGER_FIELD (jo, "load_pred", memmov_cost.load_pred);
-  PARSE_INTEGER_FIELD (jo, "store_pred", memmov_cost.store_pred);
-}
-
-template <typename T>
-static void
-parse_prefetch (const json::object *jo, T &prefetch)
-{
-  PARSE_INTEGER_FIELD (jo, "num_slots", prefetch.num_slots);
-  PARSE_INTEGER_FIELD (jo, "l1_cache_size", prefetch.l1_cache_size);
-  PARSE_INTEGER_FIELD (jo, "l1_cache_line_size", prefetch.l1_cache_line_size);
-  PARSE_INTEGER_FIELD (jo, "l2_cache_size", prefetch.l2_cache_size);
-  PARSE_BOOLEAN_FIELD (jo, "prefetch_dynamic_strides",
-                      prefetch.prefetch_dynamic_strides);
-  PARSE_INTEGER_FIELD (jo, "minimum_stride", prefetch.minimum_stride);
-  PARSE_INTEGER_FIELD (jo, "default_opt_level", prefetch.default_opt_level);
-}
-
-template <typename T>
-static void
-parse_insn_extra_cost (const json::object *jo, T &insn_extra_cost)
-{
-  PARSE_OBJECT (jo, "alu", insn_extra_cost.alu, parse_insn_extra_cost_alu);
-  PARSE_ARRAY_FIELD (jo, "mult", insn_extra_cost.mult,
-                    parse_insn_extra_cost_mult_element);
-  PARSE_OBJECT (jo, "ldst", insn_extra_cost.ldst, parse_insn_extra_cost_ldst);
-  PARSE_ARRAY_FIELD (jo, "fp", insn_extra_cost.fp,
-                    parse_insn_extra_cost_fp_element);
-  PARSE_OBJECT (jo, "vect", insn_extra_cost.vect, parse_insn_extra_cost_vect);
-}
-
-template <typename T>
-static void
-parse_addr_cost (const json::object *jo, T &addr_cost)
-{
-  PARSE_OBJECT (jo, "addr_scale_costs", addr_cost.addr_scale_costs,
-               parse_addr_cost_addr_scale_costs);
-  PARSE_INTEGER_FIELD (jo, "pre_modify", addr_cost.pre_modify);
-  PARSE_INTEGER_FIELD (jo, "post_modify", addr_cost.post_modify);
-  PARSE_INTEGER_FIELD (jo, "post_modify_ld3_st3",
-                      addr_cost.post_modify_ld3_st3);
-  PARSE_INTEGER_FIELD (jo, "post_modify_ld4_st4",
-                      addr_cost.post_modify_ld4_st4);
-  PARSE_INTEGER_FIELD (jo, "register_offset", addr_cost.register_offset);
-  PARSE_INTEGER_FIELD (jo, "register_sextend", addr_cost.register_sextend);
-  PARSE_INTEGER_FIELD (jo, "register_zextend", addr_cost.register_zextend);
-  PARSE_INTEGER_FIELD (jo, "imm_offset", addr_cost.imm_offset);
-}
-
-template <typename T>
-static void
-parse_vec_costs_issue_info (const json::object *jo, T &issue_info)
-{
-  PARSE_OBJECT (jo, "scalar", issue_info.scalar,
-               parse_vec_costs_issue_info_scalar);
-  PARSE_OBJECT (jo, "advsimd", issue_info.advsimd,
-               parse_vec_costs_issue_info_advsimd);
-  PARSE_OBJECT (jo, "sve", issue_info.sve, parse_vec_costs_issue_info_sve);
-}
-
-template <typename T>
-static void
-parse_vec_costs (const json::object *jo, T &vec_costs)
-{
-  PARSE_INTEGER_FIELD (jo, "scalar_int_stmt_cost",
-                      vec_costs.scalar_int_stmt_cost);
-  PARSE_INTEGER_FIELD (jo, "scalar_fp_stmt_cost",
-                      vec_costs.scalar_fp_stmt_cost);
-  PARSE_INTEGER_FIELD (jo, "scalar_load_cost", vec_costs.scalar_load_cost);
-  PARSE_INTEGER_FIELD (jo, "scalar_store_cost", vec_costs.scalar_store_cost);
-  PARSE_INTEGER_FIELD (jo, "cond_taken_branch_cost",
-                      vec_costs.cond_taken_branch_cost);
-  PARSE_INTEGER_FIELD (jo, "cond_not_taken_branch_cost",
-                      vec_costs.cond_not_taken_branch_cost);
-  PARSE_OBJECT (jo, "advsimd", vec_costs.advsimd, parse_vec_costs_advsimd);
-  PARSE_OBJECT (jo, "sve", vec_costs.sve, parse_vec_costs_sve);
-  PARSE_OBJECT (jo, "issue_info", vec_costs.issue_info,
-               parse_vec_costs_issue_info);
-}
-
-template <typename T>
-static void
-parse_tunings (const json::object *jo, T &tunings)
-{
-  PARSE_OBJECT (jo, "insn_extra_cost", tunings.insn_extra_cost,
-               parse_insn_extra_cost);
-  PARSE_OBJECT (jo, "addr_cost", tunings.addr_cost, parse_addr_cost);
-  PARSE_OBJECT (jo, "regmove_cost", tunings.regmove_cost, parse_regmove_cost);
-  PARSE_OBJECT (jo, "vec_costs", tunings.vec_costs, parse_vec_costs);
-  PARSE_OBJECT (jo, "branch_costs", tunings.branch_costs, parse_branch_costs);
-  PARSE_OBJECT (jo, "approx_modes", tunings.approx_modes, parse_approx_modes);
-  PARSE_INTEGER_FIELD (jo, "sve_width", tunings.sve_width);
-  PARSE_OBJECT (jo, "memmov_cost", tunings.memmov_cost, parse_memmov_cost);
-  PARSE_INTEGER_FIELD (jo, "issue_rate", tunings.issue_rate);
-  PARSE_INTEGER_FIELD (jo, "fusible_ops", tunings.fusible_ops);
-  PARSE_STRING_FIELD (jo, "function_align", tunings.function_align);
-  PARSE_STRING_FIELD (jo, "jump_align", tunings.jump_align);
-  PARSE_STRING_FIELD (jo, "loop_align", tunings.loop_align);
-  PARSE_INTEGER_FIELD (jo, "int_reassoc_width", tunings.int_reassoc_width);
-  PARSE_INTEGER_FIELD (jo, "fp_reassoc_width", tunings.fp_reassoc_width);
-  PARSE_INTEGER_FIELD (jo, "fma_reassoc_width", tunings.fma_reassoc_width);
-  PARSE_INTEGER_FIELD (jo, "vec_reassoc_width", tunings.vec_reassoc_width);
-  PARSE_INTEGER_FIELD (jo, "min_div_recip_mul_sf",
-                      tunings.min_div_recip_mul_sf);
-  PARSE_INTEGER_FIELD (jo, "min_div_recip_mul_df",
-                      tunings.min_div_recip_mul_df);
-  PARSE_INTEGER_FIELD (jo, "max_case_values", tunings.max_case_values);
-  PARSE_ENUM_FIELD (jo, "autoprefetcher_model", tunings.autoprefetcher_model,
-                   autoprefetcher_model_mappings);
-  PARSE_INTEGER_FIELD (jo, "extra_tuning_flags", tunings.extra_tuning_flags);
-  PARSE_OBJECT (jo, "prefetch", tunings.prefetch, parse_prefetch);
-  PARSE_ENUM_FIELD (jo, "ldp_policy_model", tunings.ldp_policy_model,
-                   ldp_policy_model_mappings);
-  PARSE_ENUM_FIELD (jo, "stp_policy_model", tunings.stp_policy_model,
-                   stp_policy_model_mappings);
-}
+/* Include auto-generated parsing routines.  */
+#include "aarch64-json-tunings-parser-generated.inc"
 
 /* Validate the user provided JSON data against the present schema.
    Checks for correct types, fields, and expected format.  */
diff --git a/gcc/config/aarch64/aarch64-json-tunings-printer-generated.inc 
b/gcc/config/aarch64/aarch64-json-tunings-printer-generated.inc
new file mode 100644
index 00000000000..e347cb9dfcf
--- /dev/null
+++ b/gcc/config/aarch64/aarch64-json-tunings-printer-generated.inc
@@ -0,0 +1,421 @@
+/* This file is auto-generated by aarch64-generate-json-tuning-routines.py.  */
+/* Copyright The GNU Toolchain Authors.
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3, or (at your option) any later
+   version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file contains the auto-generated serializer functions for JSON tuning 
parameters.  */
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost_alu (const T &alu)
+{
+  auto alu_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (alu_obj, "arith", alu.arith);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "logical", alu.logical);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "shift", alu.shift);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "shift_reg", alu.shift_reg);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "arith_shift", alu.arith_shift);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "arith_shift_reg", alu.arith_shift_reg);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "log_shift", alu.log_shift);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "log_shift_reg", alu.log_shift_reg);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "extend", alu.extend);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "extend_arith", alu.extend_arith);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "bfi", alu.bfi);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "bfx", alu.bfx);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "clz", alu.clz);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "rev", alu.rev);
+  SERIALIZE_INTEGER_FIELD (alu_obj, "non_exec", alu.non_exec);
+  SERIALIZE_BOOLEAN_FIELD (alu_obj, "non_exec_costs_exec", 
alu.non_exec_costs_exec);
+
+  return alu_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost_mult_element (const T &mult_element)
+{
+  auto mult_element_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "simple", mult_element.simple);
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "flag_setting", 
mult_element.flag_setting);
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "extend", mult_element.extend);
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "add", mult_element.add);
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "extend_add", 
mult_element.extend_add);
+  SERIALIZE_INTEGER_FIELD (mult_element_obj, "idiv", mult_element.idiv);
+
+  return mult_element_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost_ldst (const T &ldst)
+{
+  auto ldst_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "load", ldst.load);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "load_sign_extend", 
ldst.load_sign_extend);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldrd", ldst.ldrd);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_1st", ldst.ldm_1st);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_regs_per_insn_1st", 
ldst.ldm_regs_per_insn_1st);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_regs_per_insn_subsequent", 
ldst.ldm_regs_per_insn_subsequent);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadf", ldst.loadf);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadd", ldst.loadd);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "load_unaligned", ldst.load_unaligned);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "store", ldst.store);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "strd", ldst.strd);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_1st", ldst.stm_1st);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_regs_per_insn_1st", 
ldst.stm_regs_per_insn_1st);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_regs_per_insn_subsequent", 
ldst.stm_regs_per_insn_subsequent);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "storef", ldst.storef);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "stored", ldst.stored);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "store_unaligned", ldst.store_unaligned);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadv", ldst.loadv);
+  SERIALIZE_INTEGER_FIELD (ldst_obj, "storev", ldst.storev);
+
+  return ldst_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost_fp_element (const T &fp_element)
+{
+  auto fp_element_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "div", fp_element.div);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "mult", fp_element.mult);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "mult_addsub", 
fp_element.mult_addsub);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fma", fp_element.fma);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "addsub", fp_element.addsub);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fpconst", fp_element.fpconst);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "neg", fp_element.neg);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "compare", fp_element.compare);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "widen", fp_element.widen);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "narrow", fp_element.narrow);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "toint", fp_element.toint);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fromint", fp_element.fromint);
+  SERIALIZE_INTEGER_FIELD (fp_element_obj, "roundint", fp_element.roundint);
+
+  return fp_element_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost_vect (const T &vect)
+{
+  auto vect_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (vect_obj, "alu", vect.alu);
+  SERIALIZE_INTEGER_FIELD (vect_obj, "mult", vect.mult);
+  SERIALIZE_INTEGER_FIELD (vect_obj, "movi", vect.movi);
+  SERIALIZE_INTEGER_FIELD (vect_obj, "dup", vect.dup);
+  SERIALIZE_INTEGER_FIELD (vect_obj, "extract", vect.extract);
+
+  return vect_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_addr_cost_addr_scale_costs (const T &addr_scale_costs)
+{
+  auto addr_scale_costs_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "hi", addr_scale_costs.hi);
+  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "si", addr_scale_costs.si);
+  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "di", addr_scale_costs.di);
+  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "ti", addr_scale_costs.ti);
+
+  return addr_scale_costs_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_regmove_cost (const T &regmove_cost)
+{
+  auto regmove_cost_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "GP2GP", regmove_cost.GP2GP);
+  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "GP2FP", regmove_cost.GP2FP);
+  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "FP2GP", regmove_cost.FP2GP);
+  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "FP2FP", regmove_cost.FP2FP);
+
+  return regmove_cost_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_advsimd (const T &advsimd)
+{
+  auto advsimd_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "int_stmt_cost", 
advsimd.int_stmt_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_stmt_cost", advsimd.fp_stmt_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld2_st2_permute_cost", 
advsimd.ld2_st2_permute_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld3_st3_permute_cost", 
advsimd.ld3_st3_permute_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld4_st4_permute_cost", 
advsimd.ld4_st4_permute_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "permute_cost", advsimd.permute_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i8_cost", 
advsimd.reduc_i8_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i16_cost", 
advsimd.reduc_i16_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i32_cost", 
advsimd.reduc_i32_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i64_cost", 
advsimd.reduc_i64_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f16_cost", 
advsimd.reduc_f16_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f32_cost", 
advsimd.reduc_f32_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f64_cost", 
advsimd.reduc_f64_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "store_elt_extra_cost", 
advsimd.store_elt_extra_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "vec_to_scalar_cost", 
advsimd.vec_to_scalar_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "scalar_to_vec_cost", 
advsimd.scalar_to_vec_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "align_load_cost", 
advsimd.align_load_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "unalign_load_cost", 
advsimd.unalign_load_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "unalign_store_cost", 
advsimd.unalign_store_cost);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "store_cost", advsimd.store_cost);
+
+  return advsimd_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_sve (const T &sve)
+{
+  auto sve_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (sve_obj, "clast_cost", sve.clast_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f16_cost", sve.fadda_f16_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f32_cost", sve.fadda_f32_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f64_cost", sve.fadda_f64_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x32_cost", 
sve.gather_load_x32_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x64_cost", 
sve.gather_load_x64_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x32_init_cost", 
sve.gather_load_x32_init_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x64_init_cost", 
sve.gather_load_x64_init_cost);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "scatter_store_elt_cost", 
sve.scatter_store_elt_cost);
+
+  return sve_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_issue_info_scalar (const T &scalar)
+{
+  auto scalar_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (scalar_obj, "loads_stores_per_cycle", 
scalar.loads_stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (scalar_obj, "stores_per_cycle", 
scalar.stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (scalar_obj, "general_ops_per_cycle", 
scalar.general_ops_per_cycle);
+  SERIALIZE_INTEGER_FIELD (scalar_obj, "fp_simd_load_general_ops", 
scalar.fp_simd_load_general_ops);
+  SERIALIZE_INTEGER_FIELD (scalar_obj, "fp_simd_store_general_ops", 
scalar.fp_simd_store_general_ops);
+
+  return scalar_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_issue_info_advsimd (const T &advsimd)
+{
+  auto advsimd_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "loads_stores_per_cycle", 
advsimd.loads_stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "stores_per_cycle", 
advsimd.stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "general_ops_per_cycle", 
advsimd.general_ops_per_cycle);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_simd_load_general_ops", 
advsimd.fp_simd_load_general_ops);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_simd_store_general_ops", 
advsimd.fp_simd_store_general_ops);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld2_st2_general_ops", 
advsimd.ld2_st2_general_ops);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld3_st3_general_ops", 
advsimd.ld3_st3_general_ops);
+  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld4_st4_general_ops", 
advsimd.ld4_st4_general_ops);
+
+  return advsimd_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_issue_info_sve (const T &sve)
+{
+  auto sve_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (sve_obj, "loads_stores_per_cycle", 
sve.loads_stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "stores_per_cycle", sve.stores_per_cycle);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "general_ops_per_cycle", 
sve.general_ops_per_cycle);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_simd_load_general_ops", 
sve.fp_simd_load_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_simd_store_general_ops", 
sve.fp_simd_store_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "ld2_st2_general_ops", 
sve.ld2_st2_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "ld3_st3_general_ops", 
sve.ld3_st3_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "ld4_st4_general_ops", 
sve.ld4_st4_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "pred_ops_per_cycle", 
sve.pred_ops_per_cycle);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "while_pred_ops", sve.while_pred_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "int_cmp_pred_ops", sve.int_cmp_pred_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_cmp_pred_ops", sve.fp_cmp_pred_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_scatter_pair_general_ops", 
sve.gather_scatter_pair_general_ops);
+  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_scatter_pair_pred_ops", 
sve.gather_scatter_pair_pred_ops);
+
+  return sve_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_branch_costs (const T &branch_costs)
+{
+  auto branch_costs_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (branch_costs_obj, "predictable", 
branch_costs.predictable);
+  SERIALIZE_INTEGER_FIELD (branch_costs_obj, "unpredictable", 
branch_costs.unpredictable);
+
+  return branch_costs_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_approx_modes (const T &approx_modes)
+{
+  auto approx_modes_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "division", 
approx_modes.division);
+  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "sqrt", approx_modes.sqrt);
+  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "recip_sqrt", 
approx_modes.recip_sqrt);
+
+  return approx_modes_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_memmov_cost (const T &memmov_cost)
+{
+  auto memmov_cost_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_int", memmov_cost.load_int);
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_int", 
memmov_cost.store_int);
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_fp", memmov_cost.load_fp);
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_fp", memmov_cost.store_fp);
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_pred", 
memmov_cost.load_pred);
+  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_pred", 
memmov_cost.store_pred);
+
+  return memmov_cost_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_prefetch (const T &prefetch)
+{
+  auto prefetch_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "num_slots", prefetch.num_slots);
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l1_cache_size", 
prefetch.l1_cache_size);
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l1_cache_line_size", 
prefetch.l1_cache_line_size);
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l2_cache_size", 
prefetch.l2_cache_size);
+  SERIALIZE_BOOLEAN_FIELD (prefetch_obj, "prefetch_dynamic_strides", 
prefetch.prefetch_dynamic_strides);
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "minimum_stride", 
prefetch.minimum_stride);
+  SERIALIZE_INTEGER_FIELD (prefetch_obj, "default_opt_level", 
prefetch.default_opt_level);
+
+  return prefetch_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_insn_extra_cost (const T &insn_extra_cost)
+{
+  auto insn_extra_cost_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_OBJECT (insn_extra_cost_obj, "alu", insn_extra_cost.alu, 
serialize_insn_extra_cost_alu);
+  SERIALIZE_ARRAY_FIELD (insn_extra_cost_obj, "mult", insn_extra_cost.mult, 2, 
serialize_insn_extra_cost_mult_element);
+  SERIALIZE_OBJECT (insn_extra_cost_obj, "ldst", insn_extra_cost.ldst, 
serialize_insn_extra_cost_ldst);
+  SERIALIZE_ARRAY_FIELD (insn_extra_cost_obj, "fp", insn_extra_cost.fp, 2, 
serialize_insn_extra_cost_fp_element);
+  SERIALIZE_OBJECT (insn_extra_cost_obj, "vect", insn_extra_cost.vect, 
serialize_insn_extra_cost_vect);
+
+  return insn_extra_cost_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_addr_cost (const T &addr_cost)
+{
+  auto addr_cost_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_OBJECT (addr_cost_obj, "addr_scale_costs", 
addr_cost.addr_scale_costs, serialize_addr_cost_addr_scale_costs);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "pre_modify", addr_cost.pre_modify);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify", 
addr_cost.post_modify);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify_ld3_st3", 
addr_cost.post_modify_ld3_st3);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify_ld4_st4", 
addr_cost.post_modify_ld4_st4);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_offset", 
addr_cost.register_offset);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_sextend", 
addr_cost.register_sextend);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_zextend", 
addr_cost.register_zextend);
+  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "imm_offset", addr_cost.imm_offset);
+
+  return addr_cost_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs_issue_info (const T &issue_info)
+{
+  auto issue_info_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_OBJECT (issue_info_obj, "scalar", issue_info.scalar, 
serialize_vec_costs_issue_info_scalar);
+  SERIALIZE_OBJECT (issue_info_obj, "advsimd", issue_info.advsimd, 
serialize_vec_costs_issue_info_advsimd);
+  SERIALIZE_OBJECT (issue_info_obj, "sve", issue_info.sve, 
serialize_vec_costs_issue_info_sve);
+
+  return issue_info_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_vec_costs (const T &vec_costs)
+{
+  auto vec_costs_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_int_stmt_cost", 
vec_costs.scalar_int_stmt_cost);
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_fp_stmt_cost", 
vec_costs.scalar_fp_stmt_cost);
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_load_cost", 
vec_costs.scalar_load_cost);
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_store_cost", 
vec_costs.scalar_store_cost);
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "cond_taken_branch_cost", 
vec_costs.cond_taken_branch_cost);
+  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "cond_not_taken_branch_cost", 
vec_costs.cond_not_taken_branch_cost);
+  SERIALIZE_OBJECT (vec_costs_obj, "advsimd", vec_costs.advsimd, 
serialize_vec_costs_advsimd);
+  SERIALIZE_OBJECT (vec_costs_obj, "sve", vec_costs.sve, 
serialize_vec_costs_sve);
+  SERIALIZE_OBJECT (vec_costs_obj, "issue_info", vec_costs.issue_info, 
serialize_vec_costs_issue_info);
+
+  return vec_costs_obj;
+}
+
+template <typename T>
+static std::unique_ptr<json::object>
+serialize_tunings (const T &tunings)
+{
+  auto tunings_obj = std::make_unique<json::object> ();
+
+  SERIALIZE_OBJECT (tunings_obj, "insn_extra_cost", tunings.insn_extra_cost, 
serialize_insn_extra_cost);
+  SERIALIZE_OBJECT (tunings_obj, "addr_cost", tunings.addr_cost, 
serialize_addr_cost);
+  SERIALIZE_OBJECT (tunings_obj, "regmove_cost", tunings.regmove_cost, 
serialize_regmove_cost);
+  SERIALIZE_OBJECT (tunings_obj, "vec_costs", tunings.vec_costs, 
serialize_vec_costs);
+  SERIALIZE_OBJECT (tunings_obj, "branch_costs", tunings.branch_costs, 
serialize_branch_costs);
+  SERIALIZE_OBJECT (tunings_obj, "approx_modes", tunings.approx_modes, 
serialize_approx_modes);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "sve_width", tunings.sve_width);
+  SERIALIZE_OBJECT (tunings_obj, "memmov_cost", tunings.memmov_cost, 
serialize_memmov_cost);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "issue_rate", tunings.issue_rate);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "fusible_ops", tunings.fusible_ops);
+  SERIALIZE_STRING_FIELD (tunings_obj, "function_align", 
tunings.function_align);
+  SERIALIZE_STRING_FIELD (tunings_obj, "jump_align", tunings.jump_align);
+  SERIALIZE_STRING_FIELD (tunings_obj, "loop_align", tunings.loop_align);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "int_reassoc_width", 
tunings.int_reassoc_width);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "fp_reassoc_width", 
tunings.fp_reassoc_width);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "fma_reassoc_width", 
tunings.fma_reassoc_width);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "vec_reassoc_width", 
tunings.vec_reassoc_width);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "min_div_recip_mul_sf", 
tunings.min_div_recip_mul_sf);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "min_div_recip_mul_df", 
tunings.min_div_recip_mul_df);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "max_case_values", 
tunings.max_case_values);
+  SERIALIZE_ENUM_FIELD (tunings_obj, "autoprefetcher_model", 
tunings.autoprefetcher_model, autoprefetcher_model_mappings);
+  SERIALIZE_INTEGER_FIELD (tunings_obj, "extra_tuning_flags", 
tunings.extra_tuning_flags);
+  SERIALIZE_OBJECT (tunings_obj, "prefetch", tunings.prefetch, 
serialize_prefetch);
+  SERIALIZE_ENUM_FIELD (tunings_obj, "ldp_policy_model", 
tunings.ldp_policy_model, ldp_policy_model_mappings);
+  SERIALIZE_ENUM_FIELD (tunings_obj, "stp_policy_model", 
tunings.stp_policy_model, stp_policy_model_mappings);
+
+  return tunings_obj;
+}
diff --git a/gcc/config/aarch64/aarch64-json-tunings-printer.cc 
b/gcc/config/aarch64/aarch64-json-tunings-printer.cc
index 926829886a4..9b0da3ec303 100644
--- a/gcc/config/aarch64/aarch64-json-tunings-printer.cc
+++ b/gcc/config/aarch64/aarch64-json-tunings-printer.cc
@@ -122,513 +122,8 @@ serialize_enum (EnumType enum_value, const 
enum_mapping<EnumType> *mappings,
   return mappings[0].name;
 }
 
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost_alu (const T &alu)
-{
-  auto alu_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (alu_obj, "arith", alu.arith);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "logical", alu.logical);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "shift", alu.shift);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "shift_reg", alu.shift_reg);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "arith_shift", alu.arith_shift);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "arith_shift_reg", alu.arith_shift_reg);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "log_shift", alu.log_shift);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "log_shift_reg", alu.log_shift_reg);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "extend", alu.extend);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "extend_arith", alu.extend_arith);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "bfi", alu.bfi);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "bfx", alu.bfx);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "clz", alu.clz);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "rev", alu.rev);
-  SERIALIZE_INTEGER_FIELD (alu_obj, "non_exec", alu.non_exec);
-  SERIALIZE_BOOLEAN_FIELD (alu_obj, "non_exec_costs_exec",
-                          alu.non_exec_costs_exec);
-
-  return alu_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost_mult_element (const T &mult_element)
-{
-  auto mult_element_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "simple", mult_element.simple);
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "flag_setting",
-                          mult_element.flag_setting);
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "extend", mult_element.extend);
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "add", mult_element.add);
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "extend_add",
-                          mult_element.extend_add);
-  SERIALIZE_INTEGER_FIELD (mult_element_obj, "idiv", mult_element.idiv);
-
-  return mult_element_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost_ldst (const T &ldst)
-{
-  auto ldst_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "load", ldst.load);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "load_sign_extend", 
ldst.load_sign_extend);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldrd", ldst.ldrd);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_1st", ldst.ldm_1st);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_regs_per_insn_1st",
-                          ldst.ldm_regs_per_insn_1st);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "ldm_regs_per_insn_subsequent",
-                          ldst.ldm_regs_per_insn_subsequent);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadf", ldst.loadf);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadd", ldst.loadd);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "load_unaligned", ldst.load_unaligned);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "store", ldst.store);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "strd", ldst.strd);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_1st", ldst.stm_1st);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_regs_per_insn_1st",
-                          ldst.stm_regs_per_insn_1st);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "stm_regs_per_insn_subsequent",
-                          ldst.stm_regs_per_insn_subsequent);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "storef", ldst.storef);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "stored", ldst.stored);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "store_unaligned", ldst.store_unaligned);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "loadv", ldst.loadv);
-  SERIALIZE_INTEGER_FIELD (ldst_obj, "storev", ldst.storev);
-
-  return ldst_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost_fp_element (const T &fp_element)
-{
-  auto fp_element_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "div", fp_element.div);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "mult", fp_element.mult);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "mult_addsub",
-                          fp_element.mult_addsub);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fma", fp_element.fma);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "addsub", fp_element.addsub);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fpconst", fp_element.fpconst);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "neg", fp_element.neg);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "compare", fp_element.compare);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "widen", fp_element.widen);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "narrow", fp_element.narrow);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "toint", fp_element.toint);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "fromint", fp_element.fromint);
-  SERIALIZE_INTEGER_FIELD (fp_element_obj, "roundint", fp_element.roundint);
-
-  return fp_element_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost_vect (const T &vect)
-{
-  auto vect_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (vect_obj, "alu", vect.alu);
-  SERIALIZE_INTEGER_FIELD (vect_obj, "mult", vect.mult);
-  SERIALIZE_INTEGER_FIELD (vect_obj, "movi", vect.movi);
-  SERIALIZE_INTEGER_FIELD (vect_obj, "dup", vect.dup);
-  SERIALIZE_INTEGER_FIELD (vect_obj, "extract", vect.extract);
-
-  return vect_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_addr_cost_addr_scale_costs (const T &addr_scale_costs)
-{
-  auto addr_scale_costs_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "hi", addr_scale_costs.hi);
-  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "si", addr_scale_costs.si);
-  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "di", addr_scale_costs.di);
-  SERIALIZE_INTEGER_FIELD (addr_scale_costs_obj, "ti", addr_scale_costs.ti);
-
-  return addr_scale_costs_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_regmove_cost (const T &regmove_cost)
-{
-  auto regmove_cost_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "GP2GP", regmove_cost.GP2GP);
-  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "GP2FP", regmove_cost.GP2FP);
-  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "FP2GP", regmove_cost.FP2GP);
-  SERIALIZE_INTEGER_FIELD (regmove_cost_obj, "FP2FP", regmove_cost.FP2FP);
-
-  return regmove_cost_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_advsimd (const T &advsimd)
-{
-  auto advsimd_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "int_stmt_cost", 
advsimd.int_stmt_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_stmt_cost", advsimd.fp_stmt_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld2_st2_permute_cost",
-                          advsimd.ld2_st2_permute_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld3_st3_permute_cost",
-                          advsimd.ld3_st3_permute_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld4_st4_permute_cost",
-                          advsimd.ld4_st4_permute_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "permute_cost", advsimd.permute_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i8_cost", 
advsimd.reduc_i8_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i16_cost",
-                          advsimd.reduc_i16_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i32_cost",
-                          advsimd.reduc_i32_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_i64_cost",
-                          advsimd.reduc_i64_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f16_cost",
-                          advsimd.reduc_f16_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f32_cost",
-                          advsimd.reduc_f32_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "reduc_f64_cost",
-                          advsimd.reduc_f64_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "store_elt_extra_cost",
-                          advsimd.store_elt_extra_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "vec_to_scalar_cost",
-                          advsimd.vec_to_scalar_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "scalar_to_vec_cost",
-                          advsimd.scalar_to_vec_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "align_load_cost",
-                          advsimd.align_load_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "unalign_load_cost",
-                          advsimd.unalign_load_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "unalign_store_cost",
-                          advsimd.unalign_store_cost);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "store_cost", advsimd.store_cost);
-
-  return advsimd_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_sve (const T &sve)
-{
-  auto sve_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (sve_obj, "clast_cost", sve.clast_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f16_cost", sve.fadda_f16_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f32_cost", sve.fadda_f32_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fadda_f64_cost", sve.fadda_f64_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x32_cost",
-                          sve.gather_load_x32_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x64_cost",
-                          sve.gather_load_x64_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x32_init_cost",
-                          sve.gather_load_x32_init_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_load_x64_init_cost",
-                          sve.gather_load_x64_init_cost);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "scatter_store_elt_cost",
-                          sve.scatter_store_elt_cost);
-
-  return sve_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_issue_info_scalar (const T &scalar)
-{
-  auto scalar_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (scalar_obj, "loads_stores_per_cycle",
-                          scalar.loads_stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (scalar_obj, "stores_per_cycle",
-                          scalar.stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (scalar_obj, "general_ops_per_cycle",
-                          scalar.general_ops_per_cycle);
-  SERIALIZE_INTEGER_FIELD (scalar_obj, "fp_simd_load_general_ops",
-                          scalar.fp_simd_load_general_ops);
-  SERIALIZE_INTEGER_FIELD (scalar_obj, "fp_simd_store_general_ops",
-                          scalar.fp_simd_store_general_ops);
-
-  return scalar_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_issue_info_advsimd (const T &advsimd)
-{
-  auto advsimd_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "loads_stores_per_cycle",
-                          advsimd.loads_stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "stores_per_cycle",
-                          advsimd.stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "general_ops_per_cycle",
-                          advsimd.general_ops_per_cycle);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_simd_load_general_ops",
-                          advsimd.fp_simd_load_general_ops);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "fp_simd_store_general_ops",
-                          advsimd.fp_simd_store_general_ops);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld2_st2_general_ops",
-                          advsimd.ld2_st2_general_ops);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld3_st3_general_ops",
-                          advsimd.ld3_st3_general_ops);
-  SERIALIZE_INTEGER_FIELD (advsimd_obj, "ld4_st4_general_ops",
-                          advsimd.ld4_st4_general_ops);
-
-  return advsimd_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_issue_info_sve (const T &sve)
-{
-  auto sve_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (sve_obj, "loads_stores_per_cycle",
-                          sve.loads_stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "stores_per_cycle", sve.stores_per_cycle);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "general_ops_per_cycle",
-                          sve.general_ops_per_cycle);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_simd_load_general_ops",
-                          sve.fp_simd_load_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_simd_store_general_ops",
-                          sve.fp_simd_store_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "ld2_st2_general_ops",
-                          sve.ld2_st2_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "ld3_st3_general_ops",
-                          sve.ld3_st3_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "ld4_st4_general_ops",
-                          sve.ld4_st4_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "pred_ops_per_cycle",
-                          sve.pred_ops_per_cycle);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "while_pred_ops", sve.while_pred_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "int_cmp_pred_ops", sve.int_cmp_pred_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "fp_cmp_pred_ops", sve.fp_cmp_pred_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_scatter_pair_general_ops",
-                          sve.gather_scatter_pair_general_ops);
-  SERIALIZE_INTEGER_FIELD (sve_obj, "gather_scatter_pair_pred_ops",
-                          sve.gather_scatter_pair_pred_ops);
-
-  return sve_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_branch_costs (const T &branch_costs)
-{
-  auto branch_costs_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (branch_costs_obj, "predictable",
-                          branch_costs.predictable);
-  SERIALIZE_INTEGER_FIELD (branch_costs_obj, "unpredictable",
-                          branch_costs.unpredictable);
-
-  return branch_costs_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_approx_modes (const T &approx_modes)
-{
-  auto approx_modes_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "division", 
approx_modes.division);
-  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "sqrt", approx_modes.sqrt);
-  SERIALIZE_INTEGER_FIELD (approx_modes_obj, "recip_sqrt",
-                          approx_modes.recip_sqrt);
-
-  return approx_modes_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_memmov_cost (const T &memmov_cost)
-{
-  auto memmov_cost_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_int", memmov_cost.load_int);
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_int", 
memmov_cost.store_int);
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_fp", memmov_cost.load_fp);
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_fp", memmov_cost.store_fp);
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "load_pred", 
memmov_cost.load_pred);
-  SERIALIZE_INTEGER_FIELD (memmov_cost_obj, "store_pred",
-                          memmov_cost.store_pred);
-
-  return memmov_cost_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_prefetch (const T &prefetch)
-{
-  auto prefetch_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "num_slots", prefetch.num_slots);
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l1_cache_size",
-                          prefetch.l1_cache_size);
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l1_cache_line_size",
-                          prefetch.l1_cache_line_size);
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "l2_cache_size",
-                          prefetch.l2_cache_size);
-  SERIALIZE_BOOLEAN_FIELD (prefetch_obj, "prefetch_dynamic_strides",
-                          prefetch.prefetch_dynamic_strides);
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "minimum_stride",
-                          prefetch.minimum_stride);
-  SERIALIZE_INTEGER_FIELD (prefetch_obj, "default_opt_level",
-                          prefetch.default_opt_level);
-
-  return prefetch_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_insn_extra_cost (const T &insn_extra_cost)
-{
-  auto insn_extra_cost_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_OBJECT (insn_extra_cost_obj, "alu", insn_extra_cost.alu,
-                   serialize_insn_extra_cost_alu);
-  SERIALIZE_ARRAY_FIELD (insn_extra_cost_obj, "mult", insn_extra_cost.mult, 2,
-                        serialize_insn_extra_cost_mult_element);
-  SERIALIZE_OBJECT (insn_extra_cost_obj, "ldst", insn_extra_cost.ldst,
-                   serialize_insn_extra_cost_ldst);
-  SERIALIZE_ARRAY_FIELD (insn_extra_cost_obj, "fp", insn_extra_cost.fp, 2,
-                        serialize_insn_extra_cost_fp_element);
-  SERIALIZE_OBJECT (insn_extra_cost_obj, "vect", insn_extra_cost.vect,
-                   serialize_insn_extra_cost_vect);
-
-  return insn_extra_cost_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_addr_cost (const T &addr_cost)
-{
-  auto addr_cost_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_OBJECT (addr_cost_obj, "addr_scale_costs",
-                   addr_cost.addr_scale_costs,
-                   serialize_addr_cost_addr_scale_costs);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "pre_modify", addr_cost.pre_modify);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify", 
addr_cost.post_modify);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify_ld3_st3",
-                          addr_cost.post_modify_ld3_st3);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "post_modify_ld4_st4",
-                          addr_cost.post_modify_ld4_st4);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_offset",
-                          addr_cost.register_offset);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_sextend",
-                          addr_cost.register_sextend);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "register_zextend",
-                          addr_cost.register_zextend);
-  SERIALIZE_INTEGER_FIELD (addr_cost_obj, "imm_offset", addr_cost.imm_offset);
-
-  return addr_cost_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs_issue_info (const T &issue_info)
-{
-  auto issue_info_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_OBJECT (issue_info_obj, "scalar", issue_info.scalar,
-                   serialize_vec_costs_issue_info_scalar);
-  SERIALIZE_OBJECT (issue_info_obj, "advsimd", issue_info.advsimd,
-                   serialize_vec_costs_issue_info_advsimd);
-  SERIALIZE_OBJECT (issue_info_obj, "sve", issue_info.sve,
-                   serialize_vec_costs_issue_info_sve);
-
-  return issue_info_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_vec_costs (const T &vec_costs)
-{
-  auto vec_costs_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_int_stmt_cost",
-                          vec_costs.scalar_int_stmt_cost);
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_fp_stmt_cost",
-                          vec_costs.scalar_fp_stmt_cost);
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_load_cost",
-                          vec_costs.scalar_load_cost);
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "scalar_store_cost",
-                          vec_costs.scalar_store_cost);
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "cond_taken_branch_cost",
-                          vec_costs.cond_taken_branch_cost);
-  SERIALIZE_INTEGER_FIELD (vec_costs_obj, "cond_not_taken_branch_cost",
-                          vec_costs.cond_not_taken_branch_cost);
-  SERIALIZE_OBJECT (vec_costs_obj, "advsimd", vec_costs.advsimd,
-                   serialize_vec_costs_advsimd);
-  SERIALIZE_OBJECT (vec_costs_obj, "sve", vec_costs.sve,
-                   serialize_vec_costs_sve);
-  SERIALIZE_OBJECT (vec_costs_obj, "issue_info", vec_costs.issue_info,
-                   serialize_vec_costs_issue_info);
-
-  return vec_costs_obj;
-}
-
-template <typename T>
-static std::unique_ptr<json::object>
-serialize_tunings (const T &tunings)
-{
-  auto tunings_obj = std::make_unique<json::object> ();
-
-  SERIALIZE_OBJECT (tunings_obj, "insn_extra_cost", tunings.insn_extra_cost,
-                   serialize_insn_extra_cost);
-  SERIALIZE_OBJECT (tunings_obj, "addr_cost", tunings.addr_cost,
-                   serialize_addr_cost);
-  SERIALIZE_OBJECT (tunings_obj, "regmove_cost", tunings.regmove_cost,
-                   serialize_regmove_cost);
-  SERIALIZE_OBJECT (tunings_obj, "vec_costs", tunings.vec_costs,
-                   serialize_vec_costs);
-  SERIALIZE_OBJECT (tunings_obj, "branch_costs", tunings.branch_costs,
-                   serialize_branch_costs);
-  SERIALIZE_OBJECT (tunings_obj, "approx_modes", tunings.approx_modes,
-                   serialize_approx_modes);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "sve_width", tunings.sve_width);
-  SERIALIZE_OBJECT (tunings_obj, "memmov_cost", tunings.memmov_cost,
-                   serialize_memmov_cost);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "issue_rate", tunings.issue_rate);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "fusible_ops", tunings.fusible_ops);
-  SERIALIZE_STRING_FIELD (tunings_obj, "function_align",
-                         tunings.function_align);
-  SERIALIZE_STRING_FIELD (tunings_obj, "jump_align", tunings.jump_align);
-  SERIALIZE_STRING_FIELD (tunings_obj, "loop_align", tunings.loop_align);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "int_reassoc_width",
-                          tunings.int_reassoc_width);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "fp_reassoc_width",
-                          tunings.fp_reassoc_width);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "fma_reassoc_width",
-                          tunings.fma_reassoc_width);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "vec_reassoc_width",
-                          tunings.vec_reassoc_width);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "min_div_recip_mul_sf",
-                          tunings.min_div_recip_mul_sf);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "min_div_recip_mul_df",
-                          tunings.min_div_recip_mul_df);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "max_case_values",
-                          tunings.max_case_values);
-  SERIALIZE_ENUM_FIELD (tunings_obj, "autoprefetcher_model",
-                       tunings.autoprefetcher_model,
-                       autoprefetcher_model_mappings);
-  SERIALIZE_INTEGER_FIELD (tunings_obj, "extra_tuning_flags",
-                          tunings.extra_tuning_flags);
-  SERIALIZE_OBJECT (tunings_obj, "prefetch", tunings.prefetch,
-                   serialize_prefetch);
-  SERIALIZE_ENUM_FIELD (tunings_obj, "ldp_policy_model",
-                       tunings.ldp_policy_model, ldp_policy_model_mappings);
-  SERIALIZE_ENUM_FIELD (tunings_obj, "stp_policy_model",
-                       tunings.stp_policy_model, stp_policy_model_mappings);
-
-  return tunings_obj;
-}
+/* Include auto-generated printing routines.  */
+#include "aarch64-json-tunings-printer-generated.inc"
 
 /* Print tune_params structure to JSON file.  */
 void
diff --git a/gcc/config/aarch64/t-aarch64 b/gcc/config/aarch64/t-aarch64
index 9f285376e79..83c9134fec2 100644
--- a/gcc/config/aarch64/t-aarch64
+++ b/gcc/config/aarch64/t-aarch64
@@ -212,6 +212,7 @@ aarch64-json-tunings-printer.o: 
$(srcdir)/config/aarch64/aarch64-json-tunings-pr
     $(CONFIG_H) $(SYSTEM_H) $(CORETYPES_H) $(TM_H) $(DIAGNOSTIC_CORE_H) \
     $(PRETTY_PRINT_H) json.h \
     $(srcdir)/config/aarch64/aarch64-json-tunings-printer.h \
+    $(srcdir)/config/aarch64/aarch64-json-tunings-printer-generated.inc \
     $(srcdir)/config/aarch64/aarch64-protos.h \
     $(srcdir)/config/arm/aarch-common-protos.h
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
@@ -222,6 +223,7 @@ aarch64-json-tunings-parser.o: 
$(srcdir)/config/aarch64/aarch64-json-tunings-par
     json-parsing.h \
     $(srcdir)/config/aarch64/aarch64-json-schema.h \
     $(srcdir)/config/aarch64/aarch64-json-tunings-parser.h \
+    $(srcdir)/config/aarch64/aarch64-json-tunings-parser-generated.inc \
     $(srcdir)/config/aarch64/aarch64-protos.h \
     $(srcdir)/config/arm/aarch-common-protos.h
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-- 
2.44.0

Reply via email to