> On Oct 15, 2015, at 4:16 PM, Szabolcs Nagy wrote: > > * Rich Felker [2015-10-15 18:44:25 -0400]: >> On Fri, Oct 16, 2015 at 12:33:20AM +0200, Szabolcs Nagy wrote: >>> it is not possible to write arm asm in a way that pleases all >>> assemblers, here is a summary of the problems relevant to musl: >>> >>> some instructions can be written in several ways since UAL >>> (= unified assembler language) was introduced to unify arm >>> and thumb instruction mnemonics. >>> >>> in case of armhf VFP instructions musl uses the following ones >>> in hand written asm: >>> >>> hex ual old >>> >>> eeb1XacX vsqrt.f32 fsqrts >>> eeb1XbcX vsqrt.f64 fsqrtd >>> eeb0XacX vabs.f64 fabss >>> eeb0XbcX vabs.f64 fabsd >>> eef1Xa10 vmrs fpscr mrc p10,7,.. >>> eee1Xa10 vmsr fpscr mcr p10,7,.. > > sorry, for reading/writing fpscr fmrx/fmxr can be used in the > old syntax instead of vmrs/vmsr, but clang does not know > those names. > >>> the issues: >>> >>> (1) binutils gas rejects UAL VFP instructions unless either >>> the -mfpu= option is passed or the asm source >>> has '.fpu ' directive, the old names work though >>> (if the target is hard float). A gcc toolchain built >>> --with-float=hard but without --with-fpu= does not >>> pass -mfpu to the assembler. >>> >>> (2) Most UAL mnemonics were added in binutils 2.18, older >>> binutils only supports the old syntax. Some UAL mnemonics were >>> added later, vmrs and vmsr only appear in binutils 2.21 >>> (released in 2010). >>> >>> (3) The clang assembler does not support old mnemonics in general >>> but includes a few exceptions (e.g. fabs and fsqrt are supported, >>> but not the mrc or mcr coprocessor instructions). >>> >>> Using UAL asm is the clean solution, but then to fix (1) we >>> should have .fpu directives in the asm files. >>> >>> However the conflict between (2) and (3) means that fenv code >>> using vmrs and vmsr either drops support for old binutils gas >>> or the clang assembler. >> >> It seems we're already using the new forms vsqrt and vabs in >> src/math/armhf/*.s. So using vmrs/vmsr presumably will not break >> support for any toolchains that work now. >> > > vmrs/vmsr can break on old binutils versions (2.18 - 2.20) and > 2.20 is not that ancient.. is that ok? > >> I think the reason this went unnoticed for so long is that Aboriginal >> Linux (the only real user of the ancient binutils, due to GPL v2 vs v3 >> issues) does not use the armhf ABI at all; it only targets standard >> EABI for which musl does not use any math/fenv asm. >> >> So I'm ok with the fpu-related changes proposed, but I'm not sure what >> to do about UAL issues elsewhere. Right now we have a lot of files >> with instructions written as .word in them which is a mess and which >> precludes Cortex-M (thumb2-only) targets. These are files which need >> to be built even on non-hf, so changing them presumably will break >> support for old binutils. As a workaround, users needing old binutils >> could perhaps misuse the ASM_CMD var in the Makefile to run a sed >> script that replaces UAL with old-syntax asm. Or someone could patch >> the old binutils to accept UAL... >> > > most likely ual is the long term solution. thats right. > > maybe it is best to switch to ual and then write that script > if ppl with old binutils run into issues. agree here.