Thanks! That looks more tidy than what I've found so far.
I wondered why the AmigaOS includes were not throwing similar errors on the lack of having convenient __register type keywords in the prototypes. Then I found that finally the register calls get translated to something like the below in inline/macros.h :
#define LP1FP(offs, rt, name, t1, v1, r1, bt, bn, fpt)
({
typedef fpt;
t1 _##name##_v1 = (v1);
rt _##name##_re2 =
({
register volatile int _d1 __asm("d1");
register volatile int _a0 __asm("a0");
register volatile int _a1 __asm("a1");
register rt _##name##_re __asm("d0");
register volatile void *const _##name##_bn __asm("a6") = (bn);
register volatile t1 _n1 __asm(#r1) = _##name##_v1;
__asm volatile ("jsr %%a6@(-"#offs":W)"
: "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1)
: "r" (_##name##_bn), "rf"(_n1)
: "fp0", "fp1", "cc", "memory");
_##name##_re;
});
_##name##_re2;
})
So it looks like this is the "timeless" way to pass arguments to an assembly function through registers. I've converted most calls to use stack now as the majority were not time critical. For the remaining ones where the register passing might play an important role I'll use the more verbose style. Hopefully it will last :)