C言語でCurrying 3

もっとも簡単な手段がもっとも優れた手段ということがしばしばある。

calleeがスタックを解放する場合

x86=IA32でのstdcall関数の場合、calleeがスタックを解放する。つまり

call cを呼んだ直後のスタック …… 100 ret(c)
jmp addを呼んだ直後のスタック …… 100 10 ret(c)

で良い。

#include <stdlib.h>
#include <stdio.h>

extern int __attribute__((stdcall)) add(int i, int j);
int __attribute__((stdcall)) add(int i, int j) {
  return i + j;
}

extern int __attribute__((stdcall)) add4(int j);
__asm__(".global add4\n\t"
	"add4:\n\t"
	"popl	%eax\n\t"
	"pushl	$4\n\t"
	"pushl	%eax\n\t"
	"jmp	add");

int main() {
	printf("%d\n", add4(3));
	return 0;
}

このadd4()はたったの9bytesに収まる。Xbyakを使えば実用に足るような気もしてきた。