Argument passing
Michael P. Hayes
michaelh@ongaonga.chch.cri.nz
Mon Sep 22 16:06:00 GMT 1997
Ivo Janssen writes:
> Hello,
>
> I have the following problem:
> My 16 processor does not have a multiply. So I wrote an
> emulator-function which does repeated adds, named __mulqi3.
> QI because 16bit=1 storage unit. int is also 16 bit. (QI)
> The compiler is supposed to pass args in "r0", "r1" to "r4".
> The rest via stack.
>
> But when I do int a=12; int b=34; c=a*b;
> the compiler puts 12 in "r10", 34 in "r6" and expects the return value
> in "r3", instead of "r0". And, it calles __mulsi3. So it is expecting
> 4-word values, instead of 1word values (remember, word=16bit).
>
> How can I instruct the compiler to use __mulqi3 with exactly 1 word (=1
> register) wide arguments?
I have had similar problems with porting the TMS320C[34]x DSPs where
BITS_PER_UNIT = 32 and BITS_PER_WORD = 32. I had to patch optabs.c to
get the libcalls to work. Unfortunately, libgcc2 is broken for
processors where BITS_PER_UNIT != 8.
Index: optabs.c
===================================================================
RCS file: /usr/local/src/cvsroot/gnu/gcc/optabs.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2.2.1
diff -c -r1.1.1.1 -r1.2.2.1
*** optabs.c 1997/07/09 02:21:49 1.1.1.1
--- optabs.c 1997/09/18 03:20:13 1.2.2.1
***************
*** 3965,3971 ****
register char *opname;
register int suffix;
{
! init_libfuncs (optable, SImode, TImode, opname, suffix);
}
/* Initialize the libfunc fields of an entire group of entries in some
--- 3965,3971 ----
register char *opname;
register int suffix;
{
! init_libfuncs (optable, QImode, TImode, opname, suffix);
}
/* Initialize the libfunc fields of an entire group of entries in some
***************
*** 3979,3985 ****
register char *opname;
register int suffix;
{
! init_libfuncs (optable, SFmode, TFmode, opname, suffix);
}
/* Initialize the libfunc fields of an entire group of entries in some
--- 3979,3985 ----
register char *opname;
register int suffix;
{
! init_libfuncs (optable, QFmode, TFmode, opname, suffix);
}
/* Initialize the libfunc fields of an entire group of entries in some
More information about the crossgcc
mailing list