Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Dec 2001 22:32:20 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        <current@FreeBSD.org>
Subject:   Re: Patch Review: i386 asm cleanups in the kernel
Message-ID:  <20011213215212.O277-100000@gamplex.bde.org>
In-Reply-To: <XFMail.011211150216.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 11 Dec 2001, John Baldwin wrote:

> Ok, I've axed all the "cc" clobbers from the patch now.  Any objections to it
> now?  It's still at ~jhb/patches/i386_asm.patch.

Review of what I can see: the URL still appears to be well formed ;-).  But
it didn't seem to work, so I scp'ed the file.

> Index: i386/i386/identcpu.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/i386/i386/identcpu.c,v
> retrieving revision 1.96
> diff -u -r1.96 identcpu.c
> --- 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".

> Index: i386/i386/math_emulate.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/i386/i386/math_emulate.c,v
> retrieving revision 1.40
> diff -u -r1.40 math_emulate.c
> --- i386/i386/math_emulate.c	28 Nov 2001 01:42:16 -0000	1.40
> +++ i386/i386/math_emulate.c	7 Dec 2001 19:07:16 -0000
> ...
> @@ -771,14 +770,13 @@
>  		"addl %0,%0 ; adcl %1,%1\n\t"				\
>  		"addl %0,%0 ; adcl %1,%1\n\t"				\
>  		"addl %%ecx,%0 ; adcl %%ebx,%1"				\
> -		: "=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?

> @@ -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.

> [... more suboptimal "memory" clobbers]

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.

> 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.
> Index: i386/include/cpufunc.h
> ===================================================================
> RCS file: /usr/cvs/src/sys/i386/include/cpufunc.h,v
> retrieving revision 1.105
> diff -u -r1.105 cpufunc.h
> --- i386/include/cpufunc.h	28 Jun 2001 02:08:13 -0000	1.105
> +++ i386/include/cpufunc.h	7 Dec 2001 19:11:47 -0000
> @@ -66,18 +66,18 @@
>  static __inline u_int
>  bsfl(u_int mask)
>  {
> -	u_int	result;
> +	u_int	result = mask;

Style bug: initialization in declaration.

>
> -	__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.

>
>  static __inline u_int
>  bsrl(u_int mask)
>  {
> -	u_int	result;
> +	u_int	result = mask;
>
> -	__asm __volatile("bsrl %0,%0" : "=r" (result) : "0" (mask));
> +	__asm __volatile("bsrl %0,%0" : "+r" (result));
>  	return (result);
>  }

Similarly.

The other changes seem to be OK.  I checked about 1/4 of them.

Bruce


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?20011213215212.O277-100000>