Информация об изменениях

Сообщение Плохая оптимизация intrinsic кода для x86 (32 bit) от 25.01.2017 15:37

Изменено 25.01.2017 15:42 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

// 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.
Плохая оптимизация intrinsic кода для x86 (32 bit)
Хочу поделиться интересным наблюдением. Поставил для пробы январскую версию 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

// 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.