如何强制GCC生产REPNE SCAS(x86组装),而不是CMP?

时间:2015-12-07 11:50:20

标签: gcc assembly x86

我有这段代码:

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吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您没有说明为什么您认为应该看到REPNE SCAS,但无论优化级别如何,您都不应该看到它。

如果您参考Agner Fog表格(2014年最后更新),您会发现REPNE SCAS 总是 不如CMP所示JE

你真的不能强迫编译器走这条路线,但是如果你需要生成那个特定的代码,那么你最好能够使用内联汇编路径。