From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
Andi Kleen <ak@muc.de>, Chuck Ebbert <cebbert@redhat.com>,
Christoph Hellwig <hch@infradead.org>,
Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [patch 5/8] Immediate Values - x86 Optimization (update)
Date: Tue, 13 Nov 2007 17:02:27 -0500 [thread overview]
Message-ID: <20071113220227.GB9057@Krystal> (raw)
In-Reply-To: <473A166E.3070708@zytor.com>
* H. Peter Anvin (hpa@zytor.com) wrote:
> Mathieu Desnoyers wrote:
>> * H. Peter Anvin (hpa@zytor.com) wrote:
>>> Mathieu Desnoyers wrote:
>>>> * H. Peter Anvin (hpa@zytor.com) wrote:
>>>>> Mathieu Desnoyers wrote:
>>>>>>> - Use "=g" constraint for char immediate value inline assembly.
>>>>>>>
>>>>>>> "=g" is the same as "=rmi" which is inherently bogus. In your actual
>>>>>>> code you use "=r", the correct constraint is "=q".
>>>>>> q
>>>>>> Any register accessible as rl. In 32-bit mode, a, b, c, and d; in
>>>>>> 64-bit mode, any integer register. I am worried that "=q" might
>>>>>> exclude the si and di registers in 32-bit mode.
>>>>>> What exactly is wrong with "=r" ?
>>>>> For "char" (8-bit) values, sp/bp/si/di are illegal in 32-bit mode.
>>>>>
>>>>> Hence "=q".
>>>>>
>>>> Ah! yep, I see, so we say:
>>>> 1 byte : "=q"
>>>> 2 bytes : "=r"
>>>> 4 bytes : "=r"
>>>> 8 bytes : "=r"
>>>> ? (si and di appear to be legal for 2 and 4 bytes in 32-bit mode)
>>> That's right.
>>>
>>> -hpa
>
> Something else to watch out for... in 64-bit mode the lengths most of these
> will depend on which register is used, since whether or not a REX prefix is
> needed will vary.
>
> As far as I can tell, you're assuming fixed length instructions, which is
> wrong unless you manually constrain yourself to only legacy registers.
>
This is what I was pointing out in this previous message :
http://lkml.org/lkml/2007/10/20/92
"I am still trying to figure out if we must assume that gas will produce
different length opcodes for mov instructions. The choice is:
- Either I use a "r" constraint and let gcc produce the instructions,
that I need to assume to have correct size so I can align their
immediate values (therefore, taking the offset from the end of the
instruction will not help). Here, if gas changes its behavior
dramatically for a given immediate value size, it will break.
- Second choice is to stick to a particular register, choosing the one
with the less side-effect, and encoding the instruction ourselves. I
start to think that this second solution might be safer, even though
we wouldn't let the compiler select the register which has the less
impact by itself."
Andi seemed to trust gas stability and you answered:
"The comment was referring to x86-64, but I incorrectly remembered that
applying to "movq $imm,%reg" as opposed to loading from an absolute
address. gas actually has a special opcode (movabs) for the 64-bit
version of the latter variant, which is only available with %rax and its
subregisters.
Nevermind, in other words. It's still true, though, that the immediate
will always be the last thing in the instruction -- that's a fixture of
the instruction format."
So, in the end, is there a way to make x86_64 use a fixed-size opcode
for the 1, 2, 4 and 8 bytes load immediates or we will have to force the
use of a specific register ?
(and we can't take a pointer from the end of the instruction, because we
need to align the immediate value correctly)
Mathieu
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2007-11-13 22:02 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-13 18:58 [patch 0/8] Immediate Values (now with merged x86 support) Mathieu Desnoyers
2007-11-13 18:58 ` [patch 1/8] Immediate Values - Architecture Independent Code Mathieu Desnoyers
2007-11-13 18:58 ` [patch 2/8] Immediate Values - Kconfig menu in EMBEDDED Mathieu Desnoyers
2007-11-13 18:58 ` [patch 3/8] Immediate Values - Move Kprobes x86 restore_interrupt to kdebug.h Mathieu Desnoyers
2007-11-13 18:58 ` [patch 4/8] Add asm-compat.h to x86 Mathieu Desnoyers
2007-11-13 19:05 ` H. Peter Anvin
2007-11-13 20:37 ` [patch 4/8] Add asm-compat.h to x86 -> use new asm.h instead Mathieu Desnoyers
2007-11-13 18:58 ` [patch 5/8] Immediate Values - x86 Optimization Mathieu Desnoyers
2007-11-13 19:07 ` H. Peter Anvin
2007-11-13 19:24 ` Mathieu Desnoyers
2007-11-13 19:36 ` H. Peter Anvin
2007-11-13 19:45 ` Mathieu Desnoyers
2007-11-13 19:56 ` H. Peter Anvin
2007-11-13 20:40 ` [patch 5/8] Immediate Values - x86 Optimization (update) Mathieu Desnoyers
2007-11-13 21:26 ` H. Peter Anvin
2007-11-13 22:02 ` Mathieu Desnoyers [this message]
2007-11-13 22:35 ` H. Peter Anvin
2007-11-14 0:34 ` Mathieu Desnoyers
2007-11-14 1:02 ` H. Peter Anvin
2007-11-14 1:44 ` [patch 5/8] Immediate Values - x86 Optimization (update 2) Mathieu Desnoyers
2007-11-14 2:58 ` H. Peter Anvin
2007-11-14 14:16 ` Mathieu Desnoyers
2007-11-14 18:52 ` [PATCH] Immediate Values x86 Optimization Declare Discarded Instruction Mathieu Desnoyers
2007-11-14 19:00 ` H. Peter Anvin
2007-11-14 19:16 ` [PATCH] Add __discard section to x86 Mathieu Desnoyers
2007-11-14 19:33 ` H. Peter Anvin
2007-11-15 3:08 ` [patch 5/8] Immediate Values - x86 Optimization Rusty Russell
2007-11-15 4:06 ` Mathieu Desnoyers
2007-11-15 4:45 ` Rusty Russell
2007-11-15 5:37 ` Mathieu Desnoyers
2007-11-15 11:06 ` Rusty Russell
2007-11-16 14:03 ` [patch 5/8] Immediate Values - x86 Optimization (simplified) Mathieu Desnoyers
2007-11-18 23:11 ` Rusty Russell
2007-11-19 14:28 ` Mathieu Desnoyers
2007-11-19 23:06 ` Rusty Russell
2007-11-20 17:02 ` Mathieu Desnoyers
2007-11-19 19:15 ` Mathieu Desnoyers
2007-11-13 18:58 ` [patch 6/8] Immediate Values - Powerpc Optimization Mathieu Desnoyers
2007-11-13 18:58 ` [patch 7/8] Immediate Values - Documentation Mathieu Desnoyers
2007-11-13 18:58 ` [patch 8/8] Scheduler Profiling - Use Immediate Values Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071113220227.GB9057@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=ak@muc.de \
--cc=akpm@linux-foundation.org \
--cc=cebbert@redhat.com \
--cc=hch@infradead.org \
--cc=hpa@zytor.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox