[Issue 11289] New: Better compilation of code using std.typecons.NullableRef
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Oct 17 06:26:45 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11289
Summary: Better compilation of code using
std.typecons.NullableRef
Product: D
Version: D2
Platform: x86
OS/Version: Windows
Status: NEW
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: bearophile_hugs at eml.cc
--- Comment #0 from bearophile_hugs at eml.cc 2013-10-17 06:26:42 PDT ---
This is a DMD bug report/enhancement request. It's not a Phobos enhancement
request.
In attach there is a small benchmark program in two versions, the first
versions uses pointers to fixed-size arrays and has to use this bad looking
syntax to access array items:
(*number)[Nation.Norvegian]
The second wraps the arrays in NullableRef, that allow a more natural syntax:
number[Nation.Norvegian]
A NullableRef is essentially a smart pointer (NullableRef.sizeof ==
(void*).sizeof), but in this code leads to a program about 15% slower (compiled
with dmd 2.064beta1, dmd -O -release -inline -noboundscheck test2.d).
To encourage the usage of such safer smart pointers, the compiler should be
able to remove this little abstraction penality. So I think this is a problem
to be solved at compiler level, because I think the Phobos code of NullableRef
is fine.
-----------------------------------
test1:
isPossible:
push EAX
push EBX
push EBP
mov EBP,010h[ESP]
push ESI
mov ESI,EAX
push EDI
mov EDI,024h[ESP]
test EDI,EDI
je L1D
cmp dword ptr 0Ch[EDI],0
jne L179
L1D: cmp dword ptr 020h[ESP],0
je L31
mov ECX,020h[ESP]
cmp dword ptr [ECX],0
jne L179
L31: cmp dword ptr 01Ch[ESP],0
je L46
mov EDX,01Ch[ESP]
cmp dword ptr 8[EDX],4
jne L179
L46: test EBP,EBP
je L54
cmp dword ptr 010h[EBP],4
jne L179
L54: test ESI,ESI
je L62
cmp dword ptr 4[ESI],0
jne L179
L62: test EDI,EDI
je L19B
cmp dword ptr 020h[ESP],0
je L19B
cmp dword ptr 01Ch[ESP],0
je L19B
test EBP,EBP
je L19B
test ESI,ESI
je L19B
mov 018h[ESP],EBP
xor EBP,EBP
L96: mov ECX,020h[ESP]
mov EDX,[EBP*4][ECX]
mov ECX,1
cmp EDX,ECX
jne LB3
mov EAX,01Ch[ESP]
cmp [EBP*4][EAX],ECX
jne L179
LB3: mov EBX,018h[ESP]
mov EAX,[EBP*4][EBX]
test EAX,EAX
jne LC8
cmp [EBP*4][ESI],4
jne L179
LC8: cmp EDX,4
jne LD5
cmp EAX,ECX
jne L179
LD5: mov EBX,[EBP*4][EDI]
cmp EBX,2
jne LEB
mov ECX,01Ch[ESP]
cmp [EBP*4][ECX],0
jne L179
LEB: mov ECX,3
cmp EAX,ECX
jne LFD
mov EAX,01Ch[ESP]
cmp [EBP*4][EAX],ECX
jne L179
LFD: cmp EDX,2
jne L107
cmp EBX,1
jne L179
L107: mov EDX,020h[ESP]
xor EBX,EBX
lea EAX,[EBP*4][EDX]
L110: cmp dword ptr [EAX],1
jne L12A
mov ECX,020h[ESP]
cmp [EBX*4][ECX],3
jne L12A
mov EDX,[EBX*4][EDI]
sub EDX,[EBP*4][EDI]
cmp EDX,1
jne L179
L12A: mov 010h[ESP],EAX
mov EAX,[EBP*4][EDI]
mov EDX,018h[ESP]
sub EAX,[EBX*4][EDI]
mov ECX,EAX
sar ECX,01Fh
xor EAX,ECX
sub EAX,ECX
mov ECX,[EBP*4][EDX]
cmp ECX,2
jne L154
cmp [EBX*4][ESI],1
jne L154
cmp EAX,1
jne L179
L154: cmp [EBP*4][ESI],3
jne L165
cmp [EBX*4][EDX],1
jne L165
cmp EAX,1
jne L179
L165: cmp ECX,2
jne L183
mov EDX,01Ch[ESP]
cmp [EBX*4][EDX],2
jne L183
cmp EAX,1
je L183
L179: pop EDI
xor EAX,EAX
pop ESI
pop EBP
pop EBX
pop ECX
ret 010h
L183: inc EBX
mov EAX,010h[ESP]
cmp EBX,5
jb L110
inc EBP
cmp EBP,5
jb L96
L19B: pop EDI
mov EAX,1
pop ESI
pop EBP
pop EBX
pop ECX
ret 010h
Dmain:
L0: sub ESP,054h
mov EAX,offset FLAT:_D25TypeInfo_yAE5test16Nation6__initZ
push EBX
push EBP
push ESI
push EDI
push 5
push EAX
call near ptr __d_arrayliteralTX
mov EBX,EAX
mov ESI,5
mov dword ptr [EAX],0
mov ECX,EBX
mov dword ptr 4[EBX],1
mov dword ptr 8[EBX],2
mov dword ptr 0Ch[EBX],3
mov dword ptr 010h[EBX],4
mov EAX,_D5test14mainFZv11permsNumberyAG5E5test16Number
mov 04Ch[ESP],ESI
mov EDX,_D5test14mainFZv11permsNumberyAG5E5test16Number[04h]
mov 050h[ESP],ECX
mov 024h[ESP],EAX
mov 028h[ESP],EDX
add ESP,8
cmp dword ptr _D5test14mainFZv11permsNumberyAG5E5test16Number,0
je L382
mov EBX,020h[ESP]
mov EDI,_D5test14mainFZv11permsNumberyAG5E5test16Number
lea ECX,[EDI*4][EDI]
mov 060h[ESP],EBX
lea ECX,[00h][ECX*4]
add ECX,EBX
mov 04Ch[ESP],ECX
L88: push dword ptr 060h[ESP]
xor EAX,EAX
push 0
push 0
push 0
call near ptr
_D5test110isPossibleFNaNbyPG5E5test16NumberyPG5E5test15ColoryPG5E5test15DrinkyPG5E5test15SmokeyPG5E5test13PetZb
test AL,AL
je L36F
cmp dword ptr _D5test14mainFZv10permsColoryAG5E5test15Color,0
mov EAX,_D5test14mainFZv10permsColoryAG5E5test15Color
mov EDX,_D5test14mainFZv10permsColoryAG5E5test15Color[04h]
mov 03Ch[ESP],EAX
mov 040h[ESP],EDX
je L36F
mov EBX,_D5test14mainFZv10permsColoryAG5E5test15Color
lea ESI,[EBX*4][EBX]
lea ESI,[00h][ESI*4]
add ESI,040h[ESP]
mov EBP,040h[ESP]
mov 050h[ESP],ESI
LDD: push dword ptr 060h[ESP]
xor EAX,EAX
push EBP
push 0
push 0
call near ptr
_D5test110isPossibleFNaNbyPG5E5test16NumberyPG5E5test15ColoryPG5E5test15DrinkyPG5E5test15SmokeyPG5E5test13PetZb
test AL,AL
je L362
cmp dword ptr _D5test14mainFZv10permsDrinkyAG5E5test15Drink,0
mov EAX,_D5test14mainFZv10permsDrinkyAG5E5test15Drink
mov EDX,_D5test14mainFZv10permsDrinkyAG5E5test15Drink[04h]
mov 034h[ESP],EAX
mov 038h[ESP],EDX
je L362
mov ECX,_D5test14mainFZv10permsDrinkyAG5E5test15Drink
lea EBX,[ECX*4][ECX]
lea EBX,[00h][EBX*4]
add EBX,038h[ESP]
mov EDI,038h[ESP]
mov 054h[ESP],EBX
L131: push dword ptr 060h[ESP]
xor EAX,EAX
push EBP
push EDI
push 0
call near ptr
_D5test110isPossibleFNaNbyPG5E5test16NumberyPG5E5test15ColoryPG5E5test15DrinkyPG5E5test15SmokeyPG5E5test13PetZb
test AL,AL
je L355
cmp dword ptr _D5test14mainFZv10permsSmokeyAG5E5test15Smoke,0
mov EAX,_D5test14mainFZv10permsSmokeyAG5E5test15Smoke
mov EDX,_D5test14mainFZv10permsSmokeyAG5E5test15Smoke[04h]
mov 014h[ESP],EAX
mov 018h[ESP],EDX
je L355
mov ECX,_D5test14mainFZv10permsSmokeyAG5E5test15Smoke
lea EDX,[ECX*4][ECX]
lea EDX,[00h][EDX*4]
add EDX,018h[ESP]
mov ESI,018h[ESP]
mov 058h[ESP],EDX
L184: push dword ptr 060h[ESP]
xor EAX,EAX
push EBP
push EDI
push ESI
call near ptr
_D5test110isPossibleFNaNbyPG5E5test16NumberyPG5E5test15ColoryPG5E5test15DrinkyPG5E5test15SmokeyPG5E5test13PetZb
test AL,AL
je L348
cmp dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet,0
mov EAX,_D5test14mainFZv8permsPetyAG5E5test13Pet
mov EDX,_D5test14mainFZv8permsPetyAG5E5test13Pet[04h]
mov 024h[ESP],EAX
mov 028h[ESP],EDX
je L348
mov ECX,_D5test14mainFZv8permsPetyAG5E5test13Pet
lea EDX,[ECX*4][ECX]
lea EDX,[00h][EDX*4]
add EDX,028h[ESP]
mov EBX,028h[ESP]
mov 05Ch[ESP],EDX
L1D6: push dword ptr 060h[ESP]
mov EAX,EBX
push EBP
push EDI
push ESI
call near ptr
_D5test110isPossibleFNaNbyPG5E5test16NumberyPG5E5test15ColoryPG5E5test15DrinkyPG5E5test15SmokeyPG5E5test13PetZb
test AL,AL
je L33B
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[024h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[020h]
call near ptr _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv
mov EAX,044h[ESP]
mov EDX,048h[ESP]
mov 02Ch[ESP],EAX
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
mov 030h[ESP],EDX
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[05Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[058h]
mov ECX,040h[ESP]
push dword ptr [ECX]
push dword ptr 4[ECX]
push dword ptr 8[ECX]
push dword ptr 0Ch[ECX]
push dword ptr 010h[ECX]
call near ptr _D3std5Úio4File99__T8writeflnTaTAyÙyE5test16Nation€€
€Z€‰àMFxAa€ƒâ€¡€€žž€Ýv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[06Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[068h]
mov EDX,070h[ESP]
push dword ptr [EDX]
push dword ptr 4[EDX]
push dword ptr 8[EDX]
push dword ptr 0Ch[EDX]
push dword ptr 010h[EDX]
call near ptr _D3std5Úio4File99__T8writeflnTaTAyÙyE5test16Number€€
€Z€‰àMFxAa€ƒâ€¡€€žž€Ýv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[07Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[078h]
push dword ptr 0[EBP]
push dword ptr 4[EBP]
push dword ptr 8[EBP]
push dword ptr 0Ch[EBP]
push dword ptr 010h[EBP]
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test15Color€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[08Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[088h]
push dword ptr [EDI]
push dword ptr 4[EDI]
push dword ptr 8[EDI]
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr 0Ch[EDI]
push dword ptr 010h[EDI]
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test15Drink€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[09Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[098h]
push dword ptr [ESI]
push dword ptr 4[ESI]
push dword ptr 8[ESI]
push dword ptr 0Ch[ESI]
push dword ptr 010h[ESI]
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test15Smoke€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[04Ch]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[048h]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[0ACh]
push dword ptr _D5test14mainFZv8permsPetyAG5E5test13Pet[0A8h]
push dword ptr [EBX]
push dword ptr 4[EBX]
push dword ptr 8[EBX]
push dword ptr 0Ch[EBX]
push dword ptr 010h[EBX]
call near ptr
_D3std5Úio4File84__T8writeflnTaTAyÙyE5test13Pet€€šš€Z€‰ÑMFxAa€ƒÓ€Œž€ŒŒ€˜˜€Îv
call near ptr _D3std5stdio12__T7writelnZ7writelnFZv
L33B: add EBX,014h
cmp EBX,05Ch[ESP]
jb L1D6
L348: add ESI,014h
cmp ESI,058h[ESP]
jb L184
L355: add EDI,014h
cmp EDI,054h[ESP]
jb L131
L362: add EBP,014h
cmp EBP,050h[ESP]
jb LDD
L36F: add dword ptr 060h[ESP],014h
mov ECX,04Ch[ESP]
cmp 060h[ESP],ECX
jb L88
L382: pop EDI
xor EAX,EAX
pop ESI
pop EBP
pop EBX
add ESP,054h
ret
-----------------------------------
test2:
isPossible:
push EAX
push EBX
push EBP
push ESI
push EDI
cmp dword ptr 024h[ESP],0
je L1A
mov ECX,024h[ESP]
cmp dword ptr 0Ch[ECX],0
jne L1A7
L1A: cmp dword ptr 020h[ESP],0
je L2E
mov EDX,020h[ESP]
cmp dword ptr [EDX],0
jne L1A7
L2E: cmp dword ptr 01Ch[ESP],0
je L43
mov EBX,01Ch[ESP]
cmp dword ptr 8[EBX],4
jne L1A7
L43: cmp dword ptr 018h[ESP],0
je L58
mov ESI,018h[ESP]
cmp dword ptr 010h[ESI],4
jne L1A7
L58: cmp dword ptr 010h[ESP],0
je L6D
mov EAX,010h[ESP]
cmp dword ptr 4[EAX],0
jne L1A7
L6D: cmp dword ptr 024h[ESP],0
je L1C8
cmp dword ptr 020h[ESP],0
je L1C8
cmp dword ptr 01Ch[ESP],0
je L1C8
cmp dword ptr 018h[ESP],0
je L1C8
cmp dword ptr 010h[ESP],0
je L1C8
xor EDI,EDI
LA6: mov ECX,020h[ESP]
mov EDX,[EDI*4][ECX]
mov EBX,1
cmp EDX,EBX
jne LC3
mov ESI,01Ch[ESP]
cmp [EDI*4][ESI],EBX
jne L1A7
LC3: mov EAX,018h[ESP]
mov ECX,[EDI*4][EAX]
test ECX,ECX
jne LDC
mov ESI,010h[ESP]
cmp [EDI*4][ESI],4
jne L1A7
LDC: cmp EDX,4
jne LE9
cmp ECX,EBX
jne L1A7
LE9: mov EAX,024h[ESP]
mov ESI,[EDI*4][EAX]
cmp ESI,2
jne L103
mov EAX,01Ch[ESP]
cmp [EDI*4][EAX],0
jne L1A7
L103: mov EAX,3
cmp ECX,EAX
jne L119
mov ECX,01Ch[ESP]
cmp [EDI*4][ECX],EAX
jne L1A7
L119: cmp EDX,2
jne L126
cmp ESI,EBX
jne L1A7
L126: mov EDX,020h[ESP]
xor EBX,EBX
lea ESI,[EDI*4][EDX]
L12F: mov ECX,1
cmp [ESI],ECX
jne L150
mov EDX,020h[ESP]
cmp [EBX*4][EDX],3
jne L150
mov EDX,024h[ESP]
mov EAX,[EBX*4][EDX]
sub EAX,[EDI*4][EDX]
cmp EAX,ECX
jne L1A7
L150: mov EDX,024h[ESP]
mov EAX,[EDI*4][EDX]
sub EAX,[EBX*4][EDX]
mov EDX,EAX
sar EDX,01Fh
xor EAX,EDX
sub EAX,EDX
mov EDX,018h[ESP]
mov EBP,[EDI*4][EDX]
cmp EBP,2
jne L17E
mov ECX,010h[ESP]
cmp [EBX*4][ECX],1
jne L17E
cmp EAX,1
jne L1A7
L17E: mov ECX,010h[ESP]
cmp [EDI*4][ECX],3
jne L193
cmp [EBX*4][EDX],1
jne L193
cmp EAX,1
jne L1A7
L193: cmp EBP,2
jne L1B1
mov EDX,01Ch[ESP]
cmp [EBX*4][EDX],2
jne L1B1
cmp EAX,1
je L1B1
L1A7: pop EDI
xor EAX,EAX
pop ESI
pop EBP
pop EBX
pop ECX
ret 010h
L1B1: inc EBX
mov ECX,5
cmp EBX,ECX
jb L12F
inc EDI
cmp EDI,ECX
jb LA6
L1C8: pop EDI
mov EAX,1
pop ESI
pop EBP
pop EBX
pop ECX
ret 010h
Dmain:
L0: sub ESP,04Ch
mov EAX,offset FLAT:_D25TypeInfo_yAE5test26Nation6__initZ
push EBX
push EBP
push ESI
push EDI
push 5
push EAX
call near ptr __d_arrayliteralTX
mov EBX,EAX
mov ECX,EBX
mov dword ptr [EAX],0
mov ESI,5
mov dword ptr 4[EBX],1
mov dword ptr 8[EBX],2
mov dword ptr 0Ch[EBX],3
mov dword ptr 010h[EBX],4
mov EAX,_D5test24mainFZv11permsNumberyAG5E5test26Number
mov 01Ch[ESP],EAX
mov EDX,_D5test24mainFZv11permsNumberyAG5E5test26Number[04h]
mov 020h[ESP],EDX
add ESP,8
cmp dword ptr _D5test24mainFZv11permsNumberyAG5E5test26Number,0
je L372
mov 040h[ESP],ECX
mov EBX,018h[ESP]
mov EDI,_D5test24mainFZv11permsNumberyAG5E5test26Number
lea ECX,[EDI*4][EDI]
lea ECX,[00h][ECX*4]
add ECX,EBX
mov 03Ch[ESP],ESI
mov 058h[ESP],EBX
mov 044h[ESP],ECX
L88: push dword ptr 058h[ESP]
xor EAX,EAX
push 0
push 0
push 0
call near ptr
_D5test210isPossibleFNaNbS€†˜35__T11Nulla€ƒ›RefTyG5E€†6NumberZ€
€ˆ¹4€›¹5Colo€´¸Drink€³¸Smoke€–¸2€›¸3Pet€Ž¶Zb
test AL,AL
je L35F
cmp dword ptr _D5test24mainFZv10permsColoryAG5E5test25Color,0
mov EAX,_D5test24mainFZv10permsColoryAG5E5test25Color
mov EDX,_D5test24mainFZv10permsColoryAG5E5test25Color[04h]
mov 01Ch[ESP],EAX
mov 020h[ESP],EDX
je L35F
mov EBX,_D5test24mainFZv10permsColoryAG5E5test25Color
lea ESI,[EBX*4][EBX]
lea ESI,[00h][ESI*4]
add ESI,020h[ESP]
mov EBP,020h[ESP]
mov 048h[ESP],ESI
LDD: push dword ptr 058h[ESP]
xor EAX,EAX
push EBP
push 0
push 0
call near ptr
_D5test210isPossibleFNaNbS€†˜35__T11Nulla€ƒ›RefTyG5E€†6NumberZ€
€ˆ¹4€›¹5Colo€´¸Drink€³¸Smoke€–¸2€›¸3Pet€Ž¶Zb
test AL,AL
je L352
cmp dword ptr _D5test24mainFZv10permsDrinkyAG5E5test25Drink,0
mov EAX,_D5test24mainFZv10permsDrinkyAG5E5test25Drink
mov EDX,_D5test24mainFZv10permsDrinkyAG5E5test25Drink[04h]
mov 024h[ESP],EAX
mov 028h[ESP],EDX
je L352
mov ECX,_D5test24mainFZv10permsDrinkyAG5E5test25Drink
lea EBX,[ECX*4][ECX]
lea EBX,[00h][EBX*4]
add EBX,028h[ESP]
mov EDI,028h[ESP]
mov 04Ch[ESP],EBX
L131: push dword ptr 058h[ESP]
xor EAX,EAX
push EBP
push EDI
push 0
call near ptr
_D5test210isPossibleFNaNbS€†˜35__T11Nulla€ƒ›RefTyG5E€†6NumberZ€
€ˆ¹4€›¹5Colo€´¸Drink€³¸Smoke€–¸2€›¸3Pet€Ž¶Zb
test AL,AL
je L345
cmp dword ptr _D5test24mainFZv10permsSmokeyAG5E5test25Smoke,0
mov EAX,_D5test24mainFZv10permsSmokeyAG5E5test25Smoke
mov EDX,_D5test24mainFZv10permsSmokeyAG5E5test25Smoke[04h]
mov 02Ch[ESP],EAX
mov 030h[ESP],EDX
je L345
mov ECX,_D5test24mainFZv10permsSmokeyAG5E5test25Smoke
lea EDX,[ECX*4][ECX]
lea EDX,[00h][EDX*4]
add EDX,030h[ESP]
mov ESI,030h[ESP]
mov 050h[ESP],EDX
L184: push dword ptr 058h[ESP]
xor EAX,EAX
push EBP
push EDI
push ESI
call near ptr
_D5test210isPossibleFNaNbS€†˜35__T11Nulla€ƒ›RefTyG5E€†6NumberZ€
€ˆ¹4€›¹5Colo€´¸Drink€³¸Smoke€–¸2€›¸3Pet€Ž¶Zb
test AL,AL
je L338
cmp dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet,0
mov EAX,_D5test24mainFZv8permsPetyAG5E5test23Pet
mov EDX,_D5test24mainFZv8permsPetyAG5E5test23Pet[04h]
mov 034h[ESP],EAX
mov 038h[ESP],EDX
je L338
mov ECX,_D5test24mainFZv8permsPetyAG5E5test23Pet
lea EDX,[ECX*4][ECX]
lea EDX,[00h][EDX*4]
add EDX,038h[ESP]
mov EBX,038h[ESP]
mov 054h[ESP],EDX
L1D6: push dword ptr 058h[ESP]
mov EAX,EBX
push EBP
push EDI
push ESI
call near ptr
_D5test210isPossibleFNaNbS€†˜35__T11Nulla€ƒ›RefTyG5E€†6NumberZ€
€ˆ¹4€›¹5Colo€´¸Drink€³¸Smoke€–¸2€›¸3Pet€Ž¶Zb
test AL,AL
je L32B
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[024h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[020h]
call near ptr _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[05Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[058h]
mov ECX,050h[ESP]
push dword ptr [ECX]
push dword ptr 4[ECX]
push dword ptr 8[ECX]
push dword ptr 0Ch[ECX]
push dword ptr 010h[ECX]
call near ptr _D3std5Úio4File99__T8writeflnTaTAyÙyE5test26Nation€€
€Z€‰àMFxAa€ƒâ€¡€€žž€Ýv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[06Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[068h]
mov EDX,068h[ESP]
push dword ptr [EDX]
push dword ptr 4[EDX]
push dword ptr 8[EDX]
push dword ptr 0Ch[EDX]
push dword ptr 010h[EDX]
call near ptr _D3std5Úio4File99__T8writeflnTaTAyÙyE5test26Number€€
€Z€‰àMFxAa€ƒâ€¡€€žž€Ýv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[07Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[078h]
push dword ptr 0[EBP]
push dword ptr 4[EBP]
push dword ptr 8[EBP]
push dword ptr 0Ch[EBP]
push dword ptr 010h[EBP]
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test25Color€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[08Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[088h]
push dword ptr [EDI]
push dword ptr 4[EDI]
push dword ptr 8[EDI]
push dword ptr 0Ch[EDI]
push dword ptr 010h[EDI]
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test25Drink€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[09Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[098h]
push dword ptr [ESI]
push dword ptr 4[ESI]
push dword ptr 8[ESI]
push dword ptr 0Ch[ESI]
push dword ptr 010h[ESI]
call near ptr
_D3std5Úio4File94__T8writeflnTaTAyÙyE5test25Smoke€€žž€Z€‰ÛMFxAa€ƒÝ€Ž
€ŽŽ€œœ€Øv
mov EAX,offset FLAT:_D3std5stdio6stdoutS3std5stdio4File
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[04Ch]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[048h]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[0ACh]
push dword ptr _D5test24mainFZv8permsPetyAG5E5test23Pet[0A8h]
push dword ptr [EBX]
push dword ptr 4[EBX]
push dword ptr 8[EBX]
push dword ptr 0Ch[EBX]
push dword ptr 010h[EBX]
call near ptr
_D3std5Úio4File84__T8writeflnTaTAyÙyE5test23Pet€€šš€Z€‰ÑMFxAa€ƒÓ€Œž€ŒŒ€˜˜€Îv
call near ptr _D3std5stdio12__T7writelnZ7writelnFZv
L32B: add EBX,014h
cmp EBX,054h[ESP]
jb L1D6
L338: add ESI,014h
cmp ESI,050h[ESP]
jb L184
L345: add EDI,014h
cmp EDI,04Ch[ESP]
jb L131
L352: add EBP,014h
cmp EBP,048h[ESP]
jb LDD
L35F: add dword ptr 058h[ESP],014h
mov ECX,044h[ESP]
cmp 058h[ESP],ECX
jb L88
L372: pop EDI
xor EAX,EAX
pop ESI
pop EBP
pop EBX
add ESP,04Ch
ret
-----------------------------------
This is one central part of the isPossible function of test1:
L96: mov ECX,020h[ESP]
mov EDX,[EBP*4][ECX]
mov ECX,1
cmp EDX,ECX
jne LB3
mov EAX,01Ch[ESP]
cmp [EBP*4][EAX],ECX
jne L179
LB3: mov EBX,018h[ESP]
mov EAX,[EBP*4][EBX]
test EAX,EAX
jne LC8
cmp [EBP*4][ESI],4
jne L179
LC8: cmp EDX,4
jne LD5
cmp EAX,ECX
jne L179
LD5: mov EBX,[EBP*4][EDI]
cmp EBX,2
jne LEB
mov ECX,01Ch[ESP]
cmp [EBP*4][ECX],0
jne L179
LEB: mov ECX,3
cmp EAX,ECX
jne LFD
mov EAX,01Ch[ESP]
cmp [EBP*4][EAX],ECX
jne L179
LFD: cmp EDX,2
jne L107
cmp EBX,1
jne L179
L107: mov EDX,020h[ESP]
xor EBX,EBX
lea EAX,[EBP*4][EDX]
L110: cmp dword ptr [EAX],1
jne L12A
mov ECX,020h[ESP]
cmp [EBX*4][ECX],3
jne L12A
mov EDX,[EBX*4][EDI]
sub EDX,[EBP*4][EDI]
cmp EDX,1
jne L179
L12A: mov 010h[ESP],EAX
mov EAX,[EBP*4][EDI]
mov EDX,018h[ESP]
sub EAX,[EBX*4][EDI]
mov ECX,EAX
sar ECX,01Fh
xor EAX,ECX
sub EAX,ECX
mov ECX,[EBP*4][EDX]
cmp ECX,2
jne L154
cmp [EBX*4][ESI],1
jne L154
cmp EAX,1
jne L179
This is the same part of the isPossible function of test2:
LA6: mov ECX,020h[ESP]
mov EDX,[EDI*4][ECX]
mov EBX,1
cmp EDX,EBX
jne LC3
mov ESI,01Ch[ESP]
cmp [EDI*4][ESI],EBX
jne L1A7
LC3: mov EAX,018h[ESP]
mov ECX,[EDI*4][EAX]
test ECX,ECX
jne LDC
> mov ESI,010h[ESP]
cmp [EDI*4][ESI],4
jne L1A7
LDC: cmp EDX,4
jne LE9
cmp ECX,EBX
jne L1A7
>LE9: mov EAX,024h[ESP]
mov ESI,[EDI*4][EAX]
cmp ESI,2
jne L103
mov EAX,01Ch[ESP]
cmp [EDI*4][EAX],0
jne L1A7
L103: mov EAX,3
cmp ECX,EAX
jne L119
mov ECX,01Ch[ESP]
cmp [EDI*4][ECX],EAX
jne L1A7
L119: cmp EDX,2
jne L126
cmp ESI,EBX
jne L1A7
L126: mov EDX,020h[ESP]
xor EBX,EBX
lea ESI,[EDI*4][EDX]
>L12F: mov ECX,1
cmp [ESI],ECX
jne L150
mov EDX,020h[ESP]
cmp [EBX*4][EDX],3
jne L150
> mov EDX,024h[ESP]
mov EAX,[EBX*4][EDX]
sub EAX,[EDI*4][EDX]
cmp EAX,ECX
jne L1A7
L150: mov EDX,024h[ESP]
> mov EAX,[EDI*4][EDX]
sub EAX,[EBX*4][EDX]
mov EDX,EAX
sar EDX,01Fh
xor EAX,EDX
sub EAX,EDX
mov EDX,018h[ESP]
mov EBP,[EDI*4][EDX]
cmp EBP,2
jne L17E
mov ECX,010h[ESP]
cmp [EBX*4][ECX],1
jne L17E
cmp EAX,1
jne L1A7
You can see several extra mov instructions (that I have tried to mark with a
">"), that could cause the about 15% slowdown.
I don't know the cause of the lower performance of the second version. Perhaps
those extra mov instructions are caused by a higher reister pressure.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list