On 12/18/19 4:47 PM, Richard Sandiford wrote:
> Stam Markianos-Wright <stam.markianos-wri...@arm.com> writes:
>> On 12/13/19 11:15 AM, Richard Sandiford wrote:
>>> Stam Markianos-Wright <stam.markianos-wri...@arm.com> writes:
>>>> Hi all,
>>>>
>>>> This small patch adds support for the ARM v8.6 extensions +bf16 and
>>>> +i8mm to the testsuite. This will be tested through other upcoming
>>>> patches, which is why we are not providing any explicit tests here.
>>>>
>>>> Ok for trunk?
>>>>
>>>> Also I don't have commit rights, so if someone could commit on my
>>>> behalf, that would be great :)
>>>>
>>>> The functionality here depends on CLI patches:
>>>> https://gcc.gnu.org/ml/gcc-patches/2019-11/msg02415.html
>>>> https://gcc.gnu.org/ml/gcc-patches/2019-11/msg02195.html
>>>>
>>>> but this patch applies cleanly without them, too.
>>>>
>>>> Cheers,
>>>> Stam
>>>>
>>>>
>>>> gcc/testsuite/ChangeLog:
>>>>
>>>> 2019-12-11  Stam Markianos-Wright  <stam.markianos-wri...@arm.com>
>>>>
>>>>    * lib/target-supports.exp
>>>>    (check_effective_target_arm_v8_2a_i8mm_ok_nocache): New.
>>>>    (check_effective_target_arm_v8_2a_i8mm_ok): New.
>>>>    (add_options_for_arm_v8_2a_i8mm): New.
>>>>    (check_effective_target_arm_v8_2a_bf16_neon_ok_nocache): New.
>>>>    (check_effective_target_arm_v8_2a_bf16_neon_ok): New.
>>>>    (add_options_for_arm_v8_2a_bf16_neon): New.
>>>
>>> The new effective-target keywords need to be documented in
>>> doc/sourcebuild.texi.
>>
>> Added in new diff :)
>>
>>>
>>> LGTM otherwise.  For:
>>>
>>>> diff --git a/gcc/testsuite/lib/target-supports.exp 
>>>> b/gcc/testsuite/lib/target-supports.exp
>>>> index 5b4cc02f921..36fb63e9929 100644
>>>> --- a/gcc/testsuite/lib/target-supports.exp
>>>> +++ b/gcc/testsuite/lib/target-supports.exp
>>>> @@ -4781,6 +4781,49 @@ proc add_options_for_arm_v8_2a_dotprod_neon { flags 
>>>> } {
>>>>        return "$flags $et_arm_v8_2a_dotprod_neon_flags"
>>>>    }
>>>>    
>>>> +# Return 1 if the target supports ARMv8.2+i8mm Adv.SIMD Dot Product
>>>> +# instructions, 0 otherwise.  The test is valid for ARM and for AArch64.
>>>> +# Record the command line options needed.
>>>> +
>>>> +proc check_effective_target_arm_v8_2a_i8mm_ok_nocache { } {
>>>> +    global et_arm_v8_2a_i8mm_flags
>>>> +    set et_arm_v8_2a_i8mm_flags ""
>>>> +
>>>> +    if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
>>>> +        return 0;
>>>> +    }
>>>> +
>>>> +    # Iterate through sets of options to find the compiler flags that
>>>> +    # need to be added to the -march option.
>>>> +    foreach flags {"" "-mfloat-abi=hard -mfpu=neon-fp-armv8" 
>>>> "-mfloat-abi=softfp -mfpu=neon-fp-armv8" } {
>>>> +        if { [check_no_compiler_messages_nocache \
>>>> +                  arm_v8_2a_i8mm_ok object {
>>>> +            #include <arm_neon.h>
>>>> +            #if !defined (__ARM_FEATURE_MATMUL_INT8)
>>>> +            #error "__ARM_FEATURE_MATMUL_INT8 not defined"
>>>> +            #endif
>>>> +        } "$flags -march=armv8.2-a+i8mm"] } {
>>>> +            set et_arm_v8_2a_i8mm_flags "$flags -march=armv8.2-a+i8mm"
>>>> +            return 1
>>>> +        }
>>>> +    }
>>>
>>> I wondered whether it would be better to add no options if testing
>>> with something that already supports i8mm (e.g. -march=armv8.6).
>>> That would mean trying:
>>>
>>>     "" "-march=armv8.2-a+i8mm" "-march=armv8.2-a+i8mm -mfloat-abi..." ...
>>>
>>> instead.  But there are arguments both ways, and the above follows
>>> existing style, so OK.
>>
>> Not quite sure if I understanding this right, but I think that's what
>> the "" option in foreach flags{} is for?
>>
>> i.e. currently what I'm seeing is:
>>
>> +/* { dg-require-effective-target arm_v8_2a_i8mm_ok } */
>> +/* { dg-add-options arm_v8_2a_i8mm }  */
>>
>> will pull through the first option that compiles to object file with no
>> errors (check_no_compiler_messages_nocache arm_v8_2a_i8mm_ok object).
>>
>> So in a lot of cases it should just be fine for "" and only pull in
>> -march=armv8.2-a+i8mm.
>>
>> I think that's right? Lmk if I'm not reading it properly!
> 
> Yeah, that's right, but it's also the "problem".  The point was that
> some people will run the tests with options like -march=armv8.6-a that
> already support these instructions, e.g. using
> 
>    --target_board unix/-march=armv8.6-a
> 
> on a native box.  The code above will then override that -march option
> with -march=armv8.2-a+i8mm even though the original option was OK.
> The tests won't then actually get run with -march=armv8.6-a as the
> dominant option, despite being Armv8.6 tests. :-)
> 
> The alternative above would have tried with no options at all and only
> added -march= if that failed.  But like I say, the current version
> follows existing practice and so is fine too.


