This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: A question about varargs


"Mohamed Shafi" <shafitvm@gmail.com> writes:

> I am involved in the porting of gcc 4.1.2 for 16 bit target. For this
> target size of long long is 32bits. For the following code
>
> #define VALUE 0x1B4E81B4E81B4DLL

That is not a 32-bit value.


> #define AFTER 0x55
>
> //void test (int n, long long q, int y);
> void test (int n, ...);
>
> int
> main ()
> {
>   test (1, VALUE, AFTER);
>   exit(0);
> }
>
> i find that the machine mode of the arguments of test are HImode,
> DImode and HImode. When replace function 'test' with normal one
> instead of varargs i find that the machine modes are HImode, SImode
> and HImode respectively.
> My question is even if the function is a vararg function shouldn't the
> mode of the argument be SImode instead of DImode since long long is
> only 32bit for the target?

The value is too big for a long long.  When you specify the type, gcc
is forced to convert (I hope you can get a warning for that).  When
you don't specify the type, gcc does not convert.  The resulting value
has a type which can only be expressed using a gcc extension.

If you change the TARGET_SCALAR_MODE_SUPPORTED_P hook to reject all
modes larger than SImode, you may get a different result--probably
some sort of error.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]