Port the vld{1,2,3,4}_dup family of intrinsics to the pragma-based
framework, and add corresponding assembly tests for each variant.

Porting the load-dup builtin functions away from the old framework makes
`aarch64_builtin_signatures::{load,store}` and
`SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX` obsolete, so all code dealing
with them has been deleted.

The `__builtin_aarch64_simd_*` types are also now all obsolete (they
were only used for casting pointers to the correct type in load/store
functions). So all code dealing with them has also been deleted.

gcc/ChangeLog:

        * config/aarch64/aarch64-builtins.h
        (qualifier_struct_load_store_lane_index): Delete now-unused enum
        member.
        * config/aarch64/aarch64-builtins.cc (FLAG_LOAD):
        Delete now-unused global variable.
        (TYPES_LOADSTRUCT, TYPES_LOADSTRUCT_U, TYPES_LOADSTRUCT_P):
        Delete now-unused macros.
        (aarch64_scalar_builtin_types, aarch64_simd_intOI_type_node,
        aarch64_simd_intCI_type_node, aarch64_simd_intXI_type_node):
        Delete now-unused global variables.
        (aarch64_mangle_builtin_scalar_type): Delete now-unused
        function.
        (aarch64_int_or_fp_type): Delete cases handling `E_OImode`,
        `E_CImode` and `E_XImode`.
        (aarch64_init_simd_builtin_types): Delete code to register
        `__builtin_aarch64_simd_{oi,ci,xi}` types.
        (aarch64_init_simd_builtin_scalar_types): Delete now-unused
        function.
        (enum class aarch64_builtin_signatures): Delete now-unused enum
        members `load` and `store`.
        (aarch64_fntype): Delete cases to handle
        `aarch64_builtin_signatures::load` and
        `aarch64_builtin_signatures::store`
        (SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX): Delete now-unused enum
        member.
        (aarch64_simd_expand_args): Delete now-unused `builtin_mode`
        argument; delete case to handle
        `SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX`.
        (aarch64_simd_expand_builtin): Delete handling of
        `qualifier_struct_load_store_lane_index`; remove last argument
        of `aarch64_simd_expand_args`.
        (aarch64_dereference_pointer, aarch64_convert_to_lane_mask):
        Delete now-unused functions.
        (aarch64_expand_pragma_builtin): Delete cases to handle
        `UNSPEC_DUP`, `UNSPEC_LD2_DUP`, `UNSPEC_LD3_DUP` and
        `UNSPEC_LD4_DUP`.
        (aarch64_force_gimple_val, aarch64_fold_to_val,
        aarch64_get_lane_bit_index, aarch64_set_lane,
        aarch64_gimple_fold_pragma_builtin): Delete now-unused
        functions.
        (aarch64_general_gimple_fold_builtin): Delete call to
        `aarch64_gimple_fold_pragma_builtin`.
        * config/aarch64/aarch64-neon-builtins-base.cc (tuple_len): New
        function.
        (struct gimple_load_dup): New struct.
        * config/aarch64/aarch64-neon-builtins-base.def (vld1_dup,
        vld1q_dup, vld2_dup, vld2q_dup, vld3_dup, vld3q_dup, vld4_dup,
        vld4q_dup): Declare new intrinsics.
        * config/aarch64/aarch64-simd-builtins.def: Delete builtin
        function declaractions.
        * config/aarch64/aarch64-simd-pragma-builtins.def: Delete
        intrinsic function definitions.
        * config/aarch64/aarch64-simd.md
        (@aarch64_simd_ld2r<vstruct_elt>,
        @aarch64_simd_ld3r<vstruct_elt>,
        @aarch64_simd_ld4r<vstruct_elt>,
        aarch64_ld<nregs>r<vstruct_elt>): Replace with...
        (@aarch64_simd_load_dup<mode>): ...this.
        * config/aarch64/aarch64.md (UNSPEC_DUP): Delete now-unused
        UNSPEC.
        (UNSPEC_LD1_DUP, UNSPEC_LD2_DUP, UNSPEC_LD3_DUP,
        UNSPEC_LD4_DUP): Replace with...
        (UNSPEC_LOAD_DUP): ...this.
        * config/aarch64/arm_neon.h
        (vld1_dup_f16, vld1_dup_f32, vld1_dup_f64, vld1_dup_p8,
        vld1_dup_p16, vld1_dup_p64, vld1_dup_s8, vld1_dup_s16,
        vld1_dup_s32, vld1_dup_s64, vld1_dup_u8, vld1_dup_u16,
        vld1_dup_u32, vld1_dup_u64, vld1q_dup_f16, vld1q_dup_f32,
        vld1q_dup_f64, vld1q_dup_p8, vld1q_dup_p16, vld1q_dup_p64,
        vld1q_dup_s8, vld1q_dup_s16, vld1q_dup_s32, vld1q_dup_s64,
        vld1q_dup_u8, vld1q_dup_u16, vld1q_dup_u32, vld1q_dup_u64,
        vld2_dup_s8, vld2_dup_s16, vld2_dup_s32, vld2_dup_f16,
        vld2_dup_f32, vld2_dup_f64, vld2_dup_u8, vld2_dup_u16,
        vld2_dup_u32, vld2_dup_p8, vld2_dup_p16, vld2_dup_p64,
        vld2_dup_s64, vld2_dup_u64, vld2q_dup_s8, vld2q_dup_p8,
        vld2q_dup_s16, vld2q_dup_p16, vld2q_dup_s32, vld2q_dup_s64,
        vld2q_dup_u8, vld2q_dup_u16, vld2q_dup_u32, vld2q_dup_u64,
        vld2q_dup_f16, vld2q_dup_f32, vld2q_dup_f64, vld2q_dup_p64,
        vld3_dup_s64, vld3_dup_u64, vld3_dup_f64, vld3_dup_s8,
        vld3_dup_p8, vld3_dup_s16, vld3_dup_p16, vld3_dup_s32,
        vld3_dup_u8, vld3_dup_u16, vld3_dup_u32, vld3_dup_f16,
        vld3_dup_f32, vld3_dup_p64, vld3q_dup_s8, vld3q_dup_p8,
        vld3q_dup_s16, vld3q_dup_p16, vld3q_dup_s32, vld3q_dup_s64,
        vld3q_dup_u8, vld3q_dup_u16, vld3q_dup_u32, vld3q_dup_u64,
        vld3q_dup_f16, vld3q_dup_f32, vld3q_dup_f64, vld3q_dup_p64,
        vld4_dup_s64, vld4_dup_u64, vld4_dup_f64, vld4_dup_s8,
        vld4_dup_p8, vld4_dup_s16, vld4_dup_p16, vld4_dup_s32,
        vld4_dup_u8, vld4_dup_u16, vld4_dup_u32, vld4_dup_f16,
        vld4_dup_f32, vld4_dup_p64, vld4q_dup_s8, vld4q_dup_p8,
        vld4q_dup_s16, vld4q_dup_p16, vld4q_dup_s32, vld4q_dup_s64,
        vld4q_dup_u8, vld4q_dup_u16, vld4q_dup_u32, vld4q_dup_u64,
        vld4q_dup_f16, vld4q_dup_f32, vld4q_dup_f64, vld4q_dup_p64,
        vld1_dup_bf16, vld1q_dup_bf16, vld3_dup_bf16, vld3q_dup_bf16,
        vld4_dup_bf16, vld4q_dup_bf16): Delete function definitions.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/neon/vld1_dup.c: New test.
        * gcc.target/aarch64/neon/vld2_dup.c: New test.
        * gcc.target/aarch64/neon/vld3_dup.c: New test.
        * gcc.target/aarch64/neon/vld4_dup.c: New test.
---
 gcc/config/aarch64/aarch64-builtins.cc        | 268 +-----
 gcc/config/aarch64/aarch64-builtins.h         |   2 -
 .../aarch64/aarch64-neon-builtins-base.cc     |  57 ++
 .../aarch64/aarch64-neon-builtins-base.def    |  10 +
 gcc/config/aarch64/aarch64-simd-builtins.def  |  11 -
 .../aarch64/aarch64-simd-pragma-builtins.def  |  22 -
 gcc/config/aarch64/aarch64-simd.md            |  58 +-
 gcc/config/aarch64/aarch64.md                 |   6 +-
 gcc/config/aarch64/arm_neon.h                 | 872 ------------------
 .../gcc.target/aarch64/neon/vld1_dup.c        | 228 +++++
 .../gcc.target/aarch64/neon/vld2_dup.c        | 228 +++++
 .../gcc.target/aarch64/neon/vld3_dup.c        | 228 +++++
 .../gcc.target/aarch64/neon/vld4_dup.c        | 228 +++++
 13 files changed, 999 insertions(+), 1219 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vld1_dup.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vld2_dup.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vld3_dup.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vld4_dup.c

diff --git a/gcc/config/aarch64/aarch64-builtins.cc 
b/gcc/config/aarch64/aarch64-builtins.cc
index 44e434e62dd..dc0f9005ca8 100644
--- a/gcc/config/aarch64/aarch64-builtins.cc
+++ b/gcc/config/aarch64/aarch64-builtins.cc
@@ -210,7 +210,6 @@ const unsigned int FLAG_AUTO_FP = 1U << 6;
 const unsigned int FLAG_QUIET = 0;
 const unsigned int FLAG_DEFAULT = FLAG_AUTO_FP;
 const unsigned int FLAG_FP = FLAG_READ_FPCR | FLAG_RAISE_FP_EXCEPTIONS;
