本文部分内容复制自下面三篇文档:
https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf
https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf
https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf
64 位架构里,RDTSC 为了兼容性,做了个看上去比较低效的事情:TimeStamp 值复制到了 EDX:EAX 两个寄存器里,为了拿到最终值,用户还需要做一下拼接:
6f: 0f 31 rdtsc
71: 48 c1 e2 20 shl $0x20,%rdx
78: 48 09 c2 or %rax,%rdx
更高效的 RDTSC 实现应该直接把 TimeStamp 装入 64 位的 RAX 寄存器。RDTSC 首次引入是在 32 位的奔腾处理器中,到了 64 位时代为了兼容性,白白浪费 2 条指令(shl、or)。
为什么 Intel 不开发一个 rdtsc64 指令呢?对于 64 位机器下编译的程序完全不需要考虑兼容性呀!