Warum sollte MSVC 2022 ohne Optimierungen zwei idiv-Aufrufe für einen std::div erstellen?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum sollte MSVC 2022 ohne Optimierungen zwei idiv-Aufrufe für einen std::div erstellen?

Post by Anonymous »

Mit CMAKE_BUILD_TYPE="Debug" erzeugte mein MSVC 2022 [17.4.33403.182] einen idiv-Aufruf für den Quotienten und einen identischen idiv-Aufruf für den Rest. Der Code war einfach [das komplette Projekt finden Sie hier]:

Code: Select all

_div_t const dv = std::div((int)5, (int)3);
Und die Assembly [Intel-Syntax] sah wie folgt aus:

Code: Select all

        11        _div_t const dv = std::div((int)5, (int)3);
0x7ff6b38a1434           mov     dword ptr [rsp+4],3
0x7ff6b38a143c           mov     dword ptr [rsp],5
0x7ff6b38a1443           mov     eax,dword ptr [rsp]
0x7ff6b38a1446           cdq
0x7ff6b38a1447           idiv    eax,dword ptr [rsp+4]
0x7ff6b38a144b           mov     dword ptr [rsp+8],eax
0x7ff6b38a144f           mov     eax,dword ptr [rsp]
0x7ff6b38a1452           cdq
0x7ff6b38a1453           idiv    eax,dword ptr [rsp+4]
0x7ff6b38a1457           mov     dword ptr [rsp+0Ch],edx
0x7ff6b38a145b           mov     rax,qword ptr [rsp+8]
0x7ff6b38a1460           mov     qword ptr [rsp+10h],rax
0x7ff6b38a1465           mov     rax,qword ptr [rsp+10h]
0x7ff6b38a146a           mov     qword ptr [rsp+18h],rax
0x7ff6b38a146f           mov     rax,qword ptr [rsp+18h]
0x7ff6b38a1474           mov     qword ptr [rsp+20h],rax
Mit CMAKE_BUILD_TYPE="Release" [und einer gewissen Neuorganisation des Codes, damit der Compiler diesen Code nicht vollständig wegoptimiert – siehe hier] wird er auf einen idiv-Aufruf reduziert:

Code: Select all

0x7ff7947f1800                   mov     eax,ecx
5        return std::div(dividend, divisor);
0x7ff7947f1802           mov     r8d,edx
0x7ff7947f1805           cdq
0x7ff7947f1806           idiv    eax,r8d
0x7ff7947f1809           mov     dword ptr [rsp+18h],eax
0x7ff7947f180d           mov     dword ptr [rsp+1Ch],edx
0x7ff7947f1811           mov     rax,qword ptr [rsp+18h]
6    }
0x7ff7947f1816           ret
Aber warum sollte MSVC 2022 überhaupt den doppelten Code generieren?
Weil es weiß, dass er sowieso optimiert wird?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post