我正在構建解釋,用C編寫和使用GCC。GCC C彙編器
我改變了我生成中間代碼的方式。
但是在解釋此代碼時發生了意想不到的變化。 有一個條件塊處理中間代碼中的條件跳轉。 我沒有改變那段代碼。
使用Dissy進行反彙編。
舊版本裝配臺的樣子:
mov 0x10(%r14),%rax
mov 0x50(%rsp),%rcx
mov (%rcx,%rax,8),%r12
mov (%r12),%eax
test $0x4,%al
je 4077ef
cmpb $0x0,0x8(%r12)
je 4077ef
更新的版本:
mov 0x10(%r14),%rax
mov (%r12,%rax,8),%rdx
mov (%rdx),%eax
test $0x4,%al
je 4073e0
cmpb $0x0,0x8(%rdx)
je 4073e0
這種變化引起引起misspredictions 4-6%的業績倒退。
有沒有辦法建議GCC使用舊版本而不使用匯編節,以保持可移植性?
謝謝。
編輯
代碼在C:
if((M->type & 4 && M->val.boolean)
|| (M->type & 1 && M->val.number != 0.0)
|| (M->type & 2 && M->val.string.length != 0))
// true;
else
// false;
沒有看到相應的C源代碼,誰能猜到? –
顯示C代碼和你的gcc命令行。 gcc和/或gcc編譯器版本的命令行是否已更改? –
否,Makefile和GCC相同 – user978734