Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Thu, 15 Oct 2015 23:42:56 -0700
From: Khem Raj <>
Subject: Re: status of armhf asm with VFP instructions

> 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=<vfp variant> option is passed or the asm source
>>> has '.fpu <vfp variant>' directive, the old names work though
>>> (if the target is hard float).  A gcc toolchain built
>>> --with-float=hard but without --with-fpu=<vfp variant> 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.

Download attachment "signature.asc" of type "application/pgp-signature" (205 bytes)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.