home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: gnu.gcc.bug
- Path: sparky!uunet!cs.utexas.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!ans.net!dennis
- From: dennis@ans.net (Dennis Ferguson)
- Subject: ffs() with gcc 2.3.3
- Message-ID: <199301111614.AA52547@foo.ans.net>
- Sender: gnulists@ai.mit.edu
- Organization: GNUs Not Usenet
- Distribution: gnu
- Date: Mon, 11 Jan 1993 06:14:32 GMT
- Approved: bug-gcc@prep.ai.mit.edu
- Lines: 101
-
- There is at least one bug report in here, and perhaps a second unless I
- am missing something. I am using gcc 2.3.3 configured for i386-bsd and
- sparc-sun-sunos4.1 (I am running both versions on a Sun, if this matters).
- My understanding is that gcc should recognize ffs() as a builtin under
- certain conditions, and that if the machine has an instruction to do this
- gcc will generate code which uses it. In addition gcc should almost always
- recognize references to __builtin_ffs() as referring to the built in
- version of the routine.
-
- The 386 CPU has an ffs() instruction, and a template using this is included
- in config/i386.md. Using __builtin_ffs() to reference this seems to work
- fine:
-
- azilda.ans.net> cat myffs_builtin.c
- int
- myffs(int i)
- {
- return __builtin_ffs(i);
- }
- azilda.ans.net> gcc386 -O -S -Wall myffs_builtin.c
- azilda.ans.net> cat myffs_builtin.s
- .file "myffs_builtin.c"
- gcc2_compiled.:
- .text
- .align 2
- .globl _myffs
- _myffs:
- pushl %ebp
- movl %esp,%ebp
- movl $-1,%eax
- bsfl 8(%ebp),%eax
- incl %eax
- leave
- ret
- azilda.ans.net>
-
- Unfortunately I have yet to be able to find a set of options which will
- compile a reference to ffs() the same way as __builtin_ffs(). Neither
- the Sun nor the i386 compiler seems to recognize ffs() as a built-in,
- so both always generate external calls:
-
- azilda.ans.net> cat myffs.c
- int
- myffs(int i)
- {
- return ffs(i);
- }
- azilda.ans.net> gcc386 -O -S -Wall myffs.c
- myffs.c: In function `myffs':
- myffs.c:4: warning: implicit declaration of function `ffs'
- azilda.ans.net> cat myffs.s
- .file "myffs.c"
- gcc2_compiled.:
- .text
- .align 2
- .globl _myffs
- _myffs:
- pushl %ebp
- movl %esp,%ebp
- pushl 8(%ebp)
- call _ffs
- leave
- ret
- azilda.ans.net>
-
- It hence appears that the only way to get ffs() to compile to an instruction
- on machines which have one is to include a -Dffs=__builtin_ffs somewhere.
- The problem with this is that with the sparc compiler, whose machine
- description does not define an ffs() instruction, __builtin_ffs()
- compiles as a call to __ffssi2(). The latter routine, which looks
- like it should be part of libgcc?.c, does not exist.
-
- azilda.ans.net> gcc -O -S -Wall myffs_builtin.c
- azilda.ans.net> cat myffs_builtin.s
- gcc2_compiled.:
- .text
- .align 4
- .global _myffs
- .proc 04
- _myffs:
- !#PROLOGUE# 0
- save %sp,-136,%sp
- !#PROLOGUE# 1
- call ___ffssi2,0
- mov %i0,%o0
- ret
- restore %g0,%o0,%o0
- azilda.ans.net> gcc -O -o mymain mymain.c myffs_builtin.c
- ld: Undefined symbol
- ___ffssi2
- collect: /usr/bin/ld returned 2 exit status
- azilda.ans.net>
-
- Ideally I would like gcc to recognize ffs() as a builtin function the
- way it does other builtin's, certainly on machines where there is some
- benefit to this. Failing this I would at least like __builtin_ffs()
- to compile and load correctly on all target machines.
-
- Thanks,
- Dennis Ferguson
-
-