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