gcc/ChangeLog:

        * config/aarch64/aarch64.cc (aarch64_hard_regno_nregs): Handle 
`FP_HI_REGS`.
        (aarch64_class_max_nregs): Likewise.
        * config/aarch64/aarch64.h (reg_class::FP_HI_REGS): New enum member.
        * config/aarch64/constraints.md (z): New register constraint.
        (Ux2): Likewise.
        (Uxz): Likewise.
---
 gcc/config/aarch64/aarch64.cc     |  2 ++
 gcc/config/aarch64/aarch64.h      |  3 +++
 gcc/config/aarch64/constraints.md | 11 +++++++++++
 3 files changed, 16 insertions(+)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 0ef22e8e52c..9d7e20d8413 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -2195,6 +2195,7 @@ aarch64_hard_regno_nregs (unsigned regno, machine_mode 
mode)
     case FP_REGS:
     case FP_LO_REGS:
     case FP_LO8_REGS:
+    case FP_HI_REGS:
       {
        unsigned int vec_flags = aarch64_classify_vector_mode (mode);
        if (vec_flags & VEC_SVE_DATA)
@@ -13824,6 +13825,7 @@ aarch64_class_max_nregs (reg_class_t regclass, 
machine_mode mode)
     case FP_REGS:
     case FP_LO_REGS:
     case FP_LO8_REGS:
+    case FP_HI_REGS:
       vec_flags = aarch64_classify_vector_mode (mode);
       if ((vec_flags & VEC_SVE_DATA)
          && constant_multiple_p (GET_MODE_SIZE (mode),
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 540dfd00190..9d6f3fef7c2 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -867,6 +867,7 @@ enum reg_class
   POINTER_REGS,
   FP_LO8_REGS,
   FP_LO_REGS,
+  FP_HI_REGS,
   FP_REGS,
   POINTER_AND_FP_REGS,
   PR_LO_REGS,
@@ -894,6 +895,7 @@ enum reg_class
   "POINTER_REGS",                              \
   "FP_LO8_REGS",                               \
   "FP_LO_REGS",                                        \
+  "FP_HI_REGS",                                        \
   "FP_REGS",                                   \
   "POINTER_AND_FP_REGS",                       \
   "PR_LO_REGS",                                        \
@@ -918,6 +920,7 @@ enum reg_class
   { 0xffffffff, 0x00000000, 0x00000003 },      /* POINTER_REGS */      \
   { 0x00000000, 0x000000ff, 0x00000000 },       /* FP_LO8_REGS  */     \
   { 0x00000000, 0x0000ffff, 0x00000000 },       /* FP_LO_REGS  */      \
+  { 0x00000000, 0xffff0000, 0x00000000 },       /* FP_HI_REGS  */      \
   { 0x00000000, 0xffffffff, 0x00000000 },       /* FP_REGS  */         \
   { 0xffffffff, 0xffffffff, 0x00000003 },      /* POINTER_AND_FP_REGS */\
   { 0x00000000, 0x00000000, 0x00000ff0 },      /* PR_LO_REGS */        \
diff --git a/gcc/config/aarch64/constraints.md 
b/gcc/config/aarch64/constraints.md
index b84993efb7f..89352c54418 100644
--- a/gcc/config/aarch64/constraints.md
+++ b/gcc/config/aarch64/constraints.md
@@ -48,6 +48,17 @@ (define_register_constraint "x" "FP_LO_REGS"
 (define_register_constraint "y" "FP_LO8_REGS"
   "SVE/NEON/FP registers, V0 - V7.")
 
+(define_register_constraint "z" "FP_HI_REGS"
+  "SVE/NEON/FP registers, V16 - V31.")
+
+(define_register_constraint "Ux2" "FP_LO_REGS"
+  "Even SVE/NEON/FP registers, V0, V2, ..., V14."
+  "regno % 2 == 0")
+
+(define_register_constraint "Uz2" "FP_HI_REGS"
+  "Even SVE/NEON/FP registers, V16, V18, ..., V30."
+  "regno % 2 == 0")
+
 (define_register_constraint "Uw2" "FP_REGS"
   "Even SVE/NEON/FP registers, V0, V2, ..., V30."
   "regno % 2 == 0")
-- 
2.43.0

Reply via email to