Some SVE features in the toolchain need to be enabled when either of two
different kernel HWCAPS (and corresponding cpuinfo strings) are enabled
(one for non-streaming mode and one for streaming mode).

Add support for using "|" to separate alternative lists of required
features.


Bootstrapped and regression tested, and tested further by changing two of the
feature string definitions to "sve2 | blah" and "testing123 | fphp asimdhp" and
rerunning the aarch64-cpunative.exp tests.

This change is required for Alfie's new feature flags patch series.
Ok for master?


diff --git a/gcc/config/aarch64/driver-aarch64.cc 
b/gcc/config/aarch64/driver-aarch64.cc
index 
0333746ee00422e47a8349fad1127a1abface877..be98c5b5d1bcb33b44927e6e365a3a39e46ee203
 100644
--- a/gcc/config/aarch64/driver-aarch64.cc
+++ b/gcc/config/aarch64/driver-aarch64.cc
@@ -368,18 +368,30 @@ host_detect_local_cpu (int argc, const char **argv)
                  continue;
                }
 
+             /* This may be a multi-token feature string.  We need to match
+                all parts in one of the "|" separated sublists.  */
              bool enabled = true;
-
-             /* This may be a multi-token feature string.  We need
-                to match all parts, which could be in any order.  */
-             std::set<std::string> tokens;
-             split_words (val, tokens);
-             std::set<std::string>::iterator it;
-
-             /* Iterate till the first feature isn't found or all of them
-                are found.  */
-             for (it = tokens.begin (); enabled && it != tokens.end (); ++it)
-               enabled = enabled && features.count (*it);
+             size_t cur = 0;
+             while (cur < val.length ())
+               {
+                 size_t end = val.find_first_of (" ", cur);
+                 if (end == std::string::npos)
+                   end = val.length ();
+                 std::string word = val.substr (cur, end - cur);
+                 cur = end + 1;
+
+                 if (word == "|")
+                   {
+                     /* If we've matched everything in the current sublist, we
+                        can stop now.  */
+                     if (enabled)
+                       break;
+                     /* Otherwise, start again with the next sublist.  */
+                     enabled = true;
+                     continue;
+                   }
+                 enabled = enabled && features.count (word);
+               }
 
              if (enabled)
                extension_flags |= aarch64_extensions[i].flag;

Reply via email to