Oh right, I get you now, thank you so much for elaborating! :D

So maybe it might be a good idea to get this in as is, i.e. following existing 
practice, and then make a note internally to come back to this as a quality 
issue at a later date (since the same comment applies to many of these 
effective-target functions).


> 
>> diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
>> index 85573a49a2b..73408d12cbe 100644
>> --- a/gcc/doc/sourcebuild.texi
>> +++ b/gcc/doc/sourcebuild.texi
>> @@ -1877,6 +1877,18 @@ ARM target supports extensions to generate the 
>> @code{VFMAL} and @code{VFMLS}
>>   half-precision floating-point instructions available from ARMv8.2-A and
>>   onwards.  Some multilibs may be incompatible with these options.
>>   
>> +@item arm_v8_2a_bf16_neon_ok
>> +@anchor{arm_v8_2a_bf16_neon_ok}
>> +ARM target supports options to generate instructions from ARMv8.2-A with
>> +the BFloat16 extension (bf16). Some multilibs may be incompatible with these
>> +options.
>> +
>> +@item arm_v8_2a_i8mm_ok
>> +@anchor{arm_v8_2a_i8mm_ok}
>> +ARM target supports options to generate instructions from ARMv8.2-A with
>> +the 8-Bit Integer Matrix Multiply extension (i8mm). Some multilibs may be
>> +incompatible with these options.
>> +
>>   @item arm_prefer_ldrd_strd
>>   ARM target prefers @code{LDRD} and @code{STRD} instructions over
>>   @code{LDM} and @code{STM} instructions.
> 
> No need for the @anchors, since nothing wants to link to them yet.

Done :)

> 
> OK with that change, thanks.  Please follow the process on
> https://gcc.gnu.org/svnwrite.html to get write access.
> 

Thank you!!
Stam

> Richard
> 

diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 85573a49a2b..fdfd9dcde6b 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1877,6 +1877,16 @@ ARM target supports extensions to generate the @code{VFMAL} and @code{VFMLS}
 half-precision floating-point instructions available from ARMv8.2-A and
 onwards.  Some multilibs may be incompatible with these options.
 
+@item arm_v8_2a_bf16_neon_ok
+ARM target supports options to generate instructions from ARMv8.2-A with
+the BFloat16 extension (bf16). Some multilibs may be incompatible with these
+options.
+
+@item arm_v8_2a_i8mm_ok
+ARM target supports options to generate instructions from ARMv8.2-A with
+the 8-Bit Integer Matrix Multiply extension (i8mm). Some multilibs may be
+incompatible with these options.
+
 @item arm_prefer_ldrd_strd
 ARM target prefers @code{LDRD} and @code{STRD} instructions over
 @code{LDM} and @code{STM} instructions.
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 80e9d6720bd..5a8ec5dda1f 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -4781,6 +4781,49 @@ proc add_options_for_arm_v8_2a_dotprod_neon { flags } {
     return "$flags $et_arm_v8_2a_dotprod_neon_flags"
 }
 
