#include <stdio.h>
#include <stdlib.h>
#define XBYAK_NO_OP_NAMES
#include <xbyak/xbyak.h>

struct A {
	int x_;
	int y_;
	A() : x_(3), y_(5) {}
	int func(int a, int b, int c, int d, int e) const { return x_ + y_ + a + b + c + d + e; }
};

#ifdef _MSC_VER
	#pragma warning(disable : 4510 4512 4610)
#endif

struct Code : public Xbyak::CodeGenerator {
	Code()
	{
		using namespace Xbyak;

		int RET_ADJ = 0;
#ifdef XBYAK32
	#ifdef _WIN32
		const int PARA_ADJ = 0;
		RET_ADJ = 5 * 4;
	#else
		const int PARA_ADJ = 4;
		mov(ecx, ptr [esp + 4]);
	#endif
#endif
		const struct {
#ifdef XBYAK32
			const Reg32& self;
#else
			const Reg64& self;
#endif
			const Operand& a;
			const Operand& b;
			const Operand& c;
			const Operand& d;
			const Operand& e;
		} para = {
#if defined(XBYAK64_WIN)
			rcx,
			edx,
			r8d,
			r9d,
			ptr [rsp + 8 * 5],
			ptr [rsp + 8 * 6],
#elif defined(XBYAK64_GCC)
			rdi,
			esi,
			edx,
			ecx,
			r8d,
			r9d,
#else
			ecx,
			ptr [esp + 4 + PARA_ADJ],
			ptr [esp + 8 + PARA_ADJ],
			ptr [esp + 12 + PARA_ADJ],
			ptr [esp + 16 + PARA_ADJ],
			ptr [esp + 20 + PARA_ADJ],
#endif
		};
		mov(eax, ptr [para.self]);
		add(eax, ptr [para.self + 4]);
		add(eax, para.a);
		add(eax, para.b);
		add(eax, para.c);
		add(eax, para.d);
		add(eax, para.e);
		ret(RET_ADJ);
	}
};

int main()
{
#ifdef XBYAK64
	printf("64bit");
#else
	printf("32bit");
#endif
#ifdef _WIN32
	puts(" win");
#else
	puts(" linux");
#endif
	try {
		Code code;
		int (A::*p)(int, int, int, int, int) const = 0;
#if defined(XBYAK32) && !defined(_WIN32)
		// avoid breaking strict-aliasing rules for 32bit gcc
		union {
			int (A::*p)(int, int, int, int, int) const;
			const Xbyak::uint8 *code;
		} u;
		u.code = code.getCode();
		p = u.p;
#else
		*(void**)&p = code.getCode<void*>();
#endif
		for (int i = 0; i < 10; i++) {
			A a;
			int t1, t2, t3, t4, t5, x, y;
			a.x_ = rand(); a.y_ = rand();
			t1 = rand(); t2 = rand(); t3 = rand();
			t4 = rand(); t5 = rand();
			x = a.func(t1, t2, t3, t4, t5);
			y = (a.*p)(t1, t2, t3, t4, t5);
			printf("%c %d, %d\n", x == y ? 'o' : 'x', x, y);
		}
	} catch (std::exception& e) {
		printf("err=%s\n", e.what());
		return 1;
	}
}

