我尝试使用以下命令创建我的 memcpy 代码rep movsb
操作说明。当禁用优化时,它可以完美地适应任何尺寸。但是,当我启用优化时,它无法按预期工作。
问题
- 如何防止gcc优化破坏rep movsb代码?
- 我的代码是否有问题导致未定义的行为?
创建自己的 memcpy 的动机:
我读到了有关 memcpy 的增强型 movsb英特尔® 64 和 IA-32 架构优化参考手册 第3.7.6节。我来到 libc 源代码,看到 libc 中的默认 memcpy 使用 SSE 而不是movsb
.
因此,我想比较两者的性能上交所指令 and 代表movsb对于memcpy。但现在,我发现有些不对劲。
重现问题的简单代码(test.c)
#include <stdio.h>
#include <string.h>
inline static void *my_memcpy(
register void *dest,
register const void *src,
register size_t n
) {
__asm__ volatile(
"mov %0, %%rdi;"
"mov %1, %%rsi;"
"mov %2, %%rcx;"
"rep movsb;"
:
: "r"(dest), "r"(src), "r"(n)
: "rdi", "rsi", "rcx"
);
return dest;
}
#define to_boolean_str(A) ((A) ? "true" : "false")
int main()
{
char src[32];
char dst[32];
memset(src, 'a', 32);
memset(dst, 'b', 32);
my_memcpy(dst, src, 1);
printf("%s\n", to_boolean_str(!memcmp(dst, src, 1)));
my_memcpy(dst, src, 2);
printf("%s\n", to_boolean_str(!memcmp(dst, src, 2)));
my_memcpy(dst, src, 3);
printf("%s\n", to_boolean_str(!memcmp(dst, src, 3)));
return 0;
}
编译并运行
ammarfaizi2@integral:~$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ammarfaizi2@integral:~$ gcc -O0 test.c -o test && ./test
true
true
true
ammarfaizi2@integral:~$ gcc -O1 test.c -o test && ./test
false
true
true
ammarfaizi2@integral:~$ gcc -O2 test.c -o test && ./test
false
true
true
ammarfaizi2@integral:~$ gcc -O3 test.c -o test && ./test
false
true
true
ammarfaizi2@integral:~$
Summary
my_memcpy(dst, src, 1);
如果启用优化,则会导致错误的行为。