-const unsigned int FLAG_LOAD = FLAG_READ_MEMORY;
 const unsigned int FLAG_FP8 = FLAG_FP | FLAG_USES_FPMR;
 
 typedef struct
@@ -342,19 +341,6 @@ 
aarch64_types_fcvt_from_unsigned_qualifiers[SIMD_MAX_BUILTIN_ARGS]
   = { qualifier_none, qualifier_unsigned, qualifier_immediate };
 #define TYPES_FCVTIMM_SUS (aarch64_types_fcvt_from_unsigned_qualifiers)
 
-static enum aarch64_type_qualifiers
-aarch64_types_load1_qualifiers[SIMD_MAX_BUILTIN_ARGS]
-  = { qualifier_none, qualifier_const_pointer_map_mode };
-#define TYPES_LOADSTRUCT (aarch64_types_load1_qualifiers)
-static enum aarch64_type_qualifiers
-aarch64_types_load1_u_qualifiers[SIMD_MAX_BUILTIN_ARGS]
-  = { qualifier_unsigned, qualifier_const_pointer_map_mode };
-#define TYPES_LOADSTRUCT_U (aarch64_types_load1_u_qualifiers)
-static enum aarch64_type_qualifiers
-aarch64_types_load1_p_qualifiers[SIMD_MAX_BUILTIN_ARGS]
-  = { qualifier_poly, qualifier_const_pointer_map_mode };
-#define TYPES_LOADSTRUCT_P (aarch64_types_load1_p_qualifiers)
-
 constexpr insn_code CODE_FOR_aarch64_sdot_prodv8qi
   = CODE_FOR_sdot_prodv2siv8qi;
 constexpr insn_code CODE_FOR_aarch64_udot_prodv8qi
@@ -703,34 +689,6 @@ static GTY(()) tree 
aarch64_builtin_decls[AARCH64_BUILTIN_MAX];
 #define NUM_DREG_TYPES 6
 #define NUM_QREG_TYPES 6
 
-/* Internal scalar builtin types.  These types are used to support
-   neon intrinsic builtins.  They are _not_ user-visible types.  Therefore
-   the mangling for these types are implementation defined.  */
-const char *aarch64_scalar_builtin_types[] = {
-  "__builtin_aarch64_simd_qi",
-  "__builtin_aarch64_simd_hi",
-  "__builtin_aarch64_simd_si",
-  "__builtin_aarch64_simd_hf",
-  "__builtin_aarch64_simd_sf",
-  "__builtin_aarch64_simd_di",
-  "__builtin_aarch64_simd_df",
-  "__builtin_aarch64_simd_poly8",
-  "__builtin_aarch64_simd_poly16",
-  "__builtin_aarch64_simd_poly64",
-  "__builtin_aarch64_simd_poly128",
-  "__builtin_aarch64_simd_ti",
-  "__builtin_aarch64_simd_uqi",
-  "__builtin_aarch64_simd_uhi",
-  "__builtin_aarch64_simd_usi",
-  "__builtin_aarch64_simd_udi",
-  "__builtin_aarch64_simd_ei",
-  "__builtin_aarch64_simd_oi",
-  "__builtin_aarch64_simd_ci",
-  "__builtin_aarch64_simd_xi",
-  "__builtin_aarch64_simd_bf",
-  NULL
-};
-
 extern const aarch64_simd_type_info aarch64_simd_types[];
 extern GTY(()) aarch64_simd_type_info_trees aarch64_simd_types_trees[];
 
@@ -750,10 +708,6 @@ aarch64_simd_types_trees[ARRAY_SIZE (aarch64_simd_types)];
 static machine_mode aarch64_simd_tuple_modes[ARM_NEON_H_TYPES_LAST][3];
 GTY (()) tree aarch64_simd_tuple_types[ARM_NEON_H_TYPES_LAST][3];
 
-static GTY(()) tree aarch64_simd_intOI_type_node = NULL_TREE;
-static GTY(()) tree aarch64_simd_intCI_type_node = NULL_TREE;
-static GTY(()) tree aarch64_simd_intXI_type_node = NULL_TREE;
-
 /* The user-visible __mfp8 type, and a pointer to that type.  Used
    across the back-end.  */
 tree aarch64_mfp8_type_node = NULL_TREE;
@@ -790,24 +744,6 @@ aarch64_general_simulate_builtin (const char *name, tree 
fntype,
                                         code, NULL, attrs);
 }
 
-static const char *
-aarch64_mangle_builtin_scalar_type (const_tree type)
-{
-  int i = 0;
-
-  while (aarch64_scalar_builtin_types[i] != NULL)
-    {
-      const char *name = aarch64_scalar_builtin_types[i];
-
-      if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
-         && DECL_NAME (TYPE_NAME (type))
-         && !strcmp (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))), name))
-       return aarch64_scalar_builtin_types[i];
-      i++;
-    }
-  return NULL;
-}
-
 static const char *
 aarch64_mangle_builtin_vector_type (const_tree type)
 {
@@ -824,14 +760,9 @@ aarch64_mangle_builtin_vector_type (const_tree type)
 const char *
 aarch64_general_mangle_builtin_type (const_tree type)
 {
-  const char *mangle;
   /* Walk through all the AArch64 builtins types tables to filter out the
      incoming type.  */
-  if ((mangle = aarch64_mangle_builtin_vector_type (type))
-      || (mangle = aarch64_mangle_builtin_scalar_type (type)))
-    return mangle;
-
-  return NULL;
+  return aarch64_mangle_builtin_vector_type (type);
 }
 
 /* Helper function for aarch64_simd_builtin_type.  */
@@ -855,12 +786,6 @@ aarch64_int_or_fp_type (machine_mode mode,
       return QUAL_TYPE (DI);
     case E_TImode:
       return QUAL_TYPE (TI);
-    case E_OImode:
-      return aarch64_simd_intOI_type_node;
-    case E_CImode:
-      return aarch64_simd_intCI_type_node;
-    case E_XImode:
-      return aarch64_simd_intXI_type_node;
     case E_HFmode:
       return aarch64_fp16_type_node;
     case E_SFmode:
@@ -1023,64 +948,6 @@ aarch64_init_simd_builtin_types (void)
                                aarch64_simd_types_trees[i].itype);
       TYPE_NAME (aarch64_simd_types_trees[i].itype) = tdecl;
     }
-
-#define AARCH64_BUILD_SIGNED_TYPE(mode)  \
-  make_signed_type (GET_MODE_PRECISION (mode));
-  aarch64_simd_intOI_type_node = AARCH64_BUILD_SIGNED_TYPE (OImode);
-  aarch64_simd_intCI_type_node = AARCH64_BUILD_SIGNED_TYPE (CImode);
-  aarch64_simd_intXI_type_node = AARCH64_BUILD_SIGNED_TYPE (XImode);
-#undef AARCH64_BUILD_SIGNED_TYPE
-
-  tdecl = add_builtin_type
-           ("__builtin_aarch64_simd_oi" , aarch64_simd_intOI_type_node);
-  TYPE_NAME (aarch64_simd_intOI_type_node) = tdecl;
-  tdecl = add_builtin_type
-           ("__builtin_aarch64_simd_ci" , aarch64_simd_intCI_type_node);
-  TYPE_NAME (aarch64_simd_intCI_type_node) = tdecl;
-  tdecl = add_builtin_type
-           ("__builtin_aarch64_simd_xi" , aarch64_simd_intXI_type_node);
-  TYPE_NAME (aarch64_simd_intXI_type_node) = tdecl;
-}
-
-static void
-aarch64_init_simd_builtin_scalar_types (void)
-{
-  /* Define typedefs for all the standard scalar types.  */
-  (*lang_hooks.types.register_builtin_type) (intQI_type_node,
-                                            "__builtin_aarch64_simd_qi");
-  (*lang_hooks.types.register_builtin_type) (intHI_type_node,
-                                            "__builtin_aarch64_simd_hi");
-  (*lang_hooks.types.register_builtin_type) (aarch64_fp16_type_node,
-                                            "__builtin_aarch64_simd_hf");
-  (*lang_hooks.types.register_builtin_type) (intSI_type_node,
-                                            "__builtin_aarch64_simd_si");
-  (*lang_hooks.types.register_builtin_type) (float_type_node,
-                                            "__builtin_aarch64_simd_sf");
-  (*lang_hooks.types.register_builtin_type) (intDI_type_node,
-                                            "__builtin_aarch64_simd_di");
-  (*lang_hooks.types.register_builtin_type) (double_type_node,
-                                            "__builtin_aarch64_simd_df");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intQI_type_node,
-                                            "__builtin_aarch64_simd_poly8");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intHI_type_node,
-                                            "__builtin_aarch64_simd_poly16");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intDI_type_node,
-                                            "__builtin_aarch64_simd_poly64");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intTI_type_node,
-                                            "__builtin_aarch64_simd_poly128");
-  (*lang_hooks.types.register_builtin_type) (intTI_type_node,
-                                            "__builtin_aarch64_simd_ti");
-  (*lang_hooks.types.register_builtin_type) (bfloat16_type_node,
-                                            "__builtin_aarch64_simd_bf");
-  /* Unsigned integer types for various mode sizes.  */
-  (*lang_hooks.types.register_builtin_type) (unsigned_intQI_type_node,
-                                            "__builtin_aarch64_simd_uqi");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intHI_type_node,
-                                            "__builtin_aarch64_simd_uhi");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intSI_type_node,
-                                            "__builtin_aarch64_simd_usi");
-  (*lang_hooks.types.register_builtin_type) (unsigned_intDI_type_node,
-                                            "__builtin_aarch64_simd_udi");
 }
 
 /* If MODE is a single Advanced SIMD vector, return the number of lanes in the
@@ -1367,8 +1234,6 @@ enum class aarch64_builtin_signatures
   binary,
   binary_lane,
   binary_two_lanes,
-  load,
-  store,
   ternary,
   ternary_lane,
   unary,
@@ -1477,19 +1342,12 @@ aarch64_fntype (const aarch64_pragma_builtins_data 
&builtin_data)
       arg_types.quick_push (integer_type_node);
       break;
 
-    case aarch64_builtin_signatures::load:
     case aarch64_builtin_signatures::unary:
     case aarch64_builtin_signatures::unary_lane:
       return_type = builtin_data.types[0].type ();
       arg_types.quick_push (builtin_data.types[1].type ());
       break;
 
-    case aarch64_builtin_signatures::store:
-      return_type = void_type_node;
-      for (int i = 0; i <= 1; ++i)
-       arg_types.quick_push (builtin_data.types[i].type ());
-      break;
-
     case aarch64_builtin_signatures::ternary:
     case aarch64_builtin_signatures::ternary_lane:
       return_type = builtin_data.types[0].type ();
@@ -1664,12 +1522,6 @@ aarch64_init_simd_builtins (void)
 {
   aarch64_init_simd_builtin_types ();
 
-  /* Strong-typing hasn't been implemented for all AdvSIMD builtin intrinsics.
-     Therefore we need to preserve the old __builtin scalar types.  It can be
-     removed once all the intrinsics become strongly typed using the qualifier
-     system.  */
-  aarch64_init_simd_builtin_scalar_types ();
-
   aarch64_init_simd_builtin_functions (false);
   if (in_lto_p)
     init_arm_neon_builtins ();
