コード例 #1
0
ファイル: address.cpp プロジェクト: Constellation/xbyak
int main(int argc, char *argv[])
{
	argc--, argv++;
	bool phase = argc > 0 && strcmp(*argv, "1") == 0;
	bool isJIT = (argc > 1);
	fprintf(stderr, "phase:%c %s\n", phase ? '1' : '2', isJIT ? "jit" : "asm");
	if (phase) {
		fprintf(stderr, "32bit reg\n");
		static const char reg32Tbl[][5] = {
			"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
#ifdef XBYAK64
			"r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d",
#endif
		};
		genAddress(isJIT, reg32Tbl, NUM_OF_ARRAY(reg32Tbl));
	} else {
#ifdef XBYAK64
		fprintf(stderr, "64bit reg\n");
		static const char reg64Tbl[][5] = {
			"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
		};
		genAddress(isJIT, reg64Tbl, NUM_OF_ARRAY(reg64Tbl));
#endif
	}
}
コード例 #2
0
ファイル: neon_search.cpp プロジェクト: magurosan/strlen_neon
int main()
{
	const size_t count = 4000;
	const size_t N = 100000;
	const int funcNum = 5;
	std::vector<char> v(N);

	typedef std::vector<Result> ResultVect;

	ResultVect rv[funcNum];

	char *begin = &v[0];

	const int aveTbl[] = { 2, 5, 7, 10, 12, 16, 20, 32, 64, 128, 256, 512, 1024 };

	for (size_t i = 0; i < NUM_OF_ARRAY(aveTbl); i++) {
		int ave = aveTbl[i];
		createTable(begin, N, ave);

		printf("test %d, %d\n", (int)i, ave);
		Result ret;
		int hit;

		puts("strlenANSI");
		ret = test<FstrlenANSI>(begin, N, count);
		ret.put();
		rv[0].push_back(ret);
		hit = ret.hit;

		puts("strlenBLOG");
		ret = test<FstrlenBLOG>(begin, N, count);
		if (ret.hit != hit) { printf("ERROR!!! ok=%d, ng=%d\n", hit, ret.hit); }
		ret.put();
		rv[1].push_back(ret);

		puts("strlenNEON");
		ret = test<FstrlenNEON>(begin, N, count);
		if (ret.hit != hit) { printf("ERROR!!! ok=%d, ng=%d\n", hit, ret.hit); }
		ret.put();
		rv[2].push_back(ret);

		puts("memchrANSI");
		ret = test<FmemchrANSI>(begin, N, count);
		if (ret.hit != hit) { printf("ERROR!!! ok=%d, ng=%d\n", hit, ret.hit); }
		ret.put();
		rv[3].push_back(ret);

		puts("memchrNEON");
		ret = test<FmemchrNEON>(begin, N, count);
		if (ret.hit != hit) { printf("ERROR!!! ok=%d, ng=%d\n", hit, ret.hit); }
		ret.put();
		rv[4].push_back(ret);

	}

	puts("end");

	printf("ave        ");
	for (size_t i = 0; i < NUM_OF_ARRAY(aveTbl); i++) {
		printf("%6d ", aveTbl[i]);
	}
	printf("\n");
	static const char nameTbl[funcNum][16] = { "strlenANSI", "strlenBLOG", "strlenNEON", "memchrANSI", "memchrNEON" };
	for (int i = 0; i < funcNum; i++) {
		printf("%s ", nameTbl[i]);
		for (size_t j = 0; j < NUM_OF_ARRAY(aveTbl); j++) {
			printf("%6.1f ", rv[i][j].time);
		}
		printf("\n");
	}
	return 0;
}
コード例 #3
0
ファイル: address.cpp プロジェクト: Constellation/xbyak
void genAddress(bool isJIT, const char regTbl[][5], size_t regTblNum)
{
	int count = 0;
	int funcNum = 1;
	if (isJIT) {
		puts("void gen0(){");
	}
	for (size_t i = 0; i < regTblNum + 1; i++) {
		const char *base = regTbl[i];
		for (size_t j = 0; j < regTblNum + 1; j++) {
			if (j == 4) continue; /* esp is not index register */
			const char *index = regTbl[j];
			static const int scaleTbl[] = { 0, 1, 2, 4, 8 };
			for (size_t k = 0; k < NUM_OF_ARRAY(scaleTbl); k++) {
				int scale = scaleTbl[k];
				static const int dispTbl[] = { 0, 1, 1000, -1, -1000 };
				for (size_t m = 0; m < NUM_OF_ARRAY(dispTbl); m++) {
					int disp = dispTbl[m];
					bool isFirst = true;
					if (isJIT) {
						printf("mov (ecx, ptr[");
					} else {
						printf("mov ecx, [");
					}
					if (i < regTblNum) {
						printf("%s", base);
						isFirst = false;
					}
					if (j < regTblNum) {
						if (!isFirst) putchar('+');
						printf("%s", index);
						if (scale) printf("*%d", scale);
						isFirst = false;
					}
					if (isFirst) {
						if (isJIT) printf("(void*)");
						printf("0x%08X", disp);
					} else {
						if (disp >= 0) {
							putchar('+');
						}
						printf("%d", disp);
						isFirst = false;
					}
					if (isJIT) {
						printf("]); dump();\n");
					} else {
						printf("]\n");
					}
					if (isJIT) {
						count++;
						if ((count % 100) == 0) {
							printf("}\n    void gen%d(){\n", funcNum++);
						}
					}
				}
			}
		}
	}
	if (isJIT) {
		printf("}\nvoid gen(){\n");
		for (int i = 0; i < funcNum; i++) {
			printf("   gen%d();\n", i);
		}
		printf("}\n");
	}
}