The epiphany architecture uses a flags register which, for reasons of scheduling, we want to expose to the compiler.
Register allocation in GCC generally assumes that whenever a register needs to be spilled, we can allocate a stack slot for it, and insert loads / stores, including
the necessary address arithmetic, wherever needed.
Because reg+offset addressing has a limited offset range, and the add instruction clobbers the flags register, it was not easy to make sure we can always do the
necessary address arithmetic for reloads without clobbering a live value in the flags register.
Therefore, the top of the stack is reserved as temporary storage where the flags can be stored. In the vast majority of cases, we don't have to actually resort
to use that space, but we only know that after register allocation - which includes assigning stack slots.
In your example code, the parameter 'd' straddles the boundary between parameters passed in registers and parameters passed on the stack. In this case,
gcc pretends the part passed in registers has also been pushed to the stack, and arranges for this part to be written to the stack in the prologue. For this
purpose, the area is rounded up to be a multiple of STACK_BOUNDARY bits, i.e. instead of writing just the 4 bytes of d passed in registers, 8 bytes
passed in registers are written. The code for this is in function.c:assign_parm_find_entry_rtl .