Xref: news-dnh.mv.net comp.os.msdos.djgpp:4098 Path: news-dnh.mv.net!mv!news.sprintlink.net!rain.fr!jussieu.fr!oleane!tank.news.pipex.net!pipex!news.mathworks.com!newsfeed.internetmci.com!EU.net!Norway.EU.net!nntp.uio.no!news.vu.lt!santaka.sc-uni.ktu.lt!algikun From: Martynas Kunigelis Newsgroups: comp.os.msdos.djgpp Subject: GCC272: params in regs Date: Wed, 3 Jan 1996 14:48:35 +0200 Organization: LITNET Lines: 76 Message-ID: NNTP-Posting-Host: santaka.sc-uni.ktu.lt To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp I always thought Watcom's advantage against DJGPP (i.e. GCC) was its capability to pass first 4 parameters to functions in registers. It also had 2 libraries: one compiled with standard (stack) and the other one with register calling conventions. Depending on switches, the compiler used the apropriate call. convention and the linker linked apropriate library. But now GCC 2.7.2 also has these _cool_ -mregparm=N and -fomit-frame-pointer options (the latter somehow not activated by -Ox), so you can get _really_ effective code, combining them with _best_ever_ GCC optimization. The only thing is that the libraries and startup files must also be compiled with reg cc (calling convention). I thought I could do this myself, but there are many *.s files in djlsr200. Some of them I managed to rewrite, but some (int86.s, dpmi functions) need a complete change in register usage. And also I have no clue about the startup files. So here's my question: could you, people who wrote the c library, modify it to be register-callable. It is possible to retain compatibility using the preprocessor, e. g. #ifdef _RREGPARM_ ... #else ... #endif. I have thought of some macros like ENTER_1, LEAVE_1, ENTER_2.... etc. which are defined depending on the state of _REGPARM_ or whatever. If _REGPARM_ is defined, those macros do nothing, otherwise they initialize the appropriate registers from the frame pointer and adjust the pointer, i.e. #ifdef _REGPARM_ #define ENTER_3m #define LEAVE_3m #else #define ENTER_3m \ movl 4(%esp),%eax \ movl 8(%esp),%edx \ movl 12(%esp),%ecx \ addl $12,%esp #define LEAVE_3m subl $12,%esp #endif Since the greatest N for -mregparm=N is 3, all paramters after the 3rd one are passed through stack, so the above macro adjusts the stack ptr. For all other macros (ENTER_1, .._2, .._3 and LEAVE_..), the stack adjustment is not necessary, e.g. #ifdef _REGPARM_ ..... /* from the previous example */ #else #define ENTER_2 \ movl 4(%esp),%eax \ movl 8(%esp),%edx #endif /* no LEAVE_2 required */ so now every asm f-n you write should look like this: /* void my_proc(int a, int b); */ .globl _my_proc _my_proc: ENTER_2 ... /* assume a in eax and b in edx */ LEAVE_2 /* just in case... */ ret and the above peace of code should compile properly for both register and stack calling conventions. Don't you people think it's cool? I'm waiting for response from the DJGPP crew and people who think my ideas are worth reading. Thanx in advance. Martynas P.S. Can anyone help me to get MASM 6.11? I still can't get used to AT&T asm syntax, and also as is damn buggy [sometimes]. +---------------------------------+--------------------------------+ | Martynas Kunigelis | e-mail: algikun AT santaka DOT ktu DOT lt | | Kaunas University of Technology | "I have seen the top of the | | Informatics faculty student | mountain..." Butt-head, 1995 | +---------------------------------+--------------------------------+