Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp4019220ybv; Tue, 25 Feb 2020 11:34:26 -0800 (PST) X-Google-Smtp-Source: APXvYqxRg3Tk5udC42eBRmDcEPmwyoC0/IahbmegG2UaWzCbxHjX7GmGtBHvJDqI4MfiFZ+7F8Ge X-Received: by 2002:aca:db41:: with SMTP id s62mr363751oig.87.1582659265987; Tue, 25 Feb 2020 11:34:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582659265; cv=none; d=google.com; s=arc-20160816; b=X8OPGZGKRFXjyAbO98b4slQt61UVBpR9rsFfy1JcshMiW8IG2joMoRna6j0c75l9NK 0Sh9k66+9ja6UmnLNLpcKtDvPjW9cmv7CckuMbIDki3pKIbKG+K1ZQ/27La5zDZWOl2o tgmCIOW0AAFGqSK4EfI++sNVBvgUQ59kndeinKS3y9c8GtvdWXf/f8YhJZrAbevtnb8R wb6G0KByTKiNbu03zxS4nnJMcnZ+jX0SDVen/ebeSIJ4Og1dEwnk01POPq8RpA0hg7Fm EL0fG3iMJbOqLxJq5h+iUcFqJo4M6ONDKu9+XJcZHb4FdRaoM2BqTc9jnICYhfRMnOFJ PUEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=bY/V/GmjTMwSsbRxOp3cbtrLAwvSrthIWK239p8DTzE=; b=HWd57+3eXAtcXxCfaQVcXPxkImPNL6gLEEKyAAEFQdmjVuQ/qc2K2W9qFKH6k/jzei hohepbdweI1MVJZyqSuoiAHmhyTQKjxukq3igQC6bBLOdvZdn0EFoV4MycwEucTS+CTw 25nShibgaWZsrKkStUMYXo0r1KzFhosWiWXuyoPOf/SzNuUUgDO1vk4l/BwW7DM+HXb0 CtFyaSGL0j0CbXdA5IsnoZtBE+F3YVkXZx9Mn5aFhk1z+VXclOTr48KCE/Ot2r/QzW3m FfPovgmcjnofwmvmzdEbXefGjghjZSNwYdROtYf+SxgkZhfIcR2TifAfvwawsNfDhUNn Z6Kg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Aglq1138; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l140si86104oib.114.2020.02.25.11.34.14; Tue, 25 Feb 2020 11:34:25 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=Aglq1138; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731682AbgBYTKg (ORCPT + 99 others); Tue, 25 Feb 2020 14:10:36 -0500 Received: from mail-pj1-f66.google.com ([209.85.216.66]:52389 "EHLO mail-pj1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728065AbgBYTKd (ORCPT ); Tue, 25 Feb 2020 14:10:33 -0500 Received: by mail-pj1-f66.google.com with SMTP id ep11so117917pjb.2 for ; Tue, 25 Feb 2020 11:10:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=bY/V/GmjTMwSsbRxOp3cbtrLAwvSrthIWK239p8DTzE=; b=Aglq1138iS0WwGsnGj4iO2plS1JbUrLovS1ZRixzAwJERIoNzyYnl5R4Vo+KIBeiDV HhE6mxbJGYUuVrRfAh76ZfgRg6d6ZMlS19jH6oKNbTYvByroJBD33ZXJBwsMIzDGfsqR xnBwbORa/szJwZza3OHTWSQf0vnuKJITm5h3kzjAVTh1ijd7GFtpYjQG/XSVEHk+03hZ KBN0Ia0+s1aLmFibRSOpyAT2KYvn85gF5uunWXCykkhYZGMcpemyRFgnlo4euw5sUjQN TpoMHx5u/F3l7Gt9MgRaAZm1US7hI805gqNJBL6eFvYpcLCjYMyIq4qgOFloYQTD2RcF zXHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=bY/V/GmjTMwSsbRxOp3cbtrLAwvSrthIWK239p8DTzE=; b=fY2SddBs7V989A4qvtrSgo3OsErLbDBpph6g/loDA4V0gToEvn4hjU9OiDUHyS/xGd 3/g4FDwITunrgJQes6cfdDAJHQA+R/3UIi9IqMSgkS9eHKf9kP8qwxpyU0uA/e/uW2ta Isn0zFqvGZfCv/ToE1QsRjnw6kjyWNxgcrIaXGdI5/bNrLRCP7xEbI1nwVlBHzoOG5I6 Au1d8C+s4GAyN2JTtH8Azn4ivOV4Kyb2AOUMlC5MwdEpqJIqnxSyq1dUAwVJq1caVrBe LIPxvtgMTUyxUYss0NkOIa5iFZrG02+l/Y02jlDfD8OFleLyyOklyeQ1m2n8DPXvS1cG Yx8g== X-Gm-Message-State: APjAAAX7I7BnKGjmX0yLf3CatuO1fNCEgaLLDQEgzD4N+cK1ILGqik4E 6oyOl9rvctMjT2taMYG0GbQalkkK0RW1xP4bulbCpQ== X-Received: by 2002:a17:902:6948:: with SMTP id k8mr55585012plt.223.1582657832765; Tue, 25 Feb 2020 11:10:32 -0800 (PST) MIME-Version: 1.0 References: <8bb16ac4b15a7e28a8e819ef9aae20bfc3f75fbc.1582266841.git.stefan@agner.ch> In-Reply-To: <8bb16ac4b15a7e28a8e819ef9aae20bfc3f75fbc.1582266841.git.stefan@agner.ch> From: Nick Desaulniers Date: Tue, 25 Feb 2020 11:10:21 -0800 Message-ID: Subject: Re: [PATCH] ARM: use assembly mnemonics for VFP register access To: Stefan Agner Cc: Russell King , Arnd Bergmann , Manoj Gupta , Jian Cai , Linux ARM , LKML , clang-built-linux Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Feb 24, 2020 at 9:22 PM Stefan Agner wrote: > > Clang's integrated assembler does not allow to to use the mcr > instruction to access floating point co-processor registers: > arch/arm/vfp/vfpmodule.c:342:2: error: invalid operand for instruction > fmxr(FPEXC, fpexc & ~(FPEXC_EX|FPEXC_DEX|FPEXC_FP2V|FPEXC_VV|FPEX= C_TRAP_MASK)); > ^ > arch/arm/vfp/vfpinstr.h:79:6: note: expanded from macro 'fmxr' > asm("mcr p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmxr " #_vfp_ = ", %0" \ > ^ > :1:6: note: instantiated into assembly here > mcr p10, 7, r0, cr8, cr0, 0 @ fmxr FPEXC, r0 > ^ > > The GNU assembler supports the .fpu directive at least since 2.17 (when > documentation has been added). Since Linux requires binutils 2.21 it is > safe to use .fpu directive. Use the .fpu directive and mnemonics for VFP > register access. > > This allows to build vfpmodule.c with Clang and its integrated assembler. > > Link: https://github.com/ClangBuiltLinux/linux/issues/905 > Signed-off-by: Stefan Agner > --- > arch/arm/vfp/vfpinstr.h | 12 ++++-------- > 1 file changed, 4 insertions(+), 8 deletions(-) > > diff --git a/arch/arm/vfp/vfpinstr.h b/arch/arm/vfp/vfpinstr.h > index 38dc154e39ff..799ccf065406 100644 > --- a/arch/arm/vfp/vfpinstr.h > +++ b/arch/arm/vfp/vfpinstr.h > @@ -62,21 +62,17 @@ > #define FPSCR_C (1 << 29) > #define FPSCR_V (1 << 28) > > -/* > - * Since we aren't building with -mfpu=3Dvfp, we need to code > - * these instructions using their MRC/MCR equivalents. > - */ > -#define vfpreg(_vfp_) #_vfp_ > - > #define fmrx(_vfp_) ({ \ > u32 __v; \ > - asm("mrc p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmrx %0, " #_v= fp_ \ > + asm(".fpu vfpv2\n" \ > + "vmrs %0, " #_vfp_ \ > : "=3Dr" (__v) : : "cc"); \ > __v; \ > }) > > #define fmxr(_vfp_,_var_) \ > - asm("mcr p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmxr " #_vfp_ = ", %0" \ > + asm(".fpu vfpv2\n" \ > + "vmsr " #_vfp_ ", %0" \ > : : "r" (_var_) : "cc") > > u32 vfp_single_cpdo(u32 inst, u32 fpscr); > -- Hi Stefan, Thanks for the patch. Reading through: - FMRX, FMXR, and FMSTAT: http://infocenter.arm.com/help/index.jsp?topic=3D/com.arm.doc.dui0068b/Bcfb= dihi.html - VMRS and VMSR: http://infocenter.arm.com/help/index.jsp?topic=3D/com.arm.doc.dui0204h/Bcfb= dihi.html Should a macro called `fmrx` that had a comment about `fmrx` be using `vmrs` in place of `fmrx`? It looks like Clang treats them the same, but GCC keeps them separate: https://godbolt.org/z/YKmSAs Ah, this is only when streaming to assembly. Looks like they have the same encoding, and produce the same disassembly. (Godbolt emits assembly by default, and has the option to compile, then disassemble). If I take my case from godbolt above: =E2=9E=9C /tmp arm-linux-gnueabihf-gcc -O2 -c x.c =E2=9E=9C /tmp llvm-objdump -dr x.o x.o: file format elf32-arm-little Disassembly of section .text: 00000000 bar: 0: f1 ee 10 0a vmrs r0, fpscr 4: 70 47 bx lr 6: 00 bf nop 00000008 baz: 8: f1 ee 10 0a vmrs r0, fpscr c: 70 47 bx lr e: 00 bf nop So indeed a similar encoding exists for the two different assembler instructions. Reviewed-by: Nick Desaulniers --=20 Thanks, ~Nick Desaulniers