[Issue 15629] [REG] wrong code with "-O -inline" but correct with "-O"
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat Jan 30 07:08:24 PST 2016
https://issues.dlang.org/show_bug.cgi?id=15629
--- Comment #1 from Ivan Kazmenko <gassa at mail.ru> ---
Here is the relevant disassembly of the object file produced 2.070.0:
-----
__Dmain PROC NEAR
; COMDEF __Dmain
sub esp, 44 ; 0000 _ 83. EC, 2C
mov eax, 3 ; 0003 _ B8, 00000003
mov ecx, 1 ; 0008 _ B9, 00000001
mov dword ptr [esp+0CH], ebx ; 000D _ 89. 5C 24, 0C
mov edx, offset FLAT:_D11TypeInfo_Ai6__initZ; 0011 _ BA,
00000000(segrel)
mov dword ptr [esp+10H], esi ; 0016 _ 89. 74 24, 10
mov dword ptr [esp+18H], eax ; 001A _ 89. 44 24, 18
mov dword ptr [esp+4H], ecx ; 001E _ 89. 4C 24, 04
mov dword ptr [esp], edx ; 0022 _ 89. 14 24
call __d_arrayliteralTX ; 0025 _ E8,
00000000(rel)
mov ebx, eax ; 002A _ 89. C3
mov eax, dword ptr [esp+18H] ; 002C _ 8B. 44 24, 18
mov dword ptr [ebx], eax ; 0030 _ 89. 03
mov dword ptr [esp+20H], ebx ; 0032 _ 89. 5C 24, 20
mov dword ptr [esp+1CH], 1 ; 0036 _ C7. 44 24, 1C,
00000001
mov dword ptr [esp+4H], 1 ; 003E _ C7. 44 24, 04,
00000001
mov dword ptr [esp], offset FLAT:_D11TypeInfo_Ai6__initZ; 0046 _
C7. 04 24, 00000000(segrel)
call __d_arrayliteralTX ; 004D _ E8,
00000000(rel)
mov esi, dword ptr [esp+20H] ; 0052 _ 8B. 74 24, 20
mov edx, dword ptr [esp+14H] ; 0056 _ 8B. 54 24, 14
mov dword ptr [eax], 9 ; 005A _ C7. 00,
00000009
mov dword ptr [esp+28H], eax ; 0060 _ 89. 44 24, 28
mov eax, dword ptr [esi] ; 0064 _ 8B. 06
mov ecx, eax ; 0066 _ 89. C1
sar ecx, 31 ; 0068 _ C1. F9, 1F
xor eax, ecx ; 006B _ 33. C1
sub eax, ecx ; 006D _ 2B. C1
mov dword ptr [esp+24H], 1 ; 006F _ C7. 44 24, 24,
00000001
cmp edx, 3 ; 0077 _ 83. FA, 03
jz ?_0056 ; 007A _ 74, 2E
push eax ; 007C _ 50
mov ecx, offset FLAT:?_0001 ; 007D _ B9,
00000000(segrel)
mov ebx, 1 ; 0082 _ BB, 00000001
push ecx ; 0087 _ 51
push ebx ; 0088 _ 53
push dword ptr [esp+2CH] ; 0089 _ FF. 74 24, 2C
push dword ptr [esp+2CH] ; 008D _ FF. 74 24, 2C
push ecx ; 0091 _ 51
push ebx ; 0092 _ 53
push dword ptr [esp+44H] ; 0093 _ FF. 74 24, 44
push dword ptr [esp+44H] ; 0097 _ FF. 74 24, 44
call
_D3std5stdio28__T7writelnTiTAyaTAiTAyaTAiZ7writelnFNfiAyaAiAyaAiZv; 009B _ E8,
00000000(rel)
mov eax, 12 ; 00A0 _ B8, 0000000C
call _D10testmodule8__assertFiZv ; 00A5 _ E8,
00000000(rel)
?_0056: mov ebx, dword ptr [esp+0CH] ; 00AA _ 8B. 5C 24, 0C
mov esi, dword ptr [esp+10H] ; 00AE _ 8B. 74 24, 10
add esp, 44 ; 00B2 _ 83. C4, 2C
xor eax, eax ; 00B5 _ 31. C0
ret ; 00B7 _ C3
__Dmain ENDP
-----
Looks like these lines are responsible:
-----
mov dword ptr [esp+18H], eax ; 001A
...
mov edx, dword ptr [esp+14H] ; 0056
...
cmp edx, 3 ; 0077
jz ?_0056 ; 007A
-----
I don't understand why the line at 0056 uses "dword ptr [esp+14H]" and not
"dword ptr [esp+18H]".
(Disclaimer: I'm not fluent in asm.)
--
More information about the Digitalmars-d-bugs
mailing list