@@ -2793,7 +2645,6 @@ typedef enum
   SIMD_ARG_COPY_TO_REG,
   SIMD_ARG_CONSTANT,
   SIMD_ARG_LANE_INDEX,
-  SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX,
   SIMD_ARG_LANE_PAIR_INDEX,
   SIMD_ARG_LANE_QUADTUP_INDEX,
   SIMD_ARG_STOP
@@ -2802,8 +2653,7 @@ typedef enum
 
 static rtx
 aarch64_simd_expand_args (rtx target, int icode, int have_retval,
-                         tree exp, builtin_simd_arg *args,
-                         machine_mode builtin_mode)
+                         tree exp, builtin_simd_arg *args)
 {
   rtx pat;
   rtx op[SIMD_MAX_BUILTIN_ARGS + 1]; /* First element for result operand.  */
@@ -2842,19 +2692,6 @@ aarch64_simd_expand_args (rtx target, int icode, int 
have_retval,
                op[opc] = copy_to_mode_reg (mode, op[opc]);
              break;
 
-           case SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX:
-             gcc_assert (opc > 1);
-             if (CONST_INT_P (op[opc]))
-               {
-                 unsigned int nunits
-                   = GET_MODE_NUNITS (builtin_mode).to_constant ();
-                 aarch64_simd_lane_bounds (op[opc], 0, nunits, exp);
-                 /* Keep to GCC-vector-extension lane indices in the RTL.  */
-                 op[opc] = aarch64_endian_lane_rtx (builtin_mode,
-                                                    INTVAL (op[opc]));
-               }
-             goto constant_arg;
-
            case SIMD_ARG_LANE_INDEX:
              /* Must be a previous operand into which this is an index.  */
              gcc_assert (opc > 0);
@@ -3022,8 +2859,6 @@ aarch64_simd_expand_builtin (int fcode, tree exp, rtx 
target)
        args[k] = SIMD_ARG_LANE_PAIR_INDEX;
       else if (d->qualifiers[qualifiers_k] & qualifier_lane_quadtup_index)
        args[k] = SIMD_ARG_LANE_QUADTUP_INDEX;
-      else if (d->qualifiers[qualifiers_k] & 
qualifier_struct_load_store_lane_index)
-       args[k] = SIMD_ARG_STRUCT_LOAD_STORE_LANE_INDEX;
       else if (d->qualifiers[qualifiers_k] & qualifier_immediate)
        args[k] = SIMD_ARG_CONSTANT;
       else if (d->qualifiers[qualifiers_k] & qualifier_maybe_immediate)
@@ -3046,8 +2881,7 @@ aarch64_simd_expand_builtin (int fcode, tree exp, rtx 
target)
 
   /* The interface to aarch64_simd_expand_args expects a 0 if
      the function is void, and a 1 if it is not.  */
-  return aarch64_simd_expand_args
-         (target, icode, !is_void, exp, &args[1], d->mode);
+  return aarch64_simd_expand_args (target, icode, !is_void, exp, &args[1]);
 }
 
 rtx
@@ -3764,25 +3598,6 @@ aarch64_convert_address (expand_operand *op)
   op->mode = Pmode;
 }
 
-/* Dereference the pointer in OP, turning it into a memory reference to
-   NELTS instances of MEM_MODE.  */
-static void
-aarch64_dereference_pointer (expand_operand *op, machine_mode mem_mode,
-                            unsigned int nelts = 1)
-{
-  if (nelts == 1)
-    {
-      op->value = gen_rtx_MEM (mem_mode, op->value);
-      op->mode = mem_mode;
-    }
-  else
-    {
-      op->value = gen_rtx_MEM (BLKmode, op->value);
-      op->mode = BLKmode;
-      set_mem_size (op->value, GET_MODE_SIZE (mem_mode) * nelts);
-    }
-}
-
 /* OP contains an integer index into a vector or tuple of mode VEC_MODE.
    Convert OP from an architectural lane number to a GCC lane number.  */
 static void
@@ -4089,11 +3904,6 @@ aarch64_expand_pragma_builtin (tree exp, rtx target,
   insn_code icode;
   switch (builtin_data.unspec)
     {
-    case UNSPEC_DUP:
-      if (builtin_data.signature == aarch64_builtin_signatures::load)
-       aarch64_dereference_pointer (&ops[1], GET_MODE_INNER (ops[0].mode));
-      return expand_vector_broadcast (ops[0].mode, ops[1].value);
-
     case UNSPEC_FAMAX:
     case UNSPEC_FAMIN:
     case UNSPEC_FMMLA:
@@ -4157,21 +3967,6 @@ aarch64_expand_pragma_builtin (tree exp, rtx target,
        gcc_unreachable ();
       break;
 
-    case UNSPEC_LD2_DUP:
-      aarch64_dereference_pointer (&ops[1], GET_MODE_INNER (ops[0].mode), 2);
-      icode = code_for_aarch64_simd_ld2r (ops[0].mode);
-      break;
-
-    case UNSPEC_LD3_DUP:
-      aarch64_dereference_pointer (&ops[1], GET_MODE_INNER (ops[0].mode), 3);
-      icode = code_for_aarch64_simd_ld3r (ops[0].mode);
-      break;
-
-    case UNSPEC_LD4_DUP:
-      aarch64_dereference_pointer (&ops[1], GET_MODE_INNER (ops[0].mode), 4);
-      icode = code_for_aarch64_simd_ld4r (ops[0].mode);
-      break;
-
     case UNSPEC_LUTI2:
     case UNSPEC_LUTI4:
       create_integer_operand (ops.safe_push ({}),
@@ -4586,32 +4381,6 @@ aarch64_record_vector_load_arg (tree addr)
   cfun->machine->vector_load_decls->add (decl);
 }
 
-/* Force VAL into a valid gimple value, creating a new SSA_NAME if
-   necessary.  Insert any new statements before GSI.  */
-static tree
-aarch64_force_gimple_val (gimple_stmt_iterator *gsi, tree val)
-{
-  if (is_gimple_val (val))
-    return val;
-
-  tree tmp = make_ssa_name (TREE_TYPE (val));
-  gsi_insert_before_without_update (gsi, gimple_build_assign (tmp, val),
-                                   GSI_SAME_STMT);
-  return tmp;
-}
-
-/* Fold STMT (at GSI) to VAL, with SEQ setting up the value of VAL.
-   Return the replacement statement.  */
-static gimple *
-aarch64_fold_to_val (gcall *stmt, gimple_stmt_iterator *gsi,
-                    gimple *seq, tree val)
-{
-  auto *assign = gimple_build_assign (gimple_call_lhs (stmt), val);
-  gimple_seq_add_stmt_without_update (&seq, assign);
-  gsi_replace_with_seq_vops (gsi, seq);
-  return assign;
-}
-
 /* Dereference pointer ADDR, giving a memory reference of type TYPE.  */
 tree
 aarch64_dereference (tree addr, tree type)
@@ -4626,34 +4395,6 @@ aarch64_dereference (tree addr, tree type)
   return fold_build2 (MEM_REF, access_type, addr, zero);
 }
 
-/* Try to fold STMT (at GSI), given that it is a call to the builtin
-   described by BUILTIN_DATA.  Return the new statement on success,
-   otherwise return null.  */
-static gimple *
-aarch64_gimple_fold_pragma_builtin
-  (gcall *stmt, gimple_stmt_iterator *gsi,
-   const aarch64_pragma_builtins_data &builtin_data)
-{
-  auto &types = builtin_data.types;
-
-  switch (builtin_data.unspec)
-    {
-    case UNSPEC_DUP:
-      {
-       tree arg = gimple_call_arg (stmt, 0);
-       tree type = types[0].type ();
-       if (builtin_data.signature == aarch64_builtin_signatures::load)
-         arg = aarch64_dereference (arg, TREE_TYPE (type));
-       arg = aarch64_force_gimple_val (gsi, arg);
-
-       tree dup = build_vector_from_val (type, arg);
-       return aarch64_fold_to_val (stmt, gsi, nullptr, dup);
-      }
-    default:
-      return nullptr;
-    }
-}
-
 /* Return the fndecl of the builtin paired with FCODE_LO if one
    exists (see aarch64-builtin-pairs.def), or NULL_TREE if not.  */
 static inline tree
@@ -4931,9 +4672,6 @@ aarch64_general_gimple_fold_builtin (unsigned int fcode, 
gcall *stmt,
        }
       break;
     default:
-      if (auto builtin_data = aarch64_get_pragma_builtin (fcode))
-       new_stmt = aarch64_gimple_fold_pragma_builtin (stmt, gsi,
-                                                      *builtin_data);
       break;
     }
 
diff --git a/gcc/config/aarch64/aarch64-builtins.h 
b/gcc/config/aarch64/aarch64-builtins.h
index 87fc0dcb2d5..ff5c1495fb0 100644
--- a/gcc/config/aarch64/aarch64-builtins.h
+++ b/gcc/config/aarch64/aarch64-builtins.h
@@ -47,8 +47,6 @@ enum aarch64_type_qualifiers
   qualifier_poly = 1 << 8,
   /* Lane indices - must be in range, and flipped for bigendian.  */
   qualifier_lane_index = 1 << 9,
-  /* Lane indices for single lane structure loads and stores.  */
-  qualifier_struct_load_store_lane_index = 1 << 10,
   /* Lane indices selected in pairs. - must be in range, and flipped for
      bigendian.  */
   qualifier_lane_pair_index = 1 << 11,
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc 
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index 0d6f11fba6e..ba68bbb0b09 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -144,6 +144,22 @@ build_shift_right (tree type, tree val, tree amount)
                      build_int_cst (TREE_TYPE (amount), bits - 1));
 }
 
