lkml.org 
[lkml]   [2006]   [May]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [patch 2.6.17-rc5 1/2] i386 memcpy: use as few moves as possible for I/O
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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-06-01 01:10    [W:0.026 / U:0.384 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site