2009/8/5 Jim Wilson <wil...@codesourcery.com>: > On Tue, 2009-08-04 at 11:09 +0530, Mohamed Shafi wrote: >> >> i am not able to implement the alignment for short. >> >> The following is are the macros that i used for this >> >> #define PARM_BOUNDARY 8 >> >> #define STACK_BOUNDARY 64 >> The target is 32bit . The first two parameters are passed in registers >> and the rest in stack. For the parameters that are passed in stack the >> alignment is that of the data type. The stack pointer is 8 byte >> aligned. char is 1 byte, int is 4 byte and short is 2 byte. The code >> that is getting generated is give below (-O0 -fomit-frame-pointer) > > Er, wait. You set PARM_BOUNDARY to 8. This means all arguments will be > padded to at most an 8-bit boundary, which means that yes, a short after > a char will have only 1 byte alignment. If you want all arguments to > have 2-byte alignment, then you need to set PARM_BOUNDARY to 16. But > you probably want a value of 32 here so that 4-byte ints get 4-byte > alignment. This will allocate a minimum 4-byte stack slot for every > argument. I don't know the calling convention, so I don't know exactly > how you want arguments arranged on the stack. > > If you are pushing arguments, then you can lie in the PUSH_ROUNDING > macro. You could say for instance that one byte pushes always push 2 > bytes. This ensures that the stack always has 2-byte alignment while > pushing arguments. If your push instruction doesn't actually do this, > then you need to modify the pushqi pattern to emit two pushes or use a > HImode push to get the right behaviour. > > Try looking at the code in store_one_arg in calls.c, and emit_push_insn > in expr.c. > What i did was to define FUNCTION_ARG_BOUNDARY macro to return the alignment as per the requirement. i.e 8bits for char, 16bits for short, 32bits for int and kept PARM_BOUNDARY to 8. Now the complier is emitting the alignment prperly.
Is this OK? Regards, Shafi