Сообщение Плохая оптимизация intrinsic кода для x86 (32 bit) от 25.01.2017 15:37
Изменено 25.01.2017 15:39 nnye
Плохая оптимизация intrinsic кода для x86
Хочу поделиться интересным наблюдением. Поставил для пробы январскую версию 2017 RC и пробую собрать программку, в которой немного используются intrinsic вызовы. Разница в качестве генерируемого кода между 32 и 64 битными версиями просто прибила. Под х86 можно сказать что её практически нет (очень тупая, по-крайней мере). Судите сами. Обе сборки в релизе. Опции компилятора одинаковые.
/MP /GS- /GL /W3 /Gy /Gm- /Ox /Ob2 /Zc:inline /fp:precise /GF /WX- /Zc:forScope /Gd /Oy /Oi /MD /Os
Выход (32 бита)
Выход (64 бита)
Моё мнение — M$ потихоньку подталкивает народ таким образом отказываться от поддержки x86.
/MP /GS- /GL /W3 /Gy /Gm- /Ox /Ob2 /Zc:inline /fp:precise /GF /WX- /Zc:forScope /Gd /Oy /Oi /MD /Os
// C++ исходник
enum Reg : int
{
EAX = 0,
EBX = 1,
ECX = 2,
EDX = 3
};
DWORD ReadCpuId(int function, Reg resultReg, byte bitNumber)
{
int regs[4];
__cpuid(regs, function);
return regs[resultReg] & (1 << bitNumber) ? 1 : 0;
}
DWORD enhancedStringsSupported;
void CpuInfo()
{
enhancedStringsSupported = ReadCpuId(0x7, Reg::EBX, 9);
}
Выход (32 бита)
; x86 (32bit)
CpuInfo proc near
var_10= byte ptr -10h
var_C= dword ptr -0Ch
push ebp
mov ebp, esp
sub esp, 10h
push ebx
push esi
push edi
push 7
pop eax
xor ecx, ecx
lea edi, [ebp+var_10]
push ebx
cpuid
mov esi, ebx
pop ebx
mov [edi], eax
mov [edi+4], esi
mov [edi+8], ecx
mov [edi+0Ch], edx
mov eax, [ebp+var_C]
pop edi
shr eax, 9
and eax, 1
pop esi
mov dword_403000, eax
pop ebx
mov esp, ebp
pop ebp
retn
CpuInfo endp
Выход (64 бита)
;x86 (64bit)
CpuInfo proc near
push rbx
sub rsp, 10h
xor ecx, ecx
mov eax, 7
cpuid
shr ebx, 9
and ebx, 1
mov cs:dword_140000C80, ebx
add rsp, 10h
pop rbx
retn
CpuInfo endp
Моё мнение — M$ потихоньку подталкивает народ таким образом отказываться от поддержки x86.
Плохая оптимизация intrinsic кода для x86
Хочу поделиться интересным наблюдением. Поставил для пробы январскую версию 2017 RC и пробую собрать программку, в которой немного используются intrinsic вызовы. Разница в качестве генерируемого кода между 32 и 64 битными версиями просто прибила. Под х86 можно сказать что её практически нет (очень тупая, по-крайней мере). Судите сами. Обе сборки в релизе. Опции компилятора одинаковые.
/MP /GS- /GL /W3 /Gy /Gm- /Ox /Ob2 /Zc:inline /fp:precise /GF /WX- /Zc:forScope /Gd /Oy /Oi /MD /Os
Выход (32 бита)
Выход (64 бита)
Моё мнение — M$ потихоньку подталкивает народ таким образом отказываться от поддержки x86.
/MP /GS- /GL /W3 /Gy /Gm- /Ox /Ob2 /Zc:inline /fp:precise /GF /WX- /Zc:forScope /Gd /Oy /Oi /MD /Os
// C++ исходник
enum Reg : int
{
EAX = 0,
EBX = 1,
ECX = 2,
EDX = 3
};
DWORD ReadCpuFeature(int function, Reg resultReg, byte bitNumber)
{
int regs[4];
__cpuid(regs, function);
return regs[resultReg] & (1 << bitNumber) ? 1 : 0;
}
DWORD enhancedStringsSupported;
void CpuInfo()
{
enhancedStringsSupported = ReadCpuFeature(0x7, Reg::EBX, 9);
}
Выход (32 бита)
; x86 (32bit)
CpuInfo proc near
var_10= byte ptr -10h
var_C= dword ptr -0Ch
push ebp
mov ebp, esp
sub esp, 10h
push ebx
push esi
push edi
push 7
pop eax
xor ecx, ecx
lea edi, [ebp+var_10]
push ebx
cpuid
mov esi, ebx
pop ebx
mov [edi], eax
mov [edi+4], esi
mov [edi+8], ecx
mov [edi+0Ch], edx
mov eax, [ebp+var_C]
pop edi
shr eax, 9
and eax, 1
pop esi
mov dword_403000, eax
pop ebx
mov esp, ebp
pop ebp
retn
CpuInfo endp
Выход (64 бита)
;x86 (64bit)
CpuInfo proc near
push rbx
sub rsp, 10h
xor ecx, ecx
mov eax, 7
cpuid
shr ebx, 9
and ebx, 1
mov cs:dword_140000C80, ebx
add rsp, 10h
pop rbx
retn
CpuInfo endp
Моё мнение — M$ потихоньку подталкивает народ таким образом отказываться от поддержки x86.