2012-12-03 127 views
0

我正在構建解釋,用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; 
+3

沒有看到相應的C源代碼,誰能猜到? –

+0

顯示C代碼和你的gcc命令行。 gcc和/或gcc編譯器版本的命令行是否已更改? –

+0

否,Makefile和GCC相同 – user978734

回答

2

有,不能在這裏分支預測任何區別。

相反,它似乎已修改的原始源代碼:由於myarray中的基地寄存器R12已經緩存在後一種情況下

void my_func(int *myarray, int N) { 
     do_something(myarray[N]); 
} 

void modified(int * myarray, int N) { 
    do_something(myarray); 
    do_something_else(myarray[N]); 
} 

- 或者您剛剛從本地堆棧移動myarray以用作函數的參數。

+0

變量M仍然填充了'M = memory [instruct-> a2]'的同一個宏,但是我在每條指令後都使用複製開關,因此整個解釋是一個大功能。 – user978734