Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - Invalid code generation (optimizer)
Hi, When I turn on the -o+speed switch for the code listed below, the compiler generates 'invalid' code. Options: -6 -o+speed -mn -WA Compiler gives one warning: Warning 12: variable 'struct tagRGBQUAD tempRGB' used before set #include <windows.h> void __stdcall func(const RGBQUAD *pSource, RGBQUAD *pDest, int width, int height); int main(void) { RGBQUAD m1[ 4 ][ 4 ], m2[ 4 ][ 4 ]; func( (RGBQUAD *) m1, (RGBQUAD *) m2, 4, 4 ); return 0; } void __stdcall func(const RGBQUAD *pSource, RGBQUAD *pDest, int width, int height) { int pixel_count; RGBQUAD tempRGB; pixel_count = width * height -1; while (pixel_count >= 0) { tempRGB = pSource[ pixel_count ]; tempRGB.rgbRed = (tempRGB.rgbRed & 0xf0) | (tempRGB.rgbRed >> 4); tempRGB.rgbGreen = (tempRGB.rgbGreen & 0xf0) | (tempRGB.rgbGreen >> 4); tempRGB.rgbBlue = (tempRGB.rgbBlue & 0xf0) | (tempRGB.rgbBlue >> 4); pDest[ pixel_count ] =tempRGB; pixel_count--; } } Generated assembly: push eax mov edx,[esp+08] push ebx mov ebx,[esp+14] push esi mov esi,[esp+14] imul ebx,[esp+1C] dec ebx js L1 mov cl,[esp+09] ; (1) and cl,F0 movzx eax,byte ptr [esp+09] sar eax,04 or cl,al mov [esp+09],cl mov cl,[esp+08] and cl,F0 movzx eax,byte ptr [esp+08] sar eax,04 or cl,al mov [esp+08],cl L2: mov ecx,[edx+4*ebx] mov [esp+08],ecx mov cl,[esp+0A] and cl,F0 movzx eax,byte ptr [esp+0A] sar eax,04 or cl,al mov [esp+0A],cl mov ecx,[esp+08] mov [esi+4*ebx],ecx dec ebx test ebx,ebx jns L2 ; (2) L1: pop esi pop ebx pop eax ret 0010 At (1), the data at [esp+09] is unknown. At (2), the conditional jump jumps to the wrong address although (at L2) it reads data from the 'right' address and writes this to the stack (this should be done before (1)). I don't get the warning when I don't use the switch -o+speed. Sep 15 2003
|