【看似不科学的现象得到了较为科学的解释】我在windows下写了一个gcc内联汇编的例子跑linux下试验 linux是64位的啊 竟然通过了。。。
有个事我一直整错了 printf("%d\n", sizeof(int)); 结果是4 那样的话 64位和32位环境下都用一个movq移动8字节就够了 而64位环境下用32位指针也不是不可以 于是这个代码平稳的迁移到了64位环境
程序代码:
#include <stdio.h>
#include <signal.h>
#pragma pack (16)
struct two_int {
int a, b;
};
struct two_int data = {0, 0};
void signal_handler(int signum)
{
printf("%d, %d\n", data.a, data.b);
alarm(1);
}
int main(void)
{
static struct two_int zeros = {0, 0}, ones = {1, 1};
signal(SIGALRM, signal_handler);
data = zeros;
alarm(1);
while (1)
{
//data = zeros;
__asm__ (".intel_syntax noprefix");
__asm__ (
"lea eax, [%0];"
"movq xmm0, qword ptr [eax];"
"lea eax, [%1];"
"movq qword ptr [eax], xmm0;"
: //dst
:"m" (zeros), "m" (data) //src
:"xmm0", "eax"
);
//printf("%d %d\n", data.a, data.b);
//data = ones;
__asm__ (
"lea eax, [%0];"
"movq xmm0, qword ptr [eax];"
"lea eax, [%1];"
"movq qword ptr [eax], xmm0;"
: //dst
:"m" (ones), "m" (data) //src
:"xmm0", "eax"
);
}
//printf("%d %d\n", data.a, data.b);
return 0;
}
编译参数
gcc opt-sse.c -O3 -masm=intel -msse3 -march=core2 -o a.out
[root@kel ~]# file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xb8dd47da6e7b7769aede492f79a2ee9ca5ef66df, not stripped
结果
[root@kel ~]# ./a.out
1, 1
1, 1
1, 1
0, 0
1, 1
1, 1
但感觉应该是不对的啊 怎么能用eax呢。。。。。。。。。。。。。。。。。。。。。。。。。。。
/****************************************************************我是分割线***************************************************/
程序代码:
#include <stdio.h>
#include <signal.h>
#pragma pack (16)
struct two_int
{
int a, b;
};
struct two_int data = {0, 0};
void signal_handler(int signum)
{
printf("%d, %d\n", data.a, data.b);
alarm(1);
}
int main(void)
{
static struct two_int zeros = {0, 0}, ones = {1, 1};
signal(SIGALRM, signal_handler);
data = zeros;
alarm(1);
while (1)
{
//data = zeros;
__asm__ (".intel_syntax noprefix");
__asm__ (
"lea rax, qword ptr [%0];"
"movq xmm0, qword ptr [rax];"
"lea rax, qword ptr [%1];"
"movq qword ptr [rax], xmm0;"
: //dst
:"m" (zeros), "m" (data) //src
:"xmm0", "rax"
);
//printf("%d %d\n", data.a, data.b);
//data = ones;
__asm__ (
"lea rax, qword ptr [%0];"
"movq xmm0, qword ptr [rax];"
"lea rax, qword ptr [%1];"
"movq qword ptr [rax], xmm0;"
: //dst
:"m" (ones), "m" (data) //src
:"xmm0", "eax"
);
}
//printf("%d %d\n", data.a, data.b);
return 0;
}
64位用64位的指针 这下和谐了
如果这个结构再大 到4个int 也就是128bit 也能一次移动 SSE的优势在这里
不过 如果是再大再复杂的情况 恐怕得用原子操作了
[ 本帖最后由 zklhp 于 2012-10-10 18:14 编辑 ]










。