Hi Richard,

Richard Sandiford <richard.sandif...@arm.com> wrote:

Iain Sandoe <i...@sandoe.co.uk> writes:

The armv8_arm manual [C6.2.226, ROR (immediate)] uses a # in front
of the immediate rotation quantity.

Although, it seems, GAS is able to infer the # (or is leninent about
its absence) assemblers based on the LLVM back end expect it and error out.

tested on aarch64-linux-gnu (gcc115) and aarch64-darwin20 (experimental)

Sorry for the slow reply, didn't see this till now.

Hmm .. I did CC you directly ( but having some troubles with this ISP which I am
trying to resolve - emails going missing or have to be re-sent …  :/ )

The patch is OK in principle, and personally I prefer “#”.  But how far
does this spread?  Are only ROR modifiers on logical patterns affected?
Or is the use of a paranthesised expression instead of a literal the thing
that makes the difference?

perhaps,

Unfortunately, I have only a cause and effect mechanism to check this (i.e.
problems that prevent bootstrap or ones I’ve triaged in the testsuite fails).

For X86 and PPC I have a more direct way of invoking the LLVM backend (not had
time to extend that to aarch64 yet).

.. but via XCode (which is what 99.99% of macOS folks will use as their ‘binutils’) it’s done by “as” ==> "clang -cc1as” (effectively an assembler with preprocessing). This issue certainly fires there - and I’d have no reason to think that the preprocessor would make any material difference, so it’s likely that the LLVM backend is not set up to
deduce that the value is a constant and infer the ‘#’.

GCC is generally quite lax at including “#”, so I'd expect more fallout than this.

This is one of three issues (that are not directly related to mach-o format or relocation syntax) that I’ve encountered in my experimental port that happen to trigger in bootstrap.

(the others are a format specifier type naming clash and one related to Darwin having
 signed chars by default - so this is the only asm syntax one remaining - Alex 
fixed the
 other fails earlier in the year).

Of course, it’s possible that there are other cases in the testsuite fallout that i’ve not yet
examined - there’s quite a lot still to triage :(.

Once upon a time there were some tests (at least for PPC and X86) that essentially were a single file containing all the insns - so that could be thrown at an assembler and would be expected to complete without error - but I don’t know if there’s an
equivalent for aarch64.

cheers
Iain

* I suppose someone could grep ‘#’ in the armv8_arm and c.f. cases against aarch64.md (I dare not volunteer, at present, since I’m already way overcomitted with non-$dayjob).


Thanks,
Richard

OK for master?
thanks
Iain

gcc/ChangeLog:

        * config/aarch64/aarch64.md (<optab>_rol<mode>3): Add a '#'
        mark in front of the immediate quantity.
        (<optab>_rolsi3_uxtw): Likewise.
---
gcc/config/aarch64/aarch64.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 45d9c6ac45a..e0de82c938a 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -4416,7 +4416,7 @@
                      (match_operand:QI 2 "aarch64_shift_imm_<mode>" "n"))
                     (match_operand:GPI 3 "register_operand" "r")))]
 ""
-  "<logical>\\t%<w>0, %<w>3, %<w>1, ror (<sizen> - %2)"
+  "<logical>\\t%<w>0, %<w>3, %<w>1, ror #(<sizen> - %2)"
 [(set_attr "type" "logic_shift_imm")]
)

@@ -4441,7 +4441,7 @@
                      (match_operand:QI 2 "aarch64_shift_imm_si" "n"))
                     (match_operand:SI 3 "register_operand" "r"))))]
 ""
-  "<logical>\\t%w0, %w3, %w1, ror (32 - %2)"
+  "<logical>\\t%w0, %w3, %w1, ror #(32 - %2)"
 [(set_attr "type" "logic_shift_imm")]
)


Reply via email to