arm64/fpsimdmacros: Allow the macro "for" to be used in more cases
authorJulien Grall <julien.grall@arm.com>
Fri, 28 Aug 2020 18:11:50 +0000 (19:11 +0100)
committerWill Deacon <will@kernel.org>
Mon, 21 Sep 2020 17:06:33 +0000 (18:06 +0100)
The current version of the macro "for" is not able to work when the
counter is used to generate registers using mnemonics. This is because
gas is not able to evaluate the expression generated if used in
register's name (i.e x\n).

Gas offers a way to evaluate macro arguments by using % in front of
them under the alternate macro mode.

The implementation of "for" is updated to use the alternate macro mode
and %, so we can use the macro in more cases. As the alternate macro
mode may have side-effects, this is disabled when expanding the body.

While it is enough to prefix the argument of the macro "__for_body"
with %, the arguments of "__for" are also prefixed to get a more
bearable value in case of compilation error.

Suggested-by: Dave Martin <dave.martin@arm.com>
Signed-off-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Dave Martin <Dave.Martin@arm.com>
Link: https://lore.kernel.org/r/20200828181155.17745-4-broonie@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/fpsimdmacros.h

index 60e29a3e41c513acae29c68c4ea3fba68c50cb36..feef5b371fba66b9ea0498ffa38a838e6b9503f5 100644 (file)
 
 .macro __for from:req, to:req
        .if (\from) == (\to)
-               _for__body \from
+               _for__body %\from
        .else
-               __for \from, (\from) + ((\to) - (\from)) / 2
-               __for (\from) + ((\to) - (\from)) / 2 + 1, \to
+               __for %\from, %((\from) + ((\to) - (\from)) / 2)
+               __for %((\from) + ((\to) - (\from)) / 2 + 1), %\to
        .endif
 .endm
 
 .macro _for var:req, from:req, to:req, insn:vararg
        .macro _for__body \var:req
+               .noaltmacro
                \insn
+               .altmacro
        .endm
 
+       .altmacro
        __for \from, \to
+       .noaltmacro
 
        .purgem _for__body
 .endm