У меня есть этот код:Как заставить GCC производить SCAN REPNE (сборка x86), а не CMP?
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 в сгенерированном коде сборки. Но независимо от уровня оптимизации (я пытался -О 0,1,2,3) GCC генерирует просто цикл с имп и драг, такие как (я получил его с 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 "cmp" s и 2 "je? S?
И могу ли я заставить GCC использовать SCAS с префиксом REPNE?
Заранее благодарен!
Зачем вам все равно? – DarkDust
Вы не подразумеваете 'repne scas'? – harold
«Разве вы не имеете в виду« красные сказки » Да, конечно, извините. – drvtiny