我有这段代码:
void main () {
short int a[5]={12,15,1,17,248};
short int i=0;
short int b=17;
for (;i<(sizeof a/sizeof *a);i++) {
if (a[i]==b) printf("Hello, %d\n",i);
}
}
我希望在生成的汇编代码中看到REPE SCASW。 但无论优化程度如何(我试过-O 0,1,2,3)GCC都会生成简单的cmp和je循环,例如(我用objdump得到它):
3f: 48 83 fb 05 cmp rbx,0x5
43: 74 2b je 70 <main+0x70>
if (a[i]==b) printf("Hello, %d\n",i);
45: 66 83 3c 5c 11 cmp WORD PTR [rsp+rbx*2],0x11
4a: 75 ec jne 38 <main+0x38>
谁能告诉我,为什么GCC在这么简单的情况下不使用REPNE SCAS x86指令?也许,scas与2&#34; cmp&#34; s和2&#34; je&#34; s的循环相比太慢了?
我可以强迫GCC使用带有REPNE前缀的SCAS吗?
提前致谢!
答案 0 :(得分:1)
您没有说明为什么您认为应该看到REPNE SCAS
,但无论优化级别如何,您都不应该看到它。
如果您参考Agner Fog表格(2014年最后更新),您会发现REPNE SCAS
总是 不如CMP
所示JE
。
你真的不能强迫编译器走这条路线,但是如果你需要生成那个特定的代码,那么你最好能够使用内联汇编路径。