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 (*func3_t)(long a, long b, long c); 7 1.1 alnsn 8 1.1 alnsn static long SLJIT_CALL print_arr(long *a, long n) 9 1.1 alnsn { 10 1.1 alnsn long i; 11 1.1 alnsn long sum = 0; 12 1.1 alnsn for (i = 0; i < n; ++i) { 13 1.1 alnsn sum += a[i]; 14 1.1 alnsn printf("arr[%ld] = %ld\n", i, a[i]); 15 1.1 alnsn } 16 1.1 alnsn return sum; 17 1.1 alnsn } 18 1.1 alnsn 19 1.1 alnsn /* 20 1.1 alnsn This example, we generate a function like this: 21 1.1 alnsn 22 1.1 alnsn long func(long a, long b, long c) 23 1.1 alnsn { 24 1.1 alnsn long arr[3] = { a, b, c }; 25 1.1 alnsn return print_arr(arr, 3); 26 1.1 alnsn } 27 1.1 alnsn */ 28 1.1 alnsn 29 1.1 alnsn static int temp_var(long a, long b, long c) 30 1.1 alnsn { 31 1.1 alnsn void *code; 32 1.1 alnsn unsigned long len; 33 1.1 alnsn func3_t func; 34 1.1 alnsn 35 1.1 alnsn /* Create a SLJIT compiler */ 36 1.1 alnsn struct sljit_compiler *C = sljit_create_compiler(); 37 1.1 alnsn 38 1.1 alnsn /* reserved space in stack for long arr[3] */ 39 1.1 alnsn sljit_emit_enter(C, 0, 3, 2, 3, 0, 0, 3 * sizeof(long)); 40 1.1 alnsn /* opt arg R S FR FS local_size */ 41 1.1 alnsn 42 1.1 alnsn /* arr[0] = S0, SLJIT_SP is the init address of local var */ 43 1.1 alnsn sljit_emit_op1(C, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_S0, 0); 44 1.1 alnsn /* arr[1] = S1 */ 45 1.1 alnsn sljit_emit_op1(C, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 1 * sizeof(long), SLJIT_S1, 0); 46 1.1 alnsn /* arr[2] = S2 */ 47 1.1 alnsn sljit_emit_op1(C, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(long), SLJIT_S2, 0); 48 1.1 alnsn 49 1.1 alnsn /* R0 = arr; in fact SLJIT_SP is the address of arr, but can't do so in SLJIT */ 50 1.1 alnsn sljit_get_local_base(C, SLJIT_R0, 0, 0); /* get the address of local variables */ 51 1.1 alnsn sljit_emit_op1(C, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3); /* R1 = 3; */ 52 1.1 alnsn sljit_emit_ijump(C, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(print_arr)); 53 1.1 alnsn sljit_emit_return(C, SLJIT_MOV, SLJIT_R0, 0); 54 1.1 alnsn 55 1.1 alnsn /* Generate machine code */ 56 1.1 alnsn code = sljit_generate_code(C); 57 1.1 alnsn len = sljit_get_generated_code_size(C); 58 1.1 alnsn 59 1.1 alnsn /* Execute code */ 60 1.1 alnsn func = (func3_t)code; 61 1.1 alnsn printf("func return %ld\n", func(a, b, c)); 62 1.1 alnsn 63 1.1 alnsn /* dump_code(code, len); */ 64 1.1 alnsn 65 1.1 alnsn /* Clean up */ 66 1.1 alnsn sljit_free_compiler(C); 67 1.1 alnsn sljit_free_code(code); 68 1.1 alnsn return 0; 69 1.1 alnsn } 70 1.1 alnsn 71 1.1 alnsn int main() 72 1.1 alnsn { 73 1.1 alnsn return temp_var(7, 8, 9); 74 1.1 alnsn } 75