[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86/time: fix scale_delta() inline assembly

>>> On 26.11.12 at 17:31, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
> On Mon, 2012-11-26 at 15:23 +0000, Jan Beulich wrote:
>> The way it was coded, it clobbered %rdx without telling the compiler.
>> This generally didn't cause any problems except when there are two back
>> to back invocations (as in plt_overflow()), as in that case the
>> compiler may validly assume that it can re-use for the second instance
>> the value loaded into %rdx before the first one.
>> Once at it, also properly relax the second operand of "mul" (there's no
>> need for it to be in %rdx, or a register at all), and switch away from
>> using explicit register names in the instruction operands.
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>> --- a/xen/arch/x86/time.c
>> +++ b/xen/arch/x86/time.c
>> @@ -127,8 +127,9 @@ static inline u64 scale_delta(u64 delta,
>>          delta <<= scale->shift;
>>      asm (
>> -        "mul %%rdx ; shrd $32,%%rdx,%%rax"
>> -        : "=a" (product) : "0" (delta), "d" ((u64)scale->mul_frac) );
>> +        "mul %2 ; shrd $32,%1,%0"
>> +        : "=a" (product), "=d" (delta)
>> +        : "rm" (delta), "0" ((u64)scale->mul_frac) );
> OOI is there a reason to favour an output constraint overwriting delta,
> which is then thrown away, over a straightforward clobber of rdx?

Yes - with a clobber of %rdx the compiler can't pass "delta" in that

> It took me ages to figure out that you had swapped which of the two
> inputs to the multiply was in rax (I was very confused until I spotted
> that!).

Sorry. The resulting code was better (and less different from the
prior version) with the operands swapped.

> It's also a bit confusing to use %1 and %0 with the shrd since you
> aren't actually using the things specified by the constraints but rather
> the outputs of the mul which happen to (now) be in those registers, I'd
> argue that the previous use of the explicit names was more correctly
> describing what was going on. As it is I was wondering how
>         shrd $32,delta,product
> could possibly make sense.

That's how things are with multi-insn asm-s (and even with single-
insn ones when an output different from an input get tied together
through using the same register). I continue to think that using the
numbered forms here is better.

> Since delta is the first argument to the containing function would it be
> helpful to put that in rax, where it already is due to the calling
> convention? I suppose any difference is overwhelmed by the multiply
> anyway.

The first argument of a "real" function would be in %rdi. This being
an inline function, there's no calling convention anyway.


Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.