免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8507 | 回复: 4
打印 上一主题 下一主题

EM64T Vs x86,movq和movl,pushl比谁快! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-24 14:32 |只看该作者 |倒序浏览
最近在看RHEL4.5的glibc的时候发现了,关于tls的一段内联汇编,里面有这么一段关于线程栈的操作,有意思的是x86和EM64T下都有这段实现,但是汇编级别的指令用的不太一样,如下:
x86
————————————————————————————————————————————————
/* Call the user-provided thread function.  */
#define CALL_THREAD_FCT(descr) \
  ({ void *__res;                                                              \
     int __ignore1, __ignore2;                                                      \
     asm volatile ("pushl %%eax\n\t"                                              \
                   "pushl %%eax\n\t"                                              \
                   "pushl %%eax\n\t"                                              \
                   "pushl %%gs:%P4\n\t"                                              \
                   "call *%%gs:%P3\n\t"                                              \
                   "addl $16, %%esp"                                              \
                   : "=a" (__res), "=c" (__ignore1), "=d" (__ignore2)              \
                   : "i" (offsetof (struct pthread, start_routine)),              \
                     "i" (offsetof (struct pthread, arg)));                      \
     __res; })
——————————————————————————————————————————————————————
EM64T:
——————————————————————————————————————————————————————
#define CALL_THREAD_FCT(descr) \
  ({ void *__res;                                                              \
     asm volatile ("movq %%fs:%P2, %%rdi\n\t"                                      \
                   "callq *%%fs:%P1"                                              \
                   : "=a" (__res)                                              \
                   : "i" (offsetof (struct pthread, start_routine)),              \
                     "i" (offsetof (struct pthread, arg))                      \
                   : "di", "si", "cx", "dx", "r8", "r9", "r10", "r11",              \
                     "memory", "cc");                                              \
     __res; })
——————————————————————————————————————————————————————
可以看出EM64T,用一个movq就完成了x86用了4个pushl的工作,用一个callq就完成了x86用call+addl的工作,从指令的数量上来看是明显减少了。
但是,对于movq,pushl的指令周期各是多少就不太有把握了,去intel官网上看过manual了,上面只有介绍指令的用法没有涉及到指令周期的说明,看到这里有发过intel指令集的可是直到奔腾级别的,并且没有出现movq,movl,pushl等sse或mmx的指令。
并且在nasm下,试图使用像masm上用/Sc生成list文件的方法看指令周期,但是nasm的list文件里只有指令16进制的生成码,并没有指令周期可以看。
如果大家有intel 指令周期(包含有movl,movq等)的资料或者有linux下取得这些指令的指令周期的方法请不吝赐教,感激不尽!

论坛徽章:
0
2 [报告]
发表于 2007-09-24 22:12 |只看该作者
这两段代码只表述了32位和64位下的区别,并不代表64位一定比32的要快

论坛徽章:
0
3 [报告]
发表于 2007-09-26 13:45 |只看该作者
但是测试出来的结果显示,250sec内EM64T生成的thread数比x86的高出了30%左右,我想这就是EM64T采用64bit数据带宽带来的好处,movq就是64bit的操作指令之一。但是具体他比32bit的movl快多少,我还没想到很精确的测试方法,希望Intel对于64bit编程环境的汇编指令周期能有官方的资料提供。

论坛徽章:
0
4 [报告]
发表于 2007-09-26 17:59 |只看该作者
glibc你也看啊,不要命了? 那玩艺比我见过的任何代码都庞杂。

论坛徽章:
0
5 [报告]
发表于 2007-09-27 09:06 |只看该作者
原帖由 albcamus 于 2007-9-26 17:59 发表
glibc你也看啊,不要命了? 那玩艺比我见过的任何代码都庞杂。

你说的太文雅了,那代码明明就是一坨xxx,从来没打算让人看过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP