From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by sourceware.org (Postfix) with ESMTP id CC71E3857802 for ; Mon, 5 Oct 2020 12:54:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CC71E3857802 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=kernel.crashing.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=segher@kernel.crashing.org Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id 095CrUso021794; Mon, 5 Oct 2020 07:53:30 -0500 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id 095CrT3X021791; Mon, 5 Oct 2020 07:53:29 -0500 X-Authentication-Warning: gate.crashing.org: segher set sender to segher@kernel.crashing.org using -f Date: Mon, 5 Oct 2020 07:53:28 -0500 From: Segher Boessenkool To: Harald van Dijk Cc: gcc-help@gcc.gnu.org Subject: Re: Inline assembly and value extensions Message-ID: <20201005125328.GA2672@gate.crashing.org> References: <8985cc81-573c-b011-4e02-aa9829524133@gigawatt.nl> <3c338ceb-1dfa-5c15-8295-5b5a7dd4bad7@gigawatt.nl> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3c338ceb-1dfa-5c15-8295-5b5a7dd4bad7@gigawatt.nl> User-Agent: Mutt/1.4.2.3i X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, TXREP, T_SPF_HELO_PERMERROR, T_SPF_PERMERROR autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-help@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-help mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Oct 2020 12:54:32 -0000 On Sat, Oct 03, 2020 at 09:42:40PM +0100, Harald van Dijk via Gcc-help wrote: > On 22/08/2020 16:30, Harald van Dijk wrote: > >This function gets an extra "movl %eax, %eax" between the hand-written > >movl and the generated ret, which can be seen online at > >. This extra movl is there to ensure the > >high bits of %rax are zero, but the initial movl already achieves that. > >How can I inform GCC that it does not need to emit that extra movl? If your asm returns a 32-bit value, then GCC will not know what is in the top 32 bits of the 64-bit register. > >Likewise, is there an easy way to provide an inline assembly statement > >with a zero-extended pointer input? This one I am able to work around, > >as it is possible to instead of passing in a pointer value p, pass in an > >integer value (uint64_t)(uint32_t)p, but the workaround is kind of hard > >to read and I would like to avoid that if possible. You can use much less chatty names for those very basic types (like u64 and u32), that makes it more readable. Hiding what you do will not make it more readable, that is just obfuscation, so using macros is not such a good idea. Inline asm is hard enough when you can see all there is right in front of your eyes. > >I looked the documentation for either relevant inline assembly > >constraints or relevant variable / type attributes, but was unable to > >find any. The most promising search result was the mode attribute, I was > >hoping it might be possible to give result a mode(DI) attribute, but the > >compiler rejects that. Constraints just say which register (or memory addressed how, or what kind of constnt). The normal way to say something should have a certain mode is by giving it a corresponding type in C (so SImode is "int" in C, and DImode is "long long"; "long" is either, it depends on your ABI; "u64" and "u32" should always be clear ;-) ) > I have now found that forcing a different mode appears to be exactly how > the zero-extension of arguments and return values is implemented: that > is what ix86_promote_function_mode does. > > The fact that this is not an option through variable attributes or > inline assembly constraints looks like an unfortunate limitation of the > inline assembly functionality, there is currently just no way to do what > I am after. I very much hope to be proved wrong, but will try to just > pick a workaround that does not look too bad. > > >Is there another approach that I can use instead? You use a 64-bit expression (or preferably even a 64-bit variable). The same is true for outputs from the asm. One way of making the code easier to read is to actually use 64-bit variables for all these things in the asm, and then assign them from and to the 32-bit things. int x; char *p; u64 xx = x; u64 pp = (u64)p; asm("smth %0,%1" : "+r"(pp), "+r"(xx)); p = (char *)pp; x = xx; Segher