+/* Get the number of vectors in TUPLE, which can either be a type or an
+   expression.
+   For convenience, a vector is treated as a single-element tuple.  */
+unsigned int
+tuple_len (tree tuple)
+{
+  tree type = TYPE_P (tuple) ? tuple : TREE_TYPE (tuple);
+
+  if (VECTOR_TYPE_P (type))
+    return 1;
+
+  auto field = tuple_type_field (type);
+  auto array_type = TREE_TYPE (field);
+  return int_cst_value (TYPE_MAX_VALUE (TYPE_DOMAIN (array_type))) + 1;
+}
+
 /* Build `TUPLE.val`.  */
 tree
 build_tuple_get_array (tree tuple)
@@ -1748,6 +1764,43 @@ public:
   gimple *fold (gimple_folder &) const override { return nullptr; }
 };
 
+struct gimple_load_dup : public gimple_function_base
+{
+  unsigned int call_properties (const function_instance &) const override
+  {
+    return CP_READ_MEMORY;
+  }
+
+  rtx expand (function_expander &e) const override
+  {
+    auto tuple_mode = e.result_mode ();
+    auto &ptr_arg = e.args[0];
+    ptr_arg = gen_rtx_MEM (BLKmode, e.convert_to_pmode (ptr_arg));
+    set_mem_size (ptr_arg, GET_MODE_SIZE (GET_MODE_INNER (tuple_mode))
+                            * targetm.hard_regno_nregs (V0_REGNUM, 
tuple_mode));
+    auto icode = code_for_aarch64_simd_load_dup (tuple_mode);
+    gcc_assert (icode != CODE_FOR_nothing);
+    return e.use_exact_insn (icode);
+  }
+
+  gimple *fold (gimple_folder &f) const override
+  {
+    auto ptr = gimple_call_arg (f.call, 0);
+    auto ret_type = TREE_TYPE (f.lhs);
+    auto elem_type = this->memory_scalar_type (f);
+    auto vec_count = tuple_len (ret_type);
+
+    if (vec_count == 1)
+      {
+       /* lhs = dup (*ptr)  */
+       auto load = f.force_val (aarch64_dereference (ptr, elem_type));
+       return gimple_build_assign (f.lhs, build_vec_dup (ret_type, load));
+      }
+
+    return nullptr;
+  }
+};
+
 // Reinterpret
 NEON_FUNCTION (vreinterpret, vreinterpretq, gimple_reinterpret,)
 
