xref: /aosp_15_r20/external/capstone/suite/benchmark/test_iter_benchmark.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembler Engine */
2*9a0e4156SSadaf Ebrahimi /* By bughoho <[email protected]>, 2015> */
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi #include <stdio.h>
5*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
6*9a0e4156SSadaf Ebrahimi #include <time.h>
7*9a0e4156SSadaf Ebrahimi 
8*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
9*9a0e4156SSadaf Ebrahimi #include <capstone/capstone.h>
10*9a0e4156SSadaf Ebrahimi 
test()11*9a0e4156SSadaf Ebrahimi static void test()
12*9a0e4156SSadaf Ebrahimi {
13*9a0e4156SSadaf Ebrahimi #define X86_CODE32 "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x83\xEC\x78\xA1\x90\xA3\x4B\x01\x33\xC5 \
14*9a0e4156SSadaf Ebrahimi \x89\x45\xFC\x8B\x41\x04\x0F\x28\x05\x80\x30\x20\x01\x0F\x29\x45\xD0\x0F\x28\x05\x50\xAB\x1E\x01\x89\x4D\x90\x89\x45\xB8\x0F\x29 \
15*9a0e4156SSadaf Ebrahimi \x45\xE0\x56\x8B\x73\x08\x57\xC7\x06\x00\x00\x00\x00\xC7\x46\x04\x00\x00\x00\x00\xC7\x46\x08\x00\x00\x00\x00\xC7\x46\x0C\x00\x00 \
16*9a0e4156SSadaf Ebrahimi \x00\x00\x85\xC0\x0F\x84\xCB\x01\x00\x00\x33\xFF\x8D\x64\x24\x00\x8B\x01\x8B\x0C\x07\x89\x4D\xBC\x85\xC9\x0F\x84\xA6\x01\x00\x00 \
17*9a0e4156SSadaf Ebrahimi \x8B\x43\x0C\x0F\x10\x00\x0F\x29\x45\xD0\x0F\x10\x40\x10\x0F\x29\x45\xE0\x8B\x01\x8B\x40\x08\xFF\xD0\xF3\x0F\x10\x65\xD0\x8D\x55 \
18*9a0e4156SSadaf Ebrahimi \xD0\xF3\x0F\x10\x55\xD4\xF3\x0F\x10\x6D\xE0\xF3\x0F\x10\x48\x10\xF3\x0F\x10\x00\xF3\x0F\x10\x5D\xE4\xF3\x0F\x59\xCA\x8B\x4D\xBC \
19*9a0e4156SSadaf Ebrahimi \xF3\x0F\x59\xC4\x52\x8D\x55\xC0\x52\xF3\x0F\x58\xC8\xF3\x0F\x11\x4D\xD0\xF3\x0F\x10\x48\x10\xF3\x0F\x10\x00\xF3\x0F\x59\xCB\xF3 \
20*9a0e4156SSadaf Ebrahimi \x0F\x59\xC5\xF3\x0F\x58\xC8\xF3\x0F\x11\x4D\xE0\x0F\x28\xCC\xF3\x0F\x59\x48\x04\xF3\x0F\x10\x40\x14\xF3\x0F\x59\xC2\xF3\x0F\x58 \
21*9a0e4156SSadaf Ebrahimi \xC8\xF3\x0F\x11\x4D\xD4\x0F\x28\xCD\xF3\x0F\x10\x40\x14\xF3\x0F\x59\x48\x04\xC7\x45\xE8\x00\x00\x00\x00\xF3\x0F\x59\xC3\xC7\x45 \
22*9a0e4156SSadaf Ebrahimi \xD8\x00\x00\x00\x00\xF3\x0F\x58\xC8\xF3\x0F\x11\x4D\xE4\xF3\x0F\x59\x60\x0C\xF3\x0F\x59\x50\x1C\xF3\x0F\x58\xE2\xF3\x0F\x58\x65 \
23*9a0e4156SSadaf Ebrahimi \xDC\xF3\x0F\x11\x65\xDC\xF3\x0F\x59\x68\x0C\xF3\x0F\x59\x58\x1C\xF3\x0F\x58\xEB\xF3\x0F\x58\x6D\xEC\xF3\x0F\x11\x6D\xEC\x8B\x01 \
24*9a0e4156SSadaf Ebrahimi \x8B\x80\xF8\x00\x00\x00\xFF\xD0\xF3\x0F\x10\x10\xF3\x0F\x10\x58\x08\x0F\x2F\xD3\xF3\x0F\x10\x40\x04\xF3\x0F\x10\x48\x0C\xF3\x0F \
25*9a0e4156SSadaf Ebrahimi \x11\x55\xA0\xF3\x0F\x11\x45\x94\xF3\x0F\x11\x5D\x98\xF3\x0F\x11\x4D\xBC\x0F\x83\x8E\x00\x00\x00\x0F\x2F\xC1\x0F\x83\x85\x00\x00 \
26*9a0e4156SSadaf Ebrahimi \x00\x8B\xCE\xE8\xE8\xAC\x86\xFF\xF3\x0F\x10\x65\xA0\x84\xC0\x75\x53\xF3\x0F\x10\x06\x0F\x2F\xC4\x77\x03\x0F\x28\xE0\xF3\x0F\x10 \
27*9a0e4156SSadaf Ebrahimi \x5E\x08\xF3\x0F\x10\x45\x98\x0F\x2F\xD8\x77\x03\x0F\x28\xD8\xF3\x0F\x10\x4E\x04\xF3\x0F\x10\x45\x94\x0F\x2F\xC8\x77\x03\x0F\x28 \
28*9a0e4156SSadaf Ebrahimi \xC1\xF3\x0F\x10\x4E\x0C\xF3\x0F\x10\x55\xBC\x0F\x2F\xCA\x77\x03\x0F\x28\xCA\xF3\x0F\x11\x46\x04\xF3\x0F\x11\x5E\x08\xF3\x0F\x11"
29*9a0e4156SSadaf Ebrahimi 	/* i'm test on the ubuntu 15.04 vmware,
30*9a0e4156SSadaf Ebrahimi 	 * Sorry I haven't linux under the physical environment,
31*9a0e4156SSadaf Ebrahimi 	 * so the results may not be accurate.
32*9a0e4156SSadaf Ebrahimi 	 *
33*9a0e4156SSadaf Ebrahimi 	 * original version output:
34*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ make
35*9a0e4156SSadaf Ebrahimi 	 * cc -c -I../../include test_iter_benchmark.c -o test_iter_benchmark.o
36*9a0e4156SSadaf Ebrahimi 	 * cc test_iter_benchmark.o -O3 -Wall -lcapstone -o test_iter_benchmark
37*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ ./test_iter_benchmark
38*9a0e4156SSadaf Ebrahimi 	 * time used:6.017613
39*9a0e4156SSadaf Ebrahimi 	 *
40*9a0e4156SSadaf Ebrahimi 	 * rebuild:
41*9a0e4156SSadaf Ebrahimi 	 *
42*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone$ make clean
43*9a0e4156SSadaf Ebrahimi      * bug@ubuntu:~/capstone$ sudo make install
44*9a0e4156SSadaf Ebrahimi      * bug@ubuntu:~/capstone$ cd suite/benchmark/
45*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ make clean
46*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ make
47*9a0e4156SSadaf Ebrahimi 	 *
48*9a0e4156SSadaf Ebrahimi 	 * modified version output:
49*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ ./test_iter_benchmark
50*9a0e4156SSadaf Ebrahimi 	 * time used:5.003864
51*9a0e4156SSadaf Ebrahimi 	 *
52*9a0e4156SSadaf Ebrahimi      * if we don't output format text string,like this:
53*9a0e4156SSadaf Ebrahimi 	 * //handle->printer(&mci, &ss, handle->printer_info);  <-----cs.c line 700
54*9a0e4156SSadaf Ebrahimi 	 * bug@ubuntu:~/capstone/suite/benchmark$ ./test_iter_benchmark
55*9a0e4156SSadaf Ebrahimi 	 * time used:2.059570
56*9a0e4156SSadaf Ebrahimi 	 */
57*9a0e4156SSadaf Ebrahimi 
58*9a0e4156SSadaf Ebrahimi 	csh handle;
59*9a0e4156SSadaf Ebrahimi 	uint64_t address;
60*9a0e4156SSadaf Ebrahimi 	cs_insn *insn;
61*9a0e4156SSadaf Ebrahimi 	int i;
62*9a0e4156SSadaf Ebrahimi 	cs_err err;
63*9a0e4156SSadaf Ebrahimi 	const uint8_t *code;
64*9a0e4156SSadaf Ebrahimi 	size_t size;
65*9a0e4156SSadaf Ebrahimi 
66*9a0e4156SSadaf Ebrahimi 	err = cs_open(CS_ARCH_X86, CS_MODE_32, &handle);
67*9a0e4156SSadaf Ebrahimi 	if (err) {
68*9a0e4156SSadaf Ebrahimi 		printf("Failed on cs_open() with error returned: %u\n", err);
69*9a0e4156SSadaf Ebrahimi 		return;
70*9a0e4156SSadaf Ebrahimi 	}
71*9a0e4156SSadaf Ebrahimi 	cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_INTEL);
72*9a0e4156SSadaf Ebrahimi 	cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
73*9a0e4156SSadaf Ebrahimi 
74*9a0e4156SSadaf Ebrahimi 	clock_t start, end;
75*9a0e4156SSadaf Ebrahimi 	double  timeUsed;
76*9a0e4156SSadaf Ebrahimi 
77*9a0e4156SSadaf Ebrahimi 	start = clock();
78*9a0e4156SSadaf Ebrahimi 	int maxcount = 10000000;
79*9a0e4156SSadaf Ebrahimi 	insn = cs_malloc(handle);
80*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < maxcount;) {
81*9a0e4156SSadaf Ebrahimi 		code = (const uint8_t *)X86_CODE32;
82*9a0e4156SSadaf Ebrahimi 		address = 0x1000;
83*9a0e4156SSadaf Ebrahimi 		size = sizeof(X86_CODE32) - 1;
84*9a0e4156SSadaf Ebrahimi 		while(cs_disasm_iter(handle, &code, &size, &address, insn)) {
85*9a0e4156SSadaf Ebrahimi 			i++;
86*9a0e4156SSadaf Ebrahimi 		}
87*9a0e4156SSadaf Ebrahimi 	}
88*9a0e4156SSadaf Ebrahimi 	cs_free(insn, 1);
89*9a0e4156SSadaf Ebrahimi 	cs_close(&handle);
90*9a0e4156SSadaf Ebrahimi 	end = clock();
91*9a0e4156SSadaf Ebrahimi 	timeUsed = (double)(end - start) / CLOCKS_PER_SEC;
92*9a0e4156SSadaf Ebrahimi 	printf("time used:%f\n", timeUsed);
93*9a0e4156SSadaf Ebrahimi }
94*9a0e4156SSadaf Ebrahimi 
main()95*9a0e4156SSadaf Ebrahimi int main()
96*9a0e4156SSadaf Ebrahimi {
97*9a0e4156SSadaf Ebrahimi 	test();
98*9a0e4156SSadaf Ebrahimi 
99*9a0e4156SSadaf Ebrahimi 	return 0;
100*9a0e4156SSadaf Ebrahimi }
101