From: buers AT gmx DOT de (Dieter Buerssner) Newsgroups: comp.os.msdos.djgpp Subject: Re: THE -O2 PROBLEM Date: 15 Apr 2000 10:49:15 GMT Lines: 69 Message-ID: <8d9okd.3vs7iub.0@buerssner-17104.user.cis.dfn.de> References: <38F20E7A DOT 3330E9A4 AT mtu-net DOT ru> <38F6C64E DOT C7753C6C AT mtu-net DOT ru> <8d7l3g$j3i$1 AT nets3 DOT rz DOT RWTH-Aachen DOT DE> <38F76B94 DOT 5E968BA7 AT mtu-net DOT ru> NNTP-Posting-Host: pec-144-126.tnt10.s2.uunet.de (149.225.144.126) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: fu-berlin.de 955795755 7711224 149.225.144.126 (16 [17104]) X-Posting-Agent: Hamster/1.3.13.0 User-Agent: Xnews/03.02.04 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Alexei A. Frounze wrote: >I'm going to change that stupid "g" constraint. I'll replace it with >others ("r" and "m" or even with particular registers, if needed). I hope you are aware, that you cannot just change "g" to "m", that wouldn't work. You have to get rid of all those stupid references as well. >Btw, I have a suggestion. Why not to add this story to the FAQ? Just >mention there that usage of the "g" constarint may cause problems during >compilation such as error messages about wrong syntax, although syntax >seems to be correct. I think, the syntax doesn't seem correct at all. The gcc manual is quite clear. Under Simple Constraints: |`g' | Any register, memory or immediate integer operand is allowed, | except for registers that are not general registers. You got, what you asked for. IHMO, who ever has not read this, shouldn't use inline assembler. The FAQ, question 18.12, shows how to find the description of inline assembler in the gcc manual. In that chapter, there is a cross reference to the constraints description. Seems obvious to me. Also, in Brennan Underwood's tutorial, that is mentioned in the same FAQ |g eax, ebx, ecx, edx or variable in memory While not totally correct, it is clear that this cannot be used for referencing, because "opcode (variable in memory)" is not possible with x86. Unfortunately, that tutorial seems a bit outdated, and some code will suffer from the "spilled register" problem. (I am trying to contact the author.) \begin{rant} I still think, it is stupid, that gcc made this non back compatible change with the clobbered input registers. I can fix those occurences with an algorithm (manually), so why can't gcc do it. Almost all code, that I have seen, and that uses inline assembly extensively, broke because of this. If you look at GRX sources, you can see, that the author(s) do know inline assembly very well and that they most probably have read and understood the available documentation. (They do know the preprocessor a bit too well though ;) In the FAQ I read: |GCC 2.95 became more picky about some invalid use of clobber specifiers This is a bit of an euphism. Code, that was written according to the documentation, just stopped to work. What is invalid now, was not invalid with earlier versions of gcc. \end{rant} Sorry about that, but feeling better now ;) Probably I shouldn't tell you Alexei, but if you wouldn't have used all those unnecessary references, "g" would even have worked with floating point variables. -- Dieter