From owner-freebsd-current Wed Nov 29 22: 8:47 2000 Delivered-To: freebsd-current@freebsd.org Received: from mailman.zeta.org.au (mailman.zeta.org.au [203.26.10.16]) by hub.freebsd.org (Postfix) with ESMTP id 2C59C37B400 for ; Wed, 29 Nov 2000 22:08:43 -0800 (PST) Received: from bde.zeta.org.au (bde.zeta.org.au [203.2.228.102]) by mailman.zeta.org.au (8.8.7/8.8.7) with ESMTP id RAA23773; Thu, 30 Nov 2000 17:08:29 +1100 Date: Thu, 30 Nov 2000 17:09:01 +1100 (EST) From: Bruce Evans X-Sender: bde@besplex.bde.org To: Julian Elischer Cc: current@FreeBSD.ORG Subject: Re: slight improvement in locore.s? In-Reply-To: <3A2525DD.3D1E8D5A@elischer.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Wed, 29 Nov 2000, Julian Elischer wrote: > Bruce Evans wrote: > > > > On Thu, 23 Nov 2000, Julian Elischer wrote: > > > > > locore.s includes: > > > #define ALLOCPAGES(foo) \ > > > movl R(physfree), %esi ; \ > > > movl $((foo)*PAGE_SIZE), %eax ; \ > > > addl %esi, %eax ; \ > > > movl %eax, R(physfree) ; \ > > > movl %esi, %edi ; \ > > > movl $((foo)*PAGE_SIZE),%ecx ; \ > > > xorl %eax,%eax ; \ > > > cld ; \ > > > rep ; \ > > > stosb > > > > > > > > > might it be a very slight optimisation to change this to: > > > #define ALLOCPAGES(foo) \ > > > movl R(physfree), %esi ; \ > > > movl $((foo)*PAGE_SIZE), %eax ; \ > > > movl %eax, %ecx ; \ > > > addl %esi, %eax ; \ > > > movl %eax, R(physfree) ; \ > > > movl %esi, %edi ; \ > > > xorl %eax,%eax ; \ > > > cld ; \ > > > rep ; \ > > > stosb > > > > This can be improved more (3 instructions) by not loading physfree into > > the wrong register, and depending on stosb to increment the register, > > so your assembly code would look like? (just curious). This is completely untested: #define ALLOCPAGES(foo) \ movl R(physfree),%edi ; \ movl $(foo)*PAGE_SIZE,%ecx ; \ movl %edi,%esi; \ xorl %eax,%eax ; \ cld ; \ rep ; \ stosb ; \ movl %edi,R(physfree) I wouldn't write it like this if either space or time efficiency were important. > > but it should be written in C anyway. A relocation macro like R() > > should work just as well in C as in asm. In C, the above is: > > > > bzero(R(physfree), (foo) * PAGE_SIZE); > > R(physfree) += (foo) * PAGE_SIZE); > > return (R(physfree)); /* In unusual as well as wrong reg %esi. */ Oops, this should return the original value of physfree. %esi is used to hold this value, so it is not "wrong". Setting it takes one instruction, so my version is only 2 instructions shorter. Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message