On 22/07/2024 11:07, Alex Coplan wrote:
> Hi Claudio,
> 
> I've left a couple of small comments below.
> 
> On 22/07/2024 09:30, Claudio Bantaloukas wrote:
------8<-----
>>
>> @@ -1505,6 +1513,8 @@ (define_insn_and_split "*movdi_aarch64"
>>        [w, w  ; fmov     , fp  , 4] fmov\t%d0, %d1
>>        [w, Dd ; neon_move, simd, 4] << 
>> aarch64_output_scalar_simd_mov_immediate (operands[1], DImode);
>>        [w, Dx ; neon_move, simd, 8] #
>> +     [Umv, r; mrs      , *   , 8] msr\t%0, %x1
>> +     [r, Umv; mrs      , *   , 8] mrs\t%x0, %1
> 
> I think in the case of this pattern (but not the others) the %x modifier
> isn't needed since a DImode operand satisfying "r" should get printed as
> an x register by default.

Some sleep and coffee helped! After re-reading gccint 17.5 Output 
Templates and Operand Substitution, I managed to find that

asm_fprintf (f, "%s", reg_names [REGNO (x)]);

is used for registers in aarch64_print_operand. Thank you for the heads up!

Claudio


> 
> Thanks,
> Alex
> 
>>     }
>>     "CONST_INT_P (operands[1])
>>      && REG_P (operands[0])
>> diff --git a/gcc/config/aarch64/constraints.md 
>> b/gcc/config/aarch64/constraints.md
>> index a2569cea510..0c81fb28f7e 100644
>> --- a/gcc/config/aarch64/constraints.md
>> +++ b/gcc/config/aarch64/constraints.md
>> @@ -77,6 +77,9 @@ (define_register_constraint "Upl" "PR_LO_REGS"
>>   (define_register_constraint "Uph" "PR_HI_REGS"
>>     "SVE predicate registers p8 - p15.")
>>   
>> +(define_register_constraint "Umv" "MOVEABLE_SYSREGS"
>> +  "@internal System Registers suitable for moving rather than requiring an 
>> unspec msr")
>> +
>>   (define_constraint "c"
>>    "@internal The condition code register."
>>     (match_operand 0 "cc_register"))
>> diff --git a/gcc/testsuite/gcc.target/aarch64/acle/fp8.c 
>> b/gcc/testsuite/gcc.target/aarch64/acle/fp8.c
>> index b774f28c9f0..10fd128d8f9 100644
>> --- a/gcc/testsuite/gcc.target/aarch64/acle/fp8.c
>> +++ b/gcc/testsuite/gcc.target/aarch64/acle/fp8.c
>> @@ -1,14 +1,14 @@
>>   /* Test the fp8 ACLE intrinsics family.  */
>>   /* { dg-do compile } */
>>   /* { dg-options "-O1 -march=armv8-a" } */
>> -/* { dg-final { check-function-bodies "**" "" } } */
>> +/* { dg-final { check-function-bodies "**" "" "" } } */
>>   
>>   #ifdef __ARM_FEATURE_FP8
>>   #error "__ARM_FEATURE_FP8 feature macro defined."
>>   #endif
>>   
>>   #pragma GCC push_options
>> -#pragma GCC target ("arch=armv9.4-a+fp8")
>> +#pragma GCC target("arch=armv9.4-a+fp8")
>>   
>>   #include <arm_acle.h>
>>   
>> @@ -16,4 +16,105 @@
>>   #error "__ARM_FEATURE_FP8 feature macro not defined."
>>   #endif
>>   
>> -#pragma GCC pop_options
>> +/*
>> +**test_write_fpmr_sysreg_asm_64:
>> +**  msr     fpmr, x0
>> +**  ret
>> +*/
>> +void
>> +test_write_fpmr_sysreg_asm_64 (uint64_t val)
>> +{
>> +  register uint64_t fpmr asm ("fpmr") = val;
>> +  asm volatile ("" ::"Umv"(fpmr));
>> +}
>> +
>> +/*
>> +**test_write_fpmr_sysreg_asm_32:
>> +**  uxtw    x0, w0
>> +**  msr     fpmr, x0
>> +**  ret
>> +*/
>> +void
>> +test_write_fpmr_sysreg_asm_32 (uint32_t val)
>> +{
>> +  register uint64_t fpmr asm ("fpmr") = val;
>> +  asm volatile ("" ::"Umv"(fpmr));
>> +}
>> +
>> +/*
>> +**test_write_fpmr_sysreg_asm_16:
>> +**  and     x0, x0, 65535
>> +**  msr     fpmr, x0
>> +**  ret
>> +*/
>> +void
>> +test_write_fpmr_sysreg_asm_16 (uint16_t val)
>> +{
>> +  register uint64_t fpmr asm ("fpmr") = val;
>> +  asm volatile ("" ::"Umv"(fpmr));
>> +}
>> +
>> +/*
>> +**test_write_fpmr_sysreg_asm_8:
>> +**  and     x0, x0, 255
>> +**  msr     fpmr, x0
>> +**  ret
>> +*/
>> +void
>> +test_write_fpmr_sysreg_asm_8 (uint8_t val)
>> +{
>> +  register uint64_t fpmr asm ("fpmr") = val;
>> +  asm volatile ("" ::"Umv"(fpmr));
>> +}
>> +
>> +/*
>> +**test_read_fpmr_sysreg_asm_64:
>> +**  mrs     x0, fpmr
>> +**  ret
>> +*/
>> +uint64_t
>> +test_read_fpmr_sysreg_asm_64 ()
>> +{
>> +  register uint64_t fpmr asm ("fpmr");
>> +  asm volatile ("" : "=Umv"(fpmr) :);
>> +  return fpmr;
>> +}
>> +
>> +/*
>> +**test_read_fpmr_sysreg_asm_32:
>> +**  mrs     x0, fpmr
>> +**  ret
>> +*/
>> +uint32_t
>> +test_read_fpmr_sysreg_asm_32 ()
>> +{
>> +  register uint32_t fpmr asm ("fpmr");
>> +  asm volatile ("" : "=Umv"(fpmr) :);
>> +  return fpmr;
>> +}
>> +
>> +/*
>> +**test_read_fpmr_sysreg_asm_16:
>> +**  mrs     x0, fpmr
>> +**  ret
>> +*/
>> +uint16_t
>> +test_read_fpmr_sysreg_asm_16 ()
>> +{
>> +  register uint16_t fpmr asm ("fpmr");
>> +  asm volatile ("" : "=Umv"(fpmr) :);
>> +  return fpmr;
>> +}
>> +
>> +/*
>> +**test_read_fpmr_sysreg_asm_8:
>> +**  mrs     x0, fpmr
>> +**  ret
>> +*/
>> +uint8_t
>> +test_read_fpmr_sysreg_asm_8 ()
>> +{
>> +  register uint8_t fpmr asm ("fpmr");
>> +  asm volatile ("" : "=Umv"(fpmr) :);
>> +  return fpmr;
>> +}
> 

Reply via email to