Date: Thu, 13 Dec 2001 11:27:56 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Bruce Evans <bde@zeta.org.au> Cc: current@FreeBSD.org Subject: Re: Patch Review: i386 asm cleanups in the kernel Message-ID: <XFMail.011213112756.jhb@FreeBSD.org> In-Reply-To: <20011213215212.O277-100000@gamplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 13-Dec-01 Bruce Evans wrote:
>> --- i386/i386/identcpu.c 30 Nov 2001 11:57:23 -0000 1.96
>> +++ i386/i386/identcpu.c 6 Dec 2001 07:58:25 -0000
>> @@ -115,10 +115,11 @@
>> static void
>> do_cpuid(u_int ax, u_int *p)
>> {
>> +
>> + p[0] = ax;
>> __asm __volatile(
>> "cpuid"
>> - : "=a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3])
>> - : "0" (ax)
>> + : "+a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3])
>> );
>> }
>>
>
> "0" here was bogus. Just replace it by "a".
So use "a" twice and gcc will get that right?
>> - : "=a" (low), "=d" (high) \
>> - : "0" (low), "1" (high) \
>> - : "cx", "bx")
>> + : "+a" (low), "+d" (high) \
>> + : : "ecx", "ebx")
>
> Weren't the register names in the clobber list the normal ones?
I was just being pedantic since we aren't just clobbering the low words of the
registers.
>> @@ -938,7 +935,7 @@
>> "movl 4(%0),%%eax ; adcl %%eax,4(%0)\n\t"
>> "movl 8(%0),%%eax ; adcl %%eax,8(%0)\n\t"
>> "movl 12(%0),%%eax ; adcl %%eax,12(%0)"
>> - ::"r" (c):"ax");
>> + : :"r" (c):"eax", "memory");
>> }
>>
>> static void
>
> This should use output operands c[0]..c[3], not a general "memory" clobber.
Ok.
>> [... more suboptimal "memory" clobbers]
I changed the simple ones, but not the harder ones. (gcc doesn't like having
more than 10 operands, even if they are memory or immediates)
> I wouldn't trust all the little changes to math_emulate.c without runtime
> testing. It won't be tested by using it in normal operation.
Ok. I won't commit it until it is tested.
>> Index: i386/include/bus_pc98.h
>> ===================================================================
>> RCS file: /usr/cvs/src/sys/i386/include/bus_pc98.h,v
>> retrieving revision 1.19
>> diff -u -r1.19 bus_pc98.h
>> --- i386/include/bus_pc98.h 7 Oct 2001 10:04:18 -0000 1.19
>> +++ i386/include/bus_pc98.h 7 Dec 2001 19:10:37 -0000
>> @@ -203,11 +203,10 @@
>> \
>> __asm __volatile("call *%2" \
>> :"=a" (result), \
>> - "=d" (offset) \
>> + "+d" (offset) \
>> :"o" (bsh->bsh_bam.bs_read_##BWN), \
>> - "b" (bsh), \
>> - "1" (offset) \
>> - ); \
>> + "b" (bsh) \
>> + :"ecx","memory"); \
>> \
>> return result; \
>> }
>
> It's surprising that the missing "ecx" in lots of clobber lists in this
> file didn't cause problems.
It depends on what the functions do. If they are written in asm, they might be
preserving temporary registers rather than trashing them. I was just changing
the clobbers to assume that only call-safe registers were preserved.
>> - __asm __volatile("bsfl %0,%0" : "=r" (result) : "0" (mask));
>> + __asm __volatile("bsfl %0,%0" : "+r" (result));
>> return (result);
>> }
>
> "0" here was bogus, except we abuse the same operand for input and output.
> I checked that gcc does the right thing (reuse the input register for
> output if the input operand becomes dead) with a non-hand-optimized version:
>
> __asm __volatile("bsfl %1,%0" : "=r" (result) : "r" (mask));
> ...
> main() { return bsfl(23); }
>
> "rm" (mask) works too.
Ok, that's simpler then.
> The other changes seem to be OK. I checked about 1/4 of them.
Ok, well, I've updated the patch at the same location.
> Bruce
--
John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!" - http://www.FreeBSD.org/
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.011213112756.jhb>
