При каких условиях компилятор VC генерирует инструкцию cmov в 32-битном коде? Что-то не удаётся его заставить... /arch:SSE2 не помогает. VC 2008 SP1, 2010.
KeSqueer нет не было. наличие этих инструкций надо дополнительно проверять (CPUID(1).eax:15) Intel® 64 and IA-32 Architectures Software Developer's Manual (Volume 2A)
KeSqueer PowerASM Инструкция cmov присутствует во всех процах, поддерживающих SSE2 (насчёт SSE не уверен). Поэтому есть основания ожидать, что компилятор будет использовать эту инструкцию при /arch:SSE2. Вот цитата из MSDN (статья об опции /arch):
VS 2005 Код (Text): cl /c /Ox /Os /arch:SSE /FAsc test.c Код (Text): #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int x,y; if(argc!=3) { printf("Usage: test <num1> <num2>\n"); return -1; } x=atoi(argv[1]); y=atoi(argv[2]); return x!=32 ? x:y; } Код (Text): ; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.42 TITLE C:\Prog\CHDK\test.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES _DATA SEGMENT $SG3546 DB 'Usage: test <num1> <num2>', 0aH, 00H _DATA ENDS PUBLIC _main EXTRN _atoi:PROC EXTRN _printf:PROC ; Function compile flags: /Ogspy ; File c:\prog\chdk\test.c _TEXT SEGMENT _argc$ = 8 ; size = 4 _argv$ = 12 ; size = 4 _main PROC ; 6 : int x,y; ; 7 : if(argc!=3) 00000 83 7c 24 04 03 cmp DWORD PTR _argc$[esp-4], 3 00005 74 0f je SHORT $LN1@main ; 8 : { ; 9 : printf("Usage: test <num1> <num2>\n"); 00007 68 00 00 00 00 push OFFSET $SG3546 0000c e8 00 00 00 00 call _printf 00011 59 pop ecx ; 10 : return -1; 00012 83 c8 ff or eax, -1 ; 15 : } 00015 c3 ret 0 $LN1@main: 00016 56 push esi ; 11 : } ; 12 : x=atoi(argv[1]); 00017 8b 74 24 0c mov esi, DWORD PTR _argv$[esp] 0001b 57 push edi 0001c ff 76 04 push DWORD PTR [esi+4] 0001f e8 00 00 00 00 call _atoi ; 13 : y=atoi(argv[2]); 00024 ff 76 08 push DWORD PTR [esi+8] 00027 8b f8 mov edi, eax 00029 e8 00 00 00 00 call _atoi 0002e 59 pop ecx ; 14 : return x!=32 ? x:y; 0002f 83 ff 20 cmp edi, 32 ; 00000020H 00032 59 pop ecx 00033 0f 45 c7 cmovne eax, edi 00036 5f pop edi 00037 5e pop esi ; 15 : } 00038 c3 ret 0 _main ENDP _TEXT ENDS END
Кстати в своём блоге разработчики студии пишут что в 2010 студии генерацию CMOV улучшат. http://blogs.msdn.com/vcblog/archive/2009/11/02/visual-c-code-generation-in-visual-studio-2010.aspx
cppasm Точно, при оптимизации по размеру генерится cmov. Спасибо. Но странно всё-таки... получается, что компилер считает jxx/mov быстрее cmov в 32битном коде.