13Fermer15
Kevin KoflerLe 09/01/2015 à 20:01
Ah, je n'étais pas sûr si GCC était suffisamment malin pour ça ou non, donc j'ai préféré te laisser essayer toi-même (connaissant ta curiosité tongue).

Là, la "nested function" n'accède pas aux variables locales de la fonction contenante parce que ta structure est passée en paramètre, donc du coup c'est comme si elle n'était pas "nested", et le trampoline n'est pas nécessaire. smile

Le vieux GCC de TIGCC fait de même (j'ai désactivé les informations de débogage pour avoir un .s plus propre):
	.section	.text.fib,"x"
	.even
	.globl	fib
fib:
	link.w %fp,#-4
	move.l %d3,-(%sp)
	move.w 8(%fp),%d3
	cmp.w #1,%d3
	jble .L4
	move.w %d3,%d0
	subq.w #2,%d0
	move.w %d0,-4(%fp)
	pea -4(%fp)
	pea subfunc_2.3518
	jbsr may_spawn
	subq.w #1,%d3
	move.w %d3,-(%sp)
	jbsr fib
	move.w %d0,%d3
	add.w -2(%fp),%d3
	lea (10,%sp),%sp
.L4:
	move.w %d3,%d0
	move.l -8(%fp),%d3
	unlk %fp
	rts
	.section	.text.subfunc_2.3518,"x"
	.even
subfunc_2.3518:
	move.l %a2,-(%sp)
	move.l 8(%sp),%a2
	move.w (%a2),-(%sp)
	jbsr fib
	move.w %d0,2(%a2)
	addq.l #2,%sp
	move.l (%sp)+,%a2
	rts