Over the years, the undocumented operand modifier used to produce the
unprefixed constant values in __einfo_error() has varied from "%c0" to
"%a0" in commit
1a77466 ("[build] Fix use of inline assembly on GCC
4.8 ARM64 builds") and back to "%c0" in commit
3fb3ffc ("[build] Fix
use of inline assembly on GCC 8 ARM64 builds"), according to the
evolving demands of the toolchain.
LoongArch64 suffers from a similar issue: GCC 13 will allow either,
but the currently released GCC 12 allows only the "%a0" form.
Introduce a macro ASM_NO_PREFIX, defined in bits/compiler.h, to
abstract away this difference and allow different architectures to use
different operand modifiers.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
#ifndef ASSEMBLY
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
#define __asmcall
#define __libgcc
#ifndef ASSEMBLY
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
#define __asmcall
#define __libgcc
#ifndef ASSEMBLY
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
/** Declare a function with standard calling conventions */
#define __asmcall __attribute__ (( cdecl, regparm(0) ))
#ifndef ASSEMBLY
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
/** Declare a function with standard calling conventions */
#define __asmcall __attribute__ (( regparm(0) ))
".balign 8\n\t" \
"\n1:\n\t" \
".long ( 4f - 1b )\n\t" \
- ".long %c0\n\t" \
+ ".long %" ASM_NO_PREFIX "0\n\t" \
".long ( 2f - 1b )\n\t" \
".long ( 3f - 1b )\n\t" \
- ".long %c1\n\t" \
+ ".long %" ASM_NO_PREFIX "1\n\t" \
"\n2:\t.asciz \"" __einfo_desc ( einfo ) "\"\n\t" \
"\n3:\t.asciz \"" __FILE__ "\"\n\t" \
".balign 8\n\t" \