【看似不科学的现象得到了较为科学的解释】我在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 编辑 ]