Sorry for the slow reply.

Matthew Malcomson <matthew.malcom...@arm.com> writes:
> @@ -326,16 +326,18 @@ int opt_ext_cmp (const void* a, const void* b)
>       turns on as a dependency.  As an example +dotprod turns on FL_DOTPROD 
> and
>       FL_SIMD.  As such the set of bits represented by this option is
>       {FL_DOTPROD, FL_SIMD}. */
> -  unsigned long total_flags_a = opt_a->flag_canonical & opt_a->flags_on;
> -  unsigned long total_flags_b = opt_b->flag_canonical & opt_b->flags_on;
> +  uint64_t total_flags_a = opt_a->flag_canonical & opt_a->flags_on;
> +  uint64_t total_flags_b = opt_b->flag_canonical & opt_b->flags_on;
>    int popcnt_a = popcount_hwi ((HOST_WIDE_INT)total_flags_a);
>    int popcnt_b = popcount_hwi ((HOST_WIDE_INT)total_flags_b);
>    int order = popcnt_b - popcnt_a;
>  
>    /* If they have the same amount of bits set, give it a more
> -     deterministic ordering by using the value of the bits themselves.  */
> +     deterministic ordering by using the value of the bits themselves.
> +     Since the value of the bits themselves can be larger than that
> +     representable by an integer, we manually truncate the value.  */
>    if (order == 0)
> -    return total_flags_b - total_flags_a;
> +    return (total_flags_b - total_flags_a) & INT_MAX;

This means that we return 1 if the flags differ in the low 31 bits
and 0 otherwise.  I think we should use:

    return total_flags_a < total_flags_b ? 1 : -1;