@@ -1981,6 +2034,10 @@ NEON_FUNCTION (vst1_lane, vst1q_lane, vst2_lane, 
vst2q_lane,
 NEON_FUNCTION (vldap1_lane, vldap1q_lane, gimple_load_store_lane_atomic<true>,)
 NEON_FUNCTION (vstl1_lane,  vstl1q_lane,  
gimple_load_store_lane_atomic<false>,)
 
+// Load and broadcast
+NEON_FUNCTION (vld1_dup, vld1q_dup, vld2_dup, vld2q_dup,
+              vld3_dup, vld3q_dup, vld4_dup, vld4q_dup, gimple_load_dup,)
+
 // AES
 NEON_FUNCTION (vaeseq,   gimple_exact_insn<CODE_FOR_aarch64_crypto_aesev16qi>,)
 NEON_FUNCTION (vaesdq,   gimple_exact_insn<CODE_FOR_aarch64_crypto_aesdv16qi>,)
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def 
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index a68c67acaf6..44e9a07bee6 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -628,6 +628,16 @@ DEF_NEON_FUNCTION (vld3_lane,  all_neon, 
("D0x3,al,D0x3,ss32", lane<2>))
 DEF_NEON_FUNCTION (vld3q_lane, all_neon, ("Q0x3,al,Q0x3,ss32", lane<2>))
 DEF_NEON_FUNCTION (vld4_lane,  all_neon, ("D0x4,al,D0x4,ss32", lane<2>))
 DEF_NEON_FUNCTION (vld4q_lane, all_neon, ("Q0x4,al,Q0x4,ss32", lane<2>))
+
+// Load and broadcast
+DEF_NEON_FUNCTION (vld1_dup,  all_neon, ("D0,al"))
+DEF_NEON_FUNCTION (vld1q_dup, all_neon, ("Q0,al"))
+DEF_NEON_FUNCTION (vld2_dup,  all_neon, ("D0x2,al"))
+DEF_NEON_FUNCTION (vld2q_dup, all_neon, ("Q0x2,al"))
+DEF_NEON_FUNCTION (vld3_dup,  all_neon, ("D0x3,al"))
+DEF_NEON_FUNCTION (vld3q_dup, all_neon, ("Q0x3,al"))
+DEF_NEON_FUNCTION (vld4_dup,  all_neon, ("D0x4,al"))
+DEF_NEON_FUNCTION (vld4q_dup, all_neon, ("Q0x4,al"))
 #undef REQUIRED_EXTENSIONS
 
 // Stores
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def 
b/gcc/config/aarch64/aarch64-simd-builtins.def
index 5ceee439b2e..f317358321d 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -60,17 +60,6 @@
   BUILTIN_VSDQ_I (BINOP_SSU, suqadd, 0, DEFAULT)
   BUILTIN_VSDQ_I (BINOP_UUS, usqadd, 0, DEFAULT)
 
-  /* Implemented by aarch64_ld<nregs>r<vstruct_elt>.  */
-  BUILTIN_VALLDIF (LOADSTRUCT, ld2r, 0, LOAD)
-  BUILTIN_VSDQ_I_DI (LOADSTRUCT_U, ld2r, 0, LOAD)
-  BUILTIN_VALLP (LOADSTRUCT_P, ld2r, 0, LOAD)
-  BUILTIN_VALLDIF (LOADSTRUCT, ld3r, 0, LOAD)
-  BUILTIN_VSDQ_I_DI (LOADSTRUCT_U, ld3r, 0, LOAD)
-  BUILTIN_VALLP (LOADSTRUCT_P, ld3r, 0, LOAD)
-  BUILTIN_VALLDIF (LOADSTRUCT, ld4r, 0, LOAD)
-  BUILTIN_VSDQ_I_DI (LOADSTRUCT_U, ld4r, 0, LOAD)
-  BUILTIN_VALLP (LOADSTRUCT_P, ld4r, 0, LOAD)
-
   BUILTIN_VQW (BINOP, saddl2, 0, DEFAULT)
   BUILTIN_VQW (BINOPU, uaddl2, 0, DEFAULT)
   BUILTIN_VQW (BINOP, ssubl2, 0, DEFAULT)
diff --git a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def 
b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
index 873a451624b..d049165828c 100644
--- a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
@@ -30,10 +30,6 @@
 #define ENTRY_BINARY_TWO_LANES(N, T0, T1, T2, U, F)    \
   ENTRY (N, binary_two_lanes, T0, T1, T2, none, U, F)
 
-#undef ENTRY_LOAD
-#define ENTRY_LOAD(N, T0, T1, U)                       \
-  ENTRY (N, load, T0, T1, none, none, U, LOAD)
-
 #undef ENTRY_TERNARY
 #define ENTRY_TERNARY(N, T0, T1, T2, T3, U, F) \
   ENTRY (N, ternary, T0, T1, T2, T3, U, F)
@@ -140,24 +136,6 @@ ENTRY_FMA_FPM (vmlalltb, f32, UNSPEC_FMLALLTB_FP8)
 ENTRY_FMA_FPM (vmlalltt, f32, UNSPEC_FMLALLTT_FP8)
 #undef REQUIRED_EXTENSIONS
 
-// ld1
-#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
-ENTRY_LOAD (vld1_dup_mf8, mf8, mf8_scalar_const_ptr, UNSPEC_DUP)
-ENTRY_LOAD (vld1q_dup_mf8, mf8q, mf8_scalar_const_ptr, UNSPEC_DUP)
-#undef REQUIRED_EXTENSIONS
-
-// ld<n>
-#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
-ENTRY_LOAD (vld2_dup_mf8, mf8x2, mf8_scalar_const_ptr, UNSPEC_LD2_DUP)
-ENTRY_LOAD (vld2q_dup_mf8, mf8qx2, mf8_scalar_const_ptr, UNSPEC_LD2_DUP)
-
-ENTRY_LOAD (vld3_dup_mf8, mf8x3, mf8_scalar_const_ptr, UNSPEC_LD3_DUP)
-ENTRY_LOAD (vld3q_dup_mf8, mf8qx3, mf8_scalar_const_ptr, UNSPEC_LD3_DUP)
-
-ENTRY_LOAD (vld4_dup_mf8, mf8x4, mf8_scalar_const_ptr, UNSPEC_LD4_DUP)
-ENTRY_LOAD (vld4q_dup_mf8, mf8qx4, mf8_scalar_const_ptr, UNSPEC_LD4_DUP)
-#undef REQUIRED_EXTENSIONS
-
 // mmla f16 mf8
 #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_F8F16MM)
 ENTRY_TERNARY (vmmlaq_f16_mf8, f16q, f16q, mf8q, mf8q, UNSPEC_FMMLA, FP8)
diff --git a/gcc/config/aarch64/aarch64-simd.md 
b/gcc/config/aarch64/aarch64-simd.md
index 8de8d3d5d34..cb8894c1b8f 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -8405,38 +8405,6 @@ (define_insn "*sqrt<mode>2<vczle><vczbe>"
   [(set_attr "type" "neon_fp_sqrt_<stype><q>")]
 )
 
-;; Patterns for vector struct loads and stores.
-
-(define_insn "@aarch64_simd_ld2r<vstruct_elt>"
-  [(set (match_operand:VSTRUCT_2QD 0 "register_operand" "=w")
-       (unspec:VSTRUCT_2QD [
-         (match_operand:BLK 1 "aarch64_simd_struct_operand" "Utv")]
-          UNSPEC_LD2_DUP))]
-  "TARGET_SIMD"
-  "ld2r\\t{%S0.<Vtype> - %T0.<Vtype>}, %1"
-  [(set_attr "type" "neon_load2_all_lanes<q>")]
-)
-
-(define_insn "@aarch64_simd_ld3r<vstruct_elt>"
-  [(set (match_operand:VSTRUCT_3QD 0 "register_operand" "=w")
-       (unspec:VSTRUCT_3QD [
-         (match_operand:BLK 1 "aarch64_simd_struct_operand" "Utv")]
-          UNSPEC_LD3_DUP))]
-  "TARGET_SIMD"
-  "ld3r\\t{%S0.<Vtype> - %U0.<Vtype>}, %1"
-  [(set_attr "type" "neon_load3_all_lanes<q>")]
-)
-
-(define_insn "@aarch64_simd_ld4r<vstruct_elt>"
-  [(set (match_operand:VSTRUCT_4QD 0 "register_operand" "=w")
-       (unspec:VSTRUCT_4QD [
-         (match_operand:BLK 1 "aarch64_simd_struct_operand" "Utv")]
-          UNSPEC_LD4_DUP))]
-  "TARGET_SIMD"
-  "ld4r\\t{%S0.<Vtype> - %V0.<Vtype>}, %1"
-  [(set_attr "type" "neon_load4_all_lanes<q>")]
-)
-
 ;; Patterns for rcpc3 vector lane loads and stores.
 
 (define_insn "aarch64_vec_stl1_lanes<mode>_lane<Vel>"
@@ -8859,17 +8827,23 @@ (define_split
     FAIL;
 })
 
-(define_expand "aarch64_ld<nregs>r<vstruct_elt>"
-  [(match_operand:VSTRUCT_QD 0 "register_operand")
-   (match_operand:DI 1 "register_operand")]
+(define_insn "@aarch64_simd_load_dup<mode>"
+  [(set (match_operand:VSTRUCT_QD 0 "register_operand" "=w")
+       (unspec:VSTRUCT_QD [
+         (match_operand:BLK 1 "aarch64_simd_struct_operand" "Utv")]
+       UNSPEC_LOAD_DUP))]
   "TARGET_SIMD"
-{
-  rtx mem = gen_rtx_MEM (BLKmode, operands[1]);
-  set_mem_size (mem, GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) * <nregs>);
-
-  emit_insn (gen_aarch64_simd_ld<nregs>r<vstruct_elt> (operands[0], mem));
-  DONE;
-})
+  {
+    switch (<nregs>)
+    {
+      case 2: return "ld2r\t{%S0.<Vtype> - %T0.<Vtype>}, %1";
+      case 3: return "ld3r\t{%S0.<Vtype> - %U0.<Vtype>}, %1";
+      case 4: return "ld4r\t{%S0.<Vtype> - %V0.<Vtype>}, %1";
+      default: gcc_unreachable ();
+    }
+  }
+  [(set_attr "type" "neon_load<nregs>_all_lanes<q>")]
+)
 
 (define_insn "@aarch64_simd_load_lane<mode>"
   [(set (match_operand:VSTRUCT_QD 0 "register_operand" "=w")
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index f55342db924..cf7b1f18be0 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -239,7 +239,6 @@ (define_c_enum "unspec" [
     UNSPEC_CRC32H
     UNSPEC_CRC32W
     UNSPEC_CRC32X
-    UNSPEC_DUP
     UNSPEC_FCVTZS
     UNSPEC_FCVTZU
     UNSPEC_FJCVTZS
@@ -269,10 +268,7 @@ (define_c_enum "unspec" [
     UNSPEC_LOAD_MULTIPLE
     UNSPEC_LOAD_INTERLEAVED
     UNSPEC_LOAD_LANE
-    UNSPEC_LD1_DUP
-    UNSPEC_LD2_DUP
-    UNSPEC_LD3_DUP
-    UNSPEC_LD4_DUP
+    UNSPEC_LOAD_DUP
     UNSPEC_LD64B
     UNSPEC_ST64B
     UNSPEC_ST64BV
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index e9ae7a6938b..5996ef92c4e 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -5587,832 +5587,6 @@ vcvtpq_u64_f64 (float64x2_t __a)
   return __builtin_aarch64_lceiluv2dfv2di_us (__a);
 }
 
-/* vld1_dup  */
-
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_f16 (const float16_t* __a)
-{
-  return vdup_n_f16 (*__a);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_f32 (const float32_t* __a)
-{
-  return vdup_n_f32 (*__a);
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_f64 (const float64_t* __a)
-{
-  return vdup_n_f64 (*__a);
-}
-
-__extension__ extern __inline poly8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_p8 (const poly8_t* __a)
-{
-  return vdup_n_p8 (*__a);
-}
-
-__extension__ extern __inline poly16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_p16 (const poly16_t* __a)
-{
-  return vdup_n_p16 (*__a);
-}
-
-__extension__ extern __inline poly64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_p64 (const poly64_t* __a)
-{
-  return vdup_n_p64 (*__a);
-}
-
-__extension__ extern __inline int8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_s8 (const int8_t* __a)
-{
-  return vdup_n_s8 (*__a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_s16 (const int16_t* __a)
-{
-  return vdup_n_s16 (*__a);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_s32 (const int32_t* __a)
-{
-  return vdup_n_s32 (*__a);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_s64 (const int64_t* __a)
-{
-  return vdup_n_s64 (*__a);
-}
-
-__extension__ extern __inline uint8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_u8 (const uint8_t* __a)
-{
-  return vdup_n_u8 (*__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_u16 (const uint16_t* __a)
-{
-  return vdup_n_u16 (*__a);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_u32 (const uint32_t* __a)
-{
-  return vdup_n_u32 (*__a);
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_u64 (const uint64_t* __a)
-{
-  return vdup_n_u64 (*__a);
-}
-
-/* vld1q_dup  */
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_f16 (const float16_t* __a)
-{
-  return vdupq_n_f16 (*__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_f32 (const float32_t* __a)
-{
-  return vdupq_n_f32 (*__a);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_f64 (const float64_t* __a)
-{
-  return vdupq_n_f64 (*__a);
-}
-
-__extension__ extern __inline poly8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_p8 (const poly8_t* __a)
-{
-  return vdupq_n_p8 (*__a);
-}
-
-__extension__ extern __inline poly16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_p16 (const poly16_t* __a)
-{
-  return vdupq_n_p16 (*__a);
-}
-
-__extension__ extern __inline poly64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_p64 (const poly64_t* __a)
-{
-  return vdupq_n_p64 (*__a);
-}
-
- __extension__ extern __inline int8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_s8 (const int8_t* __a)
-{
-  return vdupq_n_s8 (*__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_s16 (const int16_t* __a)
-{
-  return vdupq_n_s16 (*__a);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_s32 (const int32_t* __a)
-{
-  return vdupq_n_s32 (*__a);
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_s64 (const int64_t* __a)
-{
-  return vdupq_n_s64 (*__a);
-}
-
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_u8 (const uint8_t* __a)
-{
-  return vdupq_n_u8 (*__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_u16 (const uint16_t* __a)
-{
-  return vdupq_n_u16 (*__a);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_u32 (const uint32_t* __a)
-{
-  return vdupq_n_u32 (*__a);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_u64 (const uint64_t* __a)
-{
-  return vdupq_n_u64 (*__a);
-}
-
-/* vldn_dup */
-
-__extension__ extern __inline int8x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld2rv8qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld2rv4hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld2rv2si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline float16x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld2rv4hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld2rv2sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline float64x1x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld2rdf ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline uint8x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld2rv8qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld2rv4hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld2rv2si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline poly8x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld2rv8qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly16x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld2rv4hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly64x1x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld2rdi_ps ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int64x1x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld2rdi ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint64x1x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld2rdi_us ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int8x16x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld2rv16qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly8x16x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld2rv16qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld2rv8hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly16x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld2rv8hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld2rv4si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline int64x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld2rv2di ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint8x16x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld2rv16qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld2rv8hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld2rv4si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline uint64x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld2rv2di_us (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline float16x8x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld2rv8hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x4x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld2rv4sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline float64x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld2rv2df ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline poly64x2x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld2q_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld2rv2di_ps (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int64x1x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld3rdi ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint64x1x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld3rdi_us ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline float64x1x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld3rdf ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline int8x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld3rv8qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly8x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld3rv8qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld3rv4hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly16x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld3rv4hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld3rv2si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline uint8x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld3rv8qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld3rv4hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld3rv2si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline float16x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld3rv4hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld3rv2sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline poly64x1x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld3rdi_ps ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int8x16x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld3rv16qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly8x16x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld3rv16qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld3rv8hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly16x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld3rv8hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld3rv4si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline int64x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld3rv2di ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint8x16x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld3rv16qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld3rv8hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld3rv4si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline uint64x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld3rv2di_us (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline float16x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld3rv8hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld3rv4sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline float64x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld3rv2df ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline poly64x2x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld3rv2di_ps (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int64x1x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld4rdi ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint64x1x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld4rdi_us ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline float64x1x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld4rdf ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline int8x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld4rv8qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly8x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld4rv8qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld4rv4hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly16x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld4rv4hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld4rv2si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline uint8x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld4rv8qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld4rv4hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld4rv2si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline float16x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld4rv4hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld4rv2sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline poly64x1x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld4rdi_ps ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline int8x16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_s8 (const int8_t * __a)
-{
-  return __builtin_aarch64_ld4rv16qi ((const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline poly8x16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_p8 (const poly8_t * __a)
-{
-  return __builtin_aarch64_ld4rv16qi_ps (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline int16x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_s16 (const int16_t * __a)
-{
-  return __builtin_aarch64_ld4rv8hi ((const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline poly16x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_p16 (const poly16_t * __a)
-{
-  return __builtin_aarch64_ld4rv8hi_ps (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline int32x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_s32 (const int32_t * __a)
-{
-  return __builtin_aarch64_ld4rv4si ((const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline int64x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_s64 (const int64_t * __a)
-{
-  return __builtin_aarch64_ld4rv2di ((const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline uint8x16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_u8 (const uint8_t * __a)
-{
-  return __builtin_aarch64_ld4rv16qi_us (
-                               (const __builtin_aarch64_simd_qi *) __a);
-}
-
-__extension__ extern __inline uint16x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_u16 (const uint16_t * __a)
-{
-  return __builtin_aarch64_ld4rv8hi_us (
-                               (const __builtin_aarch64_simd_hi *) __a);
-}
-
-__extension__ extern __inline uint32x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_u32 (const uint32_t * __a)
-{
-  return __builtin_aarch64_ld4rv4si_us (
-                               (const __builtin_aarch64_simd_si *) __a);
-}
-
-__extension__ extern __inline uint64x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_u64 (const uint64_t * __a)
-{
-  return __builtin_aarch64_ld4rv2di_us (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
-__extension__ extern __inline float16x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_f16 (const float16_t * __a)
-{
-  return __builtin_aarch64_ld4rv8hf ((const __builtin_aarch64_simd_hf *) __a);
-}
-
-__extension__ extern __inline float32x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_f32 (const float32_t * __a)
-{
-  return __builtin_aarch64_ld4rv4sf ((const __builtin_aarch64_simd_sf *) __a);
-}
-
-__extension__ extern __inline float64x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_f64 (const float64_t * __a)
-{
-  return __builtin_aarch64_ld4rv2df ((const __builtin_aarch64_simd_df *) __a);
-}
-
-__extension__ extern __inline poly64x2x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_p64 (const poly64_t * __a)
-{
-  return __builtin_aarch64_ld4rv2di_ps (
-                               (const __builtin_aarch64_simd_di *) __a);
-}
-
 /* vmulx */
 
 __extension__ extern __inline float32x2_t
@@ -9813,52 +8987,6 @@ vrnd64xq_f64 (float64x2_t __a)
 #pragma GCC push_options
 #pragma GCC target ("+nothing+bf16")
 
-/* vld */
-
-__extension__ extern __inline bfloat16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1_dup_bf16 (const bfloat16_t* __a)
-{
-  return vdup_n_bf16 (*__a);
-}
-
-__extension__ extern __inline bfloat16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld1q_dup_bf16 (const bfloat16_t* __a)
-{
-  return vdupq_n_bf16 (*__a);
-}
-
-__extension__ extern __inline bfloat16x4x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3_dup_bf16 (const bfloat16_t * __a)
-{
-  return __builtin_aarch64_ld3rv4bf ((const __builtin_aarch64_simd_bf *) __a);
-}
-
-__extension__ extern __inline bfloat16x8x3_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld3q_dup_bf16 (const bfloat16_t * __a)
-{
-  return __builtin_aarch64_ld3rv8bf ((const __builtin_aarch64_simd_bf *) __a);
-}
-
-__extension__ extern __inline bfloat16x4x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4_dup_bf16 (const bfloat16_t * __a)
-{
-  return __builtin_aarch64_ld4rv4bf ((const __builtin_aarch64_simd_bf *) __a);
-}
-
-__extension__ extern __inline bfloat16x8x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vld4q_dup_bf16 (const bfloat16_t * __a)
-{
-  return __builtin_aarch64_ld4rv8bf ((const __builtin_aarch64_simd_bf *) __a);
-}
-
-/* vst */
-
 __extension__ extern __inline float32x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vbfdot_f32 (float32x2_t __r, bfloat16x4_t __a, bfloat16x4_t __b)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vld1_dup.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vld1_dup.c
new file mode 100644
index 00000000000..c7cb7ec1415
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vld1_dup.c
@@ -0,0 +1,228 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vld1_dup_f16:
+** ld1r        {v0\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_f16, float16x4_t, const float16_t *)
+
+/*
+** test_vld1_dup_bf16:
+** ld1r        {v0\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_bf16, bfloat16x4_t, const bfloat16_t *)
+
+/*
+** test_vld1_dup_f32:
+** ld1r        {v0\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_f32, float32x2_t, const float32_t *)
+
+/*
+** test_vld1_dup_f64:
+** ldr d0, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_f64, float64x1_t, const float64_t *)
+
+/*
+** test_vld1_dup_mf8:
+** ld1r        {v0\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_mf8, mfloat8x8_t, const mfloat8_t *)
+
+/*
+** test_vld1_dup_s8:
+** ld1r        {v0\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_s8, int8x8_t, const int8_t *)
+
+/*
+** test_vld1_dup_s16:
+** ld1r        {v0\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_s16, int16x4_t, const int16_t *)
+
+/*
+** test_vld1_dup_s32:
+** ld1r        {v0\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_s32, int32x2_t, const int32_t *)
+
+/*
+** test_vld1_dup_s64:
+** ldr d0, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_s64, int64x1_t, const int64_t *)
+
+/*
+** test_vld1_dup_u8:
+** ld1r        {v0\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_u8, uint8x8_t, const uint8_t *)
+
+/*
+** test_vld1_dup_u16:
+** ld1r        {v0\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_u16, uint16x4_t, const uint16_t *)
+
+/*
+** test_vld1_dup_u32:
+** ld1r        {v0\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_u32, uint32x2_t, const uint32_t *)
+
+/*
+** test_vld1_dup_u64:
+** ldr d0, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_u64, uint64x1_t, const uint64_t *)
+
+/*
+** test_vld1_dup_p8:
+** ld1r        {v0\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_p8, poly8x8_t, const poly8_t *)
+
+/*
+** test_vld1_dup_p16:
+** ld1r        {v0\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_p16, poly16x4_t, const poly16_t *)
+
+/*
+** test_vld1_dup_p64:
+** ldr d0, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1_dup_p64, poly64x1_t, const poly64_t *)
+
+/*
+** test_vld1q_dup_bf16:
+** ld1r        {v0\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_bf16, bfloat16x8_t, const bfloat16_t *)
+
+/*
+** test_vld1q_dup_f16:
+** ld1r        {v0\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_f16, float16x8_t, const float16_t *)
+
+/*
+** test_vld1q_dup_f32:
+** ld1r        {v0\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_f32, float32x4_t, const float32_t *)
+
+/*
+** test_vld1q_dup_f64:
+** ld1r        {v0\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_f64, float64x2_t, const float64_t *)
+
+/*
+** test_vld1q_dup_mf8:
+** ld1r        {v0\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_mf8, mfloat8x16_t, const mfloat8_t *)
+
+/*
+** test_vld1q_dup_s8:
+** ld1r        {v0\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_s8, int8x16_t, const int8_t *)
+
+/*
+** test_vld1q_dup_s16:
+** ld1r        {v0\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_s16, int16x8_t, const int16_t *)
+
+/*
+** test_vld1q_dup_s32:
+** ld1r        {v0\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_s32, int32x4_t, const int32_t *)
+
+/*
+** test_vld1q_dup_s64:
+** ld1r        {v0\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_s64, int64x2_t, const int64_t *)
+
+/*
+** test_vld1q_dup_u8:
+** ld1r        {v0\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_u8, uint8x16_t, const uint8_t *)
+
+/*
+** test_vld1q_dup_u16:
+** ld1r        {v0\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_u16, uint16x8_t, const uint16_t *)
+
+/*
+** test_vld1q_dup_u32:
+** ld1r        {v0\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_u32, uint32x4_t, const uint32_t *)
+
+/*
+** test_vld1q_dup_u64:
+** ld1r        {v0\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_u64, uint64x2_t, const uint64_t *)
+
+/*
+** test_vld1q_dup_p8:
+** ld1r        {v0\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_p8, poly8x16_t, const poly8_t *)
+
+/*
+** test_vld1q_dup_p16:
+** ld1r        {v0\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_p16, poly16x8_t, const poly16_t *)
+
+/*
+** test_vld1q_dup_p64:
+** ld1r        {v0\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld1q_dup_p64, poly64x2_t, const poly64_t *)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vld2_dup.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vld2_dup.c
new file mode 100644
index 00000000000..e259371062a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vld2_dup.c
@@ -0,0 +1,228 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vld2_dup_f16:
+** ld2r        {v0\.4h - v1\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_f16, float16x4x2_t, const float16_t *)
+
+/*
+** test_vld2_dup_bf16:
+** ld2r        {v0\.4h - v1\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_bf16, bfloat16x4x2_t, const bfloat16_t *)
+
+/*
+** test_vld2_dup_f32:
+** ld2r        {v0\.2s - v1\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_f32, float32x2x2_t, const float32_t *)
+
+/*
+** test_vld2_dup_f64:
+** ld2r        {v0\.1d - v1\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_f64, float64x1x2_t, const float64_t *)
+
+/*
+** test_vld2_dup_mf8:
+** ld2r        {v0\.8b - v1\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_mf8, mfloat8x8x2_t, const mfloat8_t *)
+
+/*
+** test_vld2_dup_s8:
+** ld2r        {v0\.8b - v1\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_s8, int8x8x2_t, const int8_t *)
+
+/*
+** test_vld2_dup_s16:
+** ld2r        {v0\.4h - v1\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_s16, int16x4x2_t, const int16_t *)
+
+/*
+** test_vld2_dup_s32:
+** ld2r        {v0\.2s - v1\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_s32, int32x2x2_t, const int32_t *)
+
+/*
+** test_vld2_dup_s64:
+** ld2r        {v0\.1d - v1\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_s64, int64x1x2_t, const int64_t *)
+
+/*
+** test_vld2_dup_u8:
+** ld2r        {v0\.8b - v1\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_u8, uint8x8x2_t, const uint8_t *)
+
+/*
+** test_vld2_dup_u16:
+** ld2r        {v0\.4h - v1\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_u16, uint16x4x2_t, const uint16_t *)
+
+/*
+** test_vld2_dup_u32:
+** ld2r        {v0\.2s - v1\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_u32, uint32x2x2_t, const uint32_t *)
+
+/*
+** test_vld2_dup_u64:
+** ld2r        {v0\.1d - v1\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_u64, uint64x1x2_t, const uint64_t *)
+
+/*
+** test_vld2_dup_p8:
+** ld2r        {v0\.8b - v1\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_p8, poly8x8x2_t, const poly8_t *)
+
+/*
+** test_vld2_dup_p16:
+** ld2r        {v0\.4h - v1\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_p16, poly16x4x2_t, const poly16_t *)
+
+/*
+** test_vld2_dup_p64:
+** ld2r        {v0\.1d - v1\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2_dup_p64, poly64x1x2_t, const poly64_t *)
+
+/*
+** test_vld2q_dup_bf16:
+** ld2r        {v0\.8h - v1\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_bf16, bfloat16x8x2_t, const bfloat16_t *)
+
+/*
+** test_vld2q_dup_f16:
+** ld2r        {v0\.8h - v1\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_f16, float16x8x2_t, const float16_t *)
+
+/*
+** test_vld2q_dup_f32:
+** ld2r        {v0\.4s - v1\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_f32, float32x4x2_t, const float32_t *)
+
+/*
+** test_vld2q_dup_f64:
+** ld2r        {v0\.2d - v1\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_f64, float64x2x2_t, const float64_t *)
+
+/*
+** test_vld2q_dup_mf8:
+** ld2r        {v0\.16b - v1\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_mf8, mfloat8x16x2_t, const mfloat8_t *)
+
+/*
+** test_vld2q_dup_s8:
+** ld2r        {v0\.16b - v1\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_s8, int8x16x2_t, const int8_t *)
+
+/*
+** test_vld2q_dup_s16:
+** ld2r        {v0\.8h - v1\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_s16, int16x8x2_t, const int16_t *)
+
+/*
+** test_vld2q_dup_s32:
+** ld2r        {v0\.4s - v1\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_s32, int32x4x2_t, const int32_t *)
+
+/*
+** test_vld2q_dup_s64:
+** ld2r        {v0\.2d - v1\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_s64, int64x2x2_t, const int64_t *)
+
+/*
+** test_vld2q_dup_u8:
+** ld2r        {v0\.16b - v1\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_u8, uint8x16x2_t, const uint8_t *)
+
+/*
+** test_vld2q_dup_u16:
+** ld2r        {v0\.8h - v1\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_u16, uint16x8x2_t, const uint16_t *)
+
+/*
+** test_vld2q_dup_u32:
+** ld2r        {v0\.4s - v1\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_u32, uint32x4x2_t, const uint32_t *)
+
+/*
+** test_vld2q_dup_u64:
+** ld2r        {v0\.2d - v1\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_u64, uint64x2x2_t, const uint64_t *)
+
+/*
+** test_vld2q_dup_p8:
+** ld2r        {v0\.16b - v1\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_p8, poly8x16x2_t, const poly8_t *)
+
+/*
+** test_vld2q_dup_p16:
+** ld2r        {v0\.8h - v1\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_p16, poly16x8x2_t, const poly16_t *)
+
+/*
+** test_vld2q_dup_p64:
+** ld2r        {v0\.2d - v1\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld2q_dup_p64, poly64x2x2_t, const poly64_t *)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vld3_dup.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vld3_dup.c
new file mode 100644
index 00000000000..1f7bfd808ee
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vld3_dup.c
@@ -0,0 +1,228 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vld3_dup_f16:
+** ld3r        {v0\.4h - v2\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_f16, float16x4x3_t, const float16_t *)
+
+/*
+** test_vld3_dup_bf16:
+** ld3r        {v0\.4h - v2\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_bf16, bfloat16x4x3_t, const bfloat16_t *)
+
+/*
+** test_vld3_dup_f32:
+** ld3r        {v0\.2s - v2\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_f32, float32x2x3_t, const float32_t *)
+
+/*
+** test_vld3_dup_f64:
+** ld3r        {v0\.1d - v2\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_f64, float64x1x3_t, const float64_t *)
+
+/*
+** test_vld3_dup_mf8:
+** ld3r        {v0\.8b - v2\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_mf8, mfloat8x8x3_t, const mfloat8_t *)
+
+/*
+** test_vld3_dup_s8:
+** ld3r        {v0\.8b - v2\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_s8, int8x8x3_t, const int8_t *)
+
+/*
+** test_vld3_dup_s16:
+** ld3r        {v0\.4h - v2\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_s16, int16x4x3_t, const int16_t *)
+
+/*
+** test_vld3_dup_s32:
+** ld3r        {v0\.2s - v2\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_s32, int32x2x3_t, const int32_t *)
+
+/*
+** test_vld3_dup_s64:
+** ld3r        {v0\.1d - v2\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_s64, int64x1x3_t, const int64_t *)
+
+/*
+** test_vld3_dup_u8:
+** ld3r        {v0\.8b - v2\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_u8, uint8x8x3_t, const uint8_t *)
+
+/*
+** test_vld3_dup_u16:
+** ld3r        {v0\.4h - v2\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_u16, uint16x4x3_t, const uint16_t *)
+
+/*
+** test_vld3_dup_u32:
+** ld3r        {v0\.2s - v2\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_u32, uint32x2x3_t, const uint32_t *)
+
+/*
+** test_vld3_dup_u64:
+** ld3r        {v0\.1d - v2\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_u64, uint64x1x3_t, const uint64_t *)
+
+/*
+** test_vld3_dup_p8:
+** ld3r        {v0\.8b - v2\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_p8, poly8x8x3_t, const poly8_t *)
+
+/*
+** test_vld3_dup_p16:
+** ld3r        {v0\.4h - v2\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_p16, poly16x4x3_t, const poly16_t *)
+
+/*
+** test_vld3_dup_p64:
+** ld3r        {v0\.1d - v2\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3_dup_p64, poly64x1x3_t, const poly64_t *)
+
+/*
+** test_vld3q_dup_bf16:
+** ld3r        {v0\.8h - v2\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_bf16, bfloat16x8x3_t, const bfloat16_t *)
+
+/*
+** test_vld3q_dup_f16:
+** ld3r        {v0\.8h - v2\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_f16, float16x8x3_t, const float16_t *)
+
+/*
+** test_vld3q_dup_f32:
+** ld3r        {v0\.4s - v2\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_f32, float32x4x3_t, const float32_t *)
+
+/*
+** test_vld3q_dup_f64:
+** ld3r        {v0\.2d - v2\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_f64, float64x2x3_t, const float64_t *)
+
+/*
+** test_vld3q_dup_mf8:
+** ld3r        {v0\.16b - v2\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_mf8, mfloat8x16x3_t, const mfloat8_t *)
+
+/*
+** test_vld3q_dup_s8:
+** ld3r        {v0\.16b - v2\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_s8, int8x16x3_t, const int8_t *)
+
+/*
+** test_vld3q_dup_s16:
+** ld3r        {v0\.8h - v2\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_s16, int16x8x3_t, const int16_t *)
+
+/*
+** test_vld3q_dup_s32:
+** ld3r        {v0\.4s - v2\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_s32, int32x4x3_t, const int32_t *)
+
+/*
+** test_vld3q_dup_s64:
+** ld3r        {v0\.2d - v2\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_s64, int64x2x3_t, const int64_t *)
+
+/*
+** test_vld3q_dup_u8:
+** ld3r        {v0\.16b - v2\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_u8, uint8x16x3_t, const uint8_t *)
+
+/*
+** test_vld3q_dup_u16:
+** ld3r        {v0\.8h - v2\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_u16, uint16x8x3_t, const uint16_t *)
+
+/*
+** test_vld3q_dup_u32:
+** ld3r        {v0\.4s - v2\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_u32, uint32x4x3_t, const uint32_t *)
+
+/*
+** test_vld3q_dup_u64:
+** ld3r        {v0\.2d - v2\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_u64, uint64x2x3_t, const uint64_t *)
+
+/*
+** test_vld3q_dup_p8:
+** ld3r        {v0\.16b - v2\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_p8, poly8x16x3_t, const poly8_t *)
+
+/*
+** test_vld3q_dup_p16:
+** ld3r        {v0\.8h - v2\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_p16, poly16x8x3_t, const poly16_t *)
+
+/*
+** test_vld3q_dup_p64:
+** ld3r        {v0\.2d - v2\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld3q_dup_p64, poly64x2x3_t, const poly64_t *)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vld4_dup.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vld4_dup.c
new file mode 100644
index 00000000000..d33e71dbcca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vld4_dup.c
@@ -0,0 +1,228 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vld4_dup_f16:
+** ld4r        {v0\.4h - v3\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_f16, float16x4x4_t, const float16_t *)
+
+/*
+** test_vld4_dup_bf16:
+** ld4r        {v0\.4h - v3\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_bf16, bfloat16x4x4_t, const bfloat16_t *)
+
+/*
+** test_vld4_dup_f32:
+** ld4r        {v0\.2s - v3\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_f32, float32x2x4_t, const float32_t *)
+
+/*
+** test_vld4_dup_f64:
+** ld4r        {v0\.1d - v3\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_f64, float64x1x4_t, const float64_t *)
+
+/*
+** test_vld4_dup_mf8:
+** ld4r        {v0\.8b - v3\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_mf8, mfloat8x8x4_t, const mfloat8_t *)
+
+/*
+** test_vld4_dup_s8:
+** ld4r        {v0\.8b - v3\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_s8, int8x8x4_t, const int8_t *)
+
+/*
+** test_vld4_dup_s16:
+** ld4r        {v0\.4h - v3\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_s16, int16x4x4_t, const int16_t *)
+
+/*
+** test_vld4_dup_s32:
+** ld4r        {v0\.2s - v3\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_s32, int32x2x4_t, const int32_t *)
+
+/*
+** test_vld4_dup_s64:
+** ld4r        {v0\.1d - v3\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_s64, int64x1x4_t, const int64_t *)
+
+/*
+** test_vld4_dup_u8:
+** ld4r        {v0\.8b - v3\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_u8, uint8x8x4_t, const uint8_t *)
+
+/*
+** test_vld4_dup_u16:
+** ld4r        {v0\.4h - v3\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_u16, uint16x4x4_t, const uint16_t *)
+
+/*
+** test_vld4_dup_u32:
+** ld4r        {v0\.2s - v3\.2s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_u32, uint32x2x4_t, const uint32_t *)
+
+/*
+** test_vld4_dup_u64:
+** ld4r        {v0\.1d - v3\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_u64, uint64x1x4_t, const uint64_t *)
+
+/*
+** test_vld4_dup_p8:
+** ld4r        {v0\.8b - v3\.8b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_p8, poly8x8x4_t, const poly8_t *)
+
+/*
+** test_vld4_dup_p16:
+** ld4r        {v0\.4h - v3\.4h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_p16, poly16x4x4_t, const poly16_t *)
+
+/*
+** test_vld4_dup_p64:
+** ld4r        {v0\.1d - v3\.1d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4_dup_p64, poly64x1x4_t, const poly64_t *)
+
+/*
+** test_vld4q_dup_bf16:
+** ld4r        {v0\.8h - v3\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_bf16, bfloat16x8x4_t, const bfloat16_t *)
+
+/*
+** test_vld4q_dup_f16:
+** ld4r        {v0\.8h - v3\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_f16, float16x8x4_t, const float16_t *)
+
+/*
+** test_vld4q_dup_f32:
+** ld4r        {v0\.4s - v3\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_f32, float32x4x4_t, const float32_t *)
+
+/*
+** test_vld4q_dup_f64:
+** ld4r        {v0\.2d - v3\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_f64, float64x2x4_t, const float64_t *)
+
+/*
+** test_vld4q_dup_mf8:
+** ld4r        {v0\.16b - v3\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_mf8, mfloat8x16x4_t, const mfloat8_t *)
+
+/*
+** test_vld4q_dup_s8:
+** ld4r        {v0\.16b - v3\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_s8, int8x16x4_t, const int8_t *)
+
+/*
+** test_vld4q_dup_s16:
+** ld4r        {v0\.8h - v3\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_s16, int16x8x4_t, const int16_t *)
+
+/*
+** test_vld4q_dup_s32:
+** ld4r        {v0\.4s - v3\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_s32, int32x4x4_t, const int32_t *)
+
+/*
+** test_vld4q_dup_s64:
+** ld4r        {v0\.2d - v3\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_s64, int64x2x4_t, const int64_t *)
+
+/*
+** test_vld4q_dup_u8:
+** ld4r        {v0\.16b - v3\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_u8, uint8x16x4_t, const uint8_t *)
+
+/*
+** test_vld4q_dup_u16:
+** ld4r        {v0\.8h - v3\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_u16, uint16x8x4_t, const uint16_t *)
+
+/*
+** test_vld4q_dup_u32:
+** ld4r        {v0\.4s - v3\.4s}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_u32, uint32x4x4_t, const uint32_t *)
+
+/*
+** test_vld4q_dup_u64:
+** ld4r        {v0\.2d - v3\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_u64, uint64x2x4_t, const uint64_t *)
+
+/*
+** test_vld4q_dup_p8:
+** ld4r        {v0\.16b - v3\.16b}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_p8, poly8x16x4_t, const poly8_t *)
+
+/*
+** test_vld4q_dup_p16:
+** ld4r        {v0\.8h - v3\.8h}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_p16, poly16x8x4_t, const poly16_t *)
+
+/*
+** test_vld4q_dup_p64:
+** ld4r        {v0\.2d - v3\.2d}, \[x0\]
+** ret
+*/
+TEST_UNARY (vld4q_dup_p64, poly64x2x4_t, const poly64_t *)
-- 
2.56.0

Reply via email to