Call-used general-purpose/integer registers, not interfering with arg registers:
grep CALL_USED in the machine description.
Compile the small program:
extern void* volatile x;
extern void* volatile y;
int foo (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{ void* a = x; void* b = y; y = a; x = b;
return a0+a1+a2+a3+a4+a5+a6+a7;
}
Among these, we can use the lexical closure reg, because __vacall_r has no
lexical closure (more precisely, we are building a lexical closure for it).
grep STATIC_CHAIN_REGNUM and TRAMPOLINE_TEMPLATE in the machine description.
Machine description first two (a,b) Lexical closure reg
i386 eax,edx,ecx eax,edx ecx
m68k d0,d1,a0,a1 d0,d1 a0 (a1 in NetBSD)
mips r2-r15 $2=v0,$3=v1,$8=t0 $2
sparc g1-g4 g1-g3 g2
sparc64 g1-g5 g1-g3 g5
alpha $0-$8,$22-$25,$28 $2,$1 $1
hppa 20-22,28-29 r19,r20,r21,r22 r29
arm r12=ip r0,r1,r3,r2 r12 (!)
powerpc 0,3-12 0,11,12 11
powerpc64 0,3-12 0,11 11
m88k 10,13,11(?) r10,r13,r11,r12 r11
convex s0-s7,a1-a5 s1,s2 s0
ia64 r14-r31,r8-r11 r8,r14,r15...r19 r15
x86_64 rax,rdx,rcx,rsi,rdi,r8-r15 rax,r10 r10
s390 r0-r5 r12,r0 r0