From: Chuck Ebbert <76306.1226@compuserve.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>,
Chris Lesiak <chris.lesiak@licor.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [patch 2.6.17-rc5 1/2] i386 memcpy: use as few moves as possible for I/O
Date: Wed, 31 May 2006 19:01:45 -0400 [thread overview]
Message-ID: <200605311905_MC3-1-C141-B5CF@compuserve.com> (raw)
In-Reply-To: <447D1094.20409@zytor.com>
On Tue, 30 May 2006 20:42:12 -0700, H. Peter Anvin wrote:
> I was thinking some more about that, and I suspect the "right" way to do
> this looks something like the attached code. Note that it assymetric,
> and that it's probably too long to inline.
>
> I haven't tested this yet, and I probably won't have time to do so this
> evening.
There were some small problems, but I think I fixed them:
/*
* arch/i386/lib/memcpy_io.S
*
* The most general form of memory copy to/from I/O space, used for
* devices which can handle arbitrary transactions with appropriate
* handling of byte enables. The goal is to produce the minimum
* number of naturally aligned transactions on the bus.
*/
#include <linux/config.h>
#include <linux/linkage.h>
.macro build_memcpy_io_fn fn_name,align_reg
.globl \fn_name
.type \fn_name, @function
ALIGN
\fn_name:
ebp_space=0
#ifdef CONFIG_FRAME_POINTER
pushl %ebp
movl %esp,%ebp
ebp_space=4
#endif
pushl %edi
pushl %esi
#ifdef CONFIG_REGPARM
movl %eax, %edi
movl %edx, %esi
#else
movl 12+ebp_space(%esp), %edi
movl 20+ebp_space(%esp), %ecx
movl 16+ebp_space(%esp), %esi
#endif
jecxz 1f
testl $1, \align_reg
jz 2f
movsb
decl %ecx
2:
cmpl $2, %ecx
jb 3f
testl $2, \align_reg
jz 4f
movsw
decl %ecx
decl %ecx
4:
movl %ecx, %edx
shrl $2, %ecx
jz 5f
rep ; movsl
5:
movl %edx, %ecx
testb $2, %cl
jz 3f
movsw
3:
testb $1, %cl
jz 1f
movsb
1:
pop %esi
pop %edi
#ifdef CONFIG_FRAME_POINTER
leave
#endif
ret
.size \fn_name, .-\fn_name
.endm
build_memcpy_io_fn fn_name=memcpy_fromio,align_reg=%esi
build_memcpy_io_fn fn_name=memcpy_toio,align_reg=%edi
--
Chuck
next reply other threads:[~2006-05-31 23:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-31 23:01 Chuck Ebbert [this message]
-- strict thread matches above, loose matches on Subject: below --
2006-05-31 0:59 Chuck Ebbert
2006-05-31 1:36 ` H. Peter Anvin
2006-05-31 3:42 ` H. Peter Anvin
2006-05-31 11:39 ` linux-os (Dick Johnson)
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=200605311905_MC3-1-C141-B5CF@compuserve.com \
--to=76306.1226@compuserve.com \
--cc=akpm@osdl.org \
--cc=chris.lesiak@licor.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.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
Powered by JetHome