[英]Assembly code for __rdtsc() in -O0 vs -O3
我有以下代碼:
#include <x86intrin.h>
int main() {
return __rdtsc();
}
我試圖在我的機器(Intel i7-6700 CPU)和objdump
上編譯
g++ -Wall test_tsc.cpp -o test_tsc -march=native -mtune=native -O0 -std=c++20
objdump -M intel -d test_tsc > test_tsc.O0
然后在test_tsc.O0
:
0000000000401122 <main>:
401122: 55 push rbp
401123: 48 89 e5 mov rbp,rsp
401126: 0f 31 rdtsc
401128: 48 c1 e2 20 shl rdx,0x20
40112c: 48 09 d0 or rax,rdx
40112f: 90 nop
401130: 5d pop rbp
401131: c3 ret
401132: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
401139: 00 00 00
40113c: 0f 1f 40 00 nop DWORD PTR [rax+0x0]
push rbp
和mov rbp,rsp
有什么作用? 看起來他們是為了保存堆棧指針,但實際上並沒有 function 調用。 如果 g++ 考慮__rdtsc()
一個 function 調用,那么之后會有類似call
的東西嗎?
謝謝。
rbp
是基指針,而不是堆棧指針。 基指針用於調試期間的回溯,但實際運行時不需要。
它通過 function 調用保留,因此使用-O3
僅生成預期的程序集:
main:
rdtsc
salq $32, %rdx
orq %rdx, %rax
ret
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.