[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] arguments in registers instead of stack in gcc



Miro Kropacek wrote:
> is there any way how to force gcc to pass arguments to assembler
> function in some specified registers instead of stack? Some compilers
> allow something like "func(register __a0 int* pointer)" declarations.

It is possible to write an inline function wrapping the call to the assembler function. It seems to work as expected, but I'm not sure it will always be safe...

Let say that asmfunc() is an assembly function taking a pointer in a0 as an argument. You can use the inline function call_asmfunc() from your C code.

$ cat paramreg.c
static __inline__ void call_asmfunc(int* pointer)
{
        register int* param __asm__("a0") = pointer;

        __asm__ volatile
        ("jsr _asmfunc"
        :			/* outputs */
        : "g"(param)		/* inputs */
        : "d0", "d1", "a1" 	/* clobbered regs */
        );
}

int arr[3];

void test()
{
        call_asmfunc(arr);
}

$ m68k-atari-mint-gcc -S paramreg.c -o - -O2 -fomit-frame-pointer
#NO_APP
        .text
        .even
        .globl  _test
_test:
        lea _arr,%a0
#APP
| 5 "paramreg.c" 1
        jsr _asmfunc
| 0 "" 2
#NO_APP
        rts
.comm _arr,12

--
Vincent Rivière