From: George Foot Newsgroups: comp.os.msdos.djgpp Subject: Re: WATCOM #pragma to DJGPP __asm__ ?!! Date: 26 Jan 1998 00:08:50 GMT Organization: Oxford University, England Lines: 43 Message-ID: <6agk6i$ab8$1@news.ox.ac.uk> References: <01bc0b04$94dfc940$6089f1c3 AT faktor21> NNTP-Posting-Host: sable.ox.ac.uk Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk On 25 Jan 1998 21:13:39 GMT in comp.os.msdos.djgpp d-range! wrote: : My question: how can I make inline functions like this one to work with : DJGPP. I read the DJGPP assembler tutorial, and I know you can #define the : function like this, : #define FixSHR(arg1,arg2,arg3) __asm__ \ : "sarl %1,%0" \ : : "=r" (arg3) \ : : "0" (arg1), "1" (arg2) \ : : "0"; Assuming the above is correct (I haven't checked it), try this: inline Fixed FixSHR (Fixed arg1, char arg2) { Fixed arg3; __asm__ ("sarl %1,%0" : "=r" (arg3) : "0" (arg1), "1" (arg2) : "0"); return arg3; } I haven't tested this I'm afraid (no djgpp here) so there could be errors -- in particular, I'm not sure about your use of "0", "1" in the parameter lists (I thought you put "r", "g", etc) -- but I could easily be wrong. The trick here is to trust gcc's optimiser to make good code -- the function above is explicitly requested to be inlined, and since you've used the extended syntax the optimiser knows a great deal about how to use the function. Alternatively, you can make macros that do compilcated things still return a value; e.g. (from memory): #define weird(a,b) ({ a*=b; b }) This would multiply a by b, and the expression would take the value of b. Check this in the gcc info pages, though, under C extensions -- my memory could have got the syntax wrong. -- george DOT foot AT merton DOT oxford DOT ac DOT uk