> diff --git a/gcc/config/aarch64/aarch64-option-extensions.def 
> b/gcc/config/aarch64/aarch64-option-extensions.def
> index 
> 53dcd03590d2e4eebac83f03039c442fca7f5d5d..e4f56ac5fa08464d67750455ee6476a0e4ce1735
>  100644
> --- a/gcc/config/aarch64/aarch64-option-extensions.def
> +++ b/gcc/config/aarch64/aarch64-option-extensions.def
> @@ -57,17 +57,20 @@
>  
>  /* Enabling "fp" just enables "fp".
>     Disabling "fp" also disables "simd", "crypto", "fp16", "aes", "sha2",
> -   "sha3", sm3/sm4 and "sve".  */
> -AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | 
> AARCH64_FL_CRYPTO | AARCH64_FL_F16 | AARCH64_FL_AES | AARCH64_FL_SHA2 | 
> AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, false, "fp")
> +   "sha3", sm3/sm4, "sve", "sve2-sm4", "sve2-sha3", "sve2-aes", "bitperm" and
> +   "sve2".  */
> +AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | 
> AARCH64_FL_CRYPTO | AARCH64_FL_F16 | AARCH64_FL_AES | AARCH64_FL_SHA2 | 
> AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE | AARCH64_FL_SVE2 | 
> AARCH64_FL_SVE2AES | AARCH64_FL_SVE2SHA3 | AARCH64_FL_SVE2SM4 | 
> AARCH64_FL_SVE2BITPERM, false, "fp")
>  
>  /* Enabling "simd" also enables "fp".
>     Disabling "simd" also disables "crypto", "dotprod", "aes", "sha2", "sha3",
> -   "sm3/sm4" and "sve".  */
> -AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, 
> AARCH64_FL_CRYPTO | AARCH64_FL_DOTPROD | AARCH64_FL_AES | AARCH64_FL_SHA2 | 
> AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, false, "asimd")
> +   "sm3/sm4", "sve", "sve2-sm4", "sve2-sha3", "sve2-aes", "bitperm" and 
> "sve2".
> +   */
> +AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, 
> AARCH64_FL_CRYPTO | AARCH64_FL_DOTPROD | AARCH64_FL_AES | AARCH64_FL_SHA2 | 
> AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE | AARCH64_FL_SVE2 | 
> AARCH64_FL_SVE2AES | AARCH64_FL_SVE2SHA3 | AARCH64_FL_SVE2SM4 | 
> AARCH64_FL_SVE2BITPERM, false, "asimd")
>  
>  /* Enabling "crypto" also enables "fp", "simd", "aes" and "sha2".
> -   Disabling "crypto" disables "crypto", "aes", "sha2", "sha3" and 
> "sm3/sm4".  */
> -AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO, AARCH64_FL_FP | 
> AARCH64_FL_SIMD | AARCH64_FL_AES | AARCH64_FL_SHA2, AARCH64_FL_AES | 
> AARCH64_FL_SHA2 |AARCH64_FL_SHA3 | AARCH64_FL_SM4, true, "aes pmull sha1 
> sha2")
> +   Disabling "crypto" disables "crypto", "aes", "sha2", "sha3" and "sm3/sm4",
> +   "sve2-aes", "sve2-sm4", "sve2-sha3".  */
> +AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO, AARCH64_FL_FP | 
> AARCH64_FL_SIMD | AARCH64_FL_AES | AARCH64_FL_SHA2, AARCH64_FL_AES | 
> AARCH64_FL_SHA2 | AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE2AES | 
> AARCH64_FL_SVE2SHA3 | AARCH64_FL_SVE2SM4, true, "aes pmull sha1 sha2")
>  
>  /* Enabling or disabling "crc" only changes "crc".  */
>  AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, false, "crc32")
> @@ -76,8 +79,9 @@ AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, false, 
> "crc32")
>  AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, 0, 0, false, "atomics")
>  
>  /* Enabling "fp16" also enables "fp".
> -   Disabling "fp16" disables "fp16", "fp16fml" and "sve".  */
> -AARCH64_OPT_EXTENSION("fp16", AARCH64_FL_F16, AARCH64_FL_FP, 
> AARCH64_FL_F16FML | AARCH64_FL_SVE, false, "fphp asimdhp")
> +   Disabling "fp16" disables "fp16", "fp16fml", "sve", "sve2-sm4", 
> "sve2-sha3",
> +   "sve2-aes", "bitperm" and "sve2".  */
> +AARCH64_OPT_EXTENSION("fp16", AARCH64_FL_F16, AARCH64_FL_FP, 
> AARCH64_FL_F16FML | AARCH64_FL_SVE | AARCH64_FL_SVE2 | AARCH64_FL_SVE2AES | 
> AARCH64_FL_SVE2SHA3 | AARCH64_FL_SVE2SM4 | AARCH64_FL_SVE2BITPERM, false, 
> "fphp asimdhp")
>  
>  /* Enabling or disabling "rcpc" only changes "rcpc".  */
>  AARCH64_OPT_EXTENSION("rcpc", AARCH64_FL_RCPC, 0, 0, false, "lrcpc")
> @@ -91,28 +95,29 @@ AARCH64_OPT_EXTENSION("rdma", AARCH64_FL_RDMA, 
> AARCH64_FL_FP | AARCH64_FL_SIMD,
>  AARCH64_OPT_EXTENSION("dotprod", AARCH64_FL_DOTPROD, AARCH64_FL_SIMD, 0, 
> false, "asimddp")
>  
>  /* Enabling "aes" also enables "simd".
> -   Disabling "aes" just disables "aes".  */
> -AARCH64_OPT_EXTENSION("aes", AARCH64_FL_AES, AARCH64_FL_SIMD, 0, false, 
> "aes")
> +   Disabling "aes" disables "aes" and "sve2-aes'.  */
> +AARCH64_OPT_EXTENSION("aes", AARCH64_FL_AES, AARCH64_FL_SIMD, 
> AARCH64_FL_SVE2AES, false, "aes")
>  
>  /* Enabling "sha2" also enables "simd".
>     Disabling "sha2" just disables "sha2".  */
>  AARCH64_OPT_EXTENSION("sha2", AARCH64_FL_SHA2, AARCH64_FL_SIMD, 0, false, 
> "sha1 sha2")
>  
>  /* Enabling "sha3" enables "simd" and "sha2".
> -   Disabling "sha3" just disables "sha3".  */
> -AARCH64_OPT_EXTENSION("sha3", AARCH64_FL_SHA3, AARCH64_FL_SIMD | 
> AARCH64_FL_SHA2, 0, false, "sha3 sha512")
> +   Disabling "sha3" disables "sha3" and "sve2-sha3".  */
> +AARCH64_OPT_EXTENSION("sha3", AARCH64_FL_SHA3, AARCH64_FL_SIMD | 
> AARCH64_FL_SHA2, AARCH64_FL_SVE2SHA3, false, "sha3 sha512")
>  
>  /* Enabling "sm4" also enables "simd".
> -   Disabling "sm4" just disables "sm4".  */
> -AARCH64_OPT_EXTENSION("sm4", AARCH64_FL_SM4, AARCH64_FL_SIMD, 0, false, "sm3 
> sm4")
> +   Disabling "sm4" disables "sm4" and "sve2-sm4".  */
> +AARCH64_OPT_EXTENSION("sm4", AARCH64_FL_SM4, AARCH64_FL_SIMD, 
> AARCH64_FL_SVE2SM4, false, "sm3 sm4")
>  
>  /* Enabling "fp16fml" also enables "fp" and "fp16".
>     Disabling "fp16fml" just disables "fp16fml".  */
>  AARCH64_OPT_EXTENSION("fp16fml", AARCH64_FL_F16FML, AARCH64_FL_FP | 
> AARCH64_FL_F16, 0, false, "asimdfml")
>  
>  /* Enabling "sve" also enables "fp16", "fp" and "simd".
> -   Disabling "sve" just disables "sve".  */
> -AARCH64_OPT_EXTENSION("sve", AARCH64_FL_SVE, AARCH64_FL_FP | AARCH64_FL_SIMD 
> | AARCH64_FL_F16, 0, false, "sve")
> +   Disabling "sve" disables "sve", "sve2", "bitperm", "sve2-sha3", 
> "sve2-sm4" and
> +   "sve2-aes".  */
> +AARCH64_OPT_EXTENSION("sve", AARCH64_FL_SVE, AARCH64_FL_FP | AARCH64_FL_SIMD 
> | AARCH64_FL_F16, AARCH64_FL_SVE2 | AARCH64_FL_SVE2AES | AARCH64_FL_SVE2SHA3 
> | AARCH64_FL_SVE2SM4 | AARCH64_FL_SVE2BITPERM, false, "sve")
>  
>  /* Enabling/Disabling "profile" does not enable/disable any other feature.  
> */
>  AARCH64_OPT_EXTENSION("profile", AARCH64_FL_PROFILE, 0, 0, false, "")
> @@ -132,4 +137,25 @@ AARCH64_OPT_EXTENSION("ssbs", AARCH64_FL_SSBS, 0, 0, 
> false, "")
>  /* Enabling/Disabling "predres" only changes "predres".  */
>  AARCH64_OPT_EXTENSION("predres", AARCH64_FL_PREDRES, 0, 0, false, "")
>  
> +/* Enabling "sve2" also enables "sve", "fp16", "fp", and "simd".
> +   Disabling "sve2" disables "sve2", "sve2-sm4", "sve2-sha3", "sve2-aes", and
> +   "bitperm".  */
> +AARCH64_OPT_EXTENSION("sve2", AARCH64_FL_SVE2, AARCH64_FL_SVE | 
> AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16, AARCH64_FL_SVE2SM4 | 
> AARCH64_FL_SVE2AES | AARCH64_FL_SVE2SHA3 | AARCH64_FL_SVE2BITPERM, false, "")
> +
> +/* Enabling "sve2-sm4" also enables "sve2", "sve", "fp", "fp16" "simd", and
> +   "sm4". Disabling "sve2-sm4" just disables "sve2-sm4".  */
> +AARCH64_OPT_EXTENSION("sve2-sm4", AARCH64_FL_SVE2SM4, AARCH64_FL_SVE | 
> AARCH64_FL_SVE2 | AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16 | 
> AARCH64_FL_SM4, 0, false, "")
> +
> +/* Enabling "sve2-aes" also enables "sve2", "sve", "fp", "fp16", "simd", and
> +   "aes". Disabling "sve2-aes" just disables "sve2-aes".  */
> +AARCH64_OPT_EXTENSION("sve2-aes", AARCH64_FL_SVE2AES, AARCH64_FL_SVE | 
> AARCH64_FL_SVE2 |  AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16 | 
> AARCH64_FL_AES, 0, false, "")
> +
> +/* Enabling "sve2-sha3" also enables "sve2", "sve", "fp", "fp16", "simd", and
> +   "sha3". Disabling "sve2-sha3" just disables "sve2-sha3".  */
> +AARCH64_OPT_EXTENSION("sve2-sha3", AARCH64_FL_SVE2SHA3, AARCH64_FL_SVE | 
> AARCH64_FL_SVE2 |  AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16 | 
> AARCH64_FL_SHA3, 0, false, "")
> +
> +/* Enabling "bitperm" also enables "sve2", "sve", "fp", "fp16" and "simd".
> +   Disabling "bitperm" just disables "bitperm".  */
> +AARCH64_OPT_EXTENSION("bitperm", AARCH64_FL_SVE2BITPERM, AARCH64_FL_SVE | 
> AARCH64_FL_SVE2 |  AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16, 0, 
> false, "")
> +

Very minor, sorry, but I think it'd be more readable to separate
SVE2 and things like AES with "_".

The new features need documenting in the aarch64-feature-modifiers
section of doc/invoke.texi.

Thanks,
Richard

Reply via email to