Ellery Newcomer
Posted in reply to Jesse Phillips
| On 02/04/2011 02:31 PM, Jesse Phillips wrote:
> Ellery Newcomer Wrote:
>
>> I think this was the impetus for foreach_reverse, or at least it is one
>> place where it is pretty handy. Don't remember what all there is in D1,
>> but in D2 you could do something like
>>
>> foreach_reverse(i; 0u .. 10u){
>> // iterates over 9,8,7 .. 1,0
>> }
>
> There was some discussion about removing this... don't remember the conclusion. I believe it is also in D1 though.
the range syntax isn't. but yeah.
personally, I would prefer keeping foreach_reverse as long as dmd isn't capable of optimizing the crap out of the likes of
foreach(i; retro(iota(0u,10u)){
}
wait, wtf?
this code:
import std.stdio;
import std.range;
void main(){
uint sum;
foreach_reverse(i; 0u .. 10u){
sum += i;
}
writeln(sum);
}
compiled normally yields:
80497d4: 55 push ebp
80497d5: 8b ec mov ebp,esp
80497d7: 83 ec 0c sub esp,0xc
80497da: 31 c0 xor eax,eax
80497dc: 89 45 f4 mov DWORD PTR [ebp-0xc],eax
80497df: 89 45 f8 mov DWORD PTR [ebp-0x8],eax
80497e2: c7 45 fc 0a 00 00 00 mov DWORD PTR [ebp-0x4],0xa
80497e9: 8b 4d fc mov ecx,DWORD PTR [ebp-0x4]
80497ec: ff 4d fc dec DWORD PTR [ebp-0x4]
80497ef: 3b 4d f8 cmp ecx,DWORD PTR [ebp-0x8]
80497f2: 76 08 jbe 80497fc <_Dmain+0x28>
80497f4: 8b 55 fc mov edx,DWORD PTR [ebp-0x4]
80497f7: 01 55 f4 add DWORD PTR [ebp-0xc],edx
80497fa: eb ed jmp 80497e9 <_Dmain+0x15>
80497fc: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
80497ff: e8 04 00 00 00 call 8049808 <_D3std5stdio14__T7writelnTkZ7writelnFkZv>
8049804: 31 c0 xor eax,eax
8049806: c9 leave
8049807: c3 ret
this code:
import std.stdio;
import std.range;
void main(){
uint sum;
foreach(i; retro(iota(1u,10))){
sum += i;
}
writeln(sum);
}
compiled with -O -inline -release, yields:
80497d4: 55 push ebp
80497d5: 8b ec mov ebp,esp
80497d7: 83 ec 54 sub esp,0x54
80497da: 53 push ebx
80497db: 8d 45 e8 lea eax,[ebp-0x18]
80497de: 31 db xor ebx,ebx
80497e0: 56 push esi
80497e1: 57 push edi
80497e2: 6a 01 push 0x1
80497e4: 6a 0a push 0xa
80497e6: 6a 01 push 0x1
80497e8: 89 18 mov DWORD PTR [eax],ebx
80497ea: 89 58 04 mov DWORD PTR [eax+0x4],ebx
80497ed: 89 58 08 mov DWORD PTR [eax+0x8],ebx
80497f0: e8 af 00 00 00 call 80498a4 <_D3std5range13__T4IotaTkTkZ4Iota6__ctorMFNckkkZS3std5range13__T4IotaTkTkZ4Iota>
80497f5: 89 c6 mov esi,eax
80497f7: 8d 7d dc lea edi,[ebp-0x24]
80497fa: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
80497fb: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi] ; whaaat?
80497fc: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi] ; whaaat?
80497fd: 8d 75 dc lea esi,[ebp-0x24]
8049800: 8d 7d d0 lea edi,[ebp-0x30]
8049803: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049804: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049805: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049806: 8d 75 d0 lea esi,[ebp-0x30]
8049809: 8d 7d c4 lea edi,[ebp-0x3c]
804980c: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
804980d: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
804980e: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
804980f: 8d 75 c4 lea esi,[ebp-0x3c]
8049812: 8d 7d f4 lea edi,[ebp-0xc]
8049815: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049816: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049817: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049818: 8d 75 f4 lea esi,[ebp-0xc]
804981b: 8d 7d b8 lea edi,[ebp-0x48]
804981e: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
804981f: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049820: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049821: 8d 75 b8 lea esi,[ebp-0x48]
8049824: 8d 7d ac lea edi,[ebp-0x54]
8049827: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049828: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
8049829: a5 movs DWORD PTR es:[edi],DWORD PTR ds:[esi]
804982a: 8b 45 ac mov eax,DWORD PTR [ebp-0x54]
804982d: 3b 45 b0 cmp eax,DWORD PTR [ebp-0x50]
8049830: 74 16 je 8049848 <_Dmain+0x74>
8049832: 8b 4d b0 mov ecx,DWORD PTR [ebp-0x50]
8049835: 8b 55 b4 mov edx,DWORD PTR [ebp-0x4c]
8049838: 8b 75 ac mov esi,DWORD PTR [ebp-0x54]
804983b: 2b 4d b4 sub ecx,DWORD PTR [ebp-0x4c]
804983e: 01 cb add ebx,ecx
8049840: 29 55 b0 sub DWORD PTR [ebp-0x50],edx
8049843: 3b 75 b0 cmp esi,DWORD PTR [ebp-0x50]
8049846: 75 ea jne 8049832 <_Dmain+0x5e>
8049848: 53 push ebx
8049849: b8 44 67 07 08 mov eax,0x8076744
804984e: 6a 0a push 0xa
8049850: e8 3b 04 00 00 call 8049c90 <_D3std5stdio4File14__T5writeTkTaZ5writeMFkaZv>
8049855: 31 c0 xor eax,eax
8049857: 5f pop edi
8049858: 5e pop esi
8049859: 5b pop ebx
804985a: 8b e5 mov esp,ebp
804985c: 5d pop ebp
804985d: c3 ret
is it just me, or is flow analysis failing pretty hard here?
|