1#include "sljitLir.h"
2
3#include <stdio.h>
4#include <stdlib.h>
5
6typedef long SLJIT_CALL (*func3_t)(long a, long b, long c);
7
8static int add3(long a, long b, long c)
9{
10	void *code;
11	unsigned long len;
12	func3_t func;
13
14	/* Create a SLJIT compiler */
15	struct sljit_compiler *C = sljit_create_compiler();
16
17	/* Start a context(function entry), have 3 arguments, discuss later */
18	sljit_emit_enter(C, 0,  3,  1, 3, 0, 0, 0);
19
20	/* The first arguments of function is register SLJIT_S0, 2nd, SLJIT_S1, etc.  */
21	/* R0 = first */
22	sljit_emit_op1(C, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
23
24	/* R0 = R0 + second */
25	sljit_emit_op2(C, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_S1, 0);
26
27	/* R0 = R0 + third */
28	sljit_emit_op2(C, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_S2, 0);
29
30	/* This statement mov R0 to RETURN REG and return */
31	/* in fact, R0 is RETURN REG itself */
32	sljit_emit_return(C, SLJIT_MOV, SLJIT_R0, 0);
33
34	/* Generate machine code */
35	code = sljit_generate_code(C);
36	len = sljit_get_generated_code_size(C);
37
38	/* Execute code */
39	func = (func3_t)code;
40	printf("func return %ld\n", func(a, b, c));
41
42	/* dump_code(code, len); */
43
44	/* Clean up */
45	sljit_free_compiler(C);
46	sljit_free_code(code);
47	return 0;
48}
49
50int main()
51{
52	return add3(4, 5, 6);
53}
54