+# Return 1 if the target supports ARMv8.2+i8mm Adv.SIMD Dot Product
+# instructions, 0 otherwise.  The test is valid for ARM and for AArch64.
+# Record the command line options needed.
+
+proc check_effective_target_arm_v8_2a_i8mm_ok_nocache { } {
+    global et_arm_v8_2a_i8mm_flags
+    set et_arm_v8_2a_i8mm_flags ""
+
+    if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
+        return 0;
+    }
+
+    # Iterate through sets of options to find the compiler flags that
+    # need to be added to the -march option.
+    foreach flags {"" "-mfloat-abi=hard -mfpu=neon-fp-armv8" "-mfloat-abi=softfp -mfpu=neon-fp-armv8" } {
+        if { [check_no_compiler_messages_nocache \
+                  arm_v8_2a_i8mm_ok object {
+            #include <arm_neon.h>
+            #if !defined (__ARM_FEATURE_MATMUL_INT8)
+            #error "__ARM_FEATURE_MATMUL_INT8 not defined"
+            #endif
+        } "$flags -march=armv8.2-a+i8mm"] } {
+            set et_arm_v8_2a_i8mm_flags "$flags -march=armv8.2-a+i8mm"
+            return 1
+        }
+    }
+
+    return 0;
+}
+
+proc check_effective_target_arm_v8_2a_i8mm_ok { } {
+    return [check_cached_effective_target arm_v8_2a_i8mm_ok \
+                check_effective_target_arm_v8_2a_i8mm_ok_nocache]
+}
+
+proc add_options_for_arm_v8_2a_i8mm { flags } {
+    if { ! [check_effective_target_arm_v8_2a_i8mm_ok] } {
+        return "$flags"
+    }
+    global et_arm_v8_2a_i8mm_flags
+    return "$flags $et_arm_v8_2a_i8mm_flags"
+}
+
 # Return 1 if the target supports FP16 VFMAL and VFMSL
 # instructions, 0 otherwise.
 # Record the command line options needed.
@@ -4826,6 +4869,45 @@ proc add_options_for_arm_fp16fml_neon { flags } {
     return "$flags $et_arm_fp16fml_neon_flags"
 }
 
+# Return 1 if the target supports BFloat16 SIMD instructions, 0 otherwise.
+# The test is valid for ARM and for AArch64.
+
+proc check_effective_target_arm_v8_2a_bf16_neon_ok_nocache { } {
+    global et_arm_v8_2a_bf16_neon_flags
+    set et_arm_v8_2a_bf16_neon_flags ""
+
+    if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
+        return 0;
+    }
+
+    foreach flags {"" "-mfloat-abi=hard -mfpu=neon-fp-armv8" "-mfloat-abi=softfp -mfpu=neon-fp-armv8" } {
+        if { [check_no_compiler_messages_nocache arm_v8_2a_bf16_neon_ok object {
+            #include <arm_neon.h>
+            #if !defined (__ARM_FEATURE_BF16_VECTOR_ARITHMETIC)
+            #error "__ARM_FEATURE_BF16_VECTOR_ARITHMETIC not defined"
+            #endif
+        } "$flags -march=armv8.2-a+bf16"] } {
+            set et_arm_v8_2a_bf16_neon_flags "$flags -march=armv8.2-a+bf16"
+            return 1
+        }
+    }
+
+    return 0;
+}
+
+proc check_effective_target_arm_v8_2a_bf16_neon_ok { } {
+    return [check_cached_effective_target arm_v8_2a_bf16_neon_ok \
+                check_effective_target_arm_v8_2a_bf16_neon_ok_nocache]
+}
+
+proc add_options_for_arm_v8_2a_bf16_neon { flags } {
+    if { ! [check_effective_target_arm_v8_2a_bf16_neon_ok] } {
+        return "$flags"
+    }
+    global et_arm_v8_2a_bf16_neon_flags
+    return "$flags $et_arm_v8_2a_bf16_neon_flags"
+}
+
 # Return 1 if the target supports executing ARMv8 NEON instructions, 0
 # otherwise.
 

Reply via email to